1 line
1.4 MiB
1 line
1.4 MiB
{"version":3,"file":"main-BiOvAqQu.js","sources":["../../node_modules/just-debounce-it/index.mjs","../../node_modules/swiped-events/src/swiped-events.js","../../src/utils/usePageVisibility.js","../../src/components/background-service.jsx","../../src/components/compose-button.jsx","../../src/components/keyboard-shortcuts-help.jsx","../../node_modules/@formkit/auto-animate/index.mjs","../../node_modules/@formkit/auto-animate/preact/index.mjs","../../src/utils/oauth-pkce.js","../../src/utils/auth.js","../../src/pages/accounts.jsx","../../src/assets/logo.svg","../../src/components/lang-selector.jsx","../../src/utils/push-notifications.js","../../src/pages/settings.jsx","../../src/utils/focus-deck.js","../../src/utils/useLocationChange.js","../../src/components/account-handle-info.jsx","../../src/components/edit-profile-sheet.jsx","../../src/components/endorsements.jsx","../../src/utils/lists.js","../../src/components/list-exclusive-badge.jsx","../../src/components/list-add-edit.jsx","../../src/components/add-remove-lists-sheet.jsx","../../src/components/private-note-sheet.jsx","../../src/components/translated-bio-sheet.jsx","../../src/components/related-actions.jsx","../../src/components/account-info.jsx","../../src/components/account-sheet.jsx","../../src/components/drafts.jsx","../../src/components/embed-modal.jsx","../../src/components/generic-accounts.jsx","../../src/components/media-alt-modal.jsx","../../node_modules/chroma-js/src/utils/limit.js","../../node_modules/chroma-js/src/utils/type.js","../../node_modules/chroma-js/src/utils/unpack.js","../../node_modules/chroma-js/src/utils/index.js","../../node_modules/chroma-js/src/utils/multiply-matrices.js","../../node_modules/chroma-js/src/io/lab/lab-constants.js","../../node_modules/chroma-js/src/io/lab/lab2rgb.js","../../node_modules/chroma-js/src/io/oklab/oklab2rgb.js","../../node_modules/chroma-js/src/io/lab/rgb2lab.js","../../node_modules/chroma-js/src/io/oklab/rgb2oklab.js","../../node_modules/chroma-js/src/io/lch/lch2lab.js","../../node_modules/chroma-js/src/io/oklch/oklch2rgb.js","../../node_modules/chroma-js/src/io/lch/lab2lch.js","../../node_modules/chroma-js/src/io/oklch/rgb2oklch.js","../../src/components/media-modal.jsx","../../src/components/open-link-sheet.jsx","../../src/components/report-modal.jsx","../../node_modules/lz-string/libs/lz-string.js","../../src/assets/floating-button.svg","../../src/assets/multi-column.svg","../../src/assets/tab-menu-bar.svg","../../src/utils/followed-tags.js","../../src/components/AsyncText.jsx","../../src/components/shortcuts-settings.jsx","../../src/components/modals.jsx","../../src/components/navigation-command.jsx","../../src/components/follow-request-buttons.jsx","../../src/components/notification.jsx","../../src/components/notification-service.jsx","../../src/utils/search-history.js","../../src/components/search-form.jsx","../../src/components/search-command.jsx","../../src/components/shortcuts.jsx","../../src/utils/timeline-utils.js","../../src/utils/useScroll.js","../../src/utils/useScrollFn.js","../../src/components/media-post.jsx","../../src/components/nav-menu.jsx","../../src/components/timeline.jsx","../../src/pages/account-statuses.jsx","../../src/pages/annual-report.jsx","../../src/pages/bookmarks.jsx","../../src/assets/features/catch-up.png","../../src/pages/catchup.jsx","../../src/pages/favourites.jsx","../../src/pages/filters.jsx","../../src/pages/followed-hashtags.jsx","../../src/pages/following.jsx","../../src/pages/hashtag.jsx","../../src/pages/list.jsx","../../src/utils/group-notifications.js","../../src/pages/mentions.jsx","../../src/pages/notifications.jsx","../../src/pages/public.jsx","../../src/components/recent-searches.jsx","../../src/pages/search.jsx","../../src/pages/trending.jsx","../../src/components/columns.jsx","../../src/pages/home.jsx","../../src/utils/get-instance-status-url.js","../../src/pages/http-route.jsx","../../src/pages/lists.jsx","../../src/data/instances.json?url","../../src/pages/login.jsx","../../src/pages/scheduled-posts.jsx","../../src/components/edit-history-controls.jsx","../../src/pages/status.jsx","../../src/pages/status-route.jsx","../../src/assets/features/boosts-carousel.jpg","../../src/assets/features/grouped-notifications.jpg","../../src/assets/features/multi-column.jpg","../../src/assets/features/multi-hashtag-timeline.jpg","../../src/assets/features/nested-comments-thread.jpg","../../src/assets/logo-text.svg","../../src/pages/welcome.jsx","../../src/utils/toast-alert.js","../../src/app.jsx","../../src/main.jsx"],"sourcesContent":["var functionDebounce = debounce;\n\nfunction debounce(fn, wait, callFirst) {\n var timeout = null;\n var debouncedFn = null;\n\n var clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n\n debouncedFn = null;\n timeout = null;\n }\n };\n\n var flush = function() {\n var call = debouncedFn;\n clear();\n\n if (call) {\n call();\n }\n };\n\n var debounceWrapper = function() {\n if (!wait) {\n return fn.apply(this, arguments);\n }\n\n var context = this;\n var args = arguments;\n var callNow = callFirst && !timeout;\n clear();\n\n debouncedFn = function() {\n fn.apply(context, args);\n };\n\n timeout = setTimeout(function() {\n timeout = null;\n\n if (!callNow) {\n var call = debouncedFn;\n debouncedFn = null;\n\n return call();\n }\n }, wait);\n\n if (callNow) {\n return debouncedFn();\n }\n };\n\n debounceWrapper.cancel = clear;\n debounceWrapper.flush = flush;\n\n return debounceWrapper;\n}\n\nexport {functionDebounce as default};\n","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\n","import { useEffect, useRef } from 'preact/hooks';\n\nexport default function usePageVisibility(fn = () => {}, deps = []) {\n const savedCallback = useRef(fn);\n useEffect(() => {\n savedCallback.current = fn;\n }, [deps]);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n const hidden = document.hidden || document.visibilityState === 'hidden';\n console.log('👀 Page visibility changed', hidden ? 'hidden' : 'visible');\n savedCallback.current(!hidden);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () =>\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n }, []);\n}\n","import { useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { api } from '../utils/api';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nconst STREAMING_TIMEOUT = 1000 * 3; // 3 seconds\nconst POLL_INTERVAL = 20_000; // 20 seconds\n\nexport default memo(function BackgroundService({ isLoggedIn }) {\n const { t } = useLingui();\n\n // Notifications service\n // - WebSocket to receive notifications when page is visible\n const [visible, setVisible] = useState(true);\n const visibleTimeout = useRef();\n usePageVisibility((visible) => {\n clearTimeout(visibleTimeout.current);\n if (visible) {\n setVisible(true);\n } else {\n visibleTimeout.current = setTimeout(() => {\n setVisible(false);\n }, POLL_INTERVAL);\n }\n });\n\n const checkLatestNotification = async (masto, instance, skipCheckMarkers) => {\n if (states.notificationsLast) {\n const notificationsIterator = masto.v1.notifications\n .list({\n limit: 1,\n sinceId: states.notificationsLast.id,\n })\n .values();\n const { value: notifications } = await notificationsIterator.next();\n if (notifications?.length) {\n if (skipCheckMarkers) {\n states.notificationsShowNew = true;\n } else {\n let lastReadId;\n try {\n const markers = await masto.v1.markers.fetch({\n timeline: 'notifications',\n });\n lastReadId = markers?.notifications?.lastReadId;\n } catch (e) {}\n if (lastReadId) {\n states.notificationsShowNew = notifications[0].id !== lastReadId;\n } else {\n states.notificationsShowNew = true;\n }\n }\n }\n }\n };\n\n useEffect(() => {\n let sub;\n let streamTimeout;\n let pollNotifications;\n if (isLoggedIn && visible) {\n const { masto, streaming, instance } = api();\n (async () => {\n // 1. Get the latest notification\n await checkLatestNotification(masto, instance);\n\n let hasStreaming = false;\n // 2. Start streaming\n if (streaming) {\n streamTimeout = setTimeout(() => {\n (async () => {\n try {\n hasStreaming = true;\n sub = streaming.user.notification.subscribe();\n console.log('🎏 Streaming notification', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (!visible) break;\n console.log('🔔🔔 Notification entry', entry);\n if (entry.event === 'notification') {\n console.log('🔔🔔 Notification', entry);\n saveStatus(entry.payload, instance, {\n skipThreading: true,\n });\n }\n states.notificationsShowNew = true;\n }\n console.log('💥 Streaming notification loop STOPPED');\n } catch (e) {\n hasStreaming = false;\n console.error(e);\n }\n\n if (!hasStreaming) {\n console.log('🎏 Streaming failed, fallback to polling');\n pollNotifications = setInterval(() => {\n checkLatestNotification(masto, instance, true);\n }, POLL_INTERVAL);\n }\n })();\n }, STREAMING_TIMEOUT);\n }\n })();\n }\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n clearTimeout(streamTimeout);\n clearInterval(pollNotifications);\n };\n }, [visible, isLoggedIn]);\n\n // Check for updates service\n const lastCheckDate = useRef();\n const checkForUpdates = () => {\n lastCheckDate.current = Date.now();\n console.log('✨ Check app update');\n fetch('./version.json')\n .then((r) => r.json())\n .then((info) => {\n if (info) states.appVersion = info;\n })\n .catch((e) => {\n console.error(e);\n });\n };\n useInterval(checkForUpdates, visible && 1000 * 60 * 30); // 30 minutes\n usePageVisibility((visible) => {\n if (visible) {\n if (!lastCheckDate.current) {\n checkForUpdates();\n } else {\n const diff = Date.now() - lastCheckDate.current;\n if (diff > 1000 * 60 * 60) {\n // 1 hour\n checkForUpdates();\n }\n }\n }\n });\n\n // Global keyboard shortcuts \"service\"\n useHotkeys(\n 'shift+alt+k',\n (e) => {\n // Need modifers check due to useKey: true\n if (!e.shiftKey || !e.altKey) return;\n\n const currentCloakMode = states.settings.cloakMode;\n states.settings.cloakMode = !currentCloakMode;\n showToast({\n text: currentCloakMode ? t`Cloak mode disabled` : t`Cloak mode enabled`,\n });\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey,\n },\n );\n\n return null;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport niceDateTime from '../utils/nice-date-time';\nimport openCompose from '../utils/open-compose';\nimport openOSK from '../utils/open-osk';\nimport pmem from '../utils/pmem';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport showCompose from '../utils/show-compose';\nimport states from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuLink from './menu-link';\nimport RelativeTime from './relative-time';\nimport SubMenu2 from './submenu2';\n\n// Function to fetch the latest posts from the current user\n// Use pmem to memoize fetch results for 1 minute\nconst fetchLatestPostsMemoized = pmem(\n async (masto, currentAccountID) => {\n const statusesIterator = masto.v1.accounts\n .$select(currentAccountID)\n .statuses.list({\n limit: 3,\n exclude_replies: true,\n exclude_reblogs: true,\n })\n .values();\n const { value } = await statusesIterator.next();\n return value || [];\n },\n { maxAge: 60000 },\n); // 1 minute cache\n\nexport default function ComposeButton() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { masto } = api();\n\n // Context menu state\n const [menuOpen, setMenuOpen] = useState(false);\n const [latestPosts, setLatestPosts] = useState([]);\n const [loadingPosts, setLoadingPosts] = useState(false);\n const buttonRef = useRef(null);\n const menuRef = useRef(null);\n\n const columnMode = snapStates.settings.shortcutsViewMode === 'multi-column';\n\n function handleButton(e) {\n // useKey will even listen to Shift\n // e.g. press Shift (without c) will trigger this 😱\n if (e.key && e.key.toLowerCase() !== 'c') return;\n\n if (snapStates.composerState.minimized) {\n states.composerState.minimized = false;\n openOSK();\n return;\n }\n\n const composeDataElements = document.querySelectorAll('data.compose-data');\n // If there's a lot of them, ignore\n const opts =\n !columnMode && composeDataElements.length === 1\n ? JSON.parse(composeDataElements[0].value)\n : undefined;\n\n if (e.shiftKey) {\n const newWin = openCompose(opts);\n\n if (!newWin) {\n states.showCompose = opts || true;\n }\n } else {\n openOSK();\n states.showCompose = opts || true;\n }\n }\n\n useHotkeys('c, shift+c', handleButton, {\n useKey: true,\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal || e.metaKey || e.ctrlKey || e.altKey;\n },\n });\n\n // Setup longpress handler to open context menu\n const bindLongPress = useLongPress(\n () => {\n setMenuOpen(true);\n },\n {\n threshold: 600,\n },\n );\n\n const fetchLatestPosts = useCallback(async () => {\n try {\n setLoadingPosts(true);\n const currentAccountID = getCurrentAccountID();\n if (!currentAccountID) {\n return;\n }\n const posts = await fetchLatestPostsMemoized(masto, currentAccountID);\n setLatestPosts(posts);\n } catch (error) {\n } finally {\n setLoadingPosts(false);\n }\n }, [masto]);\n\n // Function to handle opening the compose window to reply to a post\n const handleReplyToPost = useCallback((post) => {\n showCompose({\n replyToStatus: post,\n });\n setMenuOpen(false);\n }, []);\n\n useEffect(() => {\n if (menuOpen) {\n fetchLatestPosts();\n }\n }, [fetchLatestPosts, menuOpen]);\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n id=\"compose-button\"\n onClick={handleButton}\n onContextMenu={(e) => {\n e.preventDefault();\n setMenuOpen(true);\n }}\n {...bindLongPress()}\n class={`${snapStates.composerState.minimized ? 'min' : ''} ${\n snapStates.composerState.publishing ? 'loading' : ''\n } ${snapStates.composerState.publishingError ? 'error' : ''}`}\n >\n <Icon icon=\"quill\" size=\"xl\" alt={t`Compose`} />\n </button>\n <ControlledMenu\n ref={menuRef}\n state={menuOpen ? 'open' : undefined}\n anchorRef={buttonRef}\n onClose={() => setMenuOpen(false)}\n direction=\"top\"\n gap={8} // Add gap between menu and button\n unmountOnClose\n portal={{\n target: document.body,\n }}\n boundingBoxPadding={safeBoundingBoxPadding()}\n containerProps={{\n style: {\n zIndex: 19,\n },\n onClick: () => {\n menuRef.current?.closeMenu?.();\n },\n }}\n submenuOpenDelay={600}\n >\n <MenuLink to=\"/sp\">\n <Icon icon=\"schedule\" />{' '}\n <span>\n <Trans>Scheduled Posts</Trans>\n </span>\n </MenuLink>\n <MenuDivider />\n <SubMenu2\n align=\"end\"\n direction=\"top\"\n shift={-8}\n disabled={loadingPosts || latestPosts.length === 0}\n label={\n <>\n <Icon icon=\"comment\" />{' '}\n <span className=\"menu-grow\">\n <Trans>Add to thread</Trans>\n </span>\n {loadingPosts ? '…' : <Icon icon=\"chevron-right\" />}\n </>\n }\n >\n {latestPosts.length > 0 &&\n latestPosts.map((post) => {\n const createdDate = new Date(post.createdAt);\n const isWithinDay = Date.now() - createdDate.getTime() < 86400000;\n\n return (\n <MenuItem key={post.id} onClick={() => handleReplyToPost(post)}>\n <small>\n <div class=\"menu-post-text\">{statusPeek(post)}</div>\n <span className=\"more-insignificant\">\n {/* Show relative time if within a day */}\n {isWithinDay && (\n <>\n <RelativeTime datetime={createdDate} format=\"micro\" />{' '}\n ‒{' '}\n </>\n )}\n <time\n className=\"created\"\n dateTime={createdDate.toISOString()}\n title={createdDate.toLocaleString()}\n >\n {niceDateTime(post.createdAt)}\n </time>\n </span>\n </small>\n </MenuItem>\n );\n })}\n </SubMenu2>\n </ControlledMenu>\n </>\n );\n}\n","import './keyboard-shortcuts-help.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Modal from './modal';\n\n// Helper component for sequential key shortcuts\nfunction SequentialKeys({ key1, key2 }) {\n return (\n <Trans>\n <kbd>{key1}</kbd> then <kbd>{key2}</kbd>\n </Trans>\n );\n}\n\nexport default memo(function KeyboardShortcutsHelp() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n\n function onClose() {\n states.showKeyboardShortcutsHelp = false;\n }\n\n useHotkeys(\n '?',\n () => {\n console.log('help');\n states.showKeyboardShortcutsHelp = true;\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => {\n const isCatchUpPage = /\\/catchup/i.test(location.hash);\n return isCatchUpPage || e.metaKey || e.ctrlKey || e.altKey;\n // const hasModal = !!document.querySelector('#modal-container > *');\n // return hasModal;\n },\n },\n );\n\n return (\n !!snapStates.showKeyboardShortcutsHelp && (\n <Modal onClose={onClose}>\n <div id=\"keyboard-shortcuts-help-container\" class=\"sheet\" tabindex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans>Keyboard shortcuts</Trans>\n </h2>\n </header>\n <main>\n <table>\n <tbody>\n {[\n {\n action: t`Keyboard shortcuts help`,\n keys: <kbd>?</kbd>,\n },\n {\n action: t`Next post`,\n keys: <kbd>j</kbd>,\n },\n {\n action: t`Previous post`,\n keys: <kbd>k</kbd>,\n },\n {\n action: t`Skip carousel to next post`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>j</kbd>\n </Trans>\n ),\n },\n {\n action: t`Skip carousel to previous post`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>k</kbd>\n </Trans>\n ),\n },\n {\n action: t`Load new posts`,\n keys: <kbd>.</kbd>,\n },\n {\n action: t`Open post details`,\n keys: (\n <Trans>\n <kbd>Enter</kbd> or <kbd>o</kbd>\n </Trans>\n ),\n },\n {\n action: (\n <Trans>\n Expand content warning or\n <br />\n toggle expanded/collapsed thread\n </Trans>\n ),\n keys: <kbd>x</kbd>,\n },\n {\n action: t`Close post or dialogs`,\n keys: (\n <Trans>\n <kbd>Esc</kbd> or <kbd>Backspace</kbd>\n </Trans>\n ),\n },\n {\n action: t`Focus column in multi-column mode`,\n keys: (\n <Trans>\n <kbd>1</kbd> to <kbd>9</kbd>\n </Trans>\n ),\n },\n {\n action: t`Focus next column in multi-column mode`,\n keys: <kbd>]</kbd>,\n },\n {\n action: t`Focus previous column in multi-column mode`,\n keys: <kbd>[</kbd>,\n },\n {\n action: t`Compose new post`,\n keys: <kbd>c</kbd>,\n },\n {\n action: t`Compose new post (new window)`,\n className: 'insignificant',\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>c</kbd>\n </Trans>\n ),\n },\n {\n action: t`Send post`,\n keys: (\n <Trans>\n <kbd>Ctrl</kbd> + <kbd>Enter</kbd> or <kbd>⌘</kbd> +{' '}\n <kbd>Enter</kbd>\n </Trans>\n ),\n },\n {\n action: t`Search`,\n keys: <kbd>/</kbd>,\n },\n {\n action: t`Reply`,\n keys: <kbd>r</kbd>,\n },\n {\n action: t`Reply (new window)`,\n className: 'insignificant',\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>r</kbd>\n </Trans>\n ),\n },\n {\n action: t`Like (favourite)`,\n keys: (\n <Trans>\n <kbd>l</kbd> or <kbd>f</kbd>\n </Trans>\n ),\n },\n {\n action: t`Boost`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>b</kbd>\n </Trans>\n ),\n },\n {\n action: t`Quote`,\n keys: <kbd>q</kbd>,\n },\n {\n action: t`Bookmark`,\n keys: <kbd>d</kbd>,\n },\n {\n action: t`Toggle Cloak mode`,\n keys: (\n <Trans>\n <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>k</kbd>\n </Trans>\n ),\n },\n {\n action: t`Go to Home`,\n keys: <SequentialKeys key1=\"g\" key2=\"h\" />,\n },\n {\n action: t`Go to Notifications`,\n keys: <SequentialKeys key1=\"g\" key2=\"n\" />,\n },\n ].map(({ action, className, keys }) => (\n <tr key={action}>\n <th class={className}>{action}</th>\n <td>{keys}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </main>\n </div>\n </Modal>\n )\n );\n});\n","/**\n * A set of all the parents currently being observe. This is the only non weak\n * registry.\n */\nconst parents = new Set();\n/**\n * Element coordinates that is constantly kept up to date.\n */\nconst coords = new WeakMap();\n/**\n * Siblings of elements that have been removed from the dom.\n */\nconst siblings = new WeakMap();\n/**\n * Animations that are currently running.\n */\nconst animations = new WeakMap();\n/**\n * A map of existing intersection observers used to track element movements.\n */\nconst intersections = new WeakMap();\n/**\n * A map of existing mutation observers used to track element movements.\n */\nconst mutationObservers = new WeakMap();\n/**\n * Intervals for automatically checking the position of elements occasionally.\n */\nconst intervals = new WeakMap();\n/**\n * The configuration options for each group of elements.\n */\nconst options = new WeakMap();\n/**\n * Debounce counters by id, used to debounce calls to update positions.\n */\nconst debounces = new WeakMap();\n/**\n * All parents that are currently enabled are tracked here.\n */\nconst enabled = new WeakSet();\n/**\n * The document used to calculate transitions.\n */\nlet root;\n/**\n * The root’s XY scroll positions.\n */\nlet scrollX = 0;\nlet scrollY = 0;\n/**\n * Used to sign an element as the target.\n */\nconst TGT = \"__aa_tgt\";\n/**\n * Used to sign an element as being part of a removal.\n */\nconst DEL = \"__aa_del\";\n/**\n * Used to sign an element as being \"new\". When an element is removed from the\n * dom, but may cycle back in we can sign it with new to ensure the next time\n * it is recognized we consider it new.\n */\nconst NEW = \"__aa_new\";\n/**\n * Callback for handling all mutations.\n * @param mutations - A mutation list\n */\nconst handleMutations = (mutations) => {\n const elements = getElements(mutations);\n // If elements is \"false\" that means this mutation that should be ignored.\n if (elements) {\n elements.forEach((el) => animate(el));\n }\n};\n/**\n *\n * @param entries - Elements that have been resized.\n */\nconst handleResizes = (entries) => {\n entries.forEach((entry) => {\n if (entry.target === root)\n updateAllPos();\n if (coords.has(entry.target))\n updatePos(entry.target);\n });\n};\n/**\n * Determine if an element is fully outside of the current viewport.\n * @param el - Element to test\n */\nfunction isOffscreen(el) {\n const rect = el.getBoundingClientRect();\n const vw = (root === null || root === void 0 ? void 0 : root.clientWidth) || 0;\n const vh = (root === null || root === void 0 ? void 0 : root.clientHeight) || 0;\n return rect.bottom < 0 || rect.top > vh || rect.right < 0 || rect.left > vw;\n}\n/**\n * Observe this elements position.\n * @param el - The element to observe the position of.\n */\nfunction observePosition(el) {\n const oldObserver = intersections.get(el);\n oldObserver === null || oldObserver === void 0 ? void 0 : oldObserver.disconnect();\n let rect = coords.get(el);\n let invocations = 0;\n const buffer = 5;\n if (!rect) {\n rect = getCoords(el);\n coords.set(el, rect);\n }\n const { offsetWidth, offsetHeight } = root;\n const rootMargins = [\n rect.top - buffer,\n offsetWidth - (rect.left + buffer + rect.width),\n offsetHeight - (rect.top + buffer + rect.height),\n rect.left - buffer,\n ];\n const rootMargin = rootMargins\n .map((px) => `${ -1 * Math.floor(px)}px`)\n .join(\" \");\n const observer = new IntersectionObserver(() => {\n ++invocations > 1 && updatePos(el);\n }, {\n root,\n threshold: 1,\n rootMargin,\n });\n observer.observe(el);\n intersections.set(el, observer);\n}\n/**\n * Update the exact position of a given element.\n * @param el - An element to update the position of.\n * @param debounce - Whether or not to debounce the update. After an animation is finished, it should update as soon as possible to prevent flickering on quick toggles.\n */\nfunction updatePos(el, debounce = true) {\n clearTimeout(debounces.get(el));\n const optionsOrPlugin = getOptions(el);\n const delay = debounce\n ? isPlugin(optionsOrPlugin)\n ? 500\n : optionsOrPlugin.duration\n : 0;\n debounces.set(el, setTimeout(async () => {\n const currentAnimation = animations.get(el);\n try {\n await (currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.finished);\n coords.set(el, getCoords(el));\n observePosition(el);\n }\n catch {\n // ignore errors as the `.finished` promise is rejected when animations were cancelled\n }\n }, delay));\n}\n/**\n * Updates all positions that are currently being tracked.\n */\nfunction updateAllPos() {\n clearTimeout(debounces.get(root));\n debounces.set(root, setTimeout(() => {\n parents.forEach((parent) => forEach(parent, (el) => lowPriority(() => updatePos(el))));\n }, 100));\n}\n/**\n * Its possible for a quick scroll or other fast events to get past the\n * intersection observer, so occasionally we need want \"cold-poll\" for the\n * latests and greatest position. We try to do this in the most non-disruptive\n * fashion possible. First we only do this ever couple seconds, staggard by a\n * random offset.\n * @param el - Element\n */\nfunction poll(el) {\n setTimeout(() => {\n intervals.set(el, setInterval(() => lowPriority(updatePos.bind(null, el)), 2000));\n }, Math.round(2000 * Math.random()));\n}\n/**\n * Perform some operation that is non critical at some point.\n * @param callback\n */\nfunction lowPriority(callback) {\n if (typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => callback());\n }\n else {\n requestAnimationFrame(() => callback());\n }\n}\n/**\n * A resize observer, responsible for recalculating elements on resize.\n */\nlet resize;\n/**\n * Ensure the browser is supported.\n */\nconst supportedBrowser = typeof window !== \"undefined\" && \"ResizeObserver\" in window;\n/**\n * If this is in a browser, initialize our Web APIs\n */\nif (supportedBrowser) {\n root = document.documentElement;\n new MutationObserver(handleMutations);\n resize = new ResizeObserver(handleResizes);\n window.addEventListener(\"scroll\", () => {\n scrollY = window.scrollY;\n scrollX = window.scrollX;\n });\n resize.observe(root);\n}\n/**\n * Retrieves all the elements that may have been affected by the last mutation\n * including ones that have been removed and are no longer in the DOM.\n * @param mutations - A mutation list.\n * @returns\n */\nfunction getElements(mutations) {\n const observedNodes = mutations.reduce((nodes, mutation) => {\n return [\n ...nodes,\n ...Array.from(mutation.addedNodes),\n ...Array.from(mutation.removedNodes),\n ];\n }, []);\n // Short circuit if _only_ comment nodes are observed\n const onlyCommentNodesObserved = observedNodes.every((node) => node.nodeName === \"#comment\");\n if (onlyCommentNodesObserved)\n return false;\n return mutations.reduce((elements, mutation) => {\n // Short circuit if we find a purposefully deleted node.\n if (elements === false)\n return false;\n if (mutation.target instanceof Element) {\n target(mutation.target);\n if (!elements.has(mutation.target)) {\n elements.add(mutation.target);\n for (let i = 0; i < mutation.target.children.length; i++) {\n const child = mutation.target.children.item(i);\n if (!child)\n continue;\n if (DEL in child) {\n return false;\n }\n target(mutation.target, child);\n elements.add(child);\n }\n }\n if (mutation.removedNodes.length) {\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const child = mutation.removedNodes[i];\n if (DEL in child) {\n return false;\n }\n if (child instanceof Element) {\n elements.add(child);\n target(mutation.target, child);\n siblings.set(child, [\n mutation.previousSibling,\n mutation.nextSibling,\n ]);\n }\n }\n }\n }\n return elements;\n }, new Set());\n}\n/**\n * Assign the target to an element.\n * @param el - The root element\n * @param child\n */\nfunction target(el, child) {\n if (!child && !(TGT in el))\n Object.defineProperty(el, TGT, { value: el });\n else if (child && !(TGT in child))\n Object.defineProperty(child, TGT, { value: el });\n}\n/**\n * Determines what kind of change took place on the given element and then\n * performs the proper animation based on that.\n * @param el - The specific element to animate.\n */\nfunction animate(el) {\n var _a, _b;\n const isMounted = el.isConnected;\n const preExisting = coords.has(el);\n if (isMounted && siblings.has(el))\n siblings.delete(el);\n if (((_a = animations.get(el)) === null || _a === void 0 ? void 0 : _a.playState) !== \"finished\") {\n (_b = animations.get(el)) === null || _b === void 0 ? void 0 : _b.cancel();\n }\n if (NEW in el) {\n add(el);\n }\n else if (preExisting && isMounted) {\n remain(el);\n }\n else if (preExisting && !isMounted) {\n remove(el);\n }\n else {\n add(el);\n }\n}\n/**\n * Removes all non-digits from a string and casts to a number.\n * @param str - A string containing a pixel value.\n * @returns\n */\nfunction raw(str) {\n return Number(str.replace(/[^0-9.\\-]/g, \"\"));\n}\n/**\n * Get the scroll offset of elements\n * @param el - Element\n * @returns\n */\nfunction getScrollOffset(el) {\n let p = el.parentElement;\n while (p) {\n if (p.scrollLeft || p.scrollTop) {\n return { x: p.scrollLeft, y: p.scrollTop };\n }\n p = p.parentElement;\n }\n return { x: 0, y: 0 };\n}\n/**\n * Get the coordinates of elements adjusted for scroll position.\n * @param el - Element\n * @returns\n */\nfunction getCoords(el) {\n const rect = el.getBoundingClientRect();\n const { x, y } = getScrollOffset(el);\n return {\n top: rect.top + y,\n left: rect.left + x,\n width: rect.width,\n height: rect.height,\n };\n}\n/**\n * Returns the width/height that the element should be transitioned between.\n * This takes into account box-sizing.\n * @param el - Element being animated\n * @param oldCoords - Old set of Coordinates coordinates\n * @param newCoords - New set of Coordinates coordinates\n * @returns\n */\nfunction getTransitionSizes(el, oldCoords, newCoords) {\n let widthFrom = oldCoords.width;\n let heightFrom = oldCoords.height;\n let widthTo = newCoords.width;\n let heightTo = newCoords.height;\n const styles = getComputedStyle(el);\n const sizing = styles.getPropertyValue(\"box-sizing\");\n if (sizing === \"content-box\") {\n const paddingY = raw(styles.paddingTop) +\n raw(styles.paddingBottom) +\n raw(styles.borderTopWidth) +\n raw(styles.borderBottomWidth);\n const paddingX = raw(styles.paddingLeft) +\n raw(styles.paddingRight) +\n raw(styles.borderRightWidth) +\n raw(styles.borderLeftWidth);\n widthFrom -= paddingX;\n widthTo -= paddingX;\n heightFrom -= paddingY;\n heightTo -= paddingY;\n }\n return [widthFrom, widthTo, heightFrom, heightTo].map(Math.round);\n}\n/**\n * Retrieves animation options for the current element.\n * @param el - Element to retrieve options for.\n * @returns\n */\nfunction getOptions(el) {\n return TGT in el && options.has(el[TGT])\n ? options.get(el[TGT])\n : { duration: 250, easing: \"ease-in-out\" };\n}\n/**\n * Returns the target of a given animation (generally the parent).\n * @param el - An element to check for a target\n * @returns\n */\nfunction getTarget(el) {\n if (TGT in el)\n return el[TGT];\n return undefined;\n}\n/**\n * Checks if animations are enabled or disabled for a given element.\n * @param el - Any element\n * @returns\n */\nfunction isEnabled(el) {\n const target = getTarget(el);\n return target ? enabled.has(target) : false;\n}\n/**\n * Iterate over the children of a given parent.\n * @param parent - A parent element\n * @param callback - A callback\n */\nfunction forEach(parent, ...callbacks) {\n callbacks.forEach((callback) => callback(parent, options.has(parent)));\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children.item(i);\n if (child) {\n callbacks.forEach((callback) => callback(child, options.has(child)));\n }\n }\n}\n/**\n * Always return tuple to provide consistent interface\n */\nfunction getPluginTuple(pluginReturn) {\n if (Array.isArray(pluginReturn))\n return pluginReturn;\n return [pluginReturn];\n}\n/**\n * Determine if config is plugin\n */\nfunction isPlugin(config) {\n return typeof config === \"function\";\n}\n/**\n * The element in question is remaining in the DOM.\n * @param el - Element to flip\n * @returns\n */\nfunction remain(el) {\n const oldCoords = coords.get(el);\n const newCoords = getCoords(el);\n if (!isEnabled(el))\n return coords.set(el, newCoords);\n if (isOffscreen(el)) {\n // When element is offscreen, skip FLIP to avoid broken transforms\n coords.set(el, newCoords);\n observePosition(el);\n return;\n }\n let animation;\n if (!oldCoords)\n return;\n const pluginOrOptions = getOptions(el);\n if (typeof pluginOrOptions !== \"function\") {\n let deltaLeft = oldCoords.left - newCoords.left;\n let deltaTop = oldCoords.top - newCoords.top;\n const deltaRight = oldCoords.left + oldCoords.width - (newCoords.left + newCoords.width);\n const deltaBottom = oldCoords.top + oldCoords.height - (newCoords.top + newCoords.height);\n // element is probably anchored and doesn't need to be offset\n if (deltaBottom == 0)\n deltaTop = 0;\n if (deltaRight == 0)\n deltaLeft = 0;\n const [widthFrom, widthTo, heightFrom, heightTo] = getTransitionSizes(el, oldCoords, newCoords);\n const start = {\n transform: `translate(${deltaLeft}px, ${deltaTop}px)`,\n };\n const end = {\n transform: `translate(0, 0)`,\n };\n if (widthFrom !== widthTo) {\n start.width = `${widthFrom}px`;\n end.width = `${widthTo}px`;\n }\n if (heightFrom !== heightTo) {\n start.height = `${heightFrom}px`;\n end.height = `${heightTo}px`;\n }\n animation = el.animate([start, end], {\n duration: pluginOrOptions.duration,\n easing: pluginOrOptions.easing,\n });\n }\n else {\n const [keyframes] = getPluginTuple(pluginOrOptions(el, \"remain\", oldCoords, newCoords));\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n coords.set(el, newCoords);\n animation.addEventListener(\"finish\", updatePos.bind(null, el, false), {\n once: true,\n });\n}\n/**\n * Adds the element with a transition.\n * @param el - Animates the element being added.\n */\nfunction add(el) {\n if (NEW in el)\n delete el[NEW];\n const newCoords = getCoords(el);\n coords.set(el, newCoords);\n const pluginOrOptions = getOptions(el);\n if (!isEnabled(el))\n return;\n if (isOffscreen(el)) {\n // Skip entry animation if element is not visible in viewport\n observePosition(el);\n return;\n }\n let animation;\n if (typeof pluginOrOptions !== \"function\") {\n animation = el.animate([\n { transform: \"scale(.98)\", opacity: 0 },\n { transform: \"scale(0.98)\", opacity: 0, offset: 0.5 },\n { transform: \"scale(1)\", opacity: 1 },\n ], {\n duration: pluginOrOptions.duration * 1.5,\n easing: \"ease-in\",\n });\n }\n else {\n const [keyframes] = getPluginTuple(pluginOrOptions(el, \"add\", newCoords));\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n animation.addEventListener(\"finish\", updatePos.bind(null, el, false), {\n once: true,\n });\n}\n/**\n * Clean up after removing an element from the dom.\n * @param el - Element being removed\n * @param styles - Optional styles that should be removed from the element.\n */\nfunction cleanUp(el, styles) {\n var _a;\n el.remove();\n coords.delete(el);\n siblings.delete(el);\n animations.delete(el);\n (_a = intersections.get(el)) === null || _a === void 0 ? void 0 : _a.disconnect();\n setTimeout(() => {\n if (DEL in el)\n delete el[DEL];\n Object.defineProperty(el, NEW, { value: true, configurable: true });\n if (styles && el instanceof HTMLElement) {\n for (const style in styles) {\n el.style[style] = \"\";\n }\n }\n }, 0);\n}\n/**\n * Animates the removal of an element.\n * @param el - Element to remove\n */\nfunction remove(el) {\n var _a;\n if (!siblings.has(el) || !coords.has(el))\n return;\n const [prev, next] = siblings.get(el);\n Object.defineProperty(el, DEL, { value: true, configurable: true });\n const finalX = window.scrollX;\n const finalY = window.scrollY;\n if (next &&\n next.parentNode &&\n next.parentNode instanceof Element) {\n next.parentNode.insertBefore(el, next);\n }\n else if (prev && prev.parentNode) {\n prev.parentNode.appendChild(el);\n }\n else {\n (_a = getTarget(el)) === null || _a === void 0 ? void 0 : _a.appendChild(el);\n }\n if (!isEnabled(el))\n return cleanUp(el);\n const [top, left, width, height] = deletePosition(el);\n const optionsOrPlugin = getOptions(el);\n const oldCoords = coords.get(el);\n if (finalX !== scrollX || finalY !== scrollY) {\n adjustScroll(el, finalX, finalY, optionsOrPlugin);\n }\n let animation;\n let styleReset = {\n position: \"absolute\",\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n height: `${height}px`,\n margin: \"0\",\n pointerEvents: \"none\",\n transformOrigin: \"center\",\n zIndex: \"100\",\n };\n if (!isPlugin(optionsOrPlugin)) {\n Object.assign(el.style, styleReset);\n animation = el.animate([\n {\n transform: \"scale(1)\",\n opacity: 1,\n },\n {\n transform: \"scale(.98)\",\n opacity: 0,\n },\n ], {\n duration: optionsOrPlugin.duration,\n easing: \"ease-out\",\n });\n }\n else {\n const [keyframes, options] = getPluginTuple(optionsOrPlugin(el, \"remove\", oldCoords));\n if ((options === null || options === void 0 ? void 0 : options.styleReset) !== false) {\n styleReset =\n (options === null || options === void 0 ? void 0 : options.styleReset) ||\n styleReset;\n Object.assign(el.style, styleReset);\n }\n animation = new Animation(keyframes);\n animation.play();\n }\n animations.set(el, animation);\n animation.addEventListener(\"finish\", () => cleanUp(el, styleReset), {\n once: true,\n });\n}\n/**\n * If the element being removed is at the very bottom of the page, and the\n * the page was scrolled into a space being \"made available\" by the element\n * that was removed, the page scroll will have jumped up some amount. We need\n * to offset the jump by the amount that the page was \"automatically\" scrolled\n * up. We can do this by comparing the scroll position before and after the\n * element was removed, and then offsetting by that amount.\n *\n * @param el - The element being deleted\n * @param finalX - The final X scroll position\n * @param finalY - The final Y scroll position\n * @param optionsOrPlugin - The options or plugin\n * @returns\n */\nfunction adjustScroll(el, finalX, finalY, optionsOrPlugin) {\n const scrollDeltaX = scrollX - finalX;\n const scrollDeltaY = scrollY - finalY;\n const scrollBefore = document.documentElement.style.scrollBehavior;\n const scrollBehavior = getComputedStyle(root).scrollBehavior;\n if (scrollBehavior === \"smooth\") {\n document.documentElement.style.scrollBehavior = \"auto\";\n }\n window.scrollTo(window.scrollX + scrollDeltaX, window.scrollY + scrollDeltaY);\n if (!el.parentElement)\n return;\n const parent = el.parentElement;\n let lastHeight = parent.clientHeight;\n let lastWidth = parent.clientWidth;\n const startScroll = performance.now();\n // Here we use a manual scroll animation to keep the element using the same\n // easing and timing as the parent’s scroll animation.\n function smoothScroll() {\n requestAnimationFrame(() => {\n if (!isPlugin(optionsOrPlugin)) {\n const deltaY = lastHeight - parent.clientHeight;\n const deltaX = lastWidth - parent.clientWidth;\n if (startScroll + optionsOrPlugin.duration >\n performance.now()) {\n window.scrollTo({\n left: window.scrollX - deltaX,\n top: window.scrollY - deltaY,\n });\n lastHeight = parent.clientHeight;\n lastWidth = parent.clientWidth;\n smoothScroll();\n }\n else {\n document.documentElement.style.scrollBehavior = scrollBefore;\n }\n }\n });\n }\n smoothScroll();\n}\n/**\n * Determines the position of the element being removed.\n * @param el - The element being deleted\n * @returns\n */\nfunction deletePosition(el) {\n var _a;\n const oldCoords = coords.get(el);\n const [width, , height] = getTransitionSizes(el, oldCoords, getCoords(el));\n let offsetParent = el.parentElement;\n while (offsetParent &&\n (getComputedStyle(offsetParent).position === \"static\" ||\n offsetParent instanceof HTMLBodyElement)) {\n offsetParent = offsetParent.parentElement;\n }\n if (!offsetParent)\n offsetParent = document.body;\n const parentStyles = getComputedStyle(offsetParent);\n const parentCoords = !animations.has(el) || ((_a = animations.get(el)) === null || _a === void 0 ? void 0 : _a.playState) === \"finished\"\n ? getCoords(offsetParent)\n : coords.get(offsetParent);\n const top = Math.round(oldCoords.top - parentCoords.top) -\n raw(parentStyles.borderTopWidth);\n const left = Math.round(oldCoords.left - parentCoords.left) -\n raw(parentStyles.borderLeftWidth);\n return [top, left, width, height];\n}\n/**\n * A function that automatically adds animation effects to itself and its\n * immediate children. Specifically it adds effects for adding, moving, and\n * removing DOM elements.\n * @param el - A parent element to add animations to.\n * @param options - An optional object of options.\n */\nfunction autoAnimate(el, config = {}) {\n if (supportedBrowser && resize) {\n const mediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const isDisabledDueToReduceMotion = mediaQuery.matches &&\n !isPlugin(config) &&\n !config.disrespectUserMotionPreference;\n if (!isDisabledDueToReduceMotion) {\n enabled.add(el);\n if (getComputedStyle(el).position === \"static\") {\n Object.assign(el.style, { position: \"relative\" });\n }\n forEach(el, updatePos, poll, (element) => resize === null || resize === void 0 ? void 0 : resize.observe(element));\n if (isPlugin(config)) {\n options.set(el, config);\n }\n else {\n options.set(el, {\n duration: 250,\n easing: \"ease-in-out\",\n ...config,\n });\n }\n const mo = new MutationObserver(handleMutations);\n mo.observe(el, { childList: true });\n mutationObservers.set(el, mo);\n parents.add(el);\n }\n }\n const controller = Object.freeze({\n parent: el,\n enable: () => {\n enabled.add(el);\n },\n disable: () => {\n enabled.delete(el);\n // Cancel any in-flight animations and pending timers for immediate effect\n forEach(el, (node) => {\n const a = animations.get(node);\n try {\n a === null || a === void 0 ? void 0 : a.cancel();\n }\n catch { }\n animations.delete(node);\n const d = debounces.get(node);\n if (d)\n clearTimeout(d);\n debounces.delete(node);\n const i = intervals.get(node);\n if (i)\n clearInterval(i);\n intervals.delete(node);\n });\n },\n isEnabled: () => enabled.has(el),\n destroy: () => {\n enabled.delete(el);\n parents.delete(el);\n options.delete(el);\n const mo = mutationObservers.get(el);\n mo === null || mo === void 0 ? void 0 : mo.disconnect();\n mutationObservers.delete(el);\n forEach(el, (node) => {\n // unobserve resize\n resize === null || resize === void 0 ? void 0 : resize.unobserve(node);\n // cancel animations\n const a = animations.get(node);\n try {\n a === null || a === void 0 ? void 0 : a.cancel();\n }\n catch { }\n animations.delete(node);\n // disconnect observers\n const io = intersections.get(node);\n io === null || io === void 0 ? void 0 : io.disconnect();\n intersections.delete(node);\n // clear intervals and debounces\n const i = intervals.get(node);\n if (i)\n clearInterval(i);\n intervals.delete(node);\n const d = debounces.get(node);\n if (d)\n clearTimeout(d);\n debounces.delete(node);\n // clear state\n coords.delete(node);\n siblings.delete(node);\n });\n },\n });\n return controller;\n}\n/**\n * The vue directive.\n */\nconst vAutoAnimate = {\n mounted: (el, binding) => {\n const ctl = autoAnimate(el, binding.value || {});\n Object.defineProperty(el, \"__aa_ctl\", { value: ctl, configurable: true });\n },\n unmounted: (el) => {\n var _a;\n const ctl = el[\"__aa_ctl\"];\n (_a = ctl === null || ctl === void 0 ? void 0 : ctl.destroy) === null || _a === void 0 ? void 0 : _a.call(ctl);\n try {\n delete el[\"__aa_ctl\"];\n }\n catch { }\n },\n getSSRProps: () => ({}),\n};\n\nexport { autoAnimate, autoAnimate as default, getTransitionSizes, vAutoAnimate };\n","import { useRef, useState, useEffect } from 'preact/hooks';\nimport autoAnimate from '../index.mjs';\n\n/**\n * AutoAnimate hook for adding dead-simple transitions and animations to preact.\n * @param options - Auto animate options or a plugin\n * @returns\n */\nfunction useAutoAnimate(options) {\n const element = useRef(null);\n const [controller, setController] = useState();\n const setEnabled = (enabled) => {\n if (controller) {\n enabled ? controller.enable() : controller.disable();\n }\n };\n useEffect(() => {\n if (element.current instanceof HTMLElement)\n setController(autoAnimate(element.current, options || {}));\n }, []);\n useEffect(() => {\n return () => {\n var _a;\n (_a = controller === null || controller === void 0 ? void 0 : controller.destroy) === null || _a === void 0 ? void 0 : _a.call(controller);\n };\n }, [controller]);\n return [element, setEnabled];\n}\n\nexport { useAutoAnimate };\n","function dec2hex(dec) {\n return ('0' + dec.toString(16)).slice(-2);\n}\nexport function verifier() {\n var array = new Uint32Array(56 / 2);\n window.crypto.getRandomValues(array);\n return Array.from(array, dec2hex).join('');\n}\nfunction sha256(plain) {\n // returns promise ArrayBuffer\n const encoder = new TextEncoder();\n const data = encoder.encode(plain);\n return window.crypto.subtle.digest('SHA-256', data);\n}\nfunction base64urlencode(a) {\n let str = '';\n const bytes = new Uint8Array(a);\n const len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n str += String.fromCharCode(bytes[i]);\n }\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\nexport async function generateCodeChallenge(v) {\n const hashed = await sha256(v);\n return base64urlencode(hashed);\n}\n\n// If /.well-known/oauth-authorization-server exists and code_challenge_methods_supported includes \"S256\", means support PKCE\nexport async function supportsPKCE({ instanceURL }) {\n if (!instanceURL) return false;\n try {\n const res = await fetch(\n `https://${instanceURL}/.well-known/oauth-authorization-server`,\n );\n if (!res.ok || res.status !== 200) return false;\n const json = await res.json();\n if (json.code_challenge_methods_supported?.includes('S256')) return true;\n return false;\n } catch (e) {\n return false;\n }\n}\n\n// For debugging\nwindow.__generateCodeChallenge = generateCodeChallenge;\n","import { generateCodeChallenge, verifier } from './oauth-pkce';\n\nconst {\n DEV,\n PHANPY_CLIENT_NAME: CLIENT_NAME,\n PHANPY_WEBSITE: WEBSITE,\n} = import.meta.env;\n\nconst SCOPES = 'read write follow push';\n\n/*\n PHANPY_WEBSITE is set to the default official site.\n It's used in pre-built releases, so there's no way to change it dynamically\n without rebuilding.\n Therefore, we can't use it as redirect_uri.\n We only use PHANPY_WEBSITE if it's \"same\" as current location URL.\n \n Very basic check based on location.hostname for now\n*/\nconst sameSite = WEBSITE\n ? WEBSITE.toLowerCase().includes(location.hostname)\n : false;\nconst currentLocation = location.origin + location.pathname;\nconst REDIRECT_URI = DEV || !sameSite ? currentLocation : WEBSITE;\n\nexport async function registerApplication({ instanceURL }) {\n const registrationParams = new URLSearchParams({\n client_name: CLIENT_NAME,\n redirect_uris: REDIRECT_URI,\n scopes: SCOPES,\n website: WEBSITE,\n });\n const registrationResponse = await fetch(\n `https://${instanceURL}/api/v1/apps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: registrationParams.toString(),\n },\n );\n const registrationJSON = await registrationResponse.json();\n console.log({ registrationJSON });\n return registrationJSON;\n}\n\nexport async function getPKCEAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin = false,\n}) {\n const codeVerifier = verifier();\n const codeChallenge = await generateCodeChallenge(codeVerifier);\n const params = new URLSearchParams({\n client_id,\n code_challenge_method: 'S256',\n code_challenge: codeChallenge,\n redirect_uri: REDIRECT_URI,\n response_type: 'code',\n scope: SCOPES,\n });\n if (forceLogin) params.append('force_login', true);\n const authorizationURL = `https://${instanceURL}/oauth/authorize?${params.toString()}`;\n return [authorizationURL, codeVerifier];\n}\n\nexport async function getAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin = false,\n}) {\n const authorizationParams = new URLSearchParams({\n client_id,\n scope: SCOPES,\n redirect_uri: REDIRECT_URI,\n // redirect_uri: 'urn:ietf:wg:oauth:2.0:oob',\n response_type: 'code',\n });\n if (forceLogin) authorizationParams.append('force_login', true);\n const authorizationURL = `https://${instanceURL}/oauth/authorize?${authorizationParams.toString()}`;\n return authorizationURL;\n}\n\nexport async function getAccessToken({\n instanceURL,\n client_id,\n client_secret,\n code,\n code_verifier,\n}) {\n const params = new URLSearchParams({\n client_id,\n redirect_uri: REDIRECT_URI,\n grant_type: 'authorization_code',\n code,\n // scope: SCOPES, // Not needed\n // client_secret,\n // code_verifier,\n });\n if (client_secret) {\n params.append('client_secret', client_secret);\n }\n if (code_verifier) {\n params.append('code_verifier', code_verifier);\n }\n const tokenResponse = await fetch(`https://${instanceURL}/oauth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n const tokenJSON = await tokenResponse.json();\n console.log({ tokenJSON });\n return tokenJSON;\n}\n\nexport async function revokeAccessToken({\n instanceURL,\n client_id,\n client_secret,\n token,\n}) {\n try {\n const params = new URLSearchParams({\n client_id,\n client_secret,\n token,\n });\n\n const revokeResponse = await fetch(`https://${instanceURL}/oauth/revoke`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n keepalive: true,\n });\n\n return revokeResponse.ok;\n } catch (error) {\n console.erro('Error revoking token', error);\n return false;\n }\n}\n","import './accounts.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useReducer } from 'preact/hooks';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport { api } from '../utils/api';\nimport { revokeAccessToken } from '../utils/auth';\nimport niceDateTime from '../utils/nice-date-time';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport {\n getAccounts,\n getCurrentAccountID,\n saveAccounts,\n setCurrentAccountID,\n} from '../utils/store-utils';\n\nconst isStandalone = window.matchMedia('(display-mode: standalone)').matches;\n\nfunction Accounts({ onClose }) {\n const { t } = useLingui();\n const { masto } = api();\n // Accounts\n const accounts = getAccounts();\n const currentAccount = getCurrentAccountID();\n const moreThanOneAccount = accounts.length > 1;\n\n const [_, reload] = useReducer((x) => x + 1, 0);\n const [accountsListParent] = useAutoAnimate();\n\n return (\n <div id=\"accounts-container\" class=\"sheet\" tabIndex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>\n <Trans>Accounts</Trans>\n </h2>\n </header>\n <main>\n <section>\n <ul class=\"accounts-list\" ref={accountsListParent}>\n {accounts.map((account, i) => {\n const isCurrent = account.info.id === currentAccount;\n const isDefault = i === 0; // first account is always default\n return (\n <li key={account.info.id}>\n <div>\n {moreThanOneAccount && (\n <span class={`current ${isCurrent ? 'is-current' : ''}`}>\n <Icon icon=\"check-circle\" alt={t`Current`} />\n </span>\n )}\n <Avatar\n url={account.info.avatarStatic}\n size=\"xxl\"\n onDblClick={async () => {\n if (isCurrent) {\n try {\n const info = await masto.v1.accounts\n .$select(account.info.id)\n .fetch();\n console.log('fetched account info', info);\n account.info = info;\n saveAccounts(accounts);\n reload();\n } catch (e) {}\n }\n }}\n />\n <NameText\n account={\n moreThanOneAccount\n ? {\n ...account.info,\n acct: /@/.test(account.info.acct)\n ? account.info.acct\n : `${account.info.acct}@${account.instanceURL}`,\n }\n : account.info\n }\n showAcct\n onClick={() => {\n if (isCurrent) {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n } else {\n setCurrentAccountID(account.info.id);\n location.reload();\n }\n }}\n />\n </div>\n <div class=\"actions\">\n {isDefault && moreThanOneAccount && (\n <>\n <span class=\"tag\">\n <Trans>Default</Trans>\n </span>{' '}\n </>\n )}\n <Menu2\n align=\"end\"\n menuButton={\n <button type=\"button\" class=\"plain more-button\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n {moreThanOneAccount && (\n <>\n <MenuItem\n disabled={isCurrent}\n onClick={() => {\n setCurrentAccountID(account.info.id);\n location.reload();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <Trans>Switch to this account</Trans>\n </MenuItem>\n {!isStandalone && !isCurrent && (\n <MenuLink\n href={`./?account=${account.info.id}`}\n target=\"_blank\"\n >\n <Icon icon=\"external\" />\n <span>\n <Trans>Switch in new tab/window</Trans>\n </span>\n </MenuLink>\n )}\n <MenuDivider />\n </>\n )}\n <MenuItem\n onClick={() => {\n states.showAccount = `${account.info.username}@${account.instanceURL}`;\n }}\n >\n <Icon icon=\"user\" />\n <span>\n <Trans>View profile…</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n {moreThanOneAccount && (\n <>\n <MenuItem\n disabled={isDefault}\n onClick={() => {\n // Move account to the top of the list\n accounts.splice(i, 1);\n accounts.unshift(account);\n saveAccounts(accounts);\n reload();\n }}\n >\n <Icon icon=\"check-circle\" />\n <span>\n <Trans>Set as default</Trans>\n </span>\n </MenuItem>\n <MenuItem\n disabled={i <= 1}\n onClick={() => {\n // Move account one position up\n accounts.splice(i, 1);\n accounts.splice(i - 1, 0, account);\n saveAccounts(accounts);\n reload();\n }}\n >\n <Icon icon=\"arrow-up\" />\n <span>\n <Trans>Move up</Trans>\n </span>\n </MenuItem>\n <MenuItem\n disabled={i === 0 || i === accounts.length - 1}\n onClick={() => {\n // Move account one position down\n accounts.splice(i, 1);\n accounts.splice(i + 1, 0, account);\n saveAccounts(accounts);\n reload();\n }}\n >\n <Icon icon=\"arrow-down\" />\n <span>\n <Trans>Move down</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n </>\n )}\n <MenuConfirm\n subMenu\n confirmLabel={\n <>\n <Icon icon=\"exit\" />\n <span>\n <Trans>\n Log out{' '}\n <span class=\"bidi-isolate\">\n @{account.info.acct}\n </span>\n ?\n </Trans>\n </span>\n </>\n }\n disabled={!isCurrent}\n menuItemClassName=\"danger\"\n onClick={async () => {\n // const yes = confirm('Log out?');\n // if (!yes) return;\n await revokeAccessToken({\n instanceURL: account.instanceURL,\n client_id: account.clientId,\n client_secret: account.clientSecret,\n token: account.accessToken,\n });\n accounts.splice(i, 1);\n saveAccounts(accounts);\n // location.reload();\n try {\n // Clean up session currentAccount if same as deleted\n if (\n store.session.get('currentAccount') ===\n account.info.id\n ) {\n store.session.del('currentAccount');\n }\n } catch (e) {}\n location.href = location.pathname || '/';\n }}\n >\n <Icon icon=\"exit\" />\n <span>\n <Trans>Log out…</Trans>\n </span>\n </MenuConfirm>\n {!!account?.createdAt && (\n <div class=\"footer\">\n <Icon icon=\"account-add\" />\n <span>\n <Trans>\n Connected on {niceDateTime(account.createdAt)} (\n <RelativeTime datetime={account.createdAt} />)\n </Trans>\n </span>\n </div>\n )}\n </Menu2>\n </div>\n </li>\n );\n })}\n </ul>\n <p>\n <Link to=\"/login\" class=\"button plain2\" onClick={onClose}>\n <Icon icon=\"plus\" />{' '}\n <span>\n <Trans>Add an existing account</Trans>\n </span>\n </Link>\n </p>\n {moreThanOneAccount && (\n <p>\n <small>\n <Trans>\n Note: <i>Default</i> account will always be used for first\n load. Switched accounts will persist during the session.\n </Trans>\n </small>\n </p>\n )}\n </section>\n </main>\n </div>\n );\n}\n\nexport default Accounts;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%2064%2064'%3e%3cpath%20fill='none'%20d='M0%200h63.994v63.994H0z'/%3e%3cpath%20fill='%23a4bff7'%20d='M37.774%2011.471c14.639%203.752%2019.034%2016.557%2015.889%2031.304-.696%203.261-2.563%206.661-6.356%208.693-3.204%201.717-8.07%202.537-15.338.55l-9.634-2.404C11.651%2046.992%208.378%2038.733%2010.027%2031.823c3.627-15.201%2015.543-23.48%2027.747-20.352Z'/%3e%3cpath%20fill='%23d8e7fe'%20d='M36.76%2015.429c12.289%203.15%2015.547%2014.114%2012.907%2026.493-.947%204.44-4.937%209.365-16.664%206.143l-9.684-2.417c-7.854-1.923-10.53-7.8-9.318-12.877%203.016-12.639%2012.611-19.943%2022.759-17.342Z'/%3e%3cpath%20fill='%236081e6'%20d='M27.471%2024.991c-1.457-.698-7.229%203.213-7.663%208.926-.182%202.39%204.55%203.237%205.071-.169.725-4.743%203.715-8.218%202.592-8.757Zm10.746%202.005c-2.083.327-.382%205.901-.595%2010.727-.123%202.8%204.388%203.464%204.703%202.011%201.098-5.073-2.066-13.058-4.108-12.738Z'/%3e%3c/svg%3e\"","import { useLingui } from '@lingui/react';\nimport { useMemo } from 'preact/hooks';\n\nimport { CATALOGS, DEFAULT_LANG, DEV_LOCALES, LOCALES } from '../locales';\nimport { activateLang } from '../utils/lang';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport store from '../utils/store';\n\nconst regionMaps = {\n 'zh-CN': 'zh-Hans',\n 'zh-TW': 'zh-Hant',\n 'pt-BR': 'pt-BR',\n};\n\nexport default function LangSelector() {\n const { i18n } = useLingui();\n\n // Sorted on render, so the order won't suddenly change based on current locale\n const populatedLocales = useMemo(() => {\n return LOCALES.map((lang) => {\n // Don't need regions for now, it makes text too noisy\n // Wait till there's too many languages and there are regional clashes\n const regionlessCode = regionMaps[lang] || lang.replace(/-[a-z]+$/i, '');\n\n const native = localeCode2Text({\n code: regionlessCode,\n locale: lang,\n fallback: CATALOGS.find((c) => c.code === lang)?.nativeName,\n });\n\n // Not used when rendering because it'll change based on current locale\n // Only used for sorting on render\n const _common = localeCode2Text({\n code: regionlessCode,\n locale: i18n.locale,\n fallback: CATALOGS.find((c) => c.code === lang)?.name,\n });\n\n return {\n code: lang,\n regionlessCode,\n _common,\n native,\n };\n }).sort((a, b) => {\n // Sort by common name\n const order = a._common.localeCompare(b._common, i18n.locale);\n if (order !== 0) return order;\n // Sort by code (fallback)\n if (a.code < b.code) return -1;\n if (a.code > b.code) return 1;\n return 0;\n });\n }, []);\n\n return (\n <label class=\"lang-selector\">\n 🌐{' '}\n <select\n class=\"small\"\n value={i18n.locale || DEFAULT_LANG}\n onChange={(e) => {\n store.local.set('lang', e.target.value);\n activateLang(e.target.value);\n }}\n >\n {populatedLocales.map(({ code, regionlessCode, native }) => {\n // Common name changes based on current locale\n const common = localeCode2Text({\n code: regionlessCode,\n locale: i18n.locale,\n fallback: CATALOGS.find((c) => c.code === code)?.name,\n });\n const showCommon = !!common && common !== native;\n return (\n <option\n value={code}\n data-regionless-code={regionlessCode}\n key={code}\n >\n {showCommon ? `${native} - ${common}` : native}\n </option>\n );\n })}\n {(import.meta.env.DEV || import.meta.env.PHANPY_SHOW_DEV_LOCALES) && (\n <optgroup label=\"🚧 Development (<50% translated)\">\n {DEV_LOCALES.map((code) => {\n if (code === 'pseudo-LOCALE') {\n return (\n <>\n <hr />\n <option value={code} key={code}>\n Pseudolocalization (test)\n </option>\n </>\n );\n }\n const nativeName = CATALOGS.find(\n (c) => c.code === code,\n )?.nativeName;\n const completion = CATALOGS.find(\n (c) => c.code === code,\n )?.completion;\n return (\n <option value={code} key={code}>\n {nativeName || code} ‎[{completion}%]\n </option>\n );\n })}\n </optgroup>\n )}\n </select>\n </label>\n );\n}\n","// Utils for push notifications\nimport { api } from './api';\nimport { getVapidKey } from './store-utils';\n\n// Subscription is an object with the following structure:\n// {\n// data: {\n// alerts: {\n// admin: {\n// report: boolean,\n// signUp: boolean,\n// },\n// favourite: boolean,\n// follow: boolean,\n// mention: boolean,\n// poll: boolean,\n// reblog: boolean,\n// status: boolean,\n// update: boolean,\n// }\n// },\n// policy: \"all\" | \"followed\" | \"follower\" | \"none\",\n// subscription: {\n// endpoint: string,\n// keys: {\n// auth: string,\n// p256dh: string,\n// },\n// },\n// }\n\n// Back-end CRUD\n// =============\n\nfunction createBackendPushSubscription(subscription) {\n const { masto } = api();\n return masto.v1.push.subscription.create(subscription);\n}\n\nfunction fetchBackendPushSubscription() {\n const { masto } = api();\n return masto.v1.push.subscription.fetch();\n}\n\nfunction updateBackendPushSubscription(subscription) {\n const { masto } = api();\n return masto.v1.push.subscription.update(subscription);\n}\n\nfunction removeBackendPushSubscription() {\n const { masto } = api();\n return masto.v1.push.subscription.remove();\n}\n\n// Front-end\n// =========\n\nexport function isPushSupported() {\n return 'serviceWorker' in navigator && 'PushManager' in window;\n}\n\nexport function getRegistration() {\n // return navigator.serviceWorker.ready;\n return navigator.serviceWorker.getRegistration();\n}\n\nasync function getSubscription() {\n const registration = await getRegistration();\n const subscription = registration\n ? await registration.pushManager.getSubscription()\n : undefined;\n return { registration, subscription };\n}\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = `${base64String}${padding}`\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n\n return outputArray;\n}\n\n// Front-end <-> back-end\n// ======================\n\nexport async function initSubscription() {\n if (!isPushSupported()) return;\n const { subscription } = await getSubscription();\n let backendSubscription = null;\n try {\n backendSubscription = await fetchBackendPushSubscription();\n } catch (err) {\n if (/(not found|unknown)/i.test(err.message)) {\n // No subscription found\n } else {\n // Other error\n throw err;\n }\n }\n console.log('INIT subscription', {\n subscription,\n backendSubscription,\n });\n\n // Check if the subscription changed\n if (backendSubscription && subscription) {\n const sameEndpoint = backendSubscription.endpoint === subscription.endpoint;\n const vapidKey = getVapidKey();\n const sameKey = backendSubscription.serverKey === vapidKey;\n if (!sameEndpoint) {\n throw new Error('Backend subscription endpoint changed');\n }\n if (sameKey) {\n // Subscription didn't change\n } else {\n // Subscription changed\n console.error('🔔 Subscription changed', {\n sameEndpoint,\n serverKey: backendSubscription.serverKey,\n vapIdKey: vapidKey,\n endpoint1: backendSubscription.endpoint,\n endpoint2: subscription.endpoint,\n sameKey,\n key1: backendSubscription.serverKey,\n key2: vapidKey,\n });\n throw new Error('Backend subscription key and vapid key changed');\n // Only unsubscribe from backend, not from browser\n // await removeBackendPushSubscription();\n // // Now let's resubscribe\n // // NOTE: I have no idea if this works\n // return await updateSubscription({\n // data: backendSubscription.data,\n // policy: backendSubscription.policy,\n // });\n }\n }\n\n if (subscription && !backendSubscription) {\n // check if account's vapidKey is same as subscription's applicationServerKey\n const vapidKey = getVapidKey();\n if (vapidKey) {\n const { applicationServerKey } = subscription.options;\n const vapidKeyStr = urlBase64ToUint8Array(vapidKey).toString();\n const applicationServerKeyStr = new Uint8Array(\n applicationServerKey,\n ).toString();\n const sameKey = vapidKeyStr === applicationServerKeyStr;\n if (sameKey) {\n // Subscription didn't change\n } else {\n // Subscription changed\n console.error('🔔 Subscription changed', {\n vapidKeyStr,\n applicationServerKeyStr,\n sameKey,\n });\n // Unsubscribe since backend doesn't have a subscription\n await subscription.unsubscribe();\n throw new Error('Subscription key and vapid key changed');\n }\n } else {\n console.warn('No vapidKey found');\n }\n }\n\n // Check if backend subscription returns 404\n // if (subscription && !backendSubscription) {\n // // Re-subscribe to backend\n // backendSubscription = await createBackendPushSubscription({\n // subscription,\n // data: {},\n // policy: 'all',\n // });\n // }\n\n return { subscription, backendSubscription };\n}\n\nexport async function updateSubscription({ data, policy }) {\n console.log('🔔 Updating subscription', { data, policy });\n if (!isPushSupported()) return;\n let { registration, subscription } = await getSubscription();\n let backendSubscription = null;\n\n if (subscription) {\n try {\n backendSubscription = await updateBackendPushSubscription({\n data,\n policy,\n });\n // TODO: save subscription in user settings\n } catch (error) {\n // Backend doesn't have a subscription for this user\n // Create a new one\n backendSubscription = await createBackendPushSubscription({\n subscription,\n data,\n policy,\n });\n // TODO: save subscription in user settings\n }\n } else {\n // User is not subscribed\n const vapidKey = getVapidKey();\n if (!vapidKey) throw new Error('No server key found');\n subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(vapidKey),\n });\n backendSubscription = await createBackendPushSubscription({\n subscription,\n data,\n policy,\n });\n // TODO: save subscription in user settings\n }\n\n return { subscription, backendSubscription };\n}\n\nexport async function removeSubscription() {\n if (!isPushSupported()) return;\n const { subscription } = await getSubscription();\n if (subscription) {\n await removeBackendPushSubscription();\n await subscription.unsubscribe();\n }\n}\n","import './settings.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport logo from '../assets/logo.svg';\n\nimport Icon from '../components/icon';\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport RelativeTime from '../components/relative-time';\nimport languages from '../data/translang-languages';\nimport { api, getPreferences, setPreferences } from '../utils/api';\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeCode2Text from '../utils/localeCode2Text';\nimport prettyBytes from '../utils/pretty-bytes';\nimport {\n initSubscription,\n isPushSupported,\n removeSubscription,\n updateSubscription,\n} from '../utils/push-notifications';\nimport { supportsNativeQuote } from '../utils/quote-utils';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getAPIVersions, getVapidKey } from '../utils/store-utils';\n\nconst DEFAULT_TEXT_SIZE = 16;\nconst TEXT_SIZES = [14, 15, 16, 17, 18, 19, 20];\nconst {\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_TRANSLANG_INSTANCES: TRANSLANG_INSTANCES,\n PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL,\n PHANPY_GIPHY_API_KEY: GIPHY_API_KEY,\n} = import.meta.env;\n\nconst targetLanguages = Object.entries(languages.tl).map(([code, name]) => ({\n code,\n name,\n}));\n\nconst TRANSLATION_API_NAME = 'TransLang API';\n\nfunction Settings({ onClose }) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const currentTheme = store.local.get('theme') || 'auto';\n const themeFormRef = useRef();\n const targetLanguage =\n snapStates.settings.contentTranslationTargetLanguage || null;\n const systemTargetLanguage = getTranslateTargetLanguage();\n const systemTargetLanguageText = localeCode2Text(systemTargetLanguage);\n const currentTextSize = store.local.get('textSize') || DEFAULT_TEXT_SIZE;\n\n const [prefs, setPrefs] = useState(getPreferences());\n const { masto, authenticated, instance } = api();\n // Get preferences every time Settings is opened\n // NOTE: Disabled for now because I don't expect this to change often. Also for some reason, the /api/v1/preferences endpoint is cached for a while and return old prefs if refresh immediately after changing them.\n // useEffect(() => {\n // const { masto } = api();\n // (async () => {\n // try {\n // const preferences = await masto.v1.preferences.fetch();\n // setPrefs(preferences);\n // store.account.set('preferences', preferences);\n // } catch (e) {\n // // Silently fail\n // console.error(e);\n // }\n // })();\n // }, []);\n\n const [expTabBarV2, setExpTabBarV2] = useState(\n store.local.get('experiments-tabBarV2') ?? false,\n );\n\n const disableQuotePolicy = prefs['posting:default:visibility'] === 'private';\n\n return (\n <div\n id=\"settings-container\"\n class=\"sheet\"\n tabIndex=\"-1\"\n style={{\n '--current-text-size': `${currentTextSize}px`,\n }}\n >\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Settings</Trans>\n </h2>\n </header>\n <main>\n <section>\n <ul>\n <li>\n <div>\n <label>\n <Trans>Appearance</Trans>\n </label>\n </div>\n <div>\n <form\n ref={themeFormRef}\n onInput={(e) => {\n console.log(e);\n e.preventDefault();\n const formData = new FormData(themeFormRef.current);\n const theme = formData.get('theme');\n const html = document.documentElement;\n\n if (theme === 'auto') {\n html.classList.remove('is-light', 'is-dark');\n\n // Disable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = '';\n }\n // Enable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = 'theme-color';\n });\n } else {\n html.classList.toggle('is-light', theme === 'light');\n html.classList.toggle('is-dark', theme === 'dark');\n\n // Enable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = 'theme-color';\n $manualMeta.content =\n theme === 'light'\n ? $manualMeta.dataset.themeLightColor\n : $manualMeta.dataset.themeDarkColor;\n }\n // Disable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = '';\n });\n }\n document\n .querySelector('meta[name=\"color-scheme\"]')\n .setAttribute(\n 'content',\n theme === 'auto' ? 'light dark' : theme,\n );\n\n if (theme === 'auto') {\n store.local.del('theme');\n } else {\n store.local.set('theme', theme);\n }\n }}\n >\n <div class=\"radio-group\">\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"light\"\n defaultChecked={currentTheme === 'light'}\n />\n <span>\n <Trans>Light</Trans>\n </span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"dark\"\n defaultChecked={currentTheme === 'dark'}\n />\n <span>\n <Trans>Dark</Trans>\n </span>\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"theme\"\n value=\"auto\"\n defaultChecked={\n currentTheme !== 'light' && currentTheme !== 'dark'\n }\n />\n <span>\n <Trans>Auto</Trans>\n </span>\n </label>\n </div>\n </form>\n </div>\n </li>\n <li>\n <div>\n <label>\n <Trans>Text size</Trans>\n </label>\n </div>\n <div class=\"range-group\">\n <span style={{ fontSize: TEXT_SIZES[0] }}>\n <Trans comment=\"Preview of one character, in smallest size\">\n A\n </Trans>\n </span>{' '}\n <input\n type=\"range\"\n min={TEXT_SIZES[0]}\n max={TEXT_SIZES[TEXT_SIZES.length - 1]}\n step=\"1\"\n value={currentTextSize}\n list=\"sizes\"\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n const html = document.documentElement;\n // set CSS variable\n html.style.setProperty('--text-size', `${value}px`);\n // save to local storage\n if (value === DEFAULT_TEXT_SIZE) {\n store.local.del('textSize');\n } else {\n store.local.set('textSize', e.target.value);\n }\n }}\n />{' '}\n <span style={{ fontSize: TEXT_SIZES[TEXT_SIZES.length - 1] }}>\n <Trans comment=\"Preview of one character, in largest size\">\n A\n </Trans>\n </span>\n <datalist id=\"sizes\">\n {TEXT_SIZES.map((size) => (\n <option value={size} />\n ))}\n </datalist>\n </div>\n </li>\n <li>\n <span>\n <label>\n <Trans>Display language</Trans>\n </label>\n <br />\n <small>\n <a\n href=\"https://crowdin.com/project/phanpy\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>Volunteer translations</Trans>\n </a>\n </small>\n </span>\n <LangSelector />\n </li>\n </ul>\n </section>\n {authenticated && (\n <>\n <h3>\n <Trans>Posting</Trans>\n </h3>\n <section>\n <ul>\n <li>\n <label for=\"posting-privacy-field\">\n <Trans>Default visibility</Trans>{' '}\n <Icon icon=\"cloud\" alt={t`Synced`} class=\"synced-icon\" />\n </label>\n <select\n id=\"posting-privacy-field\"\n value={prefs['posting:default:visibility'] || 'public'}\n onChange={(e) => {\n const { value } = e.target;\n (async () => {\n try {\n await masto.v1.accounts.updateCredentials({\n source: {\n privacy: value,\n },\n });\n const newPrefs = {\n ...prefs,\n 'posting:default:visibility': value,\n };\n if (value === 'private') {\n newPrefs['posting:default:quote_policy'] = 'nobody';\n }\n setPrefs(newPrefs);\n setPreferences(newPrefs);\n } catch (e) {\n alert(t`Failed to update posting privacy`);\n console.error(e);\n }\n })();\n }}\n >\n <option value=\"public\">\n <Trans>Public</Trans>\n </option>\n <option value=\"unlisted\">\n <Trans>Quiet public</Trans>\n </option>\n <option value=\"private\">\n <Trans>Followers</Trans>\n </option>\n </select>\n </li>\n {supportsNativeQuote() && (\n <li>\n <label for=\"posting-quote-policy-field\">\n <Trans>Quote settings</Trans>{' '}\n <Icon icon=\"cloud\" alt={t`Synced`} class=\"synced-icon\" />\n </label>\n <select\n id=\"posting-quote-policy-field\"\n value={\n prefs['posting:default:quote_policy'] ||\n disableQuotePolicy\n ? 'nobody'\n : 'public'\n }\n disabled={disableQuotePolicy}\n onChange={(e) => {\n const { value } = e.target;\n (async () => {\n try {\n await masto.v1.accounts.updateCredentials({\n source: {\n quote_policy: value,\n },\n });\n setPrefs({\n ...prefs,\n 'posting:default:quote_policy': value,\n });\n setPreferences({\n ...prefs,\n 'posting:default:quote_policy': value,\n });\n } catch (e) {\n alert(t`Failed to update quote settings`);\n console.error(e);\n }\n })();\n }}\n >\n <option value=\"public\" disabled={disableQuotePolicy}>\n <Trans>Anyone can quote</Trans>\n </option>\n <option value=\"followers\" disabled={disableQuotePolicy}>\n <Trans>Your followers can quote</Trans>\n </option>\n <option value=\"nobody\">\n <Trans>Only you can quote</Trans>\n </option>\n </select>\n </li>\n )}\n </ul>\n </section>\n <p class=\"section-postnote\">\n <Icon icon=\"cloud\" alt={t`Synced`} class=\"synced-icon\" />{' '}\n <small>\n <Trans>\n Synced to your instance server's settings.{' '}\n <a\n href={`https://${instance}/`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Go to your instance ({instance}) for more settings.\n </a>\n </Trans>\n </small>\n </p>\n </>\n )}\n <h3>\n <Trans>Experiments</Trans>\n </h3>\n <section>\n <ul>\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.autoRefresh}\n onChange={(e) => {\n states.settings.autoRefresh = e.target.checked;\n }}\n />{' '}\n <Trans>Auto refresh timeline posts</Trans>\n </label>\n </li>\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.boostsCarousel}\n onChange={(e) => {\n states.settings.boostsCarousel = e.target.checked;\n }}\n />{' '}\n <Trans>Boosts carousel</Trans>\n </label>\n </li>\n {!!TRANSLANG_INSTANCES && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslation}\n onChange={(e) => {\n const { checked } = e.target;\n states.settings.contentTranslation = checked;\n if (!checked) {\n states.settings.contentTranslationTargetLanguage = null;\n }\n }}\n />{' '}\n <Trans>Post translation</Trans>\n </label>\n <div\n class={`sub-section ${\n !snapStates.settings.contentTranslation\n ? 'more-insignificant'\n : ''\n }`}\n >\n <div>\n <label>\n <Trans>Translate to </Trans>{' '}\n <select\n value={targetLanguage || ''}\n disabled={!snapStates.settings.contentTranslation}\n style={{ width: '10em' }}\n onChange={(e) => {\n states.settings.contentTranslationTargetLanguage =\n e.target.value || null;\n }}\n >\n <option value=\"\">\n <Trans>\n System language ({systemTargetLanguageText})\n </Trans>\n </option>\n <option disabled>──────────</option>\n {targetLanguages.map((lang) => {\n const common = localeCode2Text({\n code: lang.code,\n fallback: lang.name,\n });\n const native = localeCode2Text({\n code: lang.code,\n locale: lang.code,\n });\n const showCommon = native && common !== native;\n return (\n <option value={lang.code}>\n {showCommon ? `${native} - ${common}` : common}\n </option>\n );\n })}\n </select>\n </label>\n </div>\n <hr />\n <div class=\"checkbox-fieldset\">\n <Plural\n value={\n snapStates.settings.contentTranslationHideLanguages\n .length\n }\n _0={`Hide \"Translate\" button for:`}\n other={`Hide \"Translate\" button for (#):`}\n />\n <div class=\"checkbox-fields\">\n {targetLanguages.map((lang) => {\n const common = localeCode2Text({\n code: lang.code,\n fallback: lang.name,\n });\n const native = localeCode2Text({\n code: lang.code,\n locale: lang.code,\n });\n const showCommon = native && common !== native;\n return (\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.contentTranslationHideLanguages.includes(\n lang.code,\n )}\n onChange={(e) => {\n const { checked } = e.target;\n if (checked) {\n states.settings.contentTranslationHideLanguages.push(\n lang.code,\n );\n } else {\n states.settings.contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages.filter(\n (code) => code !== lang.code,\n );\n }\n }}\n />{' '}\n {showCommon ? (\n <span>\n {native}{' '}\n <span class=\"insignificant ib\">- {common}</span>\n </span>\n ) : (\n common\n )}\n </label>\n );\n })}\n </div>\n </div>\n <p class=\"insignificant\">\n <small>\n <Trans>\n Note: This feature uses external translation services,\n powered by{' '}\n <a\n href=\"https://github.com/cheeaun/translang-api\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n {TRANSLATION_API_NAME}\n </a>\n .\n </Trans>\n </small>\n </p>\n <hr />\n <div>\n <label>\n <input\n type=\"checkbox\"\n checked={\n snapStates.settings.contentTranslationAutoInline\n }\n disabled={!snapStates.settings.contentTranslation}\n onChange={(e) => {\n states.settings.contentTranslationAutoInline =\n e.target.checked;\n }}\n />{' '}\n <Trans>Auto inline translation</Trans>\n </label>\n <p class=\"insignificant\">\n <small>\n <Trans>\n Automatically show translation for posts in timeline.\n Only works for <b>short</b> posts without content\n warning, media and poll.\n </Trans>\n </small>\n </p>\n </div>\n </div>\n </li>\n )}\n {!!GIPHY_API_KEY && authenticated && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.composerGIFPicker}\n onChange={(e) => {\n states.settings.composerGIFPicker = e.target.checked;\n }}\n />{' '}\n <Trans>GIF Picker for composer</Trans>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Note: This feature uses external GIF search service,\n powered by{' '}\n <a\n href=\"https://developers.giphy.com/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n GIPHY\n </a>\n . G-rated (suitable for viewing by all ages), tracking\n parameters are stripped, referrer information is omitted\n from requests, but search queries and IP address\n information will still reach their servers.\n </Trans>\n </small>\n </div>\n </li>\n )}\n {!!IMG_ALT_API_URL && authenticated && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.mediaAltGenerator}\n onChange={(e) => {\n states.settings.mediaAltGenerator = e.target.checked;\n }}\n />{' '}\n <Trans>Image description generator</Trans>{' '}\n <Icon icon=\"sparkles2\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Only for new images while composing new posts.\n </Trans>\n </small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Note: This feature uses external AI service, powered by{' '}\n <a\n href=\"https://github.com/cheeaun/img-alt-api\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n img-alt-api\n </a>\n . May not work well. Only for images and in English.\n </Trans>\n </small>\n </div>\n </li>\n )}\n {authenticated && getAPIVersions()?.mastodon >= 2 && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.groupedNotificationsAlpha}\n onChange={(e) => {\n states.settings.groupedNotificationsAlpha =\n e.target.checked;\n }}\n />{' '}\n <Trans>Server-side grouped notifications</Trans>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Alpha-stage feature. Potentially improved grouping window\n but basic grouping logic.\n </Trans>\n </small>\n </div>\n </li>\n )}\n {authenticated && (\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={\n snapStates.settings.shortcutSettingsCloudImportExport\n }\n onChange={(e) => {\n states.settings.shortcutSettingsCloudImportExport =\n e.target.checked;\n }}\n />{' '}\n <Trans>\"Cloud\" import/export for shortcuts settings</Trans>{' '}\n <Icon icon=\"cloud\" class=\"more-insignificant\" />\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n ⚠️⚠️⚠️ Very experimental.\n <br />\n Stored in your own profile’s notes. Profile (private)\n notes are mainly used for other profiles, and hidden for\n own profile.\n </Trans>\n </small>\n </div>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Note: This feature uses currently-logged-in instance\n server API.\n </Trans>\n </small>\n </div>\n </li>\n )}\n <li class=\"block\">\n <label>\n <input\n type=\"checkbox\"\n checked={snapStates.settings.cloakMode}\n onChange={(e) => {\n states.settings.cloakMode = e.target.checked;\n }}\n />{' '}\n <Trans>\n Cloak mode{' '}\n <span class=\"insignificant\">\n (<samp>Text</samp> → <samp>████</samp>)\n </span>\n </Trans>\n </label>\n <div class=\"sub-section insignificant\">\n <small>\n <Trans>\n Replace text as blocks, useful when taking screenshots, for\n privacy reasons.\n </Trans>\n </small>\n </div>\n </li>\n {authenticated && (\n <li>\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n states.showDrafts = true;\n states.showSettings = false;\n }}\n >\n <Trans>Unsent drafts</Trans>\n </button>\n </li>\n )}\n </ul>\n </section>\n {authenticated && <PushNotificationsSection onClose={onClose} />}\n <h3>\n <Trans>About</Trans>\n </h3>\n <section>\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n lineHeight: 1.25,\n alignItems: 'center',\n marginTop: 8,\n }}\n >\n <img\n src={logo}\n alt=\"\"\n width=\"64\"\n height=\"64\"\n style={{\n aspectRatio: '1/1',\n verticalAlign: 'middle',\n background: '#b7cdf9',\n borderRadius: 12,\n }}\n />\n <div>\n <b>Phanpy</b>{' '}\n <a\n href=\"https://hachyderm.io/@phanpy\"\n // target=\"_blank\"\n rel=\"noopener\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'phanpy@hachyderm.io';\n }}\n >\n @phanpy\n </a>\n <br />\n <Trans>\n <a\n href=\"https://github.com/cheeaun/phanpy\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n // target=\"_blank\"\n rel=\"noopener\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n </Trans>\n </div>\n </div>\n <p>\n <a\n href=\"https://github.com/sponsors/cheeaun\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>Sponsor</Trans>\n </a>{' '}\n ·{' '}\n <a\n href=\"https://www.buymeacoffee.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>Donate</Trans>\n </a>{' '}\n ·{' '}\n <a\n href=\"https://patreon.com/cheeaun\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Patreon\n </a>{' '}\n ·{' '}\n <a\n href=\"https://github.com/cheeaun/phanpy/blob/main/CHANGELOG.md\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>What's new</Trans>\n </a>{' '}\n ·{' '}\n <a href={PRIVACY_POLICY_URL} target=\"_blank\" rel=\"noopener\">\n <Trans>Privacy Policy</Trans>\n </a>\n </p>\n {__BUILD_TIME__ && (\n <p>\n {WEBSITE && (\n <>\n <Trans>\n <span class=\"insignificant\">Site:</span>{' '}\n {WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')}\n </Trans>\n <br />\n </>\n )}\n <Trans>\n <span class=\"insignificant\">Version:</span>{' '}\n <input\n type=\"text\"\n class=\"version-string\"\n readOnly\n size=\"18\" // Manually calculated here\n value={`${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`}\n onClick={(e) => {\n e.target.select();\n // Copy to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast(t`Version string copied`);\n } catch (e) {\n console.warn(e);\n showToast(t`Unable to copy version string`);\n }\n }}\n />{' '}\n {!__FAKE_COMMIT_HASH__ && (\n <span class=\"ib insignificant\">\n (\n <a\n href={`https://github.com/cheeaun/phanpy/commit/${__COMMIT_HASH__}`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <RelativeTime datetime={new Date(__BUILD_TIME__)} />\n </a>\n )\n </span>\n )}\n </Trans>\n </p>\n )}\n </section>\n {(import.meta.env.DEV || import.meta.env.PHANPY_DEV) && (\n <details class=\"debug-info\">\n <summary></summary>\n <p class=\"side\">\n <Link\n to=\"/_sandbox\"\n onClick={onClose}\n class=\"button plain6 small\"\n >\n Sandbox\n </Link>\n </p>\n <p>Debugging</p>\n <p>\n <b>Vapid key</b>: {getVapidKey()}\n </p>\n {__BENCH_RESULTS?.size > 0 && (\n <ul>\n {Array.from(__BENCH_RESULTS.entries()).map(\n ([name, duration]) => (\n <li>\n <b>{name}</b>: {duration}ms\n </li>\n ),\n )}\n </ul>\n )}\n <p>Service Worker Cache</p>\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={async () => alert(await getCachesKeys())}\n >\n Show keys count\n </button>{' '}\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={async () => alert(await getCachesSize())}\n >\n Show cache size\n </button>{' '}\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n const key = prompt('Enter cache key');\n if (!key) return;\n try {\n clearCacheKey(key);\n } catch (e) {\n alert(e);\n }\n }}\n >\n Clear cache key\n </button>{' '}\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n try {\n clearCaches();\n } catch (e) {\n alert(e);\n }\n }}\n >\n Clear all caches\n </button>\n <p>Temporary Experiments</p>\n <label>\n <input\n type=\"checkbox\"\n checked={expTabBarV2}\n onChange={(e) => {\n const { checked } = e.target;\n document.body.classList.toggle('exp-tab-bar-v2', checked);\n setExpTabBarV2(checked);\n if (checked) {\n store.local.set('experiments-tabBarV2', true);\n } else {\n store.local.del('experiments-tabBarV2');\n }\n }}\n />{' '}\n Tab bar v2\n </label>\n </details>\n )}\n </main>\n </div>\n );\n}\n\nasync function getCachesKeys() {\n const keys = await caches.keys();\n const total = {};\n for (const key of keys) {\n const cache = await caches.open(key);\n const k = await cache.keys();\n total[key] = k.length;\n }\n return total;\n}\n\nasync function getCachesSize() {\n const keys = await caches.keys();\n let total = {};\n let TOTAL = 0;\n for (const key of keys) {\n const cache = await caches.open(key);\n const k = await cache.keys();\n for (const item of k) {\n try {\n const response = await cache.match(item);\n const blob = await response.blob();\n total[key] = (total[key] || 0) + blob.size;\n TOTAL += blob.size;\n } catch (e) {\n alert('Failed to get cache size for ' + item);\n alert(e);\n }\n }\n }\n return {\n ...Object.fromEntries(\n Object.entries(total).map(([k, v]) => [k, prettyBytes(v)]),\n ),\n TOTAL: prettyBytes(TOTAL),\n };\n}\n\nfunction clearCacheKey(key) {\n return caches.delete(key);\n}\n\nasync function clearCaches() {\n const keys = await caches.keys();\n for (const key of keys) {\n await caches.delete(key);\n }\n}\n\nfunction PushNotificationsSection({ onClose }) {\n const { t } = useLingui();\n if (!isPushSupported()) return null;\n\n const { instance } = api();\n const [uiState, setUIState] = useState('default');\n const pushFormRef = useRef();\n const [allowNotifications, setAllowNotifications] = useState(false);\n const [needRelogin, setNeedRelogin] = useState(false);\n const previousPolicyRef = useRef();\n useEffect(() => {\n (async () => {\n setUIState('loading');\n try {\n const { subscription, backendSubscription } = await initSubscription();\n if (\n backendSubscription?.policy &&\n backendSubscription.policy !== 'none'\n ) {\n setAllowNotifications(true);\n const { alerts, policy } = backendSubscription;\n console.log('backendSubscription', backendSubscription);\n previousPolicyRef.current = policy;\n const { elements } = pushFormRef.current;\n const policyEl = elements.namedItem('policy');\n if (policyEl) policyEl.value = policy;\n // alerts is {}, iterate it\n Object.entries(alerts).forEach(([alert, value]) => {\n const el = elements.namedItem(alert);\n if (el?.type === 'checkbox') {\n el.checked = !!value;\n }\n });\n }\n setUIState('default');\n } catch (err) {\n console.warn(err);\n if (/outside.*authorized/i.test(err.message)) {\n setNeedRelogin(true);\n } else {\n alert(err?.message || err);\n }\n setUIState('error');\n }\n })();\n }, []);\n\n const isLoading = uiState === 'loading';\n\n return (\n <form\n ref={pushFormRef}\n onChange={() => {\n setTimeout(() => {\n const values = Object.fromEntries(new FormData(pushFormRef.current));\n const allowNotifications = !!values['policy-allow'];\n const params = {\n data: {\n policy: values.policy,\n alerts: {\n mention: !!values.mention,\n favourite: !!values.favourite,\n reblog: !!values.reblog,\n follow: !!values.follow,\n follow_request: !!values.followRequest,\n poll: !!values.poll,\n update: !!values.update,\n status: !!values.status,\n },\n },\n };\n\n let alertsCount = 0;\n // Remove false values from data.alerts\n // API defaults to false anyway\n Object.keys(params.data.alerts).forEach((key) => {\n if (!params.data.alerts[key]) {\n delete params.data.alerts[key];\n } else {\n alertsCount++;\n }\n });\n const policyChanged =\n previousPolicyRef.current !== params.data.policy;\n\n console.log('PN Form', {\n values,\n allowNotifications: allowNotifications,\n params,\n });\n\n if (allowNotifications && alertsCount > 0) {\n if (policyChanged) {\n console.debug('Policy changed.');\n removeSubscription()\n .then(() => {\n updateSubscription(params);\n })\n .catch((err) => {\n console.warn(err);\n alert(t`Failed to update subscription. Please try again.`);\n });\n } else {\n updateSubscription(params).catch((err) => {\n console.warn(err);\n alert(t`Failed to update subscription. Please try again.`);\n });\n }\n } else {\n removeSubscription().catch((err) => {\n console.warn(err);\n alert(t`Failed to remove subscription. Please try again.`);\n });\n }\n }, 100);\n }}\n >\n <h3>\n <Trans>Push Notifications (beta)</Trans>\n </h3>\n <section>\n <ul>\n <li>\n <label>\n <input\n type=\"checkbox\"\n disabled={isLoading || needRelogin}\n name=\"policy-allow\"\n checked={allowNotifications}\n onChange={async (e) => {\n const { checked } = e.target;\n if (checked) {\n // Request permission\n const permission = await Notification.requestPermission();\n if (permission === 'granted') {\n setAllowNotifications(true);\n } else {\n setAllowNotifications(false);\n if (permission === 'denied') {\n alert(\n t`Push notifications are blocked. Please enable them in your browser settings.`,\n );\n }\n }\n } else {\n setAllowNotifications(false);\n }\n }}\n />{' '}\n <Trans>\n Allow from{' '}\n <select\n name=\"policy\"\n disabled={isLoading || needRelogin || !allowNotifications}\n >\n {[\n {\n value: 'all',\n label: t`anyone`,\n },\n {\n value: 'followed',\n label: t`people I follow`,\n },\n {\n value: 'follower',\n label: t`followers`,\n },\n ].map((type) => (\n <option value={type.value}>{type.label}</option>\n ))}\n </select>\n </Trans>\n </label>\n <div\n class=\"shazam-container no-animation\"\n style={{\n width: '100%',\n }}\n hidden={!allowNotifications}\n >\n <div class=\"shazam-container-inner\">\n <div class=\"sub-section\">\n <ul>\n {[\n {\n value: 'mention',\n label: t`Mentions`,\n },\n {\n value: 'favourite',\n label: t`Likes`,\n },\n {\n value: 'reblog',\n label: t`Boosts`,\n },\n {\n value: 'follow',\n label: t`Follows`,\n },\n {\n value: 'followRequest',\n label: t`Follow requests`,\n },\n {\n value: 'poll',\n label: t`Polls`,\n },\n {\n value: 'update',\n label: t`Post edits`,\n },\n {\n value: 'status',\n label: t`New posts`,\n },\n ].map((alert) => (\n <li>\n <label>\n <input type=\"checkbox\" name={alert.value} />{' '}\n {alert.label}\n </label>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n {needRelogin && (\n <div class=\"sub-section\">\n <p>\n <Trans>\n Push permission was not granted since your last login.\n You'll need to{' '}\n <Link to={`/login?instance=${instance}`} onClick={onClose}>\n <b>log in</b> again to grant push permission\n </Link>\n .\n </Trans>\n </p>\n </div>\n )}\n </li>\n </ul>\n </section>\n <p class=\"section-postnote\">\n <small>\n <Trans>\n NOTE: Push notifications only work for <b>one account</b>.\n </Trans>\n </small>\n </p>\n </form>\n );\n}\n\nexport default Settings;\n","const focusDeck = () => {\n let timer = setTimeout(() => {\n const columns = document.getElementById('columns');\n if (columns) {\n // Focus focused column\n const focusedColumn = columns.querySelector('.deck-container.focus');\n if (focusedColumn) {\n focusedColumn.focus();\n } else {\n // Focus first column within viewport\n const firstVisibleColumn = Array.from(\n columns.querySelectorAll('.deck-container'),\n ).find((column) => {\n const columnRect = column.getBoundingClientRect();\n return columnRect.left >= 0;\n });\n if (firstVisibleColumn) {\n firstVisibleColumn.focus();\n } else {\n // Focus first column\n columns.querySelector('.deck-container')?.focus?.();\n }\n }\n } else {\n const modals = document.querySelectorAll('#modal-container > *');\n if (modals?.length) {\n // Focus last modal\n const modal = modals[modals.length - 1]; // last one\n const modalFocusElement =\n modal.querySelector('[tabindex=\"-1\"]') || modal;\n if (modalFocusElement) {\n modalFocusElement.focus();\n return;\n }\n }\n const backDrop = document.querySelector('.deck-backdrop');\n if (backDrop) return;\n // Focus last deck\n const pages = document.querySelectorAll('.deck-container');\n const page = pages[pages.length - 1]; // last one\n if (page && page.tabIndex === -1) {\n console.log('FOCUS', page);\n page.focus();\n }\n }\n }, 100);\n return () => clearTimeout(timer);\n};\n\nexport default focusDeck;\n","import { useEffect, useRef } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\n// Hook that runs a callback when the location changes\n// Won't run on the first render\n\nexport default function useLocationChange(fn) {\n if (!fn) return;\n const location = useLocation();\n const currentLocationRef = useRef(location.pathname);\n useEffect(() => {\n // console.log('location', {\n // current: currentLocationRef.current,\n // next: location.pathname,\n // });\n if (\n currentLocationRef.current &&\n location.pathname !== currentLocationRef.current\n ) {\n fn?.();\n }\n }, [location.pathname, fn]);\n}\n","import { Trans } from '@lingui/react/macro';\nimport punycode from 'punycode/';\n\nfunction AccountHandleInfo({ acct, instance }) {\n // acct = username or username@server\n let [username, server] = acct.split('@');\n if (!server) server = instance;\n const encodedAcct = punycode.toASCII(acct);\n return (\n <div class=\"handle-info\">\n <span class=\"handle-handle\" title={encodedAcct}>\n <b class=\"handle-username\">{username}</b>\n <span class=\"handle-at\">@</span>\n <b class=\"handle-server\">{server}</b>\n </span>\n <div class=\"handle-legend\">\n <span class=\"ib\">\n <span class=\"handle-legend-icon username\" /> <Trans>username</Trans>\n </span>{' '}\n <span class=\"ib\">\n <span class=\"handle-legend-icon server\" />{' '}\n <Trans>server domain name</Trans>\n </span>\n </div>\n </div>\n );\n}\n\nexport default AccountHandleInfo;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Loader from './loader';\n\nconst SUPPORTED_IMAGE_FORMATS = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n];\nconst SUPPORTED_IMAGE_FORMATS_STR = SUPPORTED_IMAGE_FORMATS.join(',');\n\nfunction FieldsAttributesRow({ name, value, disabled, index: i }) {\n const [hasValue, setHasValue] = useState(!!value);\n return (\n <tr>\n <td>\n <input\n type=\"text\"\n name={`fields_attributes[${i}][name]`}\n defaultValue={name}\n disabled={disabled}\n maxLength={255}\n required={hasValue}\n dir=\"auto\"\n />\n </td>\n <td>\n <input\n type=\"text\"\n name={`fields_attributes[${i}][value]`}\n defaultValue={value}\n disabled={disabled}\n maxLength={255}\n onChange={(e) => setHasValue(!!e.currentTarget.value)}\n dir=\"auto\"\n />\n </td>\n </tr>\n );\n}\n\nfunction EditProfileSheet({ onClose = () => {} }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('loading');\n const [account, setAccount] = useState(null);\n const [headerPreview, setHeaderPreview] = useState(null);\n const [avatarPreview, setAvatarPreview] = useState(null);\n\n useEffect(() => {\n (async () => {\n try {\n const acc = await masto.v1.accounts.verifyCredentials();\n setAccount(acc);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n console.log('EditProfileSheet', account);\n const { displayName, source, avatar, header } = account || {};\n const { note, fields } = source || {};\n const fieldsAttributesRef = useRef(null);\n\n const avatarMediaAttachments = [\n ...(avatar ? [{ type: 'image', url: avatar }] : []),\n ...(avatarPreview ? [{ type: 'image', url: avatarPreview }] : []),\n ];\n const headerMediaAttachments = [\n ...(header ? [{ type: 'image', url: header }] : []),\n ...(headerPreview ? [{ type: 'image', url: headerPreview }] : []),\n ];\n\n return (\n <div class=\"sheet\" id=\"edit-profile-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>Edit profile</Trans>\n </b>\n </header>\n <main>\n {uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const header = formData.get('header');\n const avatar = formData.get('avatar');\n const displayName = formData.get('display_name');\n const note = formData.get('note');\n const fieldsAttributesFields =\n fieldsAttributesRef.current.querySelectorAll(\n 'input[name^=\"fields_attributes\"]',\n );\n const fieldsAttributes = [];\n fieldsAttributesFields.forEach((field) => {\n const name = field.name;\n const [_, index, key] =\n name.match(/fields_attributes\\[(\\d+)\\]\\[(.+)\\]/) || [];\n const value = field.value ? field.value.trim() : '';\n if (index && key && value) {\n if (!fieldsAttributes[index]) fieldsAttributes[index] = {};\n fieldsAttributes[index][key] = value;\n }\n });\n // Fill in the blanks\n fieldsAttributes.forEach((field) => {\n if (field.name && !field.value) {\n field.value = '';\n }\n });\n\n (async () => {\n try {\n const newAccount = await masto.v1.accounts.updateCredentials({\n header,\n avatar,\n displayName,\n note,\n fieldsAttributes,\n });\n console.log('updated account', newAccount);\n onClose?.({\n state: 'success',\n account: newAccount,\n });\n } catch (e) {\n console.error(e);\n alert(e?.message || t`Unable to update profile.`);\n }\n })();\n }}\n >\n <div class=\"edit-profile-media-container\">\n <label>\n <Trans>Header picture</Trans>{' '}\n <input\n type=\"file\"\n name=\"header\"\n accept={SUPPORTED_IMAGE_FORMATS_STR}\n onChange={(e) => {\n const file = e.target.files[0];\n if (file) {\n const blob = URL.createObjectURL(file);\n setHeaderPreview(blob);\n }\n }}\n />\n </label>\n <div class=\"edit-profile-media-field\">\n {header ? (\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: headerMediaAttachments,\n mediaIndex: 0,\n };\n }}\n >\n <img src={header} alt=\"\" />\n </div>\n ) : (\n <div class=\"edit-media\"></div>\n )}\n {headerPreview && (\n <>\n <Icon icon=\"arrow-right\" />\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: headerMediaAttachments,\n mediaIndex: 1,\n };\n }}\n >\n <img src={headerPreview} alt=\"\" />\n </div>\n </>\n )}\n </div>\n </div>\n <div class=\"edit-profile-media-container\">\n <label>\n <Trans>Profile picture</Trans>{' '}\n <input\n type=\"file\"\n name=\"avatar\"\n accept={SUPPORTED_IMAGE_FORMATS_STR}\n onChange={(e) => {\n const file = e.target.files[0];\n if (file) {\n const blob = URL.createObjectURL(file);\n setAvatarPreview(blob);\n }\n }}\n />\n </label>\n <div class=\"edit-profile-media-field\">\n {avatar ? (\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: avatarMediaAttachments,\n mediaIndex: 0,\n };\n }}\n >\n <img src={avatar} alt=\"\" />\n </div>\n ) : (\n <div class=\"edit-media\"></div>\n )}\n {avatarPreview && (\n <>\n <Icon icon=\"arrow-right\" />\n <div\n class=\"edit-media\"\n tabIndex=\"0\"\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: avatarMediaAttachments,\n mediaIndex: 1,\n };\n }}\n >\n <img src={avatarPreview} alt=\"\" />\n </div>\n </>\n )}\n </div>\n </div>\n <p>\n <label>\n <Trans>Name</Trans>{' '}\n <input\n type=\"text\"\n name=\"display_name\"\n defaultValue={displayName}\n maxLength={30}\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </p>\n <p>\n <label>\n <Trans>Bio</Trans>\n <textarea\n defaultValue={note}\n name=\"note\"\n maxLength={500}\n rows=\"5\"\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </p>\n {/* Table for fields; name and values are in fields, min 4 rows */}\n <p>\n <Trans>Extra fields</Trans>\n </p>\n <table ref={fieldsAttributesRef}>\n <thead>\n <tr>\n <th>\n <Trans>Label</Trans>\n </th>\n <th>\n <Trans>Content</Trans>\n </th>\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: Math.max(4, fields.length) }).map(\n (_, i) => {\n const { name = '', value = '' } = fields[i] || {};\n return (\n <FieldsAttributesRow\n key={i}\n name={name}\n value={value}\n index={i}\n disabled={uiState === 'loading'}\n />\n );\n },\n )}\n </tbody>\n </table>\n <footer>\n <button\n type=\"button\"\n class=\"light\"\n disabled={uiState === 'loading'}\n onClick={() => {\n onClose?.();\n }}\n >\n <Trans>Cancel</Trans>\n </button>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n <Trans>Save</Trans>\n </button>\n </footer>\n </form>\n )}\n </main>\n </div>\n );\n}\n\nexport default EditProfileSheet;\n","import { Trans } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport supports from '../utils/supports';\n\nimport AccountBlock from './account-block';\nimport Loader from './loader';\n\nconst ENDORSEMENTS_LIMIT = 80;\n\nfunction Endorsements({\n accountID: id,\n info,\n open = false,\n onlyOpenIfHasEndorsements = false,\n}) {\n const { masto } = api();\n const endorsementsContainer = useRef();\n const [endorsementsUIState, setEndorsementsUIState] = useState('default');\n const [endorsements, setEndorsements] = useState([]);\n const [relationshipsMap, setRelationshipsMap] = useState({});\n useEffect(() => {\n if (!supports('@mastodon/endorsements')) return;\n if (!open) return;\n (async () => {\n setEndorsementsUIState('loading');\n try {\n const accounts = await masto.v1.accounts.$select(id).endorsements.list({\n limit: ENDORSEMENTS_LIMIT,\n });\n console.log({ endorsements: accounts });\n if (!accounts.length) {\n setEndorsementsUIState('default');\n return;\n }\n setEndorsements(accounts);\n setEndorsementsUIState('default');\n setTimeout(() => {\n endorsementsContainer.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }, 300);\n\n const relationships = await fetchRelationships(\n accounts,\n relationshipsMap,\n );\n if (relationships) {\n setRelationshipsMap(relationships);\n }\n } catch (e) {\n console.error(e);\n setEndorsementsUIState('error');\n }\n })();\n }, [open, id]);\n\n const reallyOpen = onlyOpenIfHasEndorsements\n ? open && endorsements.length > 0\n : open;\n\n if (!reallyOpen) return null;\n\n return (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <div class=\"endorsements-container\" ref={endorsementsContainer}>\n <h3>\n <Trans>Profiles featured by @{info.username}</Trans>\n </h3>\n {endorsementsUIState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : endorsements.length > 0 ? (\n <ul\n class={`endorsements ${\n endorsements.length > 10 ? 'expanded' : ''\n }`}\n >\n {endorsements.map((account) => (\n <li>\n <AccountBlock\n key={account.id}\n account={account}\n showStats\n avatarSize=\"xxl\"\n relationship={relationshipsMap[account.id]}\n />\n </li>\n ))}\n </ul>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>No featured profiles.</Trans>\n </p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport default Endorsements;\n","import { api } from './api';\nimport pmem from './pmem';\nimport store from './store';\n\nconst FETCH_MAX_AGE = 1000 * 60; // 1 minute\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\n\nexport const fetchLists = pmem(\n async () => {\n const { masto } = api();\n const lists = await masto.v1.lists.list();\n lists.sort((a, b) => a.title.localeCompare(b.title));\n\n if (lists.length) {\n setTimeout(() => {\n // Save to local storage, with saved timestamp\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }, 1);\n }\n\n return lists;\n },\n {\n maxAge: FETCH_MAX_AGE,\n },\n);\n\nexport async function getLists() {\n try {\n const { lists, updatedAt } = store.account.get('lists') || {};\n if (!lists?.length) return await fetchLists();\n if (Date.now() - updatedAt > MAX_AGE) {\n // Stale-while-revalidate\n fetchLists();\n return lists;\n }\n return lists;\n } catch (e) {\n return [];\n }\n}\n\nexport const fetchList = pmem(\n (id) => {\n const { masto } = api();\n return masto.v1.lists.$select(id).fetch();\n },\n {\n maxAge: FETCH_MAX_AGE,\n },\n);\n\nexport async function getList(id) {\n const { lists } = store.account.get('lists') || {};\n console.log({ lists });\n if (lists?.length) {\n const theList = lists.find((l) => l.id === id);\n if (theList) return theList;\n }\n try {\n return fetchList(id);\n } catch (e) {\n return null;\n }\n}\n\nexport async function getListTitle(id) {\n const list = await getList(id);\n return list?.title || '';\n}\n\nexport function addListStore(list) {\n const { lists } = store.account.get('lists') || {};\n if (lists?.length) {\n lists.push(list);\n lists.sort((a, b) => a.title.localeCompare(b.title));\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }\n}\n\nexport function updateListStore(list) {\n const { lists } = store.account.get('lists') || {};\n if (lists?.length) {\n const index = lists.findIndex((l) => l.id === list.id);\n if (index !== -1) {\n lists[index] = list;\n lists.sort((a, b) => a.title.localeCompare(b.title));\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }\n }\n}\n\nexport function deleteListStore(listID) {\n const { lists } = store.account.get('lists') || {};\n if (lists?.length) {\n const index = lists.findIndex((l) => l.id === listID);\n if (index !== -1) {\n lists.splice(index, 1);\n store.account.set('lists', {\n lists,\n updatedAt: Date.now(),\n });\n }\n }\n}\n","import './list-exclusive-badge.css';\n\nimport { useLingui } from '@lingui/react/macro';\n\nimport Icon from './icon';\n\nfunction ListExclusiveBadge({ insignificant }) {\n const { t } = useLingui();\n return (\n <Icon\n icon=\"filter\"\n size=\"xs\"\n class={`list-exclusive-badge ${insignificant ? 'insignificant' : ''}`}\n title={t`Posts on this list are hidden from Home/Following`}\n />\n );\n}\n\nexport default ListExclusiveBadge;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { addListStore, deleteListStore, updateListStore } from '../utils/lists';\nimport supports from '../utils/supports';\n\nimport Icon from './icon';\nimport ListExclusiveBadge from './list-exclusive-badge';\nimport MenuConfirm from './menu-confirm';\n\nfunction ListAddEdit({ list, onClose }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const editMode = !!list;\n const nameFieldRef = useRef();\n const repliesPolicyFieldRef = useRef();\n const exclusiveFieldRef = useRef();\n useEffect(() => {\n if (editMode) {\n nameFieldRef.current.value = list.title;\n repliesPolicyFieldRef.current.value = list.repliesPolicy;\n if (exclusiveFieldRef.current) {\n exclusiveFieldRef.current.checked = list.exclusive;\n }\n }\n }, [editMode]);\n const supportsExclusive =\n supports('@mastodon/list-exclusive') ||\n supports('@gotosocial/list-exclusive');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}{' '}\n <header>\n <h2>{editMode ? t`Edit list` : t`New list`}</h2>\n </header>\n <main>\n <form\n class=\"list-form\"\n onSubmit={(e) => {\n e.preventDefault(); // Get form values\n\n const formData = new FormData(e.target);\n const title = formData.get('title');\n const repliesPolicy = formData.get('replies_policy');\n const exclusive = formData.get('exclusive') === 'on';\n console.log({\n title,\n repliesPolicy,\n exclusive,\n });\n setUIState('loading');\n\n (async () => {\n try {\n let listResult;\n\n if (editMode) {\n listResult = await masto.v1.lists.$select(list.id).update({\n title,\n replies_policy: repliesPolicy,\n exclusive,\n });\n } else {\n listResult = await masto.v1.lists.create({\n title,\n replies_policy: repliesPolicy,\n exclusive,\n });\n }\n\n console.log(listResult);\n setUIState('default');\n onClose?.({\n state: 'success',\n list: listResult,\n });\n\n setTimeout(() => {\n if (editMode) {\n updateListStore(listResult);\n } else {\n addListStore(listResult);\n }\n }, 1);\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(\n editMode\n ? t`Unable to edit list.`\n : t`Unable to create list.`,\n );\n }\n })();\n }}\n >\n <div class=\"list-form-row\">\n <label for=\"list-title\">\n <Trans>Name</Trans>{' '}\n <input\n ref={nameFieldRef}\n type=\"text\"\n id=\"list-title\"\n name=\"title\"\n required\n disabled={uiState === 'loading'}\n dir=\"auto\"\n />\n </label>\n </div>\n <div class=\"list-form-row\">\n <select\n ref={repliesPolicyFieldRef}\n name=\"replies_policy\"\n required\n disabled={uiState === 'loading'}\n >\n <option value=\"list\">\n <Trans>Show replies to list members</Trans>\n </option>\n <option value=\"followed\">\n <Trans>Show replies to people I follow</Trans>\n </option>\n <option value=\"none\">\n <Trans>Don't show replies</Trans>\n </option>\n </select>\n </div>\n {supportsExclusive && (\n <div class=\"list-form-row\">\n <label class=\"label-block\">\n <input\n ref={exclusiveFieldRef}\n type=\"checkbox\"\n name=\"exclusive\"\n disabled={uiState === 'loading'}\n />{' '}\n <ListExclusiveBadge insignificant />{' '}\n <Trans>Hide posts on this list from Home/Following</Trans>\n </label>\n </div>\n )}\n <div class=\"list-form-footer\">\n <button type=\"submit\" disabled={uiState === 'loading'}>\n {editMode ? t`Save` : t`Create`}\n </button>\n {editMode && (\n <MenuConfirm\n disabled={uiState === 'loading'}\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel={t`Delete this list?`}\n onClick={() => {\n // const yes = confirm('Delete this list?');\n // if (!yes) return;\n setUIState('loading');\n\n (async () => {\n try {\n await masto.v1.lists.$select(list.id).remove();\n setUIState('default');\n onClose?.({\n state: 'deleted',\n });\n setTimeout(() => {\n deleteListStore(list.id);\n }, 1);\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(t`Unable to delete list.`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n <Trans>Delete…</Trans>\n </button>\n </MenuConfirm>\n )}\n </div>\n </form>\n </main>\n </div>\n );\n}\n\nexport default ListAddEdit;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport { getLists } from '../utils/lists';\n\nimport Icon from './icon';\nimport ListAddEdit from './list-add-edit';\nimport Loader from './loader';\nimport Modal from './modal';\n\nfunction AddRemoveListsSheet({ accountID, onClose }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [lists, setLists] = useState([]);\n const [listsContainingAccount, setListsContainingAccount] = useState([]);\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const lists = await getLists();\n setLists(lists);\n const listsContainingAccount = await masto.v1.accounts\n .$select(accountID)\n .lists.list();\n console.log({ lists, listsContainingAccount });\n setListsContainingAccount(listsContainingAccount);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n\n return (\n <div class=\"sheet\" id=\"list-add-remove-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Add/Remove from Lists</Trans>\n </h2>\n </header>\n <main>\n {lists.length > 0 ? (\n <ul class=\"list-add-remove\">\n {lists.map((list) => {\n const inList = listsContainingAccount.some(\n (l) => l.id === list.id,\n );\n return (\n <li>\n <button\n type=\"button\"\n class={`light ${inList ? 'checked' : ''}`}\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n if (inList) {\n await masto.v1.lists\n .$select(list.id)\n .accounts.remove({\n accountIds: [accountID],\n });\n } else {\n await masto.v1.lists\n .$select(list.id)\n .accounts.create({\n accountIds: [accountID],\n });\n }\n // setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(\n inList\n ? t`Unable to remove from list.`\n : t`Unable to add to list.`,\n );\n }\n })();\n }}\n >\n <Icon icon=\"check-circle\" alt=\"☑️\" />\n <span>{list.title}</span>\n </button>\n </li>\n );\n })}\n </ul>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load lists.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No lists.</Trans>\n </p>\n )}\n <button\n type=\"button\"\n class=\"plain2\"\n onClick={() => setShowListAddEditModal(true)}\n disabled={uiState !== 'default'}\n >\n <Icon icon=\"plus\" size=\"l\" />{' '}\n <span>\n <Trans>New list</Trans>\n </span>\n </button>\n </main>\n {showListAddEditModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nexport default AddRemoveListsSheet;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Loader from './loader';\n\nfunction PrivateNoteSheet({\n account,\n note: initialNote,\n onRelationshipChange = () => {},\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const textareaRef = useRef(null);\n\n useEffect(() => {\n let timer;\n if (textareaRef.current && !initialNote) {\n timer = setTimeout(() => {\n textareaRef.current.focus?.();\n }, 100);\n }\n return () => {\n clearTimeout(timer);\n };\n }, []);\n\n return (\n <div class=\"sheet\" id=\"private-note-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <b>\n <Trans>\n Private note about{' '}\n <span class=\"bidi-isolate\">\n @{account?.username || account?.acct}\n </span>\n </Trans>\n </b>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const note = formData.get('note');\n if (note?.trim() !== initialNote?.trim()) {\n setUIState('loading');\n (async () => {\n try {\n const newRelationship = await masto.v1.accounts\n .$select(account?.id)\n .note.create({\n comment: note,\n });\n console.log('updated relationship', newRelationship);\n setUIState('default');\n onRelationshipChange(newRelationship);\n onClose();\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(e?.message || t`Unable to update private note.`);\n }\n })();\n }\n }}\n >\n <textarea\n ref={textareaRef}\n name=\"note\"\n disabled={uiState === 'loading'}\n dir=\"auto\"\n >\n {initialNote}\n </textarea>\n <footer>\n <button\n type=\"button\"\n class=\"light\"\n disabled={uiState === 'loading'}\n onClick={() => {\n onClose?.();\n }}\n >\n <Trans>Cancel</Trans>\n </button>\n <span>\n <Loader abrupt hidden={uiState !== 'loading'} />\n <button disabled={uiState === 'loading'} type=\"submit\">\n <Trans>Save & close</Trans>\n </button>\n </span>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nexport default PrivateNoteSheet;\n","import { Trans, useLingui } from '@lingui/react/macro';\n\nimport getHTMLText from '../utils/getHTMLText';\n\nimport Icon from './icon';\nimport TranslationBlock from './translation-block';\n\nfunction TranslatedBioSheet({ note, fields, onClose }) {\n const { t } = useLingui();\n const fieldsText =\n fields\n ?.map(({ name, value }) => `${name}\\n${getHTMLText(value)}`)\n .join('\\n\\n') || '';\n\n const text = getHTMLText(note) + (fieldsText ? `\\n\\n${fieldsText}` : '');\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Translated Bio</Trans>\n </h2>\n </header>\n <main>\n <p\n style={{\n whiteSpace: 'pre-wrap',\n }}\n >\n {text}\n </p>\n <TranslationBlock forceTranslate text={text} />\n </main>\n </div>\n );\n}\n\nexport default TranslatedBioSheet;\n","import { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport punycode from 'punycode/';\n\nimport { api } from '../utils/api';\nimport i18nDuration from '../utils/i18n-duration';\nimport niceDateTime from '../utils/nice-date-time';\nimport showCompose from '../utils/show-compose';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport { getCurrentAccountID, updateAccount } from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport AddRemoveListsSheet from './add-remove-lists-sheet';\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuConfirm from './menu-confirm';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport PrivateNoteSheet from './private-note-sheet';\nimport SubMenu2 from './submenu2';\nimport TranslatedBioSheet from './translated-bio-sheet';\n\nconst MUTE_DURATIONS = [\n 60 * 5, // 5 minutes\n 60 * 30, // 30 minutes\n 60 * 60, // 1 hour\n 60 * 60 * 6, // 6 hours\n 60 * 60 * 24, // 1 day\n 60 * 60 * 24 * 3, // 3 days\n 60 * 60 * 24 * 7, // 1 week\n 60 * 60 * 24 * 30, // 30 days\n 0, // forever\n];\nconst MUTE_DURATIONS_LABELS = {\n 0: msg`Forever`,\n 300: i18nDuration(5, 'minute'),\n 1_800: i18nDuration(30, 'minute'),\n 3_600: i18nDuration(1, 'hour'),\n 21_600: i18nDuration(6, 'hour'),\n 86_400: i18nDuration(1, 'day'),\n 259_200: i18nDuration(3, 'day'),\n 604_800: i18nDuration(1, 'week'),\n 2592_000: i18nDuration(30, 'day'),\n};\n\nfunction RelatedActions({\n info,\n instance,\n standalone,\n authenticated,\n onRelationshipChange = () => {},\n setShowEditProfile = () => {},\n showEndorsements = false,\n renderEndorsements = false,\n setRenderEndorsements = () => {},\n}) {\n if (!info) return null;\n const { _, t } = useLingui();\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated: currentAuthenticated,\n } = api();\n const sameInstance = instance === currentInstance;\n\n const [relationshipUIState, setRelationshipUIState] = useState('default');\n const [relationship, setRelationship] = useState(null);\n\n const { id, acct, url, username, locked, lastStatusAt, note, fields, moved } =\n info;\n const accountID = useRef(id);\n\n const {\n following,\n showingReblogs,\n notifying,\n followedBy,\n blocking,\n blockedBy,\n muting,\n mutingNotifications,\n requested,\n domainBlocking,\n endorsed,\n note: privateNote,\n } = relationship || {};\n\n const [currentInfo, setCurrentInfo] = useState(null);\n const [isSelf, setIsSelf] = useState(false);\n\n const acctWithInstance = acct.includes('@') ? acct : `${acct}@${instance}`;\n\n const supportsEndorsements = supports('@mastodon/endorsements');\n\n useEffect(() => {\n if (info) {\n const currentAccount = getCurrentAccountID();\n let currentID;\n (async () => {\n if (sameInstance && authenticated) {\n currentID = id;\n } else if (!sameInstance && currentAuthenticated) {\n // Grab this account from my logged-in instance\n const acctHasInstance = info.acct.includes('@');\n try {\n const results = await currentMasto.v2.search.list({\n q: acctHasInstance ? info.acct : `${info.username}@${instance}`,\n type: 'accounts',\n limit: 1,\n resolve: true,\n });\n console.log('🥏 Fetched account from logged-in instance', results);\n if (results.accounts.length) {\n currentID = results.accounts[0].id;\n setCurrentInfo(results.accounts[0]);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n if (!currentID) return;\n\n if (currentAccount === currentID) {\n // It's myself!\n setIsSelf(true);\n return;\n }\n\n accountID.current = currentID;\n\n // if (moved) return;\n\n setRelationshipUIState('loading');\n\n const fetchRelationships = currentMasto.v1.accounts.relationships.fetch(\n {\n id: [currentID],\n },\n );\n\n try {\n const relationships = await fetchRelationships;\n console.log('fetched relationship', relationships);\n setRelationshipUIState('default');\n\n if (relationships.length) {\n const relationship = relationships[0];\n setRelationship(relationship);\n onRelationshipChange({ relationship, currentID });\n }\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }\n }, [info, authenticated]);\n\n useEffect(() => {\n if (info && isSelf) {\n updateAccount(info);\n }\n }, [info, isSelf]);\n\n const loading = relationshipUIState === 'loading';\n\n const [showTranslatedBio, setShowTranslatedBio] = useState(false);\n const [showAddRemoveLists, setShowAddRemoveLists] = useState(false);\n const [showPrivateNoteModal, setShowPrivateNoteModal] = useState(false);\n const [lists, setLists] = useState([]);\n\n return (\n <>\n <div class=\"actions\">\n <span>\n {followedBy ? (\n <span class=\"tag\">\n <Trans>Follows you</Trans>\n </span>\n ) : !!lastStatusAt ? (\n <small class=\"insignificant\">\n <Trans>\n Last post:{' '}\n <span class=\"ib\">\n {niceDateTime(lastStatusAt, {\n hideTime: true,\n })}\n </span>\n </Trans>\n </small>\n ) : (\n <span />\n )}\n {muting && (\n <span class=\"tag danger\">\n <Trans>Muted</Trans>\n </span>\n )}\n {blocking && (\n <span class=\"tag danger\">\n <Trans>Blocked</Trans>\n </span>\n )}\n </span>{' '}\n <span class=\"buttons\">\n {!!privateNote && (\n <button\n type=\"button\"\n class=\"private-note-tag\"\n title={t`Private note`}\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n dir=\"auto\"\n >\n <span>{privateNote}</span>\n </button>\n )}\n <Menu2\n portal={{\n target: document.body,\n }}\n containerProps={{\n style: {\n // Higher than the backdrop\n zIndex: 1001,\n },\n }}\n align=\"center\"\n position=\"anchor\"\n overflow=\"auto\"\n menuButton={\n <button type=\"button\" class=\"plain\" disabled={loading}>\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n onMenuChange={(e) => {\n if (following && e.open) {\n // Fetch lists that have this account\n (async () => {\n try {\n const lists = await currentMasto.v1.accounts\n .$select(accountID.current)\n .lists.list();\n console.log('fetched account lists', lists);\n setLists(lists);\n } catch (e) {\n console.error(e);\n }\n })();\n }\n }}\n >\n {currentAuthenticated && !isSelf ? (\n <>\n <MenuItem\n onClick={() => {\n showCompose({\n draftStatus: {\n status: `@${currentInfo?.acct || acct} `,\n },\n });\n }}\n >\n <Icon icon=\"at\" />\n <span>\n <Trans>\n Mention <span class=\"bidi-isolate\">@{username}</span>\n </Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setShowTranslatedBio(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate bio</Trans>\n </span>\n </MenuItem>\n {supports('@mastodon/profile-private-note') && (\n <MenuItem\n onClick={() => {\n setShowPrivateNoteModal(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n {privateNote ? t`Edit private note` : t`Add private note`}\n </span>\n </MenuItem>\n )}\n {following && !!relationship && (\n <>\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const rel = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow({\n notify: !notifying,\n });\n if (rel) setRelationship(rel);\n setRelationshipUIState('default');\n showToast(\n rel.notifying\n ? t`Notifications enabled for @${username}'s posts.`\n : t` Notifications disabled for @${username}'s posts.`,\n );\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"notification\" />\n <span>\n {notifying\n ? t`Disable notifications`\n : t`Enable notifications`}\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const rel = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow({\n reblogs: !showingReblogs,\n });\n if (rel) setRelationship(rel);\n setRelationshipUIState('default');\n showToast(\n rel.showingReblogs\n ? t`Boosts from @${username} enabled.`\n : t`Boosts from @${username} disabled.`,\n );\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"rocket\" />\n <span>\n {showingReblogs ? t`Disable boosts` : t`Enable boosts`}\n </span>\n </MenuItem>\n </>\n )}\n {supportsEndorsements && following && (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n if (endorsed) {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unpin();\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n t`@${username} is no longer featured on your profile.`,\n );\n } else {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .pin();\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n t`@${username} is now featured on your profile.`,\n );\n }\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n if (endorsed) {\n showToast(\n t`Unable to unfeature @${username} on your profile.`,\n );\n } else {\n showToast(\n t`Unable to feature @${username} on your profile.`,\n );\n }\n }\n })();\n }}\n >\n <Icon icon=\"endorsement\" />\n {endorsed\n ? t`Don't feature on profile`\n : t`Feature on profile`}\n </MenuItem>\n )}\n {showEndorsements &&\n supportsEndorsements &&\n !renderEndorsements && (\n <MenuItem onClick={() => setRenderEndorsements(true)}>\n <Icon icon=\"endorsement\" />\n <span>\n <Trans>Show featured profiles</Trans>\n </span>\n </MenuItem>\n )}\n {/* Add/remove from lists is only possible if following the account */}\n {following && (\n <MenuItem\n onClick={() => {\n setShowAddRemoveLists(true);\n }}\n >\n <Icon icon=\"list\" />\n {lists.length ? (\n <>\n <small class=\"menu-grow\">\n <Trans>Add/Remove from Lists</Trans>\n <br />\n <span class=\"more-insignificant\">\n {lists.map((list) => list.title).join(', ')}\n </span>\n </small>\n <small class=\"more-insignificant\">{lists.length}</small>\n </>\n ) : (\n <span>\n <Trans>Add/Remove from Lists</Trans>\n </span>\n )}\n </MenuItem>\n )}\n <MenuDivider />\n </>\n ) : (\n supportsEndorsements &&\n !renderEndorsements && (\n <>\n <MenuItem onClick={() => setRenderEndorsements(true)}>\n <Icon icon=\"endorsement\" />\n Show featured profiles\n </MenuItem>\n <MenuDivider />\n </>\n )\n )}\n <MenuItem\n onClick={() => {\n const handle = `@${currentInfo?.acct || acctWithInstance}`;\n try {\n navigator.clipboard.writeText(handle);\n showToast(t`Handle copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy handle`);\n }\n }}\n >\n <Icon icon=\"copy\" />\n <small>\n <Trans>Copy handle</Trans>\n <br />\n <span class=\"more-insignificant bidi-isolate\">\n @{currentInfo?.acct || acctWithInstance}\n </span>\n </small>\n </MenuItem>\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <small class=\"menu-double-lines\">{niceAccountURL(url)}</small>\n </MenuItem>\n <div class=\"menu-horizontal\">\n <MenuItem\n onClick={() => {\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy</Trans>\n </span>\n </MenuItem>\n {navigator?.share &&\n navigator?.canShare?.({\n url,\n }) && (\n <MenuItem\n onClick={() => {\n try {\n navigator.share({\n url,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />\n <span>\n <Trans>Share…</Trans>\n </span>\n </MenuItem>\n )}\n </div>\n {!!relationship && (\n <>\n <MenuDivider />\n {muting ? (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unmute();\n console.log('unmuting', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(t`Unmuted @${username}`);\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"unmute\" />\n <span>\n <Trans>\n Unmute <span class=\"bidi-isolate\">@{username}</span>\n </Trans>\n </span>\n </MenuItem>\n ) : (\n <SubMenu2\n menuClassName=\"menu-blur\"\n openTrigger=\"clickOnly\"\n direction=\"bottom\"\n overflow=\"auto\"\n shift={16}\n label={\n <>\n <Icon icon=\"mute\" />\n <span class=\"menu-grow\">\n <Trans>\n Mute <span class=\"bidi-isolate\">@{username}</span>…\n </Trans>\n </span>\n <span\n style={{\n textOverflow: 'clip',\n }}\n >\n <Icon icon=\"time\" />\n <Icon icon=\"chevron-right\" />\n </span>\n </>\n }\n >\n <div class=\"menu-wrap\">\n {MUTE_DURATIONS.map((duration) => (\n <MenuItem\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship =\n await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .mute({\n duration,\n });\n console.log('muting', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(\n t`Muted @${username} for ${\n typeof MUTE_DURATIONS_LABELS[duration] ===\n 'function'\n ? MUTE_DURATIONS_LABELS[duration]()\n : _(MUTE_DURATIONS_LABELS[duration])\n }`,\n );\n states.reloadGenericAccounts.id = 'mute';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n showToast(t`Unable to mute @${username}`);\n }\n })();\n }}\n >\n {typeof MUTE_DURATIONS_LABELS[duration] === 'function'\n ? MUTE_DURATIONS_LABELS[duration]()\n : _(MUTE_DURATIONS_LABELS[duration])}\n </MenuItem>\n ))}\n </div>\n </SubMenu2>\n )}\n {followedBy && (\n <MenuConfirm\n subMenu\n menuItemClassName=\"danger\"\n confirmLabel={\n <>\n <Icon icon=\"user-x\" />\n <span>\n <Trans>\n Remove <span class=\"bidi-isolate\">@{username}</span>{' '}\n from followers?\n </Trans>\n </span>\n </>\n }\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .removeFromFollowers();\n console.log(\n 'removing from followers',\n newRelationship,\n );\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(t`@${username} removed from followers`);\n states.reloadGenericAccounts.id = 'followers';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <Icon icon=\"user-x\" />\n <span>\n <Trans>Remove follower…</Trans>\n </span>\n </MenuConfirm>\n )}\n <MenuConfirm\n subMenu\n confirm={!blocking}\n confirmLabel={\n <>\n <Icon icon=\"block\" />\n <span>\n <Trans>\n Block <span class=\"bidi-isolate\">@{username}</span>?\n </Trans>\n </span>\n </>\n }\n itemProps={{\n className: 'danger',\n }}\n menuItemClassName=\"danger\"\n onClick={() => {\n // if (!blocking && !confirm(`Block @${username}?`)) {\n // return;\n // }\n setRelationshipUIState('loading');\n (async () => {\n try {\n if (blocking) {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .unblock();\n console.log('unblocking', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(t`Unblocked @${username}`);\n } else {\n const newRelationship = await currentMasto.v1.accounts\n .$select(currentInfo?.id || id)\n .block();\n console.log('blocking', newRelationship);\n setRelationship(newRelationship);\n setRelationshipUIState('default');\n showToast(t`Blocked @${username}`);\n }\n states.reloadGenericAccounts.id = 'block';\n states.reloadGenericAccounts.counter++;\n } catch (e) {\n console.error(e);\n setRelationshipUIState('error');\n if (blocking) {\n showToast(t`Unable to unblock @${username}`);\n } else {\n showToast(t`Unable to block @${username}`);\n }\n }\n })();\n }}\n >\n {blocking ? (\n <>\n <Icon icon=\"unblock\" />\n <span>\n <Trans>\n Unblock <span class=\"bidi-isolate\">@{username}</span>\n </Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"block\" />\n <span>\n <Trans>\n Block <span class=\"bidi-isolate\">@{username}</span>…\n </Trans>\n </span>\n </>\n )}\n </MenuConfirm>\n <MenuItem\n className=\"danger\"\n onClick={() => {\n states.showReportModal = {\n account: currentInfo || info,\n };\n }}\n >\n <Icon icon=\"flag\" />\n <span>\n <Trans>\n Report <span class=\"bidi-isolate\">@{username}</span>…\n </Trans>\n </span>\n </MenuItem>\n </>\n )}\n {currentAuthenticated &&\n isSelf &&\n standalone &&\n supports('@mastodon/profile-edit') && (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n setShowEditProfile(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit profile</Trans>\n </span>\n </MenuItem>\n </>\n )}\n {import.meta.env.DEV && currentAuthenticated && isSelf && (\n <>\n <MenuDivider />\n <MenuItem\n onClick={async () => {\n const relationships =\n await currentMasto.v1.accounts.relationships.fetch({\n id: [accountID.current],\n });\n const { note } = relationships[0] || {};\n if (note) {\n alert(note);\n console.log(note);\n }\n }}\n >\n <Icon icon=\"pencil\" />\n <span>See note</span>\n </MenuItem>\n </>\n )}\n </Menu2>\n {!relationship && relationshipUIState === 'loading' && (\n <Loader abrupt />\n )}\n {!!relationship && !moved && (\n <MenuConfirm\n confirm={following || requested}\n confirmLabel={\n <span>\n {requested\n ? t`Withdraw follow request?`\n : t`Unfollow @${info.acct || info.username}?`}\n </span>\n }\n menuItemClassName=\"danger\"\n align=\"end\"\n disabled={loading}\n onClick={() => {\n setRelationshipUIState('loading');\n (async () => {\n try {\n let newRelationship;\n\n if (following || requested) {\n // const yes = confirm(\n // requested\n // ? 'Withdraw follow request?'\n // : `Unfollow @${info.acct || info.username}?`,\n // );\n\n // if (yes) {\n newRelationship = await currentMasto.v1.accounts\n .$select(accountID.current)\n .unfollow();\n // }\n } else {\n newRelationship = await currentMasto.v1.accounts\n .$select(accountID.current)\n .follow();\n }\n\n if (newRelationship) {\n setRelationship(newRelationship);\n\n // Show endorsements if start following\n if (\n showEndorsements &&\n supportsEndorsements &&\n !renderEndorsements &&\n newRelationship.following\n ) {\n setRenderEndorsements('onlyOpenIfHasEndorsements');\n }\n }\n setRelationshipUIState('default');\n } catch (e) {\n alert(e);\n setRelationshipUIState('error');\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class={`${following || requested ? 'light swap' : ''}`}\n data-swap-state={following || requested ? 'danger' : ''}\n disabled={loading}\n >\n {following ? (\n <>\n <span>\n <Trans>Following</Trans>\n </span>\n <span>\n <Trans>Unfollow…</Trans>\n </span>\n </>\n ) : requested ? (\n <>\n <span>\n <Trans>Requested</Trans>\n </span>\n <span>\n <Trans>Withdraw…</Trans>\n </span>\n </>\n ) : locked ? (\n <>\n <Icon icon=\"lock\" />{' '}\n <span>\n <Trans>Follow</Trans>\n </span>\n </>\n ) : (\n t`Follow`\n )}\n </button>\n </MenuConfirm>\n )}\n </span>\n </div>\n {!!showTranslatedBio && (\n <Modal\n onClose={() => {\n setShowTranslatedBio(false);\n }}\n >\n <TranslatedBioSheet\n note={note}\n fields={fields}\n onClose={() => setShowTranslatedBio(false)}\n />\n </Modal>\n )}\n {!!showAddRemoveLists && (\n <Modal\n onClose={() => {\n setShowAddRemoveLists(false);\n }}\n >\n <AddRemoveListsSheet\n accountID={accountID.current}\n onClose={() => setShowAddRemoveLists(false)}\n />\n </Modal>\n )}\n {!!showPrivateNoteModal && (\n <Modal\n onClose={() => {\n setShowPrivateNoteModal(false);\n }}\n >\n <PrivateNoteSheet\n account={info}\n note={privateNote}\n onRelationshipChange={(relationship) => {\n setRelationship(relationship);\n // onRelationshipChange({ relationship, currentID: accountID.current });\n }}\n onClose={() => setShowPrivateNoteModal(false)}\n />\n </Modal>\n )}\n </>\n );\n}\n\nfunction niceAccountURL(url) {\n if (!url) return;\n const urlObj = URL.parse(url);\n if (!urlObj) return;\n const { host, pathname } = urlObj;\n const path = pathname.replace(/\\/$/, '').replace(/^\\//, '');\n return (\n <>\n <span class=\"more-insignificant\">{punycode.toUnicode(host)}/</span>\n <wbr />\n <span>{path}</span>\n </>\n );\n}\n\nexport default RelatedActions;\n","import './account-info.css';\n\nimport { plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport getDomain from '../utils/get-domain';\nimport handleContentLinks from '../utils/handle-content-links';\nimport niceDateTime from '../utils/nice-date-time';\nimport pmem from '../utils/pmem';\nimport { supportsNativeQuote } from '../utils/quote-utils';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport {\n getAccounts,\n getCurrentAccountID,\n saveAccounts,\n} from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport AccountBlock from './account-block';\nimport AccountHandleInfo from './account-handle-info';\nimport Avatar from './avatar';\nimport EditProfileSheet from './edit-profile-sheet';\nimport EmojiText from './emoji-text';\nimport Endorsements from './endorsements';\nimport Icon from './icon';\nimport Link from './link';\nimport Menu2 from './menu2';\nimport Modal from './modal';\nimport RelatedActions from './related-actions';\n\nconst LIMIT = 80;\n\nconst ACCOUNT_INFO_MAX_AGE = 1000 * 60 * 10; // 10 mins\n\nfunction fetchFamiliarFollowers(currentID, masto) {\n return masto.v1.accounts.familiarFollowers.fetch({\n id: [currentID],\n });\n}\nconst memFetchFamiliarFollowers = pmem(fetchFamiliarFollowers, {\n maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nasync function fetchPostingStats(accountID, masto) {\n const fetchStatuses = masto.v1.accounts\n .$select(accountID)\n .statuses.list({\n limit: 20,\n })\n .values()\n .next();\n\n const { value: statuses } = await fetchStatuses;\n console.log('fetched statuses', statuses);\n const stats = {\n total: statuses.length,\n originals: 0,\n replies: 0,\n boosts: 0,\n quotes: 0,\n };\n // Categories statuses by type\n // - Original posts (not replies to others)\n // - Threads (self-replies + 1st original post)\n // - Boosts (reblogs)\n // - Replies (not-self replies)\n // - Quotes\n statuses.forEach((status) => {\n if (status.reblog) {\n stats.boosts++;\n } else if (\n !!status.inReplyToId &&\n status.inReplyToAccountId !== status.account.id // Not self-reply\n ) {\n stats.replies++;\n } else if (\n supportsNativeQuote() &&\n (status.quote?.id || status.quote?.quotedStatus?.id)\n ) {\n stats.quotes++;\n } else {\n stats.originals++;\n }\n });\n\n // Count days since last post\n if (statuses.length) {\n stats.daysSinceLastPost = Math.ceil(\n (Date.now() - Date.parse(statuses[statuses.length - 1].createdAt)) /\n 86400000,\n );\n }\n\n console.log('posting stats', stats);\n return stats;\n}\nconst memFetchPostingStats = pmem(fetchPostingStats, {\n maxAge: ACCOUNT_INFO_MAX_AGE,\n});\n\nfunction AccountInfo({\n account,\n fetchAccount = () => {},\n standalone,\n instance,\n authenticated,\n showEndorsements = false,\n}) {\n const { i18n, t } = useLingui();\n const { masto, authenticated: currentAuthenticated } = api({\n instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const [uiState, setUIState] = useState('default');\n const isString = typeof account === 'string';\n const [info, setInfo] = useState(isString ? null : account);\n\n const sameCurrentInstance = useMemo(\n () => instance === currentInstance,\n [instance, currentInstance],\n );\n\n useEffect(() => {\n if (!isString) {\n setInfo(account);\n return;\n }\n setUIState('loading');\n (async () => {\n try {\n const info = await fetchAccount();\n states.accounts[`${info.id}@${instance}`] = info;\n setInfo(info);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setInfo(null);\n setUIState('error');\n }\n })();\n }, [isString, account, fetchAccount]);\n\n const {\n acct,\n avatar,\n avatarStatic,\n bot,\n createdAt,\n displayName,\n emojis,\n fields,\n followersCount,\n followingCount,\n group,\n // header,\n // headerStatic,\n id,\n lastStatusAt,\n locked,\n note,\n statusesCount,\n url,\n username,\n memorial,\n moved,\n roles,\n hideCollections,\n } = info || {};\n let headerIsAvatar = false;\n let { header, headerStatic } = info || {};\n if (!header || /missing\\.png$/.test(header)) {\n if (avatar && !/missing\\.png$/.test(avatar)) {\n header = avatar;\n headerIsAvatar = true;\n if (avatarStatic && !/missing\\.png$/.test(avatarStatic)) {\n headerStatic = avatarStatic;\n }\n }\n }\n\n const isSelf = useMemo(() => id === getCurrentAccountID(), [id]);\n\n useEffect(() => {\n const infoHasEssentials = !!(\n info?.id &&\n info?.username &&\n info?.acct &&\n info?.avatar &&\n info?.avatarStatic &&\n info?.displayName &&\n info?.url\n );\n if (isSelf && instance && infoHasEssentials) {\n const accounts = getAccounts();\n let updated = false;\n accounts.forEach((account) => {\n if (account.info.id === info.id && account.instanceURL === instance) {\n account.info = info;\n updated = true;\n }\n });\n if (updated) {\n console.log('Updated account info', info);\n saveAccounts(accounts);\n }\n }\n }, [isSelf, info, instance]);\n\n const accountInstance = getDomain(url);\n\n const [headerCornerColors, setHeaderCornerColors] = useState([]);\n\n const followersIterator = useRef();\n const familiarFollowersCache = useRef([]);\n async function fetchFollowers(firstLoad) {\n if (firstLoad || !followersIterator.current) {\n followersIterator.current = masto.v1.accounts\n .$select(id)\n .followers.list({\n limit: LIMIT,\n })\n .values();\n }\n const results = await followersIterator.current.next();\n if (isSelf) return results;\n if (!sameCurrentInstance) return results;\n\n const { value } = results;\n let newValue = [];\n // On first load, fetch familiar followers, merge to top of results' `value`\n // Remove dups on every fetch\n if (firstLoad) {\n let familiarFollowers = [];\n try {\n familiarFollowers = await masto.v1.accounts.familiarFollowers.fetch({\n id: [id],\n });\n } catch (e) {}\n familiarFollowersCache.current = familiarFollowers?.[0]?.accounts || [];\n newValue = [\n ...familiarFollowersCache.current,\n ...value.filter(\n (account) =>\n !familiarFollowersCache.current.some(\n (familiar) => familiar.id === account.id,\n ),\n ),\n ];\n } else if (value?.length) {\n newValue = value.filter(\n (account) =>\n !familiarFollowersCache.current.some(\n (familiar) => familiar.id === account.id,\n ),\n );\n }\n\n return {\n ...results,\n value: newValue,\n };\n }\n\n const followingIterator = useRef();\n async function fetchFollowing(firstLoad) {\n if (firstLoad || !followingIterator.current) {\n followingIterator.current = masto.v1.accounts\n .$select(id)\n .following.list({\n limit: LIMIT,\n })\n .values();\n }\n const results = await followingIterator.current.next();\n return results;\n }\n\n const LinkOrDiv = standalone ? 'div' : Link;\n const accountLink = instance ? `/${instance}/a/${id}` : `/a/${id}`;\n\n const [familiarFollowers, setFamiliarFollowers] = useState([]);\n const [postingStats, setPostingStats] = useState();\n const [postingStatsUIState, setPostingStatsUIState] = useState('default');\n const hasPostingStats = !!postingStats?.total;\n\n const renderFamiliarFollowers = async (currentID) => {\n try {\n const followers = await memFetchFamiliarFollowers(\n currentID,\n currentMasto,\n );\n console.log('fetched familiar followers', followers);\n setFamiliarFollowers(\n followers[0].accounts.slice(0, FAMILIAR_FOLLOWERS_LIMIT),\n );\n } catch (e) {\n console.error(e);\n }\n };\n\n const renderPostingStats = async () => {\n if (!id) return;\n setPostingStatsUIState('loading');\n try {\n const stats = await memFetchPostingStats(id, masto);\n setPostingStats(stats);\n setPostingStatsUIState('default');\n } catch (e) {\n console.error(e);\n setPostingStatsUIState('error');\n }\n };\n\n const onRelationshipChange = useCallback(\n ({ relationship, currentID }) => {\n if (!relationship.following) {\n renderFamiliarFollowers(currentID);\n if (!standalone && statusesCount > 0) {\n // Only render posting stats if not standalone and has posts\n renderPostingStats();\n }\n }\n },\n [standalone, id, statusesCount],\n );\n\n const onProfileUpdate = useCallback(\n (newAccount) => {\n if (newAccount.id === id) {\n console.log('Updated account info', newAccount);\n setInfo(newAccount);\n states.accounts[`${newAccount.id}@${instance}`] = newAccount;\n }\n },\n [id, instance],\n );\n\n const isStringURL = isString && account && /^https?:\\/\\//.test(account);\n\n const [showEditProfile, setShowEditProfile] = useState(false);\n\n const [renderEndorsements, setRenderEndorsements] = useState(false);\n\n return (\n <>\n <div\n tabIndex=\"-1\"\n class={`account-container ${uiState === 'loading' ? 'skeleton' : ''}`}\n style={{\n '--header-color-1': headerCornerColors[0],\n '--header-color-2': headerCornerColors[1],\n '--header-color-3': headerCornerColors[2],\n '--header-color-4': headerCornerColors[3],\n }}\n >\n {uiState === 'error' && (\n <div class=\"ui-state\">\n <p>\n <Trans>Unable to load account.</Trans>\n </p>\n {isString ? (\n <p>\n {isStringURL ? (\n <a href={account} target=\"_blank\" rel=\"noopener\">\n {account}\n </a>\n ) : (\n <code class=\"insignificant\">{account}</code>\n )}\n </p>\n ) : (\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener\">\n <Trans>Go to account page</Trans> <Icon icon=\"external\" />\n </a>\n </p>\n )}\n </div>\n )}\n {uiState === 'loading' ? (\n <>\n <header>\n <AccountBlock avatarSize=\"xxxl\" skeleton />\n </header>\n <main>\n <div class=\"note\">\n <p>███████ ████ ████</p>\n <p>████ ████████ ██████ █████████ ████ ██</p>\n </div>\n <div class=\"account-metadata-box\">\n <div class=\"profile-metadata\">\n <div class=\"profile-field\">\n <b class=\"more-insignificant\">███</b>\n <p>██████</p>\n </div>\n <div class=\"profile-field\">\n <b class=\"more-insignificant\">████</b>\n <p>███████████</p>\n </div>\n </div>\n <div class=\"stats\">\n <div>\n <span>██</span> <Trans>Followers</Trans>\n </div>\n <div>\n <span>██</span>{' '}\n <Trans id=\"following.stats\">Following</Trans>\n </div>\n <div>\n <span>██</span> <Trans>Posts</Trans>\n </div>\n </div>\n </div>\n <div class=\"actions\">\n <span />\n <span class=\"buttons\">\n <button type=\"button\" class=\"plain\" disabled>\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n </span>\n </div>\n </main>\n </>\n ) : (\n info && (\n <>\n {!!moved && (\n <div class=\"account-moved\">\n <p>\n <Trans>\n <b>{displayName}</b> has indicated that their new account\n is now:\n </Trans>\n </p>\n <AccountBlock\n account={moved}\n instance={instance}\n onClick={(e) => {\n e.stopPropagation();\n states.showAccount = moved;\n }}\n />\n </div>\n )}\n {!!header && !/missing\\.png$/.test(header) && (\n <img\n src={header}\n alt=\"\"\n class={`header-banner ${\n headerIsAvatar ? 'header-is-avatar' : ''\n }`}\n onError={(e) => {\n if (e.target.crossOrigin) {\n if (e.target.src !== headerStatic) {\n e.target.src = headerStatic;\n } else {\n e.target.removeAttribute('crossorigin');\n e.target.src = header;\n }\n } else if (e.target.src !== headerStatic) {\n e.target.src = headerStatic;\n } else {\n e.target.remove();\n }\n }}\n crossOrigin=\"anonymous\"\n onLoad={(e) => {\n e.target.classList.add('loaded');\n try {\n // Get color from four corners of image\n const canvas = window.OffscreenCanvas\n ? new OffscreenCanvas(1, 1)\n : document.createElement('canvas');\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true,\n });\n canvas.width = e.target.width;\n canvas.height = e.target.height;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(e.target, 0, 0);\n // const colors = [\n // ctx.getImageData(0, 0, 1, 1).data,\n // ctx.getImageData(e.target.width - 1, 0, 1, 1).data,\n // ctx.getImageData(0, e.target.height - 1, 1, 1).data,\n // ctx.getImageData(\n // e.target.width - 1,\n // e.target.height - 1,\n // 1,\n // 1,\n // ).data,\n // ];\n // Get 10x10 pixels from corners, get average color from each\n const pixelDimension = 10;\n const colors = [\n ctx.getImageData(0, 0, pixelDimension, pixelDimension)\n .data,\n ctx.getImageData(\n e.target.width - pixelDimension,\n 0,\n pixelDimension,\n pixelDimension,\n ).data,\n ctx.getImageData(\n 0,\n e.target.height - pixelDimension,\n pixelDimension,\n pixelDimension,\n ).data,\n ctx.getImageData(\n e.target.width - pixelDimension,\n e.target.height - pixelDimension,\n pixelDimension,\n pixelDimension,\n ).data,\n ].map((data) => {\n let r = 0;\n let g = 0;\n let b = 0;\n let a = 0;\n for (let i = 0; i < data.length; i += 4) {\n r += data[i];\n g += data[i + 1];\n b += data[i + 2];\n a += data[i + 3];\n }\n const dataLength = data.length / 4;\n return [\n r / dataLength,\n g / dataLength,\n b / dataLength,\n a / dataLength,\n ];\n });\n const rgbColors = colors.map((color) => {\n const [r, g, b, a] = lightenRGB(color);\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n });\n setHeaderCornerColors(rgbColors);\n console.log({ colors, rgbColors });\n } catch (e) {\n // Silently fail\n }\n }}\n />\n )}\n <header>\n {standalone ? (\n <Menu2\n shift={\n window.matchMedia('(min-width: calc(40em))').matches\n ? 114\n : 64\n }\n menuButton={\n <div>\n <AccountBlock\n account={info}\n instance={instance}\n avatarSize=\"xxxl\"\n onClick={() => {}}\n />\n </div>\n }\n >\n <div class=\"szh-menu__header\">\n <AccountHandleInfo acct={acct} instance={instance} />\n </div>\n <MenuItem\n onClick={() => {\n const handleWithInstance = acct.includes('@')\n ? `@${acct}`\n : `@${acct}@${instance}`;\n try {\n navigator.clipboard.writeText(handleWithInstance);\n showToast(t`Handle copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy handle`);\n }\n }}\n >\n <Icon icon=\"link\" />\n <span>\n <Trans>Copy handle</Trans>\n </span>\n </MenuItem>\n <MenuItem href={url} target=\"_blank\">\n <Icon icon=\"external\" />\n <span>\n <Trans>Go to original profile page</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: avatarStatic,\n },\n ],\n };\n }}\n >\n <Icon icon=\"user\" />\n <span>\n <Trans>View profile image</Trans>\n </span>\n </MenuItem>\n {!!headerStatic && !headerIsAvatar && (\n <MenuItem\n onClick={() => {\n states.showMediaModal = {\n mediaAttachments: [\n {\n type: 'image',\n url: headerStatic,\n },\n ],\n };\n }}\n >\n <Icon icon=\"media\" />\n <span>\n <Trans>View profile header</Trans>\n </span>\n </MenuItem>\n )}\n {currentAuthenticated &&\n isSelf &&\n supports('@mastodon/profile-edit') && (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n setShowEditProfile(true);\n }}\n >\n <Icon icon=\"pencil\" />\n <span>\n <Trans>Edit profile</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </Menu2>\n ) : (\n <AccountBlock\n account={info}\n instance={instance}\n avatarSize=\"xxxl\"\n internal\n />\n )}\n </header>\n <div class=\"faux-header-bg\" aria-hidden=\"true\" />\n <main>\n {!!memorial && (\n <span class=\"tag\">\n <Trans>In Memoriam</Trans>\n </span>\n )}\n {!!bot && (\n <span class=\"tag\">\n <Icon icon=\"bot\" /> <Trans>Automated</Trans>\n </span>\n )}\n {!!group && (\n <span class=\"tag\">\n <Icon icon=\"group\" /> <Trans>Group</Trans>\n </span>\n )}\n {/* {roles?.map((role) => (\n <span class=\"tag\">\n {role.name}\n {!!accountInstance && (\n <>\n {' '}\n <span class=\"more-insignificant\">\n {accountInstance}\n </span>\n </>\n )}\n </span>\n ))} */}\n <div\n class=\"note\"\n dir=\"auto\"\n onClick={handleContentLinks({\n instance: currentInstance,\n })}\n dangerouslySetInnerHTML={{\n __html: enhanceContent(note, { emojis }),\n }}\n />\n <div class=\"account-metadata-box\">\n {fields?.length > 0 && (\n <div class=\"profile-metadata\">\n {fields.map(({ name, value, verifiedAt }, i) => (\n <div\n class={`profile-field ${\n verifiedAt ? 'profile-verified' : ''\n }`}\n key={name + i}\n dir=\"auto\"\n >\n <b>\n <EmojiText text={name} emojis={emojis} />{' '}\n {!!verifiedAt && (\n <Icon\n icon=\"check-circle\"\n size=\"s\"\n alt={t`Verified`}\n />\n )}\n </b>\n <p\n dangerouslySetInnerHTML={{\n __html: enhanceContent(value, { emojis }),\n }}\n />\n </div>\n ))}\n </div>\n )}\n <div class=\"stats\">\n <LinkOrDiv\n tabIndex={0}\n to={accountLink}\n onClick={() => {\n // states.showAccount = false;\n setTimeout(() => {\n states.showGenericAccounts = {\n id: 'followers',\n heading: t`Followers`,\n fetchAccounts: fetchFollowers,\n instance,\n excludeRelationshipAttrs: isSelf\n ? ['followedBy']\n : [],\n blankCopy: hideCollections\n ? t`This user has chosen to not make this information available.`\n : undefined,\n };\n }, 0);\n }}\n >\n {!!familiarFollowers.length && (\n <span class=\"shazam-container-horizontal\">\n <span class=\"shazam-container-inner stats-avatars-bunch\">\n {familiarFollowers.map((follower) => (\n <Avatar\n url={follower.avatarStatic}\n size=\"s\"\n alt={`${follower.displayName} @${follower.acct}`}\n squircle={follower?.bot}\n />\n ))}\n </span>\n </span>\n )}\n <Plural\n value={followersCount}\n one={\n <Trans>\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n Follower\n </Trans>\n }\n other={\n <Trans>\n <span title={followersCount}>\n {shortenNumber(followersCount)}\n </span>{' '}\n Followers\n </Trans>\n }\n />\n </LinkOrDiv>\n <LinkOrDiv\n class=\"insignificant\"\n tabIndex={0}\n to={accountLink}\n onClick={() => {\n // states.showAccount = false;\n setTimeout(() => {\n states.showGenericAccounts = {\n heading: t({\n id: 'following.stats',\n message: 'Following',\n }),\n fetchAccounts: fetchFollowing,\n instance,\n excludeRelationshipAttrs: isSelf\n ? ['following']\n : [],\n blankCopy: hideCollections\n ? t`This user has chosen to not make this information available.`\n : undefined,\n };\n }, 0);\n }}\n >\n <Plural\n value={followingCount}\n other={\n <Trans>\n <span title={followingCount}>\n {shortenNumber(followingCount)}\n </span>{' '}\n Following\n </Trans>\n }\n />\n <br />\n </LinkOrDiv>\n <LinkOrDiv\n class=\"insignificant\"\n to={accountLink}\n // onClick={\n // standalone\n // ? undefined\n // : () => {\n // hideAllModals();\n // }\n // }\n >\n <Plural\n value={statusesCount}\n one={\n <Trans>\n <span title={statusesCount}>\n {shortenNumber(statusesCount)}\n </span>{' '}\n Post\n </Trans>\n }\n other={\n <Trans>\n <span title={statusesCount}>\n {shortenNumber(statusesCount)}\n </span>{' '}\n Posts\n </Trans>\n }\n />\n </LinkOrDiv>\n {!!createdAt && (\n <div class=\"insignificant\">\n <Trans>\n Joined{' '}\n <time datetime={createdAt}>\n {niceDateTime(createdAt, {\n hideTime: true,\n })}\n </time>\n </Trans>\n </div>\n )}\n </div>\n </div>\n {!!postingStats && (\n <LinkOrDiv\n to={accountLink}\n class=\"account-metadata-box\"\n // onClick={() => {\n // states.showAccount = false;\n // }}\n onClick={\n import.meta.env.DEV && standalone\n ? () => {\n // Debug: undo back\n setPostingStats(null);\n }\n : undefined\n }\n >\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n {hasPostingStats ? (\n <div\n class=\"posting-stats\"\n title={\n supportsNativeQuote()\n ? t`${(\n postingStats.originals / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} original posts, ${(\n postingStats.replies / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} replies, ${(\n postingStats.quotes / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} quotes, ${(\n postingStats.boosts / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} boosts`\n : t`${(\n postingStats.originals / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} original posts, ${(\n postingStats.replies / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} replies, ${(\n postingStats.boosts / postingStats.total\n ).toLocaleString(i18n.locale || undefined, {\n style: 'percent',\n })} boosts`\n }\n >\n <div>\n {postingStats.daysSinceLastPost < 365\n ? plural(postingStats.total, {\n one: plural(\n postingStats.daysSinceLastPost,\n {\n one: `Last 1 post in the past 1 day`,\n other: `Last 1 post in the past ${postingStats.daysSinceLastPost} days`,\n },\n ),\n other: plural(\n postingStats.daysSinceLastPost,\n {\n one: `Last ${postingStats.total} posts in the past 1 day`,\n other: `Last ${postingStats.total} posts in the past ${postingStats.daysSinceLastPost} days`,\n },\n ),\n })\n : plural(postingStats.total, {\n one: 'Last 1 post in the past year(s)',\n other: `Last ${postingStats.total} posts in the past year(s)`,\n })}\n </div>\n <div class=\"posting-stats-bar\">\n {postingStats.originals > 0 && (\n <div\n class=\"posting-stats-bar-section posting-stats-bar-originals\"\n style={{\n '--percentage': `${\n (postingStats.originals /\n postingStats.total) *\n 100\n }%`,\n }}\n />\n )}\n {postingStats.replies > 0 && (\n <div\n class=\"posting-stats-bar-section posting-stats-bar-replies\"\n style={{\n '--percentage': `${\n (postingStats.replies /\n postingStats.total) *\n 100\n }%`,\n }}\n />\n )}\n {postingStats.quotes > 0 && (\n <div\n class=\"posting-stats-bar-section posting-stats-bar-quotes\"\n style={{\n '--percentage': `${\n (postingStats.quotes /\n postingStats.total) *\n 100\n }%`,\n }}\n />\n )}\n {postingStats.boosts > 0 && (\n <div\n class=\"posting-stats-bar-section posting-stats-bar-boosts\"\n style={{\n '--percentage': `${\n (postingStats.boosts /\n postingStats.total) *\n 100\n }%`,\n }}\n />\n )}\n </div>\n <div class=\"posting-stats-legends\">\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-bar-originals\" />{' '}\n <Trans>Original</Trans>\n </span>{' '}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-bar-replies\" />{' '}\n <Trans>Replies</Trans>\n </span>{' '}\n {supportsNativeQuote() && (\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-bar-quotes\" />{' '}\n <Trans>Quotes</Trans>\n </span>\n )}\n <span class=\"ib\">\n <span class=\"posting-stats-legend-item posting-stats-bar-boosts\" />{' '}\n <Trans>Boosts</Trans>\n </span>\n </div>\n </div>\n ) : (\n <div class=\"posting-stats\">\n <Trans>Post stats unavailable.</Trans>\n </div>\n )}\n </div>\n </div>\n </LinkOrDiv>\n )}\n {!moved && (\n <div class=\"account-metadata-box\">\n <div\n class=\"shazam-container no-animation\"\n hidden={!!postingStats}\n >\n <div class=\"shazam-container-inner\">\n <button\n type=\"button\"\n class=\"posting-stats-button\"\n disabled={postingStatsUIState === 'loading'}\n onClick={() => {\n renderPostingStats();\n }}\n >\n <div\n class={`posting-stats-icon ${\n postingStatsUIState === 'loading' ? 'loading' : ''\n }`}\n />\n <Trans>View post stats</Trans>{' '}\n {/* <Loader\n abrupt\n hidden={postingStatsUIState !== 'loading'}\n /> */}\n </button>\n </div>\n </div>\n </div>\n )}\n </main>\n <footer>\n <RelatedActions\n info={info}\n instance={instance}\n standalone={standalone}\n authenticated={authenticated}\n onRelationshipChange={onRelationshipChange}\n onProfileUpdate={onProfileUpdate}\n setShowEditProfile={setShowEditProfile}\n showEndorsements={showEndorsements}\n renderEndorsements={renderEndorsements}\n setRenderEndorsements={setRenderEndorsements}\n />\n </footer>\n <Endorsements\n accountID={id}\n info={info}\n open={renderEndorsements}\n onlyOpenIfHasEndorsements={\n renderEndorsements === 'onlyOpenIfHasEndorsements'\n }\n />\n </>\n )\n )}\n </div>\n {!!showEditProfile && (\n <Modal\n onClose={() => {\n setShowEditProfile(false);\n }}\n >\n <EditProfileSheet\n onClose={({ state, account } = {}) => {\n setShowEditProfile(false);\n if (state === 'success' && account) {\n onProfileUpdate(account);\n }\n }}\n />\n </Modal>\n )}\n </>\n );\n}\n\nconst FAMILIAR_FOLLOWERS_LIMIT = 3;\n\nfunction lightenRGB([r, g, b]) {\n const luminence = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n console.log('luminence', luminence);\n let alpha;\n if (luminence >= 220) {\n alpha = 1;\n } else if (luminence <= 50) {\n alpha = 0.1;\n } else {\n alpha = luminence / 255;\n }\n alpha = Math.min(1, alpha);\n return [r, g, b, alpha];\n}\n\nexport default AccountInfo;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountInfo from './account-info';\nimport Icon from './icon';\n\nfunction AccountSheet({ account, instance: propInstance, onClose }) {\n const { t } = useLingui();\n const { masto, instance, authenticated } = api({ instance: propInstance });\n const isString = typeof account === 'string';\n\n useEffect(() => {\n if (!isString) {\n states.accounts[`${account.id}@${instance}`] = account;\n }\n }, [account]);\n\n useLocationChange(onClose);\n\n return (\n <div\n class=\"sheet\"\n // onClick={(e) => {\n // const accountBlock = e.target.closest('.account-block');\n // if (accountBlock) {\n // onClose({\n // destination: 'account-statuses',\n // });\n // }\n // }}\n >\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <AccountInfo\n instance={instance}\n authenticated={authenticated}\n account={account}\n fetchAccount={async () => {\n if (isString) {\n try {\n const info = await masto.v1.accounts.lookup({\n acct: account,\n skip_webfinger: false,\n });\n return info;\n } catch (e) {\n const result = await masto.v2.search.list({\n q: account,\n type: 'accounts',\n limit: authenticated ? 1 : 11, // Magic number\n resolve: authenticated,\n });\n if (result.accounts.length) {\n const accountWithSameString = result.accounts.find(\n (a) => a.url === account || account.startsWith(a.url),\n );\n if (accountWithSameString) {\n return accountWithSameString;\n }\n }\n if (/^https?:\\/\\/[^/]+\\/@[^/]+$/.test(account)) {\n const accountURL = URL.parse(account);\n if (accountURL) {\n const { hostname, pathname } = accountURL;\n const acct =\n pathname.replace(/^\\//, '').replace(/\\/$/, '') +\n '@' +\n hostname;\n const result = await masto.v2.search.list({\n q: acct,\n type: 'accounts',\n limit: 1,\n resolve: authenticated,\n });\n if (result.accounts.length) {\n return result.accounts[0];\n }\n }\n }\n }\n } else {\n return account;\n }\n }}\n />\n </div>\n );\n}\n\nexport default AccountSheet;\n","import './drafts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useMemo, useReducer, useState } from 'react';\n\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport niceDateTime from '../utils/nice-date-time';\nimport states from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Icon from './icon';\nimport Loader from './loader';\nimport MenuConfirm from './menu-confirm';\n\nfunction Drafts({ onClose }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [drafts, setDrafts] = useState([]);\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const keys = await db.drafts.keys();\n if (keys.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = keys.filter((key) => key.startsWith(ns));\n if (ownKeys.length) {\n const drafts = await db.drafts.getMany(ownKeys);\n drafts.sort(\n (a, b) => Date.parse(b.updatedAt) - Date.parse(a.updatedAt),\n );\n setDrafts(drafts);\n } else {\n setDrafts([]);\n }\n } else {\n setDrafts([]);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const hasDrafts = drafts?.length > 0;\n\n return (\n <div class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Unsent drafts</Trans>{' '}\n <Loader abrupt hidden={uiState !== 'loading'} />\n </h2>\n {hasDrafts && (\n <div class=\"insignificant\">\n <Trans>\n Looks like you have unsent drafts. Let's continue where you left\n off.\n </Trans>\n </div>\n )}\n </header>\n <main>\n {hasDrafts ? (\n <>\n <ul class=\"drafts-list\">\n {drafts.map((draft) => {\n const { updatedAt, key, draftStatus, replyTo, quote } = draft;\n const updatedAtDate = new Date(updatedAt);\n return (\n <li key={updatedAt}>\n <div class=\"mini-draft-meta\">\n <b>\n <Icon icon={replyTo ? 'reply' : 'quill'} size=\"s\" />{' '}\n <time>\n {!!replyTo && (\n <>\n <span class=\"bidi-isolate\">\n @{replyTo.account.acct}\n </span>\n <br />\n </>\n )}\n {niceDateTime(updatedAtDate)}\n </time>\n </b>\n <MenuConfirm\n confirmLabel={\n <span>\n <Trans>Delete this draft?</Trans>\n </span>\n }\n menuItemClassName=\"danger\"\n align=\"end\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n try {\n // const yes = confirm('Delete this draft?');\n // if (yes) {\n await db.drafts.del(key);\n reload();\n // }\n } catch (e) {\n alert(t`Error deleting draft! Please try again.`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"small light\"\n disabled={uiState === 'loading'}\n >\n <Trans>Delete…</Trans>\n </button>\n </MenuConfirm>\n </div>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n class=\"draft-item\"\n onClick={async () => {\n // console.log({ draftStatus });\n let replyToStatus;\n let quoteStatus;\n if (replyTo?.id || quote?.id) {\n setUIState('loading');\n if (replyTo) {\n try {\n replyToStatus = await masto.v1.statuses\n .$select(replyTo.id)\n .fetch();\n } catch (e) {\n console.error(e);\n alert(t`Error fetching reply-to status!`);\n setUIState('default');\n return;\n }\n }\n if (quote) {\n try {\n quoteStatus = await masto.v1.statuses\n .$select(quote.id)\n .fetch();\n } catch (e) {\n console.error(e);\n alert(t`Error fetching quoted status!`);\n setUIState('default');\n // Don't return. Fail and still allow draft without quote\n // return;\n }\n }\n setUIState('default');\n }\n window.__COMPOSE__ = {\n draftStatus,\n replyToStatus,\n quoteStatus,\n };\n states.showCompose = true;\n states.showDrafts = false;\n }}\n >\n <MiniDraft draft={draft} />\n </button>\n </li>\n );\n })}\n </ul>\n {drafts.length > 1 && (\n <p>\n <MenuConfirm\n confirmLabel={\n <span>\n <Trans>Delete all drafts?</Trans>\n </span>\n }\n menuItemClassName=\"danger\"\n disabled={uiState === 'loading'}\n onClick={() => {\n (async () => {\n // const yes = confirm('Delete all drafts?');\n // if (yes) {\n setUIState('loading');\n try {\n await db.drafts.delMany(\n drafts.map((draft) => draft.key),\n );\n setUIState('default');\n reload();\n } catch (e) {\n console.error(e);\n alert(t`Error deleting drafts! Please try again.`);\n setUIState('error');\n }\n // }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading'}\n >\n <Trans>Delete all…</Trans>\n </button>\n </MenuConfirm>\n </p>\n )}\n </>\n ) : (\n <p>\n <Trans>No drafts found.</Trans>\n </p>\n )}\n </main>\n </div>\n );\n}\n\nfunction MiniDraft({ draft }) {\n const { t } = useLingui();\n const { draftStatus, replyTo, quote } = draft;\n const { status, spoilerText, poll, mediaAttachments } = draftStatus;\n const hasPoll = poll?.options?.length > 0;\n const hasMedia = mediaAttachments?.length > 0;\n const hasQuote = !!quote?.id;\n const hasPollOrMedia = hasPoll || hasMedia || hasQuote;\n const firstImageMedia = useMemo(() => {\n if (!hasMedia) return;\n const image = mediaAttachments.find((media) => /image/.test(media.type));\n if (!image) return;\n const { file } = image;\n const objectURL = URL.createObjectURL(file);\n return objectURL;\n }, [hasMedia, mediaAttachments]);\n return (\n <>\n <div class=\"mini-draft\">\n {hasPollOrMedia && (\n <div\n class={`mini-draft-aside ${firstImageMedia ? 'has-image' : ''}`}\n style={\n firstImageMedia\n ? {\n '--bg-image': `url(${firstImageMedia})`,\n }\n : {}\n }\n >\n {hasPoll && <Icon icon=\"poll\" alt={t`Poll`} />}\n {hasMedia && (\n <span>\n <Icon icon=\"attachment\" alt={t`Media`} />{' '}\n <small>{mediaAttachments?.length}</small>\n </span>\n )}\n {hasQuote && <Icon icon=\"quote\" alt={t`Quote`} />}\n </div>\n )}\n <div class=\"mini-draft-main\">\n {!!spoilerText && <div class=\"mini-draft-spoiler\">{spoilerText}</div>}\n {!!status && <div class=\"mini-draft-status\">{status}</div>}\n </div>\n </div>\n </>\n );\n}\n\nexport default Drafts;\n","import './embed-modal.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\n\nimport Icon from './icon';\n\nfunction EmbedModal({ html, url, width, height, onClose = () => {} }) {\n const { t } = useLingui();\n return (\n <div class=\"embed-modal-container\">\n <div class=\"top-controls\">\n <button type=\"button\" class=\"light\" onClick={() => onClose()}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n {url && (\n <a href={url} target=\"_blank\" rel=\"noopener\" class=\"button plain\">\n <span>\n <Trans>Open in new window</Trans>\n </span>{' '}\n <Icon icon=\"external\" />\n </a>\n )}\n </div>\n <div\n class=\"embed-content\"\n dangerouslySetInnerHTML={{ __html: html }}\n style={{\n '--width': width + 'px',\n '--height': height + 'px',\n '--aspect-ratio': `${width}/${height}`,\n }}\n />\n </div>\n );\n}\n\nexport default EmbedModal;\n","import './generic-accounts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport states from '../utils/states';\nimport useLocationChange from '../utils/useLocationChange';\n\nimport AccountBlock from './account-block';\nimport Icon from './icon';\nimport Link from './link';\nimport Loader from './loader';\nimport Status from './status';\n\nexport default function GenericAccounts({\n instance,\n excludeRelationshipAttrs = [],\n postID,\n onClose = () => {},\n blankCopy,\n}) {\n const { t } = useLingui();\n const { masto, instance: currentInstance } = api();\n const isCurrentInstance = instance ? instance === currentInstance : true;\n const snapStates = useSnapshot(states);\n ``;\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n useLocationChange(onClose);\n\n if (!snapStates.showGenericAccounts) {\n return null;\n }\n\n const {\n id,\n heading,\n fetchAccounts,\n accounts: staticAccounts,\n showReactions,\n } = snapStates.showGenericAccounts;\n\n const [accounts, setAccounts] = useState(\n staticAccounts?.length ? staticAccounts : [],\n );\n\n const [relationshipsMap, setRelationshipsMap] = useState({});\n\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n if (!isCurrentInstance) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n const loadAccounts = (firstLoad) => {\n if (!fetchAccounts) return;\n if (firstLoad && !accounts?.length) setAccounts([]);\n setUIState('loading');\n (async () => {\n try {\n const { done, value } = await fetchAccounts(firstLoad);\n if (Array.isArray(value)) {\n if (firstLoad) {\n const accounts = [];\n for (let i = 0; i < value.length; i++) {\n const account = value[i];\n const theAccount = accounts.find(\n (a, j) => a.id === account.id && i !== j,\n );\n if (!theAccount) {\n accounts.push({\n _types: [],\n ...account,\n });\n } else {\n theAccount._types.push(...account._types);\n }\n }\n setAccounts(accounts);\n } else {\n // setAccounts((prev) => [...prev, ...value]);\n // Merge accounts by id and _types\n setAccounts((prev) => {\n const newAccounts = prev;\n for (const account of value) {\n const theAccount = newAccounts.find((a) => a.id === account.id);\n if (!theAccount) {\n newAccounts.push(account);\n } else {\n theAccount._types.push(...account._types);\n }\n }\n return newAccounts;\n });\n }\n setShowMore(!done);\n\n loadRelationships(value);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n const firstLoad = useRef(true);\n useEffect(() => {\n if (accounts?.length > 0) {\n // setAccounts(staticAccounts);\n if (fetchAccounts) {\n loadAccounts(true);\n firstLoad.current = false;\n } else {\n loadRelationships(accounts);\n }\n } else {\n loadAccounts(true);\n firstLoad.current = false;\n }\n }, [fetchAccounts]);\n\n useEffect(() => {\n if (firstLoad.current) return;\n // reloadGenericAccounts contains value like {id: 'mute', counter: 1}\n // We only need to reload if the id matches\n if (snapStates.reloadGenericAccounts?.id === id) {\n loadAccounts(true);\n }\n }, [snapStates.reloadGenericAccounts.counter]);\n\n const post = states.statuses[postID];\n\n return (\n <div id=\"generic-accounts-container\" class=\"sheet\" tabindex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <h2>{heading || t`Accounts`}</h2>\n </header>\n <main>\n {post && (\n <Link\n to={`/${instance || currentInstance}/s/${post.id}`}\n class=\"post-preview\"\n >\n <Status status={post} size=\"s\" readOnly />\n </Link>\n )}\n {accounts.length > 0 ? (\n <>\n <ul class=\"accounts-list\">\n {accounts.map((account) => {\n const relationship = relationshipsMap[account.id];\n const key = `${account.id}-${account._types?.length || ''}`;\n return (\n <li key={key}>\n {showReactions && account._types?.length > 0 && (\n <div class=\"reactions-block\">\n {account._types.map((type) => (\n <Icon\n icon={\n {\n reblog: 'rocket',\n favourite: 'heart',\n }[type]\n }\n class={`${type}-icon`}\n />\n ))}\n </div>\n )}\n <div class=\"account-relationships\">\n <AccountBlock\n account={account}\n showStats\n relationship={relationship}\n excludeRelationshipAttrs={excludeRelationshipAttrs}\n />\n </div>\n </li>\n );\n })}\n </ul>\n {uiState === 'default' ? (\n showMore ? (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadAccounts();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadAccounts()}\n >\n <Trans>Show more…</Trans>\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Error loading accounts</Trans>\n </p>\n ) : (\n <p class=\"ui-state insignificant\">\n {blankCopy || t`Nothing to show`}\n </p>\n )}\n </main>\n </div>\n );\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport getTranslateTargetLanguage from '../utils/get-translate-target-language';\nimport localeMatch from '../utils/locale-match';\nimport { speak, supportsTTS } from '../utils/speech';\nimport states from '../utils/states';\n\nimport Icon from './icon';\nimport Menu2 from './menu2';\nimport TranslationBlock from './translation-block';\n\nconst FORCE_TRANSLATE_LIMIT = 140;\n\nexport default function MediaAltModal({ alt, lang, onClose }) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const [forceTranslate, setForceTranslate] = useState(false);\n const targetLanguage = getTranslateTargetLanguage(true);\n const contentTranslationHideLanguages =\n snapStates.settings.contentTranslationHideLanguages || [];\n const differentLanguage =\n !!lang &&\n lang !== targetLanguage &&\n !localeMatch([lang], [targetLanguage]) &&\n !contentTranslationHideLanguages.find(\n (l) => lang === l || localeMatch([lang], [l]),\n );\n\n useEffect(() => {\n const isShortAlt = alt?.length > 0 && alt?.length <= FORCE_TRANSLATE_LIMIT;\n if (differentLanguage && isShortAlt) {\n setForceTranslate(true);\n }\n }, [differentLanguage, alt]);\n\n return (\n <div class=\"sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close outer\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>\n <Trans>Media description</Trans>\n </h2>\n <div class=\"header-side\">\n <Menu2\n align=\"end\"\n menuButton={\n <button type=\"button\" class=\"plain4\">\n <Icon icon=\"more\" alt={t`More`} size=\"xl\" />\n </button>\n }\n >\n <MenuItem\n disabled={forceTranslate}\n onClick={() => {\n setForceTranslate(true);\n }}\n >\n <Icon icon=\"translate\" />\n <span>\n <Trans>Translate</Trans>\n </span>\n </MenuItem>\n {supportsTTS && (\n <MenuItem\n onClick={() => {\n speak(alt, lang);\n }}\n >\n <Icon icon=\"speak\" />\n <span>\n <Trans>Speak</Trans>\n </span>\n </MenuItem>\n )}\n </Menu2>\n </div>\n </header>\n <main lang={lang} dir=\"auto\">\n <p\n style={{\n whiteSpace: 'pre-wrap',\n textWrap: 'pretty',\n }}\n >\n {alt}\n </p>\n {(differentLanguage || forceTranslate) && (\n <TranslationBlock\n forceTranslate={forceTranslate}\n sourceLanguage={lang}\n text={alt}\n />\n )}\n </main>\n </div>\n );\n}\n","const { min, max } = Math;\n\nexport default (x, low = 0, high = 1) => {\n return min(max(low, x), high);\n};\n","// ported from jQuery's $.type\nconst classToType = {};\nfor (let name of [\n 'Boolean',\n 'Number',\n 'String',\n 'Function',\n 'Array',\n 'Date',\n 'RegExp',\n 'Undefined',\n 'Null'\n]) {\n classToType[`[object ${name}]`] = name.toLowerCase();\n}\nexport default function (obj) {\n return classToType[Object.prototype.toString.call(obj)] || 'object';\n}\n","import type from './type.js';\n\nexport default (args, keyOrder = null) => {\n // if called with more than 3 arguments, we return the arguments\n if (args.length >= 3) return Array.prototype.slice.call(args);\n // with less than 3 args we check if first arg is object\n // and use the keyOrder string to extract and sort properties\n if (type(args[0]) == 'object' && keyOrder) {\n return keyOrder\n .split('')\n .filter((k) => args[0][k] !== undefined)\n .map((k) => args[0][k]);\n }\n // otherwise we just return the first argument\n // (which we suppose is an array of args)\n return args[0].slice(0);\n};\n","const { PI, min, max } = Math;\n\nconst rnd2 = (a) => Math.round(a * 100) / 100;\nconst rnd3 = (a) => Math.round(a * 100) / 100;\n\nexport { default as clip_rgb } from './clip_rgb.js';\nexport { default as limit } from './limit.js';\nexport { default as type } from './type.js';\nexport { default as unpack } from './unpack.js';\nexport { default as last } from './last.js';\n\nconst TWOPI = PI * 2;\nconst PITHIRD = PI / 3;\nconst DEG2RAD = PI / 180;\nconst RAD2DEG = 180 / PI;\n\n/**\n * Reverse the first three elements of an array\n *\n * @param {any[]} arr\n * @returns {any[]}\n */\nfunction reverse3(arr) {\n return [...arr.slice(0, 3).reverse(), ...arr.slice(3)];\n}\n\nexport { PI, TWOPI, PITHIRD, DEG2RAD, RAD2DEG, min, max, rnd2, rnd3, reverse3 };\n","// from https://www.w3.org/TR/css-color-4/multiply-matrices.js\nexport default function multiplyMatrices(A, B) {\n let m = A.length;\n\n if (!Array.isArray(A[0])) {\n // A is vector, convert to [[a, b, c, ...]]\n A = [A];\n }\n\n if (!Array.isArray(B[0])) {\n // B is vector, convert to [[a], [b], [c], ...]]\n B = B.map((x) => [x]);\n }\n\n let p = B[0].length;\n let B_cols = B[0].map((_, i) => B.map((x) => x[i])); // transpose B\n let product = A.map((row) =>\n B_cols.map((col) => {\n if (!Array.isArray(row)) {\n return col.reduce((a, c) => a + c * row, 0);\n }\n\n return row.reduce((a, c, i) => a + c * (col[i] || 0), 0);\n })\n );\n\n if (m === 1) {\n product = product[0]; // Avoid [[a, b, c, ...]]\n }\n\n if (p === 1) {\n return product.map((x) => x[0]); // Avoid [[a], [b], [c], ...]]\n }\n\n return product;\n}\n","const labConstants = {\n // Corresponds roughly to RGB brighter/darker\n Kn: 18,\n\n // D65 standard referent\n labWhitePoint: 'd65',\n Xn: 0.95047,\n Yn: 1,\n Zn: 1.08883,\n\n t0: 0.137931034, // 4 / 29\n t1: 0.206896552, // 6 / 29\n t2: 0.12841855, // 3 * t1 * t1\n t3: 0.008856452, // t1 * t1 * t1,\n\n kE: 216.0 / 24389.0,\n kKE: 8.0,\n kK: 24389.0 / 27.0,\n\n RefWhiteRGB: {\n // sRGB\n X: 0.95047,\n Y: 1,\n Z: 1.08883\n },\n\n MtxRGB2XYZ: {\n m00: 0.4124564390896922,\n m01: 0.21267285140562253,\n m02: 0.0193338955823293,\n m10: 0.357576077643909,\n m11: 0.715152155287818,\n m12: 0.11919202588130297,\n m20: 0.18043748326639894,\n m21: 0.07217499330655958,\n m22: 0.9503040785363679\n },\n\n MtxXYZ2RGB: {\n m00: 3.2404541621141045,\n m01: -0.9692660305051868,\n m02: 0.055643430959114726,\n m10: -1.5371385127977166,\n m11: 1.8760108454466942,\n m12: -0.2040259135167538,\n m20: -0.498531409556016,\n m21: 0.041556017530349834,\n m22: 1.0572251882231791\n },\n\n // used in rgb2xyz\n As: 0.9414285350000001,\n Bs: 1.040417467,\n Cs: 1.089532651,\n\n MtxAdaptMa: {\n m00: 0.8951,\n m01: -0.7502,\n m02: 0.0389,\n m10: 0.2664,\n m11: 1.7135,\n m12: -0.0685,\n m20: -0.1614,\n m21: 0.0367,\n m22: 1.0296\n },\n\n MtxAdaptMaI: {\n m00: 0.9869929054667123,\n m01: 0.43230526972339456,\n m02: -0.008528664575177328,\n m10: -0.14705425642099013,\n m11: 0.5183602715367776,\n m12: 0.04004282165408487,\n m20: 0.15996265166373125,\n m21: 0.0492912282128556,\n m22: 0.9684866957875502\n }\n};\n\nexport default labConstants;\n\n// taken from https://de.mathworks.com/help/images/ref/whitepoint.html\nconst ILLUMINANTS = new Map([\n // ASTM E308-01\n ['a', [1.0985, 0.35585]],\n // Wyszecki & Stiles, p. 769\n ['b', [1.0985, 0.35585]],\n // C ASTM E308-01\n ['c', [0.98074, 1.18232]],\n // D50 (ASTM E308-01)\n ['d50', [0.96422, 0.82521]],\n // D55 (ASTM E308-01)\n ['d55', [0.95682, 0.92149]],\n // D65 (ASTM E308-01)\n ['d65', [0.95047, 1.08883]],\n // E (ASTM E308-01)\n ['e', [1, 1, 1]],\n // F2 (ASTM E308-01)\n ['f2', [0.99186, 0.67393]],\n // F7 (ASTM E308-01)\n ['f7', [0.95041, 1.08747]],\n // F11 (ASTM E308-01)\n ['f11', [1.00962, 0.6435]],\n ['icc', [0.96422, 0.82521]]\n]);\n\nexport function setLabWhitePoint(name) {\n const ill = ILLUMINANTS.get(String(name).toLowerCase());\n if (!ill) {\n throw new Error('unknown Lab illuminant ' + name);\n }\n labConstants.labWhitePoint = name;\n labConstants.Xn = ill[0];\n labConstants.Zn = ill[1];\n}\n\nexport function getLabWhitePoint() {\n return labConstants.labWhitePoint;\n}\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\n/*\n * L* [0..100]\n * a [-100..100]\n * b [-100..100]\n */\nconst lab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b] = args;\n const [x, y, z] = lab2xyz(L, a, b);\n const [r, g, b_] = xyz2rgb(x, y, z);\n return [r, g, b_, args.length > 3 ? args[3] : 1];\n};\n\nconst lab2xyz = (L, a, b) => {\n const { kE, kK, kKE, Xn, Yn, Zn } = LAB_CONSTANTS;\n\n const fy = (L + 16.0) / 116.0;\n const fx = 0.002 * a + fy;\n const fz = fy - 0.005 * b;\n\n const fx3 = fx * fx * fx;\n const fz3 = fz * fz * fz;\n\n const xr = fx3 > kE ? fx3 : (116.0 * fx - 16.0) / kK;\n const yr = L > kKE ? Math.pow((L + 16.0) / 116.0, 3.0) : L / kK;\n const zr = fz3 > kE ? fz3 : (116.0 * fz - 16.0) / kK;\n\n const x = xr * Xn;\n const y = yr * Yn;\n const z = zr * Zn;\n\n return [x, y, z];\n};\n\nconst compand = (linear) => {\n /* sRGB */\n const sign = Math.sign(linear);\n linear = Math.abs(linear);\n return (\n (linear <= 0.0031308\n ? linear * 12.92\n : 1.055 * Math.pow(linear, 1.0 / 2.4) - 0.055) * sign\n );\n};\n\nconst xyz2rgb = (x, y, z) => {\n const { MtxAdaptMa, MtxAdaptMaI, MtxXYZ2RGB, RefWhiteRGB, Xn, Yn, Zn } =\n LAB_CONSTANTS;\n\n const As = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bs = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cs = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n const Ad =\n RefWhiteRGB.X * MtxAdaptMa.m00 +\n RefWhiteRGB.Y * MtxAdaptMa.m10 +\n RefWhiteRGB.Z * MtxAdaptMa.m20;\n const Bd =\n RefWhiteRGB.X * MtxAdaptMa.m01 +\n RefWhiteRGB.Y * MtxAdaptMa.m11 +\n RefWhiteRGB.Z * MtxAdaptMa.m21;\n const Cd =\n RefWhiteRGB.X * MtxAdaptMa.m02 +\n RefWhiteRGB.Y * MtxAdaptMa.m12 +\n RefWhiteRGB.Z * MtxAdaptMa.m22;\n\n const X1 =\n (x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20) *\n (Ad / As);\n const Y1 =\n (x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21) *\n (Bd / Bs);\n const Z1 =\n (x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22) *\n (Cd / Cs);\n\n const X2 =\n X1 * MtxAdaptMaI.m00 + Y1 * MtxAdaptMaI.m10 + Z1 * MtxAdaptMaI.m20;\n const Y2 =\n X1 * MtxAdaptMaI.m01 + Y1 * MtxAdaptMaI.m11 + Z1 * MtxAdaptMaI.m21;\n const Z2 =\n X1 * MtxAdaptMaI.m02 + Y1 * MtxAdaptMaI.m12 + Z1 * MtxAdaptMaI.m22;\n\n const r = compand(\n X2 * MtxXYZ2RGB.m00 + Y2 * MtxXYZ2RGB.m10 + Z2 * MtxXYZ2RGB.m20\n );\n const g = compand(\n X2 * MtxXYZ2RGB.m01 + Y2 * MtxXYZ2RGB.m11 + Z2 * MtxXYZ2RGB.m21\n );\n const b = compand(\n X2 * MtxXYZ2RGB.m02 + Y2 * MtxXYZ2RGB.m12 + Z2 * MtxXYZ2RGB.m22\n );\n\n return [r * 255, g * 255, b * 255];\n};\n\nexport default lab2rgb;\nexport { xyz2rgb };\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { xyz2rgb } from '../lab/lab2rgb.js';\n\nconst oklab2rgb = (...args) => {\n args = unpack(args, 'lab');\n const [L, a, b, ...rest] = args;\n const [X, Y, Z] = OKLab_to_XYZ([L, a, b]);\n const [r, g, b_] = xyz2rgb(X, Y, Z);\n return [r, g, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction OKLab_to_XYZ(OKLab) {\n // Given OKLab, convert to XYZ relative to D65\n var LMStoXYZ = [\n [1.2268798758459243, -0.5578149944602171, 0.2813910456659647],\n [-0.0405757452148008, 1.112286803280317, -0.0717110580655164],\n [-0.0763729366746601, -0.4214933324022432, 1.5869240198367816]\n ];\n var OKLabtoLMS = [\n [1.0, 0.3963377773761749, 0.2158037573099136],\n [1.0, -0.1055613458156586, -0.0638541728258133],\n [1.0, -0.0894841775298119, -1.2914855480194092]\n ];\n\n var LMSnl = multiplyMatrices(OKLabtoLMS, OKLab);\n return multiplyMatrices(\n LMStoXYZ,\n LMSnl.map((c) => c ** 3)\n );\n}\n\nexport default oklab2rgb;\n","import LAB_CONSTANTS from './lab-constants.js';\nimport { unpack } from '../../utils/index.js';\n\nconst rgb2lab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [x, y, z] = rgb2xyz(r, g, b);\n const [L, a, b_] = xyz2lab(x, y, z);\n return [L, a, b_, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nfunction xyz2lab(x, y, z) {\n const { Xn, Yn, Zn, kE, kK } = LAB_CONSTANTS;\n const xr = x / Xn;\n const yr = y / Yn;\n const zr = z / Zn;\n\n const fx = xr > kE ? Math.pow(xr, 1.0 / 3.0) : (kK * xr + 16.0) / 116.0;\n const fy = yr > kE ? Math.pow(yr, 1.0 / 3.0) : (kK * yr + 16.0) / 116.0;\n const fz = zr > kE ? Math.pow(zr, 1.0 / 3.0) : (kK * zr + 16.0) / 116.0;\n\n return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\nfunction gammaAdjustSRGB(companded) {\n const sign = Math.sign(companded);\n companded = Math.abs(companded);\n const linear =\n companded <= 0.04045\n ? companded / 12.92\n : Math.pow((companded + 0.055) / 1.055, 2.4);\n return linear * sign;\n}\n\nconst rgb2xyz = (r, g, b) => {\n // normalize and gamma adjust\n r = gammaAdjustSRGB(r / 255);\n g = gammaAdjustSRGB(g / 255);\n b = gammaAdjustSRGB(b / 255);\n\n const { MtxRGB2XYZ, MtxAdaptMa, MtxAdaptMaI, Xn, Yn, Zn, As, Bs, Cs } =\n LAB_CONSTANTS;\n\n let x = r * MtxRGB2XYZ.m00 + g * MtxRGB2XYZ.m10 + b * MtxRGB2XYZ.m20;\n let y = r * MtxRGB2XYZ.m01 + g * MtxRGB2XYZ.m11 + b * MtxRGB2XYZ.m21;\n let z = r * MtxRGB2XYZ.m02 + g * MtxRGB2XYZ.m12 + b * MtxRGB2XYZ.m22;\n\n const Ad = Xn * MtxAdaptMa.m00 + Yn * MtxAdaptMa.m10 + Zn * MtxAdaptMa.m20;\n const Bd = Xn * MtxAdaptMa.m01 + Yn * MtxAdaptMa.m11 + Zn * MtxAdaptMa.m21;\n const Cd = Xn * MtxAdaptMa.m02 + Yn * MtxAdaptMa.m12 + Zn * MtxAdaptMa.m22;\n\n let X = x * MtxAdaptMa.m00 + y * MtxAdaptMa.m10 + z * MtxAdaptMa.m20;\n let Y = x * MtxAdaptMa.m01 + y * MtxAdaptMa.m11 + z * MtxAdaptMa.m21;\n let Z = x * MtxAdaptMa.m02 + y * MtxAdaptMa.m12 + z * MtxAdaptMa.m22;\n\n X *= Ad / As;\n Y *= Bd / Bs;\n Z *= Cd / Cs;\n\n x = X * MtxAdaptMaI.m00 + Y * MtxAdaptMaI.m10 + Z * MtxAdaptMaI.m20;\n y = X * MtxAdaptMaI.m01 + Y * MtxAdaptMaI.m11 + Z * MtxAdaptMaI.m21;\n z = X * MtxAdaptMaI.m02 + Y * MtxAdaptMaI.m12 + Z * MtxAdaptMaI.m22;\n\n return [x, y, z];\n};\n\nexport default rgb2lab;\nexport { rgb2xyz };\n","import { unpack } from '../../utils/index.js';\nimport multiplyMatrices from '../../utils/multiply-matrices.js';\nimport { rgb2xyz } from '../lab/rgb2lab.js';\n\nconst rgb2oklab = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const xyz = rgb2xyz(r, g, b);\n const oklab = XYZ_to_OKLab(xyz);\n return [...oklab, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\n// from https://www.w3.org/TR/css-color-4/#color-conversion-code\nfunction XYZ_to_OKLab(XYZ) {\n // Given XYZ relative to D65, convert to OKLab\n const XYZtoLMS = [\n [0.819022437996703, 0.3619062600528904, -0.1288737815209879],\n [0.0329836539323885, 0.9292868615863434, 0.0361446663506424],\n [0.0481771893596242, 0.2642395317527308, 0.6335478284694309]\n ];\n const LMStoOKLab = [\n [0.210454268309314, 0.7936177747023054, -0.0040720430116193],\n [1.9779985324311684, -2.4285922420485799, 0.450593709617411],\n [0.0259040424655478, 0.7827717124575296, -0.8086757549230774]\n ];\n\n const LMS = multiplyMatrices(XYZtoLMS, XYZ);\n // JavaScript Math.cbrt returns a sign-matched cube root\n // beware if porting to other languages\n // especially if tempted to use a general power function\n return multiplyMatrices(\n LMStoOKLab,\n LMS.map((c) => Math.cbrt(c))\n );\n // L in range [0,1]. For use in CSS, multiply by 100 and add a percent\n}\n\nexport default rgb2oklab;\n","import { unpack, DEG2RAD } from '../../utils/index.js';\nconst { sin, cos } = Math;\n\nconst lch2lab = (...args) => {\n /*\n Convert from a qualitative parameter h and a quantitative parameter l to a 24-bit pixel.\n These formulas were invented by David Dalrymple to obtain maximum contrast without going\n out of gamut if the parameters are in the range 0-1.\n\n A saturation multiplier was added by Gregor Aisch\n */\n let [l, c, h] = unpack(args, 'lch');\n if (isNaN(h)) h = 0;\n h = h * DEG2RAD;\n return [l, cos(h) * c, sin(h) * c];\n};\n\nexport default lch2lab;\n","import { unpack } from '../../utils/index.js';\nimport lch2lab from '../lch/lch2lab.js';\nimport oklab2rgb from '../oklab/oklab2rgb.js';\n\nconst oklch2rgb = (...args) => {\n args = unpack(args, 'lch');\n const [l, c, h, ...rest] = args;\n const [L, a, b_] = lch2lab(l, c, h);\n const [r, g, b] = oklab2rgb(L, a, b_);\n return [r, g, b, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default oklch2rgb;\n","import { unpack, RAD2DEG } from '../../utils/index.js';\nconst { sqrt, atan2, round } = Math;\n\nconst lab2lch = (...args) => {\n const [l, a, b] = unpack(args, 'lab');\n const c = sqrt(a * a + b * b);\n let h = (atan2(b, a) * RAD2DEG + 360) % 360;\n if (round(c * 10000) === 0) h = Number.NaN;\n return [l, c, h];\n};\n\nexport default lab2lch;\n","import { unpack } from '../../utils/index.js';\nimport rgb2oklab from '../oklab/rgb2oklab.js';\nimport lab2lch from '../lch/lab2lch.js';\n\nconst rgb2oklch = (...args) => {\n const [r, g, b, ...rest] = unpack(args, 'rgb');\n const [l, a, b_] = rgb2oklab(r, g, b);\n const [L, c, h] = lab2lch(l, a, b_);\n return [L, c, h, ...(rest.length > 0 && rest[0] < 1 ? [rest[0]] : [])];\n};\n\nexport default rgb2oklch;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport { oklch2rgb, rgb2oklch } from '../utils/color-utils';\nimport isRTL from '../utils/is-rtl';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Media from './media';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\n\nconst { PHANPY_IMG_ALT_API_URL: IMG_ALT_API_URL } = import.meta.env;\n\nfunction MediaModal({\n mediaAttachments,\n statusID,\n instance,\n lang,\n index = 0,\n onClose = () => {},\n}) {\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const carouselRef = useRef(null);\n\n const [currentIndex, setCurrentIndex] = useState(index);\n const carouselFocusItem = useRef(null);\n useLayoutEffect(() => {\n carouselFocusItem.current?.scrollIntoView();\n\n // history.pushState({ mediaModal: true }, '');\n // const handlePopState = (e) => {\n // if (e.state?.mediaModal) {\n // onClose();\n // }\n // };\n // window.addEventListener('popstate', handlePopState);\n // return () => {\n // window.removeEventListener('popstate', handlePopState);\n // };\n }, []);\n const prevStatusID = useRef(statusID);\n useEffect(() => {\n const scrollLeft = index * carouselRef.current.clientWidth;\n const differentStatusID = prevStatusID.current !== statusID;\n if (differentStatusID) prevStatusID.current = statusID;\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left: scrollLeft * (isRTL() ? -1 : 1),\n behavior: differentStatusID ? 'auto' : 'smooth',\n });\n }, [index, statusID]);\n\n const [showControls, setShowControls] = useState(true);\n\n useEffect(() => {\n let handleSwipe = (e) => {\n onClose(e, currentIndex, mediaAttachments, carouselRef);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('swiped-down', handleSwipe);\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('swiped-down', handleSwipe);\n }\n };\n }, [currentIndex, mediaAttachments]);\n\n useHotkeys(\n 'esc',\n (e) => {\n onClose(e, currentIndex, mediaAttachments, carouselRef);\n },\n {\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal || e.metaKey || e.ctrlKey || e.altKey || e.shiftKey;\n },\n useKey: true,\n },\n [onClose, currentIndex, mediaAttachments],\n );\n\n useEffect(() => {\n let handleScroll = () => {\n const { clientWidth, scrollLeft } = carouselRef.current;\n const index = Math.round(Math.abs(scrollLeft) / clientWidth);\n setCurrentIndex(index);\n };\n if (carouselRef.current) {\n carouselRef.current.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n }\n return () => {\n if (carouselRef.current) {\n carouselRef.current.removeEventListener('scroll', handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n let timer = setTimeout(() => {\n carouselRef.current?.focus?.();\n }, 100);\n return () => clearTimeout(timer);\n }, []);\n\n const mediaOkColors = useMemo(() => {\n return mediaAttachments?.map((media) => {\n const { blurhash } = media;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n return rgb2oklch(averageColor);\n }\n return null;\n });\n }, [mediaAttachments]);\n const mediaAccentColors = useMemo(() => {\n return mediaOkColors?.map((okColor) => {\n if (okColor) {\n return {\n light: oklch2rgb([0.95, 0.01, okColor[2]]),\n dark: oklch2rgb([0.35, 0.01, okColor[2]]),\n default: oklch2rgb([0.6, okColor[1], okColor[2]]),\n };\n }\n return null;\n });\n });\n const mediaAccentGradients = useMemo(() => {\n const gap = 5;\n const range = 100 / mediaAccentColors.length;\n const colors = mediaAccentColors.map((color, i) => {\n const start = i * range + gap;\n const end = (i + 1) * range - gap;\n if (color?.light && color?.dark) {\n return {\n light: `\n rgb(${color.light?.join(',')}) ${start}%, \n rgb(${color.light?.join(',')}) ${end}%\n `,\n dark: `\n rgb(${color.dark?.join(',')}) ${start}%, \n rgb(${color.dark?.join(',')}) ${end}%\n `,\n };\n }\n\n return {\n light: `\n transparent ${start}%, \n transparent ${end}%\n `,\n dark: `\n transparent ${start}%, \n transparent ${end}%\n `,\n };\n });\n const lightGradient = colors.map((color) => color.light).join(', ');\n const darkGradient = colors.map((color) => color.dark).join(', ');\n return {\n light: lightGradient,\n dark: darkGradient,\n };\n }, [mediaAccentColors]);\n\n let toastRef = useRef(null);\n useEffect(() => {\n return () => {\n toastRef.current?.hideToast?.();\n };\n }, []);\n\n useLayoutEffect(() => {\n const currentColor = mediaAccentColors[currentIndex];\n let $meta;\n let metaColor;\n if (currentColor) {\n const theme = store.local.get('theme');\n if (theme) {\n const mediaColor = `rgb(${currentColor[theme].join(',')})`;\n console.log({ mediaColor });\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta) {\n metaColor = $meta.content;\n $meta.content = mediaColor;\n }\n } else {\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n const mediaColor = `rgb(${currentColor[colorScheme].join(',')})`;\n console.log({ mediaColor });\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta) {\n metaColor = $meta.content;\n $meta.content = mediaColor;\n }\n }\n }\n return () => {\n // Reset meta color\n if ($meta && metaColor) {\n $meta.content = metaColor;\n }\n };\n }, [currentIndex, mediaAccentColors]);\n\n return (\n <div\n class={`media-modal-container media-modal-count-${mediaAttachments?.length}`}\n >\n <div\n ref={carouselRef}\n tabIndex=\"0\"\n data-swipe-threshold=\"44\"\n class=\"carousel\"\n onClick={(e) => {\n if (\n e.target.classList.contains('carousel-item') ||\n e.target.classList.contains('media') ||\n e.target.classList.contains('media-zoom')\n ) {\n onClose(e, currentIndex, mediaAttachments, carouselRef);\n }\n }}\n style={\n mediaAttachments.length > 1\n ? {\n backgroundAttachment: 'local',\n '--accent-gradient-light': mediaAccentGradients?.light,\n '--accent-gradient-dark': mediaAccentGradients?.dark,\n // backgroundImage: `linear-gradient(\n // to ${isRTL() ? 'left' : 'right'}, ${mediaAccentGradient})`,\n }\n : {}\n }\n >\n {mediaAttachments?.map((media, i) => {\n const accentColor =\n mediaAttachments.length === 1 ? mediaAccentColors[i] : null;\n return (\n <div\n class=\"carousel-item\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.default.join(',')})`,\n '--accent-light-color': `rgb(${accentColor.light?.join(\n ',',\n )})`,\n '--accent-dark-color': `rgb(${accentColor.dark?.join(\n ',',\n )})`,\n '--accent-alpha-color': `rgba(${accentColor.default.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n tabindex=\"0\"\n key={media.id}\n ref={i === currentIndex ? carouselFocusItem : null}\n onClick={(e) => {\n // console.log(e);\n // if (e.target !== e.currentTarget) {\n // setShowControls(!showControls);\n // }\n if (!e.target.classList.contains('media')) {\n setShowControls(!showControls);\n }\n }}\n >\n {!!media.description && (\n <button\n type=\"button\"\n class=\"media-alt\"\n hidden={!showControls}\n onClick={() => {\n states.showMediaAlt = {\n alt: media.description,\n lang,\n };\n }}\n >\n <span class=\"alt-badge\">ALT</span>\n <span class=\"media-alt-desc\" lang={lang} dir=\"auto\">\n {media.description}\n </span>\n </button>\n )}\n <Media media={media} showOriginal lang={lang} />\n </div>\n );\n })}\n </div>\n <div class=\"carousel-top-controls\" hidden={!showControls}>\n <span>\n <button\n type=\"button\"\n class=\"carousel-button\"\n onClick={(e) =>\n onClose(e, currentIndex, mediaAttachments, carouselRef)\n }\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n </span>\n {mediaAttachments?.length > 1 ? (\n <span class=\"carousel-dots\">\n {mediaAttachments?.map((media, i) => (\n <button\n key={media.id}\n type=\"button\"\n disabled={i === currentIndex}\n class={`carousel-dot ${i === currentIndex ? 'active' : ''}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n const left =\n carouselRef.current.clientWidth * i * (isRTL() ? -1 : 1);\n carouselRef.current.focus();\n carouselRef.current.scrollTo({ left, behavior: 'smooth' });\n }}\n >\n <Icon icon=\"round\" size=\"s\" alt=\"⸱\" />\n </button>\n ))}\n </span>\n ) : (\n <span />\n )}\n <span>\n <Menu2\n overflow=\"auto\"\n align=\"end\"\n position=\"anchor\"\n gap={4}\n menuClassName=\"glass-menu\"\n menuButton={\n <button type=\"button\" class=\"carousel-button\">\n <Icon icon=\"more\" alt={t`More`} />\n </button>\n }\n >\n <MenuLink\n href={\n mediaAttachments[currentIndex]?.remoteUrl ||\n mediaAttachments[currentIndex]?.url\n }\n class=\"carousel-button\"\n target=\"_blank\"\n title={t`Open original media in new window`}\n >\n <Icon icon=\"popout\" />\n <span>\n <Trans>Open original media</Trans>\n </span>\n </MenuLink>\n {import.meta.env.DEV && // Only dev for now\n !!states.settings.mediaAltGenerator &&\n !!IMG_ALT_API_URL &&\n !!mediaAttachments[currentIndex]?.url &&\n !mediaAttachments[currentIndex]?.description &&\n mediaAttachments[currentIndex]?.type === 'image' && (\n <>\n <MenuDivider />\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n toastRef.current = showToast({\n text: t`Attempting to describe image. Please wait…`,\n duration: -1,\n });\n (async function () {\n try {\n const response = await fetch(\n `${IMG_ALT_API_URL}?image=${encodeURIComponent(\n mediaAttachments[currentIndex]?.url,\n )}`,\n ).then((r) => r.json());\n states.showMediaAlt = {\n alt: response.description,\n };\n } catch (e) {\n console.error(e);\n showToast(t`Failed to describe image`);\n } finally {\n setUIState('default');\n toastRef.current?.hideToast?.();\n }\n })();\n }}\n >\n <Icon icon=\"sparkles2\" />\n <span>\n <Trans>Describe image…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </Menu2>{' '}\n {!!statusID && (\n <Link\n to={`${instance ? `/${instance}` : ''}/s/${statusID}${\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? `?media=${currentIndex + 1}`\n : ''\n }`}\n class=\"button carousel-button media-post-link\"\n // onClick={() => {\n // // if small screen (not media query min-width 40em + 350px), run onClose\n // if (\n // !window.matchMedia('(min-width: calc(40em + 350px))').matches\n // ) {\n // onClose();\n // }\n // }}\n >\n <span class=\"button-label\">\n <Trans>View post</Trans>{' '}\n </span>\n »\n </Link>\n )}\n </span>\n </div>\n {mediaAttachments?.length > 1 && (\n <div class=\"carousel-controls\" hidden={!showControls}>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === 0}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex - 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-left\" alt={t`Previous`} />\n </button>\n <button\n type=\"button\"\n class=\"carousel-button\"\n hidden={currentIndex === mediaAttachments.length - 1}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n carouselRef.current.focus();\n carouselRef.current.scrollTo({\n left:\n carouselRef.current.clientWidth *\n (currentIndex + 1) *\n (isRTL() ? -1 : 1),\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-right\" alt={t`Next`} />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default MediaModal;\n","import './open-link-sheet.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\n\nimport showToast from '../utils/show-toast';\n\nimport Icon from './icon';\n\nexport default function OpenLinkSheet({ url, linkText, onClose }) {\n const { t } = useLingui();\n if (!url) return null;\n\n let displayUrl = url;\n try {\n const urlObj = URL.parse(url);\n const protocol = urlObj.protocol;\n const hostname = urlObj.hostname;\n const rest = url.slice(urlObj.origin.length);\n displayUrl = (\n <>\n {protocol}//<strong>{hostname}</strong>\n {rest}\n </>\n );\n } catch (e) {}\n\n const handleCopy = () => {\n try {\n navigator.clipboard.writeText(url);\n showToast(t`Link copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy link`);\n }\n };\n\n const handleShare = () => {\n if (navigator.share && navigator.canShare({ url })) {\n try {\n navigator.share({ url });\n } catch (e) {\n console.error(e);\n }\n }\n };\n\n return (\n <div class=\"sheet sheet-modal\" id=\"open-link-sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header class=\"header-grid\">\n <h2>\n <Trans>Open link?</Trans>\n </h2>\n </header>\n <main>\n {!!linkText && (\n <>\n <p class=\"link-text\">\n <Icon icon=\"cursor-hand\" size=\"xl\" /> {linkText}\n </p>\n <div class=\"arrow\">\n <Icon icon=\"arrow-down\" />\n </div>\n </>\n )}\n <p class=\"full-url\">{displayUrl}</p>\n </main>\n <footer>\n <button type=\"button\" class=\"light\" onClick={onClose}>\n <Trans>Cancel</Trans>\n </button>\n <span class=\"spacer\" />\n <button type=\"button\" class=\"plain6\" onClick={handleCopy}>\n <Icon icon=\"copy\" alt={t`Copy`} />\n </button>\n {navigator.canShare && navigator.canShare({ url }) && (\n <button type=\"button\" class=\"plain6\" onClick={handleShare}>\n <Icon icon=\"share\" alt={t`Share…`} />\n </button>\n )}\n <a\n class=\"button\"\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onClose}\n >\n <Trans>Open</Trans>\n </a>\n </footer>\n </div>\n );\n}\n","import './report-modal.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { useMemo, useRef, useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport localeMatch from '../utils/locale-match';\nimport showToast from '../utils/show-toast';\nimport { getCurrentInstance } from '../utils/store-utils';\n\nimport AccountBlock from './account-block';\nimport Icon from './icon';\nimport Loader from './loader';\nimport Status from './status';\n\n// NOTE: `dislike` hidden for now, it's actually not used for reporting\n// Mastodon shows another screen for unfollowing, muting or blocking instead of reporting\n\nconst CATEGORIES = [/*'dislike' ,*/ 'spam', 'legal', 'violation', 'other'];\n// `violation` will be set if there are `rule_ids[]`\n\nconst CATEGORIES_INFO = {\n // dislike: {\n // label: 'Dislike',\n // description: 'Not something you want to see',\n // },\n spam: {\n label: msg`Spam`,\n description: msg`Malicious links, fake engagement, or repetitive replies`,\n },\n legal: {\n label: msg`Illegal`,\n description: msg`Violates the law of your or the server's country`,\n },\n violation: {\n label: msg`Server rule violation`,\n description: msg`Breaks specific server rules`,\n stampLabel: msg`Violation`,\n },\n other: {\n label: msg`Other`,\n description: msg`Issue doesn't fit other categories`,\n excludeStamp: true,\n },\n};\n\nfunction findMatchingLanguage(rule, currentLang) {\n if (!rule.translations || !currentLang) return null;\n const availableLanguages = Object.keys(rule.translations);\n if (!availableLanguages?.length) return null;\n\n let matchedLang = localeMatch([currentLang], availableLanguages, null);\n if (!matchedLang) {\n // localeMatch fails if there are keys like zhCn, zhTw\n // Convert them something like zh-CN first, try again\n // Detect uppercase, then split by dash\n const normalizedLanguages = availableLanguages.map((lang) => {\n const parts = lang.split(/(?=[A-Z])/);\n return parts\n .map((part, i) => (i === 0 ? part : part.toLowerCase()))\n .join('-');\n });\n matchedLang = localeMatch([currentLang], normalizedLanguages, null);\n }\n\n // If matchedLang has dash, convert back to original format\n // E.g. zh-cn to zhCn\n if (matchedLang && matchedLang.includes('-')) {\n const [lang, region] = matchedLang.split('-');\n matchedLang = lang + region.charAt(0).toUpperCase() + region.slice(1);\n }\n\n return matchedLang;\n}\n\nfunction translateRules(rules, currentLang) {\n if (!rules?.length) return [];\n if (!currentLang) return rules;\n return rules.map((rule) => {\n const matchedLang = findMatchingLanguage(rule, currentLang);\n return {\n ...rule,\n _translatedText: rule.translations?.[matchedLang]?.text || null,\n };\n });\n}\n\nfunction ReportModal({ account, post, onClose }) {\n const { _, t, i18n } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [username, domain] = account.acct.split('@');\n\n const [translatedRules, currentDomain] = useMemo(() => {\n const { rules, domain } = getCurrentInstance();\n const rawRules = rules || [];\n return [translateRules(rawRules, i18n.locale), domain];\n }, [i18n.locale]);\n\n const [selectedCategory, setSelectedCategory] = useState(null);\n const [showRules, setShowRules] = useState(false);\n\n const rulesRef = useRef(null);\n const [hasRules, setHasRules] = useState(false);\n\n return (\n <div class=\"report-modal-container\">\n <div class=\"top-controls\">\n <h1>{post ? t`Report Post` : t`Report @${username}`}</h1>\n <button\n type=\"button\"\n class=\"plain4 small\"\n disabled={uiState === 'loading'}\n onClick={() => onClose()}\n >\n <Icon icon=\"x\" size=\"xl\" alt={t`Close`} />\n </button>\n </div>\n <main>\n <div class=\"report-preview\">\n {post ? (\n <Status status={post} size=\"s\" previewMode />\n ) : (\n <AccountBlock\n account={account}\n avatarSize=\"xxl\"\n useAvatarStatic\n showStats\n showActivity\n />\n )}\n </div>\n {!!selectedCategory &&\n !CATEGORIES_INFO[selectedCategory].excludeStamp && (\n <span\n class=\"rubber-stamp\"\n key={selectedCategory}\n aria-hidden=\"true\"\n >\n {_(\n CATEGORIES_INFO[selectedCategory].stampLabel ||\n _(CATEGORIES_INFO[selectedCategory].label),\n )}\n <small>\n <Trans>Pending review</Trans>\n </small>\n </span>\n )}\n <form\n onSubmit={(e) => {\n e.preventDefault();\n\n const formData = new FormData(e.target);\n const entries = Object.fromEntries(formData.entries());\n console.log('ENTRIES', entries);\n\n let { category, comment, forward } = entries;\n if (!comment) comment = undefined;\n if (forward === 'on') forward = true;\n const ruleIds =\n category === 'violation'\n ? Object.entries(entries)\n .filter(([key]) => key.startsWith('rule_ids'))\n .map(([key, value]) => value)\n : undefined;\n\n const params = {\n category,\n comment,\n forward,\n ruleIds,\n };\n console.log('PARAMS', params);\n\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.reports.create({\n accountId: account.id,\n statusIds: post?.id ? [post.id] : undefined,\n category,\n comment,\n ruleIds,\n forward,\n });\n setUIState('success');\n showToast(post ? t`Post reported` : t`Profile reported`);\n onClose();\n } catch (error) {\n console.error(error);\n setUIState('error');\n showToast(\n error?.message ||\n (post\n ? t`Unable to report post`\n : t`Unable to report profile`),\n );\n }\n })();\n }}\n >\n <p>\n {post\n ? t`What's the issue with this post?`\n : t`What's the issue with this profile?`}\n </p>\n <section class=\"report-categories\">\n {CATEGORIES.map((category) =>\n category === 'violation' && !translatedRules?.length ? null : (\n <Fragment key={category}>\n <label class=\"report-category\">\n <input\n type=\"radio\"\n name=\"category\"\n value={category}\n required\n disabled={uiState === 'loading'}\n onChange={(e) => {\n setSelectedCategory(e.target.value);\n setShowRules(e.target.value === 'violation');\n }}\n />\n <span>\n {_(CATEGORIES_INFO[category].label)} \n <small class=\"ib insignificant\">\n {_(CATEGORIES_INFO[category].description)}\n </small>\n </span>\n </label>\n {category === 'violation' && !!translatedRules?.length && (\n <div\n class=\"shazam-container no-animation\"\n hidden={!showRules}\n >\n <div class=\"shazam-container-inner\">\n <div class=\"report-rules\" ref={rulesRef}>\n {translatedRules.map((rule, i) => (\n <label class=\"report-rule\" key={rule.id}>\n <input\n type=\"checkbox\"\n name={`rule_ids[${i}]`}\n value={rule.id}\n required={showRules && !hasRules}\n disabled={uiState === 'loading'}\n onChange={(e) => {\n const { checked } = e.target;\n if (checked) {\n setHasRules(true);\n } else {\n const checkedInputs =\n rulesRef.current.querySelectorAll(\n 'input:checked',\n );\n if (!checkedInputs.length) {\n setHasRules(false);\n }\n }\n }}\n />\n <span>{rule._translatedText || rule.text}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n )}\n </Fragment>\n ),\n )}\n </section>\n <section class=\"report-comment\">\n <p>\n <label for=\"report-comment\">\n <Trans>Additional info</Trans>\n </label>\n </p>\n <textarea\n maxlength=\"1000\"\n rows=\"1\"\n name=\"comment\"\n id=\"report-comment\"\n disabled={uiState === 'loading'}\n required={!post} // Required if not reporting a post\n />\n </section>\n {!!domain && domain !== currentDomain && (\n <section>\n <p>\n <label>\n <input\n type=\"checkbox\"\n switch\n name=\"forward\"\n disabled={uiState === 'loading'}\n />{' '}\n <span>\n <Trans>\n Forward to <i>{domain}</i>\n </Trans>\n </span>\n </label>\n </p>\n </section>\n )}\n <footer>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n <Trans>Send Report</Trans>\n </button>{' '}\n <button\n type=\"submit\"\n class=\"plain2\"\n disabled={uiState === 'loading'}\n onClick={async () => {\n try {\n await masto.v1.accounts.$select(account.id).mute(); // Infinite duration\n showToast(t`Muted ${username}`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to mute ${username}`);\n }\n // onSubmit will still run\n }}\n >\n <Trans>\n Send Report <small class=\"ib\">+ Mute profile</small>\n </Trans>\n </button>{' '}\n <button\n type=\"submit\"\n class=\"plain2\"\n disabled={uiState === 'loading'}\n onClick={async () => {\n try {\n await masto.v1.accounts.$select(account.id).block();\n showToast(t`Blocked ${username}`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to block ${username}`);\n }\n // onSubmit will still run\n }}\n >\n <Trans>\n Send Report <small class=\"ib\">+ Block profile</small>\n </Trans>\n </button>\n <Loader hidden={uiState !== 'loading'} />\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nexport default ReportModal;\n","// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.5\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n if (!baseReverseDic[alphabet]) {\n baseReverseDic[alphabet] = {};\n for (var i=0 ; i<alphabet.length ; i++) {\n baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n }\n }\n return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n compressToBase64 : function (input) {\n if (input == null) return \"\";\n var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n switch (res.length % 4) { // To produce valid Base64\n default: // When could this happen ?\n case 0 : return res;\n case 1 : return res+\"===\";\n case 2 : return res+\"==\";\n case 3 : return res+\"=\";\n }\n },\n\n decompressFromBase64 : function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n },\n\n compressToUTF16 : function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n },\n\n decompressFromUTF16: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n },\n\n //compress into uint8array (UCS-2 big endian format)\n compressToUint8Array: function (uncompressed) {\n var compressed = LZString.compress(uncompressed);\n var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n var current_value = compressed.charCodeAt(i);\n buf[i*2] = current_value >>> 8;\n buf[i*2+1] = current_value % 256;\n }\n return buf;\n },\n\n //decompress from uint8array (UCS-2 big endian format)\n decompressFromUint8Array:function (compressed) {\n if (compressed===null || compressed===undefined){\n return LZString.decompress(compressed);\n } else {\n var buf=new Array(compressed.length/2); // 2 bytes per character\n for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n buf[i]=compressed[i*2]*256+compressed[i*2+1];\n }\n\n var result = [];\n buf.forEach(function (c) {\n result.push(f(c));\n });\n return LZString.decompress(result.join(''));\n\n }\n\n },\n\n\n //compress into a string that is already URI encoded\n compressToEncodedURIComponent: function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n },\n\n //decompress from an output of compressToEncodedURIComponent\n decompressFromEncodedURIComponent:function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n input = input.replace(/ /g, \"+\");\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n },\n\n compress: function (uncompressed) {\n return LZString._compress(uncompressed, 16, function(a){return f(a);});\n },\n _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n if (uncompressed == null) return \"\";\n var i, value,\n context_dictionary= {},\n context_dictionaryToCreate= {},\n context_c=\"\",\n context_wc=\"\",\n context_w=\"\",\n context_enlargeIn= 2, // Compensate for the first entry which should not count\n context_dictSize= 3,\n context_numBits= 2,\n context_data=[],\n context_data_val=0,\n context_data_position=0,\n ii;\n\n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii);\n if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n context_dictionary[context_c] = context_dictSize++;\n context_dictionaryToCreate[context_c] = true;\n }\n\n context_wc = context_w + context_c;\n if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n context_w = context_wc;\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position ==bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++;\n context_w = String(context_c);\n }\n }\n\n // Output the code for w.\n if (context_w !== \"\") {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n }\n\n // Mark the end of the stream\n value = 2;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n // Flush the last char\n while (true) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data.push(getCharFromInt(context_data_val));\n break;\n }\n else context_data_position++;\n }\n return context_data.join('');\n },\n\n decompress: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n },\n\n _decompress: function (length, resetValue, getNextValue) {\n var dictionary = [],\n next,\n enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = \"\",\n result = [],\n i,\n w,\n bits, resb, maxpower, power,\n c,\n data = {val:getNextValue(0), position:resetValue, index:1};\n\n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i;\n }\n\n bits = 0;\n maxpower = Math.pow(2,2);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (next = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 2:\n return \"\";\n }\n dictionary[3] = c;\n w = c;\n result.push(c);\n while (true) {\n if (data.index > length) {\n return \"\";\n }\n\n bits = 0;\n maxpower = Math.pow(2,numBits);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (c = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 2:\n return result.join('');\n }\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n if (dictionary[c]) {\n entry = dictionary[c];\n } else {\n if (c === dictSize) {\n entry = w + w.charAt(0);\n } else {\n return null;\n }\n }\n result.push(entry);\n\n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0);\n enlargeIn--;\n\n w = entry;\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n }\n }\n};\n return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n module.exports = LZString\n} else if( typeof angular !== 'undefined' && angular != null ) {\n angular.module('LZString', [])\n .factory('LZString', function () {\n return LZString;\n });\n}\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2084%2062'%3e%3crect%20width='64'%20height='48'%20x='18'%20y='2'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3crect%20width='32'%20height='48'%20x='2'%20y='12'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%234169E1'%20d='M14%2052a4%204%200%201%201-8%200%204%204%200%200%201%208%200Zm64-42a4%204%200%201%201-8%200%204%204%200%200%201%208%200Z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2082%2062'%3e%3crect%20width='78'%20height='58'%20x='2'%20y='2'%20fill='%23999'%20fill-opacity='.3'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3crect%20width='18'%20height='46'%20x='8'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3crect%20width='18'%20height='46'%20x='32'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3crect%20width='18'%20height='46'%20x='56'%20y='8'%20fill='%23fff'%20stroke='%23999'%20stroke-width='2'%20rx='1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20fill='none'%20viewBox='0%200%2084%2062'%3e%3crect%20width='64'%20height='48'%20x='18'%20y='2'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%23999'%20fill-opacity='.3'%20d='M19%203h62v10H19z'/%3e%3cpath%20stroke='%234169E1'%20stroke-width='2'%20d='M43%208a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3cpath%20stroke='%23999'%20stroke-width='2'%20d='M52%208a2%202%200%201%201-4%200%202%202%200%200%201%204%200Zm9%200a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3crect%20width='32'%20height='48'%20x='2'%20y='12'%20fill='%23fff'%20stroke='%23999'%20stroke-width='3'%20rx='4'/%3e%3cpath%20fill='%23999'%20fill-opacity='.3'%20d='M3%2049h30v10H3z'/%3e%3cpath%20stroke='%234169E1'%20stroke-width='2'%20d='M11%2054a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3cpath%20stroke='%23999'%20stroke-width='2'%20d='M20%2054a2%202%200%201%201-4%200%202%202%200%200%201%204%200Zm9%200a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z'/%3e%3c/svg%3e\"","import { api } from '../utils/api';\nimport store from '../utils/store';\n\nconst LIMIT = 200;\nconst MAX_FETCH = 10;\n\nexport async function fetchFollowedTags() {\n const { masto } = api();\n const iterator = masto.v1.followedTags\n .list({\n limit: LIMIT,\n })\n .values();\n const tags = [];\n let fetchCount = 0;\n do {\n const { value, done } = await iterator.next();\n if (done || value?.length === 0) break;\n tags.push(...value);\n fetchCount++;\n } while (fetchCount < MAX_FETCH);\n tags.sort((a, b) => a.name.localeCompare(b.name));\n console.log(tags);\n\n if (tags.length) {\n setTimeout(() => {\n // Save to local storage, with saved timestamp\n store.account.set('followedTags', {\n tags,\n updatedAt: Date.now(),\n });\n }, 1);\n }\n\n return tags;\n}\n\nconst MAX_AGE = 24 * 60 * 60 * 1000; // 1 day\nexport async function getFollowedTags() {\n try {\n const { tags, updatedAt } = store.account.get('followedTags') || {};\n if (!tags?.length) return await fetchFollowedTags();\n if (Date.now() - updatedAt > MAX_AGE) {\n // Stale-while-revalidate\n fetchFollowedTags();\n return tags;\n }\n return tags;\n } catch (e) {\n return [];\n }\n}\n\nconst fauxDiv = document.createElement('div');\nexport const extractTagsFromStatus = (content) => {\n if (!content) return [];\n if (content.indexOf('#') === -1) return [];\n fauxDiv.innerHTML = content;\n const hashtagLinks = fauxDiv.querySelectorAll('a.hashtag');\n if (!hashtagLinks.length) return [];\n return Array.from(hashtagLinks).map((a) =>\n a.innerText.trim().replace(/^[^#]*#+/, ''),\n );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\nfunction AsyncText({ children }) {\n if (typeof children === 'string') return children;\n const [text, setText] = useState('');\n useEffect(() => {\n Promise.resolve(children).then(setText);\n }, [children]);\n return text;\n}\n\nexport default AsyncText;\n","import './shortcuts-settings.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { msg, t } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport {\n compressToEncodedURIComponent,\n decompressFromEncodedURIComponent,\n} from 'lz-string';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport floatingButtonUrl from '../assets/floating-button.svg';\nimport multiColumnUrl from '../assets/multi-column.svg';\nimport tabMenuBarUrl from '../assets/tab-menu-bar.svg';\n\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport { getLists, getListTitle } from '../utils/lists';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport MenuConfirm from './menu-confirm';\nimport Modal from './modal';\n\nexport const SHORTCUTS_LIMIT = 9;\n\nconst TYPES = [\n 'following',\n 'mentions',\n 'notifications',\n 'list',\n 'public',\n 'trending',\n 'search',\n 'hashtag',\n 'bookmarks',\n 'favourites',\n // NOTE: Hide for now\n // 'account-statuses', // Need @acct search first\n];\nconst TYPE_TEXT = {\n following: msg`Home / Following`,\n notifications: msg`Notifications`,\n list: msg`Lists`,\n public: msg`Public (Local / Federated)`,\n search: msg`Search`,\n 'account-statuses': msg`Account`,\n bookmarks: msg`Bookmarks`,\n favourites: msg`Likes`,\n hashtag: msg`Hashtag`,\n trending: msg`Trending`,\n mentions: msg`Mentions`,\n};\nconst TYPE_PARAMS = {\n list: [\n {\n text: msg`List ID`,\n name: 'id',\n notRequired: true,\n },\n ],\n public: [\n {\n text: msg`Local only`,\n name: 'local',\n type: 'checkbox',\n },\n {\n text: msg`Instance`,\n name: 'instance',\n type: 'text',\n placeholder: msg`Optional, e.g. mastodon.social`,\n notRequired: true,\n },\n ],\n trending: [\n {\n text: msg`Instance`,\n name: 'instance',\n type: 'text',\n placeholder: msg`Optional, e.g. mastodon.social`,\n notRequired: true,\n },\n ],\n search: [\n {\n text: msg`Search term`,\n name: 'query',\n type: 'text',\n placeholder: msg`Optional, unless for multi-column mode`,\n notRequired: true,\n },\n ],\n 'account-statuses': [\n {\n text: '@',\n name: 'id',\n type: 'text',\n placeholder: 'cheeaun@mastodon.social',\n },\n ],\n hashtag: [\n {\n text: '#',\n name: 'hashtag',\n type: 'text',\n placeholder: msg`e.g. PixelArt (Max 5, space-separated)`,\n pattern: '[^#]+',\n },\n {\n text: msg`Media only`,\n name: 'media',\n type: 'checkbox',\n },\n {\n text: msg`Instance`,\n name: 'instance',\n type: 'text',\n placeholder: msg`Optional, e.g. mastodon.social`,\n notRequired: true,\n },\n ],\n};\nconst fetchAccountTitle = pmem(async ({ id }) => {\n const account = await api().masto.v1.accounts.$select(id).fetch();\n return account.username || account.acct || account.displayName;\n});\nexport const SHORTCUTS_META = {\n following: {\n id: 'home',\n title: (_, index) =>\n index === 0\n ? t`Home`\n : t({ id: 'following.title', message: 'Following' }),\n path: '/',\n icon: 'home',\n },\n mentions: {\n id: 'mentions',\n title: msg`Mentions`,\n path: '/mentions',\n icon: 'at',\n },\n notifications: {\n id: 'notifications',\n title: msg`Notifications`,\n path: '/notifications',\n icon: 'notification',\n },\n list: {\n id: ({ id }) => (id ? 'list' : 'lists'),\n title: ({ id }) => (id ? getListTitle(id) : t`Lists`),\n path: ({ id }) => (id ? `/l/${id}` : '/l'),\n icon: 'list',\n excludeViewMode: ({ id }) => (!id ? ['multi-column'] : []),\n },\n public: {\n id: 'public',\n title: ({ local }) => (local ? t`Local` : t`Federated`),\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ local, instance }) => `/${instance}/p${local ? '/l' : ''}`,\n icon: ({ local }) => (local ? 'building' : 'earth'),\n },\n trending: {\n id: 'trending',\n title: msg`Trending`,\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ instance }) => `/${instance}/trending`,\n icon: 'chart',\n },\n search: {\n id: 'search',\n title: ({ query }) => (query ? `“${query}”` : t`Search`),\n path: ({ query }) =>\n query\n ? `/search?q=${encodeURIComponent(query)}&type=statuses`\n : '/search',\n icon: 'search',\n excludeViewMode: ({ query }) => (!query ? ['multi-column'] : []),\n },\n 'account-statuses': {\n id: 'account-statuses',\n title: fetchAccountTitle,\n path: ({ id }) => `/a/${id}`,\n icon: 'user',\n },\n bookmarks: {\n id: 'bookmarks',\n title: msg`Bookmarks`,\n path: '/b',\n icon: 'bookmark',\n },\n favourites: {\n id: 'favourites',\n title: msg`Likes`,\n path: '/f',\n icon: 'heart',\n },\n hashtag: {\n id: 'hashtag',\n title: ({ hashtag }) => hashtag,\n subtitle: ({ instance }) => instance || api().instance,\n path: ({ hashtag, instance, media }) =>\n `${instance ? `/${instance}` : ''}/t/${hashtag.split(/\\s+/).join('+')}${\n media ? '?media=1' : ''\n }`,\n icon: 'hashtag',\n },\n};\n\nfunction ShortcutsSettings({ onClose }) {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n const { shortcuts } = snapStates;\n const [showForm, setShowForm] = useState(false);\n const [showImportExport, setShowImportExport] = useState(false);\n\n const [shortcutsListParent] = useAutoAnimate();\n\n return (\n <div id=\"shortcuts-settings-container\" class=\"sheet\" tabindex=\"-1\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Icon icon=\"shortcut\" /> <Trans>Shortcuts</Trans>{' '}\n <sup\n style={{\n fontSize: 12,\n opacity: 0.5,\n textTransform: 'uppercase',\n }}\n >\n <Trans>beta</Trans>\n </sup>\n </h2>\n </header>\n <main>\n <p>\n <Trans>Specify a list of shortcuts that'll appear as:</Trans>\n </p>\n <div class=\"shortcuts-view-mode\">\n {[\n {\n value: 'float-button',\n label: t`Floating button`,\n imgURL: floatingButtonUrl,\n },\n {\n value: 'tab-menu-bar',\n label: t`Tab/Menu bar`,\n imgURL: tabMenuBarUrl,\n },\n {\n value: 'multi-column',\n label: t`Multi-column`,\n imgURL: multiColumnUrl,\n },\n ].map(({ value, label, imgURL }) => {\n const checked =\n snapStates.settings.shortcutsViewMode === value ||\n (value === 'float-button' &&\n !snapStates.settings.shortcutsViewMode);\n return (\n <label key={value} class={checked ? 'checked' : ''}>\n <input\n type=\"radio\"\n name=\"shortcuts-view-mode\"\n value={value}\n checked={checked}\n onChange={(e) => {\n states.settings.shortcutsViewMode = e.target.value;\n }}\n />{' '}\n <img src={imgURL} alt=\"\" width=\"80\" height=\"58\" />{' '}\n <span>{label}</span>\n </label>\n );\n })}\n </div>\n {shortcuts.length > 0 ? (\n <>\n <ol class=\"shortcuts-list\" ref={shortcutsListParent}>\n {shortcuts.filter(Boolean).map((shortcut, i) => {\n // const key = i + Object.values(shortcut);\n const key = Object.values(shortcut).join('-');\n const { type } = shortcut;\n if (!SHORTCUTS_META[type]) return null;\n let { icon, title, subtitle, excludeViewMode } =\n SHORTCUTS_META[type];\n if (typeof title === 'function') {\n title = title(shortcut, i);\n } else {\n title = _(title);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(shortcut, i);\n } else {\n subtitle = _(subtitle);\n }\n if (typeof icon === 'function') {\n icon = icon(shortcut, i);\n }\n if (typeof excludeViewMode === 'function') {\n excludeViewMode = excludeViewMode(shortcut, i);\n }\n const excludedViewMode = excludeViewMode?.includes(\n snapStates.settings.shortcutsViewMode,\n );\n return (\n <li key={key}>\n <Icon icon={icon} />\n <span class=\"shortcut-text\">\n <AsyncText>{title}</AsyncText>\n {subtitle && (\n <>\n {' '}\n <small class=\"ib insignificant\">{subtitle}</small>\n </>\n )}\n {excludedViewMode && (\n <span class=\"tag\">\n <Trans>Not available in current view mode</Trans>\n </span>\n )}\n </span>\n <span class=\"shortcut-actions\">\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={i === 0}\n onClick={() => {\n const shortcutsArr = Array.from(states.shortcuts);\n if (i > 0) {\n const temp = states.shortcuts[i - 1];\n shortcutsArr[i - 1] = shortcut;\n shortcutsArr[i] = temp;\n states.shortcuts = shortcutsArr;\n }\n }}\n >\n <Icon icon=\"arrow-up\" alt={t`Move up`} />\n </button>\n <button\n type=\"button\"\n class=\"plain small\"\n disabled={i === shortcuts.length - 1}\n onClick={() => {\n const shortcutsArr = Array.from(states.shortcuts);\n if (i < states.shortcuts.length - 1) {\n const temp = states.shortcuts[i + 1];\n shortcutsArr[i + 1] = shortcut;\n shortcutsArr[i] = temp;\n states.shortcuts = shortcutsArr;\n }\n }}\n >\n <Icon icon=\"arrow-down\" alt={t`Move down`} />\n </button>\n <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => {\n setShowForm({\n shortcut,\n shortcutIndex: i,\n });\n }}\n >\n <Icon icon=\"pencil\" alt={t`Edit`} />\n </button>\n {/* <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => {\n states.shortcuts.splice(i, 1);\n }}\n >\n <Icon icon=\"x\" alt=\"Remove\" />\n </button> */}\n </span>\n </li>\n );\n })}\n </ol>\n {shortcuts.length === 1 &&\n snapStates.settings.shortcutsViewMode !== 'float-button' && (\n <div class=\"ui-state insignificant\">\n <Icon icon=\"info\" />{' '}\n <small>\n <Trans>\n Add more than one shortcut/column to make this work.\n </Trans>\n </small>\n </div>\n )}\n </>\n ) : (\n <div class=\"ui-state insignificant\">\n <p>\n {snapStates.settings.shortcutsViewMode === 'multi-column'\n ? t`No columns yet. Tap on the Add column button.`\n : t`No shortcuts yet. Tap on the Add shortcut button.`}\n </p>\n <p>\n <Trans>\n Not sure what to add?\n <br />\n Try adding{' '}\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n states.shortcuts = [\n {\n type: 'following',\n },\n {\n type: 'notifications',\n },\n ];\n }}\n >\n Home / Following and Notifications\n </a>{' '}\n first.\n </Trans>\n </p>\n </div>\n )}\n <p class=\"insignificant\">\n {shortcuts.length >= SHORTCUTS_LIMIT &&\n (snapStates.settings.shortcutsViewMode === 'multi-column'\n ? t`Max ${SHORTCUTS_LIMIT} columns`\n : t`Max ${SHORTCUTS_LIMIT} shortcuts`)}\n </p>\n <p\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => setShowImportExport(true)}\n >\n <Trans>Import/export</Trans>\n </button>\n <button\n type=\"button\"\n disabled={shortcuts.length >= SHORTCUTS_LIMIT}\n onClick={() => setShowForm(true)}\n >\n <Icon icon=\"plus\" />{' '}\n <span>\n {snapStates.settings.shortcutsViewMode === 'multi-column'\n ? t`Add column…`\n : t`Add shortcut…`}\n </span>\n </button>\n </p>\n </main>\n {showForm && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowForm(false);\n }\n }}\n >\n <ShortcutForm\n shortcut={showForm.shortcut}\n shortcutIndex={showForm.shortcutIndex}\n onSubmit={({ result, mode }) => {\n console.log('onSubmit', result);\n if (mode === 'edit') {\n states.shortcuts[showForm.shortcutIndex] = result;\n } else {\n states.shortcuts.push(result);\n }\n }}\n onClose={() => setShowForm(false)}\n />\n </Modal>\n )}\n {showImportExport && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowImportExport(false);\n }\n }}\n >\n <ImportExport\n shortcuts={shortcuts}\n onClose={() => setShowImportExport(false)}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nconst FORM_NOTES = {\n list: msg`Specific list is optional. For multi-column mode, list is required, else the column will not be shown.`,\n search: msg`For multi-column mode, search term is required, else the column will not be shown.`,\n hashtag: msg`Multiple hashtags are supported. Space-separated.`,\n};\n\nfunction ShortcutForm({\n onSubmit,\n disabled,\n shortcut,\n shortcutIndex,\n onClose,\n}) {\n const { _ } = useLingui();\n console.log('shortcut', shortcut);\n const editMode = !!shortcut;\n const [currentType, setCurrentType] = useState(shortcut?.type || null);\n\n const [uiState, setUIState] = useState('default');\n const [lists, setLists] = useState([]);\n const [followedHashtags, setFollowedHashtags] = useState([]);\n useEffect(() => {\n (async () => {\n if (currentType !== 'list') return;\n try {\n setUIState('loading');\n const lists = await getLists();\n setLists(lists);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n\n (async () => {\n if (currentType !== 'hashtag') return;\n try {\n const tags = await fetchFollowedTags();\n setFollowedHashtags(tags);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [currentType]);\n\n const formRef = useRef();\n useEffect(() => {\n if (editMode && currentType && TYPE_PARAMS[currentType]) {\n // Populate form\n const form = formRef.current;\n TYPE_PARAMS[currentType].forEach(({ name, type }) => {\n const input = form.querySelector(`[name=\"${name}\"]`);\n if (input && shortcut[name]) {\n if (type === 'checkbox') {\n input.checked = shortcut[name] === 'on' ? true : false;\n } else {\n input.value = shortcut[name];\n }\n }\n });\n }\n }, [editMode, currentType]);\n\n return (\n <div id=\"shortcut-settings-form\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>{editMode ? t`Edit shortcut` : t`Add shortcut`}</h2>\n </header>\n <main tabindex=\"-1\">\n <form\n ref={formRef}\n onSubmit={(e) => {\n // Construct a nice object from form\n e.preventDefault();\n const data = new FormData(e.target);\n const result = {};\n data.forEach((value, key) => {\n result[key] = value?.trim();\n if (key === 'instance') {\n // Remove protocol and trailing slash\n result[key] = result[key]\n .replace(/^https?:\\/\\//, '')\n .replace(/\\/+$/, '');\n // Remove @acct@ or acct@ from instance URL\n result[key] = result[key].replace(/^@?[^@]+@/, '');\n }\n });\n console.log('result', result);\n if (!result.type) return;\n onSubmit({\n result,\n mode: editMode ? 'edit' : 'add',\n });\n // Reset\n e.target.reset();\n setCurrentType(null);\n onClose?.();\n }}\n >\n <p>\n <label>\n <span>\n <Trans>Timeline</Trans>\n </span>\n <select\n required\n disabled={disabled}\n onChange={(e) => {\n setCurrentType(e.target.value);\n }}\n defaultValue={editMode ? shortcut.type : undefined}\n name=\"type\"\n dir=\"auto\"\n >\n <option></option>\n {TYPES.map((type) => (\n <option value={type}>{_(TYPE_TEXT[type])}</option>\n ))}\n </select>\n </label>\n </p>\n {TYPE_PARAMS[currentType]?.map?.(\n ({ text, name, type, placeholder, pattern, notRequired }) => {\n if (currentType === 'list') {\n return (\n <p>\n <label>\n <span>\n <Trans>List</Trans>\n </span>\n <select\n name=\"id\"\n required={!notRequired}\n disabled={disabled || uiState === 'loading'}\n defaultValue={editMode ? shortcut.id : undefined}\n dir=\"auto\"\n >\n <option value=\"\"></option>\n {lists.map((list) => (\n <option value={list.id}>{list.title}</option>\n ))}\n </select>\n </label>\n </p>\n );\n }\n\n return (\n <p>\n <label>\n <span>{_(text)}</span>{' '}\n <input\n type={type}\n switch={type === 'checkbox' || undefined}\n name={name}\n placeholder={_(placeholder)}\n required={type === 'text' && !notRequired}\n disabled={disabled}\n list={\n currentType === 'hashtag'\n ? 'followed-hashtags-datalist'\n : null\n }\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck={false}\n pattern={pattern}\n dir=\"auto\"\n />\n {currentType === 'hashtag' &&\n followedHashtags.length > 0 && (\n <datalist id=\"followed-hashtags-datalist\">\n {followedHashtags.map((tag) => (\n <option value={tag.name} />\n ))}\n </datalist>\n )}\n </label>\n </p>\n );\n },\n )}\n {!!FORM_NOTES[currentType] && (\n <p class=\"form-note insignificant\">\n <Icon icon=\"info\" />\n {_(FORM_NOTES[currentType])}\n </p>\n )}\n <footer>\n <button\n type=\"submit\"\n class=\"block\"\n disabled={disabled || uiState === 'loading'}\n >\n {editMode ? t`Save` : t`Add`}\n </button>\n {editMode && (\n <button\n type=\"button\"\n class=\"light danger\"\n onClick={() => {\n states.shortcuts.splice(shortcutIndex, 1);\n onClose?.();\n }}\n >\n <Trans>Remove</Trans>\n </button>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ImportExport({ shortcuts, onClose }) {\n const { _ } = useLingui();\n const { masto } = api();\n const shortcutsStr = useMemo(() => {\n if (!shortcuts) return '';\n if (!shortcuts.filter(Boolean).length) return '';\n return compressToEncodedURIComponent(\n JSON.stringify(shortcuts.filter(Boolean)),\n );\n }, [shortcuts]);\n const [importShortcutStr, setImportShortcutStr] = useState('');\n const [importUIState, setImportUIState] = useState('default');\n const parsedImportShortcutStr = useMemo(() => {\n if (!importShortcutStr) {\n setImportUIState('default');\n return null;\n }\n try {\n const parsed = JSON.parse(\n decompressFromEncodedURIComponent(importShortcutStr),\n );\n // Very basic validation, I know\n if (!Array.isArray(parsed)) throw new Error('Not an array');\n setImportUIState('default');\n return parsed;\n } catch (err) {\n // Fallback to JSON string parsing\n // There's a chance that someone might want to import a JSON string instead of the compressed version\n try {\n const parsed = JSON.parse(importShortcutStr);\n if (!Array.isArray(parsed)) throw new Error('Not an array');\n setImportUIState('default');\n return parsed;\n } catch (err) {\n setImportUIState('error');\n return null;\n }\n }\n }, [importShortcutStr]);\n const hasCurrentSettings = states.shortcuts.length > 0;\n\n const shortcutsImportFieldRef = useRef();\n\n return (\n <div id=\"import-export-container\" class=\"sheet\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>\n Import/Export <small class=\"ib insignificant\">Shortcuts</small>\n </Trans>\n </h2>\n </header>\n <main tabindex=\"-1\">\n <section>\n <h3>\n <Icon icon=\"arrow-down-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>\n <Trans>Import</Trans>\n </span>\n </h3>\n <p class=\"field-button\">\n <input\n ref={shortcutsImportFieldRef}\n type=\"text\"\n name=\"import\"\n placeholder={t`Paste shortcuts here`}\n class=\"block\"\n onInput={(e) => {\n setImportShortcutStr(e.target.value);\n }}\n dir=\"auto\"\n />\n {states.settings.shortcutSettingsCloudImportExport && (\n <button\n type=\"button\"\n class=\"plain2 small\"\n disabled={importUIState === 'cloud-downloading'}\n onClick={async () => {\n setImportUIState('cloud-downloading');\n const currentAccount = getCurrentAccountID();\n showToast(\n t`Downloading saved shortcuts from instance server…`,\n );\n try {\n const relationships =\n await masto.v1.accounts.relationships.fetch({\n id: [currentAccount],\n });\n const relationship = relationships[0];\n if (relationship) {\n const { note = '' } = relationship;\n if (\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n note,\n )\n ) {\n const settings = note.match(\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n )[1];\n const { v, dt, data } = JSON.parse(settings);\n shortcutsImportFieldRef.current.value = data;\n shortcutsImportFieldRef.current.dispatchEvent(\n new Event('input'),\n );\n }\n }\n setImportUIState('default');\n } catch (e) {\n console.error(e);\n setImportUIState('error');\n showToast(t`Unable to download shortcuts`);\n }\n }}\n title={t`Download shortcuts from instance server`}\n >\n <Icon icon=\"cloud\" />\n <Icon icon=\"arrow-down\" />\n </button>\n )}\n </p>\n {!!parsedImportShortcutStr &&\n Array.isArray(parsedImportShortcutStr) && (\n <>\n <p>\n <b>{parsedImportShortcutStr.length}</b> shortcut\n {parsedImportShortcutStr.length > 1 ? 's' : ''}{' '}\n <small class=\"insignificant\">\n ({importShortcutStr.length} characters)\n </small>\n </p>\n <ol class=\"import-settings-list\">\n {parsedImportShortcutStr.map((shortcut) => (\n <li>\n <span\n style={{\n opacity: shortcuts.some((s) =>\n // Compare all properties\n Object.keys(s).every(\n (key) => s[key] === shortcut[key],\n ),\n )\n ? 1\n : 0,\n }}\n >\n *\n </span>\n <span>\n {_(TYPE_TEXT[shortcut.type])}\n {shortcut.type === 'list' && ' ⚠️'}{' '}\n {TYPE_PARAMS[shortcut.type]?.map?.(\n ({ text, name, type }) =>\n shortcut[name] ? (\n <>\n <span class=\"tag collapsed insignificant\">\n {text}:{' '}\n {type === 'checkbox'\n ? shortcut[name] === 'on'\n ? '✅'\n : '❌'\n : shortcut[name]}\n </span>{' '}\n </>\n ) : null,\n )}\n </span>\n </li>\n ))}\n </ol>\n <p>\n <small>\n <Trans>* Exists in current shortcuts</Trans>\n </small>\n <br />\n <small>\n ⚠️{' '}\n <Trans>\n List may not work if it's from a different account.\n </Trans>\n </small>\n </p>\n </>\n )}\n {importUIState === 'error' && (\n <p class=\"error\">\n <small>\n ⚠️ <Trans>Invalid settings format</Trans>\n </small>\n </p>\n )}\n <p>\n {hasCurrentSettings && (\n <>\n <MenuConfirm\n confirmLabel={t`Append to current shortcuts?`}\n menuFooter={\n <div class=\"footer\">\n <Trans>\n Only shortcuts that don’t exist in current shortcuts\n will be appended.\n </Trans>\n </div>\n }\n onClick={() => {\n // states.shortcuts = [\n // ...states.shortcuts,\n // ...parsedImportShortcutStr,\n // ];\n // Append non-unique shortcuts only\n const nonUniqueShortcuts = parsedImportShortcutStr.filter(\n (shortcut) =>\n !states.shortcuts.some((s) =>\n // Compare all properties\n Object.keys(s).every(\n (key) => s[key] === shortcut[key],\n ),\n ),\n );\n if (!nonUniqueShortcuts.length) {\n showToast(t`No new shortcuts to import`);\n return;\n }\n let newShortcuts = [\n ...states.shortcuts,\n ...nonUniqueShortcuts,\n ];\n const exceededLimit = newShortcuts.length > SHORTCUTS_LIMIT;\n if (exceededLimit) {\n // If exceeded, trim it\n newShortcuts = newShortcuts.slice(0, SHORTCUTS_LIMIT);\n }\n states.shortcuts = newShortcuts;\n showToast(\n exceededLimit\n ? t`Shortcuts imported. Exceeded max ${SHORTCUTS_LIMIT}, so the rest are not imported.`\n : t`Shortcuts imported`,\n );\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n <Trans>Import & append…</Trans>\n </button>\n </MenuConfirm>{' '}\n </>\n )}\n <MenuConfirm\n confirmLabel={\n hasCurrentSettings\n ? t`Override current shortcuts?`\n : t`Import shortcuts?`\n }\n menuItemClassName={hasCurrentSettings ? 'danger' : undefined}\n onClick={() => {\n states.shortcuts = parsedImportShortcutStr;\n showToast(t`Shortcuts imported`);\n onClose?.();\n }}\n >\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!parsedImportShortcutStr}\n >\n {hasCurrentSettings ? t`or override…` : t`Import…`}\n </button>\n </MenuConfirm>\n </p>\n </section>\n <section>\n <h3>\n <Icon icon=\"arrow-up-circle\" size=\"l\" class=\"insignificant\" />{' '}\n <span>\n <Trans>Export</Trans>\n </span>\n </h3>\n <p>\n <input\n style={{ width: '100%' }}\n type=\"text\"\n value={shortcutsStr}\n readOnly\n onClick={(e) => {\n if (!e.target.value) return;\n e.target.select();\n // Copy url to clipboard\n try {\n navigator.clipboard.writeText(e.target.value);\n showToast(t`Shortcuts copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy shortcuts`);\n }\n }}\n dir=\"auto\"\n />\n </p>\n <p>\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.clipboard.writeText(shortcutsStr);\n showToast(t`Shortcut settings copied`);\n } catch (e) {\n console.error(e);\n showToast(t`Unable to copy shortcut settings`);\n }\n }}\n >\n <Icon icon=\"clipboard\" />{' '}\n <span>\n <Trans>Copy</Trans>\n </span>\n </button>{' '}\n {navigator?.share &&\n navigator?.canShare?.({\n text: shortcutsStr,\n }) && (\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={!shortcutsStr}\n onClick={() => {\n try {\n navigator.share({\n text: shortcutsStr,\n });\n } catch (e) {\n console.error(e);\n alert(t`Sharing doesn't seem to work.`);\n }\n }}\n >\n <Icon icon=\"share\" />{' '}\n <span>\n <Trans>Share</Trans>\n </span>\n </button>\n )}{' '}\n {states.settings.shortcutSettingsCloudImportExport && (\n <button\n type=\"button\"\n class=\"plain2\"\n disabled={importUIState === 'cloud-uploading'}\n onClick={async () => {\n setImportUIState('cloud-uploading');\n const currentAccount = getCurrentAccountID();\n try {\n const relationships =\n await masto.v1.accounts.relationships.fetch({\n id: [currentAccount],\n });\n const relationship = relationships[0];\n if (relationship) {\n const { note = '' } = relationship;\n // const newNote = `${note}\\n\\n\\n$<phanpy-shortcuts-settings>{shortcutsStr}</phanpy-shortcuts-settings>`;\n let newNote = '';\n const settingsJSON = JSON.stringify({\n v: '1', // version\n dt: Date.now(), // datetime stamp\n data: shortcutsStr, // shortcuts settings string\n });\n if (\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/.test(\n note,\n )\n ) {\n newNote = note.replace(\n /<phanpy-shortcuts-settings>(.*)<\\/phanpy-shortcuts-settings>/,\n `<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`,\n );\n } else {\n newNote = `${note}\\n\\n\\n<phanpy-shortcuts-settings>${settingsJSON}</phanpy-shortcuts-settings>`;\n }\n showToast(t`Saving shortcuts to instance server…`);\n await masto.v1.accounts\n .$select(currentAccount)\n .note.create({\n comment: newNote,\n });\n setImportUIState('default');\n showToast(t`Shortcuts saved`);\n }\n } catch (e) {\n console.error(e);\n setImportUIState('error');\n showToast(t`Unable to save shortcuts`);\n }\n }}\n title={t`Sync to instance server`}\n >\n <Icon icon=\"cloud\" />\n <Icon icon=\"arrow-up\" />\n </button>\n )}{' '}\n {shortcutsStr.length > 0 && (\n <small class=\"insignificant ib\">\n <Plural\n value={shortcutsStr.length}\n one=\"# character\"\n other=\"# characters\"\n />\n </small>\n )}\n </p>\n {!!shortcutsStr && (\n <details>\n <summary class=\"insignificant\">\n <small>\n <Trans>Raw Shortcuts JSON</Trans>\n </small>\n </summary>\n <textarea style={{ width: '100%' }} rows={10} readOnly>\n {JSON.stringify(shortcuts.filter(Boolean), null, 2)}\n </textarea>\n </details>\n )}\n </section>\n {states.settings.shortcutSettingsCloudImportExport && (\n <footer>\n <p>\n <Icon icon=\"cloud\" />{' '}\n <Trans>\n Import/export settings from/to instance server (Very\n experimental)\n </Trans>\n </p>\n </footer>\n )}\n </main>\n </div>\n );\n}\n\nexport default ShortcutsSettings;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect } from 'preact/hooks';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { subscribe, useSnapshot } from 'valtio';\n\nimport Accounts from '../pages/accounts';\nimport Settings from '../pages/settings';\nimport focusDeck from '../utils/focus-deck';\nimport showToast from '../utils/show-toast';\nimport states from '../utils/states';\n\nimport AccountSheet from './account-sheet';\nimport ComposeSuspense, { preload } from './compose-suspense';\nimport Drafts from './drafts';\nimport EmbedModal from './embed-modal';\nimport GenericAccounts from './generic-accounts';\nimport MediaAltModal from './media-alt-modal';\nimport MediaModal from './media-modal';\nimport Modal from './modal';\nimport OpenLinkSheet from './open-link-sheet';\nimport ReportModal from './report-modal';\nimport ShortcutsSettings from './shortcuts-settings';\n\nsubscribe(states, (changes) => {\n for (const [action, path, value, prevValue] of changes) {\n // When closing modal, focus on deck\n if (/^show/i.test(path) && !value) {\n focusDeck();\n }\n }\n});\n\nexport default function Modals() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const navigate = useNavigate();\n const location = useLocation();\n\n useEffect(() => {\n setTimeout(preload, 1000);\n }, []);\n\n return (\n <>\n {!!snapStates.showCompose && (\n <Modal\n class={`solid ${snapStates.composerState.minimized ? 'min' : ''}`}\n minimized={!!snapStates.composerState.minimized}\n >\n <ComposeSuspense\n replyToStatus={\n typeof snapStates.showCompose !== 'boolean'\n ? snapStates.showCompose.replyToStatus\n : window.__COMPOSE__?.replyToStatus || null\n }\n replyMode={\n states.showCompose?.replyMode ||\n window.__COMPOSE__?.replyMode ||\n 'all'\n }\n editStatus={\n states.showCompose?.editStatus ||\n window.__COMPOSE__?.editStatus ||\n null\n }\n draftStatus={\n states.showCompose?.draftStatus ||\n window.__COMPOSE__?.draftStatus ||\n null\n }\n quoteStatus={\n states.showCompose?.quoteStatus ||\n window.__COMPOSE__?.quoteStatus ||\n null\n }\n onClose={(results) => {\n const { newStatus, instance, type, scheduledAt } = results || {};\n states.showCompose = false;\n window.__COMPOSE__ = null;\n if (newStatus) {\n states.reloadStatusPage++;\n if (scheduledAt) states.reloadScheduledPosts++;\n showToast({\n text: {\n post: scheduledAt\n ? t`Post scheduled`\n : t`Post published. Check it out.`,\n reply: scheduledAt\n ? t`Reply scheduled`\n : t`Reply posted. Check it out.`,\n edit: t`Post updated. Check it out.`,\n }[type || 'post'],\n delay: 1000,\n duration: 10_000, // 10 seconds\n onClick: (toast) => {\n toast.hideToast();\n states.prevLocation = location;\n if (scheduledAt) {\n navigate('/sp');\n } else {\n navigate(\n instance\n ? `/${instance}/s/${newStatus.id}`\n : `/s/${newStatus.id}`,\n );\n }\n },\n });\n }\n }}\n />\n </Modal>\n )}\n {!!snapStates.showSettings && (\n <Modal\n onClose={() => {\n states.showSettings = false;\n }}\n >\n <Settings\n onClose={() => {\n states.showSettings = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showAccounts && (\n <Modal\n onClose={() => {\n states.showAccounts = false;\n }}\n >\n <Accounts\n onClose={() => {\n states.showAccounts = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showAccount && (\n <Modal\n onClose={() => {\n states.showAccount = false;\n }}\n >\n <AccountSheet\n account={snapStates.showAccount?.account || snapStates.showAccount}\n instance={snapStates.showAccount?.instance}\n onClose={({ destination } = {}) => {\n states.showAccount = false;\n // states.showGenericAccounts = false;\n // if (destination) {\n // states.showAccounts = false;\n // }\n }}\n />\n </Modal>\n )}\n {!!snapStates.showOpenLink && (\n <Modal\n onClose={() => {\n states.showOpenLink = false;\n }}\n >\n <OpenLinkSheet\n url={snapStates.showOpenLink.url}\n linkText={snapStates.showOpenLink.linkText}\n onClose={() => {\n states.showOpenLink = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showDrafts && (\n <Modal\n onClose={() => {\n states.showDrafts = false;\n }}\n >\n <Drafts onClose={() => (states.showDrafts = false)} />\n </Modal>\n )}\n {!!snapStates.showMediaModal && (\n <Modal\n onClick={(e) => {\n if (\n e.target === e.currentTarget ||\n e.target.classList.contains('media')\n ) {\n states.showMediaModal = false;\n }\n }}\n >\n <MediaModal\n mediaAttachments={snapStates.showMediaModal.mediaAttachments}\n instance={snapStates.showMediaModal.instance}\n index={snapStates.showMediaModal.mediaIndex}\n statusID={snapStates.showMediaModal.statusID}\n onClose={() => {\n states.showMediaModal = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showShortcutsSettings && (\n <Modal\n onClose={() => {\n states.showShortcutsSettings = false;\n }}\n >\n <ShortcutsSettings\n onClose={() => (states.showShortcutsSettings = false)}\n />\n </Modal>\n )}\n {!!snapStates.showGenericAccounts && (\n <Modal\n onClose={() => {\n states.showGenericAccounts = false;\n }}\n >\n <GenericAccounts\n instance={snapStates.showGenericAccounts.instance}\n excludeRelationshipAttrs={\n snapStates.showGenericAccounts.excludeRelationshipAttrs\n }\n postID={snapStates.showGenericAccounts.postID}\n onClose={() => (states.showGenericAccounts = false)}\n blankCopy={snapStates.showGenericAccounts.blankCopy}\n />\n </Modal>\n )}\n {!!snapStates.showMediaAlt && (\n <Modal\n onClose={(e) => {\n states.showMediaAlt = false;\n }}\n >\n <MediaAltModal\n alt={snapStates.showMediaAlt.alt || snapStates.showMediaAlt}\n lang={snapStates.showMediaAlt?.lang}\n onClose={() => {\n states.showMediaAlt = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showEmbedModal && (\n <Modal\n class=\"solid\"\n onClose={() => {\n states.showEmbedModal = false;\n }}\n >\n <EmbedModal\n html={snapStates.showEmbedModal.html}\n url={snapStates.showEmbedModal.url}\n width={snapStates.showEmbedModal.width}\n height={snapStates.showEmbedModal.height}\n onClose={() => {\n states.showEmbedModal = false;\n }}\n />\n </Modal>\n )}\n {!!snapStates.showReportModal && (\n <Modal\n onClose={() => {\n states.showReportModal = false;\n }}\n >\n <ReportModal\n account={snapStates.showReportModal.account}\n post={snapStates.showReportModal.post}\n onClose={() => {\n states.showReportModal = false;\n }}\n />\n </Modal>\n )}\n </>\n );\n}\n","import { memo } from 'preact/compat';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useNavigate } from 'react-router-dom';\n\nexport default memo(function NavigationCommand() {\n const navigate = useNavigate();\n\n const hotkeyOptions = {\n useKey: true,\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal || e.metaKey || e.ctrlKey || e.altKey;\n },\n };\n\n useHotkeys('g>h', () => navigate('/'), hotkeyOptions);\n useHotkeys('g>n', () => navigate('/notifications'), hotkeyOptions);\n\n return null;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useState } from 'preact/hooks';\n\nimport { api } from '../utils/api';\n\nimport Icon from './icon';\nimport Loader from './loader';\n\nfunction FollowRequestButtons({ accountID, onChange }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [requestState, setRequestState] = useState(null); // accept, reject\n const [relationship, setRelationship] = useState(null);\n\n const hasRelationship = relationship !== null;\n\n return (\n <p class=\"follow-request-buttons\">\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRelationship}\n onClick={() => {\n setUIState('loading');\n setRequestState('accept');\n (async () => {\n try {\n const rel = await masto.v1.followRequests\n .$select(accountID)\n .authorize();\n if (!rel?.followedBy) {\n throw new Error('Follow request not accepted');\n }\n setRelationship(rel);\n onChange();\n } catch (e) {\n console.error(e);\n }\n setUIState('default');\n })();\n }}\n >\n <Trans>Accept</Trans>\n </button>{' '}\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRelationship}\n class=\"light danger\"\n onClick={() => {\n setUIState('loading');\n setRequestState('reject');\n (async () => {\n try {\n const rel = await masto.v1.followRequests\n .$select(accountID)\n .reject();\n if (rel?.followedBy) {\n throw new Error('Follow request not rejected');\n }\n setRelationship(rel);\n onChange();\n } catch (e) {\n console.error(e);\n setUIState('default');\n }\n })();\n }}\n >\n <Trans>Reject</Trans>\n </button>\n <span class=\"follow-request-states\">\n {hasRelationship && requestState ? (\n requestState === 'accept' ? (\n <Icon\n icon=\"check-circle\"\n alt={t`Accepted`}\n class=\"follow-accepted\"\n />\n ) : (\n <Icon icon=\"x-circle\" alt={t`Rejected`} class=\"follow-rejected\" />\n )\n ) : (\n <Loader hidden={uiState !== 'loading'} />\n )}\n </span>\n </p>\n );\n}\n\nexport default FollowRequestButtons;\n","import { msg, t } from '@lingui/core/macro';\nimport { Plural, Select, Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\n\nimport { api } from '../utils/api';\nimport { isFiltered } from '../utils/filters';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { statusKey } from '../utils/states';\nimport { getCurrentAccountID } from '../utils/store-utils';\nimport useTruncated from '../utils/useTruncated';\n\nimport Avatar from './avatar';\nimport CustomEmoji from './custom-emoji';\nimport FollowRequestButtons from './follow-request-buttons';\nimport Icon from './icon';\nimport Link from './link';\nimport NameText from './name-text';\nimport Status from './status';\n\nconst NOTIFICATION_ICONS = {\n mention: 'comment',\n status: 'notification',\n reblog: 'rocket',\n follow: 'follow',\n follow_request: 'follow-add',\n favourite: 'heart',\n poll: 'poll',\n update: 'pencil',\n 'admin.signup': 'account-edit',\n 'admin.report': 'account-warning',\n severed_relationships: 'heart-break',\n moderation_warning: 'alert',\n emoji_reaction: 'emoji2',\n 'pleroma:emoji_reaction': 'emoji2',\n annual_report: 'celebrate',\n quote: 'quote',\n quoted_update: 'pencil',\n};\n\n/*\nNotification types\n==================\nmention = Someone mentioned you in their status\nstatus = Someone you enabled notifications for has posted a status\nreblog = Someone boosted one of your statuses\nfollow = Someone followed you\nfollow_request = Someone requested to follow you\nfavourite = Someone favourited one of your statuses\npoll = A poll you have voted in or created has ended\nupdate = A status you interacted with has been edited\nadmin.sign_up = Someone signed up (optionally sent to admins)\nadmin.report = A new report has been filed\nsevered_relationships = Severed relationships\nmoderation_warning = Moderation warning\nquote = Someone quoted one of your statuses\nquoted_update = A status you have quoted has been edited\n*/\n\nfunction emojiText({ account, emoji, emoji_url }) {\n let url;\n let staticUrl;\n if (typeof emoji_url === 'string') {\n url = emoji_url;\n } else {\n url = emoji_url?.url;\n staticUrl = emoji_url?.staticUrl;\n }\n const emojiObject = url ? (\n <CustomEmoji url={url} staticUrl={staticUrl} alt={emoji} />\n ) : (\n emoji\n );\n return (\n <Trans>\n {account} reacted to your post with {emojiObject}\n </Trans>\n );\n}\n\nconst contentText = {\n status: ({ account }) => <Trans>{account} published a post.</Trans>,\n reblog: ({\n count,\n account,\n postsCount,\n postType,\n components: { Subject },\n }) => (\n <Plural\n value={count}\n _1={\n <Plural\n value={postsCount}\n _1={\n <Select\n value={postType}\n _reply={<Trans>{account} boosted your reply.</Trans>}\n other={<Trans>{account} boosted your post.</Trans>}\n />\n }\n other={\n <Trans>\n {account} boosted {postsCount} of your posts.\n </Trans>\n }\n />\n }\n other={\n <Select\n value={postType}\n _reply={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted your reply.\n </Trans>\n }\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted your post.\n </Trans>\n }\n />\n }\n />\n ),\n follow: ({ account, count, components: { Subject } }) => (\n <Plural\n value={count}\n _1={<Trans>{account} followed you.</Trans>}\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n followed you.\n </Trans>\n }\n />\n ),\n follow_request: ({ account }) => (\n <Trans>{account} requested to follow you.</Trans>\n ),\n favourite: ({\n account,\n count,\n postsCount,\n postType,\n components: { Subject },\n }) => (\n <Plural\n value={count}\n _1={\n <Plural\n value={postsCount}\n _1={\n <Select\n value={postType}\n _reply={<Trans>{account} liked your reply.</Trans>}\n other={<Trans>{account} liked your post.</Trans>}\n />\n }\n other={\n <Trans>\n {account} liked {postsCount} of your posts.\n </Trans>\n }\n />\n }\n other={\n <Select\n value={postType}\n _reply={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n liked your reply.\n </Trans>\n }\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n liked your post.\n </Trans>\n }\n />\n }\n />\n ),\n poll: () => t`A poll you have voted in or created has ended.`,\n 'poll-self': () => t`A poll you have created has ended.`,\n 'poll-voted': () => t`A poll you have voted in has ended.`,\n update: ({ account }) =>\n account ? (\n <Trans>{account} edited a post.</Trans>\n ) : (\n t`A post you interacted with has been edited.`\n ),\n 'favourite+reblog': ({\n count,\n account,\n postsCount,\n postType,\n components: { Subject },\n }) => (\n <Plural\n value={count}\n _1={\n <Plural\n value={postsCount}\n _1={\n <Select\n value={postType}\n _reply={<Trans>{account} boosted & liked your reply.</Trans>}\n other={<Trans>{account} boosted & liked your post.</Trans>}\n />\n }\n other={\n <Trans>\n {account} boosted & liked {postsCount} of your posts.\n </Trans>\n }\n />\n }\n other={\n <Select\n value={postType}\n _reply={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted & liked your reply.\n </Trans>\n }\n other={\n <Trans>\n <Subject clickable={count > 1}>\n <span title={count}>{shortenNumber(count)}</span> people\n </Subject>{' '}\n boosted & liked your post.\n </Trans>\n }\n />\n }\n />\n ),\n quoted_update: ({ account }) => (\n <Trans>{account} edited a post you have quoted.</Trans>\n ),\n 'admin.sign_up': ({ account }) => <Trans>{account} signed up.</Trans>,\n 'admin.report': ({ account, targetAccount }) => (\n <Trans>\n {account} reported {targetAccount}\n </Trans>\n ),\n severed_relationships: ({ name }) => (\n <Trans>\n Lost connections with <i>{name}</i>.\n </Trans>\n ),\n moderation_warning: () => (\n <b>\n <Trans>Moderation warning</Trans>\n </b>\n ),\n emoji_reaction: emojiText,\n 'pleroma:emoji_reaction': emojiText,\n annual_report: ({ year }) => <Trans>Your {year} #Wrapstodon is here!</Trans>,\n};\n\n// account_suspension, domain_block, user_domain_block\nconst SEVERED_RELATIONSHIPS_TEXT = {\n account_suspension: ({ from, targetName }) => (\n <Trans>\n An admin from <i>{from}</i> has suspended <i>{targetName}</i>, which means\n you can no longer receive updates from them or interact with them.\n </Trans>\n ),\n domain_block: ({ from, targetName, followersCount, followingCount }) => (\n <Trans>\n An admin from <i>{from}</i> has blocked <i>{targetName}</i>. Affected\n followers: {followersCount}, followings: {followingCount}.\n </Trans>\n ),\n user_domain_block: ({ targetName, followersCount, followingCount }) => (\n <Trans>\n You have blocked <i>{targetName}</i>. Removed followers: {followersCount},\n followings: {followingCount}.\n </Trans>\n ),\n};\n\nconst MODERATION_WARNING_TEXT = {\n none: msg`Your account has received a moderation warning.`,\n disable: msg`Your account has been disabled.`,\n mark_statuses_as_sensitive: msg`Some of your posts have been marked as sensitive.`,\n delete_statuses: msg`Some of your posts have been deleted.`,\n sensitive: msg`Your posts will be marked as sensitive from now on.`,\n silence: msg`Your account has been limited.`,\n suspend: msg`Your account has been suspended.`,\n};\n\nconst AVATARS_LIMIT = 30;\n\nfunction Notification({\n notification,\n instance,\n isStatic,\n disableContextMenu,\n}) {\n const { _ } = useLingui();\n const { masto } = api();\n const {\n id,\n status,\n account,\n report,\n event,\n moderation_warning,\n annualReport,\n // Client-side grouped notification\n _ids,\n _accounts,\n _statuses,\n _groupKeys,\n // Server-side grouped notification\n sampleAccounts,\n notificationsCount,\n groupKey,\n _notificationsCount,\n _sampleAccountsCount,\n } = notification;\n let { type } = notification;\n\n if ((type === 'mention' || type === 'quote') && !status) {\n // Could be deleted\n return null;\n }\n\n // status = Attached when type of the notification is favourite, reblog, status, mention, poll, or update\n const actualStatus = status?.reblog || status;\n const actualStatusID = actualStatus?.id;\n\n const currentAccount = getCurrentAccountID();\n const isSelf = currentAccount === account?.id;\n const isVoted = status?.poll?.voted;\n const isReplyToOthers =\n !!status?.inReplyToAccountId &&\n status?.inReplyToAccountId !== currentAccount &&\n status?.account?.id === currentAccount;\n\n let favsCount = 0;\n let reblogsCount = 0;\n if (type === 'favourite+reblog') {\n if (_accounts) {\n for (const account of _accounts) {\n if (account._types?.includes('favourite')) {\n favsCount++;\n }\n if (account._types?.includes('reblog')) {\n reblogsCount++;\n }\n }\n }\n if (!reblogsCount && favsCount) type = 'favourite';\n if (!favsCount && reblogsCount) type = 'reblog';\n }\n\n let text;\n if (type === 'poll') {\n text = contentText[isSelf ? 'poll-self' : isVoted ? 'poll-voted' : 'poll'];\n } else if (contentText[type]) {\n text = contentText[type];\n } else {\n // Anticipate unhandled notification types, possibly from Mastodon forks or non-Mastodon instances\n // This surfaces the error to the user, hoping that users will report it\n text = t`[Unknown notification type: ${type}]`;\n }\n\n const Subject = ({ clickable, ...props }) =>\n clickable ? (\n <b tabIndex=\"0\" onClick={handleOpenGenericAccounts} {...props} />\n ) : (\n <b {...props} />\n );\n\n const diffCount =\n notificationsCount > 0 && notificationsCount > sampleAccounts?.length;\n const expandAccounts = diffCount ? 'remote' : 'local';\n\n if (typeof text === 'function') {\n const count =\n (type === 'favourite' || type === 'reblog') && notificationsCount\n ? diffCount\n ? notificationsCount\n : sampleAccounts?.length\n : _accounts?.length || sampleAccounts?.length || (account ? 1 : 0);\n const postsCount = _statuses?.length || (status ? 1 : 0);\n if (type === 'admin.report') {\n const targetAccount = report?.targetAccount;\n if (targetAccount) {\n text = text({\n account: <NameText account={account} showAvatar />,\n targetAccount: <NameText account={targetAccount} showAvatar />,\n });\n }\n } else if (type === 'severed_relationships') {\n const targetName = event?.targetName;\n if (targetName) {\n text = text({ name: targetName });\n }\n } else if (\n (type === 'emoji_reaction' || type === 'pleroma:emoji_reaction') &&\n notification.emoji\n ) {\n const emojiURL =\n notification.emoji_url || // This is string\n status?.emojis?.find?.(\n (emoji) =>\n emoji?.shortcode ===\n notification.emoji.replace(/^:/, '').replace(/:$/, ''),\n ); // Emoji object instead of string\n text = text({\n account: <NameText account={account} showAvatar />,\n emoji: notification.emoji,\n emojiURL,\n });\n } else if (type === 'annual_report') {\n text = text({\n ...notification.annualReport,\n });\n } else {\n text = text({\n account: account ? (\n <NameText account={account} showAvatar />\n ) : (\n sampleAccounts?.[0] && (\n <NameText account={sampleAccounts[0]} showAvatar />\n )\n ),\n count,\n postsCount,\n postType: isReplyToOthers ? 'reply' : 'post',\n components: { Subject },\n });\n }\n }\n\n const formattedCreatedAt =\n notification.createdAt && new Date(notification.createdAt).toLocaleString();\n\n const genericAccountsHeading =\n {\n 'favourite+reblog': t`Boosted/Liked by…`,\n favourite: t`Liked by…`,\n reblog: t`Boosted by…`,\n follow: t`Followed by…`,\n }[type] || t`Accounts`;\n const handleOpenGenericAccounts = () => {\n states.showGenericAccounts = {\n heading: genericAccountsHeading,\n accounts: _accounts,\n showReactions: type === 'favourite+reblog',\n excludeRelationshipAttrs: type === 'follow' ? ['followedBy'] : [],\n postID: statusKey(actualStatusID, instance),\n };\n };\n\n console.debug('RENDER Notification', notification.id);\n\n // If there's a status and filter action is 'hide', then the notification is hidden\n if (!!status?.filtered) {\n const isOwnPost = status?.account?.id === currentAccount;\n const filterInfo = isFiltered(status.filtered, 'notifications');\n if (!isSelf && !isOwnPost && filterInfo?.action === 'hide') {\n return null;\n }\n }\n\n return (\n <div\n class={`notification notification-${type}`}\n data-notification-id={_ids || id}\n data-group-key={_groupKeys?.join(' ') || groupKey}\n tabIndex=\"0\"\n >\n <div\n class={`notification-type notification-${type}`}\n title={formattedCreatedAt}\n >\n {type === 'favourite+reblog' ? (\n <>\n <Icon icon=\"rocket\" size=\"xl\" alt={type} class=\"reblog-icon\" />\n <Icon icon=\"heart\" size=\"xl\" alt={type} class=\"favourite-icon\" />\n </>\n ) : (\n <Icon\n icon={NOTIFICATION_ICONS[type] || 'notification'}\n size=\"xl\"\n alt={type}\n />\n )}\n </div>\n <div class=\"notification-content\">\n {/* {(type === 'favourite+reblog' ||\n type === 'favourite' ||\n type === 'reblog') && (\n <>\n 💥 {type} {expandAccounts}{' '}\n <mark>\n N{_notificationsCount?.join(',')} + A\n {_sampleAccountsCount?.join(',')}\n </mark>{' '}\n ‒{' '}\n <mark>\n N{notificationsCount} + A{sampleAccounts?.length}\n </mark>\n </>\n )} */}\n {type !== 'mention' && type !== 'quote' && (\n <>\n <p>{text}</p>\n {type === 'follow_request' && (\n <FollowRequestButtons accountID={account.id} />\n )}\n {type === 'severed_relationships' && (\n <div>\n {SEVERED_RELATIONSHIPS_TEXT[event.type]({\n from: instance,\n ...event,\n })}\n <br />\n <a\n href={`https://${instance}/severed_relationships`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>\n Learn more <Icon icon=\"external\" size=\"s\" />\n </Trans>\n </a>\n .\n </div>\n )}\n {type === 'moderation_warning' && !!moderation_warning && (\n <div>\n {_(MODERATION_WARNING_TEXT[moderation_warning.action]())}\n <br />\n <a\n href={`/disputes/strikes/${moderation_warning.id}`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n <Trans>\n Learn more <Icon icon=\"external\" size=\"s\" />\n </Trans>\n </a>\n </div>\n )}\n {type === 'annual_report' && (\n <div>\n <Link to={`/annual_report/${annualReport?.year}`}>\n <Trans>View #Wrapstodon</Trans>\n </Link>\n </div>\n )}\n </>\n )}\n {_accounts?.length > 1 && (\n <p class=\"avatars-stack\">\n {_accounts.slice(0, AVATARS_LIMIT).map((account) => (\n <Fragment key={account.id}>\n <a\n key={account.id}\n href={account.url}\n rel=\"noopener\"\n class=\"account-avatar-stack\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = account;\n }}\n >\n <Avatar\n url={account.avatarStatic}\n size={\n _accounts.length <= 10\n ? 'xxl'\n : _accounts.length < 20\n ? 'xl'\n : 'l'\n }\n key={account.id}\n alt={`${account.displayName} @${account.acct}`}\n squircle={account?.bot}\n />\n {type === 'favourite+reblog' && (\n <div class=\"account-sub-icons\">\n {account._types.map((type) => (\n <Icon\n icon={NOTIFICATION_ICONS[type]}\n size=\"s\"\n class={`${type}-icon`}\n />\n ))}\n </div>\n )}\n </a>{' '}\n </Fragment>\n ))}\n {(type === 'favourite+reblog' ||\n type === 'favourite' ||\n type === 'reblog') &&\n expandAccounts === 'remote' ? (\n <button\n type=\"button\"\n class=\"small plain\"\n data-group-keys={_groupKeys?.join(' ')}\n onClick={() => {\n states.showGenericAccounts = {\n heading: genericAccountsHeading,\n accounts: _accounts,\n fetchAccounts: async () => {\n const keyAccounts = await Promise.allSettled(\n _groupKeys.map(async (gKey) => {\n const iterator = masto.v2.notifications\n .$select(gKey)\n .accounts.list()\n .values();\n return [gKey, (await iterator.next()).value];\n }),\n );\n const accounts = [];\n for (const keyAccount of keyAccounts) {\n const [key, _accounts] = keyAccount.value;\n const type = /^favourite/.test(key)\n ? 'favourite'\n : /^reblog/.test(key)\n ? 'reblog'\n : null;\n if (!type) continue;\n for (const account of _accounts) {\n const theAccount = accounts.find(\n (a) => a.id === account.id,\n );\n if (theAccount) {\n theAccount._types.push(type);\n } else {\n account._types = [type];\n accounts.push(account);\n }\n }\n }\n return {\n done: true,\n value: accounts,\n };\n },\n showReactions: type === 'favourite+reblog',\n postID: statusKey(actualStatusID, instance),\n };\n }}\n >\n +\n {(type === 'favourite' || type === 'reblog') &&\n notificationsCount - _accounts.length}\n <Icon icon=\"chevron-down\" />\n </button>\n ) : (\n <button\n type=\"button\"\n class=\"small plain\"\n onClick={handleOpenGenericAccounts}\n >\n {_accounts.length > AVATARS_LIMIT &&\n `+${_accounts.length - AVATARS_LIMIT}`}\n <Icon icon=\"chevron-down\" />\n </button>\n )}\n </p>\n )}\n {!_accounts?.length && sampleAccounts?.length > 1 && (\n <p class=\"avatars-stack\">\n {sampleAccounts.map((account) => (\n <Fragment key={account.id}>\n <a\n key={account.id}\n href={account.url}\n rel=\"noopener\"\n class=\"account-avatar-stack\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = account;\n }}\n >\n <Avatar\n url={account.avatarStatic}\n size=\"xxl\"\n key={account.id}\n alt={`${account.displayName} @${account.acct}`}\n squircle={account?.bot}\n />\n {/* {type === 'favourite+reblog' && (\n <div class=\"account-sub-icons\">\n {account._types.map((type) => (\n <Icon\n icon={NOTIFICATION_ICONS[type]}\n size=\"s\"\n class={`${type}-icon`}\n />\n ))}\n </div>\n )} */}\n </a>{' '}\n </Fragment>\n ))}\n {notificationsCount > sampleAccounts.length && (\n <Link\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n class=\"button small plain centered\"\n >\n +{notificationsCount - sampleAccounts.length}\n <Icon icon=\"chevron-right\" />\n </Link>\n )}\n </p>\n )}\n {_statuses?.length > 1 && (\n <ul class=\"notification-group-statuses\">\n {_statuses.map((status) => (\n <li key={status.id}>\n <TruncatedLink\n class={`status-link status-type-${type}`}\n to={\n instance ? `/${instance}/s/${status.id}` : `/s/${status.id}`\n }\n >\n <Status\n status={status}\n size=\"s\"\n previewMode\n allowContextMenu\n allowFilters\n />\n </TruncatedLink>\n </li>\n ))}\n </ul>\n )}\n {status && (!_statuses?.length || _statuses?.length <= 1) && (\n <TruncatedLink\n class={`status-link status-type-${type}`}\n to={\n instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`\n }\n onContextMenu={\n !disableContextMenu\n ? (e) => {\n const post = e.target.querySelector('.status');\n if (post) {\n // Fire a custom event to open the context menu\n if (e.metaKey) return;\n e.preventDefault();\n post.dispatchEvent(\n new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n }),\n );\n }\n }\n : undefined\n }\n >\n {isStatic ? (\n <Status\n status={actualStatus}\n size=\"s\"\n readOnly\n allowContextMenu\n allowFilters\n />\n ) : (\n <Status\n statusID={actualStatusID}\n size=\"s\"\n readOnly\n allowContextMenu\n allowFilters\n />\n )}\n </TruncatedLink>\n )}\n </div>\n </div>\n );\n}\n\nfunction TruncatedLink(props) {\n const ref = useTruncated();\n return <Link {...props} data-read-more={t`Read more →`} ref={ref} />;\n}\n\nexport default memo(Notification, (oldProps, newProps) => {\n return oldProps.notification?.id === newProps.notification?.id;\n});\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport states from '../utils/states';\nimport {\n getAccountByAccessToken,\n getCurrentAccount,\n} from '../utils/store-utils';\nimport usePageVisibility from '../utils/usePageVisibility';\n\nimport Icon from './icon';\nimport Link from './link';\nimport Modal from './modal';\nimport Notification from './notification';\n\n{\n if ('serviceWorker' in navigator) {\n console.log('👂👂👂 Listen to message');\n navigator.serviceWorker.addEventListener('message', (event) => {\n console.log('💥💥💥 Message event', event);\n const { type, id, accessToken } = event?.data || {};\n if (type === 'notification') {\n states.routeNotification = {\n id,\n accessToken,\n };\n }\n });\n }\n}\n\nexport default memo(function NotificationService() {\n const { t } = useLingui();\n if (!('serviceWorker' in navigator)) return null;\n\n const snapStates = useSnapshot(states);\n const { routeNotification } = snapStates;\n\n console.log('🛎️ Notification service', routeNotification);\n\n const { id, accessToken } = routeNotification || {};\n const [showNotificationSheet, setShowNotificationSheet] = useState(false);\n\n useLayoutEffect(() => {\n if (!id || !accessToken) return;\n const { instance: currentInstance } = api();\n const { masto, instance } = api({\n accessToken,\n });\n console.log('API', { accessToken, currentInstance, instance });\n const sameInstance = currentInstance === instance;\n const account = accessToken\n ? getAccountByAccessToken(accessToken)\n : getCurrentAccount();\n (async () => {\n const notification = await masto.v1.notifications.$select(id).fetch();\n if (notification && account) {\n console.log('🛎️ Notification', { id, notification, account });\n const accountInstance = account.instanceURL;\n const { type, status, account: notificationAccount } = notification;\n const hasModal = !!document.querySelector('#modal-container > *');\n const isFollow = type === 'follow' && !!notificationAccount?.id;\n const hasAccount = !!notificationAccount?.id;\n const hasStatus = !!status?.id;\n if (isFollow && sameInstance) {\n // Show account sheet, can handle different instances\n states.showAccount = {\n account: notificationAccount,\n instance: accountInstance,\n };\n } else if (hasModal || !sameInstance || (hasAccount && hasStatus)) {\n // Show sheet of notification, if\n // - there is a modal open\n // - the notification is from another instance\n // - the notification has both account and status, gives choice for users to go to account or status\n setShowNotificationSheet({\n id,\n account,\n notification,\n sameInstance,\n });\n } else {\n if (hasStatus) {\n // Go to status page\n location.hash = `/${currentInstance}/s/${status.id}`;\n } else if (isFollow) {\n // Go to profile page\n location.hash = `/${currentInstance}/a/${notificationAccount.id}`;\n } else {\n // Go to notifications page\n location.hash = '/notifications';\n }\n }\n } else {\n console.warn('🛎️ Notification not found', id);\n }\n })();\n }, [id, accessToken]);\n\n // useLayoutEffect(() => {\n // // Listen to message from service worker\n // const handleMessage = (event) => {\n // console.log('💥💥💥 Message event', event);\n // const { type, id, accessToken } = event?.data || {};\n // if (type === 'notification') {\n // states.routeNotification = {\n // id,\n // accessToken,\n // };\n // }\n // };\n // console.log('👂👂👂 Listen to message');\n // navigator.serviceWorker.addEventListener('message', handleMessage);\n // return () => {\n // console.log('👂👂👂 Remove listen to message');\n // navigator.serviceWorker.removeEventListener('message', handleMessage);\n // };\n // }, []);\n\n useLayoutEffect(() => {\n if (navigator?.clearAppBadge) {\n navigator.clearAppBadge();\n }\n }, []);\n usePageVisibility((visible) => {\n if (visible && navigator?.clearAppBadge) {\n console.log('🔰 Clear app badge');\n navigator.clearAppBadge();\n }\n });\n\n const onClose = () => {\n setShowNotificationSheet(false);\n states.routeNotification = null;\n\n // If url is #/notifications?id=123, go to #/notifications\n if (/\\/notifications\\?id=/i.test(location.hash)) {\n location.hash = '/notifications';\n }\n };\n\n if (showNotificationSheet) {\n const { id, account, notification, sameInstance } = showNotificationSheet;\n return (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n }}\n >\n <div class=\"sheet\" tabIndex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <b>\n <Trans>Notification</Trans>\n </b>\n </header>\n <main>\n {!sameInstance && (\n <p>\n <Trans>This notification is from your other account.</Trans>\n </p>\n )}\n <div\n class=\"notification-peek\"\n // style={{\n // pointerEvents: sameInstance ? '' : 'none',\n // }}\n onClick={(e) => {\n const { target } = e;\n // If button or links\n if (e.target.tagName === 'BUTTON' || e.target.tagName === 'A') {\n onClose();\n }\n }}\n >\n <Notification\n instance={account.instanceURL}\n notification={notification}\n isStatic\n />\n </div>\n <div\n style={{\n textAlign: 'end',\n }}\n >\n <Link to=\"/notifications\" class=\"button light\" onClick={onClose}>\n <span>\n <Trans>View all notifications</Trans>\n </span>{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n </main>\n </div>\n </Modal>\n );\n }\n\n return null;\n});\n","import store from './store';\n\nexport const getSearchHistory = ({ limit } = {}) => {\n const history = store.account.get('searchHistory') || [];\n return limit ? history.slice(0, limit) : history;\n};\n\nconst MAX_HISTORY_LENGTH = 10;\nexport const addToSearchHistory = (query, queryType = null) => {\n if (!query?.trim?.()) return;\n\n const history = getSearchHistory();\n const existingIndex = history.findIndex(\n (item) => item.query === query && item.queryType === queryType,\n );\n\n // LRU\n // Remove existing entry if found\n if (existingIndex !== -1) {\n history.splice(existingIndex, 1);\n }\n // Add to beginning (most recent)\n history.unshift({\n query: query.trim(),\n queryType,\n timestamp: Date.now(),\n });\n const limitedHistory = history.slice(0, MAX_HISTORY_LENGTH);\n\n store.account.set('searchHistory', limitedHistory);\n};\n\nexport const removeFromSearchHistory = (query, queryType = null) => {\n const history = getSearchHistory();\n const filteredHistory = history.filter(\n (item) => !(item.query === query && item.queryType === queryType),\n );\n store.account.set('searchHistory', filteredHistory);\n};\n\nexport const clearAllSearchHistory = () => {\n store.account.set('searchHistory', []);\n};\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { forwardRef } from 'preact/compat';\nimport { useImperativeHandle, useMemo, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport { api } from '../utils/api';\nimport { addToSearchHistory, getSearchHistory } from '../utils/search-history';\n\nimport Icon from './icon';\nimport Link from './link';\n\n// Helper function to generate search item data (label and URL)\nexport const generateSearchItemData = (query, queryType, instance) => {\n let label, to, icon;\n\n if (queryType === 'statuses') {\n label = (\n <Trans>\n Posts with <q>{query}</q>\n </Trans>\n );\n to = `/search?q=${encodeURIComponent(query)}&type=statuses`;\n icon = 'document';\n } else if (queryType === 'accounts') {\n label = (\n <Trans>\n Accounts with <q>{query}</q>\n </Trans>\n );\n to = `/search?q=${encodeURIComponent(query)}&type=accounts`;\n icon = 'group';\n } else if (queryType === 'hashtags') {\n const hashSymbol = query[0]; // Preserve original # or #\n const hashtagText = query.replace(/^[##]/, '');\n const hashtag = `${hashSymbol}${hashtagText}`;\n label = (\n <Trans>\n Posts tagged with <mark>{hashtag}</mark>\n </Trans>\n );\n to = `/${instance}/t/${hashtagText}`;\n icon = 'hashtag';\n } else {\n // Default/general search\n label = (\n <Trans>\n {query}{' '}\n <small class=\"insignificant\">‒ accounts, hashtags & posts</small>\n </Trans>\n );\n to = `/search?q=${encodeURIComponent(query)}`;\n icon = 'search';\n }\n\n return { label, to, icon };\n};\n\nconst SearchForm = forwardRef((props, ref) => {\n const { t } = useLingui();\n const { instance } = api();\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchMenuOpen, setSearchMenuOpen] = useState(false);\n const [query, setQuery] = useState(searchParams.get('q') || '');\n const type = searchParams.get('type');\n const formRef = useRef(null);\n\n const searchFieldRef = useRef(null);\n useImperativeHandle(ref, () => ({\n setValue: (value) => {\n setQuery(value);\n },\n focus: () => {\n searchFieldRef.current.focus();\n },\n select: () => {\n searchFieldRef.current.select();\n },\n blur: () => {\n searchFieldRef.current.blur();\n },\n }));\n\n const searchHistory = useMemo(\n () => getSearchHistory({ limit: 5 }),\n [props?.hidden],\n );\n\n const searchSuggestionsData = useMemo(() => {\n if (!query) return [];\n\n const matchingHistory = searchHistory\n .filter((historyItem) => {\n // Filter out exact matches with current query\n if (historyItem.query === query) return false;\n // Check if history item contains the current query (case insensitive)\n return historyItem.query.toLowerCase().includes(query.toLowerCase());\n })\n .slice(0, 2); // Max 2 recent searches\n\n const recentSearchItems = matchingHistory.map((historyItem) => ({\n ...generateSearchItemData(\n historyItem.query,\n historyItem.queryType,\n instance,\n ),\n queryType: historyItem.queryType,\n isRecentSearch: true,\n historyItem,\n }));\n\n const allItems = [\n // General search\n {\n ...generateSearchItemData(query, null, instance),\n top: !type && !/\\s/.test(query),\n hidden: !!type,\n },\n // Recent searches\n ...recentSearchItems,\n // Posts search\n {\n ...generateSearchItemData(query, 'statuses', instance),\n hidden: /^https?:/.test(query),\n top: /\\s/.test(query),\n queryType: 'statuses',\n },\n // Hashtag search\n {\n ...generateSearchItemData(query, 'hashtags', instance),\n hidden:\n /^[@@]/.test(query) || /^https?:/.test(query) || /\\s/.test(query),\n top: /^[##]/.test(query),\n type: 'link',\n queryType: 'hashtags',\n },\n // URL lookup (unique case)\n {\n label: (\n <Trans>\n Look up <mark>{query}</mark>\n </Trans>\n ),\n to: `/${query}`,\n hidden: !/^https?:/.test(query),\n top: /^https?:/.test(query),\n type: 'link',\n icon: 'arrow-right',\n },\n // Accounts search\n {\n ...generateSearchItemData(query, 'accounts', instance),\n queryType: 'accounts',\n },\n ];\n\n return allItems\n .sort((a, b) => {\n if (type) {\n if (a.queryType === type) return -1;\n if (b.queryType === type) return 1;\n }\n if (a.top && !b.top) return -1;\n if (!a.top && b.top) return 1;\n return 0;\n })\n .filter(({ hidden }) => !hidden);\n }, [query, type, instance]);\n\n return (\n <form\n ref={formRef}\n class=\"search-popover-container\"\n onSubmit={(e) => {\n e.preventDefault();\n\n const isSearchPage = /\\/search/.test(location.hash);\n if (isSearchPage) {\n if (query) {\n const params = {\n q: query,\n };\n if (type) params.type = type; // Preserve type\n setSearchParams(params);\n } else {\n setSearchParams({});\n }\n } else {\n if (query) {\n location.hash = `/search?q=${encodeURIComponent(query)}${\n type ? `&type=${type}` : ''\n }`;\n } else {\n location.hash = `/search`;\n }\n }\n\n addToSearchHistory(query, type);\n\n props?.onSubmit?.(e);\n }}\n >\n <input\n ref={searchFieldRef}\n value={query}\n name=\"q\"\n type=\"search\"\n // autofocus\n placeholder={t`Search`}\n dir=\"auto\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck=\"false\"\n onSearch={(e) => {\n if (!e.target.value) {\n setSearchParams({});\n }\n }}\n onInput={(e) => {\n setQuery(e.target.value);\n setSearchMenuOpen(true);\n }}\n onFocus={() => {\n setSearchMenuOpen(true);\n // Focus first item\n const firstItem = formRef.current?.querySelector(\n '.search-popover-item',\n );\n if (firstItem) {\n firstItem.classList.add('focus');\n }\n }}\n onBlur={() => {\n setTimeout(() => {\n setSearchMenuOpen(false);\n }, 100);\n formRef.current\n ?.querySelector('.search-popover-item.focus')\n ?.classList.remove('focus');\n }}\n onKeyDown={(e) => {\n const { key } = e;\n switch (key) {\n case 'Escape':\n setSearchMenuOpen(false);\n break;\n case 'Down':\n case 'ArrowDown':\n e.preventDefault();\n if (searchMenuOpen) {\n const focusItem = formRef.current.querySelector(\n '.search-popover-item.focus',\n );\n if (focusItem) {\n let nextItem = focusItem.nextElementSibling;\n while (nextItem && nextItem.hidden) {\n nextItem = nextItem.nextElementSibling;\n }\n if (nextItem) {\n nextItem.classList.add('focus');\n const siblings = Array.from(\n nextItem.parentElement.children,\n ).filter((el) => el !== nextItem);\n siblings.forEach((el) => {\n el.classList.remove('focus');\n });\n }\n } else {\n const firstItem = formRef.current.querySelector(\n '.search-popover-item',\n );\n if (firstItem) {\n firstItem.classList.add('focus');\n }\n }\n }\n break;\n case 'Up':\n case 'ArrowUp':\n e.preventDefault();\n if (searchMenuOpen) {\n const focusItem = document.querySelector(\n '.search-popover-item.focus',\n );\n if (focusItem) {\n let prevItem = focusItem.previousElementSibling;\n while (prevItem && prevItem.hidden) {\n prevItem = prevItem.previousElementSibling;\n }\n if (prevItem) {\n prevItem.classList.add('focus');\n const siblings = Array.from(\n prevItem.parentElement.children,\n ).filter((el) => el !== prevItem);\n siblings.forEach((el) => {\n el.classList.remove('focus');\n });\n }\n } else {\n const items = document.querySelectorAll(\n '.search-popover-item',\n );\n const lastItem = items[items.length - 1];\n if (lastItem) {\n lastItem.classList.add('focus');\n }\n }\n }\n break;\n case 'Enter':\n if (searchMenuOpen) {\n const focusItem = document.querySelector(\n '.search-popover-item.focus',\n );\n if (focusItem) {\n e.preventDefault();\n focusItem.click();\n }\n setSearchMenuOpen(false);\n props?.onSubmit?.(e);\n }\n break;\n }\n }}\n />\n <div class=\"search-popover\" hidden={!searchMenuOpen}>\n {/* Search History - show when no query */}\n {!query && searchHistory.length > 0 && (\n <div class=\"search-popover-recent-searches\">\n <div class=\"search-popover-header\">\n <Icon icon=\"history\" size=\"s\" />\n <Trans>Recent searches</Trans>\n </div>\n {searchHistory.map((historyItem, i) => {\n const { label, to, icon } = generateSearchItemData(\n historyItem.query,\n historyItem.queryType,\n instance,\n );\n\n return (\n <Link\n key={`${historyItem.query}-${historyItem.queryType}-${historyItem.timestamp}`}\n to={to}\n class={`search-popover-item ${i === 0 ? 'focus' : ''}`}\n onClick={(e) => {\n addToSearchHistory(\n historyItem.query,\n historyItem.queryType,\n );\n props?.onSubmit?.(e);\n }}\n >\n <Icon icon={icon} class=\"more-insignificant\" />\n <span>{label}</span>\n </Link>\n );\n })}\n <Link\n to=\"/search\"\n class=\"search-popover-item search-history-see-all\"\n >\n <Icon icon=\"more2\" class=\"more-insignificant\" />\n <span>\n <Trans>See all</Trans>\n </span>\n </Link>\n </div>\n )}\n\n {/* Search Suggestions - show when there's a query */}\n {searchSuggestionsData.map(\n ({ label, to, icon, queryType, isRecentSearch, historyItem }, i) => (\n <Link\n key={\n isRecentSearch\n ? `recent-${historyItem.query}-${historyItem.queryType}-${historyItem.timestamp}`\n : `suggestion-${queryType || 'general'}-${i}`\n }\n to={to}\n class={`search-popover-item ${isRecentSearch ? 'search-popover-item-recent' : ''} ${i === 0 ? 'focus' : ''}`}\n onClick={(e) => {\n if (!isRecentSearch) {\n addToSearchHistory(query, queryType);\n }\n props?.onSubmit?.(e);\n }}\n >\n <Icon icon={icon} class=\"more-insignificant\" />\n <span>{label}</span>\n </Link>\n ),\n )}\n </div>\n </form>\n );\n});\n\nexport default SearchForm;\n","import './search-command.css';\n\nimport { memo } from 'preact/compat';\nimport { useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\n\nimport SearchForm from './search-form';\n\nexport default memo(function SearchCommand({ onClose = () => {} }) {\n const [showSearch, setShowSearch] = useState(false);\n const searchFormRef = useRef(null);\n\n useHotkeys(\n ['Slash', '/'],\n (e) => {\n setShowSearch(true);\n setTimeout(() => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n }, 0);\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => {\n const isSearchPage = /\\/search/.test(location.hash);\n const hasModal = !!document.querySelector('#modal-container > *');\n return (\n isSearchPage ||\n hasModal ||\n e.metaKey ||\n e.ctrlKey ||\n e.altKey ||\n e.shiftKey\n );\n },\n },\n );\n\n const closeSearch = () => {\n setShowSearch(false);\n onClose();\n };\n\n useHotkeys(\n 'esc',\n (e) => {\n searchFormRef.current?.blur?.();\n closeSearch();\n },\n {\n enabled: showSearch,\n enableOnFormTags: true,\n preventDefault: true,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const hidden = !showSearch;\n\n return (\n <div\n id=\"search-command-container\"\n hidden={hidden}\n onClick={(e) => {\n console.log(e);\n if (e.target === e.currentTarget) {\n closeSearch();\n }\n }}\n >\n <SearchForm\n ref={searchFormRef}\n hidden={hidden}\n onSubmit={() => {\n closeSearch();\n }}\n />\n </div>\n );\n});\n","import './shortcuts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useNavigate } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport { SHORTCUTS_META } from '../components/shortcuts-settings';\nimport { api } from '../utils/api';\nimport { getLists } from '../utils/lists';\nimport states from '../utils/states';\n\nimport AsyncText from './AsyncText';\nimport Icon from './icon';\nimport Link from './link';\nimport ListExclusiveBadge from './list-exclusive-badge';\nimport MenuLink from './menu-link';\nimport Menu2 from './menu2';\nimport SubMenu2 from './submenu2';\n\nfunction Shortcuts() {\n const { t, _ } = useLingui();\n const { instance } = api();\n const snapStates = useSnapshot(states);\n const { shortcuts, settings } = snapStates;\n\n if (!shortcuts.length) {\n return null;\n }\n const isMultiColumnMode =\n settings.shortcutsViewMode === 'multi-column' ||\n (!settings.shortcutsViewMode && settings.shortcutsColumnsMode);\n\n const menuRef = useRef();\n const tabBarRef = useRef();\n\n const hasLists = useRef(false);\n const formattedShortcuts = shortcuts\n .map((pin, i) => {\n const { type, ...data } = pin;\n if (!SHORTCUTS_META[type]) return null;\n let { id, path, title, subtitle, icon } = SHORTCUTS_META[type];\n\n if (typeof id === 'function') {\n id = id(data, i);\n }\n if (typeof path === 'function') {\n path = path(\n {\n ...data,\n instance: data.instance || instance,\n },\n i,\n );\n }\n if (typeof title === 'function') {\n title = title(data, i);\n } else if (title?.id) {\n // Check if it's MessageDescriptor\n title = _(title);\n }\n if (typeof subtitle === 'function') {\n subtitle = subtitle(data, i);\n } else if (subtitle?.id) {\n // Check if it's MessageDescriptor\n subtitle = _(subtitle);\n }\n if (typeof icon === 'function') {\n icon = icon(data, i);\n }\n\n if (id === 'lists') {\n hasLists.current = true;\n }\n\n return {\n id,\n path,\n title,\n subtitle,\n icon,\n };\n })\n .filter(Boolean);\n\n // Auto-scroll to active tab on first render\n useEffect(() => {\n if (\n snapStates.settings.shortcutsViewMode === 'tab-menu-bar' &&\n tabBarRef.current\n ) {\n const timeoutId = setTimeout(() => {\n const activeTab = tabBarRef.current?.querySelector('.is-active');\n if (activeTab) {\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }\n }, []);\n\n const navigate = useNavigate();\n useHotkeys(\n ['1', '2', '3', '4', '5', '6', '7', '8', '9'],\n (e) => {\n const index = parseInt(e.key, 10) - 1;\n if (index < formattedShortcuts.length) {\n const { path } = formattedShortcuts[index];\n if (path) {\n navigate(path);\n menuRef.current?.closeMenu?.();\n }\n }\n },\n {\n enabled: !isMultiColumnMode,\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const [lists, setLists] = useState([]);\n\n if (isMultiColumnMode) {\n return null;\n }\n\n return (\n <div id=\"shortcuts\">\n {snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? (\n <nav\n ref={tabBarRef}\n class=\"tab-bar\"\n onContextMenu={(e) => {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }}\n >\n <ul>\n {formattedShortcuts.map(\n ({ id, path, title, subtitle, icon }, i) => {\n return (\n <li key={`${i}-${id}-${title}-${subtitle}-${path}`}>\n <Link\n class={subtitle ? 'has-subtitle' : ''}\n to={path}\n onClick={(e) => {\n if (e.target.classList.contains('is-active')) {\n e.preventDefault();\n const page = document.getElementById(`${id}-page`);\n console.log(id, page);\n if (page) {\n page.scrollTop = 0;\n const updatesButton =\n page.querySelector('.updates-button');\n if (updatesButton) {\n updatesButton.click();\n }\n }\n }\n }}\n >\n <Icon icon={icon} size=\"xl\" />\n <span>\n <AsyncText>{title}</AsyncText>\n {subtitle && (\n <>\n <br />\n <small>{subtitle}</small>\n </>\n )}\n </span>\n </Link>\n </li>\n );\n },\n )}\n </ul>\n </nav>\n ) : (\n <Menu2\n instanceRef={menuRef}\n overflow=\"auto\"\n viewScroll=\"close\"\n menuClassName=\"glass-menu shortcuts-menu\"\n gap={8}\n position=\"anchor\"\n onMenuChange={(e) => {\n if (e.open && hasLists.current) {\n getLists().then(setLists);\n }\n }}\n menuButton={\n <button\n type=\"button\"\n id=\"shortcuts-button\"\n class=\"plain\"\n onContextMenu={(e) => {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }}\n onTransitionStart={(e) => {\n // Close menu if the button disappears\n try {\n const { target } = e;\n if (getComputedStyle(target).pointerEvents === 'none') {\n menuRef.current?.closeMenu?.();\n }\n } catch (e) {}\n }}\n >\n <Icon icon=\"shortcut\" size=\"xl\" alt={t`Shortcuts`} />\n </button>\n }\n >\n {formattedShortcuts.map(({ id, path, title, subtitle, icon }, i) => {\n if (id === 'lists') {\n return (\n <SubMenu2\n menuClassName=\"glass-menu\"\n overflow=\"auto\"\n gap={-8}\n label={\n <>\n <Icon icon={icon} size=\"l\" />\n <span class=\"menu-grow\">\n <AsyncText>{title}</AsyncText>\n </span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/l\">\n <span>\n <Trans>All Lists</Trans>\n </span>\n </MenuLink>\n <MenuDivider />\n {lists?.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge />\n </>\n )}\n </span>\n </MenuLink>\n ))}\n </SubMenu2>\n );\n }\n\n return (\n <MenuLink\n to={path}\n key={`${i}-${id}-${title}-${subtitle}-${path}`}\n class=\"glass-menu-item\"\n >\n <Icon icon={icon} size=\"l\" />{' '}\n <span class=\"menu-grow\">\n <span>\n <AsyncText>{title}</AsyncText>\n </span>\n {subtitle && (\n <>\n {' '}\n <small class=\"more-insignificant\">{subtitle}</small>\n </>\n )}\n </span>\n <span class=\"menu-shortcut hide-until-focus-visible\">\n {i + 1}\n </span>\n </MenuLink>\n );\n })}\n </Menu2>\n )}\n </div>\n );\n}\n\nexport default memo(Shortcuts);\n","import { api } from './api';\nimport { extractTagsFromStatus, getFollowedTags } from './followed-tags';\nimport pmem from './pmem';\nimport { fetchRelationships } from './relationships';\nimport states, { saveStatus, statusKey } from './states';\nimport store from './store';\nimport supports from './supports';\n\nexport function groupBoosts(values) {\n let newValues = [];\n let boostStash = [];\n let serialBoosts = 0;\n for (let i = 0; i < values.length; i++) {\n const item = values[i];\n if (item.reblog && !item.account?.group) {\n boostStash.push(item);\n serialBoosts++;\n } else {\n newValues.push(item);\n if (serialBoosts < 3) {\n serialBoosts = 0;\n }\n }\n }\n // if boostStash is more than quarter of values\n // or if there are 3 or more boosts in a row\n if (\n values.length > 10 &&\n (boostStash.length > values.length / 4 || serialBoosts >= 3)\n ) {\n // if boostStash is more than 3 quarter of values\n const boostStashID = boostStash.map((status) => status.id);\n if (boostStash.length > (values.length * 3) / 4) {\n // insert boost array at the end of specialHome list\n newValues = [\n ...newValues,\n { id: boostStashID, items: boostStash, type: 'boosts' },\n ];\n } else {\n // insert boosts array in the middle of specialHome list\n const half = Math.floor(newValues.length / 2);\n newValues = [\n ...newValues.slice(0, half),\n {\n id: boostStashID,\n items: boostStash,\n type: 'boosts',\n },\n ...newValues.slice(half),\n ];\n }\n return newValues;\n } else {\n return values;\n }\n}\n\nexport function dedupeBoosts(items, instance) {\n const boostedStatusIDs = store.account.get('boostedStatusIDs') || {};\n const filteredItems = items.filter((item) => {\n if (!item.reblog) return true;\n const statusKey = `${instance}-${item.reblog.id}`;\n const boosterID = boostedStatusIDs[statusKey];\n if (boosterID && boosterID !== item.id) {\n console.warn(\n `🚫 Duplicate boost by ${item.account.displayName}`,\n item,\n item.reblog,\n );\n return false;\n } else {\n boostedStatusIDs[statusKey] = item.id;\n }\n return true;\n });\n // Limit to 50\n const keys = Object.keys(boostedStatusIDs);\n if (keys.length > 50) {\n keys.slice(0, keys.length - 50).forEach((key) => {\n delete boostedStatusIDs[key];\n });\n }\n store.account.set('boostedStatusIDs', boostedStatusIDs);\n return filteredItems;\n}\n\nexport function groupContext(items, instance) {\n const contexts = [];\n let contextIndex = 0;\n items.forEach((item) => {\n for (let i = 0; i < contexts.length; i++) {\n if (contexts[i].find((t) => t.id === item.id)) return;\n if (\n contexts[i].find((t) => t.id === item.inReplyToId) ||\n contexts[i].find((t) => t.inReplyToId === item.id)\n ) {\n contexts[i].push(item);\n return;\n }\n }\n const repliedItem = items.find((i) => i.id === item.inReplyToId);\n if (repliedItem) {\n contexts[contextIndex++] = [item, repliedItem];\n }\n });\n\n // Check for cross-item contexts\n // Merge contexts into one if they have a common item (same id)\n for (let i = 0; i < contexts.length; i++) {\n for (let j = i + 1; j < contexts.length; j++) {\n const commonItem = contexts[i].find((t) => contexts[j].includes(t));\n if (commonItem) {\n contexts[i] = [...contexts[i], ...contexts[j]];\n // Remove duplicate items\n contexts[i] = contexts[i].filter(\n (item, index, self) =>\n self.findIndex((t) => t.id === item.id) === index,\n );\n contexts.splice(j, 1);\n j--;\n }\n }\n }\n\n // Sort items by checking inReplyToId\n contexts.forEach((context) => {\n context.sort((a, b) => {\n if (!a.inReplyToId && !b.inReplyToId) {\n return Date.parse(a.createdAt) - Date.parse(b.createdAt);\n }\n if (a.inReplyToId === b.id) return 1;\n if (b.inReplyToId === a.id) return -1;\n if (!a.inReplyToId) return -1;\n if (!b.inReplyToId) return 1;\n return Date.parse(a.createdAt) - Date.parse(b.createdAt);\n });\n });\n\n // Tag items that has different author than first post's author\n contexts.forEach((context) => {\n const firstItemAccountID = context[0].account.id;\n context.forEach((item) => {\n if (item.account.id !== firstItemAccountID) {\n item._differentAuthor = true;\n }\n });\n });\n\n if (contexts.length) console.log('🧵 Contexts', contexts);\n\n const newItems = [];\n const appliedContextIndices = [];\n const inReplyToIds = [];\n items.forEach((item) => {\n if (item.reblog) {\n newItems.push(item);\n return;\n }\n for (let i = 0; i < contexts.length; i++) {\n if (contexts[i].find((t) => t.id === item.id)) {\n if (appliedContextIndices.includes(i)) return;\n const contextItems = contexts[i];\n contextItems.sort((a, b) => {\n return Date.parse(a.createdAt) - Date.parse(b.createdAt);\n });\n const firstItemAccountID = contextItems[0].account.id;\n newItems.push({\n id: contextItems.map((i) => i.id),\n items: contextItems,\n type: contextItems.every((it) => it.account.id === firstItemAccountID)\n ? 'thread'\n : 'conversation',\n });\n appliedContextIndices.push(i);\n return;\n }\n }\n\n // PREPARE FOR REPLY HINTS\n if (item.inReplyToId && item.inReplyToAccountId !== item.account.id) {\n const sKey = statusKey(item.id, instance);\n if (!states.statusReply[sKey]) {\n // If it's a reply and not a thread\n inReplyToIds.push({\n sKey,\n inReplyToId: item.inReplyToId,\n });\n // queueMicrotask(async () => {\n // try {\n // const { masto } = api({ instance });\n // // const replyToStatus = await masto.v1.statuses\n // // .$select(item.inReplyToId)\n // // .fetch();\n // const replyToStatus = await fetchStatus(item.inReplyToId, masto);\n // saveStatus(replyToStatus, instance, {\n // skipThreading: true,\n // skipUnfurling: true,\n // });\n // states.statusReply[sKey] = {\n // id: replyToStatus.id,\n // instance,\n // };\n // } catch (e) {\n // // Silently fail\n // console.error(e);\n // }\n // });\n }\n }\n\n newItems.push(item);\n });\n\n // FETCH AND SHOW REPLY HINTS\n if (inReplyToIds?.length) {\n queueMicrotask(() => {\n const { masto } = api({ instance });\n console.log('REPLYHINT', inReplyToIds);\n\n // Fallback if batch fetch fails or returns nothing or not supported\n async function fallbackFetch() {\n for (let i = 0; i < inReplyToIds.length; i++) {\n const { sKey, inReplyToId } = inReplyToIds[i];\n try {\n const replyToStatus = await fetchStatus(inReplyToId, masto);\n saveStatus(replyToStatus, instance, {\n skipThreading: true,\n });\n states.statusReply[sKey] = {\n id: replyToStatus.id,\n instance,\n };\n // Pause 1s\n await new Promise((resolve) => setTimeout(resolve, 1000));\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n }\n }\n\n if (supports('@mastodon/fetch-multiple-statuses')) {\n // This is batch fetching yooo, woot\n // Limit 20, returns 422 if exceeded https://github.com/mastodon/mastodon/pull/27871\n const ids = inReplyToIds.map(({ inReplyToId }) => inReplyToId);\n (async () => {\n try {\n const replyToStatuses = await masto.v1.statuses.list({ id: ids });\n if (replyToStatuses?.length) {\n for (const replyToStatus of replyToStatuses) {\n saveStatus(replyToStatus, instance, {\n skipThreading: true,\n });\n const sKey = inReplyToIds.find(\n ({ inReplyToId }) => inReplyToId === replyToStatus.id,\n )?.sKey;\n if (sKey) {\n states.statusReply[sKey] = {\n id: replyToStatus.id,\n instance,\n };\n }\n }\n } else {\n fallbackFetch();\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n fallbackFetch();\n }\n })();\n } else {\n fallbackFetch();\n }\n });\n }\n\n return newItems;\n}\n\nconst fetchStatus = pmem((statusID, masto) => {\n return masto.v1.statuses.$select(statusID).fetch();\n});\n\nexport async function assignFollowedTags(items, instance) {\n const followedTags = await getFollowedTags(); // [{name: 'tag'}, {...}]\n if (!followedTags.length) return;\n const { statusFollowedTags } = states;\n console.log('statusFollowedTags', statusFollowedTags);\n const statusWithFollowedTags = [];\n items.forEach((item) => {\n if (item.reblog) return;\n const { id, content, tags = [] } = item;\n const sKey = statusKey(id, instance);\n if (statusFollowedTags[sKey]?.length) return;\n const extractedTags = extractTagsFromStatus(content);\n if (!extractedTags.length && !tags.length) return;\n const itemFollowedTags = followedTags.reduce((acc, tag) => {\n if (\n extractedTags.some((t) => t.toLowerCase() === tag.name.toLowerCase()) ||\n tags.some((t) => t.name.toLowerCase() === tag.name.toLowerCase())\n ) {\n acc.push(tag.name);\n }\n return acc;\n }, []);\n if (itemFollowedTags.length) {\n // statusFollowedTags[sKey] = itemFollowedTags;\n statusWithFollowedTags.push({\n item,\n sKey,\n followedTags: itemFollowedTags,\n });\n }\n });\n\n if (statusWithFollowedTags.length) {\n const accounts = statusWithFollowedTags.map((s) => s.item.account);\n const relationships = await fetchRelationships(accounts);\n if (!relationships) return;\n\n statusWithFollowedTags.forEach((s) => {\n const { item, sKey, followedTags } = s;\n const r = relationships[item.account.id];\n if (r && !r.following) {\n statusFollowedTags[sKey] = followedTags;\n }\n });\n }\n}\n\nexport function clearFollowedTagsState() {\n states.statusFollowedTags = {};\n}\n","import { useLayoutEffect, useState } from 'preact/hooks';\n\nexport default function useScroll({\n scrollableRef,\n distanceFromStart = 1, // ratio of clientHeight/clientWidth\n distanceFromEnd = 1, // ratio of clientHeight/clientWidth\n scrollThresholdStart = 10,\n scrollThresholdEnd = 10,\n direction = 'vertical',\n distanceFromStartPx: _distanceFromStartPx,\n distanceFromEndPx: _distanceFromEndPx,\n} = {}) {\n const [scrollDirection, setScrollDirection] = useState(null);\n const [reachStart, setReachStart] = useState(false);\n const [reachEnd, setReachEnd] = useState(false);\n const [nearReachStart, setNearReachStart] = useState(false);\n const [nearReachEnd, setNearReachEnd] = useState(false);\n const isVertical = direction === 'vertical';\n\n useLayoutEffect(() => {\n const scrollableElement = scrollableRef.current;\n if (!scrollableElement) return {};\n let previousScrollStart = isVertical\n ? scrollableElement.scrollTop\n : scrollableElement.scrollLeft;\n\n function onScroll() {\n const {\n scrollTop,\n scrollLeft,\n scrollHeight,\n scrollWidth,\n clientHeight,\n clientWidth,\n } = scrollableElement;\n const scrollStart = isVertical ? scrollTop : scrollLeft;\n const scrollDimension = isVertical ? scrollHeight : scrollWidth;\n const clientDimension = isVertical ? clientHeight : clientWidth;\n const scrollDistance = Math.abs(scrollStart - previousScrollStart);\n const distanceFromStartPx =\n _distanceFromStartPx ||\n Math.min(\n clientDimension * distanceFromStart,\n scrollDimension,\n scrollStart,\n );\n const distanceFromEndPx =\n _distanceFromEndPx ||\n Math.min(\n clientDimension * distanceFromEnd,\n scrollDimension,\n scrollDimension - scrollStart - clientDimension,\n );\n\n if (\n scrollDistance >=\n (previousScrollStart < scrollStart\n ? scrollThresholdEnd\n : scrollThresholdStart)\n ) {\n setScrollDirection(previousScrollStart < scrollStart ? 'end' : 'start');\n previousScrollStart = scrollStart;\n }\n\n setReachStart(scrollStart <= 0);\n setReachEnd(scrollStart + clientDimension >= scrollDimension);\n setNearReachStart(scrollStart <= distanceFromStartPx);\n setNearReachEnd(\n scrollStart + clientDimension >= scrollDimension - distanceFromEndPx,\n );\n }\n\n scrollableElement.addEventListener('scroll', onScroll, { passive: true });\n\n return () => scrollableElement.removeEventListener('scroll', onScroll);\n }, [\n distanceFromStart,\n distanceFromEnd,\n scrollThresholdStart,\n scrollThresholdEnd,\n ]);\n\n return {\n scrollDirection,\n reachStart,\n reachEnd,\n nearReachStart,\n nearReachEnd,\n init: () => {\n if (scrollableRef.current) {\n scrollableRef.current.dispatchEvent(new Event('scroll'));\n }\n },\n };\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useThrottledCallback } from 'use-debounce';\n\nexport default function useScrollFn(\n {\n scrollableRef,\n distanceFromStart = 1, // ratio of clientHeight/clientWidth\n distanceFromEnd = 1, // ratio of clientHeight/clientWidth\n scrollThresholdStart = 10,\n scrollThresholdEnd = 10,\n direction = 'vertical',\n distanceFromStartPx: _distanceFromStartPx,\n distanceFromEndPx: _distanceFromEndPx,\n init,\n } = {},\n callback,\n) {\n if (!callback) return;\n const isVertical = direction === 'vertical';\n const previousScrollStart = useRef(null);\n const scrollDirection = useRef(null);\n\n const onScroll = useThrottledCallback(\n () => {\n let reachStart = false;\n let reachEnd = false;\n let nearReachStart = false;\n let nearReachEnd = false;\n\n const scrollableElement = scrollableRef.current;\n const {\n scrollTop,\n scrollLeft,\n scrollHeight,\n scrollWidth,\n clientHeight,\n clientWidth,\n } = scrollableElement;\n const scrollStart = isVertical ? scrollTop : scrollLeft;\n const scrollDimension = isVertical ? scrollHeight : scrollWidth;\n const clientDimension = isVertical ? clientHeight : clientWidth;\n const scrollDelta = scrollStart - previousScrollStart.current;\n const isScrollingForward = scrollDelta > 0;\n const threshold = isScrollingForward\n ? scrollThresholdEnd\n : scrollThresholdStart;\n const distanceFromStartPx =\n _distanceFromStartPx ||\n Math.min(\n clientDimension * distanceFromStart,\n scrollDimension,\n scrollStart,\n );\n const distanceFromEndPx =\n _distanceFromEndPx ||\n Math.min(\n clientDimension * distanceFromEnd,\n scrollDimension,\n scrollDimension - scrollStart - clientDimension,\n );\n\n if (Math.abs(scrollDelta) >= threshold) {\n scrollDirection.current = isScrollingForward ? 'end' : 'start';\n previousScrollStart.current = scrollStart;\n }\n\n reachStart = scrollStart <= 0;\n reachEnd = scrollStart + clientDimension >= scrollDimension;\n nearReachStart = scrollStart <= distanceFromStartPx;\n nearReachEnd =\n scrollStart + clientDimension >= scrollDimension - distanceFromEndPx;\n\n callback({\n scrollDirection: scrollDirection.current,\n reachStart,\n reachEnd,\n nearReachStart,\n nearReachEnd,\n });\n },\n 500,\n {\n leading: false,\n },\n );\n\n useLayoutEffect(() => {\n const scrollableElement = scrollableRef.current;\n if (scrollableElement) {\n previousScrollStart.current =\n scrollableElement[isVertical ? 'scrollTop' : 'scrollLeft'];\n scrollableElement.addEventListener('scroll', onScroll, { passive: true });\n }\n return () => {\n if (scrollableElement) {\n scrollableElement.removeEventListener('scroll', onScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n if (init && scrollableRef.current) {\n queueMicrotask(() => {\n scrollableRef.current.dispatchEvent(new Event('scroll'));\n });\n }\n }, [init]);\n\n return {\n resetScrollDirection: () => {\n scrollDirection.current = null;\n },\n };\n}\n","import './media-post.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport { useContext, useMemo } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport { getPreferences } from '../utils/api';\nimport FilterContext from '../utils/filter-context';\nimport { isFiltered } from '../utils/filters';\nimport states, { statusKey } from '../utils/states';\nimport store from '../utils/store';\nimport { getCurrentAccountID } from '../utils/store-utils';\n\nimport Media from './media';\n\nfunction MediaPost({\n class: className,\n statusID,\n status,\n instance,\n parent,\n // allowFilters,\n onMediaClick,\n}) {\n const { t } = useLingui();\n let sKey = statusKey(statusID, instance);\n const snapStates = useSnapshot(states);\n if (!status) {\n status = snapStates.statuses[sKey] || snapStates.statuses[statusID];\n sKey = statusKey(status?.id, instance);\n }\n if (!status) {\n return null;\n }\n\n const {\n account: {\n acct,\n avatar,\n avatarStatic,\n id: accountId,\n url: accountURL,\n displayName,\n username,\n emojis: accountEmojis,\n bot,\n group,\n },\n id,\n repliesCount,\n reblogged,\n reblogsCount,\n favourited,\n favouritesCount,\n bookmarked,\n poll,\n muted,\n sensitive,\n spoilerText,\n visibility, // public, unlisted, private, direct\n language,\n editedAt,\n filtered,\n card,\n createdAt,\n inReplyToId,\n inReplyToAccountId,\n content,\n mentions,\n mediaAttachments,\n reblog,\n uri,\n url,\n emojis,\n // Non-API props\n _deleted,\n _pinned,\n // _filtered,\n } = status;\n\n if (!mediaAttachments?.length) {\n return null;\n }\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...status,\n });\n }\n };\n\n const currentAccount = useMemo(() => {\n return getCurrentAccountID();\n }, []);\n const isSelf = useMemo(() => {\n return currentAccount && currentAccount === accountId;\n }, [accountId, currentAccount]);\n\n const filterContext = useContext(FilterContext);\n const filterInfo = !isSelf && isFiltered(filtered, filterContext);\n\n if (filterInfo?.action === 'hide') {\n return null;\n }\n\n console.debug('RENDER Media post', id, status?.account.displayName);\n\n const hasSpoiler = sensitive;\n const prefs = getPreferences();\n const readingExpandMedia =\n prefs['reading:expand:media']?.toLowerCase() || 'default';\n const showSpoilerMedia = readingExpandMedia === 'show_all';\n\n const Parent = parent || 'div';\n\n return mediaAttachments.map((media, i) => {\n const mediaKey = `${sKey}-${media.id}`;\n const filterTitleStr = filterInfo?.titlesStr;\n return (\n <Parent\n data-state-post-id={sKey}\n onMouseEnter={debugHover}\n key={mediaKey}\n data-spoiler-text={\n spoilerText || (sensitive ? t`Sensitive media` : undefined)\n }\n data-filtered-text={\n filterInfo\n ? filterTitleStr\n ? t`Filtered: ${filterTitleStr}`\n : t`Filtered`\n : undefined\n }\n class={`\n media-post\n ${filterInfo ? 'filtered' : ''}\n ${hasSpoiler ? 'has-spoiler' : ''}\n ${showSpoilerMedia ? 'show-media' : ''}\n `}\n >\n <Media\n class={className}\n media={media}\n lang={language}\n to={`/${instance}/s/${id}?media-only=${i + 1}`}\n onClick={\n onMediaClick ? (e) => onMediaClick(e, i, media, status) : undefined\n }\n />\n </Parent>\n );\n });\n}\n\nexport default memo(MediaPost);\n","import './nav-menu.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useLongPress } from 'use-long-press';\nimport { useSnapshot } from 'valtio';\n\nimport { api } from '../utils/api';\nimport { getLists } from '../utils/lists';\nimport safeBoundingBoxPadding from '../utils/safe-bounding-box-padding';\nimport states from '../utils/states';\nimport store from '../utils/store';\nimport { getAccounts, getCurrentAccountID } from '../utils/store-utils';\nimport supports from '../utils/supports';\n\nimport Avatar from './avatar';\nimport Icon from './icon';\nimport ListExclusiveBadge from './list-exclusive-badge';\nimport MenuLink from './menu-link';\nimport SubMenu2 from './submenu2';\n\nfunction NavMenu(props) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { masto, instance, authenticated } = api();\n\n const [currentAccount, moreThanOneAccount] = useMemo(() => {\n const accounts = getAccounts();\n const acc =\n accounts.find((account) => account.info.id === getCurrentAccountID()) ||\n accounts[0];\n return [acc, accounts.length > 1];\n }, []);\n\n // Home = Following\n // But when in multi-column mode, Home becomes columns of anything\n // User may choose pin or not to pin Following\n // If user doesn't pin Following, we show it in the menu\n const showFollowing =\n (snapStates.settings.shortcutsViewMode === 'multi-column' ||\n (!snapStates.settings.shortcutsViewMode &&\n snapStates.settings.shortcutsColumnsMode)) &&\n !snapStates.shortcuts.find((pin) => pin.type === 'following');\n\n const bindLongPress = useLongPress(\n () => {\n states.showAccounts = true;\n },\n {\n threshold: 600,\n detect: 'touch',\n cancelOnMovement: true,\n },\n );\n\n const buttonRef = useRef();\n const [menuState, setMenuState] = useState(undefined);\n\n const boundingBoxPadding = safeBoundingBoxPadding([\n 0,\n 0,\n snapStates.settings.shortcutsViewMode === 'tab-menu-bar' ? 50 : 0,\n 0,\n ]);\n\n const mutesIterator = useRef();\n async function fetchMutes(firstLoad) {\n if (firstLoad || !mutesIterator.current) {\n mutesIterator.current = masto.v1.mutes\n .list({\n limit: 80,\n })\n .values();\n }\n const results = await mutesIterator.current.next();\n return results;\n }\n\n const blocksIterator = useRef();\n async function fetchBlocks(firstLoad) {\n if (firstLoad || !blocksIterator.current) {\n blocksIterator.current = masto.v1.blocks\n .list({\n limit: 80,\n })\n .values();\n }\n const results = await blocksIterator.current.next();\n return results;\n }\n\n const buttonClickTS = useRef();\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n class={`button plain nav-menu-button ${\n moreThanOneAccount ? 'with-avatar' : ''\n } ${menuState === 'open' ? 'active' : ''}`}\n style={{ position: 'relative' }}\n onClick={() => {\n buttonClickTS.current = Date.now();\n setMenuState((state) => (!state ? 'open' : undefined));\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n states.showAccounts = true;\n }}\n {...bindLongPress()}\n >\n {moreThanOneAccount && (\n <Avatar\n url={\n currentAccount?.info?.avatar || currentAccount?.info?.avatarStatic\n }\n size=\"l\"\n squircle={currentAccount?.info?.bot}\n />\n )}\n <Icon icon=\"menu\" size={moreThanOneAccount ? 's' : 'l'} alt={t`Menu`} />\n </button>\n <ControlledMenu\n menuClassName=\"nav-menu\"\n state={menuState}\n anchorRef={buttonRef}\n onClose={() => {\n setMenuState(undefined);\n }}\n containerProps={{\n style: {\n zIndex: 10,\n },\n onClick: () => {\n if (Date.now() - buttonClickTS.current < 300) {\n return;\n }\n // setMenuState(undefined);\n },\n }}\n portal={{\n target: document.body,\n }}\n {...props}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding={boundingBoxPadding}\n unmountOnClose\n >\n {!!snapStates.appVersion?.commitHash &&\n __COMMIT_HASH__ !== snapStates.appVersion.commitHash && (\n <div class=\"top-menu\">\n <MenuItem\n onClick={() => {\n const yes = confirm(t`Reload page now to update?`);\n if (yes) {\n (async () => {\n try {\n location.reload();\n } catch (e) {}\n })();\n }\n }}\n >\n <Icon icon=\"sparkles\" class=\"sparkle-icon\" size=\"l\" />{' '}\n <span>\n <Trans>New update available…</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n </div>\n )}\n <section>\n <MenuLink to=\"/\">\n <Icon icon=\"home\" size=\"l\" />{' '}\n <span>\n <Trans>Home</Trans>\n </span>\n </MenuLink>\n {authenticated ? (\n <>\n {showFollowing && (\n <MenuLink to=\"/following\">\n <Icon icon=\"following\" size=\"l\" />{' '}\n <span>\n <Trans id=\"following.title\">Following</Trans>\n </span>\n </MenuLink>\n )}\n <MenuLink to=\"/catchup\">\n <Icon icon=\"history2\" size=\"l\" />\n <span>\n <Trans>Catch-up</Trans>\n </span>\n </MenuLink>\n {supports('@mastodon/mentions') && (\n <MenuLink to=\"/mentions\">\n <Icon icon=\"at\" size=\"l\" />{' '}\n <span>\n <Trans>Mentions</Trans>\n </span>\n </MenuLink>\n )}\n <MenuLink to=\"/notifications\">\n <Icon icon=\"notification\" size=\"l\" />{' '}\n <span>\n <Trans>Notifications</Trans>\n </span>\n {snapStates.notificationsShowNew && (\n <sup title={t`New`} style={{ opacity: 0.5 }}>\n {' '}\n •\n </sup>\n )}\n </MenuLink>\n <MenuDivider />\n {currentAccount?.info?.id && (\n <MenuLink to={`/${instance}/a/${currentAccount.info.id}`}>\n <Icon icon=\"user\" size=\"l\" />{' '}\n <span>\n <Trans>Profile</Trans>\n </span>\n </MenuLink>\n )}\n <ListMenu menuState={menuState} />\n <MenuLink to=\"/b\">\n <Icon icon=\"bookmark\" size=\"l\" />{' '}\n <span>\n <Trans>Bookmarks</Trans>\n </span>\n </MenuLink>\n <SubMenu2\n menuClassName=\"nav-submenu\"\n overflow=\"auto\"\n gap={-8}\n label={\n <>\n <Icon icon=\"more\" size=\"l\" />\n <span class=\"menu-grow\">\n <Trans>More…</Trans>\n </span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/f\">\n <Icon icon=\"heart\" size=\"l\" />{' '}\n <span>\n <Trans>Likes</Trans>\n </span>\n </MenuLink>\n <MenuLink to=\"/fh\">\n <Icon icon=\"hashtag\" size=\"l\" />{' '}\n <span>\n <Trans>Followed Hashtags</Trans>\n </span>\n </MenuLink>\n <MenuLink to=\"/sp\">\n <Icon icon=\"schedule\" size=\"l\" />{' '}\n <span>\n <Trans>Scheduled Posts</Trans>\n </span>\n </MenuLink>\n <MenuDivider />\n {supports('@mastodon/filters') && (\n <MenuLink to=\"/ft\">\n <Icon icon=\"filters\" size=\"l\" />{' '}\n <span>\n <Trans>Filters</Trans>\n </span>\n </MenuLink>\n )}\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'mute',\n heading: t`Muted users`,\n fetchAccounts: fetchMutes,\n excludeRelationshipAttrs: ['muting'],\n };\n }}\n >\n <Icon icon=\"mute\" size=\"l\" />{' '}\n <span>\n <Trans>Muted users…</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showGenericAccounts = {\n id: 'block',\n heading: t`Blocked users`,\n fetchAccounts: fetchBlocks,\n excludeRelationshipAttrs: ['blocking'],\n };\n }}\n >\n <Icon icon=\"block\" size=\"l\" />{' '}\n <span>\n <Trans>Blocked users…</Trans>\n </span>\n </MenuItem>{' '}\n </SubMenu2>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showAccounts = true;\n }}\n >\n <Icon icon=\"group\" size=\"l\" />{' '}\n <span>\n <Trans>Accounts…</Trans>\n </span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuLink to=\"/login\">\n <Icon icon=\"user\" size=\"l\" />{' '}\n <span>\n <Trans>Log in</Trans>\n </span>\n </MenuLink>\n </>\n )}\n </section>\n <section>\n <MenuDivider />\n <MenuLink to={`/search`}>\n <Icon icon=\"search\" size=\"l\" />{' '}\n <span>\n <Trans>Search</Trans>\n </span>\n </MenuLink>\n <MenuLink to={`/${instance}/trending`}>\n <Icon icon=\"chart\" size=\"l\" />{' '}\n <span>\n <Trans>Trending</Trans>\n </span>\n </MenuLink>\n <MenuLink to={`/${instance}/p/l`}>\n <Icon icon=\"building\" size=\"l\" />{' '}\n <span>\n <Trans>Local</Trans>\n </span>\n </MenuLink>\n <MenuLink to={`/${instance}/p`}>\n <Icon icon=\"earth\" size=\"l\" />{' '}\n <span>\n <Trans>Federated</Trans>\n </span>\n </MenuLink>\n {authenticated ? (\n <>\n <MenuDivider className=\"divider-grow\" />\n <MenuItem\n onClick={() => {\n states.showKeyboardShortcutsHelp = true;\n }}\n >\n <Icon icon=\"keyboard\" size=\"l\" />{' '}\n <span>\n <Trans>Keyboard shortcuts</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showShortcutsSettings = true;\n }}\n >\n <Icon icon=\"shortcut\" size=\"l\" />{' '}\n <span>\n <Trans>Shortcuts / Columns…</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" />{' '}\n <span>\n <Trans>Settings…</Trans>\n </span>\n </MenuItem>\n </>\n ) : (\n <>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n states.showSettings = true;\n }}\n >\n <Icon icon=\"gear\" size=\"l\" />{' '}\n <span>\n <Trans>Settings…</Trans>\n </span>\n </MenuItem>\n </>\n )}\n </section>\n </ControlledMenu>\n </>\n );\n}\n\nfunction ListMenu({ menuState }) {\n const supportsLists = supports('@mastodon/lists');\n const [lists, setLists] = useState([]);\n useEffect(() => {\n if (!supportsLists) return;\n if (menuState === 'open') {\n getLists().then(setLists);\n }\n }, [menuState, supportsLists]);\n\n return lists.length > 0 ? (\n <SubMenu2\n menuClassName=\"nav-submenu\"\n overflow=\"auto\"\n gap={-8}\n label={\n <>\n <Icon icon=\"list\" size=\"l\" />\n <span class=\"menu-grow\">\n <Trans>Lists</Trans>\n </span>\n <Icon icon=\"chevron-right\" />\n </>\n }\n >\n <MenuLink to=\"/l\">\n <span>\n <Trans>All Lists</Trans>\n </span>\n </MenuLink>\n {lists?.length > 0 && (\n <>\n <MenuDivider />\n {lists.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge />\n </>\n )}\n </span>\n </MenuLink>\n ))}\n </>\n )}\n </SubMenu2>\n ) : (\n supportsLists && (\n <MenuLink to=\"/l\">\n <Icon icon=\"list\" size=\"l\" />\n <span>\n <Trans>Lists</Trans>\n </span>\n </MenuLink>\n )\n );\n}\n\nexport default memo(NavMenu);\n","import { plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useDebouncedCallback } from 'use-debounce';\nimport { useSnapshot } from 'valtio';\n\nimport FilterContext from '../utils/filter-context';\nimport { filteredItems, isFiltered } from '../utils/filters';\nimport isRTL from '../utils/is-rtl';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport { groupBoosts, groupContext } from '../utils/timeline-utils';\nimport useInterval from '../utils/useInterval';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useScrollFn from '../utils/useScrollFn';\n\nimport Icon from './icon';\nimport Link from './link';\nimport MediaPost from './media-post';\nimport NavMenu from './nav-menu';\nimport Status from './status';\nimport ThreadBadge from './thread-badge';\n\nconst scrollIntoViewOptions = {\n block: 'start',\n inline: 'center',\n behavior: 'smooth',\n};\n\nfunction Timeline({\n title,\n titleComponent,\n id,\n instance,\n emptyText,\n errorText,\n useItemID, // use statusID instead of status object, assuming it's already in states\n boostsCarousel,\n fetchItems = () => {},\n checkForUpdates = () => {},\n checkForUpdatesInterval = 15_000, // 15 seconds\n headerStart,\n headerEnd,\n timelineStart,\n // allowFilters,\n refresh,\n view,\n filterContext,\n showFollowedTags,\n showReplyParent,\n clearWhenRefresh,\n}) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const [items, setItems] = useState([]);\n const [uiState, setUIState] = useState('start');\n const [showMore, setShowMore] = useState(false);\n const [showNew, setShowNew] = useState(false);\n const [visible, setVisible] = useState(true);\n const scrollableRef = useRef();\n\n console.debug('RENDER Timeline', id, refresh);\n __BENCHMARK.start(`timeline-${id}-load`);\n\n const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n const allowGrouping = view !== 'media';\n const loadItemsTS = useRef(0); // Ensures only one loadItems at a time\n const loadItems = useDebouncedCallback(\n (firstLoad) => {\n setShowNew(false);\n // if (uiState === 'loading') return;\n setUIState('loading');\n (async () => {\n try {\n const ts = (loadItemsTS.current = Date.now());\n let { done, value } = await fetchItems(firstLoad);\n if (ts !== loadItemsTS.current) return;\n if (Array.isArray(value)) {\n // Avoid grouping for pinned posts\n const [pinnedPosts, otherPosts] = value.reduce(\n (acc, item) => {\n if (item._pinned) {\n acc[0].push(item);\n } else {\n acc[1].push(item);\n }\n return acc;\n },\n [[], []],\n );\n value = otherPosts;\n if (allowGrouping) {\n if (boostsCarousel) {\n value = groupBoosts(value);\n }\n value = groupContext(value, instance);\n }\n if (pinnedPosts.length) {\n value = pinnedPosts.concat(value);\n }\n console.log(value);\n if (firstLoad) {\n setItems(value);\n } else {\n setItems((items) => [...items, ...value]);\n }\n if (!value.length) done = true;\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n __BENCHMARK.end(`timeline-${id}-load`);\n } catch (e) {\n console.error(e);\n setUIState('error');\n if (firstLoad && !items.length && errorText) {\n showToast(errorText);\n }\n } finally {\n loadItems.cancel();\n }\n })();\n },\n 1_000,\n {\n leading: true,\n // trailing: false,\n },\n );\n\n const itemsSelector = '.timeline-item, .timeline-item-alt';\n\n const jRef = useHotkeys(\n 'j, shift+j',\n (e, handler) => {\n // Fix bug: shift+j is fired even when j is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n\n // focus on next status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n ).filter((item) => !!item.offsetHeight);\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let nextItem = allItems[activeItemIndex + 1];\n if (handler.shift) {\n // get next status that's not .timeline-item-alt\n nextItem = allItems.find(\n (item, index) =>\n index > activeItemIndex &&\n !item.classList.contains('timeline-item-alt'),\n );\n }\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k, shift+k',\n (e, handler) => {\n // Fix bug: shift+k is fired even when k is pressed due to useKey: true\n if (e.shiftKey !== handler.shift) return;\n\n // focus on previous status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n ).filter((item) => !!item.offsetHeight);\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let prevItem = allItems[activeItemIndex - 1];\n if (handler.shift) {\n // get prev status that's not .timeline-item-alt\n prevItem = allItems.findLast(\n (item, index) =>\n index < activeItemIndex &&\n !item.classList.contains('timeline-item-alt'),\n );\n }\n if (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey,\n },\n );\n\n const oRef = useHotkeys(\n ['enter', 'o'],\n () => {\n // open active status\n const activeItem = document.activeElement;\n if (activeItem?.matches(itemsSelector)) {\n activeItem.click();\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const showNewPostsIndicator =\n items.length > 0 && uiState !== 'loading' && showNew;\n const handleLoadNewPosts = useCallback(() => {\n if (showNewPostsIndicator) loadItems(true);\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }, [loadItems, showNewPostsIndicator]);\n const dotRef = useHotkeys('.', handleLoadNewPosts, {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n });\n\n // const {\n // scrollDirection,\n // nearReachStart,\n // nearReachEnd,\n // reachStart,\n // reachEnd,\n // } = useScroll({\n // scrollableRef,\n // distanceFromEnd: 2,\n // scrollThresholdStart: 44,\n // });\n const headerRef = useRef();\n // const [hiddenUI, setHiddenUI] = useState(false);\n const [nearReachStart, setNearReachStart] = useState(false);\n const scrollFnCallback = useCallback(\n ({ scrollDirection, nearReachStart, reachStart }) => {\n if (headerRef.current) {\n const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n headerRef.current.hidden = hiddenUI;\n }\n setNearReachStart(nearReachStart);\n if (reachStart) {\n loadItems(true);\n }\n },\n [setNearReachStart, loadItems],\n );\n const { resetScrollDirection } = useScrollFn(\n {\n scrollableRef,\n distanceFromEnd: 2,\n scrollThresholdStart: 44,\n },\n scrollFnCallback,\n );\n\n useEffect(() => {\n scrollableRef.current?.scrollTo({ top: 0 });\n loadItems(true);\n }, []);\n const firstLoad = useRef(true);\n useEffect(() => {\n if (firstLoad.current) {\n firstLoad.current = false;\n return;\n }\n if (clearWhenRefresh && items?.length) {\n loadItems.cancel?.();\n setItems([]);\n }\n loadItems(true);\n }, [clearWhenRefresh, refresh]);\n\n // useEffect(() => {\n // if (reachStart) {\n // loadItems(true);\n // }\n // }, [reachStart]);\n\n // useEffect(() => {\n // if (nearReachEnd || (reachEnd && showMore)) {\n // loadItems();\n // }\n // }, [nearReachEnd, showMore]);\n\n const prevView = useRef(view);\n useEffect(() => {\n if (prevView.current !== view) {\n prevView.current = view;\n setItems([]);\n }\n }, [view]);\n\n const loadOrCheckUpdates = useCallback(\n async ({ disableIdleCheck = false } = {}) => {\n const noPointers = scrollableRef.current\n ? getComputedStyle(scrollableRef.current).pointerEvents === 'none'\n : false;\n console.log('✨ Load or check updates', id, {\n autoRefresh: snapStates.settings.autoRefresh,\n scrollTop: scrollableRef.current.scrollTop,\n disableIdleCheck,\n idle: window.__IDLE__,\n inBackground: inBackground(),\n noPointers,\n });\n if (\n snapStates.settings.autoRefresh &&\n scrollableRef.current.scrollTop < 16 &&\n (disableIdleCheck || window.__IDLE__) &&\n !inBackground() &&\n !noPointers\n ) {\n console.log('✨ Load updates', id, snapStates.settings.autoRefresh);\n loadItems(true);\n } else {\n console.log('✨ Check updates', id, snapStates.settings.autoRefresh);\n const hasUpdate = await checkForUpdates();\n if (hasUpdate) {\n console.log('✨ Has new updates', id);\n setShowNew(true);\n }\n }\n },\n [id, loadItems, checkForUpdates, snapStates.settings.autoRefresh],\n );\n\n const lastHiddenTime = useRef();\n usePageVisibility(\n (visible) => {\n if (visible) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadOrCheckUpdates({\n disableIdleCheck: true,\n });\n }\n } else {\n lastHiddenTime.current = Date.now();\n }\n setVisible(visible);\n },\n [checkForUpdates, loadOrCheckUpdates, snapStates.settings.autoRefresh],\n );\n\n // checkForUpdates interval\n useInterval(\n loadOrCheckUpdates,\n visible && !showNew\n ? checkForUpdatesInterval * (nearReachStart ? 1 : 2)\n : null,\n );\n\n // const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n\n return (\n <FilterContext.Provider value={filterContext}>\n <div\n id={`${id}-page`}\n class={`deck-container ${\n mediaFirst ? 'deck-container-media-first' : ''\n }`}\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n oRef.current = node;\n dotRef.current = node;\n }}\n tabIndex=\"-1\"\n onClick={(e) => {\n // If click on timeline item, unhide header\n if (\n headerRef.current &&\n e.target.closest('.timeline-item, .timeline-item-alt')\n ) {\n setTimeout(() => {\n headerRef.current.hidden = false;\n resetScrollDirection();\n }, 250);\n }\n }}\n >\n <div class=\"timeline-deck deck\">\n <header\n ref={headerRef}\n // hidden={hiddenUI}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }}\n onDblClick={(e) => {\n if (!e.target.closest('a, button')) {\n loadItems(true);\n }\n }}\n class={uiState === 'loading' ? 'loading' : ''}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n {headerStart !== null && headerStart !== undefined ? (\n headerStart\n ) : (\n <Link to=\"/\" class=\"button plain home-button\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n )}\n </div>\n {title && (titleComponent ? titleComponent : <h1>{title}</h1>)}\n <div class=\"header-side\">\n {/* <Loader hidden={uiState !== 'loading'} /> */}\n {!!headerEnd && headerEnd}\n </div>\n </div>\n {showNewPostsIndicator && (\n <button\n class=\"updates-button shiny-pill\"\n type=\"button\"\n onClick={handleLoadNewPosts}\n >\n <Icon icon=\"arrow-up\" /> <Trans>New posts</Trans>\n </button>\n )}\n </header>\n {!!timelineStart && (\n <div\n class={`timeline-start ${uiState === 'loading' ? 'loading' : ''}`}\n >\n {timelineStart}\n </div>\n )}\n {!!items.length ? (\n <>\n <ul class={`timeline ${view ? `timeline-${view}` : ''}`}>\n {items.map((status) => (\n <TimelineItem\n status={status}\n instance={instance}\n useItemID={useItemID}\n // allowFilters={allowFilters}\n filterContext={filterContext}\n key={status.id + status?._pinned + view}\n view={view}\n showFollowedTags={showFollowedTags}\n showReplyParent={showReplyParent}\n mediaFirst={mediaFirst}\n />\n ))}\n {showMore &&\n uiState === 'loading' &&\n (view === 'media' ? null : (\n <>\n <li\n style={{\n height: '20vh',\n }}\n >\n <Status skeleton mediaFirst={mediaFirst} />\n </li>\n <li\n style={{\n height: '25vh',\n }}\n >\n <Status skeleton mediaFirst={mediaFirst} />\n </li>\n </>\n ))}\n </ul>\n {uiState === 'default' &&\n (showMore ? (\n <InView\n root={scrollableRef.current}\n rootMargin={`0px 0px ${screen.height * 1.5}px 0px`}\n onChange={(inView) => {\n if (inView) {\n loadItems();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadItems()}\n style={{ marginBlockEnd: '6em' }}\n >\n <Trans>Show more…</Trans>\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n ))}\n </>\n ) : uiState === 'loading' ? (\n <ul class=\"timeline\">\n {Array.from({ length: 5 }).map((_, i) =>\n view === 'media' ? (\n <div\n style={{\n height: '50vh',\n }}\n />\n ) : (\n <li key={i}>\n <Status skeleton mediaFirst={mediaFirst} />\n </li>\n ),\n )}\n </ul>\n ) : (\n uiState !== 'error' &&\n uiState !== 'start' && <p class=\"ui-state\">{emptyText}</p>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n {errorText}\n <br />\n <br />\n <button type=\"button\" onClick={() => loadItems(!items.length)}>\n <Trans>Try again</Trans>\n </button>\n </p>\n )}\n </div>\n </div>\n </FilterContext.Provider>\n );\n}\n\nconst TimelineItem = memo(\n ({\n status,\n instance,\n useItemID,\n // allowFilters,\n filterContext,\n view,\n showFollowedTags,\n showReplyParent,\n mediaFirst,\n }) => {\n const { t } = useLingui();\n console.debug('RENDER TimelineItem', status.id);\n const { id: statusID, reblog, items, type, _pinned } = status;\n if (_pinned) useItemID = false;\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n\n if (items) {\n let fItems = filteredItems(items, filterContext);\n let title = '';\n if (type === 'boosts') {\n title = plural(fItems.length, {\n one: '# Boost',\n other: '# Boosts',\n });\n } else if (type === 'pinned') {\n title = t`Pinned posts`;\n }\n const isCarousel = type === 'boosts' || type === 'pinned';\n if (isCarousel) {\n const filteredItemsIDs = new Set();\n // Here, we don't hide filtered posts, but we sort them last\n fItems.sort((a, b) => {\n // if (a._filtered && !b._filtered) {\n // return 1;\n // }\n // if (!a._filtered && b._filtered) {\n // return -1;\n // }\n const aFiltered = isFiltered(a.filtered, filterContext);\n const bFiltered = isFiltered(b.filtered, filterContext);\n if (aFiltered && aFiltered?.action !== 'blur') {\n filteredItemsIDs.add(a.id);\n }\n if (bFiltered && bFiltered?.action !== 'blur') {\n filteredItemsIDs.add(b.id);\n }\n if (aFiltered && !bFiltered) {\n return 1;\n }\n if (!aFiltered && bFiltered) {\n return -1;\n }\n return 0;\n });\n\n if (filteredItemsIDs.size >= 2) {\n const GROUP_SIZE = 5;\n // If 2 or more, group filtered items into one, limit to GROUP_SIZE in a group\n const unfiltered = [];\n const filtered = [];\n fItems.forEach((item) => {\n if (filteredItemsIDs.has(item.id)) {\n filtered.push(item);\n } else {\n unfiltered.push(item);\n }\n });\n const filteredItems = [];\n for (let i = 0; i < filtered.length; i += GROUP_SIZE) {\n filteredItems.push({\n _grouped: true,\n posts: filtered.slice(i, i + GROUP_SIZE),\n });\n }\n fItems = unfiltered.concat(filteredItems);\n }\n\n return (\n <li key={`timeline-${statusID}`} class=\"timeline-item-carousel\">\n <StatusCarousel title={title} class={`${type}-carousel`}>\n {fItems.map((item) => {\n const { id: statusID, reblog, _pinned, _grouped } = item;\n if (_grouped) {\n return (\n <li key={statusID} class=\"timeline-item-carousel-group\">\n {item.posts.map((item) => {\n const { id: statusID, reblog, _pinned } = item;\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n if (_pinned) useItemID = false;\n return (\n <Link\n class=\"status-carousel-link timeline-item-alt\"\n to={url}\n >\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n />\n )}\n </Link>\n );\n })}\n </li>\n );\n }\n\n const actualStatusID = reblog?.id || statusID;\n const url = instance\n ? `/${instance}/s/${actualStatusID}`\n : `/s/${actualStatusID}`;\n if (_pinned) useItemID = false;\n return (\n <li key={statusID}>\n <Link\n class=\"status-carousel-link timeline-item-alt\"\n to={url}\n >\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n size=\"s\"\n contentTextWeight\n enableCommentHint\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n )}\n </Link>\n </li>\n );\n })}\n </StatusCarousel>\n </li>\n );\n }\n const manyItems = fItems.length > 3;\n return fItems.map((item, i) => {\n const { id: statusID, _differentAuthor } = item;\n const url = instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`;\n const isMiddle = i > 0 && i < fItems.length - 1;\n const isSpoiler = item.sensitive && !!item.spoilerText;\n const showCompact =\n (!_differentAuthor && isSpoiler && i > 0) ||\n (manyItems &&\n isMiddle &&\n (type === 'thread' ||\n (type === 'conversation' &&\n !_differentAuthor &&\n !fItems[i - 1]._differentAuthor &&\n !fItems[i + 1]._differentAuthor)));\n const isStart = i === 0;\n const isEnd = i === fItems.length - 1;\n return (\n <li\n key={`timeline-${statusID}`}\n class={`timeline-item-container timeline-item-container-type-${type} timeline-item-container-${\n isStart ? 'start' : isEnd ? 'end' : 'middle'\n } ${_differentAuthor ? 'timeline-item-diff-author' : ''}`}\n >\n <Link class=\"status-link timeline-item\" to={url}>\n {showCompact ? (\n <TimelineStatusCompact\n status={item}\n instance={instance}\n filterContext={filterContext}\n />\n ) : useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n enableCommentHint={isEnd}\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n ) : (\n <Status\n status={item}\n instance={instance}\n enableCommentHint={isEnd}\n showFollowedTags={showFollowedTags}\n // allowFilters={allowFilters}\n />\n )}\n </Link>\n </li>\n );\n });\n }\n\n const itemKey = `timeline-${statusID + _pinned}`;\n\n if (view === 'media') {\n return useItemID ? (\n <MediaPost\n class=\"timeline-item\"\n parent=\"li\"\n key={itemKey}\n statusID={statusID}\n instance={instance}\n // allowFilters={allowFilters}\n />\n ) : (\n <MediaPost\n class=\"timeline-item\"\n parent=\"li\"\n key={itemKey}\n status={status}\n instance={instance}\n // allowFilters={allowFilters}\n />\n );\n }\n\n return (\n <li key={itemKey}>\n <Link class=\"status-link timeline-item\" to={url}>\n {useItemID ? (\n <Status\n statusID={statusID}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n showReplyParent={showReplyParent}\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n ) : (\n <Status\n status={status}\n instance={instance}\n enableCommentHint\n showFollowedTags={showFollowedTags}\n showReplyParent={showReplyParent}\n // allowFilters={allowFilters}\n mediaFirst={mediaFirst}\n />\n )}\n </Link>\n </li>\n );\n },\n (oldProps, newProps) => {\n const oldID = (oldProps.status?.id || '').toString();\n const newID = (newProps.status?.id || '').toString();\n return (\n oldID === newID &&\n oldProps.instance === newProps.instance &&\n oldProps.view === newProps.view\n );\n },\n);\n\nfunction StatusCarousel({ title, class: className, children }) {\n const { t } = useLingui();\n const carouselRef = useRef();\n const startButtonRef = useRef();\n const endButtonRef = useRef();\n\n const [render, setRender] = useState(false);\n useEffect(() => {\n setTimeout(() => {\n setRender(true);\n }, 1);\n }, []);\n\n return (\n <div class={`status-carousel ${className}`}>\n <header>\n <h3>{title}</h3>\n <span>\n <button\n ref={startButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachStart}\n onClick={() => {\n const left =\n Math.min(320, carouselRef.current?.offsetWidth) *\n (isRTL() ? 1 : -1);\n carouselRef.current?.scrollBy({\n left,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-left\" alt={t`Previous`} />\n </button>{' '}\n <button\n ref={endButtonRef}\n type=\"button\"\n class=\"small plain2\"\n // disabled={reachEnd}\n onClick={() => {\n const left =\n Math.min(320, carouselRef.current?.offsetWidth) *\n (isRTL() ? -1 : 1);\n carouselRef.current?.scrollBy({\n left,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"chevron-right\" alt={t`Next`} />\n </button>\n </span>\n </header>\n <ul ref={carouselRef}>\n <InView\n class=\"status-carousel-beacon\"\n onChange={(inView) => {\n if (startButtonRef.current)\n startButtonRef.current.disabled = inView;\n }}\n />\n {children[0]}\n {render && children.slice(1)}\n <InView\n class=\"status-carousel-beacon\"\n onChange={(inView) => {\n if (endButtonRef.current) endButtonRef.current.disabled = inView;\n }}\n />\n </ul>\n </div>\n );\n}\n\nfunction TimelineStatusCompact({ status, instance, filterContext }) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { id, visibility, language } = status;\n const statusPeekText = statusPeek(status);\n const sKey = statusKey(id, instance);\n const filterInfo = isFiltered(status.filtered, filterContext);\n return (\n <article\n class={`status compact-thread ${\n visibility === 'direct' ? 'visibility-direct' : ''\n }`}\n tabindex=\"-1\"\n >\n <div class=\"status-thread-badge-container\">\n <ThreadBadge index={snapStates.statusThreadNumber[sKey]} />\n </div>\n <div\n class=\"content-compact\"\n title={statusPeekText}\n lang={language}\n dir=\"auto\"\n >\n {!!filterInfo && filterInfo?.action !== 'blur' ? (\n <b\n class=\"status-filtered-badge badge-meta horizontal\"\n title={filterInfo?.titlesStr || ''}\n >\n {filterInfo?.titlesStr ? (\n <Trans>\n <span>Filtered</span>: <span>{filterInfo.titlesStr}</span>\n </Trans>\n ) : (\n <span>\n <Trans>Filtered</Trans>\n </span>\n )}\n </b>\n ) : (\n <>\n {statusPeekText}\n {status.sensitive && status.spoilerText && (\n <>\n {' '}\n <span class=\"spoiler-badge\">\n <Icon icon=\"eye-close\" size=\"s\" alt={t`Content warning`} />\n </span>\n </>\n )}\n </>\n )}\n </div>\n </article>\n );\n}\n\nfunction inBackground() {\n return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nexport default Timeline;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountInfo from '../components/account-info';\nimport EmojiText from '../components/emoji-text';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport mem from '../utils/mem';\nimport pmem from '../utils/pmem';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport {\n getCurrentAccountID,\n isMediaFirstInstance,\n} from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst MIN_YEAR = 1983;\nconst MIN_YEAR_MONTH = `${MIN_YEAR}-01`; // Birth of the Internet\n\nconst supportsInputMonth = mem(() => {\n try {\n const input = document.createElement('input');\n input.setAttribute('type', 'month');\n return input.type === 'month';\n } catch (e) {\n return false;\n }\n});\n\nasync function _isSearchEnabled(instance) {\n const { masto } = api({ instance });\n const results = await masto.v2.search.list({\n q: 'from:me',\n type: 'statuses',\n limit: 1,\n });\n return !!results?.statuses?.length;\n}\nconst isSearchEnabled = pmem(_isSearchEnabled);\n\nfunction AccountStatuses() {\n const { i18n, t } = useLingui();\n const snapStates = useSnapshot(states);\n const { id, ...params } = useParams();\n const [searchParams, setSearchParams] = useSearchParams();\n const month = searchParams.get('month');\n const excludeReplies = !searchParams.get('replies');\n const excludeBoosts = !!searchParams.get('boosts');\n const tagged = searchParams.get('tagged');\n const media = !!searchParams.get('media');\n const { masto, instance, authenticated } = api({ instance: params.instance });\n const { masto: currentMasto, instance: currentInstance } = api();\n const accountStatusesIterator = useRef();\n\n const allSearchParams = [month, excludeReplies, excludeBoosts, tagged, media];\n const [account, setAccount] = useState();\n const searchOffsetRef = useRef(0);\n useEffect(() => {\n searchOffsetRef.current = 0;\n }, allSearchParams);\n\n const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n const sameCurrentInstance = useMemo(\n () => instance === currentInstance,\n [instance, currentInstance],\n );\n const [searchEnabled, setSearchEnabled] = useState(false);\n useEffect(() => {\n // Only enable for current logged-in instance\n // Most remote instances don't allow unauthenticated searches\n if (!sameCurrentInstance) return;\n if (!account?.acct) return;\n (async () => {\n const enabled = await isSearchEnabled(instance);\n console.log({ enabled });\n setSearchEnabled(enabled);\n })();\n }, [instance, sameCurrentInstance, account?.acct]);\n\n async function fetchAccountStatuses(firstLoad) {\n const isValidMonth = /^\\d{4}-[01]\\d$/.test(month);\n const isValidYear = month?.split?.('-')?.[0] >= MIN_YEAR;\n if (isValidMonth && isValidYear) {\n if (!account) {\n return {\n value: [],\n done: true,\n };\n }\n const [_year, _month] = month.split('-');\n const monthIndex = parseInt(_month, 10) - 1;\n // YYYY-MM (no day)\n // Search options:\n // - from:account\n // - after:YYYY-MM-DD (non-inclusive)\n // - before:YYYY-MM-DD (non-inclusive)\n\n // Last day of previous month\n const after = new Date(_year, monthIndex, 0);\n const afterStr = `${after.getFullYear()}-${(after.getMonth() + 1)\n .toString()\n .padStart(2, '0')}-${after.getDate().toString().padStart(2, '0')}`;\n // First day of next month\n const before = new Date(_year, monthIndex + 1, 1);\n const beforeStr = `${before.getFullYear()}-${(before.getMonth() + 1)\n .toString()\n .padStart(2, '0')}-${before.getDate().toString().padStart(2, '0')}`;\n console.log({\n month,\n _year,\n _month,\n monthIndex,\n after,\n before,\n afterStr,\n beforeStr,\n });\n\n let limit;\n if (firstLoad) {\n limit = LIMIT + 1;\n searchOffsetRef.current = 0;\n } else {\n limit = LIMIT + searchOffsetRef.current + 1;\n searchOffsetRef.current += LIMIT;\n }\n\n const searchResults = await masto.v2.search.list({\n q: `from:${account.acct} after:${afterStr} before:${beforeStr}`,\n type: 'statuses',\n limit,\n offset: searchOffsetRef.current,\n });\n if (searchResults?.statuses?.length) {\n const value = searchResults.statuses.slice(0, LIMIT);\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n const done = searchResults.statuses.length <= LIMIT;\n return { value, done };\n } else {\n return { value: [], done: true };\n }\n }\n\n let results = [];\n if (firstLoad) {\n const { value } = await masto.v1.accounts\n .$select(id)\n .statuses.list({\n pinned: true,\n })\n .values()\n .next();\n if (value?.length && !tagged && !media) {\n const pinnedStatuses = value.map((status) => {\n saveStatus(status, instance);\n return {\n ...status,\n _pinned: true,\n };\n });\n if (pinnedStatuses.length >= 3) {\n const pinnedStatusesIds = pinnedStatuses.map((status) => status.id);\n results.push({\n id: pinnedStatusesIds,\n items: pinnedStatuses,\n type: 'pinned',\n });\n } else {\n results.push(...pinnedStatuses);\n }\n }\n }\n if (firstLoad || !accountStatusesIterator.current) {\n accountStatusesIterator.current = masto.v1.accounts\n .$select(id)\n .statuses.list({\n limit: LIMIT,\n exclude_replies: excludeReplies,\n exclude_reblogs: excludeBoosts,\n only_media: media || undefined,\n tagged,\n })\n .values();\n }\n const { value, done } = await accountStatusesIterator.current.next();\n if (value?.length) {\n if (!supports('@mastodon/pinned-posts')) {\n // Check if value is same as pinned post (results)\n // If the index for every post is the same, means API might not support pinned posts\n // TODO: This is a really weird check, fix this at some point\n if (results.length) {\n let pinnedStatusesIds = [];\n if (results[0]?.type === 'pinned') {\n pinnedStatusesIds = results[0].id;\n } else {\n pinnedStatusesIds = results\n .filter((status) => status._pinned)\n .map((status) => status.id);\n }\n const containsAllPinned = pinnedStatusesIds.every((postId) =>\n value.some((status) => status.id === postId),\n );\n if (containsAllPinned) {\n // Remove pinned posts\n results = [];\n }\n }\n }\n\n results.push(...value);\n\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n value: results,\n done,\n };\n }\n\n const [featuredTags, setFeaturedTags] = useState([]);\n let title = t`Account posts`;\n if (account?.acct) {\n const acctDisplay = (/@/.test(account.acct) ? '' : '@') + account.acct;\n const accountDisplay = account?.displayName\n ? `${account.displayName} (${acctDisplay})`\n : `${acctDisplay}`;\n if (!excludeReplies) {\n title = t`${accountDisplay} (+ Replies)`;\n } else if (excludeBoosts) {\n title = t`${accountDisplay} (- Boosts)`;\n } else if (tagged) {\n title = t`${accountDisplay} (#${tagged})`;\n } else if (media) {\n title = t`${accountDisplay} (Media)`;\n } else if (month) {\n const monthYear = new Date(month).toLocaleString(i18n.locale, {\n month: 'long',\n year: 'numeric',\n });\n title = t`${accountDisplay} (${monthYear})`;\n } else {\n title = accountDisplay;\n }\n }\n useTitle(title, '/:instance?/a/:id');\n\n const fetchAccount = useCallback(() => {\n return memFetchAccount(id, masto);\n }, [id, masto]);\n\n useEffect(() => {\n (async () => {\n try {\n const acc = await fetchAccount();\n console.log(acc);\n setAccount(acc);\n } catch (e) {\n console.error(e);\n }\n // No need, because the whole filter bar is hidden\n // TODO: Revisit this\n if (!mediaFirst) {\n try {\n const featuredTags = await masto.v1.accounts\n .$select(id)\n .featuredTags.list();\n console.log({ featuredTags });\n setFeaturedTags(featuredTags);\n } catch (e) {\n console.error(e);\n }\n }\n })();\n }, [id, mediaFirst]);\n\n const { displayName, acct, emojis } = account || {};\n\n const isSelf = useMemo(\n () => account?.id === getCurrentAccountID(),\n [account?.id],\n );\n\n const filterBarRef = useRef();\n const TimelineStart = useMemo(() => {\n const filtered =\n !excludeReplies || excludeBoosts || tagged || media || !!month;\n const cachedAccount = snapStates.accounts[`${id}@${instance}`];\n\n return (\n <>\n <AccountInfo\n instance={instance}\n account={cachedAccount || id}\n fetchAccount={fetchAccount}\n authenticated={authenticated}\n standalone\n showEndorsements\n />\n {!mediaFirst && (\n <div\n class=\"filter-bar\"\n ref={filterBarRef}\n style={{\n position: 'relative',\n }}\n >\n {filtered ? (\n <Link\n to={`/${instance}/a/${id}`}\n class=\"insignificant filter-clear\"\n title={t`Clear filters`}\n key=\"clear-filters\"\n >\n <Icon icon=\"x\" size=\"l\" alt={t`Clear`} />\n </Link>\n ) : (\n <Icon\n icon=\"filter\"\n class=\"insignificant\"\n size=\"l\"\n alt={t`Filters`}\n />\n )}\n <Link\n to={`/${instance}/a/${id}${excludeReplies ? '?replies=1' : ''}`}\n onClick={() => {\n if (excludeReplies) {\n showToast(t`Showing post with replies`);\n }\n }}\n class={excludeReplies ? '' : 'is-active'}\n >\n <Trans>+ Replies</Trans>\n </Link>\n <Link\n to={`/${instance}/a/${id}${excludeBoosts ? '' : '?boosts=0'}`}\n onClick={() => {\n if (!excludeBoosts) {\n showToast(t`Showing posts without boosts`);\n }\n }}\n class={!excludeBoosts ? '' : 'is-active'}\n >\n <Trans>- Boosts</Trans>\n </Link>\n <Link\n to={`/${instance}/a/${id}${media ? '' : '?media=1'}`}\n onClick={() => {\n if (!media) {\n showToast(t`Showing posts with media`);\n }\n }}\n class={media ? 'is-active' : ''}\n >\n <Trans>Media</Trans>\n </Link>\n {featuredTags.map((tag) => (\n <Link\n key={tag.id}\n to={`/${instance}/a/${id}${\n tagged === tag.name\n ? ''\n : `?tagged=${encodeURIComponent(tag.name)}`\n }`}\n onClick={() => {\n if (tagged !== tag.name) {\n showToast(t`Showing posts tagged with #${tag.name}`);\n }\n }}\n class={tagged === tag.name ? 'is-active' : ''}\n >\n <span>\n <span class=\"more-insignificant\">#</span>\n {tag.name}\n </span>\n {\n // The count differs based on instance 😅\n }\n {/* <span class=\"filter-count\">{tag.statusesCount}</span> */}\n </Link>\n ))}\n {searchEnabled &&\n (supportsInputMonth() ? (\n <label class={`filter-field ${month ? 'is-active' : ''}`}>\n <Icon icon=\"month\" size=\"l\" />\n <input\n type=\"month\"\n disabled={!account?.acct}\n value={month || ''}\n min={MIN_YEAR_MONTH}\n max={new Date().toISOString().slice(0, 7)}\n onInput={(e) => {\n const { value, validity } = e.currentTarget;\n if (!validity.valid) return;\n setSearchParams(\n value\n ? {\n month: value,\n }\n : {},\n );\n const [year, month] = value.split('-');\n const monthIndex = parseInt(month, 10) - 1;\n const date = new Date(year, monthIndex);\n showToast(\n t`Showing posts in ${date.toLocaleString(i18n.locale, {\n month: 'long',\n year: 'numeric',\n })}`,\n );\n }}\n />\n </label>\n ) : (\n // Fallback to <select> for month and <input type=\"number\"> for year\n <MonthPicker\n class={`filter-field ${month ? 'is-active' : ''}`}\n disabled={!account?.acct}\n value={month || ''}\n min={MIN_YEAR_MONTH}\n max={new Date().toISOString().slice(0, 7)}\n onInput={(e) => {\n const { value, validity } = e;\n if (!validity.valid) return;\n setSearchParams(\n value\n ? {\n month: value,\n }\n : {},\n );\n }}\n />\n ))}\n </div>\n )}\n </>\n );\n }, [\n id,\n instance,\n authenticated,\n featuredTags,\n fetchAccount,\n searchEnabled,\n ...allSearchParams,\n ]);\n\n useEffect(() => {\n // Focus on .is-active\n const active = filterBarRef.current?.querySelector('.is-active');\n if (active) {\n console.log('active', active, active.offsetLeft);\n filterBarRef.current.scrollTo({\n behavior: 'smooth',\n left:\n active.offsetLeft -\n (filterBarRef.current.offsetWidth - active.offsetWidth) / 2,\n });\n }\n }, [featuredTags, searchEnabled, ...allSearchParams]);\n\n const accountInstance = useMemo(() => {\n if (!account?.url) return null;\n const domain = URL.parse(account.url)?.hostname;\n return domain;\n }, [account]);\n const sameInstance = instance === accountInstance;\n const allowSwitch = !!account && !sameInstance;\n\n return (\n <>\n <Timeline\n key={id}\n title={`${account?.acct ? '@' + account.acct : t`Posts`}`}\n titleComponent={\n <h1\n class=\"header-double-lines header-account\"\n // onClick={() => {\n // states.showAccount = {\n // account,\n // instance,\n // };\n // }}\n >\n <b>\n <EmojiText\n text={displayName}\n emojis={emojis}\n resolverURL={account?.url}\n />\n </b>\n <div>\n <span class=\"bidi-isolate\">@{acct}</span>\n </div>\n </h1>\n }\n id=\"account-statuses\"\n instance={instance}\n emptyText={t`Nothing to see here yet.`}\n errorText={t`Unable to load posts`}\n fetchItems={fetchAccountStatuses}\n useItemID\n view={media || mediaFirst ? 'media' : undefined}\n boostsCarousel={snapStates.settings.boostsCarousel}\n timelineStart={TimelineStart}\n refresh={[\n excludeReplies,\n excludeBoosts,\n tagged,\n media,\n month + account?.acct,\n ].toString()}\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem\n disabled={!allowSwitch}\n onClick={() => {\n (async () => {\n try {\n const { masto } = api({\n instance: accountInstance,\n });\n const acc = await masto.v1.accounts.lookup({\n acct: account.acct,\n });\n const { id } = acc;\n location.hash = `/${accountInstance}/a/${id}`;\n } catch (e) {\n console.error(e);\n alert(t`Unable to fetch account info`);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Switch to account's instance{' '}\n {accountInstance ? (\n <>\n {' '}\n (<b>{punycode.toUnicode(accountInstance)}</b>)\n </>\n ) : null}\n </Trans>\n </small>\n </MenuItem>\n {!sameCurrentInstance && (\n <MenuItem\n onClick={() => {\n (async () => {\n try {\n const acc = await currentMasto.v1.accounts.lookup({\n acct: account.acct + '@' + instance,\n });\n const { id } = acc;\n location.hash = `/${currentInstance}/a/${id}`;\n } catch (e) {\n console.error(e);\n alert(t`Unable to fetch account info`);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Switch to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n {acct && !isSelf && (\n <data\n class=\"compose-data\"\n value={JSON.stringify({\n draftStatus: {\n status: `@${acct} `,\n },\n })}\n />\n )}\n </>\n );\n}\n\nfunction MonthPicker(props) {\n const { i18n } = useLingui();\n const {\n class: className,\n disabled,\n value,\n min,\n max,\n onInput = () => {},\n } = props;\n const [_year, _month] = value?.split('-') || [];\n const monthFieldRef = useRef();\n const yearFieldRef = useRef();\n\n const checkValidity = (month, year) => {\n const [minYear, minMonth] = min?.split('-') || [];\n const [maxYear, maxMonth] = max?.split('-') || [];\n if (year < minYear) return false;\n if (year > maxYear) return false;\n if (year === minYear && month < minMonth) return false;\n if (year === maxYear && month > maxMonth) return false;\n return true;\n };\n\n return (\n <div class={className}>\n <Icon icon=\"month\" size=\"l\" />\n <select\n ref={monthFieldRef}\n disabled={disabled}\n value={_month || ''}\n onInput={(e) => {\n const { value: month } = e.currentTarget;\n const year = yearFieldRef.current.value;\n if (!checkValidity(month, year))\n return {\n value: '',\n validity: {\n valid: false,\n },\n };\n onInput({\n value: month ? `${year}-${month}` : '',\n validity: {\n valid: true,\n },\n });\n }}\n >\n <option value=\"\">\n <Trans>Month</Trans>\n </option>\n <option disabled>-----</option>\n {Array.from({ length: 12 }, (_, i) => (\n <option\n value={\n // Month is 1-indexed\n (i + 1)\n .toString()\n .padStart(2, '0')\n }\n key={i}\n >\n {new Date(0, i).toLocaleString(i18n.locale, {\n month: 'long',\n })}\n </option>\n ))}\n </select>{' '}\n <input\n ref={yearFieldRef}\n type=\"number\"\n disabled={disabled}\n value={_year || new Date().getFullYear()}\n min={min?.slice(0, 4) || MIN_YEAR}\n max={max?.slice(0, 4) || new Date().getFullYear()}\n onInput={(e) => {\n const { value: year, validity } = e.currentTarget;\n const month = monthFieldRef.current.value;\n if (!validity.valid || !checkValidity(month, year))\n return {\n value: '',\n validity: {\n valid: false,\n },\n };\n onInput({\n value: year ? `${year}-${month}` : '',\n validity: {\n valid: true,\n },\n });\n }}\n style={{\n width: '4.5em',\n }}\n />\n </div>\n );\n}\n\nfunction fetchAccount(id, masto) {\n return masto.v1.accounts.$select(id).fetch();\n}\nconst memFetchAccount = pmem(fetchAccount, {\n maxAge: 30 * 60 * 1000, // 30 minutes\n});\n\nexport default AccountStatuses;\n","import './annual-report.css';\n\nimport { Trans } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\nimport { useParams } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NameText from '../components/name-text';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nexport default function AnnualReport() {\n const params = useParams();\n const { year } = params;\n useTitle(year ? `Annual Report: ${year}` : 'Annual Report');\n const { masto, instance } = api();\n const [results, setResults] = useState(null);\n const [uiState, setUIState] = useState('default');\n\n useEffect(() => {\n if (year) {\n (async () => {\n setUIState('loading');\n const results = await masto.v1.annualReports.$select(year).fetch();\n console.log('REPORT', results);\n setResults(results);\n setUIState('default');\n })();\n }\n }, [year]);\n\n const { accounts, annualReports, statuses } = results || {};\n const report = annualReports?.find((report) => report.year == year)?.data;\n\n const datePlaceholder = new Date();\n\n return (\n <div id=\"annual-report-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"report\">\n <h1>{year} #Wrapstodon</h1>\n {uiState === 'loading' && (\n <p>\n <Loader abrupt /> <Trans>Loading…</Trans>\n </p>\n )}\n {!!report && (\n <dl>\n {Object.entries(report).map(([key, value]) => (\n <>\n <dt>{key}</dt>\n <dd class={`report-${key}`}>\n {Array.isArray(value) ? (\n <table>\n <thead>\n <tr>\n {Object.entries(value[0]).map(([key, value]) => (\n <th\n class={\n key !== 'month' && typeof value === 'number'\n ? 'number'\n : ''\n }\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {value.map((item) => (\n <tr>\n {Object.entries(item).map(([k, value]) => (\n <td\n class={\n k !== 'month' && typeof value === 'number'\n ? 'number'\n : ''\n }\n >\n {value &&\n /(accountId)/i.test(k) &&\n /^(mostRebloggedAccounts|commonlyInteractedWithAccounts)$/i.test(\n key,\n ) ? (\n <NameText\n account={accounts?.find(\n (a) => a.id === value,\n )}\n showAvatar\n />\n ) : k === 'month' ? (\n datePlaceholder.setMonth(value - 1) &&\n datePlaceholder.toLocaleString(undefined, {\n month: 'long',\n })\n ) : typeof value === 'number' ? (\n value.toLocaleString()\n ) : (\n value\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n ) : typeof value === 'object' ? (\n /^(topStatuses)$/i.test(key) ? (\n <dl>\n {Object.entries(value).map(([k, value]) => (\n <>\n <dt>{k}</dt>\n <dd>\n {value && (\n <Link to={`/${instance}/s/${value}`}>\n <Status\n status={statuses?.find(\n (s) => s.id === value,\n )}\n size=\"s\"\n readOnly\n />\n </Link>\n )}\n </dd>\n </>\n ))}\n </dl>\n ) : (\n <table>\n <tbody>\n {Object.entries(value).map(([k, value]) => (\n <tr>\n <th>{k}</th>\n <td\n class={\n typeof value === 'number' ? 'number' : ''\n }\n >\n {value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n ) : typeof value === 'string' ? (\n value\n ) : (\n // Last resort\n JSON.stringify(value, null, 2)\n )}\n </dd>\n </>\n ))}\n </dl>\n )}\n </div>\n <hr />\n <p style={{ textAlign: 'center' }}>\n <Link to=\"/\">\n <Trans>Go home</Trans>\n </Link>\n </p>\n </div>\n );\n}\n","import { useLingui } from '@lingui/react/macro';\nimport { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Bookmarks() {\n const { t } = useLingui();\n useTitle(t`Bookmarks`, '/b');\n const { masto, instance } = api();\n const bookmarksIterator = useRef();\n async function fetchBookmarks(firstLoad) {\n if (firstLoad || !bookmarksIterator.current) {\n bookmarksIterator.current = masto.v1.bookmarks\n .list({ limit: LIMIT })\n .values();\n }\n return await bookmarksIterator.current.next();\n }\n\n return (\n <Timeline\n title={t`Bookmarks`}\n id=\"bookmarks\"\n emptyText={t`No bookmarks yet. Go bookmark something!`}\n errorText={t`Unable to load bookmarks.`}\n instance={instance}\n fetchItems={fetchBookmarks}\n />\n );\n}\n\nexport default Bookmarks;\n","export default \"__VITE_ASSET__BL_1JinT__\"","import '../components/links-bar.css';\nimport './catchup.css';\n\nimport autoAnimate from '@formkit/auto-animate';\nimport { msg, select } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSearchParams } from 'react-router-dom';\nimport { uid } from 'uid/single';\n\nimport catchupUrl from '../assets/features/catch-up.png';\n\nimport Avatar from '../components/avatar';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NameText from '../components/name-text';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport { api, getPreferences } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport db from '../utils/db';\nimport emojifyText from '../utils/emojify-text';\nimport { isFiltered } from '../utils/filters';\nimport getDomain from '../utils/get-domain';\nimport htmlContentLength from '../utils/html-content-length';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport { supportsNativeQuote } from '../utils/quote-utils';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { statusKey } from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccountID, getCurrentAccountNS } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport { assignFollowedTags } from '../utils/timeline-utils';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = 'home';\n\nconst RANGES = [\n { label: msg`last 1 hour`, value: 1 },\n { label: msg`last 2 hours`, value: 2 },\n { label: msg`last 3 hours`, value: 3 },\n { label: msg`last 4 hours`, value: 4 },\n { label: msg`last 5 hours`, value: 5 },\n { label: msg`last 6 hours`, value: 6 },\n { label: msg`last 7 hours`, value: 7 },\n { label: msg`last 8 hours`, value: 8 },\n { label: msg`last 9 hours`, value: 9 },\n { label: msg`last 10 hours`, value: 10 },\n { label: msg`last 11 hours`, value: 11 },\n { label: msg`last 12 hours`, value: 12 },\n { label: msg`beyond 12 hours`, value: 13 },\n];\n\nconst FILTER_KEYS = {\n original: msg`Original`,\n replies: msg`Replies`,\n boosts: msg`Boosts`,\n quotes: msg`Quotes`,\n followedTags: msg`Followed tags`,\n groups: msg`Groups`,\n filtered: msg`Filtered`,\n};\nconst FILTER_SORTS = [\n 'createdAt',\n 'repliesCount',\n 'favouritesCount',\n 'reblogsCount',\n // TODO: Add this later when there's enough usage\n // Sorting by quotes count seems not useful… yet?\n // And we're combining it with boosts count, so that's even weirder…\n // 'quotesCount',\n 'density',\n];\nconst FILTER_GROUPS = [null, 'account'];\n\nconst DTF = mem(\n (locale) =>\n new Intl.DateTimeFormat(locale || undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n);\n\nfunction hasQuote(quote) {\n return quote?.id || quote?.quotedStatus?.id;\n}\n\nfunction Catchup() {\n const { i18n, _, t } = useLingui();\n const dtf = DTF(i18n.locale);\n\n useTitle(`Catch-up`, '/catchup');\n const { masto, instance } = api();\n const [searchParams, setSearchParams] = useSearchParams();\n const id = searchParams.get('id');\n const [uiState, setUIState] = useState('start');\n const [showTopLinks, setShowTopLinks] = useState(false);\n\n const currentAccount = useMemo(() => {\n return getCurrentAccountID();\n }, []);\n const isSelf = (accountID) => accountID === currentAccount;\n\n const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n async function fetchHome({ maxCreatedAt }) {\n console.debug('fetchHome', maxCreatedAt);\n const allResults = [];\n const homeIterable = masto.v1.timelines.home.list({ limit: 40 });\n const homeIterator = homeIterable.values();\n mainloop: while (true) {\n try {\n if (supportsPixelfed && homeIterable.params) {\n if (typeof homeIterable.params === 'string') {\n homeIterable.params += '&include_reblogs=true';\n } else {\n homeIterable.params.include_reblogs = true;\n }\n }\n const results = await homeIterator.next();\n const { value } = results;\n if (value?.length) {\n // This ignores maxCreatedAt filter, but it's ok for now\n await assignFollowedTags(value, instance);\n let addedResults = false;\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const createdAtTime = Date.parse(item.createdAt);\n if (!maxCreatedAt || createdAtTime >= maxCreatedAt) {\n // Filtered\n const selfPost = isSelf(\n item.reblog?.account?.id || item.account.id,\n );\n const filterInfo =\n !selfPost &&\n isFiltered(\n item.reblog?.filtered || item.filtered,\n FILTER_CONTEXT,\n );\n if (filterInfo?.action === 'hide') continue;\n item._filtered = filterInfo;\n\n // Followed tags\n const sKey = statusKey(item.id, instance);\n item._followedTags = states.statusFollowedTags[sKey]\n ? [...states.statusFollowedTags[sKey]]\n : [];\n\n allResults.push(item);\n addedResults = true;\n } else {\n // Don't immediately stop, still add the other items that might still be within range\n // break mainloop;\n }\n // Only stop when ALL items are outside of range\n if (!addedResults) {\n break mainloop;\n }\n }\n } else {\n break mainloop;\n }\n // Pause 1s\n await new Promise((resolve) => setTimeout(resolve, 1000));\n } catch (e) {\n console.error(e);\n break mainloop;\n }\n }\n\n // Post-process all results\n // 1. Threadify - tag 1st-post in a thread\n allResults.forEach((status) => {\n if (status?.inReplyToId) {\n const replyToStatus = allResults.find(\n (s) => s.id === status.inReplyToId,\n );\n if (replyToStatus && !replyToStatus.inReplyToId) {\n replyToStatus._thread = true;\n }\n }\n });\n\n return allResults;\n }\n\n const [posts, setPosts] = useState([]);\n const catchupRangeRef = useRef();\n const catchupLastRef = useRef();\n const NS = useMemo(() => getCurrentAccountNS(), []);\n const handleCatchupClick = useCallback(async ({ duration } = {}) => {\n const now = Date.now();\n const maxCreatedAt = duration ? now - duration : null;\n setUIState('loading');\n const results = await fetchHome({ maxCreatedAt });\n // Namespaced by account ID\n // Possible conflict if ID matches between different accounts from different instances\n const catchupID = `${NS}-${uid()}`;\n try {\n await db.catchup.set(catchupID, {\n id: catchupID,\n posts: results,\n count: results.length,\n startAt: maxCreatedAt,\n endAt: now,\n });\n setSearchParams({ id: catchupID });\n } catch (e) {\n console.error(e, results);\n }\n }, []);\n\n useEffect(() => {\n if (id) {\n (async () => {\n const catchup = await db.catchup.get(id);\n if (catchup) {\n catchup.posts.sort((a, b) => (a.createdAt > b.createdAt ? 1 : -1));\n setPosts(catchup.posts);\n setUIState('results');\n }\n })();\n } else if (uiState === 'results') {\n setPosts([]);\n setUIState('start');\n }\n }, [id]);\n\n const [reloadCatchupsCount, reloadCatchups] = useReducer((c) => c + 1, 0);\n const [lastCatchupEndAt, setLastCatchupEndAt] = useState(null);\n const [prevCatchups, setPrevCatchups] = useState([]);\n useEffect(() => {\n (async () => {\n try {\n const catchups = await db.catchup.keys();\n if (catchups.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = catchups.filter((key) => key.startsWith(`${ns}-`));\n if (ownKeys.length) {\n let ownCatchups = await db.catchup.getMany(ownKeys);\n ownCatchups.sort((a, b) => b.endAt - a.endAt);\n\n // Split to 1st 3 last catchups, and the rest\n let lastCatchups = ownCatchups.slice(0, 3);\n let restCatchups = ownCatchups.slice(3);\n\n const trimmedCatchups = lastCatchups.map((c) => {\n const { id, count, startAt, endAt } = c;\n return {\n id,\n count,\n startAt,\n endAt,\n };\n });\n setPrevCatchups(trimmedCatchups);\n setLastCatchupEndAt(lastCatchups[0].endAt);\n\n // GC time\n ownCatchups = null;\n lastCatchups = null;\n\n queueMicrotask(() => {\n if (restCatchups.length) {\n // delete them\n db.catchup\n .delMany(restCatchups.map((c) => c.id))\n .then(() => {\n // GC time\n restCatchups = null;\n })\n .catch((e) => {\n console.error(e);\n });\n }\n });\n\n return;\n }\n }\n } catch (e) {\n console.error(e);\n }\n setPrevCatchups([]);\n })();\n }, [reloadCatchupsCount]);\n useEffect(() => {\n if (uiState === 'start') {\n reloadCatchups();\n }\n }, [uiState === 'start']);\n\n const [filterCounts, links] = useMemo(() => {\n let filtered = 0,\n groups = 0,\n boosts = 0,\n quotes = 0,\n replies = 0,\n followedTags = 0,\n original = 0;\n const links = {};\n for (const post of posts) {\n if (post._filtered && post._filtered?.action !== 'blur') {\n filtered++;\n post.__FILTER = 'filtered';\n } else if (post.group) {\n groups++;\n post.__FILTER = 'groups';\n } else if (post.reblog) {\n boosts++;\n post.__FILTER = 'boosts';\n } else if (supportsNativeQuote() && hasQuote(post.quote)) {\n quotes++;\n post.__FILTER = 'quotes';\n } else if (post._followedTags?.length) {\n followedTags++;\n post.__FILTER = 'followedTags';\n } else if (\n post.inReplyToId &&\n post.inReplyToAccountId !== post.account?.id\n ) {\n replies++;\n post.__FILTER = 'replies';\n } else {\n original++;\n post.__FILTER = 'original';\n }\n\n const thePost = post.reblog || post;\n if (\n post.__FILTER !== 'filtered' &&\n thePost.card?.url &&\n thePost.card?.image &&\n thePost.card?.type === 'link'\n ) {\n const { card, favouritesCount, reblogsCount } = thePost;\n let { url } = card;\n url = url.replace(/\\/$/, '');\n if (!links[url]) {\n links[url] = {\n postID: thePost.id,\n card,\n shared: 1,\n sharers: [post.account],\n likes: favouritesCount,\n boosts: reblogsCount,\n };\n } else {\n if (links[url].sharers.find((a) => a.id === post.account.id)) {\n continue;\n }\n links[url].shared++;\n links[url].sharers.push(post.account);\n if (links[url].postID !== thePost.id) {\n links[url].likes += favouritesCount;\n links[url].boosts += reblogsCount;\n }\n }\n }\n }\n\n let topLinks = [];\n for (const link in links) {\n topLinks.push({\n url: link,\n ...links[link],\n });\n }\n topLinks.sort((a, b) => {\n if (a.shared > b.shared) return -1;\n if (a.shared < b.shared) return 1;\n if (a.boosts > b.boosts) return -1;\n if (a.boosts < b.boosts) return 1;\n if (a.likes > b.likes) return -1;\n if (a.likes < b.likes) return 1;\n if (a.quotes > b.quotes) return -1;\n if (a.quotes < b.quotes) return 1;\n return 0;\n });\n\n // Slice links to shared > 1 but min 10 links\n if (topLinks.length > 10) {\n linksLoop: for (let i = 10; i < topLinks.length; i++) {\n const { shared } = topLinks[i];\n if (shared <= 1) {\n topLinks = topLinks.slice(0, i);\n break linksLoop;\n }\n }\n }\n\n return [\n {\n filtered,\n groups,\n boosts,\n quotes,\n replies,\n followedTags,\n original,\n },\n topLinks,\n ];\n }, [posts]);\n\n const [selectedFilterCategory, setSelectedFilterCategory] = useState('all');\n const [selectedAuthor, setSelectedAuthor] = useState(null);\n\n const [range, setRange] = useState(1);\n\n const [sortBy, setSortBy] = useState('createdAt');\n const [sortOrder, setSortOrder] = useState('asc');\n const [groupBy, setGroupBy] = useState(null);\n\n const [filteredPosts, authors, authorCounts] = useMemo(() => {\n const authorsHash = {};\n const authorCountsMap = new Map();\n\n let filteredPosts = posts.filter((post) => {\n const postFilterMatches =\n selectedFilterCategory === 'all' ||\n post.__FILTER === selectedFilterCategory;\n\n if (postFilterMatches) {\n authorsHash[post.account.id] = post.account;\n authorCountsMap.set(\n post.account.id,\n (authorCountsMap.get(post.account.id) || 0) + 1,\n );\n }\n\n return postFilterMatches;\n });\n\n // Deduplicate boosts\n const boostedPosts = {};\n filteredPosts.forEach((post) => {\n if (post.reblog) {\n if (boostedPosts[post.reblog.id]) {\n if (boostedPosts[post.reblog.id].__BOOSTERS) {\n boostedPosts[post.reblog.id].__BOOSTERS.add(post.account);\n } else {\n boostedPosts[post.reblog.id].__BOOSTERS = new Set([post.account]);\n }\n post.__HIDDEN = true;\n } else {\n boostedPosts[post.reblog.id] = post;\n }\n }\n });\n\n if (selectedAuthor && authorCountsMap.has(selectedAuthor)) {\n filteredPosts = filteredPosts.filter(\n (post) =>\n post.account.id === selectedAuthor ||\n [...(post.__BOOSTERS || [])].find((a) => a.id === selectedAuthor),\n );\n }\n\n return [filteredPosts, authorsHash, Object.fromEntries(authorCountsMap)];\n }, [selectedFilterCategory, selectedAuthor, posts]);\n\n const filteredPostsMap = useMemo(() => {\n const map = {};\n filteredPosts.forEach((post) => {\n map[post.id] = post;\n });\n return map;\n }, [filteredPosts]);\n\n const authorCountsList = useMemo(\n () =>\n Object.keys(authorCounts).sort(\n (a, b) => authorCounts[b] - authorCounts[a],\n ),\n [authorCounts],\n );\n\n const sortedFilteredPosts = useMemo(() => {\n const authorIndices = {};\n authorCountsList.forEach((authorID, index) => {\n authorIndices[authorID] = index;\n });\n return filteredPosts\n .filter((post) => !post.__HIDDEN)\n .sort((a, b) => {\n if (groupBy === 'account') {\n const aAccountID = a.account.id;\n const bAccountID = b.account.id;\n const aIndex = authorIndices[aAccountID];\n const bIndex = authorIndices[bAccountID];\n const order = aIndex - bIndex;\n if (order !== 0) {\n return order;\n }\n }\n if (sortBy !== 'createdAt') {\n a = a.reblog || a;\n b = b.reblog || b;\n if (sortBy !== 'density' && a[sortBy] === b[sortBy]) {\n return a.createdAt > b.createdAt ? 1 : -1;\n }\n }\n if (sortBy === 'density') {\n const aDensity = postDensity(a);\n const bDensity = postDensity(b);\n if (sortOrder === 'asc') {\n return aDensity > bDensity ? 1 : -1;\n } else {\n return bDensity > aDensity ? 1 : -1;\n }\n }\n if (sortOrder === 'asc') {\n return a[sortBy] > b[sortBy] ? 1 : -1;\n } else {\n return b[sortBy] > a[sortBy] ? 1 : -1;\n }\n });\n }, [filteredPosts, sortBy, sortOrder, groupBy, authorCountsList]);\n\n const prevGroup = useRef(null);\n\n const authorsListParent = useRef(null);\n const autoAnimated = useRef(false);\n useEffect(() => {\n if (posts.length > 100 || autoAnimated.current) return;\n if (authorsListParent.current) {\n autoAnimate(authorsListParent.current, {\n duration: 200,\n });\n autoAnimated.current = true;\n }\n }, [posts, authorsListParent]);\n\n const postsBarType = posts.length > 160 ? '3d' : '2d';\n\n const postsBar = useMemo(() => {\n if (postsBarType !== '2d') return null;\n return posts.map((post) => {\n // If part of filteredPosts\n const isFiltered = filteredPostsMap[post.id];\n return (\n <span\n key={post.id}\n class={`post-dot ${isFiltered ? 'post-dot-highlight' : ''}`}\n />\n );\n });\n }, [filteredPostsMap]);\n\n const postsBins = useMemo(() => {\n if (postsBarType !== '3d') return null;\n if (!posts?.length) return null;\n const bins = binByTime(posts, 'createdAt', 320);\n return bins.map((posts, i) => {\n return (\n <div class=\"posts-bin\" key={i}>\n {posts.map((post) => {\n const isFiltered = filteredPostsMap[post.id];\n return (\n <span\n key={post.id}\n class={`post-dot ${isFiltered ? 'post-dot-highlight' : ''}`}\n />\n );\n })}\n </div>\n );\n });\n }, [filteredPostsMap]);\n\n const scrollableRef = useRef(null);\n\n // if range value exceeded lastCatchupEndAt, show error\n const lastCatchupRange = useMemo(() => {\n // return hour, not ms\n if (!lastCatchupEndAt) return null;\n return (Date.now() - lastCatchupEndAt) / 1000 / 60 / 60;\n }, [lastCatchupEndAt, range]);\n\n useEffect(() => {\n if (uiState !== 'results') return;\n const authorUsername =\n selectedAuthor && authors[selectedAuthor]\n ? authors[selectedAuthor].username\n : '';\n const sortOrderIndex = sortOrder === 'asc' ? 0 : 1;\n const groupByText = {\n account: 'authors',\n };\n let toast = showToast({\n duration: 5_000, // 5 seconds\n // Note: I'm sorry, translators\n text: t`Showing ${select(selectedFilterCategory, {\n all: 'all posts',\n original: 'original posts',\n replies: 'replies',\n boosts: 'boosts',\n quotes: 'quotes',\n followedTags: 'followed tags',\n groups: 'groups',\n filtered: 'filtered posts',\n })}, ${select(sortBy, {\n createdAt: select(sortOrder, {\n asc: 'oldest',\n desc: 'latest',\n }),\n reblogsCount: select(sortOrder, {\n asc: 'fewest boosts',\n desc: 'most boosts',\n }),\n favouritesCount: select(sortOrder, {\n asc: 'fewest likes',\n desc: 'most likes',\n }),\n repliesCount: select(sortOrder, {\n asc: 'fewest replies',\n desc: 'most replies',\n }),\n density: select(sortOrder, { asc: 'least dense', desc: 'most dense' }),\n })} first${select(groupBy, {\n account: ', grouped by authors',\n other: '',\n })}`,\n });\n return () => {\n toast?.hideToast?.();\n };\n }, [\n uiState,\n selectedFilterCategory,\n selectedAuthor,\n sortBy,\n sortOrder,\n groupBy,\n authors,\n ]);\n\n useEffect(() => {\n if (selectedAuthor) {\n if (authors[selectedAuthor]) {\n // Check if author is visible and within the scrollable area viewport\n const authorElement = authorsListParent.current.querySelector(\n `[data-author=\"${selectedAuthor}\"]`,\n );\n const scrollableRect =\n authorsListParent.current?.getBoundingClientRect();\n const authorRect = authorElement?.getBoundingClientRect();\n console.log({\n sLeft: scrollableRect.left,\n sRight: scrollableRect.right,\n aLeft: authorRect.left,\n aRight: authorRect.right,\n });\n if (\n authorRect.left < scrollableRect.left ||\n authorRect.right > scrollableRect.right\n ) {\n authorElement.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n } else if (authorRect.top < 0) {\n authorElement.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n behavior: 'smooth',\n });\n }\n }\n }\n }, [selectedAuthor, authors]);\n\n const [showHelp, setShowHelp] = useState(false);\n\n const itemsSelector = '.catchup-list > li > a';\n const jRef = useHotkeys(\n 'j',\n () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n const nextItem = allItems[activeItemIndex + 1];\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView({\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n }\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k',\n () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let prevItem = allItems[activeItemIndex - 1];\n if (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView({\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView({\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n });\n }\n }\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const hlRef = useHotkeys(\n 'h, l',\n (_, handler) => {\n // Go next/prev selectedAuthor in authorCountsList list\n const key = handler.keys[0];\n if (selectedAuthor) {\n const index = authorCountsList.indexOf(selectedAuthor);\n if (key === 'h') {\n if (index > 0 && index < authorCountsList.length) {\n setSelectedAuthor(authorCountsList[index - 1]);\n scrollableRef.current?.focus();\n }\n } else if (key === 'l') {\n if (index < authorCountsList.length - 1 && index >= 0) {\n setSelectedAuthor(authorCountsList[index + 1]);\n scrollableRef.current?.focus();\n }\n }\n } else if (key === 'l') {\n setSelectedAuthor(authorCountsList[0]);\n scrollableRef.current?.focus();\n }\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n enableOnFormTags: ['input'],\n },\n );\n\n const escRef = useHotkeys(\n 'esc',\n () => {\n setSelectedAuthor(null);\n scrollableRef.current?.focus();\n },\n {\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n enableOnFormTags: ['input'],\n useKey: true,\n },\n );\n\n const dotRef = useHotkeys(\n '.',\n () => {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n enableOnFormTags: ['input'],\n },\n );\n\n const handleArrowKeys = useCallback((e) => {\n const activeElement = document.activeElement;\n const isRadio =\n activeElement?.tagName === 'INPUT' && activeElement.type === 'radio';\n const isArrowKeys =\n e.key === 'ArrowDown' ||\n e.key === 'ArrowUp' ||\n e.key === 'ArrowLeft' ||\n e.key === 'ArrowRight';\n if (isArrowKeys && isRadio) {\n // Note: page scroll won't trigger on first arrow key press due to this. Subsequent presses will.\n activeElement.blur();\n return;\n }\n }, []);\n\n return (\n <div\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n hlRef.current = node;\n escRef.current = node;\n dotRef.current = node;\n }}\n id=\"catchup-page\"\n class=\"deck-container\"\n tabIndex=\"-1\"\n >\n <div class=\"timeline-deck deck wide\">\n <header\n class={`${uiState === 'loading' ? 'loading' : ''}`}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n }}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n {uiState === 'results' && (\n <Link to=\"/catchup\" class=\"button plain\">\n <Icon icon=\"history2\" size=\"l\" alt={t`Catch-up`} />\n </Link>\n )}\n {uiState === 'start' && (\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n )}\n </div>\n <h1>\n {uiState !== 'start' && (\n <Trans>\n Catch-up <sup>beta</sup>\n </Trans>\n )}\n </h1>\n <div class=\"header-side\">\n {uiState !== 'start' && uiState !== 'loading' && (\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n setShowHelp(true);\n }}\n >\n <Trans>Help</Trans>\n </button>\n )}\n </div>\n </div>\n </header>\n <main onKeyDown={handleArrowKeys}>\n {uiState === 'start' && (\n <div class=\"catchup-start\">\n <h1>\n <Trans>\n Catch-up <sup>beta</sup>\n </Trans>\n </h1>\n <details>\n <summary>\n <Trans>What is this?</Trans>\n </summary>\n <p>\n <Trans>\n Catch-up is a separate timeline for your followings,\n offering a high-level view at a glance, with a simple,\n email-inspired interface to effortlessly sort and filter\n through posts.\n </Trans>\n </p>\n <img\n src={catchupUrl}\n width=\"1200\"\n height=\"900\"\n alt={t`Preview of Catch-up UI`}\n />\n <p>\n <button\n type=\"button\"\n onClick={(e) => {\n e.target.closest('details').open = false;\n }}\n >\n <Trans>Let's catch up</Trans>\n </button>\n </p>\n </details>\n <p>\n <Trans>Let's catch up on the posts from your followings.</Trans>\n </p>\n <p>\n <b>\n <Trans>Show me all posts from…</Trans>\n </b>\n </p>\n <div class=\"catchup-form\">\n <input\n ref={catchupRangeRef}\n type=\"range\"\n value={range}\n min={RANGES[0].value}\n max={RANGES[RANGES.length - 1].value}\n step=\"1\"\n list=\"catchup-ranges\"\n onChange={(e) => setRange(+e.target.value)}\n />{' '}\n <span\n style={{\n width: '8em',\n }}\n >\n {_(RANGES[range - 1].label)}\n <br />\n <small class=\"insignificant\">\n {range == RANGES[RANGES.length - 1].value\n ? t`until the max`\n : niceDateTime(\n new Date(Date.now() - range * 60 * 60 * 1000),\n )}\n </small>\n </span>\n <datalist id=\"catchup-ranges\">\n {RANGES.map(({ label, value }) => (\n <option value={value} label={_(label)} />\n ))}\n </datalist>{' '}\n <button\n type=\"button\"\n onClick={() => {\n if (range < RANGES[RANGES.length - 1].value) {\n let duration;\n if (\n range === RANGES[RANGES.length - 1].value &&\n catchupLastRef.current?.checked\n ) {\n duration = Date.now() - lastCatchupEndAt;\n } else {\n duration = range * 60 * 60 * 1000;\n }\n handleCatchupClick({ duration });\n } else {\n handleCatchupClick();\n }\n }}\n >\n <Trans>Catch up</Trans>\n </button>\n </div>\n {lastCatchupRange && range > lastCatchupRange ? (\n <p class=\"catchup-info\">\n <Icon icon=\"info\" />{' '}\n <Trans>Overlaps with your last catch-up</Trans>\n </p>\n ) : range === RANGES[RANGES.length - 1].value &&\n lastCatchupEndAt ? (\n <p class=\"catchup-info\">\n <label>\n <input\n type=\"checkbox\"\n switch\n checked\n ref={catchupLastRef}\n />{' '}\n <Trans>\n Until the last catch-up (\n {dtf.format(new Date(lastCatchupEndAt))})\n </Trans>\n </label>\n </p>\n ) : null}\n <p class=\"insignificant\">\n <small>\n <Trans>\n Note: your instance might only show a maximum of 800 posts\n in the Home timeline regardless of the time range. Could be\n less or more.\n </Trans>\n </small>\n </p>\n {!!prevCatchups?.length && (\n <div class=\"catchup-prev\">\n <p>\n <Trans>Previously…</Trans>\n </p>\n <ul>\n {prevCatchups.map((pc) => (\n <li key={pc.id}>\n <Link to={`/catchup?id=${pc.id}`}>\n <Icon icon=\"history2\" />{' '}\n <span>\n {pc.startAt\n ? dtf.formatRange(\n new Date(pc.startAt),\n new Date(pc.endAt),\n )\n : `… – ${dtf.format(new Date(pc.endAt))}`}\n </span>\n </Link>{' '}\n <span>\n <small class=\"ib insignificant\">\n <Plural\n value={pc.count}\n one=\"# post\"\n other=\"# posts\"\n />\n </small>{' '}\n <button\n type=\"button\"\n class=\"light danger small\"\n onClick={async () => {\n const yes = confirm(t`Remove this catch-up?`);\n if (yes) {\n let st = showToast(\n t`Removing Catch-up ${pc.id}`,\n );\n await db.catchup.del(pc.id);\n st?.hideToast?.();\n showToast(t`Catch-up ${pc.id} removed`);\n reloadCatchups();\n }\n }}\n >\n <Icon icon=\"x\" alt={t`Remove`} />\n </button>\n </span>\n </li>\n ))}\n </ul>\n {prevCatchups.length >= 3 && (\n <p>\n <small>\n <Trans>\n Note: Only max 3 will be stored. The rest will be\n automatically removed.\n </Trans>\n </small>\n </p>\n )}\n </div>\n )}\n </div>\n )}\n {uiState === 'loading' && (\n <div class=\"ui-state catchup-start\">\n <Loader abrupt />\n <p class=\"insignificant\">\n <Trans>Fetching posts…</Trans>\n </p>\n <p class=\"insignificant\">\n <Trans>This might take a while.</Trans>\n </p>\n </div>\n )}\n {uiState === 'results' && (\n <>\n <div class=\"catchup-header\">\n {posts.length > 0 && (\n <p>\n <b class=\"ib\">\n {dtf.formatRange(\n new Date(posts[0].createdAt),\n new Date(posts[posts.length - 1].createdAt),\n )}\n </b>\n </p>\n )}\n <aside>\n <button\n hidden={\n selectedFilterCategory === 'all' &&\n !selectedAuthor &&\n sortBy === 'createdAt' &&\n sortOrder === 'asc'\n }\n type=\"button\"\n class=\"plain4 small\"\n onClick={() => {\n setSelectedFilterCategory('all');\n setSelectedAuthor(null);\n setSortBy('createdAt');\n setGroupBy(null);\n setSortOrder('asc');\n }}\n >\n <Trans>Reset filters</Trans>\n </button>\n {links?.length > 0 && (\n <button\n type=\"button\"\n class=\"plain small\"\n onClick={() => setShowTopLinks(!showTopLinks)}\n >\n <Trans>Top links</Trans>{' '}\n <Icon\n icon=\"chevron-down\"\n style={{\n transform: showTopLinks\n ? 'rotate(180deg)'\n : 'rotate(0deg)',\n }}\n />\n </button>\n )}\n </aside>\n </div>\n <div class=\"shazam-container no-animation\" hidden={!showTopLinks}>\n <div class=\"shazam-container-inner\">\n <div class=\"catchup-top-links links-bar\">\n {links.map((link) => {\n const { card, shared, sharers, likes, boosts } = link;\n const {\n blurhash,\n title,\n description,\n url,\n image,\n imageDescription,\n language,\n width,\n height,\n publishedAt,\n } = card;\n const domain = getDomain(url);\n let accentColor;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n const labAverageColor = rgb2oklab(averageColor);\n accentColor = oklab2rgb([\n 0.6,\n labAverageColor[1],\n labAverageColor[2],\n ]);\n }\n\n return (\n <a\n key={url}\n href={url}\n target=\"_blank\"\n rel=\"noopener\"\n class=\"link-block\"\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.join(\n ',',\n )})`,\n '--accent-alpha-color': `rgba(${accentColor.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n >\n <article>\n <figure>\n <img\n src={image}\n alt={imageDescription}\n width={width}\n height={height}\n loading=\"lazy\"\n />\n </figure>\n <div class=\"article-body\">\n <header>\n <div class=\"article-meta\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>· </>}\n {!!publishedAt && (\n <>\n <RelativeTime\n datetime={publishedAt}\n format=\"micro\"\n />\n </>\n )}\n </div>\n {!!title && (\n <h1\n class=\"title\"\n lang={language}\n dir=\"auto\"\n title={title}\n >\n {title}\n </h1>\n )}\n </header>\n {!!description && (\n <p\n class=\"description\"\n lang={language}\n dir=\"auto\"\n title={description}\n >\n {description}\n </p>\n )}\n <hr />\n <p\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n <Trans>\n Shared by{' '}\n {sharers.map((s) => {\n const { avatarStatic, displayName } = s;\n return (\n <button\n type=\"button\"\n class=\"plain\"\n style={{\n padding: 0,\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n // Reset and filter to author\n const { id } = s;\n setSelectedAuthor(id);\n setSelectedFilterCategory('all');\n }}\n >\n <Avatar\n url={avatarStatic}\n size=\"s\"\n alt={displayName}\n />\n </button>\n );\n })}\n </Trans>\n </p>\n </div>\n </article>\n </a>\n );\n })}\n </div>\n </div>\n </div>\n {posts.length >= 5 &&\n (postsBarType === '3d' ? (\n <div class=\"catchup-posts-viz-time-bar\">{postsBins}</div>\n ) : (\n <div class=\"catchup-posts-viz-bar\">{postsBar}</div>\n ))}\n {posts.length >= 2 && (\n <div class=\"catchup-filters\">\n <label class=\"filter-cat\">\n <input\n type=\"radio\"\n name=\"filter-cat\"\n checked={selectedFilterCategory.toLowerCase() === 'all'}\n onChange={() => {\n setSelectedFilterCategory('all');\n }}\n />\n <Trans>All</Trans> <span class=\"count\">{posts.length}</span>\n </label>\n {Object.entries(FILTER_KEYS).map(\n ([key, label]) =>\n !!filterCounts[key] && (\n <label\n class=\"filter-cat\"\n key={_(label)}\n title={\n ((filterCounts[key] / posts.length) * 100).toFixed(\n 2,\n ) + '%'\n }\n >\n <input\n type=\"radio\"\n name=\"filter-cat\"\n checked={\n selectedFilterCategory.toLowerCase() ===\n key.toLowerCase()\n }\n onChange={() => {\n setSelectedFilterCategory(key);\n if (key === 'boosts') {\n setSortBy('reblogsCount');\n setSortOrder('desc');\n setGroupBy(null);\n }\n // setSelectedAuthor(null);\n }}\n />\n {_(label)}{' '}\n <span class=\"count\">{filterCounts[key]}</span>\n </label>\n ),\n )}\n </div>\n )}\n {posts.length >= 2 && !!authorCounts && (\n <div\n class=\"catchup-filters authors-filters\"\n ref={authorsListParent}\n >\n {authorCountsList.map((author) => (\n <label\n class=\"filter-author\"\n data-author={author}\n key={`${author}-${authorCounts[author]}`}\n // Preact messed up the order sometimes, need additional key besides just `author`\n // https://github.com/preactjs/preact/issues/2849\n >\n <input\n type=\"radio\"\n name=\"filter-author\"\n checked={selectedAuthor === author}\n onChange={() => {\n setSelectedAuthor(author);\n // setGroupBy(null);\n }}\n onClick={() => {\n if (selectedAuthor === author) {\n setSelectedAuthor(null);\n }\n }}\n />\n <Avatar\n url={\n authors[author].avatarStatic || authors[author].avatar\n }\n size=\"xxl\"\n alt={`${authors[author].displayName} (@${authors[author].acct})`}\n />{' '}\n <span class=\"count\">{authorCounts[author]}</span>\n <span class=\"username\">{authors[author].username}</span>\n </label>\n ))}\n {authorCountsList.length > 5 && (\n <small\n key=\"authors-count\"\n style={{\n whiteSpace: 'nowrap',\n paddingInline: '1em',\n opacity: 0.33,\n }}\n >\n <Plural\n value={authorCountsList.length}\n one=\"# author\"\n other=\"# authors\"\n />\n </small>\n )}\n </div>\n )}\n {posts.length >= 2 && (\n <div class=\"catchup-filters\">\n <span class=\"filter-label\">\n <Trans>Sort</Trans>\n </span>{' '}\n <fieldset class=\"radio-field-group\">\n {FILTER_SORTS.map((key) => (\n <label\n class=\"filter-sort\"\n key={key}\n onClick={(e) => {\n if (sortBy === key) {\n e.preventDefault();\n e.stopPropagation();\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc');\n }\n }}\n >\n <input\n type=\"radio\"\n name=\"filter-sort-cat\"\n checked={sortBy === key}\n onChange={() => {\n setSortBy(key);\n const order =\n /(replies|favourites|reblogs|quotes)/.test(key)\n ? 'desc'\n : 'asc';\n setSortOrder(order);\n }}\n />\n {\n {\n createdAt: t`Date`,\n repliesCount: t`Replies`,\n favouritesCount: t`Likes`,\n reblogsCount: t`Boosts`,\n quotesCount: t`Quotes`,\n density: t`Density`,\n }[key]\n }\n {sortBy === key && (sortOrder === 'asc' ? ' ↑' : ' ↓')}\n </label>\n ))}\n </fieldset>\n {/* <fieldset class=\"radio-field-group\">\n {['asc', 'desc'].map((key) => (\n <label class=\"filter-sort\" key={key}>\n <input\n type=\"radio\"\n name=\"filter-sort-dir\"\n checked={sortOrder === key}\n onChange={() => {\n setSortOrder(key);\n }}\n />\n {key === 'asc' ? '↑' : '↓'}\n </label>\n ))}\n </fieldset> */}\n <span class=\"filter-label\">\n <Trans id=\"group.filter\">Group</Trans>\n </span>{' '}\n <fieldset class=\"radio-field-group\">\n {FILTER_GROUPS.map((key) => (\n <label class=\"filter-group\" key={key || 'none'}>\n <input\n type=\"radio\"\n name=\"filter-group\"\n checked={groupBy === key}\n onChange={() => {\n setGroupBy(key);\n }}\n disabled={key === 'account' && selectedAuthor}\n />\n {{\n account: t`Authors`,\n }[key] || t`None`}\n </label>\n ))}\n </fieldset>\n {\n selectedAuthor && authorCountsList.length > 1 ? (\n <button\n type=\"button\"\n class=\"plain6 small\"\n onClick={() => {\n setSelectedAuthor(null);\n }}\n style={{\n whiteSpace: 'nowrap',\n }}\n >\n <Trans>Show all authors</Trans>\n </button>\n ) : null\n // <button\n // type=\"button\"\n // class=\"plain4 small\"\n // onClick={() => {}}\n // >\n // Group by authors\n // </button>\n }\n </div>\n )}\n <ul\n class={`catchup-list catchup-filter-${\n selectedFilterCategory || ''\n } ${sortBy ? `catchup-sort-${sortBy}` : ''} ${\n selectedAuthor && authors[selectedAuthor]\n ? `catchup-selected-author`\n : ''\n } ${groupBy ? `catchup-group-${groupBy}` : ''}`}\n >\n {sortedFilteredPosts.map((post, i) => {\n const id = post.reblog?.id || post.id;\n let showSeparator = false;\n if (groupBy === 'account') {\n if (\n prevGroup.current &&\n post.account.id !== prevGroup.current &&\n i > 0\n ) {\n showSeparator = true;\n }\n prevGroup.current = post.account.id;\n }\n return (\n <Fragment key={`${post.id}-${showSeparator}`}>\n {showSeparator && <li class=\"separator\" />}\n <IntersectionPostLineItem\n to={`/${instance}/s/${id}`}\n post={post}\n root={scrollableRef.current}\n />\n </Fragment>\n );\n })}\n </ul>\n <footer>\n {filteredPosts.length > 5 && (\n <p>\n {selectedFilterCategory === 'boosts'\n ? t`You don't have to read everything.`\n : t`That's all.`}{' '}\n <button\n type=\"button\"\n class=\"textual\"\n onClick={() => {\n scrollableRef.current.scrollTop = 0;\n }}\n >\n <Trans>Back to top</Trans>\n </button>\n .\n </p>\n )}\n </footer>\n </>\n )}\n </main>\n </div>\n {showHelp && (\n <Modal onClose={() => setShowHelp(false)}>\n <div class=\"sheet\" id=\"catchup-help-sheet\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowHelp(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans>Help</Trans>\n </h2>\n </header>\n <main>\n <dl>\n <dt>\n <Trans>Top links</Trans>\n </dt>\n <dd>\n <Trans>\n Links shared by followings, sorted by shared counts, boosts\n and likes.\n </Trans>\n </dd>\n <dt>\n <Trans>Sort: Density</Trans>\n </dt>\n <dd>\n <Trans>\n Posts are sorted by information density or depth. Shorter\n posts are \"lighter\" while longer posts are \"heavier\". Posts\n with photos are \"heavier\" than posts without photos.\n </Trans>\n </dd>\n <dt>\n <Trans>Group: Authors</Trans>\n </dt>\n <dd>\n <Trans>\n Posts are grouped by authors, sorted by posts count per\n author.\n </Trans>\n </dd>\n <dt>\n <Trans>Keyboard shortcuts</Trans>\n </dt>\n {/* <dd>\n <kbd>j</kbd>: <Trans>Next post</Trans>\n </dd>\n <dd>\n <kbd>k</kbd>: <Trans>Previous post</Trans>\n </dd>\n <dd>\n <kbd>l</kbd>: <Trans>Next author</Trans>\n </dd>\n <dd>\n <kbd>h</kbd>: <Trans>Previous author</Trans>\n </dd>\n <dd>\n <kbd>Enter</kbd>: <Trans>Open post details</Trans>\n </dd>\n <dd>\n <kbd>.</kbd>: <Trans>Scroll to top</Trans>\n </dd> */}\n <dd>\n <table>\n <tbody>\n <tr>\n <td>\n <Trans>Next post</Trans>\n </td>\n <td>\n <kbd>j</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Previous post</Trans>\n </td>\n <td>\n <kbd>k</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Next author</Trans>\n </td>\n <td>\n <kbd>l</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Previous author</Trans>\n </td>\n <td>\n <kbd>h</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Open post details</Trans>\n </td>\n <td>\n <kbd>Enter</kbd>\n </td>\n </tr>\n <tr>\n <td>\n <Trans>Scroll to top</Trans>\n </td>\n <td>\n <kbd>.</kbd>\n </td>\n </tr>\n </tbody>\n </table>\n </dd>\n </dl>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nconst PostLine = memo(\n function ({ post }) {\n const {\n id,\n account,\n group,\n reblog,\n quote,\n inReplyToId,\n inReplyToAccountId,\n _followedTags: isFollowedTags,\n _filtered: filterInfo,\n visibility,\n __BOOSTERS,\n } = post;\n const isReplyTo = inReplyToId && inReplyToAccountId !== account.id;\n const isFiltered = !!filterInfo && filterInfo?.action !== 'blur';\n\n const debugHover = (e) => {\n if (e.shiftKey) {\n console.log({\n ...post,\n });\n }\n };\n\n return (\n <article\n class={`post-line ${\n group\n ? 'group'\n : reblog\n ? 'reblog'\n : supportsNativeQuote() && hasQuote(quote)\n ? 'quote'\n : isFollowedTags?.length\n ? 'followed-tags'\n : ''\n } ${isReplyTo ? 'reply-to' : ''} ${\n isFiltered ? 'filtered' : ''\n } visibility-${visibility}`}\n onMouseEnter={debugHover}\n >\n <span class=\"post-author\">\n {reblog ? (\n <span class=\"post-reblog-avatar\">\n <Avatar\n url={account.avatarStatic || account.avatar}\n squircle={account.bot}\n />\n {__BOOSTERS?.size > 0\n ? [...__BOOSTERS].map((b) => (\n <Avatar url={b.avatarStatic || b.avatar} squircle={b.bot} />\n ))\n : ''}{' '}\n <Icon icon=\"rocket\" />{' '}\n {/* <Avatar\n url={reblog.account.avatarStatic || reblog.account.avatar}\n squircle={reblog.account.bot}\n /> */}\n <NameText account={reblog.account} showAvatar />\n </span>\n ) : hasQuote(quote) ? (\n <span class=\"post-quote-avatar\">\n <Avatar\n url={account.avatarStatic || account.avatar}\n squircle={account.bot}\n />{' '}\n <Icon icon=\"quote\" />{' '}\n <NameText\n account={quote.quotedStatus?.account || quote.account}\n showAvatar\n />\n </span>\n ) : (\n <NameText account={account} showAvatar />\n )}\n </span>\n <PostPeek post={reblog || post} filterInfo={filterInfo} />\n <span class=\"post-meta\">\n <PostStats post={reblog || post} />{' '}\n <RelativeTime\n datetime={new Date(reblog?.createdAt || post.createdAt)}\n format=\"micro\"\n />\n </span>\n </article>\n );\n },\n (oldProps, newProps) => {\n return oldProps?.post?.id === newProps?.post?.id;\n },\n);\n\nconst IntersectionPostLineItem = ({ root, to, ...props }) => {\n const ref = useRef();\n const [show, setShow] = useState(false);\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry.isIntersecting) {\n queueMicrotask(() => setShow(true));\n observer.unobserve(ref.current);\n }\n },\n {\n root,\n rootMargin: `${Math.max(320, screen.height * 0.75)}px`,\n },\n );\n if (ref.current) observer.observe(ref.current);\n return () => {\n if (ref.current) observer.unobserve(ref.current);\n };\n }, []);\n\n return show ? (\n <li>\n <Link to={to}>\n <PostLine {...props} />\n </Link>\n </li>\n ) : (\n <li ref={ref} style={{ height: '4em' }} />\n );\n};\n\n// A media speak a thousand words\nconst MEDIA_DENSITY = 8;\nconst CARD_DENSITY = 8;\nfunction postDensity(post) {\n const { spoilerText, content, poll, mediaAttachments, card } = post;\n const pollContent = poll?.options?.length\n ? poll.options.reduce((acc, cur) => acc + cur.title, '')\n : '';\n const density =\n (spoilerText.length + htmlContentLength(content) + pollContent.length) /\n 140 +\n (mediaAttachments?.length\n ? MEDIA_DENSITY * mediaAttachments.length\n : card?.image\n ? CARD_DENSITY\n : 0);\n return density;\n}\n\nconst MEDIA_SIZE = 48;\n\nfunction PostPeek({ post, filterInfo }) {\n const { t } = useLingui();\n let {\n spoilerText,\n sensitive,\n content,\n emojis,\n poll,\n mediaAttachments,\n card,\n inReplyToId,\n inReplyToAccountId,\n account,\n _thread,\n quote,\n } = post;\n const isThread =\n (inReplyToId && inReplyToAccountId === account.id) || !!_thread;\n let theQuote =\n supportsNativeQuote() && hasQuote(quote)\n ? quote.quotedStatus || quote\n : null;\n if (theQuote?.spoilerText || theQuote?.sensitive) theQuote = null;\n if (theQuote?.emojis) emojis.push(...theQuote.emojis);\n if (!mediaAttachments?.length && theQuote?.mediaAttachments?.length) {\n mediaAttachments = theQuote.mediaAttachments;\n }\n\n const prefs = getPreferences();\n const readingExpandSpoilers = !!prefs['reading:expand:spoilers'];\n // const readingExpandSpoilers = true;\n const showMedia =\n readingExpandSpoilers ||\n (!spoilerText && !sensitive && filterInfo?.action !== 'blur');\n const postText = content ? statusPeek(post) : '';\n\n const showPostContent = !spoilerText || readingExpandSpoilers;\n\n return (\n <div class=\"post-peek\" title={!spoilerText ? postText : ''}>\n <span class=\"post-peek-content\">\n {isThread && !showPostContent && (\n <>\n <span class=\"post-peek-tag post-peek-thread\">Thread</span>{' '}\n </>\n )}\n {!!filterInfo && filterInfo?.action !== 'blur' ? (\n <span class=\"post-peek-filtered\">\n {/* Filtered{filterInfo?.titlesStr ? `: ${filterInfo.titlesStr}` : ''} */}\n {filterInfo?.titlesStr\n ? t`Filtered: ${filterInfo.titlesStr}`\n : t`Filtered`}\n </span>\n ) : (\n <>\n {!!spoilerText && (\n <span class=\"post-peek-spoiler\">\n <Icon\n icon={`${readingExpandSpoilers ? 'eye-open' : 'eye-close'}`}\n />{' '}\n {spoilerText}\n </span>\n )}\n {showPostContent && (\n <div class=\"post-peek-html\">\n {isThread && (\n <>\n <span class=\"post-peek-tag post-peek-thread\">\n <Trans>Thread</Trans>\n </span>{' '}\n </>\n )}\n {!!content && (\n <div\n dangerouslySetInnerHTML={{\n __html:\n emojifyText(content, emojis) +\n (!!theQuote?.content\n ? `<blockquote class=\"post-peek-quote\">${theQuote.content}</blockquote>`\n : ''),\n }}\n />\n )}\n {!!poll?.options?.length &&\n poll.options.map((o) => (\n <div>\n {poll.multiple ? '▪️' : '•'} {o.title}\n </div>\n ))}\n {!content &&\n mediaAttachments?.length === 1 &&\n mediaAttachments[0].description && (\n <>\n <span class=\"post-peek-tag post-peek-alt\">ALT</span>{' '}\n <div>{mediaAttachments[0].description}</div>\n </>\n )}\n </div>\n )}\n </>\n )}\n </span>\n {(!filterInfo || filterInfo?.action === 'blur') && (\n <span class=\"post-peek-post-content\">\n {!!poll && (\n <span class=\"post-peek-tag post-peek-poll\">\n <Icon icon=\"poll\" size=\"s\" />\n <Trans>Poll</Trans>\n </span>\n )}\n {!!mediaAttachments?.length\n ? mediaAttachments.map((m) => {\n const mediaURL = m.previewUrl || m.url;\n const remoteMediaURL = m.previewRemoteUrl || m.remoteUrl;\n const width = m.meta?.original\n ? m.meta.original.width\n : m.meta?.small?.width || m.meta?.original?.width;\n const height = m.meta?.original\n ? m.meta.original.height\n : m.meta?.small?.height || m.meta?.original?.height;\n return (\n <span key={m.id} class=\"post-peek-media\">\n {{\n image:\n (mediaURL || remoteMediaURL) && showMedia ? (\n <img\n src={mediaURL}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={m.description}\n loading=\"lazy\"\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n style={{\n '--anim-duration': `${Math.min(\n Math.max(Math.max(width, height) / 100, 5),\n 120,\n )}s`,\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">🖼</span>\n ),\n gifv:\n (mediaURL || remoteMediaURL) && showMedia ? (\n <img\n src={mediaURL}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={m.description}\n loading=\"lazy\"\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">🎞️</span>\n ),\n video:\n (mediaURL || remoteMediaURL) && showMedia ? (\n <img\n src={mediaURL}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={m.description}\n loading=\"lazy\"\n onError={(e) => {\n const { src } = e.target;\n if (src === mediaURL) {\n e.target.src = remoteMediaURL;\n }\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">📹</span>\n ),\n audio: <span class=\"post-peek-faux-media\">🎵</span>,\n }[m.type] || null}\n </span>\n );\n })\n : !!card &&\n card.image &&\n showMedia && (\n <span\n class={`post-peek-media post-peek-card card-${\n card.type || ''\n }`}\n >\n {card.image ? (\n <img\n src={card.image}\n width={MEDIA_SIZE}\n height={MEDIA_SIZE}\n alt={\n card.title || card.description || card.imageDescription\n }\n loading=\"lazy\"\n style={{\n '--anim-duration':\n card.width &&\n card.height &&\n `${Math.min(\n Math.max(\n Math.max(card.width, card.height) / 100,\n 5,\n ),\n 120,\n )}s`,\n }}\n />\n ) : (\n <span class=\"post-peek-faux-media\">🔗</span>\n )}\n </span>\n )}\n </span>\n )}\n </div>\n );\n}\n\nfunction PostStats({ post }) {\n const { t } = useLingui();\n const { reblogsCount, repliesCount, favouritesCount, quotesCount } = post;\n return (\n <span class=\"post-stats\">\n {repliesCount > 0 && (\n <span class=\"post-stat-replies\">\n <Icon icon=\"comment2\" size=\"s\" alt={t`Replies`} />{' '}\n {shortenNumber(repliesCount)}\n </span>\n )}\n {favouritesCount > 0 && (\n <span class=\"post-stat-likes\">\n <Icon icon=\"heart\" size=\"s\" alt={t`Likes`} />{' '}\n {shortenNumber(favouritesCount)}\n </span>\n )}\n {reblogsCount > 0 || quotesCount > 0 ? (\n <span class=\"post-stat-boosts\">\n <Icon icon=\"rocket\" size=\"s\" alt={t`Boosts`} />{' '}\n {reblogsCount > 0 || quotesCount > 0\n ? `${reblogsCount > 0 ? shortenNumber(reblogsCount) : ''}${\n reblogsCount > 0 && quotesCount > 0 ? '+' : ''\n }${quotesCount > 0 ? shortenNumber(quotesCount) : ''}`\n : shortenNumber(reblogsCount)}\n </span>\n ) : null}\n </span>\n );\n}\n\nfunction binByTime(data, key, numBins) {\n // Extract dates from data objects\n const dates = data.map((item) => new Date(item[key]));\n\n // Find minimum and maximum dates directly (avoiding Math.min/max)\n const minDate = dates.reduce(\n (acc, date) => (date < acc ? date : acc),\n dates[0],\n );\n const maxDate = dates.reduce(\n (acc, date) => (date > acc ? date : acc),\n dates[0],\n );\n\n // Calculate the time span in milliseconds\n const range = Math.min(maxDate.getTime(), Date.now()) - minDate.getTime();\n\n // Create empty bins and loop through data\n const bins = Array.from({ length: numBins }, () => []);\n data.forEach((item) => {\n const dateTime = Date.parse(item[key]);\n if (dateTime > Date.now()) {\n // Future dates go into the last bin\n bins[bins.length - 1].push(item);\n } else {\n const normalized = (dateTime - minDate.getTime()) / range;\n const binIndex = Math.floor(normalized * (numBins - 1));\n bins[binIndex].push(item);\n }\n });\n\n return bins;\n}\n\nexport default Catchup;\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useRef } from 'preact/hooks';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Favourites() {\n const { t } = useLingui();\n useTitle(t`Likes`, '/favourites');\n const { masto, instance } = api();\n const favouritesIterator = useRef();\n async function fetchFavourites(firstLoad) {\n if (firstLoad || !favouritesIterator.current) {\n favouritesIterator.current = masto.v1.favourites\n .list({ limit: LIMIT })\n .values();\n }\n return await favouritesIterator.current.next();\n }\n\n return (\n <Timeline\n title={t`Likes`}\n id=\"favourites\"\n emptyText={t`No likes yet. Go like something!`}\n errorText={t`Unable to load likes.`}\n instance={instance}\n fetchItems={fetchFavourites}\n />\n );\n}\n\nexport default Favourites;\n","import './filters.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useRef, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport { api } from '../utils/api';\nimport i18nDuration from '../utils/i18n-duration';\nimport { getAPIVersions } from '../utils/store-utils';\nimport useInterval from '../utils/useInterval';\nimport useTitle from '../utils/useTitle';\n\nconst FILTER_CONTEXT = ['home', 'public', 'notifications', 'thread', 'account'];\nconst FILTER_CONTEXT_UNIMPLEMENTED = ['thread', 'account'];\nconst FILTER_CONTEXT_LABELS = {\n home: msg`Home and lists`,\n notifications: msg`Notifications`,\n public: msg`Public timelines`,\n thread: msg`Conversations`,\n account: msg`Profiles`,\n};\n\nconst EXPIRY_DURATIONS = [\n 0, // forever\n 30 * 60, // 30 minutes\n 60 * 60, // 1 hour\n 6 * 60 * 60, // 6 hours\n 12 * 60 * 60, // 12 hours\n 60 * 60 * 24, // 24 hours\n 60 * 60 * 24 * 7, // 7 days\n 60 * 60 * 24 * 30, // 30 days\n];\n\nconst EXPIRY_DURATIONS_LABELS = {\n 0: msg`Never`,\n 1800: i18nDuration(30, 'minute'),\n 3600: i18nDuration(1, 'hour'),\n 21600: i18nDuration(6, 'hour'),\n 43200: i18nDuration(12, 'hour'),\n 86_400: i18nDuration(24, 'hour'),\n 604_800: i18nDuration(7, 'day'),\n 2_592_000: i18nDuration(30, 'day'),\n};\n\nfunction Filters() {\n const { t } = useLingui();\n const { masto } = api();\n useTitle(t`Filters`, `/ft`);\n const [uiState, setUIState] = useState('default');\n const [showFiltersAddEditModal, setShowFiltersAddEditModal] = useState(false);\n\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [filters, setFilters] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const filters = await masto.v2.filters.list();\n filters.sort((a, b) => a.title.localeCompare(b.title));\n filters.forEach((filter) => {\n if (filter.keywords?.length) {\n filter.keywords.sort((a, b) => a.id - b.id);\n }\n });\n console.log(filters);\n setFilters(filters);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n return (\n <div id=\"filters-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Filters</Trans>\n </h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n setShowFiltersAddEditModal(true);\n }}\n >\n <Icon icon=\"plus\" size=\"l\" alt={t`New filter`} />\n </button>\n </div>\n </div>\n </header>\n <main>\n {filters.length > 0 ? (\n <>\n <ul class=\"filters-list\">\n {filters.map((filter) => {\n const { id, title, expiresAt, keywords } = filter;\n return (\n <li key={id}>\n <div>\n <h2>{title}</h2>\n {keywords?.length > 0 && (\n <div>\n {keywords.map((k) => (\n <>\n <span class=\"tag collapsed insignificant\">\n {k.wholeWord ? `“${k.keyword}”` : k.keyword}\n </span>{' '}\n </>\n ))}\n </div>\n )}\n <small class=\"insignificant\">\n <ExpiryStatus expiresAt={expiresAt} />\n </small>\n </div>\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n setShowFiltersAddEditModal({\n filter,\n });\n }}\n >\n <Icon icon=\"pencil\" size=\"l\" alt=\"Edit filter\" />\n </button>\n </li>\n );\n })}\n </ul>\n {filters.length > 1 && (\n <footer class=\"ui-state\">\n <small class=\"insignificant\">\n <Plural\n value={filters.length}\n one=\"# filter\"\n other=\"# filters\"\n />\n </small>\n </footer>\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load filters.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No filters yet.</Trans>\n </p>\n )}\n </main>\n </div>\n {!!showFiltersAddEditModal && (\n <Modal\n title={t`Add filter`}\n onClose={() => {\n setShowFiltersAddEditModal(false);\n }}\n >\n <FiltersAddEdit\n filter={showFiltersAddEditModal?.filter}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowFiltersAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nlet _id = 1;\nconst incID = () => _id++;\nfunction FiltersAddEdit({ filter, onClose }) {\n const { _, t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const editMode = !!filter;\n const { context, expiresAt, id, keywords, title, filterAction } =\n filter || {};\n const hasExpiry = !!expiresAt;\n const expiresAtDate = hasExpiry && new Date(expiresAt);\n const [editKeywords, setEditKeywords] = useState(keywords || []);\n const keywordsRef = useRef();\n\n // Hacky way of handling removed keywords for both existing and new ones\n const [removedKeywordIDs, setRemovedKeywordIDs] = useState([]);\n const [removedKeyword_IDs, setRemovedKeyword_IDs] = useState([]);\n\n const filteredEditKeywords = editKeywords.filter(\n (k) =>\n !removedKeywordIDs.includes(k.id) && !removedKeyword_IDs.includes(k._id),\n );\n\n return (\n <div class=\"sheet\" id=\"filters-add-edit-modal\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>{editMode ? t`Edit filter` : t`New filter`}</h2>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const formData = new FormData(e.target);\n const title = formData.get('title');\n const keywordIDs = formData.getAll('keyword_attributes[][id]');\n const keywordKeywords = formData.getAll(\n 'keyword_attributes[][keyword]',\n );\n // const keywordWholeWords = formData.getAll(\n // 'keyword_attributes[][whole_word]',\n // );\n // Not using getAll because it skips the empty checkboxes\n const keywordWholeWords = [\n ...keywordsRef.current.querySelectorAll(\n 'input[name=\"keyword_attributes[][whole_word]\"]',\n ),\n ].map((i) => i.checked);\n const keywordsAttributes = keywordKeywords.map((k, i) => ({\n id: keywordIDs[i] || undefined,\n keyword: k,\n wholeWord: keywordWholeWords[i],\n }));\n // if (editMode && keywords?.length) {\n // // Find which one got deleted and add to keywordsAttributes\n // keywords.forEach((k) => {\n // if (!keywordsAttributes.find((ka) => ka.id === k.id)) {\n // keywordsAttributes.push({\n // ...k,\n // _destroy: true,\n // });\n // }\n // });\n // }\n if (editMode && removedKeywordIDs?.length) {\n removedKeywordIDs.forEach((id) => {\n keywordsAttributes.push({\n id,\n _destroy: true,\n });\n });\n }\n const context = formData.getAll('context');\n let expiresIn = formData.get('expires_in');\n const filterAction = formData.get('filter_action');\n console.log({\n title,\n keywordIDs,\n keywords: keywordKeywords,\n wholeWords: keywordWholeWords,\n keywordsAttributes,\n context,\n expiresIn,\n filterAction,\n });\n\n // Required fields\n if (!title || !context?.length) {\n return;\n }\n\n setUIState('loading');\n\n (async () => {\n try {\n let filterResult;\n\n if (editMode) {\n if (expiresIn === '' || expiresIn === null) {\n // No value\n // Preserve existing expiry if not specified\n // Seconds from now to expiresAtDate\n // Other clients don't do this\n if (hasExpiry) {\n expiresIn = Math.floor(\n (expiresAtDate - Date.now()) / 1000,\n );\n } else {\n expiresIn = null;\n }\n } else if (expiresIn === '0' || expiresIn === 0) {\n // 0 = Never\n expiresIn = null;\n } else {\n expiresIn = +expiresIn;\n }\n filterResult = await masto.v2.filters.$select(id).update({\n title,\n context,\n expiresIn,\n keywordsAttributes,\n filterAction,\n });\n } else {\n expiresIn = +expiresIn || null;\n filterResult = await masto.v2.filters.create({\n title,\n context,\n expiresIn,\n keywordsAttributes,\n filterAction,\n });\n }\n console.log({ filterResult });\n setUIState('default');\n onClose?.({\n state: 'success',\n filter: filterResult,\n });\n } catch (error) {\n console.error(error);\n setUIState('error');\n alert(\n editMode\n ? t`Unable to edit filter`\n : t`Unable to create filter`,\n );\n }\n })();\n }}\n >\n <div class=\"filter-form-row\">\n <label>\n <b>\n <Trans>Title</Trans>\n </b>\n <input\n type=\"text\"\n name=\"title\"\n defaultValue={title}\n disabled={uiState === 'loading'}\n dir=\"auto\"\n required\n />\n </label>\n </div>\n <div class=\"filter-form-keywords\" ref={keywordsRef}>\n {filteredEditKeywords.length ? (\n <ul class=\"filter-keywords\">\n {filteredEditKeywords.map((k) => {\n const { id, keyword, wholeWord, _id } = k;\n return (\n <li key={`${id}-${_id}`}>\n <input\n type=\"hidden\"\n name=\"keyword_attributes[][id]\"\n value={id}\n />\n <input\n name=\"keyword_attributes[][keyword]\"\n type=\"text\"\n defaultValue={keyword}\n disabled={uiState === 'loading'}\n required\n dir=\"auto\"\n />\n <div class=\"filter-keyword-actions\">\n <label>\n <input\n name=\"keyword_attributes[][whole_word]\"\n type=\"checkbox\"\n value={id} // Hacky way to map checkbox boolean to the keyword id\n defaultChecked={wholeWord}\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>Whole word</Trans>\n </label>\n <button\n type=\"button\"\n class=\"light danger small\"\n disabled={uiState === 'loading'}\n onClick={() => {\n if (id) {\n removedKeywordIDs.push(id);\n setRemovedKeywordIDs([...removedKeywordIDs]);\n } else if (_id) {\n removedKeyword_IDs.push(_id);\n setRemovedKeyword_IDs([...removedKeyword_IDs]);\n }\n }}\n >\n <Icon icon=\"x\" alt={t`Remove`} />\n </button>\n </div>\n </li>\n );\n })}\n </ul>\n ) : (\n <div class=\"filter-keywords\">\n <div class=\"insignificant\">\n <Trans>No keywords. Add one.</Trans>\n </div>\n </div>\n )}\n <footer class=\"filter-keywords-footer\">\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n setEditKeywords([\n ...editKeywords,\n {\n _id: incID(),\n keyword: '',\n wholeWord: true,\n },\n ]);\n setTimeout(() => {\n // Focus last input\n const fields =\n keywordsRef.current.querySelectorAll(\n 'input[type=\"text\"]',\n );\n fields[fields.length - 1]?.focus?.();\n }, 10);\n }}\n >\n <Trans>Add keyword</Trans>\n </button>{' '}\n {filteredEditKeywords?.length > 1 && (\n <small class=\"insignificant\">\n <Plural\n value={filteredEditKeywords.length}\n one=\"# keyword\"\n other=\"# keywords\"\n />\n </small>\n )}\n </footer>\n </div>\n <div class=\"filter-form-cols\">\n <div class=\"filter-form-col\">\n <div>\n <b>\n <Trans>Filter from…</Trans>\n </b>\n </div>\n {FILTER_CONTEXT.map((ctx) => (\n <div>\n <label\n class={\n FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx)\n ? 'insignificant'\n : ''\n }\n >\n <input\n type=\"checkbox\"\n name=\"context\"\n value={ctx}\n defaultChecked={!!context ? context.includes(ctx) : true}\n disabled={uiState === 'loading'}\n />{' '}\n {_(FILTER_CONTEXT_LABELS[ctx])}\n {FILTER_CONTEXT_UNIMPLEMENTED.includes(ctx) ? '*' : ''}\n </label>{' '}\n </div>\n ))}\n <p>\n <small class=\"insignificant\">\n <Trans>* Not implemented yet</Trans>\n </small>\n </p>\n </div>\n <div class=\"filter-form-col\">\n {editMode && (\n <Trans>\n Status:{' '}\n <b>\n <ExpiryStatus expiresAt={expiresAt} showNeverExpires />\n </b>\n </Trans>\n )}\n <div>\n <label for=\"filters-expires_in\">\n {editMode ? t`Change expiry` : t`Expiry`}\n </label>\n <select\n id=\"filters-expires_in\"\n name=\"expires_in\"\n disabled={uiState === 'loading'}\n defaultValue={editMode ? undefined : 0}\n >\n {editMode && <option></option>}\n {EXPIRY_DURATIONS.map((v) => (\n <option value={v}>\n {typeof EXPIRY_DURATIONS_LABELS[v] === 'function'\n ? EXPIRY_DURATIONS_LABELS[v]()\n : _(EXPIRY_DURATIONS_LABELS[v])}\n </option>\n ))}\n </select>\n </div>\n <p>\n <Trans>Filtered post will be…</Trans>\n <br />\n {getAPIVersions()?.mastodon >= 5 && (\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"blur\"\n defaultChecked={filterAction === 'blur'}\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>obscured (media only)</Trans>\n </label>\n )}{' '}\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"warn\"\n defaultChecked={\n (filterAction !== 'hide' && filterAction !== 'blur') ||\n !editMode\n }\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>minimized</Trans>\n </label>{' '}\n <label class=\"ib\">\n <input\n type=\"radio\"\n name=\"filter_action\"\n value=\"hide\"\n defaultChecked={filterAction === 'hide'}\n disabled={uiState === 'loading'}\n />{' '}\n <Trans>hidden</Trans>\n </label>\n </p>\n </div>\n </div>\n <footer class=\"filter-form-footer\">\n <span>\n <button type=\"submit\" disabled={uiState === 'loading'}>\n {editMode ? t`Save` : t`Create`}\n </button>{' '}\n <Loader abrupt hidden={uiState !== 'loading'} />\n </span>\n {editMode && (\n <MenuConfirm\n disabled={uiState === 'loading'}\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel={t`Delete this filter?`}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await masto.v2.filters.$select(id).remove();\n setUIState('default');\n onClose?.({\n state: 'success',\n });\n } catch (e) {\n console.error(e);\n setUIState('error');\n alert(t`Unable to delete filter.`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n onClick={() => {}}\n disabled={uiState === 'loading'}\n >\n <Trans>Delete…</Trans>\n </button>\n </MenuConfirm>\n )}\n </footer>\n </form>\n </main>\n </div>\n );\n}\n\nfunction ExpiryStatus({ expiresAt, showNeverExpires }) {\n const { t } = useLingui();\n const hasExpiry = !!expiresAt;\n const expiresAtDate = hasExpiry && new Date(expiresAt);\n const expired = hasExpiry && Date.parse(expiresAt) <= Date.now();\n\n // If less than a minute left, re-render interval every second, else every minute\n const [_, rerender] = useReducer((c) => c + 1, 0);\n useInterval(rerender, expired || 30_000);\n\n return expired ? (\n t`Expired`\n ) : hasExpiry ? (\n <Trans>\n Expiring <RelativeTime datetime={expiresAtDate} />\n </Trans>\n ) : (\n showNeverExpires && t`Never expires`\n );\n}\n\nexport default Filters;\n","import { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport { api } from '../utils/api';\nimport { fetchFollowedTags } from '../utils/followed-tags';\nimport useTitle from '../utils/useTitle';\n\nfunction FollowedHashtags() {\n const { t } = useLingui();\n const { masto, instance } = api();\n useTitle(t`Followed Hashtags`, `/fh`);\n const [uiState, setUIState] = useState('default');\n\n const [followedHashtags, setFollowedHashtags] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const tags = await fetchFollowedTags();\n setFollowedHashtags(tags);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, []);\n\n return (\n <div id=\"followed-hashtags-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Followed Hashtags</Trans>\n </h1>\n <div class=\"header-side\" />\n </div>\n </header>\n <main>\n {followedHashtags.length > 0 ? (\n <>\n <ul class=\"link-list\">\n {followedHashtags.map((tag) => (\n <li>\n <Link\n to={\n instance\n ? `/${instance}/t/${tag.name}`\n : `/t/${tag.name}`\n }\n >\n <Icon icon=\"hashtag\" alt=\"#\" /> <span>{tag.name}</span>\n </Link>\n </li>\n ))}\n </ul>\n {followedHashtags.length > 1 && (\n <footer class=\"ui-state\">\n <small class=\"insignificant\">\n <Plural\n value={followedHashtags.length}\n one=\"# hashtag\"\n other=\"# hashtags\"\n />\n </small>\n </footer>\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load followed hashtags.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No hashtags followed yet.</Trans>\n </p>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default FollowedHashtags;\n","import { useLingui } from '@lingui/react/macro';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states, { getStatus, saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport {\n assignFollowedTags,\n clearFollowedTagsState,\n dedupeBoosts,\n} from '../utils/timeline-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Following({ title, path, id, ...props }) {\n const { t } = useLingui();\n useTitle(\n title ||\n t({\n id: 'following.title',\n message: 'Following',\n }),\n path || '/following',\n );\n const { masto, streaming, instance, client } = api();\n const [streamingClient, setStreamingClient] = useState(streaming);\n\n const snapStates = useSnapshot(states);\n const homeIterable = useRef();\n const homeIterator = useRef();\n const latestItem = useRef();\n\n // Streaming only happens after instance is initialized\n useEffect(() => {\n if (!streaming && client?.onStreamingReady) {\n client.onStreamingReady((streamingClient) => {\n setStreamingClient(streamingClient);\n });\n }\n }, [client]);\n __BENCHMARK.end('time-to-following');\n\n console.debug('RENDER Following', title, id);\n const supportsPixelfed = supports('@pixelfed/home-include-reblogs');\n\n async function fetchHome(firstLoad) {\n if (firstLoad || !homeIterator.current) {\n __BENCHMARK.start('fetch-home-first');\n homeIterable.current = masto.v1.timelines.home.list({ limit: LIMIT });\n homeIterator.current = homeIterable.current.values();\n }\n if (supportsPixelfed && homeIterable.current?.params) {\n if (typeof homeIterable.current.params === 'string') {\n homeIterable.current.params += '&include_reblogs=true';\n } else {\n homeIterable.current.params.include_reblogs = true;\n }\n }\n const results = await homeIterator.current.next();\n let { value } = results;\n if (value?.length) {\n let latestItemChanged = false;\n if (firstLoad) {\n if (value[0].id !== latestItem.current) {\n latestItemChanged = true;\n }\n latestItem.current = value[0].id;\n console.log('First load', latestItem.current);\n }\n\n // value = filteredItems(value, 'home');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n value = dedupeBoosts(value, instance);\n if (firstLoad && latestItemChanged) clearFollowedTagsState();\n setTimeout(() => {\n assignFollowedTags(value, instance);\n }, 100);\n\n // ENFORCE sort by datetime (Latest first)\n value.sort((a, b) => {\n return Date.parse(b.createdAt) - Date.parse(a.createdAt);\n });\n }\n __BENCHMARK.end('fetch-home-first');\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const opts = {\n limit: 5,\n since_id: latestItem.current,\n };\n if (supports('@pixelfed/home-include-reblogs')) {\n opts.include_reblogs = true;\n }\n const results = await masto.v1.timelines.home.list(opts).values().next();\n let { value } = results;\n console.log('checkForUpdates', latestItem.current, value);\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n latestItem.current = value[0].id;\n value = dedupeBoosts(value, instance);\n value = filteredItems(value, 'home');\n if (value.some((item) => !item.reblog)) {\n return true;\n }\n }\n return false;\n } catch (e) {\n console.error(e);\n return false;\n }\n }\n\n useEffect(() => {\n let sub;\n (async () => {\n if (streamingClient) {\n sub = streamingClient.user.subscribe();\n console.log('🎏 Streaming user', sub);\n for await (const entry of sub) {\n if (!sub) break;\n if (entry.event === 'status.update') {\n const status = entry.payload;\n console.log(`🔄 Status ${status.id} updated`);\n saveStatus(status, instance);\n } else if (entry.event === 'delete') {\n const statusID = entry.payload;\n console.log(`❌ Status ${statusID} deleted`);\n // delete states.statuses[statusID];\n const s = getStatus(statusID, instance);\n if (s) s._deleted = true;\n }\n }\n console.log('💥 Streaming user loop STOPPED');\n }\n })();\n return () => {\n sub?.unsubscribe?.();\n sub = null;\n };\n }, [streamingClient]);\n\n return (\n <Timeline\n title={title || t({ id: 'following.title', message: 'Following' })}\n id={id || 'following'}\n emptyText={t`Nothing to see here.`}\n errorText={t`Unable to load posts.`}\n instance={instance}\n fetchItems={fetchHome}\n checkForUpdates={checkForUpdates}\n useItemID\n boostsCarousel={snapStates.settings.boostsCarousel}\n {...props}\n // allowFilters\n filterContext=\"home\"\n showFollowedTags\n showReplyParent\n />\n );\n}\n\nexport default Following;\n","import { plural } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport {\n FocusableItem,\n MenuDivider,\n MenuGroup,\n MenuHeader,\n MenuItem,\n} from '@szhsin/react-menu';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport { useNavigate, useParams, useSearchParams } from 'react-router-dom';\n\nimport Icon from '../components/icon';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport { SHORTCUTS_LIMIT } from '../components/shortcuts-settings';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport { isMediaFirstInstance } from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\n// Limit is 4 per \"mode\"\n// https://github.com/mastodon/mastodon/issues/15194\n// Hard-coded https://github.com/mastodon/mastodon/blob/19614ba2477f3d12468f5ec251ce1cc5f8c6210c/app/models/tag_feed.rb#L4\nconst TAGS_LIMIT_PER_MODE = 4;\nconst TOTAL_TAGS_LIMIT = TAGS_LIMIT_PER_MODE + 1;\n\nfunction Hashtags({ media: mediaView, columnMode, ...props }) {\n const { t } = useLingui();\n // const navigate = useNavigate();\n let { hashtag, ...params } = columnMode ? {} : useParams();\n if (props.hashtag) hashtag = props.hashtag;\n let hashtags = hashtag.trim().split(/[\\s+]+/);\n hashtags.sort();\n hashtag = hashtags[0];\n const [searchParams, setSearchParams] = useSearchParams();\n const media = mediaView || !!searchParams.get('media');\n const linkParams = media ? '?media=1' : '';\n\n const { masto, instance, authenticated } = api({\n instance: props?.instance || params.instance,\n });\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated: currentAuthenticated,\n } = api();\n const hashtagTitle = hashtags.map((t) => `#${t}`).join(' ');\n const title = instance\n ? media\n ? t`${hashtagTitle} (Media only) on ${instance}`\n : t`${hashtagTitle} on ${instance}`\n : media\n ? t`${hashtagTitle} (Media only)`\n : t`${hashtagTitle}`;\n useTitle(title, `/:instance?/t/:hashtag`);\n const latestItem = useRef();\n\n const mediaFirst = useMemo(() => isMediaFirstInstance(), []);\n\n // const hashtagsIterator = useRef();\n const maxID = useRef(undefined);\n async function fetchHashtags(firstLoad) {\n // if (firstLoad || !hashtagsIterator.current) {\n // hashtagsIterator.current = masto.v1.timelines.tag.$select(hashtag).list({\n // limit: LIMIT,\n // any: hashtags.slice(1),\n // }).values();\n // }\n // const results = await hashtagsIterator.current.next();\n\n // NOTE: Temporary fix for listHashtag not persisting `any` in subsequent calls.\n const results = await masto.v1.timelines.tag\n .$select(hashtag)\n .list({\n limit: LIMIT,\n any: hashtags.slice(1),\n maxId: firstLoad ? undefined : maxID.current,\n onlyMedia: media ? true : undefined,\n })\n .values()\n .next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance, {\n skipThreading: media || mediaFirst, // If media view, no need to form threads\n });\n });\n\n maxID.current = value[value.length - 1].id;\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.tag\n .$select(hashtag)\n .list({\n limit: 1,\n any: hashtags.slice(1),\n since_id: latestItem.current,\n onlyMedia: media,\n })\n .values()\n .next();\n let { value } = results;\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n value = filteredItems(value, 'public');\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const [followUIState, setFollowUIState] = useState('default');\n const [info, setInfo] = useState();\n // Get hashtag info\n useEffect(() => {\n (async () => {\n try {\n const info = await masto.v1.tags.$select(hashtag).fetch();\n console.log(info);\n setInfo(info);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [hashtag]);\n\n const reachLimit = hashtags.length >= TOTAL_TAGS_LIMIT;\n\n const [featuredUIState, setFeaturedUIState] = useState('default');\n const [featuredTags, setFeaturedTags] = useState([]);\n const [isFeaturedTag, setIsFeaturedTag] = useState(false);\n useEffect(() => {\n if (!authenticated) return;\n (async () => {\n try {\n const featuredTags = await masto.v1.featuredTags.list();\n setFeaturedTags(featuredTags);\n setIsFeaturedTag(\n featuredTags.some(\n (tag) => tag.name.toLowerCase() === hashtag.toLowerCase(),\n ),\n );\n } catch (e) {\n console.error(e);\n }\n })();\n }, []);\n\n return (\n <>\n <Timeline\n key={instance + hashtagTitle}\n title={title}\n titleComponent={\n !!instance && (\n <h1 class=\"header-double-lines\">\n <b dir=\"auto\">{hashtagTitle}</b>\n <div>{instance}</div>\n </h1>\n )\n }\n id=\"hashtag\"\n instance={instance}\n emptyText={t`No one has posted anything with this tag yet.`}\n errorText={t`Unable to load posts with this tag`}\n fetchItems={fetchHashtags}\n checkForUpdates={checkForUpdates}\n useItemID\n view={media || mediaFirst ? 'media' : undefined}\n refresh={media}\n // allowFilters\n filterContext=\"public\"\n headerEnd={\n <Menu2\n portal\n setDownOverflow\n overflow=\"auto\"\n // viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n {!!info && hashtags.length === 1 && (\n <>\n <MenuConfirm\n subMenu\n confirm={info.following}\n confirmLabel={t`Unfollow #${hashtag}?`}\n disabled={followUIState === 'loading' || !authenticated}\n onClick={() => {\n setFollowUIState('loading');\n if (info.following) {\n // const yes = confirm(`Unfollow #${hashtag}?`);\n // if (!yes) {\n // setFollowUIState('default');\n // return;\n // }\n masto.v1.tags\n .$select(hashtag)\n .unfollow()\n .then(() => {\n setInfo({ ...info, following: false });\n showToast(t`Unfollowed #${hashtag}`);\n })\n .catch((e) => {\n alert(e);\n console.error(e);\n })\n .finally(() => {\n setFollowUIState('default');\n });\n } else {\n masto.v1.tags\n .$select(hashtag)\n .follow()\n .then(() => {\n setInfo({ ...info, following: true });\n showToast(t`Followed #${hashtag}`);\n })\n .catch((e) => {\n alert(e);\n console.error(e);\n })\n .finally(() => {\n setFollowUIState('default');\n });\n }\n }}\n >\n {info.following ? (\n <>\n <Icon icon=\"check-circle\" />{' '}\n <span>\n <Trans>Following…</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"plus\" />{' '}\n <span>\n <Trans>Follow</Trans>\n </span>\n </>\n )}\n </MenuConfirm>\n <MenuItem\n type=\"checkbox\"\n checked={isFeaturedTag}\n disabled={featuredUIState === 'loading' || !authenticated}\n onClick={() => {\n setFeaturedUIState('loading');\n if (isFeaturedTag) {\n const featuredTagID = featuredTags.find(\n (tag) =>\n tag.name.toLowerCase() === hashtag.toLowerCase(),\n ).id;\n if (featuredTagID) {\n masto.v1.featuredTags\n .$select(featuredTagID)\n .remove()\n .then(() => {\n setIsFeaturedTag(false);\n showToast(t`Unfeatured on profile`);\n setFeaturedTags(\n featuredTags.filter(\n (tag) => tag.id !== featuredTagID,\n ),\n );\n })\n .catch((e) => {\n console.error(e);\n })\n .finally(() => {\n setFeaturedUIState('default');\n });\n } else {\n showToast(t`Unable to unfeature on profile`);\n }\n } else {\n masto.v1.featuredTags\n .create({\n name: hashtag,\n })\n .then((value) => {\n setIsFeaturedTag(true);\n showToast(t`Featured on profile`);\n setFeaturedTags(featuredTags.concat(value));\n })\n .catch((e) => {\n console.error(e);\n })\n .finally(() => {\n setFeaturedUIState('default');\n });\n }\n }}\n >\n {isFeaturedTag ? (\n <>\n <Icon icon=\"check-circle\" />\n <span>\n <Trans>Featured on profile</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"check-circle\" />\n <span>\n <Trans>Feature on profile</Trans>\n </span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n </>\n )}\n {!mediaFirst && (\n <>\n <MenuHeader className=\"plain\">\n <Trans>Filters</Trans>\n </MenuHeader>\n <MenuItem\n type=\"checkbox\"\n checked={!!media}\n onClick={() => {\n if (media) {\n searchParams.delete('media');\n } else {\n searchParams.set('media', '1');\n }\n setSearchParams(searchParams);\n }}\n >\n <Icon icon=\"check-circle\" alt=\"☑️\" />{' '}\n <span class=\"menu-grow\">\n <Trans>Media only</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n </>\n )}\n <FocusableItem className=\"menu-field\" disabled={reachLimit}>\n {({ ref }) => (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const newHashtag = e.target[0].value?.trim?.();\n // Use includes but need to be case insensitive\n if (\n newHashtag &&\n !hashtags.some(\n (t) => t.toLowerCase() === newHashtag.toLowerCase(),\n )\n ) {\n hashtags.push(newHashtag);\n hashtags.sort();\n // navigate(\n // instance\n // ? `/${instance}/t/${hashtags.join('+')}`\n // : `/t/${hashtags.join('+')}`,\n // );\n location.hash = instance\n ? `/${instance}/t/${hashtags.join('+')}${linkParams}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"hashtag\" />\n <input\n ref={ref}\n type=\"text\"\n placeholder={\n reachLimit\n ? plural(TOTAL_TAGS_LIMIT, {\n other: 'Max # tags',\n })\n : t`Add hashtag`\n }\n required\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellCheck={false}\n // no spaces, no hashtags\n pattern=\"[^##][^\\s##]+[^##]\"\n disabled={reachLimit}\n dir=\"auto\"\n />\n </form>\n )}\n </FocusableItem>\n <MenuGroup takeOverflow>\n {hashtags.map((tag, i) => (\n <MenuItem\n key={tag}\n disabled={hashtags.length === 1}\n onClick={(e) => {\n hashtags.splice(i, 1);\n hashtags.sort();\n // navigate(\n // instance\n // ? `/${instance}/t/${hashtags.join('+')}`\n // : `/t/${hashtags.join('+')}`,\n // );\n location.hash = instance\n ? `/${instance}/t/${hashtags.join('+')}${linkParams}`\n : `/t/${hashtags.join('+')}${linkParams}`;\n }}\n >\n <Icon icon=\"x\" alt={t`Remove hashtag`} class=\"danger-icon\" />\n <span class=\"bidi-isolate\">\n <span class=\"more-insignificant\">#</span>\n {tag}\n </span>\n </MenuItem>\n ))}\n </MenuGroup>\n <MenuDivider />\n <MenuItem\n disabled={!currentAuthenticated}\n onClick={() => {\n if (states.shortcuts.length >= SHORTCUTS_LIMIT) {\n alert(\n plural(SHORTCUTS_LIMIT, {\n one: 'Max # shortcut reached. Unable to add shortcut.',\n other: 'Max # shortcuts reached. Unable to add shortcut.',\n }),\n );\n return;\n }\n const shortcut = {\n type: 'hashtag',\n hashtag: hashtags.join(' '),\n instance,\n media: media ? 'on' : undefined,\n };\n // Check if already exists\n const exists = states.shortcuts.some(\n (s) =>\n s.type === shortcut.type &&\n s.hashtag\n .split(/[\\s+]+/)\n .sort()\n .join(' ') ===\n shortcut.hashtag\n .split(/[\\s+]+/)\n .sort()\n .join(' ') &&\n (s.instance ? s.instance === shortcut.instance : true) &&\n (s.media ? !!s.media === !!shortcut.media : true),\n );\n if (exists) {\n alert(t`This shortcut already exists`);\n } else {\n states.shortcuts.push(shortcut);\n showToast(t`Hashtag shortcut added`);\n }\n }}\n >\n <Icon icon=\"shortcut\" />{' '}\n <span>\n <Trans>Add to Shortcuts</Trans>\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n t`Enter a new instance e.g. \"mastodon.social\"`,\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert(t`Invalid instance`);\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(`/${newInstance}/t/${hashtags.join('+')}`);\n location.hash = `/${newInstance}/t/${hashtags.join(\n '+',\n )}${linkParams}`;\n }\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <span>\n <Trans>Go to another instance…</Trans>\n </span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = `/${currentInstance}/t/${hashtags.join(\n '+',\n )}${linkParams}`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Go to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n {!columnMode && !!hashtags?.length && (\n <data\n class=\"compose-data\"\n value={JSON.stringify({\n draftStatus: {\n status: `${hashtags.length > 1 ? '\\n\\n' : ' '}${hashtagTitle}`,\n },\n })}\n />\n )}\n </>\n );\n}\n\nexport default Hashtags;\n","import './lists.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { InView } from 'react-intersection-observer';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport ListAddEdit from '../components/list-add-edit';\nimport ListExclusiveBadge from '../components/list-exclusive-badge';\nimport MenuConfirm from '../components/menu-confirm';\nimport MenuLink from '../components/menu-link';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport { getList, getLists } from '../utils/lists';\nimport states, { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction List(props) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const { masto, instance } = api();\n const id = props?.id || useParams()?.id;\n // const navigate = useNavigate();\n const latestItem = useRef();\n // const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n\n const listIterator = useRef();\n async function fetchList(firstLoad) {\n if (firstLoad || !listIterator.current) {\n listIterator.current = masto.v1.timelines.list\n .$select(id)\n .list({\n limit: LIMIT,\n })\n .values();\n }\n const results = await listIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'home');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.list.$select(id).list({\n limit: 1,\n since_id: latestItem.current,\n });\n let { value } = results;\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n value = filteredItems(value, 'home');\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const [lists, setLists] = useState([]);\n\n const [list, setList] = useState({ title: 'List' });\n // const [title, setTitle] = useState(`List`);\n useTitle(list.title, `/l/:id`);\n useEffect(() => {\n (async () => {\n try {\n const list = await getList(id);\n setList(list);\n // setTitle(list.title);\n } catch (e) {\n console.error(e);\n }\n })();\n }, [id]);\n\n const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n const [showManageMembersModal, setShowManageMembersModal] = useState(false);\n\n return (\n <>\n <Timeline\n key={id}\n title={list.title}\n id=\"list\"\n emptyText={t`Nothing yet.`}\n errorText={t`Unable to load posts.`}\n instance={instance}\n fetchItems={fetchList}\n checkForUpdates={checkForUpdates}\n useItemID\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"home\"\n showReplyParent\n // refresh={reloadCount}\n headerStart={\n // <Link to=\"/l\" class=\"button plain\">\n // <Icon icon=\"list\" size=\"l\" />\n // </Link>\n <Menu2\n overflow=\"auto\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"list\" size=\"l\" alt={t`Lists`} />\n <Icon icon=\"chevron-down\" size=\"s\" />\n </button>\n }\n onMenuChange={(e) => {\n if (e.open) {\n getLists().then(setLists);\n }\n }}\n >\n <MenuLink to=\"/l\">\n <span>\n <Trans>All Lists</Trans>\n </span>\n </MenuLink>\n {lists?.length > 0 && (\n <>\n <MenuDivider />\n {lists.map((list) => (\n <MenuLink key={list.id} to={`/l/${list.id}`}>\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge />\n </>\n )}\n </span>\n </MenuLink>\n ))}\n </>\n )}\n </Menu2>\n }\n headerEnd={\n <Menu2\n portal\n setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n {list?.exclusive && (\n <>\n <MenuHeader className=\"plain\">\n <ListExclusiveBadge />{' '}\n <Trans>\n Posts on this list are hidden from Home/Following\n </Trans>\n </MenuHeader>\n <MenuDivider />\n </>\n )}\n <MenuItem\n onClick={() =>\n setShowListAddEditModal({\n list,\n })\n }\n >\n <Icon icon=\"pencil\" size=\"l\" />\n <span>\n <Trans>Edit</Trans>\n </span>\n </MenuItem>\n <MenuItem onClick={() => setShowManageMembersModal(true)}>\n <Icon icon=\"group\" size=\"l\" />\n <span>\n <Trans>Manage members</Trans>\n </span>\n </MenuItem>\n </Menu2>\n }\n />\n {showListAddEditModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success' && result.list) {\n setList(result.list);\n // reload();\n } else if (result.state === 'deleted') {\n // navigate('/l');\n location.hash = '/l';\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n {showManageMembersModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowManageMembersModal(false);\n }\n }}\n >\n <ListManageMembers\n listID={id}\n onClose={() => setShowManageMembersModal(false)}\n />\n </Modal>\n )}\n </>\n );\n}\n\nconst MEMBERS_LIMIT = 40;\n\nfunction ListManageMembers({ listID, onClose }) {\n const { t } = useLingui();\n // Show list of members with [Remove] button\n // API only returns 40 members at a time, so this need to be paginated with infinite scroll\n // Show [Add] button after removing a member\n const { masto, instance } = api();\n const [members, setMembers] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [showMore, setShowMore] = useState(false);\n\n const membersIterator = useRef();\n\n async function fetchMembers(firstLoad) {\n setShowMore(false);\n setUIState('loading');\n (async () => {\n try {\n if (firstLoad || !membersIterator.current) {\n membersIterator.current = masto.v1.lists\n .$select(listID)\n .accounts.list({\n limit: MEMBERS_LIMIT,\n })\n .values();\n }\n const results = await membersIterator.current.next();\n let { done, value } = results;\n if (value?.length) {\n if (firstLoad) {\n setMembers(value);\n } else {\n setMembers(members.concat(value));\n }\n setShowMore(!done);\n } else {\n setShowMore(false);\n }\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n useEffect(() => {\n fetchMembers(true);\n }, []);\n\n return (\n <div class=\"sheet\" id=\"list-manage-members-container\">\n {!!onClose && (\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n )}\n <header>\n <h2>\n <Trans>Manage members</Trans>\n </h2>\n </header>\n <main>\n <ul>\n {members.map((member) => (\n <li key={member.id}>\n <AccountBlock account={member} instance={instance} />\n <RemoveAddButton account={member} listID={listID} />\n </li>\n ))}\n {showMore && uiState === 'default' && (\n <InView as=\"li\" onChange={(inView) => inView && fetchMembers()}>\n <button type=\"button\" class=\"light block\" onClick={fetchMembers}>\n <Trans>Show more…</Trans>\n </button>\n </InView>\n )}\n </ul>\n </main>\n </div>\n );\n}\n\nfunction RemoveAddButton({ account, listID }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [removed, setRemoved] = useState(false);\n\n return (\n <MenuConfirm\n confirm={!removed}\n confirmLabel={\n <span>\n <Trans>\n Remove <span class=\"bidi-isolate\">@{account.username}</span> from\n list?\n </Trans>\n </span>\n }\n align=\"end\"\n menuItemClassName=\"danger\"\n onClick={() => {\n if (removed) {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.lists.$select(listID).accounts.create({\n accountIds: [account.id],\n });\n setUIState('default');\n setRemoved(false);\n } catch (e) {\n setUIState('error');\n }\n })();\n } else {\n // const yes = confirm(`Remove ${account.username} from this list?`);\n // if (!yes) return;\n setUIState('loading');\n\n (async () => {\n try {\n await masto.v1.lists.$select(listID).accounts.remove({\n accountIds: [account.id],\n });\n setUIState('default');\n setRemoved(true);\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n }}\n >\n <button\n type=\"button\"\n class={`light ${removed ? '' : 'danger'}`}\n disabled={uiState === 'loading'}\n >\n {removed ? t`Add` : t`Remove…`}\n </button>\n </MenuConfirm>\n );\n}\n\nexport default List;\n","// This is like very lame \"type-checking\" lol\nconst notificationTypeKeys = {\n mention: ['account', 'status'],\n quote: ['account', 'status'],\n status: ['account', 'status'],\n reblog: ['account', 'status'],\n follow: ['account'],\n follow_request: ['account'],\n favourite: ['account', 'status'],\n poll: ['status'],\n update: ['status'],\n};\n\nconst GROUP_TYPES = ['favourite', 'reblog', 'follow'];\nconst groupable = (type) => GROUP_TYPES.includes(type);\n\nexport function fixNotifications(notifications) {\n return notifications.filter((notification) => {\n const { type, id, createdAt } = notification;\n if (!type) {\n console.warn('Notification missing type', notification);\n return false;\n }\n if (!id || !createdAt) {\n console.warn('Notification missing id or createdAt', notification);\n // Continue processing this despite missing id or createdAt\n }\n const keys = notificationTypeKeys[type];\n if (keys?.length) {\n return keys.every((key) => !!notification[key]);\n }\n return true; // skip other types\n });\n}\n\nexport function massageNotifications2(notifications) {\n if (notifications?.notificationGroups) {\n const {\n accounts = [],\n notificationGroups = [],\n statuses = [],\n } = notifications;\n return notificationGroups.map((group) => {\n const { sampleAccountIds, statusId } = group;\n const sampleAccounts =\n sampleAccountIds?.map((id) => accounts.find((a) => a.id === id)) || [];\n const status = statuses?.find((s) => s.id === statusId) || null;\n return {\n ...group,\n sampleAccounts,\n status,\n };\n });\n }\n return notifications;\n}\n\nexport function groupNotifications2(groupNotifications) {\n // Make grouped notifications to look like faux grouped notifications\n const newGroupNotifications = groupNotifications.map((gn) => {\n const {\n latestPageNotificationAt,\n mostRecentNotificationId,\n sampleAccounts,\n notificationsCount,\n } = gn;\n\n return {\n id: '' + mostRecentNotificationId,\n createdAt: latestPageNotificationAt,\n account: sampleAccounts[0],\n ...gn,\n };\n });\n\n // Merge favourited and reblogged of same status into a single notification\n // - new type: \"favourite+reblog\"\n // - sum numbers for `notificationsCount` and `sampleAccounts`\n const notificationsMap = {};\n const newGroupNotifications1 = [];\n for (let i = 0; i < newGroupNotifications.length; i++) {\n const gn = newGroupNotifications[i];\n const {\n type,\n status,\n createdAt,\n notificationsCount,\n sampleAccounts,\n groupKey,\n } = gn;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n let virtualType = type;\n // const sameCount = notificationsCount > 0 && notificationsCount === sampleAccounts?.length;\n // if (sameCount && (type === 'favourite' || type === 'reblog')) {\n const sampleCountDiffNotificationsCount =\n notificationsCount > 0 &&\n sampleAccounts?.length > 0 &&\n notificationsCount > sampleAccounts?.length;\n if (\n !sampleCountDiffNotificationsCount &&\n (type === 'favourite' || type === 'reblog')\n ) {\n virtualType = 'favourite+reblog';\n }\n // const key = `${status?.id}-${virtualType}-${date}-${sameCount ? 1 : 0}`;\n const key = `${status?.id}-${virtualType}-${date}`;\n const mappedNotification = notificationsMap[key];\n if (!groupable(type)) {\n newGroupNotifications1.push(gn);\n } else if (mappedNotification) {\n // Merge sampleAccounts + merge _types\n sampleAccounts.forEach((a) => {\n const mappedAccount = mappedNotification.sampleAccounts.find(\n (ma) => ma.id === a.id,\n );\n if (!mappedAccount) {\n mappedNotification.sampleAccounts.push({\n ...a,\n _types: [type],\n });\n } else {\n mappedAccount._types.push(type);\n mappedAccount._types.sort().reverse();\n }\n });\n // mappedNotification.notificationsCount =\n // mappedNotification.sampleAccounts.length;\n mappedNotification.notificationsCount = Math.min(\n mappedNotification.notificationsCount,\n notificationsCount,\n );\n mappedNotification._notificationsCount.push(notificationsCount);\n mappedNotification._sampleAccountsCount.push(sampleAccounts?.length);\n mappedNotification._accounts = mappedNotification.sampleAccounts;\n mappedNotification._groupKeys.push(groupKey);\n } else {\n const accounts = sampleAccounts.map((a) => ({\n ...a,\n _types: [type],\n }));\n notificationsMap[key] = {\n ...gn,\n sampleAccounts: accounts,\n type: virtualType,\n _accounts: accounts,\n _groupKeys: groupKey ? [groupKey] : [],\n _notificationsCount: [notificationsCount],\n _sampleAccountsCount: [sampleAccounts?.length],\n };\n newGroupNotifications1.push(notificationsMap[key]);\n }\n }\n\n // 2nd pass.\n // - Group 1 account favourte/reblog multiple posts\n // - _statuses: [status, status, ...]\n const notificationsMap2 = {};\n const newGroupNotifications2 = [];\n for (let i = 0; i < newGroupNotifications1.length; i++) {\n const gn = newGroupNotifications1[i];\n const { type, account, _accounts, sampleAccounts, createdAt, groupKey } =\n gn;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n const hasOneAccount =\n sampleAccounts?.length === 1 || _accounts?.length === 1;\n if (\n (type === 'favourite' ||\n type === 'reblog' ||\n type === 'favourite+reblog') &&\n hasOneAccount\n ) {\n const key = `${account?.id}-${type}-${date}`;\n const mappedNotification = notificationsMap2[key];\n if (mappedNotification) {\n mappedNotification._statuses.push(gn.status);\n mappedNotification._ids += `-${gn.id}`;\n mappedNotification._groupKeys.push(groupKey);\n } else {\n let n = (notificationsMap2[key] = {\n ...gn,\n type,\n _ids: gn.id,\n _statuses: [gn.status],\n _groupKeys: groupKey ? [groupKey] : [],\n });\n newGroupNotifications2.push(n);\n }\n } else {\n newGroupNotifications2.push(gn);\n }\n }\n\n console.log('newGroupNotifications2', newGroupNotifications2);\n\n return newGroupNotifications2;\n}\n\nexport default function groupNotifications(notifications) {\n // Filter out invalid notifications\n notifications = fixNotifications(notifications);\n\n // Create new flat list of notifications\n // Combine sibling notifications based on type and status id\n // Concat all notification.account into an array of _accounts\n const notificationsMap = {};\n const cleanNotifications = [];\n for (let i = 0, j = 0; i < notifications.length; i++) {\n const notification = notifications[i];\n const { id, status, account, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n let virtualType = type;\n if (type === 'favourite' || type === 'reblog') {\n virtualType = 'favourite+reblog';\n }\n const key = `${status?.id}-${virtualType}-${date}`;\n const mappedNotification = notificationsMap[key];\n if (!groupable(type)) {\n cleanNotifications[j++] = notification;\n } else if (mappedNotification?.account) {\n const mappedAccount = mappedNotification._accounts.find(\n (a) => a.id === account.id,\n );\n if (mappedAccount) {\n mappedAccount._types.push(type);\n mappedAccount._types.sort().reverse();\n mappedNotification._ids += `-${id}`;\n } else {\n account._types = [type];\n mappedNotification._accounts.push(account);\n mappedNotification._ids += `-${id}`;\n }\n } else {\n if (account) account._types = [type];\n let n = (notificationsMap[key] = {\n ...notification,\n type: virtualType,\n _ids: id,\n _accounts: account ? [account] : [],\n });\n cleanNotifications[j++] = n;\n }\n }\n\n // 2nd pass to group \"favourite+reblog\"-type notifications by account if _accounts.length <= 1\n // This means one acount has favourited and reblogged the multiple statuses\n // The grouped notification\n // - type: \"favourite+reblog+account\"\n // - _statuses: [status, status, ...]\n const notificationsMap2 = {};\n const cleanNotifications2 = [];\n for (let i = 0, j = 0; i < cleanNotifications.length; i++) {\n const notification = cleanNotifications[i];\n const { id, account, _accounts, type, createdAt } = notification;\n const date = createdAt ? new Date(createdAt).toLocaleDateString() : '';\n if (type === 'favourite+reblog' && account && _accounts.length === 1) {\n const key = `${account?.id}-${type}-${date}`;\n const mappedNotification = notificationsMap2[key];\n if (mappedNotification) {\n mappedNotification._statuses.push(notification.status);\n mappedNotification._ids += `-${id}`;\n } else {\n let n = (notificationsMap2[key] = {\n ...notification,\n type,\n _ids: id,\n _statuses: [notification.status],\n });\n cleanNotifications2[j++] = n;\n }\n } else {\n cleanNotifications2[j++] = notification;\n }\n }\n\n console.log({ notifications, cleanNotifications, cleanNotifications2 });\n\n // return cleanNotifications;\n return cleanNotifications2;\n}\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { useMemo, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { fixNotifications } from '../utils/group-notifications';\nimport { saveStatus } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nfunction Mentions({ columnMode, ...props }) {\n const { t } = useLingui();\n const { masto, instance } = api();\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const [stateType, setStateType] = useState(null);\n const type = props?.type || searchParams.get('type') || stateType;\n useTitle(type === 'private' ? t`Private mentions` : t`Mentions`, '/mentions');\n\n const mentionsIterator = useRef();\n const latestItem = useRef();\n\n async function fetchMentions(firstLoad) {\n if (firstLoad || !mentionsIterator.current) {\n mentionsIterator.current = masto.v1.notifications\n .list({\n limit: LIMIT,\n types: ['mention'],\n })\n .values();\n }\n const results = await mentionsIterator.current.next();\n let { value } = results;\n if (value?.length) {\n value = fixNotifications(value);\n\n if (firstLoad) {\n latestItem.current = value[0].id;\n console.log('First load', latestItem.current);\n }\n\n value.forEach(({ status: item }) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value: value?.map((item) => item.status),\n };\n }\n\n const conversationsIterator = useRef();\n const latestConversationItem = useRef();\n async function fetchConversations(firstLoad) {\n if (firstLoad || !conversationsIterator.current) {\n conversationsIterator.current = masto.v1.conversations\n .list({\n limit: LIMIT,\n })\n .values();\n }\n const results = await conversationsIterator.current.next();\n let { value } = results;\n value = value?.filter((item) => item.lastStatus);\n if (value?.length) {\n if (firstLoad) {\n latestConversationItem.current = value[0].lastStatus.id;\n console.log('First load', latestConversationItem.current);\n }\n\n value.forEach(({ lastStatus: item }) => {\n saveStatus(item, instance);\n });\n }\n console.log('results', results);\n return {\n ...results,\n value: value?.map((item) => item.lastStatus),\n };\n }\n\n function fetchItems(...args) {\n if (type === 'private') {\n return fetchConversations(...args);\n }\n return fetchMentions(...args);\n }\n\n async function checkForUpdates() {\n if (type === 'private') {\n try {\n const results = await masto.v1.conversations\n .list({\n limit: 1,\n since_id: latestConversationItem.current,\n })\n .values()\n .next();\n let { value } = results;\n console.log(\n 'checkForUpdates PRIVATE',\n latestConversationItem.current,\n value,\n );\n const valueContainsLatestItem =\n value[0]?.id === latestConversationItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n latestConversationItem.current = value[0].lastStatus.id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n } else {\n try {\n const results = await masto.v1.notifications\n .list({\n limit: 1,\n types: ['mention'],\n since_id: latestItem.current,\n })\n .values()\n .next();\n let { value } = results;\n console.log('checkForUpdates ALL', latestItem.current, value);\n if (value?.length) {\n latestItem.current = value[0].id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n }\n\n const TimelineStart = useMemo(() => {\n return (\n <div class=\"filter-bar centered\">\n <Link\n to=\"/mentions\"\n class={!type ? 'is-active' : ''}\n onClick={(e) => {\n if (columnMode) {\n e.preventDefault();\n setStateType(null);\n }\n }}\n >\n <Trans>All</Trans>\n </Link>\n <Link\n to=\"/mentions?type=private\"\n class={type === 'private' ? 'is-active' : ''}\n onClick={(e) => {\n if (columnMode) {\n e.preventDefault();\n setStateType('private');\n }\n }}\n >\n <Trans>Private</Trans>\n </Link>\n </div>\n );\n }, [type]);\n\n return (\n <Timeline\n title={t`Mentions`}\n id=\"mentions\"\n emptyText={t`No one mentioned you :(`}\n errorText={t`Unable to load mentions.`}\n instance={instance}\n fetchItems={fetchItems}\n checkForUpdates={checkForUpdates}\n useItemID\n timelineStart={TimelineStart}\n refresh={type}\n filterContext=\"notifications\"\n />\n );\n}\n\nexport default Mentions;\n","import './notifications.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { Fragment } from 'preact';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\nimport { subscribeKey } from 'valtio/utils';\n\nimport AccountBlock from '../components/account-block';\nimport FollowRequestButtons from '../components/follow-request-buttons';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport Notification from '../components/notification';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport enhanceContent from '../utils/enhance-content';\nimport FilterContext from '../utils/filter-context';\nimport groupNotifications, {\n groupNotifications2,\n massageNotifications2,\n} from '../utils/group-notifications';\nimport handleContentLinks from '../utils/handle-content-links';\nimport mem from '../utils/mem';\nimport niceDateTime from '../utils/nice-date-time';\nimport { getRegistration } from '../utils/push-notifications';\nimport shortenNumber from '../utils/shorten-number';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus } from '../utils/states';\nimport store from '../utils/store';\nimport { getAPIVersions, getCurrentInstance } from '../utils/store-utils';\nimport supports from '../utils/supports';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useScroll from '../utils/useScroll';\nimport useTitle from '../utils/useTitle';\n\nconst NOTIFICATIONS_LIMIT = 80;\nconst NOTIFICATIONS_GROUPED_LIMIT = 20;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n block: 'center',\n inline: 'center',\n behavior: 'smooth',\n};\n\nconst memSupportsGroupedNotifications = mem(\n () => getAPIVersions()?.mastodon >= 2,\n {\n maxAge: 1000 * 60 * 5, // 5 minutes\n },\n);\n\nfunction mastoFetchNotificationsIterable(opts = {}) {\n const { masto } = api();\n if (\n states.settings.groupedNotificationsAlpha &&\n memSupportsGroupedNotifications()\n ) {\n // https://github.com/mastodon/mastodon/pull/29889\n return masto.v2.notifications.list({\n limit: NOTIFICATIONS_GROUPED_LIMIT,\n ...opts,\n });\n } else {\n return masto.v1.notifications.list({\n limit: NOTIFICATIONS_LIMIT,\n ...opts,\n });\n }\n}\nexport function mastoFetchNotifications(opts = {}) {\n return mastoFetchNotificationsIterable(opts).values();\n}\n\nexport function getGroupedNotifications(notifications) {\n if (\n states.settings.groupedNotificationsAlpha &&\n memSupportsGroupedNotifications()\n ) {\n return groupNotifications2(notifications);\n } else {\n return groupNotifications(notifications);\n }\n}\n\nconst NOTIFICATIONS_POLICIES = [\n 'forNotFollowing',\n 'forNotFollowers',\n 'forNewAccounts',\n 'forPrivateMentions',\n 'forLimitedAccounts',\n];\nconst NOTIFICATIONS_POLICIES_TEXT = {\n forNotFollowing: msg`You don't follow`,\n forNotFollowers: msg`Who don't follow you`,\n forNewAccounts: msg`With a new account`,\n forPrivateMentions: msg`Who unsolicitedly private mention you`,\n forLimitedAccounts: msg`Who are limited by server moderators`,\n};\n\nfunction Notifications({ columnMode }) {\n const { _, t } = useLingui();\n useTitle(t`Notifications`, '/notifications');\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const notificationID = searchParams.get('id');\n const notificationAccessToken = searchParams.get('access_token');\n const [showMore, setShowMore] = useState(false);\n const [onlyMentions, setOnlyMentions] = useState(false);\n const scrollableRef = useRef();\n const { nearReachEnd, scrollDirection, reachStart, nearReachStart } =\n useScroll({\n scrollableRef,\n });\n const hiddenUI = scrollDirection === 'end' && !nearReachStart;\n const [followRequests, setFollowRequests] = useState([]);\n const [announcements, setAnnouncements] = useState([]);\n\n console.debug('RENDER Notifications');\n\n const notificationsIterable = useRef();\n const notificationsIterator = useRef();\n async function fetchNotifications(firstLoad) {\n if (firstLoad || !notificationsIterator.current) {\n // Reset iterator\n notificationsIterable.current = mastoFetchNotificationsIterable({\n excludeTypes: ['follow_request'],\n });\n notificationsIterator.current = notificationsIterable.current.values();\n }\n if (/max_id=($|&)/i.test(notificationsIterator.current?.nextParams)) {\n // Pixelfed returns next paginationed link with empty max_id\n // I assume, it's done (end of list)\n return {\n done: true,\n };\n }\n const allNotifications = await notificationsIterator.current.next();\n const notifications = massageNotifications2(allNotifications.value);\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n // TEST: Slot in a fake notification to test 'severed_relationships'\n // notifications.unshift({\n // id: '123123',\n // type: 'severed_relationships',\n // createdAt: '2024-03-22T19:20:08.316Z',\n // event: {\n // type: 'account_suspension',\n // targetName: 'mastodon.dev',\n // followersCount: 0,\n // followingCount: 0,\n // },\n // });\n\n // TEST: Slot in a fake notification to test 'moderation_warning'\n // notifications.unshift({\n // id: '123123',\n // type: 'moderation_warning',\n // createdAt: new Date().toISOString(),\n // moderation_warning: {\n // id: '1231234',\n // action: 'mark_statuses_as_sensitive',\n // },\n // });\n\n // console.log({ notifications });\n\n const groupedNotifications = getGroupedNotifications(notifications);\n\n if (firstLoad) {\n states.notificationsLast = groupedNotifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: groupedNotifications[0].id,\n },\n })\n .catch(() => {});\n } else {\n states.notifications.push(...groupedNotifications);\n }\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n async function fetchFollowRequests() {\n // Note: no pagination here yet because this better be on a separate page. Should be rare use-case???\n try {\n return await masto.v1.followRequests.list({\n limit: 80,\n });\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const loadFollowRequests = () => {\n setUIState('loading');\n (async () => {\n try {\n const requests = await fetchFollowRequests();\n setFollowRequests(requests);\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n };\n\n async function fetchAnnouncements() {\n try {\n return await masto.v1.announcements.list();\n } catch (e) {\n // Silently fail\n return [];\n }\n }\n\n const supportsFilteredNotifications = supports(\n '@mastodon/filtered-notifications',\n );\n const [showNotificationsSettings, setShowNotificationsSettings] =\n useState(false);\n const [notificationsPolicy, setNotificationsPolicy] = useState({});\n function fetchNotificationsPolicy() {\n return masto.v2.notifications.policy.fetch().catch(() => {});\n }\n function loadNotificationsPolicy() {\n fetchNotificationsPolicy()\n .then((policy) => {\n console.log('✨ Notifications policy', policy);\n setNotificationsPolicy(policy);\n })\n .catch(() => {});\n }\n const [notificationsRequests, setNotificationsRequests] = useState(null);\n function fetchNotificationsRequest() {\n return masto.v1.notifications.requests.list();\n }\n\n const loadNotifications = (firstLoad) => {\n setShowNew(false);\n setUIState('loading');\n (async () => {\n try {\n const fetchNotificationsPromise = fetchNotifications(firstLoad);\n\n if (firstLoad) {\n fetchAnnouncements()\n .then((announcements) => {\n announcements.sort((a, b) => {\n // Sort by updatedAt first, then createdAt\n return (\n Date.parse(b.updatedAt || b.createdAt) -\n Date.parse(a.updatedAt || a.createdAt)\n );\n });\n setAnnouncements(announcements);\n })\n .catch(() => {});\n\n fetchFollowRequests()\n .then((requests) => {\n setFollowRequests(requests);\n })\n .catch(() => {});\n\n if (supportsFilteredNotifications) {\n loadNotificationsPolicy();\n }\n }\n\n const { done } = await fetchNotificationsPromise;\n setShowMore(!done);\n\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n useEffect(() => {\n loadNotifications(true);\n }, []);\n useEffect(() => {\n if (reachStart) {\n loadNotifications(true);\n }\n }, [reachStart]);\n\n // useEffect(() => {\n // if (nearReachEnd && showMore) {\n // loadNotifications();\n // }\n // }, [nearReachEnd, showMore]);\n\n const [showNew, setShowNew] = useState(false);\n\n const loadUpdates = useCallback(\n ({ disableIdleCheck = false } = {}) => {\n if (uiState === 'loading') {\n return;\n }\n console.log('✨ Load updates', {\n autoRefresh: snapStates.settings.autoRefresh,\n scrollTop: scrollableRef.current?.scrollTop,\n inBackground: inBackground(),\n disableIdleCheck,\n });\n if (\n snapStates.settings.autoRefresh &&\n scrollableRef.current?.scrollTop < 16 &&\n (disableIdleCheck || window.__IDLE__) &&\n !inBackground()\n ) {\n loadNotifications(true);\n }\n },\n [snapStates.notificationsShowNew, snapStates.settings.autoRefresh, uiState],\n );\n // useEffect(loadUpdates, [snapStates.notificationsShowNew]);\n\n const lastHiddenTime = useRef();\n usePageVisibility((visible) => {\n if (visible) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadUpdates({\n disableIdleCheck: true,\n });\n } else {\n lastHiddenTime.current = Date.now();\n }\n }\n });\n const firstLoad = useRef(true);\n useEffect(() => {\n let unsub = subscribeKey(states, 'notificationsShowNew', (v) => {\n if (firstLoad.current) {\n firstLoad.current = false;\n return;\n }\n if (uiState === 'loading') return;\n if (v) loadUpdates();\n setShowNew(v);\n });\n return () => unsub?.();\n }, []);\n\n const todayDate = new Date();\n const yesterdayDate = new Date(todayDate - 24 * 60 * 60 * 1000);\n let currentDay = new Date();\n const showTodayEmpty = !snapStates.notifications.some(\n (notification) =>\n new Date(notification.createdAt).toDateString() ===\n todayDate.toDateString(),\n );\n\n const announcementsListRef = useRef();\n\n useEffect(() => {\n if (notificationID) {\n states.routeNotification = {\n id: notificationID,\n accessToken: atob(notificationAccessToken),\n };\n }\n }, [notificationID, notificationAccessToken]);\n\n // useEffect(() => {\n // if (uiState === 'default') {\n // (async () => {\n // try {\n // const registration = await getRegistration();\n // if (registration?.getNotifications) {\n // const notifications = await registration.getNotifications();\n // console.log('🔔 Push notifications', notifications);\n // // Close all notifications?\n // // notifications.forEach((notification) => {\n // // notification.close();\n // // });\n // }\n // } catch (e) {}\n // })();\n // }\n // }, [uiState]);\n\n const [annualReportNotification, setAnnualReportNotification] =\n useState(null);\n useEffect(async () => {\n // Skip this if not in December\n const date = new Date();\n if (date.getMonth() !== 11) return;\n\n // Skip if doesn't support annual report\n if (!supports('@mastodon/annual-report')) return;\n\n let annualReportNotification = store.account.get(\n 'annualReportNotification',\n );\n if (annualReportNotification) {\n setAnnualReportNotification(annualReportNotification);\n return;\n }\n const notificationIterator = mastoFetchNotifications({\n types: ['annual_report'],\n });\n try {\n const notification = await notificationIterator.next();\n annualReportNotification = notification?.value?.notificationGroups?.[0];\n const annualReportYear = annualReportNotification?.annualReport?.year;\n // If same year, show the annual report\n if (annualReportYear == date.getFullYear()) {\n console.log(\n 'ANNUAL REPORT',\n annualReportYear,\n annualReportNotification,\n );\n setAnnualReportNotification(annualReportNotification);\n store.account.set('annualReportNotification', annualReportNotification);\n }\n } catch (e) {\n console.warn(e);\n }\n }, []);\n\n const itemsSelector = '.notification';\n const jRef = useHotkeys(\n 'j',\n () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let nextItem = allItems[activeItemIndex + 1];\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k',\n () => {\n // focus on previous status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let prevItem = allItems[activeItemIndex - 1];\n if (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const oRef = useHotkeys(\n ['enter', 'o'],\n () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const statusLink = activeItem?.querySelector('.status-link');\n if (statusLink) {\n statusLink.click();\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const today = new Date();\n const todaySubHeading = useMemo(() => {\n return niceDateTime(today, {\n forceOpts: {\n weekday: 'long',\n },\n });\n }, [today]);\n\n return (\n <div\n id=\"notifications-page\"\n class=\"deck-container\"\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n oRef.current = node;\n }}\n tabIndex=\"-1\"\n >\n <div class={`timeline-deck deck ${onlyMentions ? 'only-mentions' : ''}`}>\n <header\n hidden={hiddenUI}\n onClick={(e) => {\n if (!e.target.closest('a, button')) {\n scrollableRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }}\n onDblClick={(e) => {\n if (!e.target.closest('a, button')) {\n loadNotifications(true);\n }\n }}\n class={uiState === 'loading' ? 'loading' : ''}\n >\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Notifications</Trans>\n </h1>\n <div class=\"header-side\">\n {supportsFilteredNotifications && (\n <button\n type=\"button\"\n class=\"button plain4\"\n onClick={() => {\n setShowNotificationsSettings(true);\n }}\n >\n <Icon\n icon=\"settings\"\n size=\"l\"\n alt={t`Notifications settings`}\n />\n </button>\n )}\n </div>\n </div>\n {showNew && uiState !== 'loading' && (\n <button\n class=\"updates-button shiny-pill\"\n type=\"button\"\n onClick={() => {\n loadNotifications(true);\n scrollableRef.current?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }}\n >\n <Icon icon=\"arrow-up\" /> <Trans>New notifications</Trans>\n </button>\n )}\n </header>\n {announcements.length > 0 && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <details class=\"announcements\">\n <summary>\n <span>\n <Icon icon=\"announce\" class=\"announcement-icon\" size=\"l\" />{' '}\n <Plural\n value={announcements.length}\n one=\"Announcement\"\n other=\"Announcements\"\n />{' '}\n <small class=\"insignificant\">{instance}</small>\n </span>\n {announcements.length > 1 && (\n <span class=\"announcements-nav-buttons\">\n {announcements.map((announcement, index) => (\n <button\n type=\"button\"\n class=\"plain2 small\"\n onClick={() => {\n announcementsListRef.current?.children[\n index\n ].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }}\n >\n {index + 1}\n </button>\n ))}\n </span>\n )}\n </summary>\n <ul\n class={`announcements-list-${\n announcements.length > 1 ? 'multiple' : 'single'\n }`}\n ref={announcementsListRef}\n >\n {announcements.map((announcement) => (\n <li>\n <AnnouncementBlock announcement={announcement} />\n </li>\n ))}\n </ul>\n </details>\n </div>\n </div>\n )}\n {followRequests.length > 0 && (\n <div class=\"follow-requests\">\n <h2 class=\"timeline-header\">\n <Trans>Follow requests</Trans>\n </h2>\n {followRequests.length > 5 ? (\n <details>\n <summary>\n <Plural\n value={followRequests.length}\n one=\"# follow request\"\n other=\"# follow requests\"\n />\n </summary>\n <ul>\n {followRequests.map((account) => (\n <li key={account.id}>\n <AccountBlock account={account} />\n <FollowRequestButtons\n accountID={account.id}\n onChange={() => {\n // loadFollowRequests();\n // loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n </details>\n ) : (\n <ul>\n {followRequests.map((account) => (\n <li key={account.id}>\n <AccountBlock account={account} />\n <FollowRequestButtons\n accountID={account.id}\n onChange={() => {\n // loadFollowRequests();\n // loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n {supportsFilteredNotifications &&\n notificationsPolicy?.summary?.pendingRequestsCount > 0 && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <div class=\"filtered-notifications\">\n <details\n onToggle={async (e) => {\n const { open } = e.target;\n if (open) {\n const requests = await fetchNotificationsRequest();\n setNotificationsRequests(requests);\n console.log({ open, requests });\n }\n }}\n >\n <summary>\n <Plural\n value={notificationsPolicy.summary.pendingRequestsCount}\n one=\"Filtered notifications from # person\"\n other=\"Filtered notifications from # people\"\n />\n </summary>\n {!notificationsRequests ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n notificationsRequests?.length > 0 && (\n <ul>\n {notificationsRequests.map((request) => (\n <li key={request.id}>\n <div class=\"request-notifcations\">\n {!request.lastStatus?.id && (\n <AccountBlock\n useAvatarStatic\n showStats\n account={request.account}\n />\n )}\n {request.lastStatus?.id && (\n <div class=\"last-post\">\n <Link\n class=\"status-link\"\n to={`/${instance}/s/${request.lastStatus.id}`}\n >\n <Status\n status={request.lastStatus}\n size=\"s\"\n readOnly\n />\n </Link>\n </div>\n )}\n <NotificationRequestModalButton\n request={request}\n />\n </div>\n <NotificationRequestButtons\n request={request}\n onChange={() => {\n loadNotifications(true);\n }}\n />\n </li>\n ))}\n </ul>\n )\n )}\n </details>\n </div>\n </div>\n </div>\n )}\n {annualReportNotification && (\n <div class=\"shazam-container\">\n <div class=\"shazam-container-inner\">\n <Notification notification={annualReportNotification} />\n </div>\n </div>\n )}\n <div id=\"mentions-option\">\n <label>\n <input\n type=\"checkbox\"\n checked={onlyMentions}\n onChange={(e) => {\n setOnlyMentions(e.target.checked);\n }}\n />{' '}\n <Trans>Only mentions</Trans>\n </label>\n </div>\n <h2 class=\"timeline-header\">\n <Trans>Today</Trans>{' '}\n <small class=\"insignificant bidi-isolate\">{todaySubHeading}</small>\n </h2>\n {showTodayEmpty && (\n <p class=\"ui-state insignificant\">\n {uiState === 'default' ? t`You're all caught up.` : <>…</>}\n </p>\n )}\n {snapStates.notifications.length ? (\n <FilterContext.Provider value=\"notifications\">\n {snapStates.notifications\n // This is leaked from Notifications popover\n .filter((n) => n.type !== 'follow_request')\n .map((notification) => {\n if (onlyMentions && notification.type !== 'mention') {\n return null;\n }\n const notificationDay = new Date(notification.createdAt);\n const differentDay =\n notificationDay.toDateString() !== currentDay.toDateString();\n if (differentDay) {\n currentDay = notificationDay;\n }\n // if notificationDay is yesterday, show \"Yesterday\"\n // if notificationDay is before yesterday, show date\n const heading =\n notificationDay.toDateString() ===\n yesterdayDate.toDateString()\n ? t`Yesterday`\n : niceDateTime(currentDay, {\n hideTime: true,\n });\n const subHeading = niceDateTime(currentDay, {\n forceOpts: {\n weekday: 'long',\n },\n });\n return (\n <Fragment key={notification._ids || notification.id}>\n {differentDay && (\n <h2 class=\"timeline-header\">\n <span>{heading}</span>{' '}\n <small class=\"insignificant bidi-isolate\">\n {subHeading}\n </small>\n </h2>\n )}\n <Notification\n instance={instance}\n notification={notification}\n key={notification._ids || notification.id}\n />\n </Fragment>\n );\n })}\n </FilterContext.Provider>\n ) : (\n <>\n {uiState === 'loading' && (\n <>\n <ul class=\"timeline flat\">\n {Array.from({ length: 5 }).map((_, i) => (\n <li class=\"notification skeleton\">\n <div class=\"notification-type\">\n <Icon icon=\"notification\" size=\"xl\" />\n </div>\n <div class=\"notification-content\">\n <p>███████████ ████</p>\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n <Trans>Unable to load notifications</Trans>\n <br />\n <br />\n <button type=\"button\" onClick={() => loadNotifications(true)}>\n <Trans>Try again</Trans>\n </button>\n </p>\n )}\n </>\n )}\n {showMore && (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadNotifications();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n disabled={uiState === 'loading'}\n onClick={() => loadNotifications()}\n style={{ marginBlockEnd: '6em' }}\n >\n {uiState === 'loading' ? (\n <Loader abrupt />\n ) : (\n <Trans>Show more…</Trans>\n )}\n </button>\n </InView>\n )}\n </div>\n {supportsFilteredNotifications && showNotificationsSettings && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowNotificationsSettings(false);\n }\n }}\n >\n <div class=\"sheet\" id=\"notifications-settings\" tabIndex=\"-1\">\n <button\n type=\"button\"\n class=\"sheet-close\"\n onClick={() => setShowNotificationsSettings(false)}\n >\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans>Notifications settings</Trans>\n </h2>\n </header>\n <main>\n <form\n onSubmit={(e) => {\n e.preventDefault();\n const {\n forNotFollowing,\n forNotFollowers,\n forNewAccounts,\n forPrivateMentions,\n forLimitedAccounts,\n } = e.target;\n const newPolicy = {\n ...notificationsPolicy,\n forNotFollowing: forNotFollowing.value,\n forNotFollowers: forNotFollowers.value,\n forNewAccounts: forNewAccounts.value,\n forPrivateMentions: forPrivateMentions.value,\n forLimitedAccounts: forLimitedAccounts.value,\n };\n setNotificationsPolicy(newPolicy);\n setShowNotificationsSettings(false);\n (async () => {\n try {\n await masto.v2.notifications.policy.update(newPolicy);\n showToast(t`Notifications settings updated`);\n } catch (e) {\n console.error(e);\n }\n })();\n }}\n >\n <p>\n <Trans>Filter out notifications from people:</Trans>\n </p>\n <div class=\"notification-policy-fields\">\n {NOTIFICATIONS_POLICIES.map((key) => {\n const value = notificationsPolicy[key];\n return (\n <div key={key}>\n <label>\n {_(NOTIFICATIONS_POLICIES_TEXT[key])}\n <select name={key} defaultValue={value} class=\"small\">\n <option value=\"accept\">\n <Trans>Accept</Trans>\n </option>\n <option value=\"filter\">\n <Trans>Filter</Trans>\n </option>\n <option value=\"drop\">\n <Trans>Ignore</Trans>\n </option>\n </select>\n </label>\n </div>\n );\n })}\n </div>\n <p>\n <button type=\"submit\">\n <Trans>Save</Trans>\n </button>\n </p>\n </form>\n </main>\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nfunction inBackground() {\n return !!document.querySelector('.deck-backdrop, #modal-container > *');\n}\n\nfunction AnnouncementBlock({ announcement }) {\n const { instance } = api();\n const { contact } = getCurrentInstance();\n const contactAccount = contact?.account;\n const {\n id,\n content,\n startsAt,\n endsAt,\n published,\n allDay,\n publishedAt,\n updatedAt,\n read,\n mentions,\n statuses,\n tags,\n emojis,\n reactions,\n } = announcement;\n\n const publishedAtDate = new Date(publishedAt);\n const publishedDateText = niceDateTime(publishedAtDate);\n const updatedAtDate = new Date(updatedAt);\n const updatedAtText = niceDateTime(updatedAtDate);\n\n return (\n <div class=\"announcement-block\">\n <AccountBlock account={contactAccount} />\n <div\n class=\"announcement-content\"\n onClick={handleContentLinks({ mentions, instance })}\n dangerouslySetInnerHTML={{\n __html: enhanceContent(content, {\n emojis,\n }),\n }}\n />\n <p class=\"insignificant\">\n <time datetime={publishedAtDate.toISOString()}>\n {niceDateTime(publishedAtDate)}\n </time>\n {updatedAt && updatedAtText !== publishedDateText && (\n <>\n {' '}\n •{' '}\n <span class=\"ib\">\n <Trans>\n Updated{' '}\n <time datetime={updatedAtDate.toISOString()}>\n {niceDateTime(updatedAtDate)}\n </time>\n </Trans>\n </span>\n </>\n )}\n </p>\n <div class=\"announcement-reactions\" hidden>\n {reactions.map((reaction) => {\n const { name, count, me, staticUrl, url } = reaction;\n return (\n <button type=\"button\" class={`plain4 small ${me ? 'reacted' : ''}`}>\n {url || staticUrl ? (\n <img src={url || staticUrl} alt={name} width=\"16\" height=\"16\" />\n ) : (\n <span>{name}</span>\n )}{' '}\n <span class=\"count\">{shortenNumber(count)}</span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction fetchNotficationsByAccount(accountID) {\n const { masto } = api();\n return masto.v1.notifications.list({\n accountID,\n });\n}\nfunction NotificationRequestModalButton({ request }) {\n const { instance } = api();\n const [uiState, setUIState] = useState('loading');\n const { account, lastStatus } = request;\n const [showModal, setShowModal] = useState(false);\n const [notifications, setNotifications] = useState([]);\n\n function onClose() {\n setShowModal(false);\n }\n\n useEffect(() => {\n if (!request?.account?.id) return;\n if (!showModal) return;\n setUIState('loading');\n (async () => {\n const notifs = await fetchNotficationsByAccount(request.account.id);\n setNotifications(notifs || []);\n setUIState('default');\n })();\n }, [showModal, request?.account?.id]);\n\n return (\n <>\n <button\n type=\"button\"\n class=\"plain4 request-notifications-account\"\n onClick={() => {\n setShowModal(true);\n }}\n >\n <Icon icon=\"notification\" class=\"more-insignificant\" />{' '}\n <small>\n <Trans>\n View notifications from{' '}\n <span class=\"bidi-isolate\">@{account.username}</span>\n </Trans>\n </small>{' '}\n <Icon icon=\"chevron-down\" />\n </button>\n {showModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n }}\n >\n <div class=\"sheet\" tabIndex=\"-1\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" alt={t`Close`} />\n </button>\n <header>\n <b>\n <Trans>\n Notifications from{' '}\n <span class=\"bidi-isolate\">@{account.username}</span>\n </Trans>\n </b>\n </header>\n <main>\n {uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n notifications.map((notification) => (\n <div\n class=\"notification-peek\"\n onClick={(e) => {\n const { target } = e;\n // If button or links\n if (\n e.target.tagName === 'BUTTON' ||\n e.target.tagName === 'A'\n ) {\n onClose();\n }\n }}\n >\n <Notification\n instance={instance}\n notification={notification}\n isStatic\n />\n </div>\n ))\n )}\n </main>\n </div>\n </Modal>\n )}\n </>\n );\n}\n\nfunction NotificationRequestButtons({ request, onChange }) {\n const { t } = useLingui();\n const { masto } = api();\n const [uiState, setUIState] = useState('default');\n const [requestState, setRequestState] = useState(null); // accept, dismiss\n const hasRequestState = requestState !== null;\n\n return (\n <p class=\"notification-request-buttons\">\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRequestState}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.notifications.requests\n .$select(request.id)\n .accept();\n setRequestState('accept');\n setUIState('default');\n onChange({\n request,\n state: 'accept',\n });\n showToast(\n t`Notifications from @${request.account.username} will not be filtered from now on.`,\n );\n } catch (error) {\n setUIState('error');\n console.error(error);\n showToast(t`Unable to accept notification request`);\n }\n })();\n }}\n >\n <Trans>Allow</Trans>\n </button>{' '}\n <button\n type=\"button\"\n disabled={uiState === 'loading' || hasRequestState}\n class=\"light danger\"\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.notifications.requests\n .$select(request.id)\n .dismiss();\n setRequestState('dismiss');\n setUIState('default');\n onChange({\n request,\n state: 'dismiss',\n });\n showToast(\n t`Notifications from @${request.account.username} will not show up in Filtered notifications from now on.`,\n );\n } catch (error) {\n setUIState('error');\n console.error(error);\n showToast(t`Unable to dismiss notification request`);\n }\n })();\n }}\n >\n <Trans>Dismiss</Trans>\n </button>\n <span class=\"notification-request-states\">\n {uiState === 'loading' ? (\n <Loader abrupt />\n ) : requestState === 'accept' ? (\n <Icon\n icon=\"check-circle\"\n alt={t`Accepted`}\n class=\"notification-accepted\"\n />\n ) : (\n requestState === 'dismiss' && (\n <Icon\n icon=\"x-circle\"\n alt={t`Dismissed`}\n class=\"notification-dismissed\"\n />\n )\n )}\n </span>\n </p>\n );\n}\n\nexport default memo(Notifications);\n","import { Trans, useLingui } from '@lingui/react/macro';\nimport { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';\nimport { useRef } from 'preact/hooks';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Menu2 from '../components/menu2';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { filteredItems } from '../utils/filters';\nimport states, { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\n\nfunction Public({ local, columnMode, ...props }) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const isLocal = !!local;\n const params = columnMode ? {} : useParams();\n const { masto, instance } = api({\n instance: props?.instance || params.instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const title = isLocal\n ? t`Local timeline (${instance})`\n : t`Federated timeline (${instance})`;\n useTitle(title, isLocal ? `/:instance?/p/l` : `/:instance?/p`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const publicIterator = useRef();\n async function fetchPublic(firstLoad) {\n if (firstLoad || !publicIterator.current) {\n const opts = {\n limit: LIMIT,\n local: isLocal || undefined,\n };\n if (!isLocal && supports('@pixelfed/global-feed')) {\n opts.remote = true;\n }\n publicIterator.current = masto.v1.timelines.public.list(opts).values();\n }\n const results = await publicIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.timelines.public\n .list({\n limit: 1,\n local: isLocal,\n since_id: latestItem.current,\n })\n .values()\n .next();\n let { value } = results;\n const valueContainsLatestItem = value[0]?.id === latestItem.current; // since_id might not be supported\n if (value?.length && !valueContainsLatestItem) {\n value = filteredItems(value, 'public');\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n return (\n <Timeline\n key={instance + isLocal}\n title={title}\n titleComponent={\n <h1 class=\"header-double-lines\">\n <b>{isLocal ? t`Local timeline` : t`Federated timeline`}</b>\n <div>{instance}</div>\n </h1>\n }\n id=\"public\"\n instance={instance}\n emptyText={t`No one has posted anything yet.`}\n errorText={t`Unable to load posts`}\n fetchItems={fetchPublic}\n checkForUpdates={checkForUpdates}\n useItemID\n headerStart={<></>}\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"public\"\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem href={isLocal ? `/#/${instance}/p` : `/#/${instance}/p/l`}>\n {isLocal ? (\n <>\n <Icon icon=\"transfer\" />{' '}\n <span>\n <Trans>Switch to Federated</Trans>\n </span>\n </>\n ) : (\n <>\n <Icon icon=\"transfer\" />{' '}\n <span>\n <Trans>Switch to Local</Trans>\n </span>\n </>\n )}\n </MenuItem>\n <MenuDivider />\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n t`Enter a new instance e.g. \"mastodon.social\"`,\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert(t`Invalid instance`);\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(isLocal ? `/${newInstance}/p/l` : `/${newInstance}/p`);\n location.hash = isLocal\n ? `/${newInstance}/p/l`\n : `/${newInstance}/p`;\n }\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <span>\n <Trans>Go to another instance…</Trans>\n </span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = isLocal\n ? `/${currentInstance}/p/l`\n : `/${currentInstance}/p`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Go to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Public;\n","import { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useReducer } from 'preact/hooks';\n\nimport { api } from '../utils/api';\nimport {\n addToSearchHistory,\n clearAllSearchHistory,\n getSearchHistory,\n removeFromSearchHistory,\n} from '../utils/search-history';\nimport showToast from '../utils/show-toast';\n\nimport Icon from './icon';\nimport Link from './link';\nimport { generateSearchItemData } from './search-form';\n\nexport default function RecentSearches({ onItemClick }) {\n const { t } = useLingui();\n const { instance } = api();\n const [, reload] = useReducer((c) => c + 1, 0);\n const history = getSearchHistory();\n\n const handleClearAll = () => {\n clearAllSearchHistory();\n showToast({\n text: t`Cleared recent searches`,\n delay: 1000,\n });\n reload();\n };\n\n const handleRemoveItem = (query, queryType) => {\n removeFromSearchHistory(query, queryType);\n reload();\n };\n\n const [listRef] = useAutoAnimate();\n\n if (history.length === 0) {\n return null;\n }\n\n return (\n <div class=\"recent-searches\">\n <div class=\"recent-searches-header\">\n <Icon icon=\"history\" />{' '}\n <span>\n <Trans>Recent searches</Trans>\n </span>\n <span class=\"spacer\" />\n <button\n type=\"button\"\n class=\"plain4 small\"\n onClick={handleClearAll}\n disabled={history.length <= 0}\n >\n <span>\n <Trans>Clear all</Trans>\n </span>\n </button>\n </div>\n <ul class=\"link-list recent-searches-list\" ref={listRef}>\n {history.map((historyItem) => {\n const { label, to, icon } = generateSearchItemData(\n historyItem.query,\n historyItem.queryType,\n instance,\n );\n\n return (\n <li\n key={`${historyItem.query}-${historyItem.queryType}-${historyItem.timestamp}`}\n class=\"recent-searches-item\"\n >\n <Link\n to={to}\n class=\"recent-searches-link\"\n onClick={(e) => {\n addToSearchHistory(historyItem.query, historyItem.queryType);\n onItemClick?.(e);\n }}\n >\n <Icon icon={icon} class=\"more-insignificant\" />\n <span class=\"recent-searches-label\">{label}</span>\n </Link>\n <button\n type=\"button\"\n class=\"plain4 small\"\n onClick={() =>\n handleRemoveItem(historyItem.query, historyItem.queryType)\n }\n >\n <Icon icon=\"trash\" alt={t`Clear`} />\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","import './search.css';\n\nimport { useAutoAnimate } from '@formkit/auto-animate/preact';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useLayoutEffect, useRef, useState } from 'preact/hooks';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { useParams, useSearchParams } from 'react-router-dom';\n\nimport AccountBlock from '../components/account-block';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport NavMenu from '../components/nav-menu';\nimport RecentSearches from '../components/recent-searches';\nimport SearchForm from '../components/search-form';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport { fetchRelationships } from '../utils/relationships';\nimport shortenNumber from '../utils/shorten-number';\nimport usePageVisibility from '../utils/usePageVisibility';\nimport useTitle from '../utils/useTitle';\n\nconst SHORT_LIMIT = 5;\nconst LIMIT = 40;\nconst emptySearchParams = new URLSearchParams();\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\nfunction Search({ columnMode, ...props }) {\n const { t } = useLingui();\n const params = columnMode ? {} : useParams();\n const { masto, instance, authenticated } = api({\n instance: params.instance,\n });\n const [uiState, setUIState] = useState('default');\n const [searchParams] = columnMode ? [emptySearchParams] : useSearchParams();\n const searchFormRef = useRef();\n const q = props?.query || searchParams.get('q');\n const type = columnMode\n ? 'statuses'\n : props?.type || searchParams.get('type');\n let title = t`Search`;\n if (q) {\n switch (type) {\n case 'statuses':\n title = t`Search: ${q} (Posts)`;\n break;\n case 'accounts':\n title = t`Search: ${q} (Accounts)`;\n break;\n case 'hashtags':\n title = t`Search: ${q} (Hashtags)`;\n break;\n default:\n title = t`Search: ${q}`;\n }\n }\n useTitle(title, `/search`);\n\n const [showMore, setShowMore] = useState(false);\n const offsetRef = useRef(0);\n useEffect(() => {\n offsetRef.current = 0;\n }, [q, type]);\n\n const scrollableRef = useRef();\n useLayoutEffect(() => {\n scrollableRef.current?.scrollTo?.(0, 0);\n }, [q, type]);\n\n const [statusResults, setStatusResults] = useState([]);\n const [accountResults, setAccountResults] = useState([]);\n const [hashtagResults, setHashtagResults] = useState([]);\n useEffect(() => {\n setStatusResults([]);\n setAccountResults([]);\n setHashtagResults([]);\n }, [q]);\n const typeResults = {\n statuses: statusResults,\n accounts: accountResults,\n hashtags: hashtagResults,\n };\n const setTypeResultsFunc = {\n statuses: setStatusResults,\n accounts: setAccountResults,\n hashtags: setHashtagResults,\n };\n\n const [relationshipsMap, setRelationshipsMap] = useState({});\n const loadRelationships = async (accounts) => {\n if (!accounts?.length) return;\n const relationships = await fetchRelationships(accounts, relationshipsMap);\n if (relationships) {\n setRelationshipsMap({\n ...relationshipsMap,\n ...relationships,\n });\n }\n };\n\n function loadResults(firstLoad) {\n if (firstLoad) {\n offsetRef.current = 0;\n }\n\n if (!firstLoad && !authenticated) {\n // Search results pagination is only available to authenticated users\n return;\n }\n\n setUIState('loading');\n if (firstLoad && !type) {\n setStatusResults(statusResults.slice(0, SHORT_LIMIT));\n setAccountResults(accountResults.slice(0, SHORT_LIMIT));\n setHashtagResults(hashtagResults.slice(0, SHORT_LIMIT));\n }\n\n (async () => {\n const params = {\n q,\n resolve: authenticated,\n limit: SHORT_LIMIT,\n };\n if (type) {\n params.limit = LIMIT;\n params.type = type;\n if (authenticated) params.offset = offsetRef.current;\n }\n\n try {\n const results = await masto.v2.search.list(params);\n console.log(results);\n if (type) {\n if (firstLoad) {\n setTypeResultsFunc[type](results[type]);\n const length = results[type]?.length;\n offsetRef.current = LIMIT;\n setShowMore(!!length);\n } else {\n // If first item is the same, it means API doesn't support offset\n // I know this is a very basic check, but it works for now\n if (results[type]?.[0]?.id === typeResults[type]?.[0]?.id) {\n setShowMore(false);\n } else {\n setTypeResultsFunc[type]((prev) => [...prev, ...results[type]]);\n const length = results[type]?.length;\n offsetRef.current = offsetRef.current + LIMIT;\n setShowMore(!!length);\n }\n }\n } else {\n setStatusResults(results.statuses || []);\n setAccountResults(results.accounts || []);\n setHashtagResults(results.hashtags || []);\n offsetRef.current = 0;\n setShowMore(false);\n }\n loadRelationships(results.accounts);\n\n setUIState('default');\n } catch (err) {\n console.error(err);\n setUIState('error');\n }\n })();\n }\n\n const lastHiddenTime = useRef();\n usePageVisibility((visible) => {\n const reachStart = scrollableRef.current?.scrollTop === 0;\n if (visible && reachStart) {\n const timeDiff = Date.now() - lastHiddenTime.current;\n if (!lastHiddenTime.current || timeDiff > 1000 * 3) {\n // 3 seconds\n loadResults(true);\n } else {\n lastHiddenTime.current = Date.now();\n }\n }\n });\n\n useEffect(() => {\n let timer;\n searchFormRef.current?.setValue?.(q || '');\n if (q) {\n loadResults(true);\n } else {\n timer = setTimeout(() => {\n searchFormRef.current?.focus?.();\n }, 150); // Right after focusDeck runs\n }\n return () => clearTimeout(timer);\n }, [q, type, instance]);\n\n useHotkeys(\n ['Slash', '/'],\n (e) => {\n searchFormRef.current?.focus?.();\n searchFormRef.current?.select?.();\n },\n {\n useKey: true,\n preventDefault: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const itemsSelector = '.timeline > li > a, .hashtag-list > li > a';\n const jRef = useHotkeys(\n 'j',\n () => {\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let nextItem = allItems[activeItemIndex + 1];\n if (nextItem) {\n nextItem.focus();\n nextItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const kRef = useHotkeys(\n 'k',\n () => {\n // focus on previous status after active item\n const activeItem = document.activeElement.closest(itemsSelector);\n const activeItemRect = activeItem?.getBoundingClientRect();\n const allItems = Array.from(\n scrollableRef.current.querySelectorAll(itemsSelector),\n );\n if (\n activeItem &&\n activeItemRect.top < scrollableRef.current.clientHeight &&\n activeItemRect.bottom > 0\n ) {\n const activeItemIndex = allItems.indexOf(activeItem);\n let prevItem = allItems[activeItemIndex - 1];\n if (prevItem) {\n prevItem.focus();\n prevItem.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n const topmostItem = allItems.find((item) => {\n const itemRect = item.getBoundingClientRect();\n return itemRect.top >= 44 && itemRect.left >= 0;\n });\n if (topmostItem) {\n topmostItem.focus();\n topmostItem.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const [filterBarParent] = useAutoAnimate();\n\n return (\n <div\n id=\"search-page\"\n class=\"deck-container\"\n tabIndex=\"-1\"\n ref={(node) => {\n scrollableRef.current = node;\n jRef.current = node;\n kRef.current = node;\n }}\n >\n <div class=\"timeline-deck deck\">\n <header class={uiState === 'loading' ? 'loading' : ''}>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n </div>\n <SearchForm ref={searchFormRef} />\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n loadResults(true);\n }}\n disabled={uiState === 'loading'}\n >\n <Icon icon=\"search\" size=\"l\" alt={t`Search`} />\n </button>\n </div>\n </div>\n </header>\n <main>\n {!!q && !columnMode && (\n <div\n ref={filterBarParent}\n class={`filter-bar ${uiState === 'loading' ? 'loading' : ''}`}\n >\n {!!type && (\n <Link to={`/search${q ? `?q=${encodeURIComponent(q)}` : ''}`}>\n <Icon icon=\"chevron-left\" /> <Trans>All</Trans>\n </Link>\n )}\n {[\n {\n label: t`Accounts`,\n type: 'accounts',\n to: `/search?q=${encodeURIComponent(q)}&type=accounts`,\n },\n {\n label: t`Hashtags`,\n type: 'hashtags',\n to: `/search?q=${encodeURIComponent(q)}&type=hashtags`,\n },\n {\n label: t`Posts`,\n type: 'statuses',\n to: `/search?q=${encodeURIComponent(q)}&type=statuses`,\n },\n ]\n .sort((a, b) => {\n if (a.type === type) return -1;\n if (b.type === type) return 1;\n return 0;\n })\n .map((link) => (\n <Link to={link.to} key={link.type}>\n {link.label}\n </Link>\n ))}\n </div>\n )}\n {!!q ? (\n <>\n {(!type || type === 'accounts') && (\n <>\n {type !== 'accounts' && (\n <h2 class=\"timeline-header\">\n <Trans>Accounts</Trans>{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=accounts`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n </Link>\n </h2>\n )}\n {accountResults.length > 0 ? (\n <>\n <ul class=\"timeline flat accounts-list\">\n {accountResults.map((account) => (\n <li key={account.id}>\n <AccountBlock\n account={account}\n instance={instance}\n showStats\n relationship={relationshipsMap[account.id]}\n />\n </li>\n ))}\n </ul>\n {type !== 'accounts' && (\n <div class=\"ui-state\">\n <Link\n class=\"plain button\"\n to={`/search?q=${encodeURIComponent(\n q,\n )}&type=accounts`}\n >\n <Trans>See more accounts</Trans>{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No accounts found.</Trans>\n </p>\n ))\n )}\n </>\n )}\n {(!type || type === 'hashtags') && (\n <>\n {type !== 'hashtags' && (\n <h2 class=\"timeline-header\">\n <Trans>Hashtags</Trans>{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=hashtags`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n </Link>\n </h2>\n )}\n {hashtagResults.length > 0 ? (\n <>\n <ul class=\"link-list hashtag-list\">\n {hashtagResults.map((hashtag) => {\n const { name, history } = hashtag;\n const total = history?.reduce?.(\n (acc, cur) => acc + +cur.uses,\n 0,\n );\n return (\n <li key={`${name}-${total}`}>\n <Link\n to={\n instance\n ? `/${instance}/t/${name}`\n : `/t/${name}`\n }\n >\n <Icon icon=\"hashtag\" alt=\"#\" />\n <span>{name}</span>\n {!!total && (\n <span class=\"count\">\n {shortenNumber(total)}\n </span>\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n {type !== 'hashtags' && (\n <div class=\"ui-state\">\n <Link\n class=\"plain button\"\n to={`/search?q=${encodeURIComponent(\n q,\n )}&type=hashtags`}\n >\n <Trans>See more hashtags</Trans>{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No hashtags found.</Trans>\n </p>\n ))\n )}\n </>\n )}\n {(!type || type === 'statuses') && (\n <>\n {type !== 'statuses' && (\n <h2 class=\"timeline-header\">\n <Trans>Posts</Trans>{' '}\n <Link\n to={`/search?q=${encodeURIComponent(q)}&type=statuses`}\n >\n <Icon icon=\"arrow-right\" size=\"l\" alt={t`See more`} />\n </Link>\n </h2>\n )}\n {statusResults.length > 0 ? (\n <>\n <ul class=\"timeline\">\n {statusResults.map((status) => (\n <li key={status.id}>\n <Link\n class=\"status-link\"\n to={\n instance\n ? `/${instance}/s/${status.id}`\n : `/s/${status.id}`\n }\n >\n <Status status={status} />\n </Link>\n </li>\n ))}\n </ul>\n {type !== 'statuses' && (\n <div class=\"ui-state\">\n <Link\n class=\"plain button\"\n to={`/search?q=${encodeURIComponent(\n q,\n )}&type=statuses`}\n >\n <Trans>See more posts</Trans>{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </div>\n )}\n </>\n ) : (\n !type &&\n (uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No posts found.</Trans>\n </p>\n ))\n )}\n </>\n )}\n {!!type &&\n (uiState === 'default' ? (\n showMore ? (\n <InView\n onChange={(inView) => {\n if (inView) {\n loadResults();\n }\n }}\n >\n <button\n type=\"button\"\n class=\"plain block\"\n onClick={() => loadResults()}\n style={{ marginBlockEnd: '6em' }}\n >\n <Trans>Show more…</Trans>\n </button>\n </InView>\n ) : (\n <p class=\"ui-state insignificant\">\n <Trans>The end.</Trans>\n </p>\n )\n ) : (\n uiState === 'loading' && (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n )\n ))}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader abrupt />\n </p>\n ) : (\n <>\n <p class=\"ui-state insignificant\">\n <Trans>\n Enter your search term or paste a URL above to get started.\n </Trans>\n </p>\n <RecentSearches />\n </>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nexport default Search;\n","import '../components/links-bar.css';\nimport './trending.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { getBlurHashAverageColor } from 'fast-blurhash';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport Timeline from '../components/timeline';\nimport { api } from '../utils/api';\nimport { oklab2rgb, rgb2oklab } from '../utils/color-utils';\nimport { filteredItems } from '../utils/filters';\nimport getDomain from '../utils/get-domain';\nimport pmem from '../utils/pmem';\nimport shortenNumber from '../utils/shorten-number';\nimport states, { saveStatus } from '../utils/states';\nimport supports from '../utils/supports';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 20;\nconst TREND_CACHE_TIME = 10 * 60 * 1000; // 10 minutes\n\nconst fetchLinks = pmem(\n (masto) => {\n return masto.v1.trends.links.list().values().next();\n },\n {\n maxAge: TREND_CACHE_TIME,\n },\n);\n\nconst fetchHashtags = pmem(\n (masto) => {\n return masto.v1.trends.tags.list().values().next();\n },\n {\n maxAge: TREND_CACHE_TIME,\n },\n);\n\nfunction fetchTrendsStatuses(masto) {\n if (supports('@pixelfed/trending')) {\n return masto.pixelfed.v2.discover.posts.trending\n .list({\n range: 'daily',\n })\n .values();\n }\n return masto.v1.trends.statuses\n .list({\n limit: LIMIT,\n })\n .values();\n}\n\nfunction fetchLinkList(masto, params) {\n return masto.v1.timelines.link.list(params).values();\n}\n\nfunction Trending({ columnMode, ...props }) {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const params = columnMode ? {} : useParams();\n const { masto, instance } = api({\n instance: props?.instance || params.instance,\n });\n const { masto: currentMasto, instance: currentInstance } = api();\n const title = t`Trending (${instance})`;\n useTitle(title, `/:instance?/trending`);\n // const navigate = useNavigate();\n const latestItem = useRef();\n\n const sameCurrentInstance = instance === currentInstance;\n\n const [hashtags, setHashtags] = useState([]);\n const [links, setLinks] = useState([]);\n const trendIterator = useRef();\n\n async function fetchTrends(firstLoad) {\n console.log('fetchTrend', firstLoad);\n if (firstLoad || !trendIterator.current) {\n trendIterator.current = fetchTrendsStatuses(masto);\n\n // Get hashtags\n if (supports('@mastodon/trending-hashtags')) {\n try {\n // const iterator = masto.v1.trends.tags.list();\n const { value: tags } = await fetchHashtags(masto);\n console.log('tags', tags);\n if (tags?.length) {\n setHashtags(tags);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n // Get links\n if (supports('@mastodon/trending-links')) {\n try {\n const { value } = await fetchLinks(masto, instance);\n // 4 types available: link, photo, video, rich\n // Only want links for now\n const links = value?.filter?.((link) => link.type === 'link');\n console.log('links', links);\n if (links?.length) {\n setLinks(links);\n }\n } catch (e) {\n console.error(e);\n }\n }\n }\n const results = await trendIterator.current.next();\n let { value } = results;\n if (value?.length) {\n if (firstLoad) {\n latestItem.current = value[0].id;\n }\n\n // value = filteredItems(value, 'public'); // Might not work here\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n return {\n ...results,\n value,\n };\n }\n\n // Link mentions\n // https://github.com/mastodon/mastodon/pull/30381\n const [currentLinkMentionsLoading, setCurrentLinkMentionsLoading] =\n useState(false);\n const currentLinkMentionsIterator = useRef();\n const [currentLink, setCurrentLink] = useState(null);\n const hasCurrentLink = !!currentLink;\n const currentLinkRef = useRef();\n const supportsTrendingLinkPosts =\n sameCurrentInstance && supports('@mastodon/trending-link-posts');\n\n useEffect(() => {\n if (currentLink && currentLinkRef.current) {\n currentLinkRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }, [currentLink]);\n\n const prevCurrentLink = useRef();\n async function fetchLinkMentions(firstLoad) {\n if (firstLoad || !currentLinkMentionsIterator.current) {\n setCurrentLinkMentionsLoading(true);\n currentLinkMentionsIterator.current = fetchLinkList(masto, {\n url: currentLink,\n });\n }\n prevCurrentLink.current = currentLink;\n const results = await currentLinkMentionsIterator.current.next();\n let { value } = results;\n if (value?.length) {\n value = filteredItems(value, 'public');\n value.forEach((item) => {\n saveStatus(item, instance);\n });\n }\n if (prevCurrentLink.current === currentLink) {\n setCurrentLinkMentionsLoading(false);\n }\n return {\n ...results,\n value,\n };\n }\n\n async function checkForUpdates() {\n try {\n const results = await masto.v1.trends.statuses\n .list({\n limit: 1,\n // NOT SUPPORTED\n // since_id: latestItem.current,\n })\n .values()\n .next();\n let { value } = results;\n value = filteredItems(value, 'public');\n if (value?.length && value[0].id !== latestItem.current) {\n latestItem.current = value[0].id;\n return true;\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n const TimelineStart = useMemo(() => {\n return (\n <>\n {!!hashtags.length && (\n <div class=\"filter-bar expandable\">\n <Icon icon=\"chart\" class=\"insignificant\" size=\"l\" />\n {hashtags.map((tag, i) => {\n const { name, history } = tag;\n const total = history.reduce((acc, cur) => acc + +cur.uses, 0);\n return (\n <Link to={`/${instance}/t/${name}`} key={name}>\n <span dir=\"auto\">\n <span class=\"more-insignificant\">#</span>\n {name}\n </span>\n <span class=\"filter-count\">{shortenNumber(total)}</span>\n </Link>\n );\n })}\n </div>\n )}\n {!!links.length && (\n <div class=\"links-bar\">\n <header>\n <h3>\n <Trans>Trending News</Trans>\n </h3>\n </header>\n {links.map((link) => {\n const {\n authors,\n authorName,\n authorUrl,\n blurhash,\n description,\n height,\n image,\n imageDescription,\n language,\n providerName,\n providerUrl,\n publishedAt,\n title,\n url,\n width,\n } = link;\n const author = authors?.[0]?.account?.id\n ? authors[0].account\n : null;\n const isShortTitle = title.length < 30;\n const hasAuthor = !!(authorName || author);\n const domain = getDomain(url);\n let accentColor;\n if (blurhash) {\n const averageColor = getBlurHashAverageColor(blurhash);\n const labAverageColor = rgb2oklab(averageColor);\n accentColor = oklab2rgb([\n 0.6,\n labAverageColor[1],\n labAverageColor[2],\n ]);\n }\n\n return (\n <div key={url}>\n <a\n ref={currentLink === url ? currentLinkRef : null}\n href={url}\n target=\"_blank\"\n rel=\"noopener\"\n class={`link-block ${\n hasCurrentLink\n ? currentLink === url\n ? 'active'\n : 'inactive'\n : ''\n }`}\n style={\n accentColor\n ? {\n '--accent-color': `rgb(${accentColor.join(',')})`,\n '--accent-alpha-color': `rgba(${accentColor.join(\n ',',\n )}, 0.4)`,\n }\n : {}\n }\n >\n <article>\n <figure>\n <img\n src={image}\n alt={imageDescription}\n width={width}\n height={height}\n loading=\"lazy\"\n />\n </figure>\n <div class=\"article-body\">\n <header>\n <div class=\"article-meta\">\n <span class=\"domain\">{domain}</span>{' '}\n {!!publishedAt && <>· </>}\n {!!publishedAt && (\n <>\n <RelativeTime\n datetime={publishedAt}\n format=\"micro\"\n />\n </>\n )}\n </div>\n {!!title && (\n <h1\n class=\"title\"\n lang={language}\n dir=\"auto\"\n title={title}\n >\n {title}\n </h1>\n )}\n </header>\n {!!description && (\n <p\n class={`description ${\n hasAuthor && !isShortTitle ? '' : 'more-lines'\n }`}\n lang={language}\n dir=\"auto\"\n title={description}\n >\n {description}\n </p>\n )}\n {hasAuthor && (\n <>\n <hr />\n <p class=\"byline\">\n <small>\n <Trans comment=\"By [Author]\">\n By{' '}\n {author ? (\n <NameText account={author} showAvatar />\n ) : authorUrl ? (\n <a\n href={authorUrl}\n target=\"_blank\"\n rel=\"noopener\"\n >\n {authorName}\n </a>\n ) : (\n authorName\n )}\n </Trans>\n </small>\n </p>\n </>\n )}\n </div>\n </article>\n </a>\n {supportsTrendingLinkPosts && (\n <button\n type=\"button\"\n class=\"small plain4 block\"\n onClick={() => {\n setCurrentLink(url);\n }}\n disabled={url === currentLink}\n >\n <Icon icon=\"comment2\" />{' '}\n <span>\n <Trans>Mentions</Trans>\n </span>{' '}\n <Icon icon=\"chevron-down\" />\n </button>\n )}\n </div>\n );\n })}\n </div>\n )}\n {supportsTrendingLinkPosts && !!links.length && (\n <div\n class={`timeline-header-block ${hasCurrentLink ? 'blended' : ''}`}\n >\n {hasCurrentLink ? (\n <>\n <div style={{ width: 50, flexShrink: 0, textAlign: 'center' }}>\n {currentLinkMentionsLoading ? (\n <Loader abrupt />\n ) : (\n <button\n type=\"button\"\n class=\"light\"\n onClick={() => {\n setCurrentLink(null);\n }}\n >\n <Icon icon=\"x\" alt={t`Back to showing trending posts`} />\n </button>\n )}\n </div>\n <p>\n <Trans>\n Showing posts mentioning{' '}\n <span class=\"link-text\">\n {currentLink\n .replace(/^https?:\\/\\/(www\\.)?/i, '')\n .replace(/\\/$/, '')}\n </span>\n </Trans>\n </p>\n </>\n ) : (\n <p class=\"insignificant\">\n <Trans>Trending posts</Trans>\n </p>\n )}\n </div>\n )}\n </>\n );\n }, [hashtags, links, currentLink, currentLinkMentionsLoading]);\n\n return (\n <Timeline\n key={instance}\n title={title}\n titleComponent={\n <h1 class=\"header-double-lines\">\n <b>\n <Trans>Trending</Trans>\n </b>\n <div>{instance}</div>\n </h1>\n }\n id=\"trending\"\n instance={instance}\n emptyText={t`No trending posts.`}\n errorText={t`Unable to load posts`}\n fetchItems={hasCurrentLink ? fetchLinkMentions : fetchTrends}\n checkForUpdates={hasCurrentLink ? undefined : checkForUpdates}\n checkForUpdatesInterval={5 * 60 * 1000} // 5 minutes\n useItemID\n headerStart={<></>}\n boostsCarousel={snapStates.settings.boostsCarousel}\n // allowFilters\n filterContext=\"public\"\n timelineStart={TimelineStart}\n refresh={currentLink}\n clearWhenRefresh\n view={hasCurrentLink ? 'link-mentions' : undefined}\n headerEnd={\n <Menu2\n portal\n // setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n let newInstance = prompt(\n t`Enter a new instance e.g. \"mastodon.social\"`,\n );\n if (!/\\./.test(newInstance)) {\n if (newInstance) alert(t`Invalid instance`);\n return;\n }\n if (newInstance) {\n newInstance = newInstance.toLowerCase().trim();\n // navigate(`/${newInstance}/trending`);\n location.hash = `/${newInstance}/trending`;\n }\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <span>\n <Trans>Go to another instance…</Trans>\n </span>\n </MenuItem>\n {currentInstance !== instance && (\n <MenuItem\n onClick={() => {\n location.hash = `/${currentInstance}/trending`;\n }}\n >\n <Icon icon=\"bus\" />{' '}\n <small class=\"menu-double-lines\">\n <Trans>\n Go to my instance (<b>{currentInstance}</b>)\n </Trans>\n </small>\n </MenuItem>\n )}\n </Menu2>\n }\n />\n );\n}\n\nexport default Trending;\n","import { useLingui } from '@lingui/react/macro';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { useSnapshot } from 'valtio';\n\nimport Bookmarks from '../pages/bookmarks';\nimport Favourites from '../pages/favourites';\nimport Following from '../pages/following';\nimport Hashtag from '../pages/hashtag';\nimport List from '../pages/list';\nimport Mentions from '../pages/mentions';\nimport Notifications from '../pages/notifications';\nimport Public from '../pages/public';\nimport Search from '../pages/search';\nimport Trending from '../pages/trending';\nimport isRTL from '../utils/is-rtl';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'nearest',\n behavior: 'smooth',\n};\n\nfunction Columns() {\n const { t } = useLingui();\n useTitle(t`Home`, '/');\n const snapStates = useSnapshot(states);\n const { shortcuts } = snapStates;\n\n console.debug('RENDER Columns', shortcuts);\n\n const components = shortcuts.map((shortcut) => {\n if (!shortcut) return null;\n const { type, ...params } = shortcut;\n const Component = {\n following: Following,\n notifications: Notifications,\n list: List,\n public: Public,\n bookmarks: Bookmarks,\n favourites: Favourites,\n hashtag: Hashtag,\n mentions: Mentions,\n trending: Trending,\n search: Search,\n }[type];\n if (!Component) return null;\n // Don't show Search column with no query, for now\n if (type === 'search' && !params.query) return null;\n // Don't show List column with no list, for now\n if (type === 'list' && !params.id) return null;\n return (\n <Component key={type + JSON.stringify(params)} {...params} columnMode />\n );\n });\n\n useHotkeys(\n ['1', '2', '3', '4', '5', '6', '7', '8', '9'],\n (e) => {\n try {\n const index = parseInt(e.key, 10) - 1;\n const $column = document.querySelectorAll('#columns > *')[index];\n if ($column) {\n $column.focus();\n $column.scrollIntoView(scrollIntoViewOptions);\n }\n } catch (e) {\n console.error(e);\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n useHotkeys(\n ['[', ']'],\n (e, handler) => {\n const key = handler.keys[0];\n const currentFocusedColumn =\n document.activeElement.closest('#columns > *');\n\n const rtl = isRTL();\n const prevColKey = rtl ? ']' : '[';\n const nextColKey = rtl ? '[' : ']';\n let $column;\n\n if (key === prevColKey) {\n // If [, focus on left of focused column, else first column\n $column = currentFocusedColumn\n ? currentFocusedColumn.previousElementSibling\n : document.querySelectorAll('#columns > *')[0];\n } else if (key === nextColKey) {\n // If ], focus on right of focused column, else 2nd column\n $column = currentFocusedColumn\n ? currentFocusedColumn.nextElementSibling\n : document.querySelectorAll('#columns > *')[1];\n }\n if ($column) {\n $column.focus();\n $column.scrollIntoView(scrollIntoViewOptions);\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n return (\n <div\n id=\"columns\"\n onContextMenu={(e) => {\n // If right-click on header, but not links or buttons\n if (\n e.target.closest('.deck > header') &&\n !e.target.closest('a') &&\n !e.target.closest('button')\n ) {\n e.preventDefault();\n states.showShortcutsSettings = true;\n }\n }}\n onFocus={() => {\n // Get current focused column\n const currentFocusedColumn =\n document.activeElement.closest('#columns > *');\n if (currentFocusedColumn) {\n // Remove focus classes from all columns\n // Add focus class to current focused column\n document.querySelectorAll('#columns > *').forEach((column) => {\n column.classList.toggle('focus', column === currentFocusedColumn);\n });\n }\n }}\n >\n {components}\n </div>\n );\n}\n\nexport default Columns;\n","import './notifications-menu.css';\n\nimport { msg } from '@lingui/core/macro';\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { ControlledMenu } from '@szhsin/react-menu';\nimport { memo } from 'preact/compat';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Columns from '../components/columns';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport Notification from '../components/notification';\nimport { api } from '../utils/api';\nimport db from '../utils/db';\nimport FilterContext from '../utils/filter-context';\nimport { massageNotifications2 } from '../utils/group-notifications';\nimport states, { saveStatus } from '../utils/states';\nimport { getCurrentAccountNS } from '../utils/store-utils';\n\nimport Following from './following';\nimport {\n getGroupedNotifications,\n mastoFetchNotifications,\n} from './notifications';\n\nfunction Home() {\n const { _ } = useLingui();\n const snapStates = useSnapshot(states);\n __BENCHMARK.end('time-to-home');\n useEffect(() => {\n (async () => {\n const keys = await db.drafts.keys();\n if (keys.length) {\n const ns = getCurrentAccountNS();\n const ownKeys = keys.filter((key) => key.startsWith(ns));\n if (ownKeys.length) {\n states.showDrafts = true;\n }\n }\n })();\n }, []);\n\n return (\n <>\n {(snapStates.settings.shortcutsViewMode === 'multi-column' ||\n (!snapStates.settings.shortcutsViewMode &&\n snapStates.settings.shortcutsColumnsMode)) &&\n !!snapStates.shortcuts?.length ? (\n <Columns />\n ) : (\n <Following\n title={_(msg`Home`)}\n path=\"/\"\n id=\"home\"\n headerStart={false}\n headerEnd={<NotificationsLink />}\n />\n )}\n </>\n );\n}\n\nfunction NotificationsLink() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n const notificationLinkRef = useRef();\n const [menuState, setMenuState] = useState(undefined);\n return (\n <>\n <Link\n ref={notificationLinkRef}\n to=\"/notifications\"\n class={`button plain notifications-button ${\n snapStates.notificationsShowNew ? 'has-badge' : ''\n } ${menuState || ''}`}\n onClick={(e) => {\n e.stopPropagation();\n if (window.matchMedia('(min-width: calc(40em))').matches) {\n e.preventDefault();\n setMenuState((state) => (!state ? 'open' : undefined));\n }\n }}\n >\n <Icon icon=\"notification\" size=\"l\" alt={t`Notifications`} />\n </Link>\n <NotificationsMenu\n state={menuState}\n anchorRef={notificationLinkRef}\n onClose={() => setMenuState(undefined)}\n />\n </>\n );\n}\n\nconst NOTIFICATIONS_DISPLAY_LIMIT = 5;\nfunction NotificationsMenu({ anchorRef, state, onClose }) {\n const { masto, instance } = api();\n const snapStates = useSnapshot(states);\n const [uiState, setUIState] = useState('default');\n\n const notificationsIterator = mastoFetchNotifications();\n\n async function fetchNotifications() {\n const allNotifications = await notificationsIterator.next();\n const notifications = massageNotifications2(allNotifications.value);\n\n if (notifications?.length) {\n notifications.forEach((notification) => {\n saveStatus(notification.status, instance, {\n skipThreading: true,\n });\n });\n\n const groupedNotifications = getGroupedNotifications(notifications);\n\n states.notificationsLast = groupedNotifications[0];\n states.notifications = groupedNotifications;\n\n // Update last read marker\n masto.v1.markers\n .create({\n notifications: {\n lastReadId: groupedNotifications[0].id,\n },\n })\n .catch(() => {});\n }\n\n states.notificationsShowNew = false;\n states.notificationsLastFetchTime = Date.now();\n return allNotifications;\n }\n\n const [hasFollowRequests, setHasFollowRequests] = useState(false);\n function fetchFollowRequests() {\n return masto.v1.followRequests.list({\n limit: 1,\n });\n }\n\n function loadNotifications({ skipFollowRequests = false } = {}) {\n setUIState('loading');\n (async () => {\n try {\n await fetchNotifications();\n if (!skipFollowRequests) {\n const followRequests = await fetchFollowRequests();\n setHasFollowRequests(!!followRequests?.length);\n }\n setUIState('default');\n } catch (e) {\n setUIState('error');\n }\n })();\n }\n\n const menuRef = useRef();\n const headerHeight = 52;\n useEffect(() => {\n if (state !== 'open') return;\n if (snapStates.notificationsShowNew) {\n const menuElement = menuRef.current;\n if (menuElement?.scrollTop <= headerHeight) {\n loadNotifications({\n skipFollowRequests: true,\n });\n }\n } else {\n loadNotifications();\n }\n }, [state, snapStates.notificationsShowNew]);\n\n return (\n <ControlledMenu\n ref={menuRef}\n menuClassName=\"notifications-menu\"\n state={state}\n anchorRef={anchorRef}\n onClose={onClose}\n portal={{\n target: document.body,\n }}\n containerProps={{\n onClick: () => {\n menuRef.current?.closeMenu?.();\n },\n }}\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n align=\"center\"\n boundingBoxPadding=\"8 8 8 8\"\n >\n <header>\n <h2>\n <Trans>Notifications</Trans>\n </h2>\n </header>\n <FilterContext.Provider value=\"notifications\">\n <main>\n {snapStates.notifications.length ? (\n <>\n {snapStates.notifications\n .slice(0, NOTIFICATIONS_DISPLAY_LIMIT)\n .map((notification) => (\n <Notification\n key={notification._ids || notification.id}\n instance={instance}\n notification={notification}\n disableContextMenu\n />\n ))}\n </>\n ) : uiState === 'loading' ? (\n <div class=\"ui-state\">\n <Loader abrupt />\n </div>\n ) : (\n uiState === 'error' && (\n <div class=\"ui-state\">\n <p>\n <Trans>Unable to fetch notifications.</Trans>\n </p>\n <p>\n <button type=\"button\" onClick={loadNotifications}>\n <Trans>Try again</Trans>\n </button>\n </p>\n </div>\n )\n )}\n </main>\n </FilterContext.Provider>\n <footer>\n <Link to=\"/mentions\" class=\"button plain\">\n <Icon icon=\"at\" />{' '}\n <span>\n <Trans>Mentions</Trans>\n </span>\n </Link>\n <Link to=\"/notifications\" class=\"button plain2\">\n {hasFollowRequests ? (\n <Trans>\n <span class=\"tag collapsed\">New</span>{' '}\n <span>Follow Requests</span>\n </Trans>\n ) : (\n <b>\n <Trans>See all</Trans>\n </b>\n )}{' '}\n <Icon icon=\"arrow-right\" />\n </Link>\n </footer>\n </ControlledMenu>\n );\n}\n\nexport default memo(Home);\n","// export const statusRegex = /\\/@([^@\\/]+)@?([^\\/]+)?\\/([^\\/]+)\\/?$/i;\n// export const statusNoteRegex = /\\/notes\\/([^\\/]+)\\/?$/i;\n\nconst statusPostRegexes = [\n /^\\/@[^@\\/]+\\/(?:statuses|posts)\\/([^\\/]+)/i, // GoToSocial, Takahe\n /\\/notes\\/([^\\/]+)/i, // Misskey, Firefish\n /^\\/(?:notice|objects)\\/([a-z0-9-]+)/i, // Pleroma\n /\\/@[^@\\/]+\\/post\\/([^\\/]+)/i, // Threads\n /\\/@[^@\\/]+@?[^\\/]+?\\/([^\\/]+)/i, // Mastodon\n /^\\/p\\/[^\\/]+\\/([^\\/]+)/i, // Pixelfed\n];\n\nexport function getInstanceStatusObject(url) {\n // Regex /:username/:id, where username = @username or @username@domain, id = anything\n const theURL = URL.parse(url);\n if (!theURL) return {};\n const { hostname, pathname } = theURL;\n // const [, username, domain, id] = pathname.match(statusRegex) || [];\n for (const regex of statusPostRegexes) {\n const [, id] = pathname.match(regex) || [];\n console.log(pathname, regex, id);\n if (id) {\n return {\n instance: hostname,\n id,\n };\n }\n }\n return {};\n}\n\nfunction getInstanceStatusURL(url) {\n const { instance, id } = getInstanceStatusObject(url);\n if (instance && id) {\n return `/${instance}/s/${id}`;\n }\n return null;\n}\n\nexport default getInstanceStatusURL;\n","import { Trans } from '@lingui/react/macro';\nimport { useLayoutEffect, useState } from 'preact/hooks';\nimport { useLocation } from 'react-router-dom';\n\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport { api } from '../utils/api';\nimport getInstanceStatusURL, {\n getInstanceStatusObject,\n} from '../utils/get-instance-status-url';\n\nexport default function HttpRoute() {\n const location = useLocation();\n const url = location.pathname.replace(/^\\//, '');\n const statusObject = getInstanceStatusObject(url);\n // const statusURL = getInstanceStatusURL(url);\n const statusURL = statusObject?.instance\n ? `/${statusObject.instance}/s/${statusObject.id}`\n : null;\n const [uiState, setUIState] = useState('loading');\n\n useLayoutEffect(() => {\n setUIState('loading');\n (async () => {\n // Check if status returns 200\n try {\n const { instance, id } = statusObject;\n if (id) {\n const { masto } = api({ instance });\n const status = await masto.v1.statuses.$select(id).fetch();\n if (status) {\n window.location.hash = statusURL + '?view=full';\n return;\n }\n }\n } catch (e) {}\n\n // Fallback to search\n {\n const { masto: currentMasto, instance: currentInstance } = api();\n const result = await currentMasto.v2.search.list({\n q: url,\n limit: 1,\n resolve: true,\n });\n if (result.statuses.length) {\n const status = result.statuses[0];\n window.location.hash = `/${currentInstance}/s/${status.id}?view=full`;\n } else if (result.accounts.length) {\n const account = result.accounts[0];\n window.location.hash = `/${currentInstance}/a/${account.id}`;\n } else if (statusURL) {\n // Fallback to original URL, which will probably show error\n window.location.hash = statusURL + '?view=full';\n } else {\n setUIState('error');\n }\n }\n })();\n }, [statusURL]);\n\n return (\n <div class=\"ui-state\" tabIndex=\"-1\">\n {uiState === 'loading' ? (\n <>\n <Loader abrupt />\n <h2>\n <Trans>Resolving…</Trans>\n </h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {url}\n </a>\n </p>\n </>\n ) : (\n <>\n <h2>\n <Trans>Unable to resolve URL</Trans>\n </h2>\n <p>\n <a href={url} target=\"_blank\" rel=\"noopener\">\n {url}\n </a>\n </p>\n </>\n )}\n <hr />\n <p>\n <Link to=\"/\">\n <Trans>Go home</Trans>\n </Link>\n </p>\n </div>\n );\n}\n","import './lists.css';\n\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { useEffect, useReducer, useState } from 'preact/hooks';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport ListAddEdit from '../components/list-add-edit';\nimport ListExclusiveBadge from '../components/list-exclusive-badge';\nimport Loader from '../components/loader';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport { fetchLists } from '../utils/lists';\nimport useTitle from '../utils/useTitle';\n\nfunction Lists() {\n const { t } = useLingui();\n useTitle(t`Lists`, `/l`);\n const [uiState, setUIState] = useState('default');\n\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [lists, setLists] = useState([]);\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const lists = await fetchLists();\n console.log(lists);\n setLists(lists);\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n }, [reloadCount]);\n\n const [showListAddEditModal, setShowListAddEditModal] = useState(false);\n\n const hasExclusiveLists = lists.some((list) => list.exclusive);\n\n return (\n <div id=\"lists-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" />\n </Link>\n </div>\n <h1>\n <Trans>Lists</Trans>\n </h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => setShowListAddEditModal(true)}\n >\n <Icon icon=\"plus\" size=\"l\" alt={t`New list`} />\n </button>\n </div>\n </div>\n </header>\n <main>\n {lists.length > 0 ? (\n <>\n <ul class=\"link-list\">\n {lists.map((list) => (\n <li>\n <Link to={`/l/${list.id}`}>\n <Icon icon=\"list\" />{' '}\n <span>\n {list.title}\n {list.exclusive && (\n <>\n {' '}\n <ListExclusiveBadge insignificant />\n </>\n )}\n </span>\n {/* <button\n type=\"button\"\n class=\"plain\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowListAddEditModal({\n list,\n });\n }}\n >\n <Icon icon=\"pencil\" />\n </button> */}\n </Link>\n </li>\n ))}\n </ul>\n {lists.length > 1 && (\n <footer class=\"ui-state\">\n {hasExclusiveLists && (\n <p>\n <small class=\"insignificant\">\n <ListExclusiveBadge />{' '}\n <Trans>\n Posts on this list are hidden from Home/Following\n </Trans>\n </small>\n </p>\n )}\n <p>\n <small class=\"insignificant\">\n <Plural\n value={lists.length}\n one=\"# list\"\n other=\"# lists\"\n />\n </small>\n </p>\n </footer>\n )}\n </>\n ) : uiState === 'loading' ? (\n <p class=\"ui-state\">\n <Loader />\n </p>\n ) : uiState === 'error' ? (\n <p class=\"ui-state\">\n <Trans>Unable to load lists.</Trans>\n </p>\n ) : (\n <p class=\"ui-state\">\n <Trans>No lists yet.</Trans>\n </p>\n )}\n </main>\n </div>\n {showListAddEditModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowListAddEditModal(false);\n }\n }}\n >\n <ListAddEdit\n list={showListAddEditModal?.list}\n onClose={(result) => {\n if (result.state === 'success') {\n reload();\n }\n setShowListAddEditModal(false);\n }}\n />\n </Modal>\n )}\n </div>\n );\n}\n\nexport default Lists;\n","export default \"__VITE_ASSET__Bj_CmqRM__\"","import './login.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport Fuse from 'fuse.js';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { useSearchParams } from 'react-router-dom';\n\nimport logo from '../assets/logo.svg';\n\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport instancesListURL from '../data/instances.json?url';\nimport {\n getAuthorizationURL,\n getPKCEAuthorizationURL,\n registerApplication,\n} from '../utils/auth';\nimport { supportsPKCE } from '../utils/oauth-pkce';\nimport store from '../utils/store';\nimport {\n getCredentialApplication,\n hasAccountInInstance,\n storeCredentialApplication,\n} from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nfunction Login() {\n const { t } = useLingui();\n useTitle(t`Log in`, '/login');\n const instanceURLRef = useRef();\n const cachedInstanceURL = store.local.get('instanceURL');\n const [uiState, setUIState] = useState('default');\n const [searchParams] = useSearchParams();\n const instance = searchParams.get('instance');\n const submit = searchParams.get('submit');\n const [instanceText, setInstanceText] = useState(\n instance || cachedInstanceURL?.toLowerCase() || '',\n );\n\n const [instancesList, setInstancesList] = useState([]);\n const searcher = useRef();\n useEffect(() => {\n (async () => {\n try {\n const res = await fetch(instancesListURL);\n const data = await res.json();\n setInstancesList(data);\n searcher.current = new Fuse(data);\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n })();\n }, []);\n\n // useEffect(() => {\n // if (cachedInstanceURL) {\n // instanceURLRef.current.value = cachedInstanceURL.toLowerCase();\n // }\n // }, []);\n\n const submitInstance = (instanceURL) => {\n if (!instanceURL) return;\n\n (async () => {\n // WEB_DOMAIN vs LOCAL_DOMAIN negotiation time\n // https://docs.joinmastodon.org/admin/config/#web_domain\n try {\n const res = await fetch(`https://${instanceURL}/.well-known/host-meta`); // returns XML\n const text = await res.text();\n // Parse XML\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(text, 'text/xml');\n // Get Link[template]\n const link = xmlDoc.getElementsByTagName('Link')[0];\n const template = link.getAttribute('template');\n const url = URL.parse(template);\n const { host } = url; // host includes the port\n if (instanceURL !== host) {\n console.log(`💫 ${instanceURL} -> ${host}`);\n instanceURL = host;\n }\n } catch (e) {\n // Silently fail\n console.error(e);\n }\n\n store.local.set('instanceURL', instanceURL);\n\n setUIState('loading');\n try {\n let credentialApplication = getCredentialApplication(instanceURL);\n if (\n !credentialApplication ||\n !credentialApplication.client_id ||\n !credentialApplication.client_secret\n ) {\n credentialApplication = await registerApplication({\n instanceURL,\n });\n storeCredentialApplication(instanceURL, credentialApplication);\n }\n\n const { client_id, client_secret } = credentialApplication;\n\n const authPKCE = await supportsPKCE({ instanceURL });\n console.log({ authPKCE });\n const forceLogin = hasAccountInInstance(instanceURL);\n if (authPKCE) {\n if (client_id && client_secret) {\n const [url, verifier] = await getPKCEAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin,\n });\n store.sessionCookie.set('codeVerifier', verifier);\n location.href = url;\n } else {\n alert(t`Failed to register application`);\n }\n } else {\n if (client_id && client_secret) {\n location.href = await getAuthorizationURL({\n instanceURL,\n client_id,\n forceLogin,\n });\n } else {\n alert(t`Failed to register application`);\n }\n }\n setUIState('default');\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n };\n\n const cleanInstanceText = instanceText\n ? instanceText\n .replace(/^https?:\\/\\//, '') // Remove protocol from instance URL\n .replace(/\\/+$/, '') // Remove trailing slash\n .replace(/^@?[^@]+@/, '') // Remove @?acct@\n .trim()\n : null;\n const instanceTextLooksLikeDomain =\n /[^\\s\\r\\n\\t\\/\\\\]+\\.[^\\s\\r\\n\\t\\/\\\\]+/.test(cleanInstanceText) &&\n !/[\\s\\/\\\\@]/.test(cleanInstanceText);\n\n const instancesSuggestions = cleanInstanceText\n ? searcher.current\n ?.search(cleanInstanceText, {\n limit: 10,\n })\n ?.map((match) => match.item)\n : [];\n\n const selectedInstanceText = instanceTextLooksLikeDomain\n ? cleanInstanceText\n : instancesSuggestions?.length\n ? instancesSuggestions[0]\n : instanceText\n ? instancesList.find((instance) => instance.includes(instanceText))\n : null;\n\n const onSubmit = (e) => {\n e.preventDefault();\n // const { elements } = e.target;\n // let instanceURL = elements.instanceURL.value.toLowerCase();\n // // Remove protocol from instance URL\n // instanceURL = instanceURL.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n // // Remove @acct@ or acct@ from instance URL\n // instanceURL = instanceURL.replace(/^@?[^@]+@/, '');\n // if (!/\\./.test(instanceURL)) {\n // instanceURL = instancesList.find((instance) =>\n // instance.includes(instanceURL),\n // );\n // }\n // submitInstance(instanceURL);\n submitInstance(selectedInstanceText);\n };\n\n if (submit) {\n useEffect(() => {\n submitInstance(instance || selectedInstanceText);\n }, []);\n }\n\n return (\n <main id=\"login\" style={{ textAlign: 'center' }}>\n <form onSubmit={onSubmit}>\n <h1>\n <img src={logo} alt=\"\" width=\"80\" height=\"80\" />\n <br />\n <Trans>Log in</Trans>\n </h1>\n <label>\n <p>\n <Trans>Instance</Trans>\n </p>\n <input\n value={instanceText}\n required\n type=\"text\"\n class=\"large\"\n id=\"instanceURL\"\n ref={instanceURLRef}\n disabled={uiState === 'loading'}\n // list=\"instances-list\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n spellCheck={false}\n placeholder={t`instance domain`}\n onInput={(e) => {\n setInstanceText(e.target.value);\n }}\n dir=\"auto\"\n />\n {instancesSuggestions?.length > 0 ? (\n <ul id=\"instances-suggestions\">\n {instancesSuggestions.map((instance, i) => (\n <li>\n <button\n type=\"button\"\n class=\"plain5\"\n onClick={() => {\n submitInstance(instance);\n }}\n >\n {instance}\n </button>\n </li>\n ))}\n </ul>\n ) : (\n <div id=\"instances-eg\">\n <Trans>e.g. “mastodon.social”</Trans>\n </div>\n )}\n {/* <datalist id=\"instances-list\">\n {instancesList.map((instance) => (\n <option value={instance} />\n ))}\n </datalist> */}\n </label>\n {uiState === 'error' && (\n <p class=\"error\">\n <Trans>\n Failed to log in. Please try again or try another instance.\n </Trans>\n </p>\n )}\n <div>\n <button\n disabled={\n uiState === 'loading' || !instanceText || !selectedInstanceText\n }\n >\n {selectedInstanceText\n ? t`Continue with ${selectedInstanceText}`\n : t`Continue`}\n </button>{' '}\n </div>\n <Loader hidden={uiState !== 'loading'} />\n <hr />\n {!DEFAULT_INSTANCE && (\n <p>\n <a href=\"https://joinmastodon.org/servers\" target=\"_blank\">\n <Trans>Don't have an account? Create one!</Trans>\n </a>\n </p>\n )}\n <p>\n <Link to=\"/\">\n <Trans>Go home</Trans>\n </Link>\n </p>\n <LangSelector />\n </form>\n </main>\n );\n}\n\nexport default Login;\n","import './scheduled-posts.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\nimport { MenuItem } from '@szhsin/react-menu';\nimport { useEffect, useMemo, useReducer, useState } from 'preact/hooks';\nimport { useSnapshot } from 'valtio';\n\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport MenuConfirm from '../components/menu-confirm';\nimport Menu2 from '../components/menu2';\nimport Modal from '../components/modal';\nimport NavMenu from '../components/nav-menu';\nimport RelativeTime from '../components/relative-time';\nimport ScheduledAtField, {\n getLocalTimezoneName,\n} from '../components/ScheduledAtField';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport niceDateTime from '../utils/nice-date-time';\nimport showToast from '../utils/show-toast';\nimport states, { saveStatus, statusKey } from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst LIMIT = 40;\n\nexport default function ScheduledPosts() {\n const { t } = useLingui();\n const snapStates = useSnapshot(states);\n useTitle(t`Scheduled Posts`, '/sp');\n const { masto } = api();\n const [scheduledPosts, setScheduledPosts] = useState([]);\n const [uiState, setUIState] = useState('default');\n const [reloadCount, reload] = useReducer((c) => c + 1, 0);\n const [showScheduledPostModal, setShowScheduledPostModal] = useState(false);\n\n useEffect(reload, [snapStates.reloadScheduledPosts]);\n\n useEffect(() => {\n setUIState('loading');\n (async () => {\n try {\n const postsIterator = masto.v1.scheduledStatuses\n .list({ limit: LIMIT })\n .values();\n const allPosts = [];\n let posts;\n do {\n const result = await postsIterator.next();\n posts = result.value;\n if (posts?.length) {\n allPosts.push(...posts);\n }\n } while (posts?.length);\n setScheduledPosts(allPosts);\n } catch (e) {\n console.error(e);\n setUIState('error');\n } finally {\n setUIState('default');\n }\n })();\n }, [reloadCount]);\n\n return (\n <div id=\"scheduled-posts-page\" class=\"deck-container\" tabIndex=\"-1\">\n <div class=\"timeline-deck deck\">\n <header>\n <div class=\"header-grid\">\n <div class=\"header-side\">\n <NavMenu />\n <Link to=\"/\" class=\"button plain\">\n <Icon icon=\"home\" size=\"l\" alt={t`Home`} />\n </Link>\n </div>\n <h1>\n <Trans>Scheduled Posts</Trans>\n </h1>\n <div class=\"header-side\">\n <Menu2\n portal\n setDownOverflow\n overflow=\"auto\"\n viewScroll=\"close\"\n position=\"anchor\"\n menuButton={\n <button type=\"button\" class=\"plain\">\n <Icon icon=\"more\" size=\"l\" alt={t`More`} />\n </button>\n }\n >\n <MenuItem\n onClick={() => {\n reload();\n }}\n >\n <Icon icon=\"refresh\" size=\"l\" />\n <span>\n <Trans>Refresh</Trans>\n </span>\n </MenuItem>\n </Menu2>\n </div>\n </div>\n </header>\n <main>\n {!scheduledPosts.length ? (\n <p class=\"ui-state\">\n {uiState === 'loading' ? <Loader /> : t`No scheduled posts.`}\n </p>\n ) : (\n <ul class=\"posts-list\">\n {scheduledPosts.map((post) => {\n const { id, params, scheduledAt, mediaAttachments } = post;\n const {\n inReplyToId,\n language,\n poll,\n sensitive,\n spoilerText,\n text,\n visibility,\n quotedStatusId,\n quoteApprovalPolicy,\n } = params;\n const status = {\n // account: account.info,\n id,\n inReplyToId,\n language,\n mediaAttachments,\n poll: poll\n ? {\n ...poll,\n expiresAt: new Date(Date.now() + poll.expiresIn * 1000),\n options: poll.options.map((option) => ({\n title: option,\n votesCount: 0,\n })),\n }\n : undefined,\n sensitive,\n spoilerText,\n text,\n visibility,\n content: `<p>${text}</p>`,\n // createdAt: scheduledAt,\n quotedStatusId,\n quoteApprovalPolicy,\n };\n\n return (\n <li key={id}>\n <ScheduledPostPreview\n status={status}\n scheduledAt={scheduledAt}\n onClick={() => {\n setShowScheduledPostModal({\n post: status,\n scheduledAt: new Date(scheduledAt),\n });\n }}\n />\n </li>\n );\n })}\n </ul>\n )}\n {showScheduledPostModal && (\n <Modal\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setShowScheduledPostModal(false);\n }\n }}\n >\n <ScheduledPostEdit\n post={showScheduledPostModal.post}\n scheduledAt={showScheduledPostModal.scheduledAt}\n onClose={() => setShowScheduledPostModal(false)}\n />\n </Modal>\n )}\n </main>\n </div>\n </div>\n );\n}\n\nfunction ScheduledPostPreview({ status, scheduledAt, onClick }) {\n // Look at scheduledAt, if it's months away, ICON = 'month'. If it's days away, ICON = 'day', else ICON = 'time'\n const icon = useMemo(() => {\n const hours = (Date.parse(scheduledAt) - Date.now()) / (1000 * 60 * 60);\n if (hours < 24) {\n return 'time';\n } else if (hours < 720) {\n // 30 days\n return 'day';\n } else {\n return 'month';\n }\n }, [scheduledAt]);\n\n return (\n <button type=\"button\" class=\"textual block\" onClick={onClick}>\n <div class={`post-schedule-meta post-schedule-${icon}`}>\n <Icon icon={icon} class=\"insignificant\" />{' '}\n <span>\n <Trans comment=\"Scheduled [in 1 day] ([Thu, Feb 27, 6:30:00 PM])\">\n Scheduled{' '}\n <b>\n <RelativeTime datetime={scheduledAt} />\n </b>{' '}\n <small>\n (\n {niceDateTime(scheduledAt, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n )\n </small>\n </Trans>\n </span>\n </div>\n <Status status={status} size=\"s\" previewMode readOnly />\n </button>\n );\n}\n\nfunction ScheduledPostEdit({ post, scheduledAt, onClose }) {\n const { masto, instance } = api();\n const { t } = useLingui();\n const [uiState, setUIState] = useState('default');\n const [newScheduledAt, setNewScheduledAt] = useState();\n const differentScheduledAt =\n newScheduledAt && newScheduledAt.getTime() !== scheduledAt.getTime();\n const localTZ = getLocalTimezoneName();\n const pastSchedule = scheduledAt && scheduledAt <= Date.now();\n\n const { inReplyToId } = post;\n const [replyToStatus, setReplyToStatus] = useState(null);\n // TODO: Uncomment this once https://github.com/mastodon/mastodon/issues/34000 is fixed\n // useEffect(() => {\n // if (inReplyToId) {\n // (async () => {\n // try {\n // const status = await masto.v1.statuses.$select(inReplyToId).fetch();\n // setReplyToStatus(status);\n // } catch (e) {\n // console.error(e);\n // }\n // })();\n // }\n // }, [inReplyToId]);\n\n const { quotedStatusId } = post;\n // TODO: Uncomment this once https://github.com/mastodon/mastodon/issues/36536 is fixed\n // useEffect(() => {\n // if (post.id && quotedStatusId) {\n // (async () => {\n // try {\n // const quotedStatus = await masto.v1.statuses\n // .$select(quotedStatusId)\n // .fetch();\n // saveStatus(quotedStatus, instance);\n // const sKey = statusKey(post.id, instance);\n // states.statusQuotes[sKey] = [\n // {\n // id: quotedStatus.id,\n // instance,\n // url: `/${instance}/s/${quotedStatus.id}`,\n // native: true,\n // },\n // ];\n // } catch (e) {\n // console.error('Failed to fetch quoted status:', e);\n // }\n // })();\n // }\n // }, [post.id, quotedStatusId]);\n\n return (\n <div id=\"scheduled-post-sheet\" class=\"sheet\">\n <button type=\"button\" class=\"sheet-close\" onClick={onClose}>\n <Icon icon=\"x\" size=\"l\" alt={t`Close`} />\n </button>\n <header>\n <h2>\n <Trans comment=\"Scheduled [in 1 day]\">\n Scheduled{' '}\n <b>\n <RelativeTime datetime={scheduledAt} />\n </b>\n </Trans>\n <br />\n <small>\n {niceDateTime(scheduledAt, {\n formatOpts: {\n weekday: 'short',\n second: 'numeric',\n },\n })}\n </small>\n </h2>\n </header>\n <main tabIndex=\"-1\">\n {!!replyToStatus && (\n <div class=\"status-reply\">\n <Status status={replyToStatus} size=\"s\" previewMode readOnly />\n </div>\n )}\n <Status\n status={post}\n size=\"s\"\n previewMode\n readOnly\n onMediaClick={(e, i, media, status) => {\n e.preventDefault();\n states.showMediaModal = {\n mediaAttachments: post.mediaAttachments,\n mediaIndex: i,\n };\n }}\n />\n <form\n onSubmit={(e) => {\n e.preventDefault();\n setUIState('loading');\n (async () => {\n try {\n await masto.v1.scheduledStatuses.$select(post.id).update({\n scheduledAt: newScheduledAt.toISOString(),\n });\n showToast(t`Scheduled post rescheduled`);\n onClose();\n setUIState('default');\n states.reloadScheduledPosts++;\n } catch (e) {\n setUIState('error');\n console.error(e);\n showToast(t`Failed to reschedule post`);\n }\n })();\n }}\n >\n <footer>\n <div class=\"row\">\n <span>\n <ScheduledAtField\n scheduledAt={scheduledAt}\n setScheduledAt={(date) => {\n setNewScheduledAt(date);\n }}\n />{' '}\n <small class=\"ib\">{localTZ}</small>\n </span>\n </div>\n <div class=\"row\">\n <button\n disabled={\n !differentScheduledAt || uiState === 'loading' || pastSchedule\n }\n >\n <Trans>Reschedule</Trans>\n </button>\n <span class=\"grow\" />\n <MenuConfirm\n align=\"end\"\n menuItemClassName=\"danger\"\n confirmLabel={t`Delete scheduled post?`}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n await api()\n .masto.v1.scheduledStatuses.$select(post.id)\n .remove();\n showToast(t`Scheduled post deleted`);\n onClose();\n setUIState('default');\n states.reloadScheduledPosts++;\n } catch (e) {\n setUIState('error');\n console.error(e);\n showToast(t`Failed to delete scheduled post`);\n }\n })();\n }}\n >\n <button\n type=\"button\"\n class=\"light danger\"\n disabled={uiState === 'loading' || pastSchedule}\n >\n <Trans>Delete…</Trans>\n </button>\n </MenuConfirm>\n </div>\n </footer>\n </form>\n </main>\n </div>\n );\n}\n","import { useLingui } from '@lingui/react/macro';\n\nimport { useEditHistory } from '../utils/edit-history-context';\n\nimport Icon from './icon';\n\nexport default function EditHistoryControls() {\n const { t } = useLingui();\n const {\n prevEditedAt,\n nextEditedAt,\n editedAtIndex,\n editHistoryMode,\n editHistoryRef,\n exitEditHistory,\n } = useEditHistory();\n if (!editHistoryMode) return null;\n return (\n <div class=\"edit-history-controls\">\n <Icon icon=\"edit\" />\n <b class=\"edit-history-heading\">{t`Edit History Snapshots`}</b>\n <span class=\"spacer\" />\n <span class=\"edit-history-pagination\">\n <button\n type=\"button\"\n class=\"plain4\"\n onClick={() => {\n prevEditedAt();\n }}\n disabled={\n !editHistoryMode ||\n editedAtIndex + 1 >= editHistoryRef.current.length\n }\n >\n <Icon icon=\"chevron-left\" alt={t`Previous`} />\n </button>{' '}\n {editHistoryRef.current.length - editedAtIndex} /{' '}\n {editHistoryRef.current.length}{' '}\n <button\n type=\"button\"\n class=\"plain4\"\n onClick={() => {\n nextEditedAt();\n }}\n disabled={!editHistoryMode || editedAtIndex <= 0}\n >\n <Icon icon=\"chevron-right\" alt={t`Next`} />\n </button>\n </span>\n <button\n type=\"button\"\n class=\"plain3\"\n onClick={() => {\n exitEditHistory();\n }}\n >\n <Icon icon=\"exit\" alt={t`Exit`} />\n </button>\n </div>\n );\n}\n","import './status.css';\n\nimport { plural } from '@lingui/core/macro';\nimport { Plural, Trans, useLingui } from '@lingui/react/macro';\nimport { MenuDivider, MenuHeader, MenuItem } from '@szhsin/react-menu';\nimport debounce from 'just-debounce-it';\nimport pRetry from 'p-retry';\nimport { memo } from 'preact/compat';\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport punycode from 'punycode/';\nimport { useHotkeys } from 'react-hotkeys-hook';\nimport { InView } from 'react-intersection-observer';\nimport { matchPath, useSearchParams } from 'react-router-dom';\nimport { useSnapshot } from 'valtio';\n\nimport Avatar from '../components/avatar';\nimport EditHistoryControls from '../components/edit-history-controls';\nimport Icon from '../components/icon';\nimport Link from '../components/link';\nimport Loader from '../components/loader';\nimport { getSafeViewTransitionName } from '../components/media';\nimport MediaModal from '../components/media-modal';\nimport Menu2 from '../components/menu2';\nimport NameText from '../components/name-text';\nimport RelativeTime from '../components/relative-time';\nimport Status from '../components/status';\nimport { api } from '../utils/api';\nimport {\n EditHistoryProvider,\n useEditHistory,\n} from '../utils/edit-history-context';\nimport htmlContentLength from '../utils/html-content-length';\nimport shortenNumber from '../utils/shorten-number';\nimport states, {\n getStatus,\n saveStatus,\n statusKey,\n threadifyStatus,\n} from '../utils/states';\nimport statusPeek from '../utils/status-peek';\nimport { getCurrentAccount } from '../utils/store-utils';\nimport useTitle from '../utils/useTitle';\n\nimport getInstanceStatusURL from './../utils/get-instance-status-url';\n\nconst { PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE } = import.meta.env;\n\nconst LIMIT = 40;\nconst SUBCOMMENTS_OPEN_ALL_LIMIT = 10;\nconst MAX_WEIGHT = 5;\n\nlet cachedRepliesToggle = {};\nlet cachedStatusesMap = {};\nlet scrollPositions = {};\nfunction resetScrollPosition(id) {\n delete cachedStatusesMap[id];\n delete scrollPositions[id];\n}\n\nconst scrollIntoViewOptions = {\n block: 'nearest',\n inline: 'center',\n behavior: 'smooth',\n};\n\n// Select all statuses except those inside collapsed details/summary\n// Hat-tip to @AmeliaBR@front-end.social\n// https://front-end.social/@AmeliaBR/109784776146144471\nconst STATUSES_SELECTOR =\n '.status-link:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *), .status-focus:not(details:not([open]) > summary ~ *, details:not([open]) > summary ~ * *)';\n\nconst STATUS_URL_REGEX = /\\/s\\//i;\n\nimport { ThreadCountContext } from '../utils/thread-count-context';\n\nfunction StatusPage(params) {\n const { id } = params;\n const { masto, instance } = api({ instance: params.instance });\n const snapStates = useSnapshot(states);\n const [searchParams, setSearchParams] = useSearchParams();\n const mediaParam = searchParams.get('media');\n const mediaOnlyParam = searchParams.get('media-only');\n const mediaIndex = parseInt(mediaParam || mediaOnlyParam, 10);\n let showMedia = mediaIndex > 0;\n const mediaStatusID = searchParams.get('mediaStatusID');\n const mediaStatus = getStatus(mediaStatusID, instance);\n if (mediaStatusID && !mediaStatus) {\n showMedia = false;\n }\n const showMediaOnly = showMedia && !!mediaOnlyParam;\n\n const sKey = statusKey(id, instance);\n const [heroStatus, setHeroStatus] = useState(states.statuses[sKey]);\n useEffect(() => {\n if (states.statuses[sKey]) {\n setHeroStatus(states.statuses[sKey]);\n }\n }, [sKey]);\n\n const closeLink = useMemo(() => {\n const { prevLocation } = states;\n const pathname =\n (prevLocation?.pathname || '') + (prevLocation?.search || '');\n const matchStatusPath =\n matchPath('/:instance/s/:id', pathname) || matchPath('/s/:id', pathname);\n if (!pathname || matchStatusPath) {\n return '/';\n }\n return pathname;\n }, []);\n\n useEffect(() => {\n if (!heroStatus && showMedia) {\n (async () => {\n try {\n const status = await masto.v1.statuses.$select(id).fetch();\n saveStatus(status, instance);\n setHeroStatus(status);\n } catch (err) {\n console.error(err);\n alert('Unable to load post.');\n location.hash = closeLink;\n }\n })();\n }\n }, [showMedia]);\n\n const mediaAttachments = mediaStatusID\n ? snapStates.statuses[statusKey(mediaStatusID, instance)]?.mediaAttachments\n : heroStatus?.mediaAttachments;\n\n const postViewState = () =>\n window.matchMedia('(min-width: calc(40em + 350px))').matches\n ? 'large'\n : 'small';\n const mediaClose = useCallback(() => {\n console.log('xxx', {\n postViewState: postViewState(),\n showMediaOnly,\n });\n if (postViewState() === 'small' && snapStates.prevLocation) {\n history.back();\n } else {\n if (showMediaOnly) {\n location.hash = closeLink;\n } else {\n searchParams.delete('media');\n searchParams.delete('mediaStatusID');\n setSearchParams(searchParams);\n }\n }\n }, [showMediaOnly, closeLink, snapStates.prevLocation]);\n const handleMediaClose = useCallback(\n (e, currentIndex, mediaAttachments, carouselRef) => {\n if (postViewState() === 'large' && !showMediaOnly) {\n mediaClose();\n return;\n }\n if (showMedia && document.startViewTransition) {\n const media = mediaAttachments[currentIndex];\n const { id, blurhash, url } = media;\n const mediaVTN = getSafeViewTransitionName(id || blurhash || url);\n const els = document.querySelectorAll(\n `.status .media [data-view-transition-name=\"${mediaVTN}\"]`,\n );\n const foundEls = [...els]?.filter?.((el) => {\n const elBounds = el.getBoundingClientRect();\n return (\n elBounds.top < window.innerHeight &&\n elBounds.bottom > 0 &&\n elBounds.left < window.innerWidth &&\n elBounds.right > 0\n );\n });\n // If more than one, get the one in status page\n const el =\n foundEls.length === 1\n ? foundEls[0]\n : foundEls.find((el) => !!el.closest('.status-deck'));\n\n console.log('xxx', { media, id, els, el });\n if (el) {\n const transition = document.startViewTransition(() => {\n el.style.viewTransitionName = mediaVTN;\n if (carouselRef?.current) {\n carouselRef.current\n .querySelectorAll('.media img, .media video')\n ?.forEach((el) => {\n el.style.viewTransitionName = '';\n });\n }\n mediaClose();\n });\n transition.ready.finally(() => {\n el.style.viewTransitionName = '';\n el.dataset.viewTransitioned = mediaVTN;\n });\n } else {\n mediaClose();\n }\n } else {\n mediaClose();\n }\n },\n [showMedia, showMediaOnly],\n );\n\n useEffect(() => {\n let timer = setTimeout(() => {\n // carouselRef.current?.focus?.();\n const $carousel = document.querySelector('.carousel');\n if ($carousel) {\n $carousel.focus();\n }\n }, 100);\n return () => clearTimeout(timer);\n }, [showMediaOnly]);\n\n useEffect(() => {\n const $deckContainers = document.querySelectorAll('.deck-container');\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.setAttribute('inert', '');\n });\n return () => {\n $deckContainers.forEach(($deckContainer) => {\n $deckContainer.removeAttribute('inert');\n });\n };\n }, []);\n\n return (\n <div class=\"deck-backdrop\">\n {showMedia ? (\n mediaAttachments?.length ? (\n <MediaModal\n mediaAttachments={mediaAttachments}\n statusID={mediaStatusID || id}\n instance={instance}\n lang={heroStatus?.language}\n index={mediaIndex - 1}\n onClose={handleMediaClose}\n />\n ) : (\n <div class=\"media-modal-container loading\">\n <Loader abrupt />\n </div>\n )\n ) : (\n <Link to={closeLink} />\n )}\n {!showMediaOnly && (\n <EditHistoryProvider statusID={id}>\n <StatusThread\n id={id}\n instance={params.instance}\n closeLink={closeLink}\n />\n </EditHistoryProvider>\n )}\n </div>\n );\n}\n\nfunction StatusParent(props) {\n const { linkable, to, onClick, ...restProps } = props;\n return linkable ? (\n <Link class=\"status-link\" to={to} onClick={onClick} {...restProps} />\n ) : (\n <div class=\"status-focus\" tabIndex={0} {...restProps} />\n );\n}\n\n// oldest first\nfunction createdAtSort(a, b) {\n return Date.parse(a.createdAt) - Date.parse(b.createdAt);\n}\n\nconst MONTH_IN_MS = 1000 * 60 * 60 * 24 * 30;\n\nfunction StatusThread({ id, closeLink = '/', instance: propInstance }) {\n const { t } = useLingui();\n const [searchParams, setSearchParams] = useSearchParams();\n const mediaParam = searchParams.get('media');\n const mediaStatusID = searchParams.get('mediaStatusID');\n const showMedia = parseInt(mediaParam, 10) > 0;\n const firstLoad = useRef(\n !states.prevLocation &&\n (history.length === 1 ||\n ('navigation' in window && navigation?.entries?.()?.length === 1)),\n );\n const [viewMode, setViewMode] = useState(\n searchParams.get('view') || firstLoad.current ? 'full' : null,\n );\n const translate = !!parseInt(searchParams.get('translate'));\n const { masto, instance } = api({ instance: propInstance });\n const {\n masto: currentMasto,\n instance: currentInstance,\n authenticated,\n } = api();\n const sameInstance = instance === currentInstance;\n const snapStates = useSnapshot(states);\n const [statuses, setStatuses] = useState([]);\n const [uiState, setUIState] = useState('default');\n const heroStatusRef = useRef();\n const sKey = statusKey(id, instance);\n const totalDescendants = useRef(0);\n\n const scrollableRef = useRef();\n useEffect(() => {\n scrollableRef.current?.focus();\n }, []);\n useEffect(() => {\n const onScroll = debounce(() => {\n // console.log('onScroll');\n if (!scrollableRef.current) return;\n const { scrollTop } = scrollableRef.current;\n if (uiState !== 'loading') {\n scrollPositions[id] = scrollTop;\n }\n }, 50);\n scrollableRef.current?.addEventListener('scroll', onScroll, {\n passive: true,\n });\n onScroll();\n return () => {\n onScroll.cancel();\n scrollableRef.current?.removeEventListener('scroll', onScroll);\n };\n }, [id, uiState !== 'loading']);\n\n const { editHistoryMode, initEditHistory, editedAtIndex, editHistoryRef } =\n useEditHistory();\n\n const scrollOffsets = useRef();\n const lastInitContextTS = useRef();\n const [threadsCount, setThreadsCount] = useState(0);\n const fullContext = useRef(null);\n const restructureContext = () => {\n console.log({ fullContext: fullContext.current });\n if (!fullContext.current) return;\n let { ancestors, descendants, heroStatus } = fullContext.current;\n\n if (editHistoryMode && descendants?.length) {\n // Filter descendants based on createdAt/editedAt dates\n // - editHistory items only has createdAt\n // - descendants items has createdAt and optional editedAt\n const currentEditedAtStatus = editHistoryRef.current[editedAtIndex];\n const currentEditedAtStatusCreatedAt = Date.parse(\n currentEditedAtStatus.createdAt,\n );\n const nextEditedAtStatus = editHistoryRef.current[editedAtIndex - 1];\n const nextEditedAtStatusCreatedAt = nextEditedAtStatus\n ? Date.parse(nextEditedAtStatus.createdAt)\n : null;\n descendants = descendants.filter((s) => {\n // Show descendants created between current and next editedAt dates\n const sCreatedAt = Date.parse(s.editedAt || s.createdAt);\n return (\n sCreatedAt >= currentEditedAtStatusCreatedAt &&\n (!nextEditedAtStatusCreatedAt ||\n sCreatedAt <= nextEditedAtStatusCreatedAt)\n );\n });\n }\n\n ancestors.sort(createdAtSort);\n descendants.sort(createdAtSort);\n\n totalDescendants.current = descendants?.length || 0;\n\n const missingStatuses = new Set();\n ancestors.forEach((status) => {\n saveStatus(status, instance, {\n skipThreading: true,\n });\n if (\n status.inReplyToId &&\n !ancestors.find((s) => s.id === status.inReplyToId)\n ) {\n missingStatuses.add(status.inReplyToId);\n }\n });\n const ancestorsIsThread = ancestors.every(\n (s) => s.account.id === heroStatus.account.id,\n );\n const nestedDescendants = [];\n descendants.forEach((status) => {\n saveStatus(status, instance, {\n // skipThreading: true,\n });\n\n if (\n status.inReplyToId &&\n !descendants.find((s) => s.id === status.inReplyToId) &&\n status.inReplyToId !== heroStatus.id\n ) {\n missingStatuses.add(status.inReplyToId);\n }\n\n if (status.inReplyToAccountId === status.account.id) {\n // If replying to self, it's part of the thread, level 1\n nestedDescendants.push(status);\n } else if (status.inReplyToId === heroStatus.id) {\n // If replying to the hero status, it's a reply, level 1\n nestedDescendants.push(status);\n } else if (\n !status.inReplyToAccountId &&\n nestedDescendants.find(\n (s) =>\n s.id === status.inReplyToId &&\n s.account.id === heroStatus.account.id,\n ) &&\n status.account.id === heroStatus.account.id\n ) {\n // If replying to hero's own statuses, it's part of the thread, level 1\n nestedDescendants.push(status);\n } else {\n // If replying to someone else, it's a reply to a reply, level 2\n const parent = descendants.find((s) => s.id === status.inReplyToId);\n if (parent) {\n if (!parent.__replies) {\n parent.__replies = [];\n }\n parent.__replies.push(status);\n } else {\n // If no parent, something is wrong\n console.warn('No parent found for', status);\n }\n }\n });\n\n // sort hero author to top\n nestedDescendants.sort((a, b) => {\n const heroAccountID = heroStatus.account.id;\n if (a.account.id === heroAccountID && b.account.id !== heroAccountID)\n return -1;\n if (b.account.id === heroAccountID && a.account.id !== heroAccountID)\n return 1;\n return 0;\n });\n\n console.log({ ancestors, descendants, nestedDescendants });\n if (missingStatuses.size) {\n console.error('Missing statuses', [...missingStatuses]);\n }\n\n let descendantLevelsCount = 1;\n function expandReplies(_replies, level) {\n const nextLevel = level + 1;\n if (nextLevel > descendantLevelsCount) {\n descendantLevelsCount = level;\n }\n return _replies?.map((_r) => ({\n id: _r.id,\n account: _r.account,\n repliesCount: _r.repliesCount,\n content: _r.content,\n weight: calcStatusWeight(_r),\n level: nextLevel,\n replies: expandReplies(_r.__replies, nextLevel),\n }));\n }\n\n const mappedNestedDescendants = nestedDescendants.map((s) => ({\n id: s.id,\n account: s.account,\n accountID: s.account.id,\n descendant: true,\n thread: s.account.id === heroStatus.account.id,\n weight: calcStatusWeight(s),\n level: 1,\n replies: expandReplies(s.__replies, 1),\n createdAt: s.createdAt,\n }));\n const allStatuses = [\n ...ancestors.map((s) => ({\n id: s.id,\n ancestor: true,\n isThread: ancestorsIsThread,\n accountID: s.account.id,\n account: s.account,\n repliesCount: s.repliesCount,\n weight: calcStatusWeight(s),\n createdAt: s.createdAt,\n })),\n {\n id,\n accountID: heroStatus.account.id,\n weight: calcStatusWeight(heroStatus),\n createdAt: heroStatus.createdAt,\n },\n ...mappedNestedDescendants,\n ];\n\n console.log({ allStatuses, descendantLevelsCount });\n return { allStatuses, ancestorsIsThread, mappedNestedDescendants };\n };\n\n const initContext = ({ reloadHero } = {}) => {\n console.debug('initContext', id);\n setUIState('loading');\n let heroTimer;\n\n const cachedStatuses = cachedStatusesMap[id];\n if (cachedStatuses) {\n // Case 1: It's cached, let's restore them to make it snappy\n const reallyCachedStatuses = cachedStatuses.filter(\n (s) => states.statuses[sKey],\n // Some are not cached in the global state, so we need to filter them out\n );\n setStatuses(reallyCachedStatuses);\n } else {\n // const heroIndex = statuses.findIndex((s) => s.id === id);\n // if (heroIndex !== -1) {\n // // Case 2: It's in current statuses. Slice off all descendant statuses after the hero status to be safe\n // const slicedStatuses = statuses.slice(0, heroIndex + 1);\n // setStatuses(slicedStatuses);\n // } else {\n // Case 3: Not cached and not in statuses, let's start from scratch\n setStatuses([{ id }]);\n // }\n }\n\n (async () => {\n const heroFetch = () =>\n pRetry(() => masto.v1.statuses.$select(id).fetch(), {\n retries: 4,\n });\n const contextFetch = pRetry(\n () => masto.v1.statuses.$select(id).context.fetch(),\n {\n retries: 8,\n },\n );\n\n const hasStatus = !!snapStates.statuses[sKey];\n let heroStatus = snapStates.statuses[sKey];\n if (hasStatus && !reloadHero) {\n console.debug('Hero status is cached');\n } else {\n try {\n heroStatus = await heroFetch();\n saveStatus(heroStatus, instance);\n // Give time for context to appear\n await new Promise((resolve) => {\n setTimeout(resolve, 100);\n });\n } catch (e) {\n console.error(e);\n setUIState('error');\n return;\n }\n }\n\n try {\n const context = await contextFetch;\n const { ancestors } = context;\n fullContext.current = { ...context, heroStatus };\n const { allStatuses, ancestorsIsThread, mappedNestedDescendants } =\n restructureContext();\n\n const descendantsThread =\n ancestors.length && !ancestorsIsThread\n ? []\n : mappedNestedDescendants.filter((s) => s.thread);\n const threadsCount =\n (ancestorsIsThread ? ancestors.length : 0) + descendantsThread.length;\n if (threadsCount > 0 && threadsCount < 100) {\n // Cap at 100 because there's no point showing 100+\n // Include hero as part of thread count\n setThreadsCount(threadsCount + 1);\n }\n\n setUIState('default');\n scrollOffsets.current = {\n offsetTop: heroStatusRef.current?.offsetTop,\n scrollTop: scrollableRef.current?.scrollTop,\n };\n\n // Set limit to hero's index\n // const heroLimit = allStatuses.findIndex((s) => s.id === id);\n const heroLimit = ancestors.length || 0; // 0-indexed\n if (heroLimit >= limit) {\n setLimit(heroLimit + 1);\n }\n\n setStatuses(allStatuses);\n cachedStatusesMap[id] = allStatuses;\n\n // Let's threadify this one\n // Note that all non-hero statuses will trigger saveStatus which will threadify them too\n // By right, at this point, all descendant statuses should be cached\n threadifyStatus(heroStatus, instance);\n } catch (e) {\n console.error(e);\n setUIState('error');\n }\n })();\n\n lastInitContextTS.current = Date.now();\n\n return () => {\n clearTimeout(heroTimer);\n };\n };\n\n useEffect(initContext, [id, masto]);\n\n useEffect(() => {\n try {\n const { allStatuses } = restructureContext();\n setStatuses(allStatuses);\n } catch (e) {}\n // Only run this when editHistoryMode changes\n // If id changes, initContext will run instead, so don't worry\n }, [editHistoryMode, editedAtIndex]);\n\n const [showRefresh, setShowRefresh] = useState(false);\n useEffect(() => {\n let interval = setInterval(() => {\n const now = Date.now();\n if (\n lastInitContextTS.current &&\n now - lastInitContextTS.current >= 60_000\n ) {\n setShowRefresh(true);\n }\n }, 60_000); // 1 minute\n return () => {\n clearInterval(interval);\n };\n }, []);\n\n useLayoutEffect(() => {\n if (!statuses.length) return;\n console.debug('STATUSES', statuses);\n const scrollPosition = scrollPositions[id];\n console.debug('scrollPosition', scrollPosition);\n if (!!scrollPosition) {\n console.debug('Case 1', {\n id,\n scrollPosition,\n });\n scrollableRef.current.scrollTop = scrollPosition;\n } else if (scrollOffsets.current) {\n const newScrollOffsets = {\n offsetTop: heroStatusRef.current?.offsetTop,\n scrollTop: scrollableRef.current?.scrollTop,\n };\n const newScrollTop =\n newScrollOffsets.offsetTop -\n scrollOffsets.current.offsetTop +\n newScrollOffsets.scrollTop;\n console.debug('Case 2', {\n scrollOffsets: scrollOffsets.current,\n newScrollOffsets,\n newScrollTop,\n statuses: [...statuses],\n });\n scrollableRef.current.scrollTop = newScrollTop;\n } else if (statuses.length === 1) {\n console.debug('Case 3', {\n id,\n });\n scrollableRef.current.scrollTop = 0;\n }\n\n // RESET\n scrollOffsets.current = null;\n }, [statuses]);\n\n useEffect(() => {\n if (snapStates.reloadStatusPage <= 0) return;\n // Delete the cache for the context\n (async () => {\n try {\n const { instanceURL } = getCurrentAccount();\n const contextURL = `https://${instanceURL}/api/v1/statuses/${id}/context`;\n console.log('Clear cache', contextURL);\n const apiCache = await caches.open('api');\n await apiCache.delete(contextURL, { ignoreVary: true });\n\n return initContext({\n reloadHero: true,\n });\n } catch (e) {\n console.error(e);\n }\n })();\n }, [snapStates.reloadStatusPage]);\n\n useEffect(() => {\n return () => {\n // RESET\n scrollPositions = {};\n states.reloadStatusPage = 0;\n cachedStatusesMap = {};\n cachedRepliesToggle = {};\n statusWeightCache.clear();\n };\n }, []);\n\n const heroStatus = snapStates.statuses[sKey] || snapStates.statuses[id];\n const heroDisplayName = useMemo(() => {\n // Remove shortcodes from display name\n if (!heroStatus) return '';\n const { account } = heroStatus;\n const div = document.createElement('div');\n div.innerHTML = account.displayName;\n return div.innerText.trim();\n }, [heroStatus]);\n const heroContentText = useMemo(() => {\n if (!heroStatus) return '';\n let text = statusPeek(heroStatus);\n if (text.length > 64) {\n // \"The title should ideally be less than 64 characters in length\"\n // https://www.w3.org/Provider/Style/TITLE.html\n text = text.slice(0, 64) + '…';\n }\n return text;\n }, [heroStatus]);\n useTitle(\n heroDisplayName && heroContentText\n ? `${heroDisplayName}: \"${heroContentText}\"`\n : t({\n id: 'post.title',\n message: 'Post',\n }),\n '/:instance?/s/:id',\n );\n\n const postInstance = useMemo(() => {\n if (!heroStatus) return;\n const { url } = heroStatus;\n if (!url) return;\n return URL.parse(url)?.hostname;\n }, [heroStatus]);\n const postSameInstance = useMemo(() => {\n if (!postInstance) return;\n return postInstance === instance;\n }, [postInstance, instance]);\n\n const [limit, setLimit] = useState(LIMIT);\n const showMore = useMemo(() => {\n // return number of statuses to show\n return statuses.length - limit;\n }, [statuses.length, limit]);\n\n const hasDescendants = statuses.some((s) => s.descendant);\n const ancestors = statuses.filter((s) => s.ancestor);\n\n const [heroInView, setHeroInView] = useState(true);\n const heroPointer = useMemo(() => {\n // get top offset of heroStatus\n if (!heroStatusRef.current || heroInView) return null;\n const { top } = heroStatusRef.current.getBoundingClientRect();\n return top > 0 ? 'down' : 'up';\n }, [heroInView]);\n\n useHotkeys(\n 'esc',\n () => {\n location.hash = closeLink;\n },\n {\n // If media is open, esc to close media first\n // Else close the status page\n enabled: !showMedia,\n ignoreEventWhen: (e) => {\n const hasModal = !!document.querySelector('#modal-container > *');\n return hasModal || e.metaKey || e.ctrlKey || e.altKey || e.shiftKey;\n },\n useKey: true,\n },\n );\n // For backspace, will always close both media and status page\n useHotkeys(\n 'backspace',\n () => {\n location.hash = closeLink;\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n useHotkeys(\n 'j',\n () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n const activeStatusRect = activeStatus?.getBoundingClientRect();\n const allStatusLinks = Array.from(\n scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n );\n console.log({ allStatusLinks });\n if (\n activeStatus &&\n activeStatusRect.top < scrollableRef.current.clientHeight &&\n activeStatusRect.bottom > 0\n ) {\n const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n let nextStatus = allStatusLinks[activeStatusIndex + 1];\n if (nextStatus) {\n nextStatus.focus();\n nextStatus.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostStatusLink = allStatusLinks.find((statusLink) => {\n const statusLinkRect = statusLink.getBoundingClientRect();\n return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostStatusLink) {\n topmostStatusLink.focus();\n topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n useHotkeys(\n 'k',\n () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n const activeStatusRect = activeStatus?.getBoundingClientRect();\n const allStatusLinks = Array.from(\n scrollableRef.current.querySelectorAll(STATUSES_SELECTOR),\n );\n if (\n activeStatus &&\n activeStatusRect.top < scrollableRef.current.clientHeight &&\n activeStatusRect.bottom > 0\n ) {\n const activeStatusIndex = allStatusLinks.indexOf(activeStatus);\n let prevStatus = allStatusLinks[activeStatusIndex - 1];\n if (prevStatus) {\n prevStatus.focus();\n prevStatus.scrollIntoView(scrollIntoViewOptions);\n }\n } else {\n // If active status is not in viewport, get the topmost status-link in viewport\n const topmostStatusLink = allStatusLinks.find((statusLink) => {\n const statusLinkRect = statusLink.getBoundingClientRect();\n return statusLinkRect.top >= 44 && statusLinkRect.left >= 0; // 44 is the magic number for header height, not real\n });\n if (topmostStatusLink) {\n topmostStatusLink.focus();\n topmostStatusLink.scrollIntoView(scrollIntoViewOptions);\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n // NOTE: I'm not sure if 'x' is the best shortcut for this, might change it later\n // IDEA: x is for expand\n useHotkeys(\n 'x',\n () => {\n const activeStatus = document.activeElement.closest(\n '.status-link, .status-focus',\n );\n if (activeStatus) {\n const details = activeStatus.nextElementSibling;\n if (details && details.tagName.toLowerCase() === 'details') {\n details.open = !details.open;\n }\n }\n },\n {\n useKey: true,\n ignoreEventWhen: (e) => e.metaKey || e.ctrlKey || e.altKey || e.shiftKey,\n },\n );\n\n const [reachTopPost, setReachTopPost] = useState(false);\n // const { nearReachStart } = useScroll({\n // scrollableRef,\n // distanceFromStartPx: 16,\n // });\n\n const initialPageState = useRef(showMedia ? 'media+status' : 'status');\n\n const handleMediaClick = useCallback(\n (e, i, media, status) => {\n e.preventDefault();\n e.stopPropagation();\n setSearchParams({\n media: i + 1,\n mediaStatusID: status.id,\n });\n },\n [id],\n );\n\n const handleStatusLinkClick = useCallback((e, status) => {\n resetScrollPosition(status.id);\n }, []);\n\n useEffect(() => {\n let timer;\n if (mediaStatusID && showMedia) {\n timer = setTimeout(() => {\n const status = scrollableRef.current?.querySelector(\n `.status-link[href*=\"/${mediaStatusID}\"]`,\n );\n if (status) {\n status.scrollIntoView(scrollIntoViewOptions);\n }\n }, 400); // After CSS transition\n }\n return () => {\n clearTimeout(timer);\n };\n }, [mediaStatusID, showMedia]);\n\n const renderStatus = useCallback(\n (status, i) => {\n const {\n id: statusID,\n ancestor,\n isThread,\n descendant,\n thread,\n replies,\n repliesCount,\n weight,\n level,\n } = status;\n const isHero = statusID === id;\n const isLinkable = isThread || ancestor;\n\n return (\n <li\n key={statusID}\n ref={isHero ? heroStatusRef : null}\n class={`${ancestor ? 'ancestor' : ''} ${\n descendant ? 'descendant' : ''\n } ${thread ? 'thread' : ''} ${isHero ? 'hero' : ''}`}\n >\n {isHero ? (\n <>\n <InView\n threshold={0.1}\n onChange={(inView) => {\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n setHeroInView(inView);\n });\n });\n }}\n class=\"status-focus\"\n tabIndex={0}\n >\n <Status\n statusID={statusID}\n instance={instance}\n withinContext\n size=\"l\"\n enableTranslate\n forceTranslate={translate}\n />\n </InView>\n {uiState !== 'loading' && !authenticated ? (\n <div class=\"post-status-banner\">\n <p>\n <Trans>\n You're not logged in. Interactions (reply, boost, etc) are\n not possible.\n </Trans>\n </p>\n <Link\n to={\n DEFAULT_INSTANCE\n ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n : '/login'\n }\n class=\"button\"\n >\n <Trans>Log in</Trans>\n </Link>\n </div>\n ) : (\n !sameInstance && (\n <div class=\"post-status-banner\">\n <p>\n <Trans>\n This post is from another instance (<b>{instance}</b>).\n Interactions (reply, boost, etc) are not possible.\n </Trans>\n </p>\n <button\n type=\"button\"\n disabled={uiState === 'loading'}\n onClick={() => {\n setUIState('loading');\n (async () => {\n try {\n const results = await currentMasto.v2.search.list({\n q: heroStatus.url,\n type: 'statuses',\n resolve: true,\n limit: 1,\n });\n if (results.statuses.length) {\n const status = results.statuses[0];\n location.hash = currentInstance\n ? `/${currentInstance}/s/${status.id}`\n : `/s/${status.id}`;\n } else {\n throw new Error('No results');\n }\n } catch (e) {\n setUIState('default');\n alert(t`Error: ${e}`);\n console.error(e);\n }\n })();\n }}\n >\n <Icon icon=\"transfer\" />{' '}\n <Trans>\n Switch to my instance to enable interactions\n </Trans>\n </button>\n </div>\n )\n )}\n </>\n ) : (\n <StatusParent\n linkable={isLinkable}\n to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n onClick={() => {\n resetScrollPosition(statusID);\n }}\n >\n {/* <Link\n class=\"status-link\"\n to={instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`}\n onClick={() => {\n resetScrollPosition(statusID);\n }}\n > */}\n {i === 0 && ancestor ? (\n <InView\n threshold={0.5}\n onChange={(inView) => {\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n setReachTopPost(inView);\n });\n });\n }}\n >\n <Status\n statusID={statusID}\n instance={instance}\n withinContext\n size={thread || ancestor ? 'm' : 's'}\n enableTranslate\n onMediaClick={handleMediaClick}\n onStatusLinkClick={handleStatusLinkClick}\n />\n </InView>\n ) : (\n <Status\n statusID={statusID}\n instance={instance}\n withinContext\n size={thread || ancestor ? 'm' : 's'}\n enableTranslate\n onMediaClick={handleMediaClick}\n onStatusLinkClick={handleStatusLinkClick}\n showActionsBar={!!descendant}\n />\n )}\n {ancestor && repliesCount > 1 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" alt={t`Replies`} />{' '}\n <span title={repliesCount}>\n {shortenNumber(repliesCount)}\n </span>\n </div>\n )}{' '}\n {/* {replies?.length > LIMIT && (\n <div class=\"replies-link\">\n <Icon icon=\"comment\" />{' '}\n <span title={replies.length}>\n {shortenNumber(replies.length)}\n </span>\n </div>\n )} */}\n </StatusParent>\n // </Link>\n )}\n {descendant && replies?.length > 0 && (\n <SubComments\n instance={instance}\n replies={replies}\n hasParentThread={thread}\n level={level}\n accWeight={weight}\n openAll={totalDescendants.current < SUBCOMMENTS_OPEN_ALL_LIMIT}\n parentLink={{\n to: instance ? `/${instance}/s/${statusID}` : `/s/${statusID}`,\n onClick: () => resetScrollPosition(statusID),\n }}\n />\n )}\n {uiState === 'loading' &&\n isHero &&\n !!heroStatus?.repliesCount &&\n !hasDescendants && (\n <div class=\"status-loading\">\n <Loader abrupt={heroStatus.repliesCount >= 3} />\n </div>\n )}\n {uiState === 'error' &&\n isHero &&\n !!heroStatus?.repliesCount &&\n !hasDescendants && (\n <div class=\"status-error\">\n <Trans>Unable to load replies.</Trans>\n <br />\n <button\n type=\"button\"\n class=\"plain\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Trans>Try again</Trans>\n </button>\n </div>\n )}\n </li>\n );\n },\n [\n id,\n instance,\n uiState,\n authenticated,\n sameInstance,\n translate,\n handleMediaClick,\n handleStatusLinkClick,\n hasDescendants,\n ],\n );\n\n const prevLocationIsStatusPage = useMemo(() => {\n // Navigation API\n if ('navigation' in window && navigation?.entries) {\n const prevEntry = navigation.entries()[navigation.currentEntry.index - 1];\n if (prevEntry?.url) {\n return STATUS_URL_REGEX.test(prevEntry.url);\n }\n }\n return STATUS_URL_REGEX.test(states.prevLocation?.pathname);\n }, [sKey]);\n\n const moreStatusesKeys = useMemo(() => {\n if (!showMore) return [];\n const ids = [];\n function getIDs(status) {\n ids.push(status.id);\n if (status.replies) {\n status.replies.forEach(getIDs);\n }\n }\n statuses.slice(limit).forEach(getIDs);\n return ids.map((id) => statusKey(id, instance));\n }, [showMore, statuses, limit, instance]);\n\n // Helper function to format time differences between two dates\n function formatTimeGap(months) {\n if (months < 12) {\n return plural(months, {\n one: '# month later',\n other: '# months later',\n });\n } else {\n const years = Math.floor(months / 12);\n return plural(years, {\n one: '# year later',\n other: '# years later',\n });\n }\n }\n\n const statusesList = useMemo(() => {\n const result = [];\n const slicedStatuses = statuses.slice(0, limit);\n\n for (let i = 0; i < slicedStatuses.length; i++) {\n const status = slicedStatuses[i];\n\n // Add time gap indicator if needed\n if (i > 0) {\n const prevStatus = slicedStatuses[i - 1];\n\n const { createdAt, descendant, thread, id } = status;\n\n if (prevStatus?.createdAt && createdAt) {\n const currentDate = Date.parse(createdAt);\n if (isFinite(currentDate) && currentDate > MONTH_IN_MS) {\n const prevDate = Date.parse(prevStatus.createdAt);\n\n if (prevDate && isFinite(prevDate)) {\n const { ancestor, id: prevID } = prevStatus;\n const timeDiff = currentDate - prevDate;\n const monthsDiff = ~~(timeDiff / MONTH_IN_MS);\n\n if (monthsDiff > 0) {\n result.push(\n <li\n key={`time-gap-${id}-${prevID}`}\n style={{\n '--time-gap-range': Math.min(12, monthsDiff),\n }}\n class={`time-gap ${ancestor ? 'ancestor' : ''} ${descendant ? 'descendant' : ''} ${\n thread ? 'thread' : ''\n }`}\n >\n {formatTimeGap(monthsDiff)}\n </li>,\n );\n } else {\n // NOTE: For testing purposes\n // result.push(\n // <li\n // key={`time-gap-${id}`}\n // class={`time-gap ${ancestor ? 'ancestor' : ''} ${descendant ? 'descendant' : ''} ${\n // thread ? 'thread' : ''\n // }`}\n // >\n // One eternity later\n // </li>,\n // );\n }\n }\n }\n }\n }\n\n result.push(renderStatus(status, i));\n }\n\n return result;\n }, [statuses, limit, renderStatus, editHistoryMode, editedAtIndex]);\n\n // If there's spoiler in hero status, auto-expand it\n useEffect(() => {\n let timer = setTimeout(() => {\n if (!heroStatusRef.current) return;\n const spoilerButton = heroStatusRef.current.querySelector(\n '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n );\n if (spoilerButton) spoilerButton.click();\n }, 1000);\n return () => clearTimeout(timer);\n }, [id]);\n\n return (\n <ThreadCountContext.Provider value={threadsCount}>\n <div\n tabIndex=\"-1\"\n ref={scrollableRef}\n class={`status-deck deck contained ${\n statuses.length > 1 ? 'padded-bottom' : ''\n } ${\n initialPageState.current === 'status' && !firstLoad.current\n ? 'slide-in'\n : ''\n } ${viewMode ? `deck-view-${viewMode}` : ''} ${\n editHistoryMode ? 'edit-history-mode' : ''\n }`}\n style={\n editHistoryMode\n ? {\n '--edit-history-percentage': `${editedAtIndex / (editHistoryRef.current.length - 1)}`,\n }\n : undefined\n }\n onAnimationEnd={(e) => {\n // Fix the bounce effect when switching viewMode\n // `slide-in` animation kicks in when switching viewMode\n if (initialPageState.current === 'status') {\n // e.target.classList.remove('slide-in');\n initialPageState.current = null;\n }\n }}\n >\n <header\n class={`${uiState === 'loading' ? 'loading' : ''}`}\n onDblClick={(e) => {\n // reload statuses\n states.reloadStatusPage++;\n }}\n >\n {/* <div>\n <Link class=\"button plain deck-close\" href={closeLink}>\n <Icon icon=\"chevron-left\" size=\"xl\" />\n </Link>\n </div> */}\n <div class=\"header-grid header-grid-2\">\n <h1>\n {prevLocationIsStatusPage && (\n <button\n type=\"button\"\n class=\"plain deck-back\"\n onClick={() => {\n history.back();\n }}\n >\n <Icon icon=\"chevron-left\" size=\"xl\" alt={t`Back`} />\n </button>\n )}\n {!heroInView && heroStatus && uiState !== 'loading' ? (\n <>\n <span class=\"hero-heading\">\n <NameText\n account={heroStatus.account}\n instance={instance}\n showAvatar\n short\n />{' '}\n <span class=\"insignificant\">\n •{' '}\n <RelativeTime\n datetime={heroStatus.createdAt}\n format=\"micro\"\n />\n </span>\n </span>{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n heroStatusRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n });\n }}\n title={t`Go to main post`}\n >\n <Icon\n icon={heroPointer === 'down' ? 'arrow-down' : 'arrow-up'}\n />\n </button>\n </>\n ) : (\n <>\n <Trans id=\"post.title\">Post</Trans>{' '}\n <button\n type=\"button\"\n class=\"ancestors-indicator light small\"\n onClick={(e) => {\n // Scroll to top\n e.preventDefault();\n e.stopPropagation();\n scrollableRef.current.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }}\n hidden={!ancestors.length || reachTopPost}\n title={t`${ancestors.length} posts above ‒ Go to top`}\n >\n <Icon icon=\"arrow-up\" />\n {ancestors\n .filter(\n (a, i, arr) =>\n arr.findIndex((b) => b.accountID === a.accountID) ===\n i,\n )\n .slice(0, 3)\n .map((ancestor) => (\n <Avatar\n key={ancestor.account.id}\n url={\n ancestor.account.avatarStatic ||\n ancestor.account.avatar\n }\n alt={ancestor.account.displayName}\n squircle={ancestor.account?.bot}\n />\n ))}\n {/* <Icon icon=\"comment\" />{' '} */}\n {ancestors.length > 3 && (\n <>\n {' '}\n <span class=\"insignificant\">\n {shortenNumber(ancestors.length)}\n </span>\n </>\n )}\n </button>\n </>\n )}\n </h1>\n <div class=\"header-side\">\n <button\n type=\"button\"\n class=\"plain4 button-switch-view\"\n style={{\n display: viewMode === 'full' ? '' : 'none',\n }}\n onClick={() => {\n setViewMode(null);\n searchParams.delete('media');\n searchParams.delete('media-only');\n searchParams.delete('view');\n setSearchParams(searchParams);\n }}\n title={t`Switch to Side Peek view`}\n >\n <Icon icon=\"layout4\" size=\"l\" />\n </button>\n {showRefresh && (\n <button\n type=\"button\"\n class=\"plain button-refresh\"\n onClick={() => {\n states.reloadStatusPage++;\n setShowRefresh(false);\n }}\n >\n <Icon icon=\"refresh\" size=\"l\" alt={t`Refresh`} />\n </button>\n )}\n <Menu2\n align=\"end\"\n portal={{\n // Need this, else the menu click will cause scroll jump\n target: scrollableRef.current,\n }}\n menuButton={\n <button type=\"button\" class=\"button plain4\">\n <Icon icon=\"more\" alt={t`More`} size=\"xl\" />\n </button>\n }\n >\n <MenuItem\n disabled={uiState === 'loading'}\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Icon icon=\"refresh\" />\n <span>\n <Trans>Refresh</Trans>\n </span>\n </MenuItem>\n <MenuItem\n className=\"menu-switch-view\"\n onClick={() => {\n setViewMode(viewMode === 'full' ? null : 'full');\n searchParams.delete('media');\n searchParams.delete('media-only');\n if (viewMode === 'full') {\n searchParams.delete('view');\n } else {\n searchParams.set('view', 'full');\n }\n setSearchParams(searchParams);\n }}\n >\n <Icon\n icon={\n {\n '': 'layout5',\n full: 'layout4',\n }[viewMode || '']\n }\n />\n <span>\n {viewMode === 'full'\n ? t`Switch to Side Peek view`\n : t`Switch to Full view`}\n </span>\n </MenuItem>\n <MenuItem\n onClick={() => {\n // Click all buttons with class .spoiler but not .spoiling\n const buttons = Array.from(\n scrollableRef.current.querySelectorAll(\n '.spoiler-button:not(.spoiling), .spoiler-media-button:not(.spoiling)',\n ),\n );\n buttons.forEach((button) => {\n button.click();\n });\n }}\n >\n <Icon icon=\"eye-open\" />{' '}\n <span>\n <Trans>Show all sensitive content</Trans>\n </span>\n </MenuItem>\n <MenuDivider />\n <MenuHeader className=\"plain\">\n <Trans>Experimental</Trans>\n </MenuHeader>\n <MenuItem\n disabled={!postInstance || postSameInstance}\n onClick={() => {\n const statusURL = getInstanceStatusURL(heroStatus.url);\n if (statusURL) {\n location.hash = statusURL;\n } else {\n alert(t`Unable to switch`);\n }\n }}\n >\n <Icon icon=\"transfer\" />\n <small class=\"menu-double-lines\">\n {postInstance\n ? t`Switch to post's instance (${punycode.toUnicode(\n postInstance,\n )})`\n : t`Switch to post's instance`}\n </small>\n </MenuItem>\n <MenuItem\n disabled={\n !sameInstance ||\n uiState === 'loading' ||\n !heroStatus?.editedAt ||\n !totalDescendants.current\n }\n onClick={initEditHistory}\n >\n <Icon icon=\"edit\" />\n <span>{t`View Edit History Snapshots`}</span>\n </MenuItem>\n </Menu2>\n <Link class=\"button plain deck-close\" to={closeLink}>\n <Icon icon=\"x\" size=\"xl\" alt={t`Close`} />\n </Link>\n </div>\n </div>\n </header>\n <EditHistoryControls />\n {!!statuses.length && heroStatus ? (\n <ul\n class={`timeline flat contextual grow ${\n uiState === 'loading' ? 'loading' : ''\n }`}\n >\n {statusesList}\n {showMore > 0 && (\n <li class=\"descendant descendant-more\">\n <button\n type=\"button\"\n class=\"plain block show-more\"\n disabled={uiState === 'loading'}\n onClick={() => setLimit((l) => l + LIMIT)}\n style={{ marginBlockEnd: '6em' }}\n data-state-post-ids={moreStatusesKeys.join(' ')}\n >\n <div class=\"ib avatars-bunch\">\n {/* show avatars for first 5 statuses */}\n {statuses.slice(limit, limit + 5).map((status) => (\n <Avatar\n key={status.id}\n url={status.account.avatarStatic}\n // title={`${status.avatar.displayName} (@${status.avatar.acct})`}\n />\n ))}\n </div>{' '}\n <div class=\"ib\">\n <Trans>Show more…</Trans>{' '}\n <span class=\"tag\">\n {showMore > LIMIT ? `${LIMIT}+` : showMore}\n </span>\n </div>\n </button>\n </li>\n )}\n </ul>\n ) : (\n <>\n {uiState === 'loading' && (\n <ul class=\"timeline flat contextual grow loading\">\n <li>\n <Status skeleton size=\"l\" />\n </li>\n </ul>\n )}\n {uiState === 'error' && (\n <p class=\"ui-state\">\n <Trans>Unable to load post</Trans>\n <br />\n <br />\n <button\n type=\"button\"\n onClick={() => {\n states.reloadStatusPage++;\n }}\n >\n <Trans>Try again</Trans>\n </button>\n </p>\n )}\n </>\n )}\n </div>\n </ThreadCountContext.Provider>\n );\n}\n\nfunction SubComments({\n replies,\n instance,\n hasParentThread,\n level,\n accWeight,\n openAll,\n parentLink,\n}) {\n const { t } = useLingui();\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Total comments count, including sub-replies\n const diveDeep = (replies) => {\n return replies.reduce((acc, reply) => {\n const { repliesCount, replies } = reply;\n const count = replies?.length || repliesCount;\n return acc + count + diveDeep(replies || []);\n }, 0);\n };\n const totalComments = replies.length + diveDeep(replies);\n const sameCount = replies.length === totalComments;\n\n // Get the first 3 accounts, unique by id\n const accounts = replies\n .map((r) => r.account)\n .filter((a, i, arr) => arr.findIndex((b) => b.id === a.id) === i)\n .slice(0, 3);\n\n const totalWeight = useMemo(() => {\n return replies?.reduce((acc, reply) => {\n return acc + reply?.weight;\n }, accWeight);\n }, [accWeight, replies?.length]);\n\n let open = false;\n if (openAll) {\n open = true;\n } else if (totalWeight <= MAX_WEIGHT) {\n open = true;\n } else if (!hasParentThread && totalComments === 1) {\n const shortReply = calcStatusWeight(replies[0]) < 2;\n if (shortReply) open = true;\n }\n const openBefore = cachedRepliesToggle[replies[0].id];\n\n const handleMediaClick = useCallback((e, i, media, status) => {\n e.preventDefault();\n e.stopPropagation();\n setSearchParams({\n media: i + 1,\n mediaStatusID: status.id,\n });\n }, []);\n\n const detailsRef = useRef();\n useLayoutEffect(() => {\n function handleScroll(e) {\n // NOTE: this scrollLeft works for RTL too\n // Browsers do the magic for us\n e.target.dataset.scrollLeft = e.target.scrollLeft;\n }\n detailsRef.current?.addEventListener('scroll', handleScroll, {\n passive: true,\n });\n return () => {\n detailsRef.current?.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\n // If not open, delay render replies\n const [renderReplies, setRenderReplies] = useState(openBefore || open);\n useEffect(() => {\n let timer;\n if (!openBefore && !open) {\n timer = setTimeout(() => setRenderReplies(true), 100);\n }\n return () => clearTimeout(timer);\n }, [openBefore, open]);\n\n const Container = open ? 'div' : 'details';\n const isDetails = Container === 'details';\n\n return (\n <Container\n ref={detailsRef}\n class=\"replies\"\n open={isDetails ? openBefore || open : undefined}\n onToggle={\n isDetails\n ? (e) => {\n const { open } = e.target;\n // use first reply as ID\n cachedRepliesToggle[replies[0].id] = open;\n }\n : undefined\n }\n style={{\n '--comments-level': level,\n }}\n data-comments-level={level}\n data-comments-level-overflow={level > 4}\n >\n {!open && (\n <summary class=\"replies-summary\" hidden={open}>\n <span class=\"avatars\">\n {accounts.map((a) => (\n <Avatar\n key={a.id}\n url={a.avatarStatic}\n title={`${a.displayName} @${a.username}`}\n squircle={a?.bot}\n />\n ))}\n </span>\n <span class=\"replies-counts\">\n <b>\n <Plural\n value={replies.length}\n one=\"# reply\"\n other={\n <Trans>\n <span title={replies.length}>\n {shortenNumber(replies.length)}\n </span>{' '}\n replies\n </Trans>\n }\n />\n </b>\n {!sameCount && totalComments > 1 && (\n <>\n {' '}\n ·{' '}\n <span>\n <Plural\n value={totalComments}\n one=\"# comment\"\n other={\n <Trans>\n <span title={totalComments}>\n {shortenNumber(totalComments)}\n </span>{' '}\n comments\n </Trans>\n }\n />\n </span>\n </>\n )}\n </span>\n <Icon icon=\"chevron-down\" class=\"replies-summary-chevron\" />\n {!!parentLink && (\n <Link\n class=\"replies-parent-link\"\n to={parentLink.to}\n onClick={parentLink.onClick}\n title={t`View post with its replies`}\n >\n »\n </Link>\n )}\n </summary>\n )}\n {renderReplies && (\n <ul>\n {replies.map((r) => (\n <li key={r.id}>\n {/* <Link\n class=\"status-link\"\n to={instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`}\n onClick={() => {\n resetScrollPosition(r.id);\n }}\n > */}\n <div class=\"status-focus\" tabIndex={0}>\n <Status\n statusID={r.id}\n instance={instance}\n withinContext\n size=\"s\"\n enableTranslate\n onMediaClick={handleMediaClick}\n showActionsBar\n />\n {!r.replies?.length && r.repliesCount > 0 && (\n <div class=\"replies-link\">\n <Icon icon=\"comment2\" alt={t`Replies`} />{' '}\n <span title={r.repliesCount}>\n {shortenNumber(r.repliesCount)}\n </span>\n </div>\n )}\n </div>\n {/* </Link> */}\n {r.replies?.length && (\n <SubComments\n instance={instance}\n replies={r.replies}\n level={r.level}\n accWeight={!open ? r.weight : totalWeight}\n openAll={openAll}\n parentLink={{\n to: instance ? `/${instance}/s/${r.id}` : `/s/${r.id}`,\n onClick: () => {\n resetScrollPosition(r.id);\n },\n }}\n />\n )}\n </li>\n ))}\n </ul>\n )}\n </Container>\n );\n}\n\nconst MEDIA_VIRTUAL_LENGTH = 140;\nconst POLL_VIRTUAL_LENGTH = 35;\nconst CARD_VIRTUAL_LENGTH = 70;\nconst WEIGHT_SEGMENT = 140;\nconst statusWeightCache = new Map();\nfunction calcStatusWeight(status) {\n const cachedWeight = statusWeightCache.get(status.id);\n if (cachedWeight) return cachedWeight;\n const { spoilerText, content, mediaAttachments, poll, card } = status;\n const length = htmlContentLength(spoilerText + content);\n const mediaLength = mediaAttachments?.length ? MEDIA_VIRTUAL_LENGTH : 0;\n const pollLength = (poll?.options?.length || 0) * POLL_VIRTUAL_LENGTH;\n const cardLength =\n card && (mediaAttachments?.length || poll?.options?.length)\n ? 0\n : CARD_VIRTUAL_LENGTH;\n const totalLength = length + mediaLength + pollLength + cardLength;\n const weight = totalLength / WEIGHT_SEGMENT;\n statusWeightCache.set(status.id, weight);\n return weight;\n}\n\nexport default memo(StatusPage);\n","import { useParams } from 'react-router-dom';\n\nimport Status from './status';\n\nexport default function StatusRoute() {\n const params = useParams();\n const { id, instance } = params;\n return <Status id={id} instance={instance} />;\n}\n","export default \"__VITE_ASSET__BbkKeAoc__\"","export default \"__VITE_ASSET__C$apFnmr__\"","export default \"__VITE_ASSET__MUCjVR2Z__\"","export default \"__VITE_ASSET__Pb$jWfr9__\"","export default \"__VITE_ASSET__DJIucEyS__\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20xml:space='preserve'%20fill-rule='evenodd'%20stroke-linejoin='round'%20stroke-miterlimit='2'%20clip-rule='evenodd'%20viewBox='0%200%20102%2028'%3e%3cpath%20fill='none'%20d='M0%200h101.5v27.5H0z'/%3e%3cg%20fill-rule='nonzero'%3e%3cpath%20fill='url(%23a)'%20d='M2.32%2021.85c1.4%200%202.21-.85%202.21-2.3v-4.64H8.5c4.45%200%207.54-2.9%207.54-7.24%200-4.35-2.98-7.24-7.32-7.24h-6.4C.93.43.11%201.28.11%202.73v16.82c0%201.45.82%202.3%202.21%202.3Zm2.21-10.4V3.94h3c2.54%200%204%201.34%204%203.75s-1.47%203.76-4%203.76h-3Z'/%3e%3cpath%20fill='url(%23b)'%20d='M20.52%2021.88c1.25%200%202.13-.76%202.13-2.23v-7.04c0-2.07%201.2-3.49%203.21-3.49%201.95%200%202.95%201.23%202.95%203.25v7.28c0%201.47.89%202.23%202.13%202.23%201.26%200%202.14-.76%202.14-2.23v-8.18c0-3.64-1.99-5.9-5.48-5.9-2.38%200-4.1%201.12-4.93%203.1h-.09V2.3c0-1.38-.78-2.2-2.1-2.2-1.31%200-2.1.82-2.1%202.2v17.34c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23c)'%20d='M40.45%2021.82c1.96%200%203.93-.98%204.8-2.65h.1v.8c.08%201.27.89%201.91%202.05%201.91%201.21%200%202.08-.73%202.08-2.15v-8.95c0-3.17-2.63-5.25-6.65-5.25-3.26%200-5.78%201.16-6.5%203.04-.15.32-.23.63-.23.96%200%20.97.75%201.64%201.79%201.64.69%200%201.23-.26%201.7-.79.95-1.23%201.74-1.65%203.04-1.65%201.62%200%202.64.85%202.64%202.31v1.04l-3.95.24c-3.93.23-6.13%201.88-6.13%204.74%200%202.83%202.27%204.76%205.26%204.76Zm1.4-3.09c-1.43%200-2.4-.73-2.4-1.9%200-1.12.91-1.83%202.51-1.95l3.31-.2v1.14c0%201.7-1.54%202.91-3.41%202.91Z'/%3e%3cpath%20fill='url(%23d)'%20d='M54.37%2021.88c1.26%200%202.14-.76%202.14-2.23v-7.09c0-2.03%201.21-3.44%203.13-3.44s2.89%201.17%202.89%203.22v7.31c0%201.47.88%202.23%202.14%202.23%201.24%200%202.13-.76%202.13-2.23v-8.2c0-3.68-1.96-5.87-5.45-5.87-2.41%200-4%201.07-4.83%203.01h-.09v-.87c0-1.35-.85-2.17-2.14-2.17-1.28%200-2.06.82-2.06%202.15v11.95c0%201.47.9%202.23%202.14%202.23Z'/%3e%3cpath%20fill='url(%23e)'%20d='M71.65%2027.17c1.26%200%202.14-.76%202.14-2.23v-6h.09a5.15%205.15%200%200%200%204.88%202.88c3.92%200%206.35-3.05%206.35-8.1%200-5.07-2.44-8.1-6.43-8.1a5.12%205.12%200%200%200-4.86%202.99h-.09v-.85c0-1.45-.88-2.21-2.1-2.21-1.24%200-2.11.76-2.11%202.2v17.2c0%201.46.89%202.22%202.13%202.22Zm5.6-8.8c-2.1%200-3.47-1.8-3.47-4.65%200-2.81%201.37-4.67%203.47-4.67%202.14%200%203.49%201.83%203.49%204.67%200%202.86-1.35%204.66-3.5%204.66Z'/%3e%3cpath%20fill='url(%23f)'%20d='M89.61%2027.39c3.44%200%205.26-1.5%206.73-5.55l4.81-13.1a4%204%200%200%200%20.24-1.26c0-1.13-.85-1.93-2.08-1.93-1.1%200-1.71.51-2.07%201.7l-3.4%2010.9h-.08L90.35%207.28c-.36-1.25-.94-1.73-2.07-1.73-1.26%200-2.21.83-2.21%201.99%200%20.35.09.82.25%201.26l5%2013.21-.21.56c-.52%201.1-1.32%201.42-2.07%201.42l-.75-.01c-.96%200-1.56.54-1.56%201.4%200%201.29%201%202%202.88%202Z'/%3e%3c/g%3e%3cdefs%3e%3cradialGradient%20id='a'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='b'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='c'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='d'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='e'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3cradialGradient%20id='f'%20cx='0'%20cy='0'%20r='1'%20gradientTransform='rotate(28.51%20.06%20.22)%20scale(57.6252)'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20offset='0'%20stop-color='%23a4bff7'/%3e%3cstop%20offset='1'%20stop-color='%236081e6'/%3e%3c/radialGradient%3e%3c/defs%3e%3c/svg%3e\"","import './welcome.css';\n\nimport { Trans, useLingui } from '@lingui/react/macro';\n\nimport boostsCarouselUrl from '../assets/features/boosts-carousel.jpg';\nimport groupedNotificationsUrl from '../assets/features/grouped-notifications.jpg';\nimport multiColumnUrl from '../assets/features/multi-column.jpg';\nimport multiHashtagTimelineUrl from '../assets/features/multi-hashtag-timeline.jpg';\nimport nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg';\nimport logo from '../assets/logo.svg';\nimport logoText from '../assets/logo-text.svg';\n\nimport LangSelector from '../components/lang-selector';\nimport Link from '../components/link';\nimport states from '../utils/states';\nimport useTitle from '../utils/useTitle';\n\nconst {\n PHANPY_DEFAULT_INSTANCE: DEFAULT_INSTANCE,\n PHANPY_WEBSITE: WEBSITE,\n PHANPY_PRIVACY_POLICY_URL: PRIVACY_POLICY_URL,\n PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL: DEFAULT_INSTANCE_REGISTRATION_URL,\n} = import.meta.env;\nconst appSite = WEBSITE\n ? WEBSITE.replace(/https?:\\/\\//g, '').replace(/\\/$/, '')\n : null;\nconst appVersion = __BUILD_TIME__\n ? `${__BUILD_TIME__.slice(0, 10).replace(/-/g, '.')}${\n __COMMIT_HASH__ ? `.${__COMMIT_HASH__}` : ''\n }`\n : null;\n\nfunction Welcome() {\n const { t } = useLingui();\n useTitle(null, ['/', '/welcome']);\n return (\n <main id=\"welcome\">\n <div class=\"hero-container\">\n <div class=\"hero-content\">\n <h1>\n <img\n src={logo}\n alt=\"\"\n width=\"160\"\n height=\"160\"\n style={{\n aspectRatio: '1/1',\n marginBlockEnd: -16,\n }}\n />\n <img src={logoText} alt=\"Phanpy\" width=\"200\" />\n </h1>\n <p class=\"desc\">\n <Trans>A minimalistic opinionated Mastodon web client.</Trans>\n </p>\n <p>\n <Link\n to={\n DEFAULT_INSTANCE\n ? `/login?instance=${DEFAULT_INSTANCE}&submit=1`\n : '/login'\n }\n class=\"button\"\n >\n {DEFAULT_INSTANCE ? t`Log in` : t`Log in with Mastodon`}\n </Link>\n </p>\n {DEFAULT_INSTANCE && DEFAULT_INSTANCE_REGISTRATION_URL && (\n <p>\n <a href={DEFAULT_INSTANCE_REGISTRATION_URL} class=\"button plain5\">\n <Trans>Sign up</Trans>\n </a>\n </p>\n )}\n {!DEFAULT_INSTANCE && (\n <p class=\"insignificant\">\n <small>\n <Trans>\n Connect your existing Mastodon/Fediverse account.\n <br />\n Your credentials are not stored on this server.\n </Trans>\n </small>\n </p>\n )}\n </div>\n {(appSite || appVersion) && (\n <p class=\"app-site-version\">\n <small>\n {appSite} {appVersion}\n </small>\n </p>\n )}\n <p>\n <Trans>\n <a href=\"https://github.com/cheeaun/phanpy\" target=\"_blank\">\n Built\n </a>{' '}\n by{' '}\n <a\n href=\"https://mastodon.social/@cheeaun\"\n target=\"_blank\"\n onClick={(e) => {\n e.preventDefault();\n states.showAccount = 'cheeaun@mastodon.social';\n }}\n >\n @cheeaun\n </a>\n .{' '}\n <a href={PRIVACY_POLICY_URL} target=\"_blank\">\n Privacy Policy\n </a>\n .\n </Trans>\n </p>\n <div>\n <LangSelector />\n </div>\n </div>\n <div id=\"why-container\">\n <div class=\"sections\">\n <section>\n <img\n src={boostsCarouselUrl}\n alt={t`Screenshot of Boosts Carousel`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Boosts Carousel</Trans>\n </h4>\n <p>\n <Trans>\n Visually separate original posts and re-shared posts (boosted\n posts).\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={nestedCommentsThreadUrl}\n alt={t`Screenshot of nested comments thread`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Nested comments thread</Trans>\n </h4>\n <p>\n <Trans>\n Effortlessly follow conversations. Semi-collapsible replies.\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={groupedNotificationsUrl}\n alt={t`Screenshot of grouped notifications`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Grouped notifications</Trans>\n </h4>\n <p>\n <Trans>\n Similar notifications are grouped and collapsed to reduce\n clutter.\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={multiColumnUrl}\n alt={t`Screenshot of multi-column UI`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Single or multi-column</Trans>\n </h4>\n <p>\n <Trans>\n By default, single column for zen-mode seekers. Configurable\n multi-column for power users.\n </Trans>\n </p>\n </section>\n <section>\n <img\n src={multiHashtagTimelineUrl}\n alt={t`Screenshot of multi-hashtag timeline with a form to add more hashtags`}\n loading=\"lazy\"\n />\n <h4>\n <Trans>Multi-hashtag timeline</Trans>\n </h4>\n <p>\n <Trans>Up to 5 hashtags combined into a single timeline.</Trans>\n </p>\n </section>\n </div>\n </div>\n </main>\n );\n}\n\nexport default Welcome;\n","// Replace alert() with toastify-js\nimport Toastify from 'toastify-js';\n\nconst nativeAlert = window.alert;\nif (!window.__nativeAlert) window.__nativeAlert = nativeAlert;\n\nwindow.alert = function (message) {\n console.debug(\n 'ALERT: This is a custom alert() function. Native alert() is still available as window.__nativeAlert()',\n );\n // If Error object, show the message\n if (message instanceof Error && message?.message) {\n message = message.message;\n }\n // If not string, stringify it\n if (typeof message !== 'string') {\n message = JSON.stringify(message);\n }\n\n const toast = Toastify({\n text: message,\n className: 'alert',\n gravity: 'top',\n position: 'center',\n duration: 10_000,\n offset: {\n y: 48,\n },\n onClick: () => {\n toast.hideToast();\n },\n });\n toast.showToast();\n};\n","import './app.css';\n\nimport { useLingui } from '@lingui/react';\nimport debounce from 'just-debounce-it';\nimport { lazy, memo, Suspense } from 'preact/compat';\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport { matchPath, Route, Routes, useLocation } from 'react-router-dom';\n\nimport 'swiped-events';\n\nimport { subscribe } from 'valtio';\n\nimport BackgroundService from './components/background-service';\nimport ComposeButton from './components/compose-button';\nimport { ICONS } from './components/ICONS';\nimport KeyboardShortcutsHelp from './components/keyboard-shortcuts-help';\nimport Loader from './components/loader';\nimport Modals from './components/modals';\nimport NavigationCommand from './components/navigation-command';\nimport NotificationService from './components/notification-service';\nimport SearchCommand from './components/search-command';\nimport Shortcuts from './components/shortcuts';\nimport NotFound from './pages/404';\nimport AccountStatuses from './pages/account-statuses';\nimport AnnualReport from './pages/annual-report';\nimport Bookmarks from './pages/bookmarks';\nimport Catchup from './pages/catchup';\nimport Favourites from './pages/favourites';\nimport Filters from './pages/filters';\nimport FollowedHashtags from './pages/followed-hashtags';\nimport Following from './pages/following';\nimport Hashtag from './pages/hashtag';\nimport Home from './pages/home';\nimport HttpRoute from './pages/http-route';\nimport List from './pages/list';\nimport Lists from './pages/lists';\nimport Login from './pages/login';\nimport Mentions from './pages/mentions';\nimport Notifications from './pages/notifications';\nimport Public from './pages/public';\nimport ScheduledPosts from './pages/scheduled-posts';\nimport Search from './pages/search';\nimport StatusRoute from './pages/status-route';\nimport Trending from './pages/trending';\nimport Welcome from './pages/welcome';\nimport {\n api,\n hasInstance,\n hasPreferences,\n initAccount,\n initClient,\n initInstance,\n initPreferences,\n} from './utils/api';\nimport { getAccessToken } from './utils/auth';\nimport focusDeck from './utils/focus-deck';\nimport states, { initStates, statusKey } from './utils/states';\nimport store from './utils/store';\nimport {\n getAccount,\n getCredentialApplication,\n getCurrentAccount,\n getVapidKey,\n setCurrentAccountID,\n} from './utils/store-utils';\n\nimport './utils/toast-alert';\n\n// Lazy load Sandbox component only in development\nconst Sandbox =\n import.meta.env.DEV || import.meta.env.PHANPY_DEV\n ? lazy(() => import('./pages/sandbox'))\n : () => null;\n\nwindow.__STATES__ = states;\nwindow.__STATES_STATS__ = () => {\n const keys = [\n 'statuses',\n 'accounts',\n 'spoilers',\n 'unfurledLinks',\n 'statusQuotes',\n ];\n const counts = {};\n keys.forEach((key) => {\n counts[key] = Object.keys(states[key]).length;\n });\n console.warn('STATE stats', counts);\n\n const { statuses } = states;\n const unmountedPosts = [];\n for (const key in statuses) {\n const $post = document.querySelector(\n `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n );\n if (!$post) {\n unmountedPosts.push(key);\n }\n }\n console.warn('Unmounted posts', unmountedPosts.length, unmountedPosts);\n};\n\n// Experimental \"garbage collection\" for states\n// Every 15 minutes\n// Only posts for now\nsetInterval(\n () => {\n if (!window.__IDLE__) return;\n const { statuses, unfurledLinks, notifications } = states;\n let keysCount = 0;\n const { instance } = api();\n for (const key in statuses) {\n if (!window.__IDLE__) break;\n try {\n const $post = document.querySelector(\n `[data-state-post-id~=\"${key}\"], [data-state-post-ids~=\"${key}\"]`,\n );\n const postInNotifications = notifications.some(\n (n) => key === statusKey(n.status?.id, instance),\n );\n if (!$post && !postInNotifications) {\n delete states.statuses[key];\n delete states.statusQuotes[key];\n for (const link in unfurledLinks) {\n const unfurled = unfurledLinks[link];\n const sKey = statusKey(unfurled.id, unfurled.instance);\n if (sKey === key) {\n delete states.unfurledLinks[link];\n break;\n }\n }\n keysCount++;\n }\n } catch (e) {}\n }\n if (keysCount) {\n console.info(`GC: Removed ${keysCount} keys`);\n }\n },\n 15 * 60 * 1000,\n);\n\n// Preload icons\n// There's probably a better way to do this\n// Related: https://github.com/vitejs/vite/issues/10600\nsetTimeout(() => {\n for (const icon in ICONS) {\n setTimeout(() => {\n if (Array.isArray(ICONS[icon])) {\n ICONS[icon][0]?.();\n } else if (typeof ICONS[icon] === 'object') {\n ICONS[icon].module?.();\n } else {\n ICONS[icon]?.();\n }\n }, 1);\n }\n}, 5000);\n\n(() => {\n window.__IDLE__ = true;\n const nonIdleEvents = [\n 'mousemove',\n 'mousedown',\n 'resize',\n 'keydown',\n 'touchstart',\n 'pointerdown',\n 'pointermove',\n 'wheel',\n ];\n const setIdle = () => {\n window.__IDLE__ = true;\n };\n const IDLE_TIME = 3_000; // 3 seconds\n const debouncedSetIdle = debounce(setIdle, IDLE_TIME);\n const onNonIdle = () => {\n window.__IDLE__ = false;\n debouncedSetIdle();\n };\n nonIdleEvents.forEach((event) => {\n window.addEventListener(event, onNonIdle, {\n passive: true,\n capture: true,\n });\n });\n window.addEventListener('blur', setIdle, {\n passive: true,\n });\n // When cursor leaves the window, set idle\n document.documentElement.addEventListener(\n 'mouseleave',\n (e) => {\n if (!e.relatedTarget && !e.toElement) {\n setIdle();\n }\n },\n {\n passive: true,\n },\n );\n // document.addEventListener(\n // 'visibilitychange',\n // () => {\n // if (document.visibilityState === 'visible') {\n // onNonIdle();\n // }\n // },\n // {\n // passive: true,\n // },\n // );\n})();\n\n// Possible fix for iOS PWA theme-color bug\n// It changes when loading web pages in \"webview\"\nconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\nif (isIOS) {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n // Don't reset theme color if media modal is showing\n // Media modal will set its own theme color based on the media's color\n const showingMediaModal =\n document.getElementsByClassName('media-modal-container').length > 0;\n if (showingMediaModal) return;\n\n const theme = store.local.get('theme');\n let $meta;\n if (theme) {\n // Get current meta\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][data-theme-setting=\"manual\"]`,\n );\n if ($meta) {\n const color = $meta.content;\n const tempColor =\n theme === 'light'\n ? $meta.dataset.themeLightColorTemp\n : $meta.dataset.themeDarkColorTemp;\n $meta.content = tempColor || '';\n setTimeout(() => {\n $meta.content = color;\n }, 10);\n }\n } else {\n // Get current color scheme\n const colorScheme = window.matchMedia('(prefers-color-scheme: dark)')\n .matches\n ? 'dark'\n : 'light';\n // Get current theme-color\n $meta = document.querySelector(\n `meta[name=\"theme-color\"][media*=\"${colorScheme}\"]`,\n );\n if ($meta) {\n const color = $meta.dataset.content;\n const tempColor = $meta.dataset.contentTemp;\n $meta.content = tempColor || '';\n setTimeout(() => {\n $meta.content = color;\n }, 10);\n }\n }\n }\n });\n}\n\n{\n const theme = store.local.get('theme');\n // If there's a theme, it's NOT auto\n if (theme) {\n // dark | light\n document.documentElement.classList.add(`is-${theme}`);\n document\n .querySelector('meta[name=\"color-scheme\"]')\n .setAttribute('content', theme || 'light dark');\n\n // Enable manual theme <meta>\n const $manualMeta = document.querySelector(\n 'meta[data-theme-setting=\"manual\"]',\n );\n if ($manualMeta) {\n $manualMeta.name = 'theme-color';\n $manualMeta.content =\n theme === 'light'\n ? $manualMeta.dataset.themeLightColor\n : $manualMeta.dataset.themeDarkColor;\n }\n // Disable auto theme <meta>s\n const $autoMetas = document.querySelectorAll(\n 'meta[data-theme-setting=\"auto\"]',\n );\n $autoMetas.forEach((m) => {\n m.name = '';\n });\n }\n const textSize = store.local.get('textSize');\n if (textSize) {\n document.documentElement.style.setProperty('--text-size', `${textSize}px`);\n }\n}\n\nsubscribe(states, (changes) => {\n for (const [action, path, value, prevValue] of changes) {\n // Change #app dataset based on settings.shortcutsViewMode\n if (path.join('.') === 'settings.shortcutsViewMode') {\n const $app = document.getElementById('app');\n if ($app) {\n $app.dataset.shortcutsViewMode = states.shortcuts?.length ? value : '';\n }\n }\n\n // Add/Remove cloak class to body\n if (path.join('.') === 'settings.cloakMode') {\n const $body = document.body;\n $body.classList.toggle('cloak', value);\n }\n }\n});\n\nconst BENCHES = new Map();\nwindow.__BENCH_RESULTS = new Map();\nwindow.__BENCHMARK = {\n start(name) {\n if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return;\n // If already started, ignore\n if (BENCHES.has(name)) return;\n const start = performance.now();\n BENCHES.set(name, start);\n },\n end(name) {\n if (!import.meta.env.DEV && !import.meta.env.PHANPY_DEV) return;\n const start = BENCHES.get(name);\n if (start) {\n const end = performance.now();\n const duration = end - start;\n __BENCH_RESULTS.set(name, duration);\n BENCHES.delete(name);\n }\n },\n};\n\nif (import.meta.env.DEV) {\n // If press shift down, set --time-scale to 10 in root\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Shift') {\n document.documentElement.classList.add('slow-mo');\n }\n });\n document.addEventListener('keyup', (e) => {\n if (e.key === 'Shift') {\n document.documentElement.classList.remove('slow-mo');\n }\n });\n}\n\n{\n // Temporary Experiments\n // May be removed in the future\n document.body.classList.toggle(\n 'exp-tab-bar-v2',\n store.local.get('experiments-tabBarV2') ?? false,\n );\n}\n\nfunction App() {\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [uiState, setUIState] = useState('loading');\n __BENCHMARK.start('app-init');\n __BENCHMARK.start('time-to-following');\n __BENCHMARK.start('time-to-home');\n __BENCHMARK.start('time-to-isLoggedIn');\n useLingui();\n\n useEffect(() => {\n const instanceURL = store.local.get('instanceURL');\n const code = decodeURIComponent(\n (window.location.search.match(/code=([^&]+)/) || [, ''])[1],\n );\n\n if (code) {\n console.log({ code });\n // Clear the code from the URL\n window.history.replaceState(\n {},\n document.title,\n window.location.pathname || '/',\n );\n\n const {\n client_id: clientID,\n client_secret: clientSecret,\n vapid_key,\n } = getCredentialApplication(instanceURL) || {};\n const vapidKey = getVapidKey(instanceURL) || vapid_key;\n const verifier = store.sessionCookie.get('codeVerifier');\n\n (async () => {\n setUIState('loading');\n const { access_token: accessToken } = await getAccessToken({\n instanceURL,\n client_id: clientID,\n client_secret: clientSecret,\n code,\n code_verifier: verifier || undefined,\n });\n\n if (accessToken) {\n const client = initClient({ instance: instanceURL, accessToken });\n await Promise.allSettled([\n initPreferences(client),\n initInstance(client, instanceURL),\n initAccount(client, instanceURL, accessToken, vapidKey),\n ]);\n initStates();\n window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n\n setIsLoggedIn(true);\n setUIState('default');\n } else {\n setUIState('error');\n }\n __BENCHMARK.end('app-init');\n })();\n } else {\n window.__IGNORE_GET_ACCOUNT_ERROR__ = true;\n const searchAccount = decodeURIComponent(\n (window.location.search.match(/account=([^&]+)/) || [, ''])[1],\n );\n let account;\n if (searchAccount) {\n account = getAccount(searchAccount);\n console.log('searchAccount', searchAccount, account);\n if (account) {\n setCurrentAccountID(account.info.id);\n window.history.replaceState(\n {},\n document.title,\n window.location.pathname || '/',\n );\n }\n }\n if (!account) {\n account = getCurrentAccount();\n }\n if (account) {\n setCurrentAccountID(account.info.id);\n const { client } = api({ account });\n const { instance } = client;\n // console.log('masto', masto);\n initStates();\n setUIState('loading');\n (async () => {\n try {\n if (hasPreferences() && hasInstance(instance)) {\n // Non-blocking\n initPreferences(client);\n initInstance(client, instance);\n } else {\n await Promise.allSettled([\n initPreferences(client),\n initInstance(client, instance),\n ]);\n }\n } catch (e) {\n } finally {\n setIsLoggedIn(true);\n setUIState('default');\n __BENCHMARK.end('app-init');\n }\n })();\n } else {\n setUIState('default');\n __BENCHMARK.end('app-init');\n }\n }\n\n // Cleanup\n store.sessionCookie.del('clientID');\n store.sessionCookie.del('clientSecret');\n store.sessionCookie.del('codeVerifier');\n }, []);\n\n let location = useLocation();\n states.currentLocation = location.pathname;\n // useLayoutEffect(() => {\n // states.currentLocation = location.pathname;\n // }, [location.pathname]);\n\n useEffect(focusDeck, [location, isLoggedIn]);\n\n if (/\\/https?:/.test(location.pathname)) {\n return <HttpRoute />;\n }\n\n if (uiState === 'loading') {\n return <Loader id=\"loader-root\" />;\n }\n\n return (\n <>\n <PrimaryRoutes isLoggedIn={isLoggedIn} />\n <SecondaryRoutes isLoggedIn={isLoggedIn} />\n <Routes>\n <Route path=\"/:instance?/s/:id\" element={<StatusRoute />} />\n </Routes>\n {isLoggedIn && <ComposeButton />}\n {isLoggedIn && <Shortcuts />}\n <Modals />\n {isLoggedIn && <NotificationService />}\n <BackgroundService isLoggedIn={isLoggedIn} />\n {isLoggedIn && <NavigationCommand />}\n <SearchCommand onClose={focusDeck} />\n <KeyboardShortcutsHelp />\n </>\n );\n}\n\nfunction Root({ isLoggedIn }) {\n if (isLoggedIn) {\n __BENCHMARK.end('time-to-isLoggedIn');\n }\n return isLoggedIn ? <Home /> : <Welcome />;\n}\n\nconst PrimaryRoutes = memo(({ isLoggedIn }) => {\n const location = useLocation();\n const nonRootLocation = useMemo(() => {\n const { pathname } = location;\n return !/^\\/(login|welcome|_sandbox)/i.test(pathname);\n }, [location]);\n\n return (\n <Routes location={nonRootLocation || location}>\n <Route path=\"/\" element={<Root isLoggedIn={isLoggedIn} />} />\n <Route path=\"/login\" element={<Login />} />\n <Route path=\"/welcome\" element={<Welcome />} />\n {(import.meta.env.DEV || import.meta.env.PHANPY_DEV) && (\n <Route\n path=\"/_sandbox\"\n element={\n <Suspense fallback={<Loader id=\"loader-sandbox\" />}>\n <Sandbox />\n </Suspense>\n }\n />\n )}\n </Routes>\n );\n});\n\nfunction getPrevLocation() {\n return states.prevLocation || null;\n}\nfunction SecondaryRoutes({ isLoggedIn }) {\n // const snapStates = useSnapshot(states);\n const location = useLocation();\n // const prevLocation = snapStates.prevLocation;\n const backgroundLocation = useRef(getPrevLocation());\n\n const isModalPage = useMemo(() => {\n return (\n matchPath('/:instance/s/:id', location.pathname) ||\n matchPath('/s/:id', location.pathname)\n );\n }, [location.pathname, matchPath]);\n if (isModalPage) {\n if (!backgroundLocation.current)\n backgroundLocation.current = getPrevLocation();\n } else {\n backgroundLocation.current = null;\n }\n console.debug({\n backgroundLocation: backgroundLocation.current,\n location,\n });\n\n return (\n <Routes location={backgroundLocation.current || location}>\n {isLoggedIn && (\n <>\n <Route path=\"/notifications\" element={<Notifications />} />\n <Route path=\"/mentions\" element={<Mentions />} />\n <Route path=\"/following\" element={<Following />} />\n <Route path=\"/b\" element={<Bookmarks />} />\n <Route path=\"/f\" element={<Favourites />} />\n <Route path=\"/l\">\n <Route index element={<Lists />} />\n <Route path=\":id\" element={<List />} />\n </Route>\n <Route path=\"/fh\" element={<FollowedHashtags />} />\n <Route path=\"/sp\" element={<ScheduledPosts />} />\n <Route path=\"/ft\" element={<Filters />} />\n <Route path=\"/catchup\" element={<Catchup />} />\n <Route path=\"/annual_report/:year\" element={<AnnualReport />} />\n </>\n )}\n <Route path=\"/:instance?/t/:hashtag\" element={<Hashtag />} />\n <Route path=\"/:instance?/a/:id\" element={<AccountStatuses />} />\n <Route path=\"/:instance?/p\">\n <Route index element={<Public />} />\n <Route path=\"l\" element={<Public local />} />\n </Route>\n <Route path=\"/:instance?/trending\" element={<Trending />} />\n <Route path=\"/:instance?/search\" element={<Search />} />\n {/* <Route path=\"/:anything\" element={<NotFound />} /> */}\n </Routes>\n );\n}\n\nexport { App };\n","import './index.css';\nimport './cloak-mode.css';\nimport './polyfills';\n\nimport { i18n } from '@lingui/core';\nimport { I18nProvider } from '@lingui/react';\n// Polyfill needed for Firefox < 122\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1423593\n// import '@formatjs/intl-segmenter/polyfill';\nimport { render } from 'preact';\nimport { HashRouter } from 'react-router-dom';\n\nimport { App } from './app';\nimport { IconSpriteProvider } from './components/icon-sprite-manager';\nimport { initActivateLang } from './utils/lang';\nimport { initPWAViewport } from './utils/pwa-viewport';\n\ninitActivateLang();\ninitPWAViewport();\n\nif (import.meta.env.DEV) {\n import('preact/debug');\n}\n\nrender(\n <I18nProvider i18n={i18n}>\n <HashRouter>\n <IconSpriteProvider>\n <App />\n </IconSpriteProvider>\n </HashRouter>\n </I18nProvider>,\n document.getElementById('app'),\n);\n\n// Storage cleanup\nsetTimeout(() => {\n try {\n // Clean up iconify localStorage\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith('iconify')) {\n localStorage.removeItem(key);\n }\n });\n Object.keys(sessionStorage).forEach((key) => {\n if (key.startsWith('iconify')) {\n sessionStorage.removeItem(key);\n }\n });\n\n // Clean up old settings key\n localStorage.removeItem('settings:boostsCarousel');\n } catch (e) {}\n}, 5000);\n\n// Service worker cache cleanup\nif ('serviceWorker' in navigator && typeof caches !== 'undefined') {\n const MAX_SW_CACHE_SIZE = 50;\n const IGNORE_CACHE_KEYS = ['icons'];\n let clearRanOnce = false;\n const FAST_INTERVAL = 10_000; // 10 seconds\n const SLOW_INTERVAL = 60 * 60 * 1000; // 1 hour\n async function clearCaches() {\n if (window.__IDLE__) {\n try {\n const keys = await caches.keys();\n for (const key of keys) {\n if (IGNORE_CACHE_KEYS.includes(key)) continue;\n const cache = await caches.open(key);\n const _keys = await cache.keys();\n if (_keys.length > MAX_SW_CACHE_SIZE) {\n console.warn('Cleaning cache', key, _keys.length);\n const deleteKeys = _keys.slice(MAX_SW_CACHE_SIZE);\n for (const deleteKey of deleteKeys) {\n await cache.delete(deleteKey);\n }\n }\n }\n clearRanOnce = true;\n } catch (e) {} // Silent fail\n }\n // Once cleared, clear again at slower interval\n setTimeout(clearCaches, clearRanOnce ? SLOW_INTERVAL : FAST_INTERVAL);\n }\n setTimeout(clearCaches, FAST_INTERVAL);\n}\n\nwindow.__CLOAK__ = () => {\n document.body.classList.toggle('cloak');\n};\n"],"names":["functionDebounce","debounce","fn","wait","callFirst","timeout","debouncedFn","clear","flush","call","debounceWrapper","context","args","callNow","window","document","event","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","e","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","eventType","changedTouches","eventData","xUp","yUp","el","attributeName","defaultValue","attributeValue","usePageVisibility","deps","savedCallback","useRef","useEffect","current","handleVisibilityChange","hidden","visibilityState","console","addEventListener","STREAMING_TIMEOUT","POLL_INTERVAL","BackgroundService","memo","isLoggedIn","t","_useLingui","visible","setVisible","useState","visibleTimeout","clearTimeout","setTimeout","checkLatestNotification","masto","instance","skipCheckMarkers","states","notificationsLast","notificationsIterator","v1","notifications","list","limit","sinceId","id","values","value","next","length","notificationsShowNew","lastReadId","markers","fetch","timeline","sub","streamTimeout","pollNotifications","streaming","api","hasStreaming","user","notification","subscribe","entry","skipThreading","unsubscribe","clearInterval","info","useInterval","checkForUpdates","lastCheckDate","now","appVersion","currentCloakMode","_t","useHotkeys","showToast","fetchLatestPostsMemoized","pmem","currentAccountID","statusesIterator","accounts","$select","statuses","exclude_replies","exclude_reblogs","maxAge","ComposeButton","snapStates","useSnapshot","menuOpen","setMenuOpen","latestPosts","setLatestPosts","loadingPosts","setLoadingPosts","buttonRef","menuRef","columnMode","settings","shortcutsViewMode","handleButton","key","toLowerCase","composerState","minimized","openOSK","composeDataElements","querySelectorAll","opts","JSON","parse","undefined","shiftKey","openCompose","showCompose","useKey","ignoreEventWhen","querySelector","metaKey","ctrlKey","altKey","bindLongPress","useLongPress","threshold","fetchLatestPosts","useCallback","getCurrentAccountID","posts","handleReplyToPost","post","replyToStatus","_jsxs","_Fragment","children","_jsx","ref","type","onClick","onContextMenu","preventDefault","class","publishing","publishingError","Icon","icon","size","alt","ControlledMenu","state","anchorRef","onClose","direction","gap","unmountOnClose","portal","target","body","boundingBoxPadding","safeBoundingBoxPadding","containerProps","style","zIndex","closeMenu","submenuOpenDelay","MenuLink","to","_Trans","MenuDivider","SubMenu2","align","shift","disabled","label","className","map","createdDate","Date","createdAt","isWithinDay","getTime","MenuItem","statusPeek","RelativeTime","datetime","format","dateTime","toISOString","title","toLocaleString","niceDateTime","SequentialKeys","key1","key2","components","0","1","KeyboardShortcutsHelp","showKeyboardShortcutsHelp","test","hash","Modal","tabindex","keys","action","2","parents","coords","siblings","animations","intersections","mutationObservers","intervals","options","debounces","enabled","root","scrollX","scrollY","TGT","DEL","NEW","handleMutations","mutations","elements","getElements","animate","handleResizes","entries","updateAllPos","updatePos","isOffscreen","rect","vw","vh","observePosition","oldObserver","invocations","buffer","getCoords","offsetWidth","offsetHeight","rootMargin","px","observer","optionsOrPlugin","getOptions","delay","isPlugin","currentAnimation","parent","forEach","lowPriority","poll","callback","resize","supportedBrowser","nodes","mutation","node","i","child","_a","_b","isMounted","preExisting","add","remain","remove","raw","str","getScrollOffset","p","x","y","getTransitionSizes","oldCoords","newCoords","widthFrom","heightFrom","widthTo","heightTo","styles","paddingY","paddingX","getTarget","isEnabled","callbacks","getPluginTuple","pluginReturn","config","animation","pluginOrOptions","deltaLeft","deltaTop","deltaRight","start","end","keyframes","cleanUp","prev","finalX","finalY","top","left","width","height","deletePosition","adjustScroll","styleReset","scrollDeltaX","scrollDeltaY","scrollBefore","lastHeight","lastWidth","startScroll","smoothScroll","deltaY","deltaX","offsetParent","parentStyles","parentCoords","autoAnimate","element","mo","d","a","io","useAutoAnimate","controller","setController","setEnabled","dec2hex","dec","toString","slice","verifier","array","Uint32Array","crypto","getRandomValues","Array","from","join","sha256","plain","data","TextEncoder","encode","subtle","digest","base64urlencode","bytes","Uint8Array","len","byteLength","String","fromCharCode","btoa","replace","generateCodeChallenge","v","hashed","supportsPKCE","instanceURL","res","ok","status","json","code_challenge_methods_supported","includes","__generateCodeChallenge","DEV","PHANPY_CLIENT_NAME","CLIENT_NAME","PHANPY_WEBSITE","WEBSITE","import","SCOPES","sameSite","location","hostname","currentLocation","origin","pathname","REDIRECT_URI","registerApplication","registrationParams","URLSearchParams","client_name","redirect_uris","scopes","website","method","headers","getPKCEAuthorizationURL","client_id","forceLogin","codeVerifier","code_challenge_method","code_challenge","codeChallenge","response_type","authorizationParams","scope","client_secret","code","code_verifier","append","tokenResponse","revokeAccessToken","token","revokeResponse","error","isStandalone","matchMedia","matches","Accounts","getAccounts","currentAccount","moreThanOneAccount","_","reload","useReducer","accountsListParent","tabIndex","account","isCurrent","isDefault","Avatar","url","avatarStatic","onDblClick","log","saveAccounts","NameText","showAcct","setCurrentAccountID","Menu2","menuButton","href","splice","MenuConfirm","subMenu","confirmLabel","menuItemClassName","clientId","clientSecret","store","session","get","Link","logo","regionMaps","LangSelector","i18n","useLingui","populatedLocales","useMemo","LOCALES","lang","regionlessCode","native","localeCode2Text","locale","fallback","CATALOGS","find","c","nativeName","_common","name","sort","b","order","localeCompare","DEFAULT_LANG","onChange","local","set","activateLang","common","createBackendPushSubscription","subscription","push","create","fetchBackendPushSubscription","updateBackendPushSubscription","update","removeBackendPushSubscription","isPushSupported","navigator","getRegistration","serviceWorker","getSubscription","registration","pushManager","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","atob","outputArray","charCodeAt","initSubscription","backendSubscription","err","message","sameEndpoint","sameKey","vapidKey","applicationServerKey","vapidKeyStr","applicationServerKeyStr","policy","DEFAULT_TEXT_SIZE","TEXT_SIZES","PHANPY_PRIVACY_POLICY_URL","PRIVACY_POLICY_URL","PHANPY_TRANSLANG_INSTANCES","TRANSLANG_INSTANCES","PHANPY_IMG_ALT_API_URL","IMG_ALT_API_URL","PHANPY_GIPHY_API_KEY","GIPHY_API_KEY","targetLanguages","Object","languages","tl","TRANSLATION_API_NAME","Settings","currentTheme","themeFormRef","targetLanguage","contentTranslationTargetLanguage","systemTargetLanguage","getTranslateTargetLanguage","systemTargetLanguageText","currentTextSize","prefs","setPrefs","getPreferences","authenticated","expTabBarV2","setExpTabBarV2","disableQuotePolicy","onInput","formData","FormData","theme","documentElement","html","classList","$manualMeta","$autoMetas","m","toggle","defaultChecked","min","max","step","parseInt","setProperty","rel","for","source","newPrefs","setPreferences","supportsNativeQuote","alert","checked","autoRefresh","boostsCarousel","contentTranslation","showCommon","contentTranslationHideLanguages","contentTranslationAutoInline","composerGIFPicker","mediaAltGenerator","getAPIVersions","groupedNotificationsAlpha","shortcutSettingsCloudImportExport","cloakMode","showDrafts","PushNotificationsSection","display","flexWrap","alignItems","marginTop","src","aspectRatio","background","borderRadius","showAccount","readOnly","select","warn","_t2","pushFormRef","setNeedRelogin","previousPolicyRef","allowNotifications","setUIState","needRelogin","alerts","setAllowNotifications","alert2","policyEl","fromEntries","mention","favourite","reblog","follow","followRequest","alertsCount","policyChanged","allowNotifications2","updateSubscription","removeSubscription","catch","isLoading","permission","Notification","focusDeck","timer","columns","getElementById","focusedColumn","focus","firstVisibleColumn","column","getBoundingClientRect","modals","modal","modalFocusElement","pages","page","useLocationChange","useLocation","currentLocationRef","AccountHandleInfo","acct","username","server","split","encodedAcct","punycode","toASCII","SUPPORTED_IMAGE_FORMATS","SUPPORTED_IMAGE_FORMATS_STR","FieldsAttributesRow","index","hasValue","setHasValue","maxLength","required","dir","currentTarget","EditProfileSheet","uiState","setAccount","headerPreview","setHeaderPreview","avatarPreview","setAvatarPreview","acc","verifyCredentials","displayName","avatar","header","note","fields","fieldsAttributesRef","avatarMediaAttachments","headerMediaAttachments","abrupt","fieldsAttributesFields","field","fieldsAttributes","newAccount","header2","file","accept","blob","mediaAttachments","mediaIndex","Math","ENDORSEMENTS_LIMIT","Endorsements","accountID","open","onlyOpenIfHasEndorsements","endorsementsContainer","endorsementsUIState","setEndorsementsUIState","endorsements","setEndorsements","relationshipsMap","setRelationshipsMap","supports","behavior","block","fetchRelationships","relationships","reallyOpen","Loader","AccountBlock","avatarSize","relationship","FETCH_MAX_AGE","MAX_AGE","fetchLists","lists","updatedAt","getLists","fetchList","getList","theList","getListTitle","addListStore","updateListStore","deleteListStore","listID","findIndex","ListExclusiveBadge","insignificant","ListAddEdit","editMode","nameFieldRef","repliesPolicyFieldRef","exclusiveFieldRef","repliesPolicy","exclusive","supportsExclusive","onSubmit","listResult","replies_policy","AddRemoveListsSheet","setLists","listsContainingAccount","setListsContainingAccount","reloadCount","listsContainingAccount2","setShowListAddEditModal","showListAddEditModal","inList","l","accountIds","PrivateNoteSheet","initialNote","onRelationshipChange","textareaRef","trim","newRelationship","comment","TranslatedBioSheet","fieldsText","getHTMLText","text","whiteSpace","TranslationBlock","forceTranslate","MUTE_DURATIONS","MUTE_DURATIONS_LABELS","i18nDuration","RelatedActions","standalone","setShowEditProfile","showEndorsements","renderEndorsements","setRenderEndorsements","currentMasto","currentInstance","currentAuthenticated","sameInstance","relationshipUIState","setRelationshipUIState","setRelationship","locked","lastStatusAt","moved","following","showingReblogs","notifying","followedBy","blocking","blockedBy","muting","mutingNotifications","requested","domainBlocking","endorsed","privateNote","currentInfo","setCurrentInfo","isSelf","setIsSelf","acctWithInstance","supportsEndorsements","currentID","acctHasInstance","results","v2","search","q","resolve","updateAccount","setShowTranslatedBio","setShowAddRemoveLists","showPrivateNoteModal","setShowPrivateNoteModal","showTranslatedBio","showAddRemoveLists","hideTime","position","loading","overflow","lists2","onMenuChange","draftStatus","handle","openTrigger","duration","textOverflow","reloadGenericAccounts","counter","confirm","showReportModal","relationship2","urlObj","host","LIMIT","ACCOUNT_INFO_MAX_AGE","fetchFamiliarFollowers","familiarFollowers","memFetchFamiliarFollowers","fetchPostingStats","fetchStatuses","stats","total","originals","replies","boosts","memFetchPostingStats","fetchAccount","AccountInfo","isString","setInfo","sameCurrentInstance","info2","bot","emojis","group","statusesCount","memorial","roles","hideCollections","headerStatic","headerIsAvatar","infoHasEssentials","account2","updated","headerCornerColors","setHeaderCornerColors","followersIterator","accountInstance","firstLoad","familiarFollowersCache","newValue","familiarFollowers2","familiar","followingIterator","LinkOrDiv","accountLink","postingStats","setPostingStats","renderFamiliarFollowers","setFamiliarFollowers","postingStatsUIState","setPostingStatsUIState","followers","renderPostingStats","onProfileUpdate","isStringURL","skeleton","stopPropagation","onError","ctx","canvas","crossOrigin","onLoad","pixelDimension","rgbColors","OffscreenCanvas","createElement","willReadFrequently","imageSmoothingEnabled","drawImage","colors","g","r","dataLength","lightenRGB","color","handleWithInstance","showMediaModal","internal","handleContentLinks","dangerouslySetInnerHTML","verifiedAt","__html","EmojiText","fetchFollowers","showGenericAccounts","heading","fetchAccounts","excludeRelationshipAttrs","blankCopy","follower","followersCount","shortenNumber","fetchFollowing","followingCount","hasPostingStats","3","_i18n","daysSinceLastPost","luminence","alpha","AccountSheet","propInstance","lookup","skip_webfinger","result","accountWithSameString","startsWith","accountURL","URL","Drafts","drafts","setDrafts","db","ns","getCurrentAccountNS","ownKeys","filter","getMany","hasDrafts","draft","replyTo","quote","updatedAtDate","quoteStatus","MiniDraft","spoilerText","hasPoll","hasMedia","hasQuote","hasPollOrMedia","firstImageMedia","image","objectURL","createObjectURL","EmbedModal","GenericAccounts","postID","isCurrentInstance","showMore","setShowMore","staticAccounts","showReactions","setAccounts","loadRelationships","loadAccounts","done","isArray","theAccount","j","_types","newAccounts","Status","showStats","InView","FORCE_TRANSLATE_LIMIT","MediaAltModal","setForceTranslate","differentLanguage","localeMatch","isShortAlt","supportsTTS","speak","textWrap","sourceLanguage","classToType","obj","unpack","keyOrder","k","PI","TWOPI","PITHIRD","DEG2RAD","RAD2DEG","multiplyMatrices","A","B","B_cols","product","row","col","labConstants","compand","linear","sign","xyz2rgb","z","MtxAdaptMa","MtxAdaptMaI","MtxXYZ2RGB","RefWhiteRGB","Xn","Yn","Zn","LAB_CONSTANTS","As","Bs","Cs","Ad","Bd","Cd","X1","Y1","Z1","X2","Y2","Z2","oklab2rgb","L","rest","X","Y","Z","OKLab_to_XYZ","b_","OKLab","LMStoXYZ","OKLabtoLMS","LMSnl","gammaAdjustSRGB","companded","rgb2xyz","MtxRGB2XYZ","rgb2oklab","xyz","XYZ_to_OKLab","XYZ","XYZtoLMS","LMStoOKLab","LMS","sin","cos","lch2lab","h","oklch2rgb","sqrt","atan2","round","lab2lch","rgb2oklch","MediaModal","statusID","carouselRef","currentIndex","setCurrentIndex","carouselFocusItem","useLayoutEffect","scrollIntoView","prevStatusID","scrollLeft","clientWidth","differentStatusID","scrollTo","isRTL","showControls","setShowControls","handleSwipe","removeEventListener","handleScroll","abs","passive","mediaOkColors","media","blurhash","averageColor","getBlurHashAverageColor","mediaAccentColors","okColor","light","dark","default","mediaAccentGradients","range","lightGradient","darkGradient","toastRef","hideToast","currentColor","$meta","metaColor","mediaColor","colorScheme","content","contains","backgroundAttachment","accentColor","showMediaAlt","description","showOriginal","menuClassName","OpenLinkSheet","linkText","displayUrl","protocol","handleCopy","clipboard","writeText","handleShare","CATEGORIES","CATEGORIES_INFO","spam","legal","violation","stampLabel","other","excludeStamp","findMatchingLanguage","rule","currentLang","translations","availableLanguages","matchedLang","normalizedLanguages","part","region","charAt","toUpperCase","translateRules","rules","_translatedText","ReportModal","domain","translatedRules","currentDomain","getCurrentInstance","selectedCategory","setSelectedCategory","showRules","setShowRules","rulesRef","hasRules","setHasRules","previewMode","useAvatarStatic","showActivity","category","forward","ruleIds","reports","accountId","statusIds","Fragment","maxlength","rows","switch","LZString","f","keyStrBase64","keyStrUriSafe","baseReverseDic","getBaseValue","alphabet","character","input","compressed","uncompressed","buf","TotalLen","current_value","bitsPerChar","getCharFromInt","context_dictionary","context_dictionaryToCreate","context_c","context_wc","context_w","context_enlargeIn","context_dictSize","context_numBits","context_data","context_data_val","context_data_position","ii","resetValue","getNextValue","dictionary","enlargeIn","dictSize","numBits","w","bits","resb","maxpower","power","module","floatingButtonUrl","multiColumnUrl$1","tabMenuBarUrl","MAX_FETCH","fetchFollowedTags","iterator","followedTags","tags","fetchCount","getFollowedTags","fauxDiv","extractTagsFromStatus","hashtagLinks","AsyncText","setText","Promise","then","SHORTCUTS_LIMIT","TYPES","TYPE_TEXT","public","bookmarks","favourites","hashtag","trending","mentions","TYPE_PARAMS","notRequired","placeholder","pattern","fetchAccountTitle","SHORTCUTS_META","path","excludeViewMode","subtitle","query","encodeURIComponent","ShortcutsSettings","shortcuts","showForm","setShowForm","showImportExport","setShowImportExport","shortcutsListParent","fontSize","opacity","textTransform","imgURL","multiColumnUrl","Boolean","shortcut","excludedViewMode","shortcutsArr","temp","shortcutIndex","justifyContent","ShortcutForm","mode","ImportExport","FORM_NOTES","currentType","setCurrentType","followedHashtags","setFollowedHashtags","form","formRef","reset","autocorrect","autocapitalize","tag","spellCheck","shortcutsStr","compressToEncodedURIComponent","setImportShortcutStr","parsedImportShortcutStr","setImportUIState","importShortcutStr","parsed","decompressFromEncodedURIComponent","hasCurrentSettings","shortcutsImportFieldRef","match","dt","s","some","importUIState","menuFooter","nonUniqueShortcuts","exceededLimit","newShortcuts","settingsJSON","newNote","changes","prevValue","Modals","navigate","useNavigate","preload","ComposeSuspense","__COMPOSE__","replyMode","editStatus","newStatus","scheduledAt","reloadStatusPage","reloadScheduledPosts","reply","edit","toast","prevLocation","showSettings","showAccounts","destination","showOpenLink","showShortcutsSettings","showEmbedModal","NavigationCommand","hotkeyOptions","FollowRequestButtons","requestState","setRequestState","hasRelationship","followRequests","authorize","Error","NOTIFICATION_ICONS","follow_request","severed_relationships","moderation_warning","emoji_reaction","annual_report","quoted_update","emojiText","emoji","emoji_url","staticUrl","emojiObject","CustomEmoji","contentText","count","postsCount","postType","Subject","clickable","poll-self","poll-voted","favourite+reblog","admin.sign_up","admin.report","targetAccount","year","SEVERED_RELATIONSHIPS_TEXT","account_suspension","targetName","domain_block","user_domain_block","MODERATION_WARNING_TEXT","none","disable","mark_statuses_as_sensitive","delete_statuses","sensitive","silence","suspend","AVATARS_LIMIT","isStatic","disableContextMenu","report","annualReport","_ids","_accounts","_statuses","_groupKeys","sampleAccounts","notificationsCount","groupKey","_notificationsCount","_sampleAccountsCount","actualStatus","actualStatusID","isVoted","voted","isReplyToOthers","inReplyToAccountId","favsCount","reblogsCount","props","handleOpenGenericAccounts","diffCount","expandAccounts","showAvatar","emojiURL","shortcode","formattedCreatedAt","genericAccountsHeading","statusKey","filtered","isOwnPost","filterInfo","isFiltered","type2","gKey","keyAccounts","keyAccount","_accounts2","status2","allowContextMenu","TruncatedLink","dispatchEvent","clientX","clientY","allowFilters","useTruncated","Notification$2","oldProps","newProps","accessToken","NotificationService","routeNotification","showNotificationSheet","notificationAccount","hasModal","hasStatus","clearAppBadge","id2","setShowNotificationSheet","getSearchHistory","history","MAX_HISTORY_LENGTH","addToSearchHistory","queryType","existingIndex","item","unshift","timestamp","limitedHistory","removeFromSearchHistory","filteredHistory","clearAllSearchHistory","generateSearchItemData","hashSymbol","hashtagText","SearchForm","forwardRef","searchParams","setSearchParams","useSearchParams","searchMenuOpen","setSearchMenuOpen","setQuery","searchFieldRef","useImperativeHandle","setValue","blur","searchHistory","searchSuggestionsData","recentSearchItems","historyItem","isRecentSearch","autocomplete","onSearch","onFocus","firstItem","onBlur","onKeyDown","focusItem","nextItem","nextElementSibling","parentElement","prevItem","previousElementSibling","items","lastItem","click","SearchCommand","showSearch","setShowSearch","searchFormRef","isSearchPage","closeSearch","enableOnFormTags","Shortcuts","isMultiColumnMode","shortcutsColumnsMode","tabBarRef","hasLists","formattedShortcuts","pin","timeoutId","activeTab","inline","scrollTop","updatesButton","instanceRef","viewScroll","getComputedStyle","Shortcuts$1","groupBoosts","newValues","boostStash","serialBoosts","boostStashID","half","floor","dedupeBoosts","boostedStatusIDs","filteredItems","boosterID","groupContext","contextIndex","contexts","repliedItem","self","inReplyToId","firstItemAccountID","newItems","appliedContextIndices","inReplyToIds","contextItems","every","it","sKey","statusReply","queueMicrotask","fallbackFetch","fetchStatus","saveStatus","ids","replyToStatuses","assignFollowedTags","statusFollowedTags","statusWithFollowedTags","extractedTags","itemFollowedTags","useScroll","scrollableRef","distanceFromStart","distanceFromEnd","scrollThresholdStart","scrollThresholdEnd","distanceFromStartPx","_distanceFromStartPx","distanceFromEndPx","_distanceFromEndPx","scrollDirection","setScrollDirection","reachStart","setReachStart","reachEnd","setReachEnd","nearReachStart","setNearReachStart","nearReachEnd","setNearReachEnd","isVertical","scrollableElement","previousScrollStart","onScroll","scrollHeight","scrollWidth","clientHeight","scrollStart","scrollDimension","clientDimension","scrollDistance","init","Event","useScrollFn","useThrottledCallback","scrollDelta","isScrollingForward","leading","resetScrollDirection","MediaPost","onMediaClick","accountEmojis","repliesCount","reblogged","favourited","favouritesCount","bookmarked","muted","visibility","language","editedAt","card","uri","_deleted","_pinned","debugHover","filterContext","useContext","FilterContext","showSpoilerMedia","hasSpoiler","readingExpandMedia","filterTitleStr","Media","MediaPost$1","NavMenu","showFollowing","detect","cancelOnMovement","menuState","setMenuState","mutesIterator","fetchMutes","mutes","blocksIterator","fetchBlocks","blocks","buttonClickTS","squircle","commitHash","__COMMIT_HASH__","ListMenu","supportsLists","NavMenu$1","scrollIntoViewOptions","Timeline","titleComponent","emptyText","errorText","useItemID","fetchItems","checkForUpdatesInterval","headerStart","headerEnd","timelineStart","refresh","view","showFollowedTags","showReplyParent","clearWhenRefresh","setItems","showNew","setShowNew","debug","__BENCHMARK","isMediaFirstInstance","mediaFirst","allowGrouping","loadItemsTS","firstLoad2","loadItems","useDebouncedCallback","ts","otherPosts","pinnedPosts","items2","jRef","handler","itemsSelector","activeItem","activeElement","activeItemRect","allItems","activeItemIndex","indexOf","itemRect","topmostItem","kRef","showNewPostsIndicator","handleLoadNewPosts","scrollFnCallback","headerRef","hiddenUI","cancel","prevView","disableIdleCheck","loadOrCheckUpdates","inBackground","noPointers","__IDLE__","visible2","lastHiddenTime","dotRef","Provider","oRef","TimelineItem","inView","marginBlockEnd","fItems","aFiltered","bFiltered","filteredItemsIDs","isCarousel","unfiltered","filteredItems2","StatusCarousel","_grouped","_pinned2","item2","_pinned3","actualStatusID3","reblog3","statusID3","statusID2","actualStatusID2","reblog2","url2","contentTextWeight","manyItems","enableCommentHint","isMiddle","showCompact","_differentAuthor","isSpoiler","isStart","isEnd","TimelineStatusCompact","itemKey","oldID","newID","setRender","render","startButtonRef","_t3","endButtonRef","_t4","statusPeekText","ThreadBadge","titlesStr","MIN_YEAR","MIN_YEAR_MONTH","supportsInputMonth","mem","setAttribute","_isSearchEnabled","isSearchEnabled","AccountStatuses","useParams","month","excludeReplies","excludeBoosts","tagged","accountStatusesIterator","allSearchParams","searchOffsetRef","searchEnabled","setSearchEnabled","isValidMonth","_month","monthIndex","after","_year","afterStr","before","beforeStr","searchResults","done2","offset","value2","pinnedStatuses","pinned","pinnedStatusesIds","postId","featuredTags","setFeaturedTags","acctDisplay","accountDisplay","monthYear","fetchAccount2","featuredTags2","useTitle","TimelineStart","cachedAccount","filterBarRef","month2","date","validity","MonthPicker","active","valid","allowSwitch","offsetLeft","fetchAccountStatuses","masto2","stringify","minYear","maxYear","minMonth","maxMonth","yearFieldRef","checkValidity","monthFieldRef","AnnualReport","setResults","annualReports","report2","datePlaceholder","Bookmarks","bookmarksIterator","fetchBookmarks","catchupUrl","FILTER_CONTEXT","RANGES","FILTER_KEYS","original","quotes","groups","FILTER_SORTS","FILTER_GROUPS","DTF","Intl","DateTimeFormat","day","hour","minute","quotedStatus","Catchup","dtf","showTopLinks","setShowTopLinks","supportsPixelfed","fetchHome","maxCreatedAt","allResults","homeIterable","homeIterator","mainloop","addedResults","createdAtTime","selfPost","_filtered","_followedTags","catchupRangeRef","catchupLastRef","handleCatchupClick","catchupID","catchup","setPosts","reloadCatchups","setLastCatchupEndAt","prevCatchups","setPrevCatchups","lastCatchupEndAt","catchups","ownCatchups","lastCatchups","restCatchups","startAt","endAt","trimmedCatchups","reloadCatchupsCount","__FILTER","thePost","links","links2","sharers","likes","link","topLinks","shared","linksLoop","authors","authorCounts","selectedFilterCategory","setSelectedFilterCategory","filteredPosts2","setSelectedAuthor","sortBy","authorsHash","setSortOrder","authorCountsMap","setGroupBy","filteredPosts","postFilterMatches","boostedPosts","__BOOSTERS","selectedAuthor","filteredPostsMap","authorID","authorCountsList","sortedFilteredPosts","aAccountID","authorIndices","bIndex","bAccountID","aIndex","postDensity","bDensity","aDensity","sortOrder","groupBy","prevGroup","authorsListParent","autoAnimated","isFiltered2","postsBarType","posts2","postsBins","bins","binByTime","lastCatchupRange","sortOrderIndex","authorElement","scrollableRect","authorRect","right","showHelp","setShowHelp","hlRef","_2","isRadio","handleArrowKeys","escRef","isArrowKeys","closest","setRange","pc","st","yes","del","formatRange","setSortBy","transform","imageDescription","publishedAt","labAverageColor","postsBar","filterCounts","author","paddingInline","showSeparator","IntersectionPostLineItem","PostLine","isFollowedTags","isReplyTo","onMouseEnter","setShow","show","IntersectionObserver","unobserve","MEDIA_DENSITY","CARD_DENSITY","pollContent","cur","htmlContentLength","PostPeek","_thread","isThread","theQuote","readingExpandSpoilers","postText","showPostContent","emojifyText","o","remoteMediaURL","showMedia","mediaURL","MEDIA_SIZE","previewUrl","gifv","video","audio","quotesCount","PostStats","numBins","dates","minDate","maxDate","normalized","binIndex","Favourites","favouritesIterator","fetchFavourites","FILTER_CONTEXT_UNIMPLEMENTED","FILTER_CONTEXT_LABELS","home","thread","EXPIRY_DURATIONS","EXPIRY_DURATIONS_LABELS","Filters","showFiltersAddEditModal","setShowFiltersAddEditModal","filters","setFilters","keywords","expiresAt","keyword","ExpiryStatus","FiltersAddEdit","_id","incID","filterAction","hasExpiry","expiresAtDate","editKeywords","setEditKeywords","keywordsRef","setRemovedKeyword_IDs","filteredEditKeywords","setRemovedKeywordIDs","removedKeyword_IDs","keywordIDs","getAll","keywordKeywords","keywordWholeWords","keywordsAttributes","wholeWord","removedKeywordIDs","context2","expiresIn","wholeWords","filterResult","filterAction2","_id2","showNeverExpires","expired","rerender","FollowedHashtags","Following","client","streamingClient","setStreamingClient","latestItem","onStreamingReady","latestItemChanged","clearFollowedTagsState","include_reblogs","valueContainsLatestItem","getStatus","TAGS_LIMIT_PER_MODE","TOTAL_TAGS_LIMIT","Hashtags","mediaView","hashtags","linkParams","hashtagTitle","maxID","fetchHashtags","timelines","any","maxId","onlyMedia","since_id","followUIState","setFollowUIState","reachLimit","featuredUIState","setFeaturedUIState","isFeaturedTag","setIsFeaturedTag","setDownOverflow","finally","featuredTagID","delete","FocusableItem","newHashtag","MenuGroup","exists","newInstance","List","listIterator","setList","showManageMembersModal","setShowManageMembersModal","list2","MenuHeader","ListManageMembers","MEMBERS_LIMIT","members","setMembers","membersIterator","fetchMembers","member","as","RemoveAddButton","setRemoved","removed","notificationTypeKeys","GROUP_TYPES","groupable","fixNotifications","massageNotifications2","notificationGroups","sampleAccountIds","statusId","groupNotifications2","groupNotifications","newGroupNotifications","gn","latestPageNotificationAt","mostRecentNotificationId","newGroupNotifications1","notificationsMap","virtualType","sampleCountDiffNotificationsCount","mappedNotification","ma","mappedAccount","newGroupNotifications2","notificationsMap2","toLocaleDateString","hasOneAccount","n","cleanNotifications","reverse","cleanNotifications2","emptySearchParams","Mentions","stateType","setStateType","mentionsIterator","fetchMentions","types","conversationsIterator","latestConversationItem","lastStatus","fetchConversations","NOTIFICATIONS_LIMIT","NOTIFICATIONS_GROUPED_LIMIT","memSupportsGroupedNotifications","mastodon","mastoFetchNotificationsIterable","mastoFetchNotifications","getGroupedNotifications","NOTIFICATIONS_POLICIES","NOTIFICATIONS_POLICIES_TEXT","forNotFollowing","forNotFollowers","forNewAccounts","forPrivateMentions","forLimitedAccounts","Notifications","notificationID","notificationAccessToken","onlyMentions","setOnlyMentions","setFollowRequests","announcements","setAnnouncements","notificationsIterable","allNotifications","groupedNotifications","notificationsLastFetchTime","fetchFollowRequests","loadFollowRequests","requests","fetchAnnouncements","supportsFilteredNotifications","showNotificationsSettings","setShowNotificationsSettings","notificationsPolicy","setNotificationsPolicy","fetchNotificationsPolicy","loadNotificationsPolicy","notificationsRequests","setNotificationsRequests","fetchNotificationsRequest","loadNotifications","fetchNotificationsPromise","fetchNotifications","loadUpdates","unsub","subscribeKey","yesterdayDate","todayDate","currentDay","showTodayEmpty","announcementsListRef","annualReportNotification2","setAnnualReportNotification","annualReportNotification","annualReportYear","getFullYear","statusLink","todaySubHeading","today","forceOpts","announcement","onToggle","request","summary","pendingRequestsCount","NotificationRequestModalButton","differentDay","notificationDay","subHeading","newPolicy","AnnouncementBlock","contact","contactAccount","startsAt","endsAt","published","allDay","reactions","read","publishedDateText","updatedAtText","publishedAtDate","reaction","me","fetchNotficationsByAccount","showModal","setShowModal","notifs","setNotifications","NotificationRequestButtons","hasRequestState","Notifications$1","Public","isLocal","publicIterator","fetchPublic","remote","prompt","RecentSearches","onItemClick","handleClearAll","handleRemoveItem","listRef","SHORT_LIMIT","Search","offsetRef","statusResults","setStatusResults","accountResults","setAccountResults","hashtagResults","setHashtagResults","typeResults","setTypeResultsFunc","loadResults","filterBarParent","reduce","TREND_CACHE_TIME","fetchLinks","trends","fetchTrendsStatuses","pixelfed","discover","fetchLinkList","Trending","setHashtags","setLinks","trendIterator","fetchTrends","currentLinkMentionsLoading","setCurrentLinkMentionsLoading","currentLinkMentionsIterator","currentLink","setCurrentLink","hasCurrentLink","supportsTrendingLinkPosts","currentLinkRef","prevCurrentLink","authorUrl","authorName","providerName","providerUrl","isShortTitle","title2","hasAuthor","flexShrink","textAlign","fetchLinkMentions","Columns","Component","Hashtag","$column","currentFocusedColumn","prevColKey","nextColKey","Home","NotificationsLink","notificationLinkRef","NotificationsMenu","NOTIFICATIONS_DISPLAY_LIMIT","hasFollowRequests","setHasFollowRequests","skipFollowRequests","headerHeight","Home$1","statusPostRegexes","getInstanceStatusObject","theURL","regex","getInstanceStatusURL","HttpRoute","statusObject","statusURL","Lists","hasExclusiveLists","instancesListURL","PHANPY_DEFAULT_INSTANCE","DEFAULT_INSTANCE","Login","instanceURLRef","cachedInstanceURL","submit","instanceText","setInstanceText","instancesList","setInstancesList","searcher","Fuse","submitInstance","xmlDoc","DOMParser","parseFromString","getElementsByTagName","template","getCredentialApplication","credentialApplication","storeCredentialApplication","authPKCE","cleanInstanceText","instanceTextLooksLikeDomain","instancesSuggestions","instance2","selectedInstanceText","ScheduledPosts","scheduledPosts","setScheduledPosts","showScheduledPostModal","setShowScheduledPostModal","postsIterator","scheduledStatuses","allPosts","quotedStatusId","quoteApprovalPolicy","option","votesCount","ScheduledPostPreview","ScheduledPostEdit","hours","formatOpts","weekday","differentScheduledAt","setNewScheduledAt","newScheduledAt","localTZ","getLocalTimezoneName","pastSchedule","ScheduledAtField","setScheduledAt","EditHistoryControls","prevEditedAt","nextEditedAt","editedAtIndex","editHistoryMode","editHistoryRef","exitEditHistory","useEditHistory","SUBCOMMENTS_OPEN_ALL_LIMIT","MAX_WEIGHT","cachedRepliesToggle","cachedStatusesMap","scrollPositions","resetScrollPosition","STATUSES_SELECTOR","STATUS_URL_REGEX","StatusPage","mediaParam","mediaOnlyParam","mediaStatusID","mediaStatus","showMediaOnly","heroStatus","setHeroStatus","closeLink","matchStatusPath","matchPath","postViewState","mediaClose","mediaAttachments2","handleMediaClose","mediaVTN","getSafeViewTransitionName","els","foundEls","el2","elBounds","innerHeight","transition","startViewTransition","viewTransitionName","viewTransitioned","$carousel","$deckContainer","$deckContainers","linkable","restProps","createdAtSort","MONTH_IN_MS","StatusThread","setViewMode","totalDescendants","setStatuses","heroStatusRef","scrollOffsets","fullContext","initEditHistory","threadsCount","currentEditedAtStatus","nextEditedAtStatus","descendants","sCreatedAt","currentEditedAtStatusCreatedAt","nextEditedAtStatusCreatedAt","ancestors2","ancestors","ancestorsIsThread","heroStatus2","nestedDescendants","missingStatuses","heroAccountID","descendantLevelsCount","__replies","level","nextLevel","_replies","_r","expandReplies","calcStatusWeight","descendant","weight","mappedNestedDescendants","reloadHero","ancestor","reallyCachedStatuses","allStatuses","contextFetch","pRetry","initContext","heroTimer","cachedStatuses","retries","restructureContext","descendantsThread","threadsCount2","heroFetch","heroLimit","threadifyStatus","setThreadsCount","setShowRefresh","interval","offsetTop","lastInitContextTS","setLimit","scrollPosition","newScrollOffsets","newScrollTop","showRefresh","contextURL","statusWeightCache","heroContentText","heroDisplayName","postInstance","apiCache","ignoreVary","postSameInstance","heroInView","setHeroInView","activeStatusRect","activeStatus","allStatusLinks","activeStatusIndex","nextStatus","statusLinkRect","topmostStatusLink","heroPointer","prevStatus","details","initialPageState","handleMediaClick","handleStatusLinkClick","renderStatus","isHero","tagName","reachTopPost","requestAnimationFrame","withinContext","enableTranslate","translate","StatusParent","setReachTopPost","SubComments","isLinkable","hasDescendants","showActionsBar","prevEntry","moreStatusesKeys","getIDs","hasParentThread","accWeight","months","slicedStatuses","prevLocationIsStatusPage","currentDate","prevDate","prevID","monthsDiff","years","spoilerButton","ThreadCountContext","statusesList","viewMode","isFinite","onAnimationEnd","back","short","arr","button","buttons","openAll","parentLink","diveDeep","replies3","sameCount","totalComments","totalWeight","openBefore","detailsRef","setRenderReplies","Container","isDetails","shortReply","dataset","renderReplies","cachedWeight","POLL_VIRTUAL_LENGTH","cardLength","CARD_VIRTUAL_LENGTH","mediaLength","pollLength","StatusRoute","boostsCarouselUrl","groupedNotificationsUrl","multiHashtagTimelineUrl","nestedCommentsThreadUrl","logoText","PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL","DEFAULT_INSTANCE_REGISTRATION_URL","appSite","__BUILD_TIME__","Welcome","nativeAlert","__nativeAlert","Toastify","gravity","__STATES__","__STATES_STATS__","counts","unmountedPosts","setInterval","unfurledLinks","postInNotifications","$post","unfurled","keysCount","ICONS","nonIdleEvents","setIdle","debouncedSetIdle","onNonIdle","capture","relatedTarget","isIOS","showingMediaModal","textSize","$app","$body","BENCHES","__BENCH_RESULTS","App","setIsLoggedIn","decodeURIComponent","getVapidKey","vapid_key","clientID","getAccessToken","initStates","initClient","searchAccount","__IGNORE_GET_ACCOUNT_ERROR__","getAccount","hasPreferences","hasInstance","initPreferences","initInstance","sessionCookie","Routes","Route","Root","PrimaryRoutes","nonRootLocation","Sandbox","backgroundLocation","getPrevLocation","isModalPage","initActivateLang","initPWAViewport","I18nProvider","HashRouter","IconSpriteProvider","localStorage","removeItem","sessionStorage","caches","IGNORE_CACHE_KEYS","clearRanOnce","FAST_INTERVAL","SLOW_INTERVAL","clearCaches","cache","_keys","MAX_SW_CACHE_SIZE","deleteKeys"],"mappings":"+yCAAA,IAAIA,GAAmBC,GAEvB,SAASA,GAASC,EAAIC,EAAMC,EAAW,CACrC,IAAIC,EAAU,KACVC,EAAc,KAEdC,EAAQ,UAAW,CACjBF,IACF,aAAaA,CAAO,EAEpBC,EAAc,KACdD,EAAU,KAEd,EAEIG,EAAQ,UAAW,CACrB,IAAIC,EAAOH,EACXC,EAAK,EAEDE,GACFA,EAAI,CAER,EAEIC,EAAkB,UAAW,CAC/B,GAAI,CAACP,EACH,OAAOD,EAAG,MAAM,KAAM,SAAS,EAGjC,IAAIS,EAAU,KACVC,EAAO,UACPC,EAAUT,GAAa,CAACC,EAkB5B,GAjBAE,EAAK,EAELD,EAAc,UAAW,CACvBJ,EAAG,MAAMS,EAASC,CAAI,CACxB,EAEAP,EAAU,WAAW,UAAW,CAG9B,GAFAA,EAAU,KAEN,CAACQ,EAAS,CACZ,IAAIJ,EAAOH,EACX,OAAAA,EAAc,KAEPG,EAAI,CACb,CACF,EAAGN,CAAI,EAEHU,EACF,OAAOP,EAAW,CAEtB,EAEA,OAAAI,EAAgB,OAASH,EACzBG,EAAgB,MAAQF,EAEjBE,CACT,EClDC,SAAUI,EAAQC,EAAU,CAEzB,aAGI,OAAOD,EAAO,aAAgB,aAE9BA,EAAO,YAAc,SAAUE,EAAOC,EAAQ,CAE1CA,EAASA,GAAU,CAAE,QAAS,GAAO,WAAY,GAAO,OAAQ,MAAS,EAEzE,IAAIC,EAAMH,EAAS,YAAY,aAAa,EAC5C,OAAAG,EAAI,gBAAgBF,EAAOC,EAAO,QAASA,EAAO,WAAYA,EAAO,MAAM,EACpEC,CACX,EAEAJ,EAAO,YAAY,UAAYA,EAAO,MAAM,WAGhDC,EAAS,iBAAiB,aAAcI,EAAkB,EAAK,EAC/DJ,EAAS,iBAAiB,YAAaK,EAAiB,EAAK,EAC7DL,EAAS,iBAAiB,WAAYM,EAAgB,EAAK,EAE3D,IAAIC,EAAQ,KACRC,EAAQ,KACRC,EAAQ,KACRC,EAAQ,KACRC,EAAW,KACXC,EAAU,KACVC,EAAa,EAOjB,SAASP,EAAeQ,EAAG,CAGvB,GAAIF,IAAYE,EAAE,OAElB,KAAIC,EAAiB,SAASC,EAAoBJ,EAAS,uBAAwB,IAAI,EAAG,EAAE,EACxFK,EAAYD,EAAoBJ,EAAS,kBAAmB,IAAI,EAChEM,EAAe,SAASF,EAAoBJ,EAAS,qBAAsB,KAAK,EAAG,EAAE,EACrFO,EAAW,KAAK,IAAG,EAAKR,EACxBS,EAAY,GACZC,EAAiBP,EAAE,gBAAkBA,EAAE,SAAW,CAAA,EA4BtD,GA1BIG,IAAc,OACdF,EAAiB,KAAK,MAAOA,EAAiB,IAAOf,EAAS,gBAAgB,YAAY,GAE1FiB,IAAc,OACdF,EAAiB,KAAK,MAAOA,EAAiB,IAAOf,EAAS,gBAAgB,WAAW,GAGzF,KAAK,IAAIS,CAAK,EAAI,KAAK,IAAIC,CAAK,EAC5B,KAAK,IAAID,CAAK,EAAIM,GAAkBI,EAAWD,IAC3CT,EAAQ,EACRW,EAAY,cAGZA,EAAY,gBAIf,KAAK,IAAIV,CAAK,EAAIK,GAAkBI,EAAWD,IAChDR,EAAQ,EACRU,EAAY,YAGZA,EAAY,eAIhBA,IAAc,GAAI,CAElB,IAAIE,EAAY,CACZ,IAAKF,EAAU,QAAQ,UAAW,EAAE,EACpC,WAAYC,EAAe,CAAC,GAAK,CAAA,GAAI,WAAa,SAClD,QAASR,EACT,OAAQ,SAASN,EAAO,EAAE,EAC1B,KAAM,UAAUc,EAAe,CAAC,GAAK,CAAA,GAAI,SAAW,GAAI,EAAE,EAC1D,OAAQ,SAASb,EAAO,EAAE,EAC1B,KAAM,UAAUa,EAAe,CAAC,GAAK,IAAI,SAAW,GAAI,EAAE,CAC1E,EAGYT,EAAQ,cAAc,IAAI,YAAY,SAAU,CAAE,QAAS,GAAM,WAAY,GAAM,OAAQU,CAAS,CAAE,CAAC,EAGvGV,EAAQ,cAAc,IAAI,YAAYQ,EAAW,CAAE,QAAS,GAAM,WAAY,GAAM,OAAQE,CAAS,CAAE,CAAC,CAC5G,CAGAf,EAAQ,KACRC,EAAQ,KACRG,EAAW,KACf,CAMA,SAASP,EAAiBU,EAAG,CAGrBA,EAAE,OAAO,aAAa,mBAAmB,IAAM,SAEnDF,EAAUE,EAAE,OAEZH,EAAW,KAAK,IAAG,EACnBJ,EAAQO,EAAE,QAAQ,CAAC,EAAE,QACrBN,EAAQM,EAAE,QAAQ,CAAC,EAAE,QACrBL,EAAQ,EACRC,EAAQ,EACRG,EAAaC,EAAE,QAAQ,OAC3B,CAOA,SAAST,EAAgBS,EAAG,CAExB,GAAI,GAACP,GAAS,CAACC,GAEf,KAAIe,EAAMT,EAAE,QAAQ,CAAC,EAAE,QACnBU,EAAMV,EAAE,QAAQ,CAAC,EAAE,QAEvBL,EAAQF,EAAQgB,EAChBb,EAAQF,EAAQgB,EACpB,CASA,SAASR,EAAoBS,EAAIC,EAAeC,EAAc,CAG1D,KAAOF,GAAMA,IAAOzB,EAAS,iBAAiB,CAE1C,IAAI4B,EAAiBH,EAAG,aAAaC,CAAa,EAElD,GAAIE,EACA,OAAOA,EAGXH,EAAKA,EAAG,UACZ,CAEA,OAAOE,CACX,CAEJ,GAAE,OAAQ,QAAQ,ECpKH,SAASE,GAAkB1C,EAAKA,IAAM,CAAC,EAAG2C,EAAO,CAAA,EAAI,CAClE,MAAMC,EAAgBC,EAAO7C,CAAE,EAC/B8C,EAAU,IAAM,CACdF,EAAcG,QAAU/C,CAC1B,EAAG,CAAC2C,CAAI,CAAC,EAETG,EAAU,IAAM,CACd,MAAME,EAAyBA,IAAM,CACnC,MAAMC,EAASpC,SAASoC,QAAUpC,SAASqC,kBAAoB,SAC/DC,EAAY,QAAA,CAAAF,CAAA,CACZL,EACF,gBAAC,iBAAA,mBAAAI,CAAA,EAEDnC,IAASuC,SAAAA,oBAAiB,oBAA2C,GACrE,CAAA,CAAA,ECLJ,MAAMC,GAAoB,IAAO,EAC3BC,GAAgB,IAEtBC,GAAeC,GAAK,SAA2B,CAAEC,WAAAA,CAAW,EAAG,CAC7D,KAAM,CAAEC,EAAAA,CAAAA,EAAGC,GAAAA,EAIL,CAACC,EAASC,CAAU,EAAIC,EAAS,EAAI,EACrCC,EAAiBlB,EAAAA,EACvBH,GAAmBkB,GAAY,CAC7BI,aAAaD,EAAehB,OAAO,EAC/Ba,EACFC,EAAW,EAAI,EAEfE,EAAehB,QAAUkB,WAAW,IAAM,CACxCJ,EAAW,EAAK,CAClB,EAAGP,EAAa,CAEpB,CAAC,EAED,MAAMY,EAA0B,MAAOC,EAAOC,EAAUC,IAAqB,CAC3E,GAAIC,EAAOC,kBAAmB,CAC5B,MAAMC,EAAwBL,EAAMM,GAAGC,cACpCC,KAAK,CACJC,MAAO,EACPC,QAASP,EAAOC,kBAAkBO,EAAAA,CACnC,EACAC,OAAAA,EACG,CAAEC,MAAON,CAAAA,EAAkB,MAAMF,EAAsBS,KAAAA,EAC7D,GAAIP,GAAeQ,OACjB,GAAIb,EACFC,EAAOa,qBAAuB,OACzB,CACL,IAAIC,EACJ,GAAI,CAIFA,GAHgB,MAAMjB,EAAMM,GAAGY,QAAQC,MAAM,CAC3CC,SAAU,eAAA,CACX,IACqBb,eAAeU,UACvC,MAAY,CAAC,CACTA,EACFd,EAAOa,qBAAuBT,EAAc,CAAC,EAAEI,KAAOM,EAEtDd,EAAOa,qBAAuB,EAElC,CAEJ,CACF,EAEArC,EAAU,IAAM,CACd,IAAI0C,EACAC,EACAC,EACJ,GAAIjC,GAAcG,EAAS,CACzB,KAAM,CAAEO,MAAAA,EAAOwB,UAAAA,EAAWvB,SAAAA,CAAAA,EAAawB,GAAAA,GACtC,SAAY,CAEX,MAAM1B,EAAwBC,EAAOC,CAAQ,EAE7C,IAAIyB,EAAe,GAEfF,IACFF,EAAgBxB,WAAW,IAAM,EAC9B,SAAY,CACX,GAAI,CACF4B,EAAe,GACfL,EAAMG,EAAUG,KAAKC,aAAaC,UAAAA,EAClC7C,wBAEE,GADF,CAAAqC,GACM,CAACA,EAAK,MACNS,EAACrC,QAAS,gBACdT,gBACI8C,gBACF9C,CAAAA,EACoCmB,EAClC4B,qBAAe,EAAA,CAChB,MACH,CACA5B,EAAOa,EAAuB,CAEhChC,MACU,YAAA,IAAA,CACV0C,EAAe1B,EAAAC,EAAA,EAAA,CACfjB,EAAAA,EAAe,EAGjB,GAAA,CACEA,EAAAA,EAAY,EAEVe,GAAAA,CAA6C,CAC/B,MAAA,IAClB,CAAAsB,GAAA,cACC,EAAAA,OACe,aACtBC,CAAA,EACF,cAAGC,CAAA,CACL,CACA,EAAA,CAAA9B,EAAOH,CAAM,CAAA,EACX+B,MAAAA,EAAKW,EAAc,EACnBX,EAAM,IAAA,CACNxB,EAAAA,QAAayB,KAAa,IAAA,EAC1BW,MAAAA,gBAAcV,EAAAA,KAAAA,GAAiB,EAAA,MAAA,EAAA,KAAAW,GAAA,CACjCA,IAAA/B,EAAA,WAAA+B,EACF,CAAG,EAACzC,MAAAA,GAASH,CAAAA,CAAAA,CAGb,EACA,OAAA6C,KAAwBC,GAAM,IAAA,GAAA,EAAA,EAC5BC,GAAczD,GAAe0D,CAC7BtD,IACMqD,EAAA,QAMa,KAAA,IAAA,EAAAA,EAAA,QAChB,IAAA,GAAA,IACLD,EAAA,EALMA,EAAiBG,EASnB,CAAA,EACEH,GAAAA,cAAgB5E,GAAA,CAAA,GAClB,CAAAA,EAAA,UAAO,CAAAA,EAAA,OAAA,OACL,MAAAgF,EAAkBF,EAAQD,SAAAA,UAC1BlC,EAAA,SAAW,UAAY,CAAAqC,EAErBJ,GAAAA,CAAgB,KAClBK,EAAAD,EAEJ,CACD,GAAA,QAGDE,EAOIvC,CACAwC,GAAU,QAAA,CAJV,CAKwBF,CAAAA,CAAG,EAAA,CAAA,OAAqB,GAAA,gBAACA,GAAAA,EAAAA,SAAAA,EAAAA,OAAAA,CAAAA,EAAG,IAAA,CAAA,ECnIpDG,GAA2BC,GAC/B,MAAO7C,EAAO8C,IAAqB,CACjC,MAAMC,EAAmB/C,EAAMM,GAAG0C,SAC/BC,QAAQH,CAAgB,EACxBI,SAAS1C,KAAK,CACbC,MAAO,EACP0C,gBAAiB,GACjBC,gBAAiB,EAAA,CAClB,EACAxC,OAAAA,EACG,CAAEC,MAAAA,CAAAA,EAAU,MAAMkC,EAAiBjC,KAAAA,EACzC,OAAOD,GAAS,CAAA,CAClB,EACA,CAAEwC,OAAQ,GAAM,CAClB,EAEA,SAAwBC,IAAgB,CACtC,KAAM,CAAE/D,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B,CAAEH,MAAAA,CAAAA,EAAUyB,GAAAA,EAGZ,CAACgC,EAAUC,CAAW,EAAI/D,EAAS,EAAK,EACxC,CAACgE,EAAaC,CAAc,EAAIjE,EAAS,CAAA,CAAE,EAC3C,CAACkE,EAAcC,CAAe,EAAInE,EAAS,EAAK,EAChDoE,EAAYrF,EAAO,IAAI,EACvBsF,EAAUtF,EAAO,IAAI,EAErBuF,EAAaV,EAAWW,SAASC,oBAAsB,eAE7D,SAASC,EAAa5G,EAAG,CAGvB,GAAIA,EAAE6G,KAAO7G,EAAE6G,IAAIC,YAAAA,IAAkB,IAAK,OAE1C,GAAIf,EAAWgB,cAAcC,UAAW,CACtCrE,EAAOoE,cAAcC,UAAY,GACjCC,GAAAA,EACA,MACF,CAEA,MAAMC,EAAsBhI,SAASiI,iBAAiB,mBAAmB,EAEnEC,EACJ,CAACX,GAAcS,EAAoB3D,SAAW,EAC1C8D,KAAKC,MAAMJ,EAAoB,CAAC,EAAE7D,KAAK,EACvCkE,OAEFvH,EAAEwH,SACWC,GAAYL,CAAI,IAG7BzE,EAAO+E,YAAcN,GAAQ,KAG/BH,GAAAA,EACAtE,EAAO+E,YAAcN,GAAQ,GAEjC,CAEAlC,GAAW,aAAc0B,EAAc,CACrCe,OAAQ,GACRC,gBAAkB5H,GACC,CAAC,CAACd,SAAS2I,cAAc,sBAAsB,GAC7C7H,EAAE8H,SAAW9H,EAAE+H,SAAW/H,EAAEgI,MACjD,CACD,EAGD,MAAMC,EAAgBC,GACpB,IAAM,CACJhC,EAAY,EAAI,CAClB,EACA,CACEiC,UAAW,GAAA,CAEf,EAEMC,EAAmBC,GAAY,SAAY,CAC/C,GAAI,CACF/B,EAAgB,EAAI,EACpB,MAAMhB,EAAmBgD,GAAAA,EACzB,GAAI,CAAChD,EACH,OAEF,MAAMiD,EAAQ,MAAMnD,GAAyB5C,EAAO8C,CAAgB,EACpEc,EAAemC,CAAK,CACtB,MAAgB,CAChB,QAAA,CACEjC,EAAgB,EAAK,CACvB,CACF,EAAG,CAAC9D,CAAK,CAAC,EAGJgG,EAAoBH,GAAaI,GAAS,CAC9Cf,GAAY,CACVgB,cAAeD,CAAAA,CAChB,EACDvC,EAAY,EAAK,CACnB,EAAG,CAAA,CAAE,EAEL/E,OAAAA,EAAU,IAAM,CACV8E,GACFmC,EAAAA,CAEJ,EAAG,CAACA,EAAkBnC,CAAQ,CAAC,EAG7B0C,EAAAC,EAAA,CAAAC,UACEC,EAAA,SAAA,CACEC,IAAKxC,EACLyC,KAAK,SACL7F,GAAG,iBACH8F,QAASrC,EACTsC,cAAgBlJ,GAAM,CACpBA,EAAEmJ,eAAAA,EACFjD,EAAY,EAAI,CAClB,EAAE,GACE+B,EAAAA,EACJmB,MAAO,GAAGrD,EAAWgB,cAAcC,UAAY,MAAQ,EAAE,IACvDjB,EAAWgB,cAAcsC,WAAa,UAAY,EAAE,IAClDtD,EAAWgB,cAAcuC,gBAAkB,QAAU,EAAE,GAAGT,SAE9DC,EAACS,EAAI,CAACC,KAAK,QAAQC,KAAK,KAAKC,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAS,CAAC,CAAG,CAAA,CACzC,EACRwF,EAACgB,GAAc,CACbZ,IAAKvC,EACLoD,MAAO3D,EAAW,OAASsB,OAC3BsC,UAAWtD,EACXuD,QAASA,IAAM5D,EAAY,EAAK,EAChC6D,UAAU,MACVC,IAAK,EACLC,eAAc,GACdC,OAAQ,CACNC,OAAQjL,SAASkL,IAAAA,EAEnBC,mBAAoBC,GAAAA,EACpBC,eAAgB,CACdC,MAAO,CACLC,OAAQ,EAAA,EAEVxB,QAASA,IAAM,CACbzC,EAAQpF,SAASsJ,YAAAA,CACnB,CAAA,EAEFC,iBAAkB,IAAI9B,SAAA,CAEtBF,EAACiC,GAAQ,CAACC,GAAG,MAAKhC,SAAA,CAChBC,EAACS,EAAI,CAACC,KAAK,UAAA,CAAY,EAAE,IACzBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6B,CAAA,CACzB,CAAC,CAAA,CACC,EACV2F,EAACiC,KAAa,EACdjC,EAACkC,GAAQ,CACPC,MAAM,MACNlB,UAAU,MACVmB,MAAO,GACPC,SAAU9E,GAAgBF,EAAY5C,SAAW,EACjD6H,MACEzC,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACS,EAAI,CAACC,KAAK,SAAA,CAAW,EAAE,IACxBV,EAAA,OAAA,CAAMuC,UAAU,YAAWxC,SACzBC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA2B,CAAA,CACvB,EACLkD,EAAe,IAAMyC,EAACS,EAAI,CAACC,KAAK,eAAA,CAAiB,CAAC,CAAA,CACnD,EACHX,SAEA1C,EAAY5C,OAAS,GACpB4C,EAAYmF,IAAK7C,GAAS,CACxB,MAAM8C,EAAc,IAAIC,KAAK/C,EAAKgD,SAAS,EACrCC,EAAcF,KAAK1G,IAAAA,EAAQyG,EAAYI,UAAY,MAEzD,OACE7C,EAAC8C,GAAQ,CAAe3C,QAASA,IAAMT,EAAkBC,CAAI,EAAEI,SAC7DF,EAAA,QAAA,CAAAE,UACEC,EAAA,MAAA,CAAKM,MAAM,iBAAgBP,SAAEgD,GAAWpD,CAAI,CAAA,CAAO,EACnDE,EAAA,OAAA,CAAM0C,UAAU,qBAAoBxC,SAAA,CAEjC6C,GACC/C,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACgD,GAAY,CAACC,SAAUR,EAAaS,OAAO,OAAA,CAAS,EAAE,IAAI,IACzD,GAAG,CAAA,CACL,EAEJlD,EAAA,OAAA,CACEuC,UAAU,UACVY,SAAUV,EAAYW,YAAAA,EACtBC,MAAOZ,EAAYa,eAAAA,EAAiBvD,SAEnCwD,GAAa5D,EAAKgD,SAAS,CAAA,CACxB,CAAC,CAAA,CACH,CAAC,CAAA,CACF,CAAA,EAnBMhD,EAAKtF,EAoBV,CAEd,CAAC,CAAA,CACK,CAAC,CAAA,CACG,CAAC,CAAA,CACjB,CAEN,CCvNA,SAASmJ,GAAe,CAAEC,KAAAA,EAAMC,KAAAA,CAAK,EAAG,CACtC,OACE1D,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAmJ,KAAAA,EACYC,KAAAA,CAAAA,EAAuBC,WAAA,CAAAC,EAAjC5D,EAAA,MAAA,EAAgB,EAAC6D,EAAM7D,EAAA,MAAA,CAAA,CAAgB,CAAA,CAAC,CACnC,CAEX,CAEA,MAAA8D,GAAe/K,GAAK,UAAiC,CACnD,KAAM,CAAEE,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAErC,SAASmH,GAAU,CACjBnH,EAAOkK,0BAA4B,EACrC,CAEA3H,OAAAA,GACE,IACA,IAAM,CACJ1D,EAAAA,0BAAkB,EAClBmB,EAAAA,CACF,OACA,GACEgF,gBAAQ3H,GACgB,aAAA,KAAA,SAAA,IAAA,GACAA,EAAA,SAAa8M,EAAAA,SAAcC,EAAAA,MACG/E,CAAAA,EAK1D,CAAA,CAAAjC,EAAA,2BAAA+C,EAAAkE,GAAA,CAEA,QAAAlD,EAEWA,SAAAA,EAAAA,MAAAA,CAAiBjB,GAAAA,oCACjB1F,MAAG,QAAoCiG,SAAM,KAAQ6D,SAAS,CAAAnE,EAAA,SAAA,CAAID,KAAAA,SAC7DG,MAAK,cAASI,QAAMU,EAAcb,SAASa,EAAAA,EAAAA,CAAQjB,KAAAA,IACnDW,IAAAA,EAAYvE,CAAE,GAAA,QAAA,CAAA,CAAO,CAAA,CAAC,CAAA,EAAG6D,EAAA,SAAA,CACzB,SACRA,EAAA,KAAA,CAAAD,WACEiC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAgC,CAAA,EAC9BC,EAAA,OAAA,CACE,SACRA,EAAA,QAAA,CAAAD,WACE,QAAA,CAAAA,kBAEK5D,EAESA,CAAE,GAAA,QAAA,CAAA,EAA0B,KAAA6D,EAAA,MAAA,CAClCoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAY,KAAA6D,EAAA,MAAA,CACpBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAgB,KAAA6D,EAAA,MAAA,CACxBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAA6B,KAAA6D,EAAAgC,EAAA,CACrCoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAe,CAAA,CAAe,CAAA,CAAC,EAC1B,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAiC,KAAA6D,EAAAgC,EAAA,CACzCoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAe,CAAA,CAAe,CAAA,CAAC,EAC1B,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAiB,KAAA6D,EAAA,MAAA,CACzBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAoB,KAAA6D,EAAAgC,EAAA,CAC5BoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAe,CAAA,CAAgB,CAAA,CAAC,EAC3B,CAEX,OACAA,EAAAgC,EAAA,CACEqC,GAAAA,SACEhK,WAAA,CAAAsJ,EAAAA,EAAAA,KAAA,CAAA,CAAA,CAAA,CAEO,CAAA,EAAC,KAED3D,EAAA,MAAA,CAEToE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAwB,KAAA6D,EAAAgC,EAAA,CAChCoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAa,CAAA,CAAwB,CAAA,CAAC,EACjC,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAoC,KAAA6D,EAAAgC,EAAA,CAC5CoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAW,CAAA,CAAgB,CAAA,CAAC,EACvB,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAyC,KAAA6D,EAAA,MAAA,CACjDoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAA6C,KAAA6D,EAAA,MAAA,CACrDoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAmB,KAAA6D,EAAA,MAAA,CAC3BoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAgC,UAAA,gBACxCoG,KAAAA,EAAWP,EAAA,CACXoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAe,CAAA,CAAe,CAAA,CAAC,EAC1B,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAY,KAAA6D,EAAAgC,EAAA,CACpBoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,EAAc,EAAC6D,EAAG7D,EAAA,MAAA,EAAe,EAACsE,EAAItE,EAAA,MAAA,CAAA,CAAW,CAAA,CAClC,CAAA,CAAC,EACX,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAS,KAAA6D,EAAA,MAAA,CACjBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAQ,KAAA6D,EAAA,MAAA,CAChBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAqB,UAAA,gBAC7BoG,KAAAA,EAAWP,EAAA,CACXoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAe,CAAA,CAAe,CAAA,CAAC,EAC1B,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAmB,KAAA6D,EAAAgC,EAAA,CAC3BoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAW,CAAA,CAAgB,CAAA,CAAC,EACvB,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAQ,KAAA6D,EAAAgC,EAAA,CAChBoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,CAAA,CAAe,CAAA,CAAe,CAAA,CAAC,EAC1B,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAQ,KAAA6D,EAAA,MAAA,CAChBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAW,KAAA6D,EAAA,MAAA,CACnBoE,SAAM,GAAA,CAAA,CAAK,EAAM,CACnB,OACAjI,EACQA,CAAE,GAAA,QAAA,CAAA,EAAoB,KAAA6D,EAAAgC,EAAA,CAC5BoC,GACEpE,SAAA3F,WAAA,CAAAsJ,EAAAA,EAAAA,MAAA,EAAA,EAAAC,EACE5D,EAAA,MAAA,EAAe,EAAC6D,EAAG7D,EAAA,MAAA,CAAA,CAAa,CAAA,CAAe,CAAA,CAAC,EAC3C,CAEX,OACA7D,EACQA,CAAE,GAAA,QAAA,CAAA,EAAa,KAAA6D,EAAAwD,GAAA,CACrBY,SAAsBX,KAAK,GAAA,CAAA,CAAS,EAAK,CAC3C,OACAtH,EACQA,CAAE,GAAA,QAAA,CAAA,EAAsB,KAAA6D,EAAAwD,GAAA,CAC9BY,SAAsBX,KAAK,GAAA,CAAA,CAAS,CAAA,EAAK,IAAA,CAAA,CAC1C,OAAAY,EACMA,UAAAA,EAAQ9B,KAAAA,CAAAA,IAAW6B,EAAAA,KAAAA,CAAK,SAC/B,CAAApE,EAAA,KAAA,CAAAD,MAAAA,EACMO,SAAOiC,CAAAA,CAAAA,EAAUxC,EAAAA,KAAEsE,CAAW,SAClCD,CAAA,CAAA,CAAArE,CAAKqE,EAASC,CAAC,CAAA,CAAA,CAAA,CAElB,CAAA,CACI,CAAA,CAAC,CACH,CAAA,CACF,CAAA,CACJ,CAAA,EC5NPE,GAAU,IAAI,IAIdC,GAAS,IAAI,QAIbC,GAAW,IAAI,QAIfC,GAAa,IAAI,QAIjBC,GAAgB,IAAI,QAIpBC,GAAoB,IAAI,QAIxBC,GAAY,IAAI,QAIhBC,GAAU,IAAI,QAIdC,GAAY,IAAI,QAIhBC,GAAU,IAAI,QAIpB,IAAIC,GAIAC,GAAU,EACVC,GAAU,EAId,MAAMC,GAAM,WAINC,GAAM,WAMNC,GAAM,WAKNC,GAAmBC,GAAc,CACnC,MAAMC,EAAWC,GAAYF,CAAS,EAElCC,GACAA,EAAS,QAAS5N,GAAO8N,GAAQ9N,CAAE,CAAC,CAE5C,EAKM+N,GAAiBC,GAAY,CAC/BA,EAAQ,QAASrK,GAAU,CACnBA,EAAM,SAAWyJ,IACjBa,GAAY,EACZtB,GAAO,IAAIhJ,EAAM,MAAM,GACvBuK,GAAUvK,EAAM,MAAM,CAC9B,CAAC,CACL,EAKA,SAASwK,GAAYnO,EAAI,CACrB,MAAMoO,EAAOpO,EAAG,sBAAqB,EAC/BqO,EAAkDjB,IAAK,aAAgB,EACvEkB,EAAkDlB,IAAK,cAAiB,EAC9E,OAAOgB,EAAK,OAAS,GAAKA,EAAK,IAAME,GAAMF,EAAK,MAAQ,GAAKA,EAAK,KAAOC,CAC7E,CAKA,SAASE,GAAgBvO,EAAI,CACzB,MAAMwO,EAAc1B,GAAc,IAAI9M,CAAE,EACkBwO,GAAY,WAAU,EAChF,IAAIJ,EAAOzB,GAAO,IAAI3M,CAAE,EACpByO,EAAc,EAClB,MAAMC,EAAS,EACVN,IACDA,EAAOO,GAAU3O,CAAE,EACnB2M,GAAO,IAAI3M,EAAIoO,CAAI,GAEvB,KAAM,CAAE,YAAAQ,EAAa,aAAAC,CAAY,EAAKzB,GAOhC0B,EANc,CAChBV,EAAK,IAAMM,EACXE,GAAeR,EAAK,KAAOM,EAASN,EAAK,OACzCS,GAAgBT,EAAK,IAAMM,EAASN,EAAK,QACzCA,EAAK,KAAOM,CACpB,EAES,IAAKK,GAAO,GAAI,GAAK,KAAK,MAAMA,CAAE,CAAC,IAAI,EACvC,KAAK,GAAG,EACPC,EAAW,IAAI,qBAAqB,IAAM,CAC5C,EAAEP,EAAc,GAAKP,GAAUlO,CAAE,CACrC,EAAG,CACC,KAAAoN,GACA,UAAW,EACX,WAAA0B,CACR,CAAK,EACDE,EAAS,QAAQhP,CAAE,EACnB8M,GAAc,IAAI9M,EAAIgP,CAAQ,CAClC,CAMA,SAASd,GAAUlO,EAAIvC,EAAW,GAAM,CACpC,aAAayP,GAAU,IAAIlN,CAAE,CAAC,EAC9B,MAAMiP,EAAkBC,GAAWlP,CAAE,EAC/BmP,EAAQ1R,EACR2R,GAASH,CAAe,EACpB,IACAA,EAAgB,SACpB,EACN/B,GAAU,IAAIlN,EAAI,WAAW,SAAY,CACrC,MAAMqP,EAAmBxC,GAAW,IAAI7M,CAAE,EAC1C,GAAI,CACA,MAA2EqP,GAAiB,SAC5F1C,GAAO,IAAI3M,EAAI2O,GAAU3O,CAAE,CAAC,EAC5BuO,GAAgBvO,CAAE,CACtB,MACM,CAEN,CACJ,EAAGmP,CAAK,CAAC,CACb,CAIA,SAASlB,IAAe,CACpB,aAAaf,GAAU,IAAIE,EAAI,CAAC,EAChCF,GAAU,IAAIE,GAAM,WAAW,IAAM,CACjCV,GAAQ,QAAS4C,GAAWC,GAAQD,EAAStP,GAAOwP,GAAY,IAAMtB,GAAUlO,CAAE,CAAC,CAAC,CAAC,CACzF,EAAG,GAAG,CAAC,CACX,CASA,SAASyP,GAAKzP,EAAI,CACd,WAAW,IAAM,CACbgN,GAAU,IAAIhN,EAAI,YAAY,IAAMwP,GAAYtB,GAAU,KAAK,KAAMlO,CAAE,CAAC,EAAG,GAAI,CAAC,CACpF,EAAG,KAAK,MAAM,IAAO,KAAK,OAAM,CAAE,CAAC,CACvC,CAKA,SAASwP,GAAYE,EAAU,CACvB,OAAO,qBAAwB,WAC/B,oBAAoB,IAAMA,GAAU,EAGpC,sBAAsB,IAAMA,GAAU,CAE9C,CAIA,IAAIC,GAIJ,MAAMC,GAAmB,OAAO,OAAW,KAAe,mBAAoB,OAI1EA,KACAxC,GAAO,SAAS,gBAChB,IAAI,iBAAiBM,EAAe,EACpCiC,GAAS,IAAI,eAAe5B,EAAa,EACzC,OAAO,iBAAiB,SAAU,IAAM,CACpCT,GAAU,OAAO,QACjBD,GAAU,OAAO,OACrB,CAAC,EACDsC,GAAO,QAAQvC,EAAI,GAQvB,SAASS,GAAYF,EAAW,CAU5B,OATsBA,EAAU,OAAO,CAACkC,EAAOC,IACpC,CACH,GAAGD,EACH,GAAG,MAAM,KAAKC,EAAS,UAAU,EACjC,GAAG,MAAM,KAAKA,EAAS,YAAY,CAC/C,EACO,CAAA,CAAE,EAE0C,MAAOC,GAASA,EAAK,WAAa,UAAU,EAEhF,GACJpC,EAAU,OAAO,CAACC,EAAUkC,IAAa,CAE5C,GAAIlC,IAAa,GACb,MAAO,GACX,GAAIkC,EAAS,kBAAkB,QAAS,CAEpC,GADAtG,GAAOsG,EAAS,MAAM,EAClB,CAAClC,EAAS,IAAIkC,EAAS,MAAM,EAAG,CAChClC,EAAS,IAAIkC,EAAS,MAAM,EAC5B,QAASE,EAAI,EAAGA,EAAIF,EAAS,OAAO,SAAS,OAAQE,IAAK,CACtD,MAAMC,EAAQH,EAAS,OAAO,SAAS,KAAKE,CAAC,EAC7C,GAAKC,EAEL,IAAIzC,MAAOyC,EACP,MAAO,GAEXzG,GAAOsG,EAAS,OAAQG,CAAK,EAC7BrC,EAAS,IAAIqC,CAAK,EACtB,CACJ,CACA,GAAIH,EAAS,aAAa,OACtB,QAASE,EAAI,EAAGA,EAAIF,EAAS,aAAa,OAAQE,IAAK,CACnD,MAAMC,EAAQH,EAAS,aAAaE,CAAC,EACrC,GAAIxC,MAAOyC,EACP,MAAO,GAEPA,aAAiB,UACjBrC,EAAS,IAAIqC,CAAK,EAClBzG,GAAOsG,EAAS,OAAQG,CAAK,EAC7BrD,GAAS,IAAIqD,EAAO,CAChBH,EAAS,gBACTA,EAAS,WACrC,CAAyB,EAET,CAER,CACA,OAAOlC,CACX,EAAG,IAAI,GAAK,CAChB,CAMA,SAASpE,GAAOxJ,EAAIiQ,EAAO,CACnB,CAACA,GAAS,EAAE1C,MAAOvN,GACnB,OAAO,eAAeA,EAAIuN,GAAK,CAAE,MAAOvN,EAAI,EACvCiQ,GAAS,EAAE1C,MAAO0C,IACvB,OAAO,eAAeA,EAAO1C,GAAK,CAAE,MAAOvN,EAAI,CACvD,CAMA,SAAS8N,GAAQ9N,EAAI,CACjB,IAAIkQ,EAAIC,EACR,MAAMC,EAAYpQ,EAAG,YACfqQ,EAAc1D,GAAO,IAAI3M,CAAE,EAC7BoQ,GAAaxD,GAAS,IAAI5M,CAAE,GAC5B4M,GAAS,OAAO5M,CAAE,IAChBkQ,EAAKrD,GAAW,IAAI7M,CAAE,KAAO,MAAQkQ,IAAO,OAAS,OAASA,EAAG,aAAe,cACjFC,EAAKtD,GAAW,IAAI7M,CAAE,KAAO,MAAQmQ,IAAO,QAAkBA,EAAG,OAAM,GAExE1C,MAAOzN,EACPsQ,GAAItQ,CAAE,EAEDqQ,GAAeD,EACpBG,GAAOvQ,CAAE,EAEJqQ,GAAe,CAACD,EACrBI,GAAOxQ,CAAE,EAGTsQ,GAAItQ,CAAE,CAEd,CAMA,SAASyQ,GAAIC,EAAK,CACd,OAAO,OAAOA,EAAI,QAAQ,aAAc,EAAE,CAAC,CAC/C,CAMA,SAASC,GAAgB3Q,EAAI,CACzB,IAAI4Q,EAAI5Q,EAAG,cACX,KAAO4Q,GAAG,CACN,GAAIA,EAAE,YAAcA,EAAE,UAClB,MAAO,CAAE,EAAGA,EAAE,WAAY,EAAGA,EAAE,SAAS,EAE5CA,EAAIA,EAAE,aACV,CACA,MAAO,CAAE,EAAG,EAAG,EAAG,CAAC,CACvB,CAMA,SAASjC,GAAU3O,EAAI,CACnB,MAAMoO,EAAOpO,EAAG,sBAAqB,EAC/B,CAAE,EAAA6Q,EAAG,EAAAC,GAAMH,GAAgB3Q,CAAE,EACnC,MAAO,CACH,IAAKoO,EAAK,IAAM0C,EAChB,KAAM1C,EAAK,KAAOyC,EAClB,MAAOzC,EAAK,MACZ,OAAQA,EAAK,MACrB,CACA,CASA,SAAS2C,GAAmB/Q,EAAIgR,EAAWC,EAAW,CAClD,IAAIC,EAAYF,EAAU,MACtBG,EAAaH,EAAU,OACvBI,EAAUH,EAAU,MACpBI,EAAWJ,EAAU,OACzB,MAAMK,EAAS,iBAAiBtR,CAAE,EAElC,GADesR,EAAO,iBAAiB,YAAY,IACpC,cAAe,CAC1B,MAAMC,EAAWd,GAAIa,EAAO,UAAU,EAClCb,GAAIa,EAAO,aAAa,EACxBb,GAAIa,EAAO,cAAc,EACzBb,GAAIa,EAAO,iBAAiB,EAC1BE,EAAWf,GAAIa,EAAO,WAAW,EACnCb,GAAIa,EAAO,YAAY,EACvBb,GAAIa,EAAO,gBAAgB,EAC3Bb,GAAIa,EAAO,eAAe,EAC9BJ,GAAaM,EACbJ,GAAWI,EACXL,GAAcI,EACdF,GAAYE,CAChB,CACA,MAAO,CAACL,EAAWE,EAASD,EAAYE,CAAQ,EAAE,IAAI,KAAK,KAAK,CACpE,CAMA,SAASnC,GAAWlP,EAAI,CACpB,OAAOuN,MAAOvN,GAAMiN,GAAQ,IAAIjN,EAAGuN,EAAG,CAAC,EACjCN,GAAQ,IAAIjN,EAAGuN,EAAG,CAAC,EACnB,CAAE,SAAU,IAAK,OAAQ,aAAa,CAChD,CAMA,SAASkE,GAAUzR,EAAI,CACnB,GAAIuN,MAAOvN,EACP,OAAOA,EAAGuN,EAAG,CAErB,CAMA,SAASmE,GAAU1R,EAAI,CACnB,MAAMwJ,EAASiI,GAAUzR,CAAE,EAC3B,OAAOwJ,EAAS2D,GAAQ,IAAI3D,CAAM,EAAI,EAC1C,CAMA,SAAS+F,GAAQD,KAAWqC,EAAW,CACnCA,EAAU,QAASjC,GAAaA,EAASJ,EAAQrC,GAAQ,IAAIqC,CAAM,CAAC,CAAC,EACrE,QAASU,EAAI,EAAGA,EAAIV,EAAO,SAAS,OAAQU,IAAK,CAC7C,MAAMC,EAAQX,EAAO,SAAS,KAAKU,CAAC,EAChCC,GACA0B,EAAU,QAASjC,GAAaA,EAASO,EAAOhD,GAAQ,IAAIgD,CAAK,CAAC,CAAC,CAE3E,CACJ,CAIA,SAAS2B,GAAeC,EAAc,CAClC,OAAI,MAAM,QAAQA,CAAY,EACnBA,EACJ,CAACA,CAAY,CACxB,CAIA,SAASzC,GAAS0C,EAAQ,CACtB,OAAO,OAAOA,GAAW,UAC7B,CAMA,SAASvB,GAAOvQ,EAAI,CAChB,MAAMgR,EAAYrE,GAAO,IAAI3M,CAAE,EACzBiR,EAAYtC,GAAU3O,CAAE,EAC9B,GAAI,CAAC0R,GAAU1R,CAAE,EACb,OAAO2M,GAAO,IAAI3M,EAAIiR,CAAS,EACnC,GAAI9C,GAAYnO,CAAE,EAAG,CAEjB2M,GAAO,IAAI3M,EAAIiR,CAAS,EACxB1C,GAAgBvO,CAAE,EAClB,MACJ,CACA,IAAI+R,EACJ,GAAI,CAACf,EACD,OACJ,MAAMgB,EAAkB9C,GAAWlP,CAAE,EACrC,GAAI,OAAOgS,GAAoB,WAAY,CACvC,IAAIC,EAAYjB,EAAU,KAAOC,EAAU,KACvCiB,EAAWlB,EAAU,IAAMC,EAAU,IACzC,MAAMkB,EAAanB,EAAU,KAAOA,EAAU,OAASC,EAAU,KAAOA,EAAU,OAC9DD,EAAU,IAAMA,EAAU,QAAUC,EAAU,IAAMA,EAAU,SAE/D,IACfiB,EAAW,GACXC,GAAc,IACdF,EAAY,GAChB,KAAM,CAACf,EAAWE,EAASD,EAAYE,CAAQ,EAAIN,GAAmB/Q,EAAIgR,EAAWC,CAAS,EACxFmB,EAAQ,CACV,UAAW,aAAaH,CAAS,OAAOC,CAAQ,KAC5D,EACcG,EAAM,CACR,UAAW,iBACvB,EACYnB,IAAcE,IACdgB,EAAM,MAAQ,GAAGlB,CAAS,KAC1BmB,EAAI,MAAQ,GAAGjB,CAAO,MAEtBD,IAAeE,IACfe,EAAM,OAAS,GAAGjB,CAAU,KAC5BkB,EAAI,OAAS,GAAGhB,CAAQ,MAE5BU,EAAY/R,EAAG,QAAQ,CAACoS,EAAOC,CAAG,EAAG,CACjC,SAAUL,EAAgB,SAC1B,OAAQA,EAAgB,MACpC,CAAS,CACL,KACK,CACD,KAAM,CAACM,CAAS,EAAIV,GAAeI,EAAgBhS,EAAI,SAAUgR,EAAWC,CAAS,CAAC,EACtFc,EAAY,IAAI,UAAUO,CAAS,EACnCP,EAAU,KAAI,CAClB,CACAlF,GAAW,IAAI7M,EAAI+R,CAAS,EAC5BpF,GAAO,IAAI3M,EAAIiR,CAAS,EACxBc,EAAU,iBAAiB,SAAU7D,GAAU,KAAK,KAAMlO,EAAI,EAAK,EAAG,CAClE,KAAM,EACd,CAAK,CACL,CAKA,SAASsQ,GAAItQ,EAAI,CACTyN,MAAOzN,GACP,OAAOA,EAAGyN,EAAG,EACjB,MAAMwD,EAAYtC,GAAU3O,CAAE,EAC9B2M,GAAO,IAAI3M,EAAIiR,CAAS,EACxB,MAAMe,EAAkB9C,GAAWlP,CAAE,EACrC,GAAI,CAAC0R,GAAU1R,CAAE,EACb,OACJ,GAAImO,GAAYnO,CAAE,EAAG,CAEjBuO,GAAgBvO,CAAE,EAClB,MACJ,CACA,IAAI+R,EACJ,GAAI,OAAOC,GAAoB,WAC3BD,EAAY/R,EAAG,QAAQ,CACnB,CAAE,UAAW,aAAc,QAAS,CAAC,EACrC,CAAE,UAAW,cAAe,QAAS,EAAG,OAAQ,EAAG,EACnD,CAAE,UAAW,WAAY,QAAS,CAAC,CAC/C,EAAW,CACC,SAAUgS,EAAgB,SAAW,IACrC,OAAQ,SACpB,CAAS,MAEA,CACD,KAAM,CAACM,CAAS,EAAIV,GAAeI,EAAgBhS,EAAI,MAAOiR,CAAS,CAAC,EACxEc,EAAY,IAAI,UAAUO,CAAS,EACnCP,EAAU,KAAI,CAClB,CACAlF,GAAW,IAAI7M,EAAI+R,CAAS,EAC5BA,EAAU,iBAAiB,SAAU7D,GAAU,KAAK,KAAMlO,EAAI,EAAK,EAAG,CAClE,KAAM,EACd,CAAK,CACL,CAMA,SAASuS,GAAQvS,EAAIsR,EAAQ,CACzB,IAAIpB,EACJlQ,EAAG,OAAM,EACT2M,GAAO,OAAO3M,CAAE,EAChB4M,GAAS,OAAO5M,CAAE,EAClB6M,GAAW,OAAO7M,CAAE,GACnBkQ,EAAKpD,GAAc,IAAI9M,CAAE,KAAO,MAAQkQ,IAAO,QAAkBA,EAAG,WAAU,EAC/E,WAAW,IAAM,CAIb,GAHI1C,MAAOxN,GACP,OAAOA,EAAGwN,EAAG,EACjB,OAAO,eAAexN,EAAIyN,GAAK,CAAE,MAAO,GAAM,aAAc,GAAM,EAC9D6D,GAAUtR,aAAc,YACxB,UAAW6J,KAASyH,EAChBtR,EAAG,MAAM6J,CAAK,EAAI,EAG9B,EAAG,CAAC,CACR,CAKA,SAAS2G,GAAOxQ,EAAI,CAChB,IAAIkQ,EACJ,GAAI,CAACtD,GAAS,IAAI5M,CAAE,GAAK,CAAC2M,GAAO,IAAI3M,CAAE,EACnC,OACJ,KAAM,CAACwS,EAAM7P,CAAI,EAAIiK,GAAS,IAAI5M,CAAE,EACpC,OAAO,eAAeA,EAAIwN,GAAK,CAAE,MAAO,GAAM,aAAc,GAAM,EAClE,MAAMiF,EAAS,OAAO,QAChBC,EAAS,OAAO,QAYtB,GAXI/P,GACAA,EAAK,YACLA,EAAK,sBAAsB,QAC3BA,EAAK,WAAW,aAAa3C,EAAI2C,CAAI,EAEhC6P,GAAQA,EAAK,WAClBA,EAAK,WAAW,YAAYxS,CAAE,GAG7BkQ,EAAKuB,GAAUzR,CAAE,KAAO,MAAQkQ,IAAO,QAAkBA,EAAG,YAAYlQ,CAAE,EAE3E,CAAC0R,GAAU1R,CAAE,EACb,OAAOuS,GAAQvS,CAAE,EACrB,KAAM,CAAC2S,EAAKC,EAAMC,EAAOC,CAAM,EAAIC,GAAe/S,CAAE,EAC9CiP,EAAkBC,GAAWlP,CAAE,EAC/BgR,EAAYrE,GAAO,IAAI3M,CAAE,GAC3ByS,IAAWpF,IAAWqF,IAAWpF,KACjC0F,GAAahT,EAAIyS,EAAQC,EAAQzD,CAAe,EAEpD,IAAI8C,EACAkB,EAAa,CACb,SAAU,WACV,IAAK,GAAGN,CAAG,KACX,KAAM,GAAGC,CAAI,KACb,MAAO,GAAGC,CAAK,KACf,OAAQ,GAAGC,CAAM,KACjB,OAAQ,IACR,cAAe,OACf,gBAAiB,SACjB,OAAQ,KAChB,EACI,GAAI,CAAC1D,GAASH,CAAe,EACzB,OAAO,OAAOjP,EAAG,MAAOiT,CAAU,EAClClB,EAAY/R,EAAG,QAAQ,CACnB,CACI,UAAW,WACX,QAAS,CACzB,EACY,CACI,UAAW,aACX,QAAS,CACzB,CACA,EAAW,CACC,SAAUiP,EAAgB,SAC1B,OAAQ,UACpB,CAAS,MAEA,CACD,KAAM,CAACqD,EAAWrF,CAAO,EAAI2E,GAAe3C,EAAgBjP,EAAI,SAAUgR,CAAS,CAAC,EAC7B/D,GAAQ,aAAgB,KAC3EgG,EACuDhG,GAAQ,YACvDgG,EACR,OAAO,OAAOjT,EAAG,MAAOiT,CAAU,GAEtClB,EAAY,IAAI,UAAUO,CAAS,EACnCP,EAAU,KAAI,CAClB,CACAlF,GAAW,IAAI7M,EAAI+R,CAAS,EAC5BA,EAAU,iBAAiB,SAAU,IAAMQ,GAAQvS,EAAIiT,CAAU,EAAG,CAChE,KAAM,EACd,CAAK,CACL,CAeA,SAASD,GAAahT,EAAIyS,EAAQC,EAAQzD,EAAiB,CACvD,MAAMiE,EAAe7F,GAAUoF,EACzBU,EAAe7F,GAAUoF,EACzBU,EAAe,SAAS,gBAAgB,MAAM,eAMpD,GALuB,iBAAiBhG,EAAI,EAAE,iBACvB,WACnB,SAAS,gBAAgB,MAAM,eAAiB,QAEpD,OAAO,SAAS,OAAO,QAAU8F,EAAc,OAAO,QAAUC,CAAY,EACxE,CAACnT,EAAG,cACJ,OACJ,MAAMsP,EAAStP,EAAG,cAClB,IAAIqT,EAAa/D,EAAO,aACpBgE,EAAYhE,EAAO,YACvB,MAAMiE,EAAc,YAAY,IAAG,EAGnC,SAASC,GAAe,CACpB,sBAAsB,IAAM,CACxB,GAAI,CAACpE,GAASH,CAAe,EAAG,CAC5B,MAAMwE,EAASJ,EAAa/D,EAAO,aAC7BoE,EAASJ,EAAYhE,EAAO,YAC9BiE,EAActE,EAAgB,SAC9B,YAAY,IAAG,GACf,OAAO,SAAS,CACZ,KAAM,OAAO,QAAUyE,EACvB,IAAK,OAAO,QAAUD,CAC9C,CAAqB,EACDJ,EAAa/D,EAAO,aACpBgE,EAAYhE,EAAO,YACnBkE,EAAY,GAGZ,SAAS,gBAAgB,MAAM,eAAiBJ,CAExD,CACJ,CAAC,CACL,CACAI,EAAY,CAChB,CAMA,SAAST,GAAe/S,EAAI,CACxB,IAAIkQ,EACJ,MAAMc,EAAYrE,GAAO,IAAI3M,CAAE,EACzB,CAAC6S,EAAK,CAAIC,CAAM,EAAI/B,GAAmB/Q,EAAIgR,EAAWrC,GAAU3O,CAAE,CAAC,EACzE,IAAI2T,EAAe3T,EAAG,cACtB,KAAO2T,IACF,iBAAiBA,CAAY,EAAE,WAAa,UACzCA,aAAwB,kBAC5BA,EAAeA,EAAa,cAE3BA,IACDA,EAAe,SAAS,MAC5B,MAAMC,EAAe,iBAAiBD,CAAY,EAC5CE,EAAe,CAAChH,GAAW,IAAI7M,CAAE,KAAOkQ,EAAKrD,GAAW,IAAI7M,CAAE,KAAO,MAAQkQ,IAAO,OAAS,OAASA,EAAG,aAAe,WACxHvB,GAAUgF,CAAY,EACtBhH,GAAO,IAAIgH,CAAY,EACvBhB,EAAM,KAAK,MAAM3B,EAAU,IAAM6C,EAAa,GAAG,EACnDpD,GAAImD,EAAa,cAAc,EAC7BhB,EAAO,KAAK,MAAM5B,EAAU,KAAO6C,EAAa,IAAI,EACtDpD,GAAImD,EAAa,eAAe,EACpC,MAAO,CAACjB,EAAKC,EAAMC,EAAOC,CAAM,CACpC,CAQA,SAASgB,GAAY9T,EAAI8R,EAAS,GAAI,CAClC,GAAIlC,IAAoBD,IAKhB,EAJe,OAAO,WAAW,kCAAkC,EACxB,SAC3C,CAACP,GAAS0C,CAAM,GAChB,CAACA,EAAO,gCACsB,CAC9B3E,GAAQ,IAAInN,CAAE,EACV,iBAAiBA,CAAE,EAAE,WAAa,UAClC,OAAO,OAAOA,EAAG,MAAO,CAAE,SAAU,WAAY,EAEpDuP,GAAQvP,EAAIkO,GAAWuB,GAAOsE,GAA4DpE,IAAO,QAAQoE,CAAO,CAAC,EAC7G3E,GAAS0C,CAAM,EACf7E,GAAQ,IAAIjN,EAAI8R,CAAM,EAGtB7E,GAAQ,IAAIjN,EAAI,CACZ,SAAU,IACV,OAAQ,cACR,GAAG8R,CACvB,CAAiB,EAEL,MAAMkC,EAAK,IAAI,iBAAiBtG,EAAe,EAC/CsG,EAAG,QAAQhU,EAAI,CAAE,UAAW,EAAI,CAAE,EAClC+M,GAAkB,IAAI/M,EAAIgU,CAAE,EAC5BtH,GAAQ,IAAI1M,CAAE,CAClB,CAgEJ,OA9DmB,OAAO,OAAO,CAC7B,OAAQA,EACR,OAAQ,IAAM,CACVmN,GAAQ,IAAInN,CAAE,CAClB,EACA,QAAS,IAAM,CACXmN,GAAQ,OAAOnN,CAAE,EAEjBuP,GAAQvP,EAAK+P,GAAS,CAClB,MAAM,EAAIlD,GAAW,IAAIkD,CAAI,EAC7B,GAAI,CACsC,GAAE,OAAM,CAClD,MACM,CAAE,CACRlD,GAAW,OAAOkD,CAAI,EACtB,MAAMkE,EAAI/G,GAAU,IAAI6C,CAAI,EACxBkE,GACA,aAAaA,CAAC,EAClB/G,GAAU,OAAO6C,CAAI,EACrB,MAAMC,EAAIhD,GAAU,IAAI+C,CAAI,EACxBC,GACA,cAAcA,CAAC,EACnBhD,GAAU,OAAO+C,CAAI,CACzB,CAAC,CACL,EACA,UAAW,IAAM5C,GAAQ,IAAInN,CAAE,EAC/B,QAAS,IAAM,CACXmN,GAAQ,OAAOnN,CAAE,EACjB0M,GAAQ,OAAO1M,CAAE,EACjBiN,GAAQ,OAAOjN,CAAE,EACjB,MAAMgU,EAAKjH,GAAkB,IAAI/M,CAAE,EACKgU,GAAG,WAAU,EACrDjH,GAAkB,OAAO/M,CAAE,EAC3BuP,GAAQvP,EAAK+P,GAAS,CAE8BJ,IAAO,UAAUI,CAAI,EAErE,MAAMmE,EAAIrH,GAAW,IAAIkD,CAAI,EAC7B,GAAI,CACsCmE,GAAE,OAAM,CAClD,MACM,CAAE,CACRrH,GAAW,OAAOkD,CAAI,EAEtB,MAAMoE,EAAKrH,GAAc,IAAIiD,CAAI,EACOoE,GAAG,WAAU,EACrDrH,GAAc,OAAOiD,CAAI,EAEzB,MAAMC,EAAIhD,GAAU,IAAI+C,CAAI,EACxBC,GACA,cAAcA,CAAC,EACnBhD,GAAU,OAAO+C,CAAI,EACrB,MAAM,EAAI7C,GAAU,IAAI6C,CAAI,EACxB,GACA,aAAa,CAAC,EAClB7C,GAAU,OAAO6C,CAAI,EAErBpD,GAAO,OAAOoD,CAAI,EAClBnD,GAAS,OAAOmD,CAAI,CACxB,CAAC,CACL,CACR,CAAK,CAEL,CChyBA,SAASqE,GAAenH,EAAS,CAC7B,MAAM8G,EAAUxT,EAAO,IAAI,EACrB,CAAC8T,EAAYC,CAAa,EAAI9S,EAAQ,EACtC+S,EAAcpH,GAAY,CACxBkH,IACAlH,EAAUkH,EAAW,SAAWA,EAAW,QAAO,EAE1D,EACA7T,OAAAA,EAAU,IAAM,CACRuT,EAAQ,mBAAmB,aAC3BO,EAAcR,GAAYC,EAAQ,QAAS9G,GAAW,CAAA,CAAE,CAAC,CACjE,EAAG,CAAA,CAAE,EACLzM,EAAU,IACC,IAAM,CACT,IAAI0P,GACHA,EAA6DmE,GAAW,WAAa,MAAQnE,IAAO,QAAkBA,EAAG,KAAKmE,CAAU,CAC7I,EACD,CAACA,CAAU,CAAC,EACR,CAACN,EAASQ,CAAU,CAC/B,CC3BA,SAASC,GAAQC,EAAK,CACpB,OAAQ,IAAMA,EAAIC,SAAS,EAAE,GAAGC,MAAM,EAAE,CAC1C,CACO,SAASC,IAAW,CACzB,IAAIC,EAAQ,IAAIC,YAAY,EAAM,EAClCxW,cAAOyW,OAAOC,gBAAgBH,CAAK,EAC5BI,MAAMC,KAAKL,EAAOL,EAAO,EAAEW,KAAK,EAAE,CAC3C,CACA,SAASC,GAAOC,EAAO,CAGrB,MAAMC,EADU,IAAIC,YAAW,EACVC,OAAOH,CAAK,EACjC,OAAO/W,OAAOyW,OAAOU,OAAOC,OAAO,UAAWJ,CAAI,CACpD,CACA,SAASK,GAAgBzB,EAAG,CAC1B,IAAIxD,EAAM,GACV,MAAMkF,EAAQ,IAAIC,WAAW3B,CAAC,EACxB4B,EAAMF,EAAMG,WAClB,QAAS/F,EAAI,EAAGA,EAAI8F,EAAK9F,IACvBU,GAAOsF,OAAOC,aAAaL,EAAM5F,CAAC,CAAC,EAErC,OAAOkG,KAAKxF,CAAG,EAAEyF,QAAQ,MAAO,GAAG,EAAEA,QAAQ,MAAO,GAAG,EAAEA,QAAQ,MAAO,EAAE,CAC5E,CACO,eAAeC,GAAsBC,EAAG,CAC7C,MAAMC,EAAS,MAAMlB,GAAOiB,CAAC,EAC7B,OAAOV,GAAgBW,CAAM,CAC/B,CAGO,eAAeC,GAAa,CAAEC,YAAAA,CAAY,EAAG,CAClD,GAAI,CAACA,EAAa,MAAO,GACzB,GAAI,CACF,MAAMC,EAAM,MAAMzT,MAChB,WAAWwT,CAAW,yCACxB,EACA,MAAI,CAACC,EAAIC,IAAMD,EAAIE,SAAW,IAAY,GAEtCC,GADS,MAAMH,EAAIG,KAAI,GAClBC,kCAAkCC,SAAS,MAAM,CAE5D,MAAY,CACV,MAAO,EACT,CACF,CAGAxY,OAAOyY,wBAA0BX,6ZC3C3B,CACJY,IAAAA,GACAC,mBAAoBC,GACpBC,eAAgBC,EAClB,EAAIC,GAEEC,GAAS,yBAWTC,GAAWH,GACbA,GAAQjR,YAAAA,EAAc2Q,SAASU,SAASC,QAAQ,EAChD,GACEC,GAAkBF,SAASG,OAASH,SAASI,SAC7CC,GAAeb,IAAO,CAACO,GAAWG,GAAkBN,GAE1D,eAAsBU,GAAoB,CAAEtB,YAAAA,CAAY,EAAG,CACzD,MAAMuB,EAAqB,IAAIC,gBAAgB,CAC7CC,YAAaf,GACbgB,cAAeL,GACfM,OAAQb,GACRc,QAAShB,EAAAA,CACV,EAYDvW,OADyB,MAVI,MAAMmC,MACjC,WAAWwT,CAAW,eACtB,CACE6B,OAAQ,OACRC,QAAS,CACP,eAAgB,mCAAA,EAElB7O,KAAMsO,EAAmBrD,SAAAA,CAAS,CAEtC,GACoDkC,KAAAA,CACxC,CAAoB,eAAA2B,GAAA,CAChC,YAAA/B,EACF,UAAAgC,EAEA,WAAAC,EAAA,EAA8C,EAC5CjC,CACAgC,MAAAA,EAAAA,GAAAA,EACAC,EAAa,MAAArC,GAAAsC,CAAA,EACZja,EAAA,IAAA,gBAAA,CACD,UAAA+Z,EACA,sBAAsB,OACtB,iBACEA,aAAAA,GACAG,cAAAA,OACAC,MAAAA,EAAgBC,CAAAA,EACFhB,OACdiB,GAAAA,EAAe,OAAA,cAAA,EAAA,EAEhB,CADQxB,WAAAA,CAAAA,oBAAAA,EAAAA,SAAAA,CAAAA,GACRoB,CAAA,CACD,CACA,kBAAoClC,CACpC,YAAAA,EACF,UAAAgC,EAEA,WAAAC,EAAA,EAA0C,EACxCjC,CACAgC,MAAAA,EAAAA,IAAAA,gBAAAA,CACAC,UAAAA,EACC,MAAAnB,GACD,aAAMyB,GAEJC,cAAO1B,MAAAA,CAAAA,EACOO,OAAAA,GAAAA,EAAAA,OAAAA,cAAAA,EAAAA,EAEC,WAAArB,CAAA,oBAAAuC,EAAA,SAAA,CAAA,EAEjB,CACA,kBAAyB,CACzB,YAAAvC,EACF,UAAAgC,EAEA,cAAAS,EACEzC,KAAAA,EACAgC,cAAAA,CAAAA,EACAS,CACAC,MAAAA,EAAAA,IAAAA,gBAAAA,CACAC,UAAAA,EACC,aAAAtB,GACD,WAAMpZ,qBACJ+Z,KAAAA,CAGAU,CAAAA,EAAAA,OAAAA,GAAAA,EAAAA,OAAAA,gBAAAA,CAAAA,EAKED,GACFxa,EAAO2a,OAAO,gBAAiBH,CAAa,EAS5C,MAPiB,MAAA,MAAA,WAAAzC,CAAA,eAAA,CACjB/X,OAAO2a,OACT,QAAA,CACA,eAAMC,mCAAkE,EAEtEf,KAAAA,EAAS,SAAA,CAAA,CAAA,GAET,KAAA,CACsB,CAExB,eAAkBgB,GAAoB1C,CACtC/V,YAAAA,EAAY,UAAA2X,EAAY,cAAAS,EACxB,MAAAM,CACF,EAAA,CAEA,GAAA,CACE/C,MAAAA,EAAAA,IAAAA,gBAAAA,CACAgC,UAAAA,EACAS,cAAAA,EACAM,MAAAA,CACF,CAAG,EASW,OARR,MAAA,MAAA,WAAA/C,CAAA,gBAAA,CACF,OAAM/X,OACJ+Z,QAAAA,CACAS,eAAAA,mCAAAA,EAED,KAAAxa,EAAA,SAAA,EAED,UAAM+a,EAAoE,CAAA,GAE/D,EAAA,OACPC,EAAA,CAAgB,eAClB,KAAA,uBAAAA,CAAA,EACAhQ,EAAsB,CACX,CC9GjB,MAAMiQ,GAAepb,OAAOqb,WAAW,4BAA4B,EAAEC,QAErE,SAASC,GAAS,CAAE1Q,QAAAA,CAAQ,EAAG,CAC7B,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EAEZuB,EAAWiV,GAAAA,EACXC,EAAiBpS,GAAAA,EACjBqS,EAAqBnV,EAASjC,OAAS,EAEvC,CAACqX,EAAGC,CAAM,EAAIC,GAAYtJ,GAAMA,EAAI,EAAG,CAAC,EACxC,CAACuJ,CAAkB,EAAIhG,GAAAA,EAE7B,OACEpM,EAAA,MAAA,CAAKxF,GAAG,qBAAqBiG,MAAM,QAAQ4R,SAAS,KAAInS,SAAA,CACrD,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,cAAcH,QAASa,EAAQjB,SACzDC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEV2F,EAAA,SAAA,CAAQM,MAAM,cAAaP,SACzBC,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAA,CACpB,CAAA,CACE,EACR2F,EAAA,OAAA,CAAAD,SACEF,EAAA,UAAA,CAAAE,UACEC,EAAA,KAAA,CAAIM,MAAM,gBAAgBL,IAAKgS,EAAmBlS,SAC/CrD,EAAS8F,IAAI,CAAC2P,EAAStK,IAAM,CAC5B,MAAMuK,EAAYD,EAAQvW,KAAKvB,KAAOuX,EAChCS,EAAYxK,IAAM,EACxB,OACEhI,EAAA,KAAA,CAAAE,UACEF,EAAA,MAAA,CAAAE,SAAA,CACG8R,GACC7R,EAAA,OAAA,CAAMM,MAAO,WAAW8R,EAAY,aAAe,EAAE,GAAGrS,SACtDC,EAACS,EAAI,CAACC,KAAK,eAAeE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAS,CAAC,CAAG,CAAA,CACxC,EAER2F,EAACsS,GAAM,CACLC,IAAKJ,EAAQvW,KAAK4W,aAClB7R,KAAK,MACL8R,WAAY,SAAY,CACtB,GAAIL,EACF,GAAI,CACF,MAAMxW,EAAO,MAAMlC,EAAMM,GAAG0C,SACzBC,QAAQwV,EAAQvW,KAAKvB,EAAE,EACvBQ,MAAAA,EACHnC,EAAQga,OACRP,GAAQvW,CAAOA,EACf+W,EAAAA,CACAZ,MAAO,CACT,CAAa,CACf,CAAA,EACF/R,EAAA4S,GAAA,CACD,QACAA,EAAQ,MAELf,KAEM,KAAGM,IAAAA,KAAQvW,EAAAA,KAAAA,IAAAA,EAAAA,EAAAA,KAAAA,KAAAA,GAAAA,EAAAA,KAAAA,IAAAA,IAAAA,EAAAA,WAAAA,EAAAA,IACDoI,KAGZ,SACAmO,GAENU,QAAAA,IAAQ,GAENhZ,EAAIuY,YAAW,GAAAD,EAAA,KAAA,QAAA,IAAAA,EAAA,WAAA,IAEfW,GAAOX,EAAA,KAAA,EAAA,EACLW,SAAAA,OAAAA,EACgB,CAClB,CAAA,CACF,CAAA,CAAA,EACAjT,EAAA,MAAA,CACC,MACLA,UAAKS,SAAM,CAAA+R,GAAAR,GAAAhS,EAAAC,EAAA,CAASC,SACjBsS,CAAAA,EAAAA,OAAaR,CACZ9R,MAAAA,MACQO,SAAMN,EAAAgC,EAAA,CAAKjC,GAAAA,QACf,CAAA,CAAA,CAAA,EAAqB,GAAA,CAAA,CAAA,IACZgT,GAAA,CACX,MAEJlT,MACEsC,WAAMnC,EAAA,SAAA,CACNgT,KAAAA,SACU9S,MAAK,oBAASI,SAAMN,EAAAS,EAAA,CAAmBV,KAAAA,OACvCW,KAAK,IAAOC,IAAAA,EAAYxE,CAAE,GAAA,QAAA,CAAA,CAAM,CAAA,CAAC,CAAA,EAAI,SACrC,CAAA0V,GAAAhS,EAAAC,EAAA,CACTC,SAEA8R,CAAAA,EAAAA,GAAAA,CACC9R,SACEF,EACEwC,QAAAA,IAAU+P,IACKD,EAAA,KAAA,EAAA,EACbW,SAAAA,OAAAA,CACAzD,EACF,SAAA,CAAArP,EAAAS,EAAA,CAAEV,KAAAA,UAEG,CAAA,EAACW,IAAKV,EAAAgC,EAAA,CAAY,GAAE,QACzB,CAAA,CAAA3H,CAAA,CAAA,EAAqC,CAAAkX,IAAA,CAAAa,GAAAvS,EAAAiC,GAAA,CAC7B,mBACSsQ,EAAAA,KACjBvS,KACEoT,OAAM,SACN5R,SAAO,CAAArB,EAAAS,EAAA,CAAQV,KAAAA,UAEV,CAAA,EAACW,EAAK,OAAA,CAAY,SACvBV,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAsC,CAAA,EACjCC,EAAAiC,GAAA,EAAA,CAAA,CAAA,CAAA,EACCpC,EAEZG,GAACiC,CACD,QAEHa,IAAAA,GACU3C,YAAM,GAAAgS,EAAA,KAAA,QAAA,IAAAA,EAAA,WAAA,EACbtY,EACF,SAAA,CAAAmG,EAAAS,EAAA,CAAEV,KAAAA,MAEG,CAAA,EAACW,EAAK,OAAA,CAAQ,SACnBV,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAA2B,CAAA,EACtBC,EAAAiC,GAAA,CAAA,CAAA,EAAA4P,GAAAhS,EAAAC,EAAA,UAERmC,CAAAA,EAAAA,GACA4P,CACC9R,SACEF,EACEwC,QAAAA,IAAUgQ,GACDlS,OAAM0H,EAAA,CAAA,EAEbnL,EAASwW,SAAW,EACpBxW,IAAiByV,EACjBQ,EAAAA,CACAZ,EACF,SAAA,CAAA/R,EAAAS,EAAA,CAAEV,KAAAA,cAEG,CAAA,EAACW,EAAK,OAAA,CAAgB,SAC3BV,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAA4B,CAAA,EACvBF,EAAAiD,GAAA,CACC,SACTA,GAAAA,EACCT,YAAe,GACNlC,OAAM0H,EAAA,CAAA,EAEbnL,EAASwW,OAAOrL,EAAI,EAAA,EAAAsK,CAAA,EACpBzV,GAASwW,CAAW,EACpBP,EAAAA,CACAZ,EACF,SAAA,CAAA/R,EAAAS,EAAA,CAAEV,KAAAA,UAEG,CAAA,EAACW,EAAK,OAAA,CAAY,SACvBV,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAA,EAChBF,EAAAiD,GAAA,CACC,SACTA,IAAAA,GAAQ+E,IAAAnL,EAAA,OAAA,EACP2F,QAAAA,IAAUwF,GACD1H,OAAM0H,EAAA,CAAA,EAEbnL,EAASwW,OAAOrL,EAAI,EAAA,EAAAsK,CAAA,EACpBzV,GAASwW,CAAW,EACpBP,EAAAA,CACAZ,EACF,SAAA,CAAA/R,EAAAS,EAAA,CAAEV,KAAAA,YAEG,CAAA,EAACW,EAAK,OAAA,CAAc,SACzBV,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,EAClBC,EAAAiC,GAAA,EAAA,CAAA,CAAA,CAAA,EACCpC,EACVG,GAACiC,CACD,QAEHkR,GACCC,aAAOvT,EAAAC,EAAA,CACPuT,SAAAA,CAAAA,IACEvT,CAAAC,KAAAA,MACO,CAAA,EAACW,EAAK,OAAA,CAAQ,SACnBV,EAAAgC,EAAA,CAAAjC,GAAAA,SACE1F,OAAA,CAAAC,EAAAA,EAAA,KAAA,IAAA,EAGuB,WAAA,CAAAqJ,EAAAA,EAAAA,OAAA,CAAAC,MADrB,cAAA,CAAA,CAAY,CAEN,CAAA,CAAC,CAAA,CAAA,CAEF,CAAA,EACF,SACP,CAAAwO,EAEJ/P,kBAAW+P,SACXkB,QAAAA,SAAkB,UACG,CAGnB,YAAMnC,EAAAA,YACJ9C,YAAa8D,SACb9B,cAAW8B,EAAQoB,aACnBzC,QAAeqB,WAAQqB,CAAAA,EAEzB9W,EAAC,OAAAmL,EAAA,CAAA,EACDnL,GAASwW,CAAW,EACpBP,GAAAA,CAEIc,GAAA,QAAA,IAAA,gBAAA,IAAAtB,EAAA,KAAA,IAEFsB,WACQC,IAAQC,iBAGoB,MACpC,CACF,CAAa,SAAA,KAAA,SAAA,UAAA,GACbtE,EACF,SAAA,CAAArP,EAAAS,EAAA,CAAEV,KAAAA,MAEG,CAAA,EAACW,EAAK,OAAA,CAAQ,SACnBV,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAsB,CAAA,EACjB,CAAA,CAAAoS,GAAA,WAAAtS,EAAA,MAAA,CACI,MACVsS,SACI7R,SAAM,CAAAN,EAAAS,EAAA,CAAQV,KAAAA,aACZ,CAAA,EAACW,EAAK,OAAA,CAAe,SAC1BV,EAAAgC,EAAA,CAAAjC,GAAAA,SACE1F,OAAA,CAAAC,EAAAA,GAAA6X,EAAA,SAAA,CAAA,EAC+C,WAAA,CAAAxO,EAAAA,EAAAA,GAAA,CAAAC,SAC5CZ,EAAAA,SAAY,CAAA,CAAmBL,CAAY,CAAA,CAAC,CAAA,CAAA,CACxC,CAAA,CAAC,CACH,CAAA,CAAA,CAEV,CAAA,CAAA,CACK,EACLwP,EAAC,KAAA,EAAA,CAAA,CAAA,CACJ,CAAA,EAEPnS,EAAA,IAAA,CACC,SACJH,EAAA+T,GAAA,CAAA7T,GAAAA,SACQgC,MAAG,gBAASzB,QAAMU,EAAgBb,SAASa,CAAAA,EAAAA,EAAAA,CAAQjB,KAAAA,MAClD,CAAA,EAACW,IAAKV,EAAA,OAAA,CAAQ,SACnBA,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAqC,CAAA,CAChC,CAAA,EACH8R,GAAA7R,EAAA,IAAA,CACL,SACF6R,EAAAA,QACC7R,CAAAD,WACEiC,EAAA,CAAAjC,GAAAA,SACE1F,WAAA,CAAAsJ,EAAAA,EAAAA,IAAA,CAAA,CAAA,CAAA,CACqB,CAAA,CAAC,CAAA,CAEf,CAAA,CAAC,CACH,CAAA,CAEV,CAAA,CAAA,CACM,CAAA,CACJ,CCnSb,MAAAkQ,GAAe,8lCCQTC,GAAa,CACjB,QAAS,UACT,QAAS,UACT,QAAS,OACX,EAEA,SAAwBC,IAAe,CACrC,KAAM,CAAEC,KAAAA,CAAAA,EAASC,GAAAA,EAGXC,EAAmBC,GAAQ,IACxBC,GAAQ5R,IAAK6R,GAAS,CAG3B,MAAMC,EAAiBR,GAAWO,CAAI,GAAKA,EAAKrG,QAAQ,YAAa,EAAE,EAEjEuG,EAASC,GAAgB,CAC7BzD,KAAMuD,EACNG,OAAQJ,EACRK,SAAUC,GAASC,QAAYC,EAAE9D,OAASsD,CAAI,GAAGS,UAAAA,CAClD,EAIKC,EAAUP,GAAgB,CAC9BzD,KAAMuD,EACNG,OAAQT,EAAKS,OACbC,SAAUC,GAASC,QAAYC,EAAE9D,OAASsD,CAAI,GAAGW,IAAAA,CAClD,EAED,MAAO,CACLjE,KAAMsD,EACNC,eAAAA,EACAS,QAAAA,EACAR,OAAAA,CAAAA,CAEJ,CAAC,EAAEU,KAAK,CAAClJ,EAAGmJ,IAAM,CAEhB,MAAMC,EAAQpJ,EAAEgJ,QAAQK,cAAcF,EAAEH,QAASf,EAAKS,MAAM,EAC5D,OAAIU,IAAU,EAAUA,EAEpBpJ,EAAEgF,KAAOmE,EAAEnE,KAAa,GACxBhF,EAAEgF,KAAOmE,EAAEnE,KAAa,EACrB,CACT,CAAC,EACA,CAAA,CAAE,EAEL,OACElR,EAAA,QAAA,CAAOS,MAAM,gBAAeP,SAAA,CAAC,KACxB,IACHF,EAAA,SAAA,CACES,MAAM,QACN/F,MAAOyZ,EAAKS,QAAUY,GACtBC,SAAWpe,GAAM,CACfuc,GAAM8B,MAAMC,IAAI,OAAQte,EAAEmK,OAAO9G,KAAK,EACtCkb,GAAave,EAAEmK,OAAO9G,KAAK,CAC7B,EAAEwF,SAAA,CAEDmU,EAAiB1R,IAAI,CAAC,CAAEuO,KAAAA,EAAMuD,eAAAA,EAAgBC,OAAAA,CAAAA,IAAa,CAE1D,MAAMmB,EAASlB,GAAgB,CAC7BzD,KAAMuD,EACNG,OAAQT,EAAKS,OACbC,SAAUC,GAASC,QAAYC,EAAE9D,OAASA,CAAI,GAAGiE,IAAAA,CAClD,EAED,OACEhV,EAAA,SAAA,CACEzF,MAAOwW,EACP,uBAAsBuD,EAAevU,SAJtB,CAAC,CAAC2V,GAAUA,IAAWnB,EAOxB,GAAGA,CAAM,MAAMmB,CAAM,GAAKnB,CAAAA,EAFnCxD,CAGC,CAEZ,CAAC,EACwB7B,MA0BxB,CAAA,CACK,CAAC,CAAA,CACJ,CAEX,CChFA,SAASyG,GAA8BC,EAAc,CACnD,KAAM,CAAElc,MAAAA,GAAUyB,GAAG,EACrB,OAAOzB,EAAMM,GAAG6b,KAAKD,aAAaE,OAAOF,CAAY,CACvD,CAEA,SAASG,IAA+B,CACtC,KAAM,CAAErc,MAAAA,GAAUyB,GAAG,EACrB,OAAOzB,EAAMM,GAAG6b,KAAKD,aAAa/a,MAAK,CACzC,CAEA,SAASmb,GAA8BJ,EAAc,CACnD,KAAM,CAAElc,MAAAA,GAAUyB,GAAG,EACrB,OAAOzB,EAAMM,GAAG6b,KAAKD,aAAaK,OAAOL,CAAY,CACvD,CAEA,SAASM,IAAgC,CACvC,KAAM,CAAExc,MAAAA,GAAUyB,GAAG,EACrB,OAAOzB,EAAMM,GAAG6b,KAAKD,aAAavN,OAAM,CAC1C,CAKO,SAAS8N,IAAkB,CAChC,MAAO,kBAAmBC,WAAa,gBAAiBjgB,MAC1D,CAEO,SAASkgB,IAAkB,CAEhC,OAAOD,UAAUE,cAAcD,gBAAe,CAChD,CAEA,eAAeE,IAAkB,CAC/B,MAAMC,EAAe,MAAMH,GAAe,EACpCT,EAAeY,EACjB,MAAMA,EAAaC,YAAYF,gBAAe,EAC9C9X,OACJ,MAAO,CAAE+X,aAAAA,EAAcZ,aAAAA,EACzB,CAEA,SAASc,GAAsBC,EAAc,CAC3C,MAAMC,EAAU,IAAIC,QAAQ,EAAKF,EAAalc,OAAS,GAAM,CAAC,EACxDqc,EAAS,GAAGH,CAAY,GAAGC,CAAO,GACrC5I,QAAQ,KAAM,GAAG,EACjBA,QAAQ,KAAM,GAAG,EAEd+I,EAAU5gB,OAAO6gB,KAAKF,CAAM,EAC5BG,EAAc,IAAIvJ,WAAWqJ,EAAQtc,MAAM,EAEjD,QAASoN,EAAI,EAAGA,EAAIkP,EAAQtc,OAAQ,EAAEoN,EACpCoP,EAAYpP,CAAC,EAAIkP,EAAQG,WAAWrP,CAAC,EAGvC,OAAOoP,CACT,CAKO,eAAeE,IAAmB,CACvC,GAAI,CAAChB,GAAe,EAAI,OACxB,KAAM,CAAEP,aAAAA,CAAa,EAAI,MAAMW,GAAe,EAC9C,IAAIa,EAAsB,KAC1B,GAAI,CACFA,EAAsB,MAAMrB,GAA4B,CAC1D,OAASsB,EAAK,CACZ,GAAI,wBAAuBrT,KAAKqT,EAAIC,OAAO,EAIzC,MAAMD,CAEV,CAGED,GAAAA,GAAAA,EAAAA,CACA,MAAAG,EAAAH,EAAA,WAAAxB,EAAA,gBAEF4B,EAAAJ,EAAA,YAAAK,EACA,GAAIL,CAAAA,EACF,MAAMG,IAAAA,MAAY,uCAAoC3B,EAEtD,GAAA,CAAA4B,EAGA,MAAA,IAAA,MAAA,gDAAA,QAWW,CAAAJ,EAAA,CAEP1T,MAAAA,EAAM+T,GAAAA,EACR,GAAEA,EAAA,CACF,KAAM,CACN,qBAAAC,CACA,EAAA9B,EAAA,QACA+B,EAAAjB,GAAAe,CAAA,EAAA,SAAA,EACAG,EAAA,IAAA,WAAAF,CAAA,EAAA,SAAA,EAEA,GAAA,EADAC,IAAAC,GAKJ,YAAAhC,EAAA,YAAA,EAEIA,IAAY,MAAKwB,wCAAqB,CAExC,CACA,uBAcMI,oBAAAA,CACF,CACA,CACA,eAAM5B,GAA0B,CAChC,KAAAzI,EACF,OAAA0K,CACF,EAAA,CACEnf,GAAAA,CAAAA,GAAa,EAAA,OACf,GAAA,CACF,aAAA8d,gBAEA,EAAA,MAAAD,GAAA,EACAa,EAAA,KACA,GAAAxB,EACA,GAAA,CACAwB,EAAA,MAAApB,GAAA,CACA,KAAA7I,EACA,OAAA0K,CACA,CAAA,QAGuBT,EAAAA,MAAAA,GAAAA,CAAqB,aAAAxB,EAC9C,KAAAzI,EAEO,OAAA0K,EAAwC,CAAY,KAClD,CAAyCA,MAAAA,EAAAA,GAAAA,EAAS,GAAA,CAAAJ,EAAA,MAAA,IAAA,MAAA,qBAAA,EACzD7B,EAAKO,MAAiBK,EAAE,YAAA,UAAA,CACpB,gBAAA,GAAEA,qBAAYE,GAAAe,CAAA,CAAE7B,CAAAA,EAAcwB,EAASb,MAAiBZ,GAAA,CACxDyB,aAAAA,EAEAxB,KAAAA,EACF,OAAAiC,GAGIA,CACF,MAAE,CACF,aAAAjC,EACF,oBAAAwB,CACE,CACA,CACAA,eAAAA,IAA4BzB,QACd,EAAA,YACZxI,CACA0K,aAAAA,CACF,EAAA,MAAEtB,GAAA,EACFX,IACF,MAAAM,GAAA,EACD,MAAMN,EAAA,YAAA,EAEL,2ZCvLEkC,GAAoB,GACpBC,GAAa,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EACxC,CACJ/I,eAAgBC,GAChB+I,0BAA2BC,GAC3BC,2BAA4BC,GAC5BC,uBAAwBC,GACxBC,qBAAsBC,EACxB,EAAIrJ,GAEEsJ,GAAkBC,OAAO5S,QAAQ6S,GAAUC,EAAE,EAAEnW,IAAI,CAAC,CAACuO,EAAMiE,CAAI,KAAO,CAC1EjE,KAAAA,EACAiE,KAAAA,CACF,EAAE,EAEI4D,GAAuB,gBAE7B,SAASC,GAAS,CAAE7X,QAAAA,CAAQ,EAAG,CAC7B,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/Bif,EAAerF,GAAM8B,MAAM5B,IAAI,OAAO,GAAK,OAC3CoF,EAAe3gB,EAAAA,EACf4gB,EACJ/b,EAAWW,SAASqb,kCAAoC,KACpDC,EAAuBC,GAAAA,EACvBC,EAA2B5E,GAAgB0E,CAAoB,EAC/DG,EAAkB5F,GAAM8B,MAAM5B,IAAI,UAAU,GAAKmE,GAEjD,CAACwB,EAAOC,CAAQ,EAAIlgB,EAASmgB,IAAgB,EAC7C,CAAE9f,MAAAA,EAAO+f,cAAAA,EAAe9f,SAAAA,CAAAA,EAAawB,GAAAA,EAiBrC,CAACue,EAAaC,CAAc,EAAItgB,EACpCoa,GAAM8B,MAAM5B,IAAI,sBAAsB,GAAK,EAC7C,EAEMiG,EAAqBN,EAAM,4BAA4B,IAAM,UAEnE,OACEzZ,EAAA,MAAA,CACExF,GAAG,qBACHiG,MAAM,QACN4R,SAAS,KACTxQ,MAAO,CACL,sBAAuB,GAAG2X,CAAe,IAAA,EACzCtZ,SAAA,CAED,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,cAAcH,QAASa,EAAQjB,SACzDC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEV2F,EAAA,SAAA,CAAAD,SACEC,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAA,CACpB,CAAA,CACE,EACRwF,EAAA,OAAA,CAAAE,UACEC,EAAA,UAAA,CAAAD,SACEF,EAAA,KAAA,CAAAE,UACEF,EAAA,KAAA,CAAAE,UACEC,EAAA,MAAA,CAAAD,SACEC,EAAA,QAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAwB,CAAA,CACnB,CAAA,CACJ,EACL2F,EAAA,MAAA,CAAAD,SACEC,EAAA,OAAA,CACEC,IAAK8Y,EACLc,QAAU3iB,GAAM,CACdwB,EAAAA,eAAa,EAEb,MAAMohB,EADW,IAAA,SAAAf,EAAA,OAAA,EACIgB,IAAAA,OAAShB,EACxBiB,EAAAA,SAAQF,gBACd,GAAAE,IAAa5jB,OAAS6jB,CAEtBC,YAAc,OAAQ,WAAA,SAAA,EACpBA,MAAKC,EAAU9R,SAAO,cAAqB,mCAAA,EAG3C+R,IAGAA,EAAIA,KAAa,IAEjB,SAAA,iBAAA,iCAAA,EAEMC,QAAajkB,GAAAA,CAGnBikB,EAAAA,KAAWjT,aACTkT,CAAAA,CAAS,KACV,CACHJ,EAAO,UAAA,OAAA,WAAAF,IAAA,OAAA,EACLE,EAAKC,UAAUI,OAAO,UAAAP,IAAYA,MAAU,EAC5CE,MAAKC,EAAUI,SAAO,cAAqB,mCAAM,EAGjDH,IAGAA,EAAIA,KAAa,cACfA,EAAYpF,QAAOgF,IAAA,QAAAI,EAAA,QAAA,gBAAAA,EAAA,QAAA,gBAKrB,SAAA,iBAAA,iCAAA,EAEMC,QAAajkB,GAAAA,CAGnBikB,EAAAA,KAAWjT,EACTkT,CAAAA,CAAS,CAEb,SAAA,cAAA,2BAAA,EAAA,aAAA,UAAAN,IAAA,OAAA,aAAAA,CAAA,EACA5jB,IACG2I,OAMH0U,SAAc,IAAA,OAAQ,EAEtBA,GAAO,MAAA,IAAA,QAAAuG,CAAA,CACyB,EAElC,SAAAna,EAAA,MAAA,CAAEE,MAAAA,cAEGO,SAAM,CAAAT,EAAA,QAAA,CAAaE,SACtBF,CAAAA,EAAA,QAAA,CAAAE,KAAAA,QAEIG,KAAK,QACL8U,MAAK,QACLza,eAAMue,IAAA,OAAA,CAAA,YAEP,SACD9Y,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAmB,CAAA,EACdF,EAAA,QAAA,CACF,SACP,CAAAG,EAAA,QAAA,CAAAD,KAAAA,QAEIG,KAAK,QACL8U,MAAK,OACLza,eAAMue,IAAA,MAAA,CAAA,YAEP,SACD9Y,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,EACbF,EAAA,QAAA,CACF,SACP,CAAAG,EAAA,QAAA,CAAAD,KAAAA,QAEIG,KAAK,QACL8U,MAAK,OACLza,eAAMue,IAAA,SAAAA,IAAA,MAAA,CAAA,EACN0B,EAAAA,OAAAA,CAGD,SACDxa,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CAAC,CACd,CAAA,CACD,CAAA,CACL,CAAA,CAAC,CACF,CAAA,EACFF,EAAA,KAAA,CACJ,SACJ,CAAAG,EAAA,MAAA,CAAAD,SACEC,EAAA,QAAA,CAAAD,WACEiC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAuB,CAAA,EAClBF,EAAA,MAAA,CACJ,MACLA,cAAKS,SAAM,CAAAN,EAAA,OAAA,CAAaD,MAAAA,CAChB2B,SAAOqW,GAAA,CAAA,CAAA,EAA0B,SAAA/X,EAAAgC,EAAA,CAAEjC,GAAAA,QACvC,CAAA,CAAA,CAAA,EAEO,IAAAC,EAAA,QAAA,CACH,KAAE,QAENE,IAAAA,GAAK,CAAA,EACLua,IAAK1C,GAAWA,GAAC,OAAA,CAAA,EACjB2C,KAAK3C,IACL4C,MAAKtB,EACL9e,KAAAA,QACAL,SAAKhD,GAAA,CACLoe,MAAAA,EAAWpe,SAAMA,EAAA,OAAA,MAAA,EAAA,EACTqD,SAAQqgB,gBACd,kBAAsBX,cAAAA,GAAAA,CAAAA,IAAAA,EAEtBC,IAAWW,GAEXpH,SAAcqE,IAAAA,UAAAA,EAEdrE,GAAO,MAAA,IAAA,WAAAvc,EAAA,OAAA,KAAA,CACqC,CAC5C,CAAA,EACF,IAAA8I,EAAA,OAAA,CACD,MACDA,CAAM0B,SAAOqW,GAAAA,GAAA,OAAA,CAAA,CAAA,EAA8C,SAAA/X,EAAAgC,EAAA,CAAEjC,GAAAA,QAC3D,CAAA,CAAA,CAAA,EAEOC,EAAA,WAAA,CACH,GACNA,QAAU3F,SAAG0d,GAAA,IAAApX,GAAAX,EAAA,SAAA,QAET,CAAA,CAAQzF,CAAOoG,CAAAA,CAAK,CACrB,CAAA,CAAC,CACO,CAAA,EACPd,EAAA,KAAA,CACJ,SACJ,CAAAA,EAAA,OAAA,CAAAE,SACEF,CAAAA,EAAA,QAAA,CAAAE,SACEC,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,EAA8BC,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,QAAA,UAEhCA,EAAK,KACLD,KAAAA,qCAEIkT,OAAK,SACL5R,IAAAA,WACAyZ,SAAI9a,EAAAgC,EAAA,CAAUjC,GAAAA,QAEd,CAAA,CAAA,CAAA,CAAoC,CAAA,CAAC,CACpC,CAAA,EACGC,EAAA+T,GAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAEM,CAAA,CACb,CAAA,EACH0F,GAAA5Z,EAAAC,EAAA,CACG,SACR2Z,CAAAA,EAAAA,KACC5Z,CAAAE,SACEC,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,EAAqBC,EAAA,UAAA,CACnB,SACJH,EAAA,KAAA,CAAAE,YACE,KAAA,CAAAA,SACEF,CAAAA,EAAA,QAAA,CAAAE,IAAAA,wBACSgb,SAAI,CAAA/a,EAAAgC,EAAA,CAAuBjC,GAAAA,QAChC,CAAA,EAAA1F,IAAA2F,EAAAS,EAAA,CAAgC,KAAE,QAC5BC,IAAAA,EAAgBvE,CAAE,GAAA,QAAA,CAAA,EAAS,MAAA,aAAA,CAAA,CAAEmE,CAAM,CAAA,EAAgBT,EAAA,SAAA,CACpD,GACPA,wBACExF,MAAGif,EAAA,4BAAA,GAAA,SACH/e,SAAO+e,GAAM,CACbhE,KAAAA,CACE,MAAA/a,CAAM,EAAEA,EAAAA,iBAAY8G,CACnB,GAAA,CACC,MAAI3H,EAAA,GAAA,SAAA,kBAAA,CACF,OAAMA,CACJshB,QAAQzgB,CAAA,CACGA,CAAAA,EAEb,MAAC0gB,EAAA,CACD,GAAA3B,EACE,6BAAGA,CAAAA,EAEL/e,IAAA,YACA0gB,gCAAyB,EAAA,UAEzB1B,EAAA0B,CAAA,EACA1B,GAAS0B,CAAQ,CACjBC,MAAAA,SAEK/e,CAAC,GAAA,QAAA,CAAA,CAAA,CAAkC,CACxCzD,GAAAA,CAAe,EACjB,SACC,CAAAsH,EAAA,SAAA,CACL,MAAA,SAAED,SAEFC,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAAQwF,CACpB,CAAA,EAAA1F,EAAA,SAAA,CAAA,MAAoB,WACd,SACR2F,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAAUwF,CACtB,CAAA,EAAA1F,EAAA,SAAA,CAAA,MAA0B,UACpB,SACR2F,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAASwF,CACrB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,EAACob,GACjB,GAAAtb,EAAA,KAAA,CAAA,SACF,CAAAA,EAAA,QAAA,CAEVsb,IAAAA,6BACCpb,SACEF,CAAAA,EAAAmC,EAAA,CAAO+Y,GAAI,QAAA,CAA4Bhb,EAAAA,IAAAA,EACrCC,EAAAgC,CAAA3H,KAAA,QAA4B,IAAE8B,EACXyE,CAAGzE,GAAAA,QAAAA,CAAE,EAAA,MAAQ,aAAA,CAAA,CAAC,CAAA,CAAA,EAAEmE,EAAAA,SAAM,CAAa,GAAG,6BACpD,MACPT,EAAA,8BAAA,GAAA+Z,EAAA,SAAA,SACEvf,SAAGuf,EACHrf,SACE+e,GAAM,CAKRjX,KAAAA,CACAiT,MAAAA,CACE,EAAApe,EAAM,QAAA,SAAEqD,IAAY8G,CACnB,MAAA3H,EAAY,GAAA,SAAA,kBAAA,CACP,OAAA,CACF,aAAegD,CAA2B,CAChC,CAAA,EACQnC,EAChB,CACD,GAAA+e,EACDC,+BAAShf,CAAA,CAAA,EACJ+e,GACH,CACD,GAAAA,EACD4B,+BAAe3gB,CAAA,CAAA,CACV+e,MACH,CACF,MAACnd,EAEDif,CAAKjf,GAAAA,QAAAA,CAAC,CAAA,CAAA,CAAiC,GAAA,CACvCzD,EAAe,SACjB,CAAAsH,EAAA,SAAA,CACF,MAAG,SACL,SAAA4Z,EAAE7Z,SAEFC,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAAS8H,CAAUuX,CAAAA,EAAmB7Z,EAAAA,SAClDiC,CAAA,MAAA,YAAA,SAA8B4X,EACxB,SACR5Z,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAAY8H,CAAUuX,CAAAA,EAAmB7Z,EAAAA,SACrDiC,CAAA,MAAA,SAAA,SAAsChC,EAAAgC,EAAA,CAExChC,GAAAA,QAAA,CAAQzF,CAAM,CAAA,CAAQwF,CACpB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgC,CAAA,CACzB,CAAA,EAAAF,EACF,IAAA,CAAA,MAEZ,mBAAA,SACC,CAAAG,EAAAS,EAAA,CAENZ,KAAA,QAAGS,IAAMnE,EACDuE,CAAaE,GAAGzE,QAAAA,CAAAA,EAAE,MAAA9B,aAAA,CAAA,EAAQ,IAAA2F,EAAA,QAAA,CAAC,SAAAA,EAAAgC,EAAA,CAAE1B,GAAAA,SAAuB,OAC1DN,CAAAD,SAAAA,CACE,EAAAzF,WAAA,CAAAX,EAAAA,EAAAA,IAAAA,CAOkC,KAAA,WAAAA,CAAA,IAAAgK,OAAA,SAAAC,cALhC,CAAA,CAC2B,CAClB,CAAA,CACH,CAAA,CAAA,CAGH,CAAA,CAAA,CAAC,CAAA,EAAA5D,EACC,KAAA,CAAA,SACDA,EAAAgC,EAAA,CACN,GAAA,QAAA,CACJ,CAEJ,CAAA,EAAAjC,EAAAA,UACEiC,CAAA,SAAAnC,EAAA,KAAA,CAAyB,SAAA,CAAAG,EAAA,KAAA,CAE3BA,MAAA,QAAAD,WACE,QAAA,CAAAA,SACEC,CAAAA,EAAA,QAAA,CAAIM,KAAM,WAAOP,UACf,SAAA,YAAAA,SACEC,GAAA,CACEE,EAAK,SAAA,YAAAhJ,EAAA,OAAA,OACLmkB,CAA6BC,CAAAA,EAC7BhG,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QAAuCwhB,CAAAA,CACzC,CAAA,CAAA,CAEF,CAAA,EAAArb,EAAA3F,KAAA,CAAA,MAA0C,QAAA,SACrCwF,EAAA,QAAA,CAETG,SAAA,CAAAA,EAAA,QAAA,CAAIM,KAAM,WAAOP,UACf,SAAA,eAAAA,SACEC,GAAA,CACEE,EAAK,SAAA,eAAAhJ,EAAA,OAAA,OACLmkB,CAA6BE,CAAAA,EAC7BjG,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QAA0CwhB,CAAAA,CAC5C,CAAA,CAAA,CAEF,CAAA,EAAA,CAAA,CAAAhhB,IAAAwF,EAAA,KAAA,CAAA,MAA8B,QAAA,SACzB,CAAAA,EAAA,QAAA,CAER,SAAEsY,CAAAA,EAAAA,QACDtY,CAAIS,KAAM,WAAOP,QACfF,EAAA,SAAA,mBAAAE,SACEC,GAAA,CACEE,KAAK,CACLmb,QAAAA,CAA6BG,EAC7BlG,EAAAA,OACEzb,EAAM,SAAA,mBAAAwhB,EAAEA,MAAcha,SAAAA,iCAAAA,KAEtB,CACExH,CAAAA,EAAAA,IAAAA,IAAgBof,CAAmC,GACrD,QAAA,CAAA,CACF,CAAA,CAAA,EACDpZ,EAAE,MACHmC,CAAA,MAAA,eAAA/E,EAAA,SAAA,mBAAA,GAAA,oBAAA,GAAA,SAA+B,CAAA+C,EAAA,MAAA,CAEjCH,SAAAA,EAAA,QAAA,UACS,CAAAG,EAAAgC,GAIJjC,WAEH,CAAAA,EAAAA,MACE,SAAA,CAAAA,MAAAA,GACE,GAAA1F,SAAA,CAAA4C,EAAA,SAAA,mBAA2B,MAC3B4C,OACSmZ,MAAkB,EAEzBtX,SAAOxK,GAAA,CAAEwT,EAAO,SAAA,iCAAAxT,EAAA,OAAA,OAAA,IAAO,EACvBoe,SAAWpe,CAAAA,EAAAA,SAAM,CACf2C,MAAO+D,GAET,SAAAoC,EAAAgC,EAAA,CAAEjC,GAAAA,SAEMxF,OAAM,CAAEwF,yBAAAA,CACd,CAAA,CAAA,CAAA,CAAA,EAAAC,EAAAoZ,SAAAA,CAAAA,SAC4C,GAAA,SACrC,YAAA,CACD,EACRpZ,GAAA,IAAAqU,GAAA,CAAQhS,MAAAA,EAAQmS,GAAA,CAAAzU,KAAAA,EAAC,KAChByY,SAAAA,EAAAA,IACC,CAAA,IACazH,GAAAA,CACX2D,OAAUL,KACX,OAAAA,EAAA,IACD,CAAA,IACatD,GAAAA,IAAAA,EAAAA,SACHsD,SAAKtD,CACd,MAAAsD,EAAA,KACD,SAAMoH,MAAuB/F,MAAWnB,CAAAA,GAAAA,CACxC,CAAA,CACE,CAAA,CAAA,CAAoBxD,CAAAA,CAAAA,CACsB2E,CAAAA,CAClC,CAAA,EAAA1V,EAEV,KAAA,CAAA,CAAA,EAAAH,EAAA,MAAA,CAAA,MACK,oBAAA,SACJ,CAAAG,EAAAgC,EAAA,CAEThC,GAAAA,SACKM,OAAM,CAAmBP,EAAAA,EAC5BiC,SAAA,gCAAA,MAAA,CAAA,CAAA,EAAA1H,EAAAA,MAAA,CAAA,MAEI2C,kBACS,SAAAub,GAAA,IAAAnE,GAAA,CAKbrU,MAAA0V,EAAAlB,GAAA,CAAKlU,KAAM+T,EAAA,KAAiBtU,SACzByY,EAAAA,IACC,CAAA,IACazH,GAAAA,CACX2D,OAAUL,KACX,OAAAA,EAAA,IACD,CAAA,IACatD,GAAAA,IAAAA,EAAAA,SACHsD,QAAKtD,CACd,SAAA,CAAA/Q,EAAA,QAAA,CACD,KAAMyb,WACN,QACExe,EAAA,SAAA,gCAAA,SAAAoX,EAAA,IAAA,EAAAtU,SACEC,GAAA,CACEE,KAAK,UAGL,EACAoV,EAAAA,OACE+F,EAAQA,EAAAA,SAAAA,gCAAAA,KAAAA,EAAAA,IAAAA,EACRxhB,EAAIwhB,SAAS,gCAAApe,EAAA,SAAA,gCAAA,OAAA8T,GAAAA,IAAAsD,EAAA,IAAA,CAGX,CAEAxa,CAAAA,EAAAA,IAAAA,EAAgB6hB,EAAAA,OAAAA,CAGd,SACJ,CAAAnH,EAAA,IAAA1U,EAAA,OAAA,CACF,MAAA,mBACC,SACF4b,CAAAA,KAAAA,EACC,CAAA1b,CAAAA,CAEE,CAAA,EAAMO,CAAM,CAAA,CAAA,CAA4B,CAAA,CAAQ,CAAA,CAAA,CAInD,CAAA,EAAAN,EACI,IAAA,CAAA,MAEV,gBAAC,SACEA,EAAA,QAAA,CAERA,SAAAA,EAAAgC,EAAA,CAAG1B,GAAM,SAAeP,QACtBA,qBAAAA,EACE,EAAAzF,WAAA,CAAAse,EAAAA,EAAAA,IAAAA,CAQyB,KAAA,2CAAAjV,OAAA,SAAAC,cALvB,CAAA,CACO,CACE,CAAA,CACH,CAAA,CAGH,CAAA,EAAA5D,EAAC,KAAA,CAAA,CAAA,EAAAH,EAAA,MAAA,CAAA,SAEC,CAAAA,EAAA,QAAA,CACF,SAAA,CAAAG,EAAA,QAAA,CAETA,KAAA,WACAD,QACEF,EAAA,SAAA,6BAAAE,SACEC,CAAAA,EAAA,SAAA,mBACEE,SAAKhJ,GAAA,CACLmkB,EACEpe,sCAAoB0e,EAAAA,OAAAA,OAEtBtZ,CAA+BmZ,CAAAA,EAC/BlG,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QACWwhB,CAAAA,CACb,CAAA,CAAA,EACDrb,EAAE,IACHA,CAAA,MAAA,gBAAA,SAAsCA,EAAA,QAAA,CAExCA,SAAAA,EAAAgC,EAAA,CAAG1B,GAAM,SAAeP,WACtB,CAAAA,EAAAA,MACEiC,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAE4B,CAAA,CAAA,CAAC,CAAA,CAAA,CAEtB,CAAA,CAAA,CACF,CAAA,EAAA,CAAA,CAACuW,IACNkB,GAAA5Z,EAAA,KAAA,CAAA,MACA,QAAA,SACF,CAAAA,EAAA,QAAA,CAGT,SAAE0Y,CAAAA,EAAAA,QAAiBkB,CACdnZ,KAAM,WAAOP,QACfF,EAAA,SAAA,kBAAAE,SACEC,GAAA,CACEE,EAAK,SAAA,kBAAAhJ,EAAA,OAAA,OACLmkB,CAA6BO,CAAAA,EAC7BtG,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QAA6CwhB,CAAAA,CAC/C,CAAA,CAAA,EACDrb,EAAE,MACHgC,CAAA,MAAA,4BAAA,SAAsChC,EAAA,QAAA,CAExCA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,SAA2BP,WACpC,CAAAA,EAAAA,MACEiC,CAAA,KAAA,gCAAA2B,OAAA,SAAAC,cAGE,CAAA,CACO,CACE,CAAA,CACH,CAAA,CAGH,CAAA,CAAA,CAAC,CAAA,EAAA,CAAA,CAAAyU,IAKCoB,GAAA5Z,EAAA,KAAA,CAAA,MACF,QAAC,SACJ,CAAAA,EAAA,QAAA,CAGT,SAAEwY,CAAAA,EAAAA,QAAmBoB,CAChBnZ,KAAM,WAAOP,QACfF,EAAA,SAAA,kBAAAE,SACEC,GAAA,CACEE,EAAK,SAAA,kBAAAhJ,EAAA,OAAA,OACLmkB,CAA6BQ,CAAAA,EAC7BvG,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QAA6CwhB,CAAAA,EAC/C,IAAArb,EAAAS,EAAA,CACD,KAAE,YACHpG,MAAA,oBAAA,CAAyC,CAAA,CACpC,CAAA,EAACqG,EAAAA,MAAK,CAAA,MAAYJ,4BAA0B,SAAGN,EAAA,QAAA,CAEtDA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,QAAA,CAA2BP,CACpC,CAAA,CACE,CAAA,EAAAC,EAAA3F,MAAA,CAAA,MAEO,4BAAC,SACH2F,EAAA,QAAA,CAETA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,SAA2BP,WACpC,CAAAA,EAAAA,MACEiC,CAAA,KAAA,yCAAA2B,OAAA,SAAAC,cAEE,CAAA,CACO,CACE,CAAA,CACH,CAAA,CAGH,CAAA,CAAA,CAAC,CAAA,EAAA6V,GAECqC,GAAA,GAAA,UAAA,GAAAjc,EAAA,KAAA,CAAA,MACF,QAAC,SACJ,CAAAA,EAAA,QAAA,CAGT4Z,SAAAA,CAAAA,EAAAA,QAAiBqC,CACZxb,KAAM,WAAOP,QACfF,EAAA,SAAA,0BAAAE,SACEC,GAAA,CACEE,EAAK,SAAA,0BAAAhJ,EAAA,OAAA,OACLmkB,CAA6BU,CAAAA,EAC7BzG,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QACWwhB,CAAAA,CACb,CAAA,CAAA,EACDrb,EAAE,MACHgC,CAAA,MAAA,4BAAA,SAAgDhC,EAAA,QAAA,CAElDA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,QAAA,CAA2BP,CACpC,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,EAAA0Z,GAGO5Z,EAAA,KAAA,CAAA,MACF,QAAC,SACJ,CAAAA,EAAA,QAAA,CAGT4Z,SAAAA,CAAAA,EAAAA,QACC,CAAInZ,KAAM,WAAOP,QACfF,EAAA,SAAA,kCAAAE,SACEC,GAAA,CACEE,EAAK,SAAA,kCAAAhJ,EAAA,OAAA,OACLmkB,CACsBW,CAAAA,EAEtB1G,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,QACWwhB,CAAAA,EACb,IAAArb,EAAAS,EAAA,CACD,KAAE,QACHpG,MAAA,oBAAA,CAA0D,CAAA,CACrD,CAAA,EAACqG,EAAAA,MAAK,CAAA,MAAQJ,4BAA0B,SAAGN,EAAA,QAAA,CAElDA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,SAA2BP,WACpC,CAAAA,EAAAA,OACEiC,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAEO,CAAA,EAAAhC,EAAC,MAAA,CAAA,MAID,4BAAC,SACHA,EAAA,QAAA,CAETA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,QAAA,CAA2BP,CACpC,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,EAAAF,EAGO,KAAA,CAAA,MACF,QAAC,SACJ,CAAAA,EAAA,QAAA,CAGVA,SAAA,CAAAG,EAAA,QAAA,CAAIM,KAAM,WAAOP,QACfF,EAAA,SAAA,UAAAE,SACEC,GAAA,CACEE,EAAK,SAAA,UAAAhJ,EAAA,OAAA,OACLmkB,CAA6BY,CAAAA,EAC7B3G,IAAAA,EAAWpe,EAAM,CACf2C,GAAAA,SACF,WAAA,CACC,EAAAmG,EACHA,OAAAgC,CAAA,MAAA,eAAA,CAAA2B,EAAAC,EAEE5D,EAAA,OAAA,EAAA,EAAA,EAAMM,EAAAA,OAAM,CAAA,CAAA,CAAA,CAEN,CAAA,CAAA,CADa,CAAA,EAAAN,EAAIA,MAAA,CAAgB,MAAC,4BAAA,SAElCA,EAAA,QAAA,CAEVA,SAAAA,EAAAgC,EAAA,CAAK1B,GAAM,QAAA,CAA2BP,CACpC,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,EAAA0Z,GAGOzZ,EAAA,KAAA,CAAA,SACFA,EAAA,SAAA,CACH,KAAA,SAEPyZ,MAAAA,QACC1Z,YACE,CACEG,EAAK,WAAA,GACLI,EAAM,aAAA,EACNH,EACEtG,SAAOqiB,EAAAA,EAAa,CACpBriB,GAAAA,QAAsB,CACxB,CAAA,CAAA,CAEA,CAAA,CAAA,CAAA,CAAA,CAA2B,CAAA,EAAA4f,GACrBzZ,EAAAmc,GAAA,CAAA,QAAAnb,CAEX,CAAA,EACChB,EAAA,KAAA,CACG,SACRyZ,EAAAA,EAAiBzZ,CAA0BgB,GAAAA,QAAAA,CAAmB,CAC/D,CAAA,EAAAjB,EAAAA,UACEiC,CAAA,SAAA,CAAAnC,EAAA,MAAA,CAAmB,MAAA,CAErBA,QAAA,OAAAE,SACEF,OACE6B,IAAO,EACL0a,WAAS,KACTC,WAAU,SACVnb,UAAK,CAAA,EACO,SACZob,CAAAA,EAAY,MAAA,CACZC,IAAAA,GACF,IAAA,GAAExc,MAAAA,KAGAyc,OAAK3I,KACLjT,MAAI,CACJ8J,YAAM,MACNC,cAAO,SACPjJ,WAAO,UACL+a,aAAa,EAAA,CACE,CAAA,EACfC,EAAAA,MAAY,CAAA,SACZC,CAAAA,EAAc,IAAA,CAChB,SAAA,QAAA,CACD,EACD9c,IAAAG,EAAA,IAAA,CAAAD,KAAAA,+BACEA,IAAAA,WAAY,QACZC,GAAA,CACEiT,EAAAA,eAAK,EAEL6H,EAAI,YAAA,qBACJ3a,EACEjJ,SAAEmJ,SACFxG,CAAAA,EAAAA,EAAAA,KAAO+iB,CAAAA,CAAAA,EAAAA,EAAc5a,EAAA,CACvB,GAAA,SAAEjC,WACH,CAGDC,EAAAA,EAAA,IAAK,CACL,KAAA,oCAAA2D,OAAA,SAAAC,cACE,CAAA,EACO,EACLvC,EAAAA,IAAO,CACPyZ,KAAI,mCAGH,IAAA,WAACjX,QAEJ3M,GAAA,CACE+b,EAAAA,eAAK,EAEL6H,EAAI,YAAA,yBACJ3a,CACEjJ,CAAAA,CACA2C,CAAqB,CAAA,CAAA,CACvB,CAAA,CAAA,CAGC,CAAA,EAAAgG,EAAC,IAAA,CAAA,SACE,CAAAG,EAAA,IAAA,CACJ,KAAA,sCAERH,OAAA,SAAAE,IAAAA,WAEIkT,SAAKjT,EAAAgC,EAAA,CACLX,GAAAA,QAAO,CACPyZ,CAAI,CAAA,EAAU/a,IAAAA,QAEdiC,EAAAA,IAAA,CAAA,KAAA,uCAAA,OAAqB,SACpB,IAAE,WAGHiR,SAAKjT,EAAAgC,EAAA,CACLX,GAAAA,QAAO,CACPyZ,CAAI,CAAA,EAAU/a,IAAAA,QAEdiC,EAAAA,IAAA,CAAA,KAAA,8BAAA,OAAoB,SACnB,IAAE,WAGHiR,SAAK,SAAA,CAAA,EACL5R,IAAAA,IAAO,IAAArB,EAAA,IAAA,CACP8a,KAAI,2DAAU/a,OAAAA,SAGb,IAAE,WAGHkT,SAAKjT,EAAAgC,EAAA,CACLX,GAAAA,QAAO,CACPyZ,CAAI,CAAA,EAAU/a,IAAAA,QAEdiC,EAAAA,IAAA,CAAA,KAAAiW,GAAA,OAAwB,SACvB,IAAE,WAEFhF,SAAMgF,EAAAA,EAAAA,CAAoB5W,GAAAA,QAAO,CAASyZ,CAAI,CAAA,CAAU/a,CACzD,CAAA,EAAAF,EAAA,IAAA,CAAA,SAA4B,CAAAoP,IAAApP,EAAAC,EAAA,CAC1B,SAAA,CAAAE,EAAAgC,EAAA,CAGJnC,GAAA,SAAAE,OACGkP,CACClP,EAAAA,GACEC,QAAAgC,eAAA,EAAA,EAAA,QAAA,MAAA,EAAA,CAAA,EAAA1H,WAAA,CAAAsJ,EAEGqL,SAAQjB,CAA8C,MAAA,eAAA,CAAArK,CAAA,CADvD,CAAA,EAAA3D,EAAMM,KAAM,EAAA,CAAA,CAAA,CAAA,EAAAN,EAA2BgC,EAAA,CAAA,GAAC,SAAA,OAG1ChC,CAGJA,EAAAA,EAAAgC,OAAA,CAAA,MAAA,mBAAA1H,SAAA,CAAA,IAAA0F,EAAA,IAAA,MAuBI,mDAAMM,OAAM,SAAkBP,IAAAA,WAG1BkT,eACA5R,SAAO,IAAA,KAAA,0BAAA,CAAA,CACPyZ,CAAI,CAAA,EAAU/a,GAAAA,CAED,CAAA,CAAkC,EAAI,WAGvD,CAAA,EAAMC,EAAA,OAAA,CACP,MAAA,eAAA,CAAA2D,EAAAC,EAjCD5D,EAAA,QAAA,CAAMM,KAAAA,OAAoC,MAAA,iBAACuD,SAC3C,GACE3D,KAAK,KACLI,MAAM,GAAA,2BAAA,MAAA,EAAA,EAAA,EAAA,QAAA,KAAA,GAAA,CAAA,WACNuc,QAAQ3lB,GAAA,CACRyJ,EAAAA,OAAK,OAAA,MAILR,UAAUjJ,UAAM,UAAAA,EAAA,OAAA,KAAA,EACZmK,GAAOyb,EAGP1G,CACA/Z,GAAAA,QAASF,CAAAA,CAAAA,CAAC,MAAA,CAAAE,GAAuBF,GAEjCzD,GAAQqkB,QACR1gB,CAASF,CAAAA,CAAAA,CAAC,CAAA,CAAA,CAA+B,CAAC,CAAA,CAAA,CAC5C,CAAA,CAAA,CACF,CAAA,EAAA,MAqGwC,CACxC,CAAA,CAAA,CACF,CAAA,CAGJ,CAoDV,SAAAggB,GAAwB,CACtB,QAAAnb,CAAuB,EACzB,CACF,KAAA,CAEA,EAAAgc,CAAkC,EAAEhc,GAAAA,EAAQ,GAAG,CAAAmV,GAAA,EAAA,OAAA,KAC7C,KAAM,CAAEld,SAAAA,CAAAA,EAAGC,GAAAA,EACNid,CAAAA,EAAAA,CAAmB,EAAA9c,EAAO,SAAA,EAEzB4jB,EAAA7kB,EAAA,EAAEuB,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,EAAAA,EAAawB,CAAAA,EAAI+hB,CAAA,EAAA7jB,EAAA,EAAA,EACnB8jB,EAAoB/kB,IAC1BC,QACA,SAAO+kB,CACPC,EAAOC,SAAaJ,EACpB,IACA7kB,KAAU,CACP,aAAAud,EACCyH,oBAAAA,CACA,EAAI,MAAAlG,GAAA,EACF,GAAAC,GAAM,QAAAA,EAAA,SAAA,OAAA,CAAExB,EAAAA,EAAAA,EAAcwB,KAAAA,CAAwB,OAAAmG,EAE5CnG,OAAAA,CAGAoG,EAAAA,EACAL,EAAM,QAAAtF,EAAA,KAAE0F,CAAQ1F,SAAAA,CAAAA,EAAWT,EAAAA,QAC3B1e,cAAmC0e,QAAAA,EACnC+F,IAAAA,EAAkB7kB,MAAUuf,GAC5B,OAAM,QAAA0F,CAAA,EAAA,QAAA,CAAA,CAAAE,EAAAljB,CAAA,IAAA,CAAEkL,MAAAA,EAAAA,EAAAA,UAAAA,CAAAA,EAAawX,GAAAA,OAAY3kB,aACjCT,EAAM6lB,QAAWjY,CAAAA,CAAAA,EAGjBgT,CAAAA,CACE,CACA4E,EAAIxlB,UACFA,OAAAA,EAAGwjB,CACL,uBAAA,KAAAhE,EAAA,OAAA,EACF6F,EAAC,EAAA,EAEHG,MAAAA,GAAW,SAAShG,CAAA,EAEpB3e,SAAgB,CAChB,CACEwkB,GAAAA,CAAmB,EAAA,CAAA,CAAA,EAEnB9B,MAAAA,EAAM/D,IAAgBA,UAAG,OAC3BxX,EAAA,OAAA,CACAwd,IAAAA,EAAkB,SACpB,IAAA,CACF,WAAG,IAAA,CACA,MAAA/iB,EAAA,OAAA,YAAA,IAAA,SAAA2iB,EAAA,OAAA,CAAA,IAEyB,CAAA,CAAA3iB,EAAA,cAAA,IAG5B,CACO2iB,KAAAA,QACW3iB,EAAA,OACdd,OAAW,CACHc,QAASme,CAAAA,CAAAA,EAAOkF,QAChBP,UAAAA,CAAAA,CAAAA,EAAAA,UACA9mB,OAAAA,CAAS,CAAAgE,EAAA,OACb6S,OAAM,CAAA,CAAA7S,EAAA,sBACWud,CAAAA,CAAAA,EAAAA,cACf0F,KAAQ,CAAA,CAAAjjB,EAAA,KACNsjB,OAAAA,CAAS,CAACtjB,EAACA,OACXujB,OAAAA,CAAAA,CAAAA,EAAavjB,MAAOujB,CACHC,CACAC,EACQC,IAAAA,EACjB1jB,EAAOgN,OACf2O,KAAAA,EAAU3b,KAAO2b,MAAAA,EAAAA,QAAAA,GAAAA,CACjBzH,EAAQ,KAAElU,OAAOkU,CAAAA,EAGvByP,IAFI,OAAA3nB,EAAA,KAAA,OAAAyH,CAAA,CAOJ0a,CAAAA,EACE,MAAIyF,EAAaX,EAAa,UAAAjnB,EAAA,KAAA,OAC5B6nB,GAAmBZ,EAAU,EAC/BW,EACED,GAAAA,EAAAA,KAAAA,IAAAA,CACFG,GAAA9nB,CAAA,CACD,CAAA,EAAA,MAAA+gB,GAAA,CACK6G,MAAAA,EAIJ5jB,CACA8iB,GAAAA,QAAoBA,CACpB9mB,CACD,CAEG8mB,CAAAA,EAEA1kB,GAAcpC,CAAA,EAAA,MAAiB+gB,GAAA,CAC/BgH,MAAAA,EAIGC,CACC5lB,GAAQqkB,QACR3B,CAAK4B,CAAAA,CAAAA,CAAAA,EAAmDqB,GAAC,EAAA,MAAAhH,GAAA,CAC3D,MAAC2F,EAEHoB,CACE1lB,GAAAA,QACA0iB,CAAK4B,CAAAA,CAAAA,CAAAA,CAAC,EAAA,GAAA,CAAkD,EAAC,SAC1D,CAAAhd,EAAA,KAAA,CAAA,SACHA,EAAAgC,EAAA,CACF,GAAA,QACEqc,CAAAA,CACE3lB,CAAAA,EAAAA,EAAAA,WACA0iB,SAAAA,EAAK4B,KAAAA,CAAAA,SAAAA,EAAAA,KAAAA,CAAAA,SAAC,CAAAnd,EAAA,QAAA,CAAA,SAAA,CAAAG,EAAA,QAAA,CAAkD,KAAA,WAAC,SAAAue,GAAAjB,EAC1D,KAAA,eACH,QAAAF,EACI,SAAA,MAAAlmB,GAAA,CACR,KAAA,CAEA8I,QAAAA,CAAA,IACEgC,OAAA,GAAAqZ,EAAA,CAAuC,MAAAmD,EAAA,MAAA,aAAA,kBAAA,EAEzCA,IAAA,YACE,EAAA,KAEI,EAAA,EACExe,IAAA,UACO,MAAAgd,EAEA,CACII,GAAAA,QAAAA,CAEP,CAAM,EACN,MAEEI,EAAmB,EAAMiB,CAEvBjB,CAA0B,CAAA,EAAA,IAC5Bxd,EAAOgC,EAAA,CACLwb,GAAAA,SACA,OAAA,CACEpC,EAAAA,CAAAA,CAAK4B,MAAAA,MAAAA,MACHA,EAAA,CAA+E,GACjF,QAAA,CACF,CACF,EACF,CACEQ,MAAAA,WACF,MAAAR,EAED,CACH,GAAA,QAAA,CAAA,CAOM,EACEziB,CACA+H,MAAK0a,WAAAA,MAAAA,EAAE,CAAQ,GAAA,QAAA,CAAC,CAElB,CAAA,EACEziB,IAAAA,GAAOyF,EAAA,SAAA,CACPsC,MAAK0a,EAAAA,MAAAA,SAAAA,EAAAA,KAAAA,CAAAA,CAAAA,CAAE,EAAA,WAAiB,CAAA,EAAChd,EAAA,SAAA,CAC3B,KACA,SACEzF,SAAOgkB,GAAAjB,GAAA,CAAAF,CAAA,CAAA,CACFJ,CAAAA,CAAAA,CAAAA,CAAE,CAAA,EAAAhd,EAAA,MAAA,CAAA,MAAA,gCAAW,MAAC,CAAA,MAErBwC,MACA,EAAoBjI,UAAa+H,SAClCtC,EAAA,MAAA,CAAC,MAAA,yBAAA2D,SAAAA,EAAA,MAAA,CAAAC,oBAnBJ,SACO5D,EAAA,KAAA,CACLqC,SAAUkc,CAAAA,CAkBJ,MAAA,UAAC,MAAAvB,EAGb,CACQ,GAAA,QAAA,CACC,CACE,EACT,CACQ,MAACI,YAAmBrd,MAE5Bid,EAAmCjd,CACtB,GAAA,QAAA,CACT,CAEI,EACExF,CACA+H,MAAK0a,SAAAA,MAAAA,EAAE,CAAU,GAAA,QAAA,CAAC,CAEpB,EACEziB,CACA+H,MAAK0a,SAAAA,MAAAA,EAAE,CAAO,GAAA,QAAA,CAAC,CAEjB,EACEziB,CACA+H,MAAK0a,gBAAAA,MAAAA,EAAE,CAAQ,GAAA,QAAA,CAAC,CAElB,EACEziB,CACA+H,MAAK0a,OAAAA,MAAAA,EAAE,CAAS,GAAA,QAAA,CAAC,CAEnB,EACEziB,CACA+H,MAAK0a,SAAAA,MAAAA,EAAE,CAAiB,GAAA,QAAA,CAAC,CAE3B,EACEziB,CACA+H,MAAK0a,SAAAA,MAAAA,EAAE,CAAO,GAAA,QAAA,CAAC,CAEjB,CAAA,EACEziB,IAAAA,GAAOyF,EAAA,KAAA,CACPsC,SAAK0a,EAAAA,QAAAA,CAAAA,SAAAA,CAAAA,EAAAA,QAAAA,CAAE,KAAA,WAAA3iB,KAAAojB,EAAA,KAAA,CAAY,EAAA,IAAAA,EAAA,KAAA,CAAA,CAAC,CAAA,CACtB,CAAA,CACA,CAAA,CACS,CAAA,CACFT,CAAAA,CAAAA,CAAAA,EAAAA,GAAEhd,EAAA,MAAA,CAAA,MAAA,cAAA,SAAWA,EAAA,IAAA,CAAA,SAACA,EAAAgC,EAAA,CAAA,GACpB,SAED,WAAAjC,CACE,EAAAC,EAAAD,IACE,GAAOG,mBAAKvG,CAAA,GAAA,SAAuBY,CAAAA,EACvB,EACPyF,EAAA,IAAA,CAAA,CAAA,CAAA,CAEV,CAAA,CACC,CAAA,CACD,CAAA,CAAC,CACH,CAAA,CAGL,CAAA,CAAW,CAAA,EAAAA,EAAaD,IAAAA,CACtB,MAAA,mBACE,SAAA1F,EAAA,QAAA,CAAA,SAAAsJ,EAAAA,EAAA,CAAA,GAAA,SAGO,WAAC5B,CAA+B,EAAA/B,EAAIG,IAAAA,CAAAA,CAAAA,CAASa,CAE5C,CAAA,CADQ,CAAA,CAAC,CAAA,CAAA,CAGV,CAAA,CACN,CC7wCnB,MAAM0d,GAAYA,IAAM,CACtB,IAAIC,EAAQnlB,WAAW,IAAM,CAC3B,MAAMolB,EAAUxoB,SAASyoB,eAAe,SAAS,EACjD,GAAID,EAAS,CAEX,MAAME,EAAgBF,EAAQ7f,cAAc,uBAAuB,EACnE,GAAI+f,EACFA,EAAcC,MAAK,MACd,CAEL,MAAMC,EAAqBlS,MAAMC,KAC/B6R,EAAQvgB,iBAAiB,iBAAiB,CAC5C,EAAEuW,KAAMqK,GACaA,EAAOC,sBAAqB,EAC7BzU,MAAQ,CAC3B,EACGuU,EACFA,EAAmBD,MAAK,EAGxBH,EAAQ7f,cAAc,iBAAiB,GAAGggB,QAAK,CAEnD,CACF,KAAO,CACL,MAAMI,EAAS/oB,SAASiI,iBAAiB,sBAAsB,EAC/D,GAAI8gB,GAAQ1kB,OAAQ,CAElB,MAAM2kB,EAAQD,EAAOA,EAAO1kB,OAAS,CAAC,EAChC4kB,EACJD,EAAMrgB,cAAc,iBAAiB,GAAKqgB,EAC5C,GAAIC,EAAmB,CACrBA,EAAkBN,MAAK,EACvB,MACF,CACF,CAEA,GADiB3oB,SAAS2I,cAAc,gBAAgB,EAC1C,OAEd,MAAMugB,EAAQlpB,SAASiI,iBAAiB,iBAAiB,EACnDkhB,EAAOD,EAAMA,EAAM7kB,OAAS,CAAC,EAC/B8kB,GAAQA,EAAKrN,WAAa,IAC5BxZ,EAAAA,MAAQga,CAEV,CACF,EAAA,GAAA,EACF,MAAO,IAAA,aAAAiM,CAAA,CACP,ECxCa,SAASa,GAAkBjqB,EAAI,CAC5C,GAAI,CAACA,EAAI,OACT,MAAM8Z,EAAWoQ,GAAW,EACtBC,EAAqBtnB,EAAOiX,EAASI,QAAQ,EACnDpX,EAAU,IAAM,CAMZqnB,EAAmBpnB,SACnB+W,EAASI,WAAaiQ,EAAmBpnB,SAEzC/C,IAAE,CAEN,EAAG,CAAC8Z,EAASI,SAAUla,CAAE,CAAC,CAC5B,CCnBA,SAASoqB,GAAkB,CAAEC,KAAAA,EAAMjmB,SAAAA,CAAS,EAAG,CAE7C,GAAI,CAACkmB,EAAUC,CAAM,EAAIF,EAAKG,MAAM,GAAG,EAClCD,IAAQA,EAASnmB,GACtB,MAAMqmB,EAAcC,GAASC,QAAQN,CAAI,EACzC,OACE/f,EAAA,MAAA,CAAKS,MAAM,cAAaP,UACtBF,EAAA,OAAA,CAAMS,MAAM,gBAAgB+C,MAAO2c,EAAYjgB,UAC7CC,EAAA,IAAA,CAAGM,MAAM,kBAAiBP,SAAE8f,CAAAA,CAAY,EACxC7f,EAAA,OAAA,CAAMM,MAAM,YAAWP,SAAC,GAAA,CAAO,EAC/BC,EAAA,IAAA,CAAGM,MAAM,gBAAeP,SAAE+f,CAAAA,CAAU,CAAC,CAAA,CACjC,EACNjgB,EAAA,MAAA,CAAKS,MAAM,gBAAeP,UACxBF,EAAA,OAAA,CAAMS,MAAM,KAAIP,UACdC,EAAA,OAAA,CAAMM,MAAM,6BAAA,CAA+B,EAAC,IAACN,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAC,CAAA,CAChE,EAAE,IACRwF,EAAA,OAAA,CAAMS,MAAM,KAAIP,UACdC,EAAA,OAAA,CAAMM,MAAM,2BAAA,CAA6B,EAAE,IAC3CN,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAgC,CAAC,CAAA,CAC7B,CAAC,CAAA,CACJ,CAAC,CAAA,CACH,CAET,CCjBA,MAAM8lB,GAA0B,CAC9B,aACA,YACA,YACA,YAAY,EAERC,GAA8BD,GAAwBnT,KAAK,GAAG,EAEpE,SAASqT,GAAoB,CAAErL,KAAAA,EAAMza,MAAAA,EAAO8H,SAAAA,EAAUie,MAAOzY,CAAE,EAAG,CAChE,KAAM,CAAC0Y,EAAUC,CAAW,EAAInnB,EAAS,CAAC,CAACkB,CAAK,EAChD,OACEsF,EAAA,KAAA,CAAAE,UACEC,EAAA,KAAA,CAAAD,SACEC,EAAA,QAAA,CACEE,KAAK,OACL8U,KAAM,qBAAqBnN,CAAC,UAC5B9P,aAAcid,EACd3S,SAAAA,EACAoe,UAAW,IACXC,SAAUH,EACVI,IAAI,MAAA,CACL,CAAA,CACC,EACJ3gB,EAAA,KAAA,CAAAD,SACEC,EAAA,QAAA,CACEE,KAAK,OACL8U,KAAM,qBAAqBnN,CAAC,WAC5B9P,aAAcwC,EACd8H,SAAAA,EACAoe,UAAW,IACXnL,SAAWpe,GAAMspB,EAAY,CAAC,CAACtpB,EAAE0pB,cAAcrmB,KAAK,EACpDomB,IAAI,MAAA,CACL,CAAA,CACC,CAAC,CAAA,CACH,CAER,CAEA,SAASE,GAAiB,CAAE7f,QAAAA,EAAUA,IAAM,CAAC,CAAE,EAAG,CAChD,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAAC8Y,EAAS4O,CAAU,EAAI1nB,EAAS,IAAI,EACrC,CAAC2nB,EAAeC,CAAgB,EAAI5nB,EAAS,IAAI,EACjD,CAAC6nB,EAAeC,CAAgB,EAAI9nB,EAAS,IAAI,EAEvDhB,EAAU,IAAM,EACb,SAAY,CACX,GAAI,CACF,MAAM+oB,EAAM,MAAM1nB,EAAMM,GAAG0C,SAAS2kB,kBAAAA,EACpCN,EAAWK,CAAG,EACd/D,EAAW,SAAS,CACtB,MAAY,CACV3kB,SAAe,CACf2kB,CAAkB,GAAA,CACpB,EACF,CAAA,CAAG,EACL,KAAK,CAEL3kB,YAAAA,EACA,OAAAsiB,EAAQsG,OAAAA,EAAatG,OAAAA,CAAAA,EAAQuG,GAAAA,CAAAA,EAAQC,CAAO,KAAAC,EAC5C,OAAAC,CAAM,EAAED,GAAAA,CAAAA,EAAMC,EAAAA,EAAAA,IAAAA,IAAsB,CAAA,GAAAH,EAAA,CAAA,CACpC,KAAMI,QAEN,IAAMC,CACU,CAAA,EAAE1hB,CAAAA,EAAM,GAAAghB,EAAA,CAAA,CAAS3O,KAAKgP,QAAQ,IAAIL,CAC3B,CAAA,EAAEhhB,CAAAA,CAAM,EAASqS,EAAK2O,CAAAA,GAAAA,EAAAA,CAAAA,CAAe,KAAO,QAEnE,IAAMW,CACU,CAAA,EAAE3hB,CAAAA,EAAM,GAAA8gB,EAAA,CAAA,CAASzO,KAAKiP,QAAQ,IAAIR,CAC3B,CAAA,EAAE9gB,CAAAA,CAAM,EAAA,OAAc8gB,EAAAA,MAAAA,CAAe,MAAO,QAGnE,GAAA,yBACO1gB,SAAM,CAAA,CAAA,CAAAU,GAAAhB,EAAA,SAAA,CAAQ3F,KAAG,6BAEV6F,QAAKc,EAASV,SAAMN,EAAAS,EAAA,CAAcN,KAAAA,IAAiBJ,IAAAA,EAC1Ca,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAO,CAAA,EAAC6D,EAAA,SAAA,CAAC,SAAEA,EAAA,IAAA,CAGnCA,SAAAA,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAAA,CACE,CAAA,CAAA,CAAA,EAAAC,EAA0B,OAAA,CAAC,SAC1B8gB,IAAA,UAAA9gB,EAAA,IAAA,CAELA,MAAA,WAAAD,SACG+gB,EAAAA,GAAY,CACRxgB,OAAM,EAAA,CAAUP,CACV,CAAA,EAAC+hB,EAAAA,OAAM,CAAA,SAAE5qB,GAAA,CACfA,EAEH2I,eAAA,UACmB,IAAA,SAAA3I,EAAA,MAAA,EACbmJ,EAAAA,EAAe,IAAA,QAAA,EACXyZ,EAAAA,EAAeC,IAAAA,QAAW1Y,EAC1BmgB,EAAS1H,EAAa,IAAA,cAAQ,EAC9ByH,EAAAA,EAASzH,IAASnG,MAAI,EACtB2N,EAAuB3N,EAAkB,QAAA,iBAAA,kCAAA,EACzC8N,EAAgB9N,CAAAA,EACtBoO,EAAMA,QACJJ,GAAAA,CAGF,eACAI,CAAAA,EAAAA,EAAAA,CAAAA,IAAgCC,MAAAA,oCAAU,GAAA,CAAA,EAClChN,EAAOgN,EAAMhN,MAAAA,EAAAA,MAAAA,KAAAA,EAAAA,GACnBsL,GAAUA,GAAU/lB,MAEAA,CAAQynB,IAAAA,EAAqB1B,CAAA,EAAA,CAAA,GACjD2B,GAAoB1nB,EAAAA,CAAO,EAAAA,EAEzB0nB,CAAAA,EAA+B1nB,EACjC,QAAAynB,GAAA,CACDA,EAAA,MAAA,CAAAA,EAAA,QAEDC,EAAAA,SAEID,CAAAA,GAAc,SAChB,CACD,GAAA,CAEA,MAAAE,EAAY,MAAAxoB,EAAA,GAAA,SAAA,kBAAA,CACP,OAAAyoB,EACF,OAAMD,EACJV,YAAAA,EACAD,KAAAA,EACAD,iBAAAA,CAAAA,CAAAA,EACAG,IACAQ,CACD,MAAA,UACDvpB,QAAQga,CACR1R,CAAAA,CAAU,OACRF,EAAO,CAAA,MACPqR,GAAAA,SAAS+P,GAGXxpB,GAAQ4Y,QACR8J,CAAgBjf,CAAAA,CAAAA,CAAI,GAAA,CAAA,EAA2B,SAAC,CAAA0D,EAAA,MAAA,CAAA,MAClD,+BACF,SAAG,CAAAA,EAAA,QAAA,CACL,SAAA,CAAAG,EAAAgC,EAAA,CAAEjC,WAEF,CAAKO,EAAAA,IAAMN,EAAA,QAAA,CAA8BD,YACvCA,KAAAA,SACE1F,OAAA+lB,GAA4B,SAC5BpgB,GAAA,CACEE,MAAKkiB,EAAAlrB,EAAA,OAAA,MAAA,CAAA,EACL8d,GAAKoN,EAAA,CACLC,MAAQjC,EAAAA,IAAAA,gBAAAA,CAAAA,IACSkC,CAAA,CACf,CACA,CACE,CAAA,CAAA,CACArB,CAAAA,EAAAA,EAAAA,MAAAA,CAAqB,MACvB,2BAAA,SACF,CAAAO,EAAAxhB,EAAA,MAAA,CACA,MAAA,aAEJH,SAAA,IAAKS,QAAM,IAAA,CAA0BP,EAClCyhB,eACC,CACElhB,iBAAMuhB,EACN3P,WAAS,CAAA,CAEPrY,EAAwB,SACtB0oB,EAAAA,MAAkBV,CAAAA,IAClBW,EACF,IAAA,EAAA,CACF,CAAA,CAAA,EAAEziB,EAAAA,MAEF,CAAA,MAAUyhB,YAAAA,CAAAA,EAAQ5gB,GAAIf,EAAAC,EAAA,CAAE,SAAE,CAAAE,EAAAS,EAAA,CACvB,KAEL,aAAA,CAAKH,EAAAA,EAAM,MAAA,CAEZ0gB,MAAAA,aACCjhB,SACEC,IAAMU,QAAK,IAAA,CACXV,EAAA,eAAA,CACEM,iBAAMuhB,EACN3P,WAAS,CAAA,CAEPrY,EAAwB,SACtB0oB,EAAAA,MAAkBV,CAAAA,IAClBW,EACF,IAAA,EAAA,CACF,CAAA,CAAA,CAAEziB,CAEF,CAAA,CAAA,CAAUihB,CAAAA,CAAAA,CAAmB,CAAA,EAAAnhB,EAAI,MAAA,CAAA,MAC7B,+BAAA,SAET,CAAAA,EAAA,QAAA,CACG,SAAA,CAAAG,EAAAgC,EAAA,CAERnC,GAAA,QAAA,CAAKS,EAAAA,IAAMN,EAAA,QAAA,CAA8BD,YACvCA,KAAAA,SACE1F,OAAA+lB,GAA6B,SAC7BpgB,GAAA,CACEE,MAAKkiB,EAAAlrB,EAAA,OAAA,MAAA,CAAA,EACL8d,GAAKoN,EAAA,CACLC,MAAQjC,EAAAA,IAAAA,gBAAAA,CAAAA,IACSkC,CAAA,CACf,CACA,CACE,CAAA,CAAA,CACAnB,CAAAA,EAAAA,EAAAA,MAAAA,CAAqB,MACvB,2BAAA,SACF,CAAAI,EAAAvhB,EAAA,MAAA,CACA,MAAA,aAEJH,SAAA,IAAKS,QAAM,IAAA,CAA0BP,EAClCwhB,eACC,CACEjhB,iBAAMshB,EACN1P,WAAS,CAAA,CAEPrY,EAAwB,SACtB0oB,EAAAA,MAAkBX,CAAAA,IAClBY,EACF,IAAA,EAAA,CACF,CAAA,CAAA,EAAEziB,EAAAA,MAEF,CAAA,MAAUwhB,YAAAA,CAAAA,EAAQ3gB,GAAIf,EAAAC,EAAA,CAAE,SAAE,CAAAE,EAAAS,EAAA,CACvB,KAEL,aAAA,CAAKH,EAAAA,EAAM,MAAA,CAEZ4gB,MAAAA,aACCnhB,SACEC,IAAMU,QAAK,IAAA,CACXV,EAAA,eAAA,CACEM,iBAAMshB,EACN1P,WAAS,CAAA,CAEPrY,EAAwB,SACtB0oB,EAAAA,MAAkBX,CAAAA,IAClBY,EACF,IAAA,EAAA,CACF,CAAA,CAAA,CAAEziB,CAEF,CAAA,CAAA,CAAUmhB,CAAAA,CAAAA,CAAmB,CAAA,EAAAlhB,EAAI,IAAA,CAAA,SAC7BH,EAAA,QAAA,CAAA,SAET,CAAAG,EAAAgC,EAAA,CACG,GAAA,QAAA,CAERhC,EAAAA,IAAAA,EAAA,QAAA,CAAAD,KACEF,OAAAE,KAAAA,eACE1F,aAAAinB,EAAkB,UAClBthB,GACEE,SAAK4gB,IAAA,UACL9L,IAAAA,MAAK,CAAA,CACLjd,CAAcupB,CAAAA,CACH,CAAA,EAAAthB,OACW,SAClBH,EAAA,QAAA,CAAM,SACV,CAAAG,EAAAgC,EAAA,CACG,GAAA,QAAA,CAEThC,EAAAA,EAAA,WAAA,CAAAD,aACE0hB,EAAA1hB,KAAAA,OACE1F,UAAA,IAAiB,KACjB2F,IACEjI,SAAAA,IAAc0pB,UACdzM,IAAAA,MAAK,CAAA,CACLyL,CAAW,CAAA,CACN,CAAA,EAAAzgB,OACiB,SAClBA,EAAAgC,EAAA,CAAM,GACV,QAAA,CACG,CAAA,CACN,EAEHhC,EAAA,QAAA,CAAAD,IAAAA,EACE,SAAA,CAAAC,EAAA,QAAA,CAA0B,SAAAH,EAAA,KAAA,CAE5BA,SAAA,CAAAG,EAAA,KAAA,CAAY2hB,SAAAA,EAAAA,EAAAA,CAAoB5hB,GAC9BC,QAAA,CAAAD,CACE,CAAAA,EAAAA,EAAAA,KACEC,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACjB,CAAA,CACJ,CAAA,CACE,CAAA,EAAA2F,EAAA3F,QAAA,CAAA,SAAqB,MAAA,KAAA,CAAC,OACnB,KAAA,IAAA,EAAAqnB,EAAA,MAAA,CAAA,CACH,EAAA,IAAA,CAAA5P,EAAAjK,IAAA,CAEN7H,KAAA,CAAAD,KAAAA,KACgBtF,MAAAA,EAAQgoB,EAAyB,EAAKjgB,EAC9CqF,CAAAA,GAAM,CAAA,EACR,OAAM7H,EAAAqgB,GAAA,CAAErL,KAAAA,EAAWza,MAAAA,EAAW,MAAImnB,EAClC,SACGrB,IAAAA,SAAmB,EAElBrL,CAAAA,CAAAA,CAAAA,CACAza,CAAAA,CAAAA,CACOsN,CAAAA,EAAAA,WACGiZ,CAAY,SACvB,CAAA9gB,EAAA,SAAA,CAEL,KACF,SACM,MAAA,QAEVH,SAAAihB,IAAA,UAAA/gB,QACEC,IAAA,CACEE,IAAK,CACLI,EACA+B,SAAUye,EAAAA,EAAY,YAEpB9f,CAAAA,CAAU,CAAA,EACZhB,EAAA,SAAA,CAAED,KAAAA,SAEF,SAAA+gB,IAAA,UAAA,SAAoB9gB,EAAAgC,EAAA,CAEtBhC,GAAAA,QAAA,CAAQE,CAAK,CAAA,CAASmC,CAAsB,CAAA,CAAA,CAC1C,CAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,CACX,CC5TvB,MAAMqgB,GAAqB,GAE3B,SAASC,GAAa,CACpBC,UAAWvoB,EACXuB,KAAAA,EACAinB,KAAAA,EAAO,GACPC,0BAAAA,EAA4B,EAC9B,EAAG,CACD,KAAM,CAAEppB,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ4nB,EAAwB3qB,EAAAA,EACxB,CAAC4qB,EAAqBC,CAAsB,EAAI5pB,EAAS,SAAS,EAClE,CAAC6pB,EAAcC,CAAe,EAAI9pB,EAAS,CAAA,CAAE,EAC7C,CAAC+pB,EAAkBC,CAAmB,EAAIhqB,EAAS,CAAA,CAAE,EAiCvB,OAhCpChB,EAAU,IAAM,CACTirB,GAAS,wBAAwB,GACjCT,IACJ,SAAY,CACXI,EAAuB,SAAS,EAChC,GAAI,CACF,MAAMvmB,EAAW,MAAMhD,EAAMM,GAAG0C,SAASC,QAAQtC,CAAE,EAAE6oB,aAAahpB,KAAK,CACrEC,MAAOuoB,EAAAA,CACR,EACDhqB,GAAAA,CAAAA,EAAY,OAAA,CAAEwqB,EAAcxmB,SAAAA,EAAU,MACtC,CACEumB,EAAAA,CAAAA,EACAA,EAAA,SAAA,EACF,WAAA,IAAA,CACAE,EAAwB,QAAA,eAAA,CACxBF,SAAAA,SACAzpB,MAAW,SACTupB,CAAAA,CAA6C,EAAA,GAC3CQ,EAAU,MACVC,EAAO,MAAAC,GAAA/mB,EAAA0mB,CAAA,EACRM,KACGA,CAAA,CAMN,MAAIA,CACFL,EAAoBK,OAAAA,CAAa,CACnC,GAAA,CAEAhrB,EAAAA,CAAAA,EAAAA,CAAAA,CAAAA,GACAuqB,EAA8BJ,GAAAK,EAAA,OAAA,EAAAL,GAE/B7iB,EAAA,MAAA,CACL,MAAI6iB,mBAEJ,SAAMc,EAAAA,MAAab,CAIf,+BAEJ,SACEjjB,EAAA,MAAA,CAAKS,MAAM,yBAAkBP,IAAAA,EACtBO,SAAM,CAAAN,EAAA,KAAA,CAAwBD,WACjCiC,EAAA,CAAK1B,GAAM,SAAyBL,OAAK8iB,CAAsBhjB,EAAAA,EAC7DC,QAAA,CACE,CAAA,CAAA,CAAA,EAAA1F,IAAA,UAAA0F,EAAA,IAAA,CAAA,MAA8BpE,WAAKikB,SAAQ7f,EAAA4jB,GAAA,CAAQ,OAAA,EAAA,CACjD,CAEF,CAAA,EAAGtjB,EAAM,OAAA,EAAAN,EAAA,KAAA,CAAUD,MAAAA,gBACVmjB,EAAA,OAAA,GAAA,WAAA,EAAA,GAAA,SAAOA,EAAA,IAAA/Q,GAAAnS,EAAA,KAAA,CAAE,SAAAA,EAAA6jB,GAAA,CAEhBX,QAAAA,YAEO,GAEJnjB,WAEFmjB,MACCnjB,aACG8jB,EAAY1R,EAAA,EAAA,CAAA,EAEXA,EAAAA,EAAAA,CAAAA,CAAAA,CAAAA,CACS,CAAA,EAAAnS,EACT8jB,IAAAA,CAAW,MACXC,yBAAyC,WAC1C/hB,EAAA,CAEJ,GAAA,QAAA,CACC,CAEJ,CAAA,CAAG1B,CAAM,CAAA,CACP,CAAA,CAAA,CAAA,EAzCR,IAyC2C,CC7FjD,MAAM0jB,GAAgB,IAAO,GACvBC,GAAU,GAAK,GAAK,GAAK,IAElBC,GAAa3nB,GACxB,SAAY,CACV,KAAM,CAAE7C,MAAAA,GAAUyB,GAAG,EACfgpB,EAAQ,MAAMzqB,EAAMM,GAAGmqB,MAAMjqB,KAAI,EACvCiqB,OAAAA,EAAMlP,KAAK,CAAClJ,EAAGmJ,IAAMnJ,EAAE1I,MAAM+R,cAAcF,EAAE7R,KAAK,CAAC,EAE/C8gB,EAAM1pB,QACRjB,WAAW,IAAM,CAEfia,GAAMtB,QAAQqD,IAAI,QAAS,CACzB2O,MAAAA,EACAC,UAAW1hB,KAAK1G,IAAG,CACrB,CAAC,CACH,EAAG,CAAC,EAGCmoB,CACT,EACA,CACEpnB,OAAQinB,EACV,CACF,EAEO,eAAeK,IAAW,CAC/B,GAAI,CACF,KAAM,CAAEF,MAAAA,EAAOC,UAAAA,GAAc3Q,GAAMtB,QAAQwB,IAAI,OAAO,GAAK,CAAA,EAC3D,OAAKwQ,GAAO1pB,QACRiI,KAAK1G,MAAQooB,EAAYH,IAE3BC,GAAU,EACHC,GAJkB,MAAMD,GAAU,CAO7C,MAAY,CACV,MAAO,CAAA,CACT,CACF,CAEO,MAAMI,GAAY/nB,GACtBlC,GAAO,CACN,KAAM,CAAEX,MAAAA,GAAUyB,GAAG,EACrB,OAAOzB,EAAMM,GAAGmqB,MAAMxnB,QAAQtC,CAAE,EAAEQ,MAAK,CACzC,EACA,CACEkC,OAAQinB,EACV,CACF,EAEO,eAAeO,GAAQlqB,EAAI,CAChC,KAAM,CAAE8pB,MAAAA,GAAU1Q,GAAMtB,QAAQwB,IAAI,OAAO,GAAK,CAAA,EAChDjb,GAAAA,GAAW,OAAC,CAAEyrB,MAAAA,EAAAA,EAAAA,KAAAA,GAAAA,EAAAA,KAAAA,CAAAA,EAAQ,GAAAK,EAAA,OAAAA,CACtB,CACE,GAAA,CACA,OAAIA,GAASnqB,CAAA,CACf,MAAA,CACA,OAAI,MAGF,eAAWoqB,GAAApqB,EAAA,CAEf,OADE,MAAAkqB,GAAAlqB,CAAA,IACF,OAAA,EAEA,CACE,SAAaqqB,GAAcrqB,EAAG,CAC9B,KAAA,CACF,MAAA8pB,CAEA,EAAA1Q,GAAO,QAASiR,IAAAA,OAAaxqB,GAAM,CAAA,EACjCiqB,GAAM,SAAEA,EAAAA,KAAAA,CAAAA,EAAOA,EAAG1Q,KAAMtB,CAAAA,EAAO+C,IAAKnJ,EAAA,MAAQ,cAAMmJ,EAAA,KAAA,CAAA,EAClDzB,GAAI0Q,QAAO1pB,IAAQ,QAAA,CACjB0pB,MAAAA,EACAA,UAAa,KAAG,IAAKpY,CACrB0H,CAAAA,EAEE2Q,CACA,SAAAO,GAAAzqB,EAAA,CACJ,KAAA,CACF,MAAAiqB,CAEA,EAAA1Q,GAAO,QAASkR,IAAAA,OAAeA,GAAK,CAAA,EAClC,GAAAR,GAAM,OAAA,CAAEA,MAAAA,EAAAA,EAAAA,UAAAA,GAAAA,EAAAA,KAAAA,EAAAA,EAAAA,EAAU1Q,IAAMtB,KACpBgS,EAAK7D,CAAE7lB,EAAQP,EACjBiqB,EAAM7D,KAAK,CAAG6D,EAAAA,YAAkB,cAAcjqB,EAAAA,KAAQ,CAAA,EACtDuZ,GAAI6M,QAAY,IAAE,QAAA,CAChB6D,MAAAA,EACAA,UAAa,KAAG,IAAKpY,CACrB0H,CAAAA,EAEE2Q,CACF,CACF,SAAAQ,GAAAC,EAAA,CACF,KAAA,CACF,MAAAV,CAEA,EAAA1Q,GAAO,QAASmR,IAAAA,OAAeA,GAACC,CAAAA,EAC9B,GAAAV,GAAM,OAAA,CAAEA,MAAAA,EAAAA,EAAAA,UAAAA,GAAAA,EAAAA,KAAAA,CAAAA,EAAU1Q,IAAMtB,KACpBgS,EAAK,OAAQ7D,EAAE,CAAA,EACjB7M,GAAM6M,QAAQ6D,IAAMW,QAAS,CACzBxE,MAAAA,EACF6D,UAAa7D,KAAK,IAAG,CACrB7M,CAAAA,EAEE2Q,CACF,CCxGN,SAASW,GAAmB,CAAEC,cAAAA,CAAc,EAAG,CAC7C,KAAM,CAAE/rB,EAAAA,CAAAA,EAAGC,GAAAA,EACX,OACE8G,EAACS,EAAI,CACHC,KAAK,SACLC,KAAK,KACLL,MAAO,wBAAwB0kB,EAAgB,gBAAkB,EAAE,GACnE3hB,MAAKlH,EAAE,CAAA9B,GAAA,QAAA,CAAmD,CAAC,CAC5D,CAEL,CCLA,SAAS4qB,GAAY,CAAE/qB,KAAAA,EAAM8G,QAAAA,CAAQ,EAAG,CACtC,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C6rB,EAAW,CAAC,CAAChrB,EACbirB,EAAe/sB,EAAAA,EACfgtB,EAAwBhtB,EAAAA,EACxBitB,EAAoBjtB,EAAAA,EAC1BC,EAAU,IAAM,CACV6sB,IACFC,EAAa7sB,QAAQiC,MAAQL,EAAKmJ,MAClC+hB,EAAsB9sB,QAAQiC,MAAQL,EAAKorB,cACvCD,EAAkB/sB,UACpB+sB,EAAkB/sB,QAAQ+iB,QAAUnhB,EAAKqrB,WAG/C,EAAG,CAACL,CAAQ,CAAC,EACb,MAAMM,EACJlC,GAAS,0BAA0B,GACnCA,GAAS,4BAA4B,EAEvC,OACEzjB,EAAA,MAAA,CAAKS,MAAM,QAAOP,SAAA,CACf,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,cAAcH,QAASa,EAAQjB,SACzDC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EACP,IACH2F,EAAA,SAAA,CAAAD,SACEC,EAAA,KAAA,CAAAD,SAAa5D,EAAR+oB,EAAW,CAAA7qB,GAAA,QAAA,EAAe,CAAAA,GAAA,QAAA,CAAJ,CAAe,CAAK,CAAA,CACzC,EACR2F,EAAA,OAAA,CAAAD,SACEF,EAAA,OAAA,CACES,MAAM,YACNmlB,SAAWvuB,GAAM,CACfA,EAAEmJ,eAAAA,EAEF,MAAMyZ,EAAW,IAAIC,SAAS7iB,EAAEmK,MAAM,EAChCgC,EAAQyW,EAASnG,IAAI,OAAO,EAC5B2R,EAAgBxL,EAASnG,IAAI,gBAAgB,EAC7C4R,EAAYzL,EAASnG,IAAI,WAAW,IAAM,KAChDjb,EAAQga,SAAI,GAAA,SACVrP,CACAiiB,GAAAA,CACAC,IAAAA,EACDL,EACD7H,EAAW,MAAS3jB,EAAA,GAAA,MAAA,QAAAQ,EAAA,EAAA,EAAA,OAAA,CAEnB,MAAAmJ,EACK,eAAAiiB,EACEI,UAAAA,CAEJ,CAAA,EAC4DA,EACxDriB,MAAAA,EAAAA,GAAAA,MAAAA,OAAAA,CACAsiB,MAAAA,EACAJ,eAAAA,EACD,UAAAA,CAAA,CACH,EAC2ClI,EACvCha,SAAAA,EAAAA,IACAsiB,CAAgBL,MAChBC,UACF,KAACG,CAAA,CACH,EAEAhtB,eAAYgtB,CACZrI,EACArc,GAAU0kB,CAAA,EAERxrB,GAAMwrB,CAAAA,CAGRlsB,EAAAA,CAAAA,CACE,MAAI0rB,CACFP,EAAAA,OAAAA,EAA0B,MACrBxoB,EAAP+oB,EAEA,CACE,GAAA,QAAA,EAIJ9J,CACUjf,GAAAA,QAAAA,CAHVzD,CAIM,CAAA,CAAsB,GAAA,CAACyD,EAAAA,SACvB,CAAA6D,EAAA,MAAA,CAAA,MAAA,gBAAA,SAAwBH,EAAA,QAAA,CAAA,IAC9B,aACF,SAAA,CAAAG,EAAAgC,EAAA,CACC,GAAA,QAAA,CACL,EAAA,IAAAhC,EAAA,QAAA,CAAED,IAEFC,EAAKM,KAAM,OAAeP,GAAAA,aACjBgb,KAAI,QAAYhb,SACrBC,GAAA3F,SAAAymB,IAAA,UAAkB,IAAE,MACpB,CAAA,CACE7gB,CAAKklB,CAAAA,CACA,CAAA,EAAAnlB,EACL3F,MAAG,CAAA,MACH2a,gBAAK,SACL0L,EAAQ,SAAA,CAAA,MACc,KACtBC,iBAAU,SACV,GACG,SAAAG,IAAA,UAET9gB,SAAA,CAAAA,EAAA,SAAA,CAAKM,MAAM,OAAeP,WACxBiC,EAAA,CACE/B,GAAKmlB,QAAAA,CACLpQ,CAAK,CACL0L,EAAAA,EAAAA,SAAQ,kBACwB3gB,SAEhCC,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAAMwF,CAClB,CAAA,EAAA1F,EAAA,SAAA,CAAA,MAA0C,OACpC,SACR2F,EAAAgC,EAAA,CAAQzH,GAAAA,QAAM,CAAUwF,CACtB,CAAA,CAAA,CAAA,CAAA,CAA6C,CAAA,EAACylB,GAEhDxlB,EAAA,MAAA,CAAA,MAAQzF,gBAAM,SAAMwF,UAClBiC,CAAA,MAAA3H,cAAA,SAAgC,CAAA2F,EAAA,QAAA,CACzB,IAAAqlB,EACH,KAAA,WAETG,KAAAA,YACMllB,SAAMwgB,IAAA,SAAA,CAAe/gB,EAAAA,MACxBglB,GAAA,CAAOzkB,cAAM,EAAA,CAAaP,EAAAA,IAAAA,EACxBC,EAAA,CACEC,GAAAA,QAAKolB,CAAAA,CACLnlB,CAAK,CAAA,CACA,CAAA,EAAAL,QACKihB,CAAY,MACrB,mBACgB,SAACkE,CAAAA,EAAAA,SAAa,CAAA,KAAI,SACrC,SAAAlE,IAAA,UAAA,SAA0D3kB,EAAA+oB,EAIhErlB,CAAKS,GAAM,QAAA,GAEEnE,GAAAA,QAAAA,CADX,CACc,CAAA,EAAM+oB,GAAAllB,EAAAmT,GAAA,CAAC,SAAAhX,IAAAA,UAAAA,MAAAA,MAAAA,kBAAG,SAAA,aAAAA,EAAS,CAEhC+oB,GAAAA,QACa,CACY,EAEtB5R,QAAAA,IAAAA,CACAD,EAAAA,SAAYlX,GAAAA,SAAAA,CAAE,GAAA,CAAA9B,MAAAX,EAAA,GAAA,MAAA,QAAAQ,EAAA,EAAA,EAAA,OAAA,EAAmBmjB,EAAA,SAAA,EAACrc,IAAA,OACnB,SAGbqc,CAAAA,EAEC,WAAY,IAAA,CACPuH,GAAA1qB,EAAA,EAAA,CACF,EAAA,CAAA,CACAmjB,MAAAA,CACArc,EAAU,OAAA,EAAA,MACRF,EAEFtH,CACEorB,GAAAA,QAAuB,CACrB,EAEJlsB,CACA2kB,GAAAA,CACAjC,EAAKjf,SAAAA,EAAAA,SAAAA,CAAAA,KAAC,SAAA,MAAA,eAAA,SAAwB2kB,IAAA,UAAA,SAAC9gB,EAAAgC,EAAA,CACjC,GAAA,QAAA,CACF,CAAG,CACL,CAAA,CAAA,CAAEjC,CAEF,CAAA,CAAA,CACO,CAAA,CACC,CAAA,CAAA,CACgB,CAAA,CAEtB,CChLlB,SAAS6lB,GAAoB,CAAEhD,UAAAA,EAAW5hB,QAAAA,CAAQ,EAAG,CACnD,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAAC8qB,EAAO0B,CAAQ,EAAIxsB,EAAS,CAAA,CAAE,EAC/B,CAACysB,EAAwBC,CAAyB,EAAI1sB,EAAS,CAAA,CAAE,EACjE,CAAC2sB,EAAajU,CAAM,EAAIC,GAAY6C,GAAMA,EAAI,EAAG,CAAC,EAExDxc,EAAU,IAAM,CACdglB,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAM8G,EAAQ,MAAME,GAAAA,EACpBwB,EAAS1B,CAAK,EACd,MAAM2B,EAAyB,MAAMpsB,EAAMM,GAAG0C,SAC3CC,QAAQimB,CAAS,EACjBuB,MAAMjqB,KAAAA,EACTxB,EAAYutB,CAAA,EAAA5I,EAAE8G,SAAAA,CAAAA,MAAO2B,CAAuBzI,EAAC,OAAA,CAC7C0I,CACA1I,GAAAA,CAAoB,EAAA,CACtB2I,CAAS9uB,CAAG,EACVwB,KAAAA,CAAAA,EAAewtB,CAAA,EAAA7sB,EAAA,EAAA,EACfgkB,OAAAA,EAAAA,MAAW,CAAO,MACpB,QACF,GAAG,4BACL,SAAI2I,CAAAA,CAAAA,CAAWhlB,GAAChB,EAAA,SAAA,CAEhB,KAAOmmB,SAEP,oBACO7lB,QAAMU,EAAQ3G,SAAG2F,EAAAS,EAAA,MAA2B,IAErCP,IAAK/D,EAA6BgE,CAAiBJ,GACzDC,QAAK,CAAM,CAAO7D,CAAAA,CAAAA,CAAAA,EAAAA,EAAE,SAAA,CAAA,SAAA6D,EAAA,KAAA,CAAA,SAAOA,EAAAgC,EAAA,CAAC,GAAA,QAAA,CAAG,CAAA,CACzB,CAEV,CAAA,EAAAjC,EAAAA,OACE,CAAA,SAAAA,CAAAA,EACEiC,OAAA,EAAAhC,EAAA,KAAA,CAAA,MAAA,kBAAA,SAAmCmkB,EAAA,IAAAjqB,GAAA,CACjC,MAAAksB,EAAAN,EAAA,KAAAO,GAAAA,EAAA,KAAAnsB,EAAA,EAAA,EAEN2F,OAAAG,EAAA,KAAA,UACGmkB,EAAM1pB,UACD6F,KAAM,SAAiBP,MACxBokB,SAAWjqB,EAAS,UAAA,EAAA,GACnB,aAAe4rB,UAGf,QACE,IAAA,CAAA/lB,WACE,GACEG,SAAK,CACLI,GAAO,CACGwgB,QACD3gB,EAAM,GAAA,MAAA,QAAAjG,EAAA,EAAA,EAAA,SAAA,OAAA,CACbmjB,WAAoB,CAAAuF,CAAA,CACpB,CAAC,EAEG,MAAIwD,EAAQ,GAAA,MAAA,QAAAlsB,EAAA,EAAA,EAAA,SAAA,OAAA,CACV,YAAeiqB,CACZxnB,CACgB,CAAA,EAGrBoV,EAAA,CACE,MAAMrY,CAEa2jB,EACfiJ,OAAa1D,EAAS,MACvBzmB,EAAAiqB,EAGLrU,IACO7a,QACPwB,EAGQyD,CACF,GAAA,QAAA,CAHNkhB,CAGM,CAA6B,CAAClhB,GAAAA,CAAAA,EAC9B,SAAA9B,CAAAA,EAAAoG,EAAA,CAAA,KAAwB,eAAA,IAC9B,IAAA,CAAA,EACFT,EAAA,OAAA,CACF,SAAG9F,EAAA,KAAA,CACL,CAAA,CAAA,CAAA,CAEK,CAAA,CAAM,CAAA,CAAmB,CAAA,EAAA4mB,IAC9B,UAAA9gB,EAAA,IAAA,CAAA,MAAA,WAAYqD,SAAarD,EAAA4jB,GAAA,CAAA,OACnB,EAAA,CAAA,CACN,CAAA,EAEP9C,IAAA,QAAA9gB,EAAA,IAAA,CACC,MACF8gB,WACCxgB,SAAMN,EAAAgC,EAAA,CAAUjC,GAAAA,QACV,CAAA,CAAO,CAAA,EAAEC,EAAA,IAAA,CACf,MACD8gB,WACCxgB,SAAMN,EAAAgC,EAAA,CAAUjC,GAAAA,QACjB,CAAA,CAAA,CAAA,EAAmCF,EAAA,SAAA,CAClC,KAEHG,SAAGM,MAAM,SAAUP,QAAAA,IACjBiC,EAAA,EAAA,EAAA,SAAA8e,IAAA,UAAA,SAAuB,CAAA9gB,EAAAS,EAAA,CAG3BZ,KAAA,OACEK,KAAK,GAAA,CACLI,EAAAA,IAAMN,EAAA,OAAA,CACNG,SAASA,EAAM+lB,EAAAA,YACO,CAAUnmB,CAE3B,CAAA,CAACW,CAAK,CAAA,CAAA,CAAY,CAAA,EAAGylB,GAC1BnmB,EAAAkE,GAAA,CAAA,QAAAnE,IACE1F,EAAAA,SAAAnD,EAAA,eAAAgvB,EAAsB,EAAA,CACjB,EAEL,SACLC,EAAAA,GACCnmB,SACkB,KACd,QAAMqB,GAAauf,CACjBsF,EAAAA,QAAAA,WACFnU,EAAA,EACAhS,EAEU,EAAA,CACV7F,CAA4BA,CAAAA,CAE1B,CAAA,CAAA,CACE6X,CAAAA,CAAO,CCpIvB,SAASwU,GAAiB,CACxBpU,QAAAA,EACAsP,KAAM+E,EACNC,qBAAAA,EAAuBA,IAAM,CAAC,EAC9BzlB,QAAAA,EAAUA,IAAM,CAAC,CACnB,EAAG,CACD,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1CqtB,EAActuB,EAAO,IAAI,EAE/BC,OAAAA,EAAU,IAAM,CACd,IAAIsmB,EACJ,OAAI+H,EAAYpuB,SAAW,CAACkuB,IAC1B7H,EAAQnlB,WAAW,IAAM,CACvBktB,EAAYpuB,QAAQymB,QAAAA,CACtB,EAAG,GAAG,GAED,IAAM,CACXxlB,aAAaolB,CAAK,CACpB,CACF,EAAG,CAAA,CAAE,EAGH9e,EAAA,MAAA,CAAKS,MAAM,QAAQjG,GAAG,yBAAwB0F,SAAA,CAC3C,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,cAAcH,QAASa,EAAQjB,SACzDC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEV2F,EAAA,SAAA,CAAAD,SACEC,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsJ,EAGMuO,GAAS0N,UAAY1N,GAASyN,IAAAA,EAAIjc,WAAA,CAAAC,EADtC5D,EAAA,OAAA,CAAMM,MAAM,cAAA,CAEN,CAAA,CAAC,CACF,CAAA,CACN,CAAA,CACG,EACRN,EAAA,OAAA,CAAAD,SACEF,EAAA,OAAA,CACE4lB,SAAWvuB,GAAM,CACfA,EAAEmJ,eAAAA,EAEF,MAAMohB,EADW,IAAI1H,SAAS7iB,EAAEmK,MAAM,EAChBsS,IAAI,MAAM,EAC5B8N,GAAMkF,KAAAA,IAAWH,GAAaG,SAChCtJ,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAMuJ,EAAkB,MAAMltB,EAAMM,GAAG0C,SACpCC,QAAQwV,GAAS9X,EAAE,EACnBonB,KAAK3L,OAAO,CACX+Q,QAASpF,CAAAA,CACV,EACH/oB,EAAQga,WACR2K,EAAoBuJ,CAAA,EACpBH,EAAAA,CACAzlB,OAAAA,EAAQ,GACE,OAAA,EACVtI,MAAAA,YAAeyD,EAEfif,CAAgBjf,GAAAA,QAAAA,CAAI,CAAA,CAAA,CAAgC,GAAA,EACtD,EACC,SACL,CAAA6D,EAAA,WAAA,CACF,IAAA0mB,EAAE3mB,KAAAA,OAGAE,SAAKymB,IAAAA,UACL1R,IAAAA,OACA3S,SAAUye,CAAY,CAAA,EACtBH,EAAI,SAAA,CAAM5gB,SAETymB,CAAAA,EAAAA,SAAAA,CAEH3mB,KAAA,SAAAE,MAAAA,QAEIG,SAAK4gB,IAAA,UACLxgB,QAAM,IAAA,MAENH,EACEa,SAAAA,EAAUgB,EAAA,CACZ,GAAA,QAAA,CAAEjC,CAEF,CAAA,EAAA1F,EAAA,OAAA,CAAA,SAAoB,CAAA2F,EAAA4jB,GAAA,CAEtB/jB,OAAA,GAAAE,OAAA+gB,IACG8C,SAAM,CAAA,EAAC9B,EAAAA,SAAM,CAACtpB,SAAQsoB,IAAY,UAAY,KAC/C9gB,SAAQqC,SAAUye,EAAAA,EAAY,CAAW5gB,GAAK,QAAA,CAAQH,CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAA8B,CAAA,CAAA,CACvB,CAAA,CACJ,CAAA,CAAA,CACA,CAAA,CACL,CC/Fd,SAAS+mB,GAAmB,CAAErF,KAAAA,EAAMC,OAAAA,EAAQ1gB,QAAAA,CAAQ,EAAG,CACrD,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL6tB,EACJrF,GACIlf,IAAI,CAAC,CAAEwS,KAAAA,EAAMza,MAAAA,CAAAA,IAAY,GAAGya,CAAI;AAAA,EAAKgS,GAAYzsB,CAAK,CAAC,EAAE,EAC1DyS,KAAK;AAAA;AAAA,CAAM,GAAK,GAEfia,EAAOD,GAAYvF,CAAI,GAAKsF,EAAa;AAAA;AAAA,EAAOA,CAAU,GAAK,IAErE,OACElnB,EAAA,MAAA,CAAKS,MAAM,QAAOP,SAAA,CACf,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,cAAcH,QAASa,EAAQjB,SACzDC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEV2F,EAAA,SAAA,CAAAD,SACEC,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA4B,CAAA,CAC1B,CAAA,CACE,EACRwF,EAAA,OAAA,CAAAE,UACEC,EAAA,IAAA,CACE0B,MAAO,CACLwlB,WAAY,UAAA,EACZnnB,SAEDknB,CAAAA,CACA,EACHjnB,EAACmnB,GAAgB,CAACC,eAAc,GAACH,KAAAA,CAAAA,CAAa,CAAC,CAAA,CAC3C,CAAC,CAAA,CACJ,CAET,CCfA,MAAMI,GAAiB,CACrB,GAAK,EACL,GAAK,GACL,GAAK,GACL,GAAK,GAAK,EACV,GAAK,GAAK,GACV,GAAK,GAAK,GAAK,EACf,GAAK,GAAK,GAAK,EACf,GAAK,GAAK,GAAK,GACf,CAAG,EAECC,GAAwB,CAC5B,EAAG,CAAAjtB,GAAA,QAAA,EACH,IAAKktB,GAAa,EAAG,QAAQ,EAC7B,KAAOA,GAAa,GAAI,QAAQ,EAChC,KAAOA,GAAa,EAAG,MAAM,EAC7B,MAAQA,GAAa,EAAG,MAAM,EAC9B,MAAQA,GAAa,EAAG,KAAK,EAC7B,OAASA,GAAa,EAAG,KAAK,EAC9B,OAASA,GAAa,EAAG,MAAM,EAC/B,OAAUA,GAAa,GAAI,KAAK,CAClC,EAEA,SAASC,GAAe,CACtB5rB,KAAAA,EACAjC,SAAAA,EACA8tB,WAAAA,EACAhO,cAAAA,EACAgN,qBAAAA,EAAuBA,IAAM,CAAC,EAC9BiB,mBAAAA,EAAqBA,IAAM,CAAC,EAC5BC,iBAAAA,EAAmB,GACnBC,mBAAAA,EAAqB,GACrBC,sBAAAA,EAAwBA,IAAM,CAAC,CACjC,EAAG,CACD,GAAI,CAACjsB,EAAM,OAAO,KAClB,KAAM,CAAEkW,EAAAA,EAAG7Y,EAAAA,CAAAA,EAAGC,GAAAA,EACR,CACJQ,MAAOouB,EACPnuB,SAAUouB,EACVtO,cAAeuO,CAAAA,EACb7sB,GAAAA,EACE8sB,EAAetuB,IAAaouB,EAE5B,CAACG,EAAqBC,CAAsB,EAAI9uB,EAAS,SAAS,EAClE,CAAC0qB,EAAcqE,CAAe,EAAI/uB,EAAS,IAAI,EAE/C,CAAEgB,GAAAA,EAAIulB,KAAAA,EAAMrN,IAAAA,EAAKsN,SAAAA,EAAUwI,OAAAA,EAAQC,aAAAA,EAAc7G,KAAAA,EAAMC,OAAAA,EAAQ6G,MAAAA,CAAAA,EACnE3sB,EACIgnB,EAAYxqB,EAAOiC,CAAE,EAErB,CACJmuB,UAAAA,EACAC,eAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,SAAAA,EACAC,UAAAA,GACAC,OAAAA,EACAC,oBAAAA,GACAC,UAAAA,EACAC,eAAAA,GACAC,SAAAA,GACAzH,KAAM0H,EAAAA,EACJpF,GAAgB,CAAA,EAEd,CAACqF,EAAaC,EAAc,EAAIhwB,EAAS,IAAI,EAC7C,CAACiwB,GAAQC,EAAS,EAAIlwB,EAAS,EAAK,EAEpCmwB,GAAmB5J,EAAKjR,SAAS,GAAG,EAAIiR,EAAO,GAAGA,CAAI,IAAIjmB,CAAQ,GAElE8vB,GAAuBnG,GAAS,wBAAwB,EAE9DjrB,EAAU,IAAM,CACd,GAAIuD,EAAM,CACR,MAAMgW,EAAiBpS,GAAAA,EACvB,IAAIkqB,IACH,SAAY,CACX,GAAIzB,GAAgBxO,EAClBiQ,GAAYrvB,UACH,CAAC4tB,GAAgBD,EAAsB,CAEhD,MAAM2B,GAAkB/tB,EAAKgkB,KAAKjR,SAAS,GAAG,EAC9C,GAAI,CACF,MAAMib,EAAU,MAAM9B,EAAa+B,GAAGC,OAAO5vB,KAAK,CAChD6vB,EAAGJ,GAAkB/tB,EAAKgkB,KAAO,GAAGhkB,EAAKikB,QAAQ,IAAIlmB,CAAQ,GAC7DuG,KAAM,WACN/F,MAAO,EACP6vB,QAAS,EAAA,CACV,EACDtxB,EAAY,kBACZgxB,KAAqBjvB,SAAQ,CAAA,EAAA,GAC3BivB,GAAYE,EAAQltB,SAAYrC,CAAAA,CAAAA,EACE,MACpC,CAAA,CAAA,CAEA3B,GAAAA,CAAAA,UAAe,GACjBkZ,IAAA8X,GAAA,CACFH,GAAA,EAAA,EAEA,MAEA,CAEEA,EAAAA,QAAcG,GACdvB,EAAA,SAAA,EACF,MAAA1E,GAAAqE,EAAA,GAAA,SAAA,cAAA,MAAA,CAEAlF,GAAAA,CAAAA,EAAUtqB,CAIV6vB,CAAAA,EAEA,GAAA,CAEI9tB,MAAKqvB,GAAS,MAAAjG,GAIlB,GAFA0E,EAAA,SAAA,EAEIzE,GAAA,OAAA,CACF,QAAsBA,GAAMD,CAAAA,EAC5B/qB,KACAyvB,EAAuB,CAEnBzE,aAAcjpB,EAChB,UAAAivB,EACAtB,CAAAA,CACA3B,CAAqB,MAAE1C,CAAAA,EAAc2F,OAAAA,CAAAA,CAAW,GAAA,CAClD,CAEAhxB,EAAAA,CAAAA,EAAAA,CAAe,CAAA,EACfyvB,EAAAA,IAAAA,CACFvsB,GAAA0tB,IACFW,GAAGruB,CAAA,CAEP,EAAG,CAACA,EAAM6d,EAAAA,CAAAA,EAEVphB,MAAAA,GAAgB6vB,IAAA,UACVtsB,IAAgBsuB,EAAA,EAAA7wB,EAAA,EAAA,EAClB4wB,CAAAA,GAAkBE,EAAA,EAAA9wB,EAAA,EAAA,EACpB,CAAA+wB,GAAAC,EAAA,EAAAhxB,EAAA,EAAA,EACEuC,CAAAA,GAAM0tB,EAAO,EAAAjwB,EAAA,CAAA,CAAA,EAEjB,WAAgB6uB,CAEhB,SAAOoC,CAAAA,EAAAA,MAAmBJ,CAC1B,MAAOK,UACP,SAAOH,CAAAA,EAAAA,OAAsBC,CACvB,SAAQxE,CAAAA,EAAYxsB,EAAS,OAAE,OAGnCyG,MAAAC,SACEF,EAAAmC,EAAA,CAAK1B,GAAM,QAAA,CAASP,CAClB,CAAAA,EAAAA,EACG4oB,EACC3oB,QAAA,CAAMM,MAAM,gBAAKP,SACfC,EAAAgC,EAAA,CAAA3H,GAAA,SAAyB,OAAA,CAExB,EAACiuB,GACJtoB,EAAA,CAAOM,SAAM,EAAA,CAAeP,CAC1B,EAAAzF,WAAA,CAAAsJ,EAGKL,SAAa+kB,CACZkC,MAAAA,IAAU,CACX,CAAA,CAAC,CAAA,CAAA,CAAA,EAAAxqB,SAHJ,CAAA,CAAA,EAAA8oB,GAAA9oB,EAAA,OAAA,CAAA,MAAMM,aAAM,SAINN,EAAAgC,EAAA,CAAC,GAAA,QAAA,CACF,CAAA,CACF,KAEPhC,EAAO,OAER8oB,CACOxoB,MAAM,aAAYP,SACtBC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,CAAA,CAGN,CAAA,EAAMiG,IAAAA,EAAM,OAAA,CAAA,MAAYP,UACtB,SAAA,CAAA,CAAA,CAAAopB,IAAAnpB,EAAA,SAAA,CAAA,KAAqB,SAExB,MAAA,mBACK,MACRH,GAGMK,GAAK,QAAA,CACC,EACD/D,QAAAA,IAAAA,CAAEkuB,GAAA,EAAA,CAAA,EAAA,IAAc,OAAC,SAAArqB,EAAA,OAAA,UACbG,EACPkqB,CAAAA,CAA4B,CAAA,EAC9BxqB,EAAAkT,GAAA,CACA4N,OAAI,CAAM5gB,OAEVC,SAAA,IAAA,EAAkB,eAAO,CAG7BH,MAACkT,QAEW3c,IAASkL,CACnB,EACgB,MACdI,SAAO,SAAA,SAAA,SAELC,OAAQ,WACV3B,EAAA,SAAA,CACF,KAAA,SACAmC,MAAM,QACNsoB,SAASC,GACTC,SAAS3qB,EAAAS,EAAA,CACTuS,KAAAA,OACU9S,KAAK,IAASI,IAAMnE,EAA0B4D,CAC9CW,GAAK,QAAA,CAAY,CAAOvE,CAAAA,CAAAA,CAAAA,EAAE,aAAAjF,GAAA,CAAMsxB,GAAAtxB,EAAA,OAAC,SAAA,CAAG,GAAA,CACpC,MAAA0zB,GAAA,MAAA9C,EAAA,GAAA,SAAA,QAAAlF,EAAA,OAAA,EAAA,MAAA,KAAA,EAEViI,GAAe3zB,EAAM,CACfsxB,MAAatxB,EAEf,GAAC,CAEG,EAGAwB,SAAAA,CAAAA,OAAqCyrB,EAAKrkB,EAAA,CAC1C+lB,SAAAA,CAAAA,EAAS1B,GAAK,CAAA,YACJ,CACVzrB,IACF,YAAA,CACC,OAAA,IAAA0wB,GAAA,MAAAxJ,CAAA,GAAA,CACL,CACF,GAGE7f,SACEF,CAAAA,EAACiD,EAAAA,UAEGlE,CAAAA,EAAAA,EAAAA,OAAY,CAAA,SACVksB,EAAa9oB,EAAA,CAAA,GACXwM,SACF,OAAA,CACD,SAAAqR,CAAA,EACD9f,WAEDU,CAAKC,EAAKV,EAAA,OAAA,CACXA,MAAA,cAAA,CAAAD,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA8f,CAAAA,EAAAA,EAC+C/c,GAAA,CAAA,QAAAa,IAAAA,CAAAumB,GAArC,EAAA,CAAA,EAAY,SAAgC,CAAAlqB,EAAAS,EAAA,CAAA,KAAC,WAAA,CAAA,EAChDT,EAAA,OAAA,CACF,SAAAA,EAAAgC,EAAA,CAETnC,GAACiD,QAAQ,EAELonB,CAAAA,CAAAA,CAAyB,CAAA,EAC3B5G,GAAA,gCAAA,GAAAzjB,EAAAiD,GAAA,CAAE/C,QAAAA,IAEFC,CAAMU,GAAK,EAAA,CAAW,EACtB,SAAAX,CAAAA,IACEiC,CAAA,KAAA,QAAA,CAAA,EAA2BhC,EAAA,OAAA,CACtB,SAAA7D,EAAAgtB,IAKHkB,GAAAA,QAA4B,EAI9BrqB,YACc7D,CAJd,CAIiB,CAAA,CAAA,CAAA,CAAA,EAAAqsB,GAAmB,CAAA,CAAAzE,GAAAlkB,EAAAC,EAAA,CAAA,SAAC3D,CAAAA,EAAAA,GAAAA,CAAAA,QAAAA,IAAAA,CAAGgsB,EAAA,SAAA,GAAA,SAAA,CAAkB,GAAA,CAAC,MAAArN,EAAA,MAAAgN,EAAA,GAAA,SAAA,QAAAlF,EAAA,OAAA,EAAA,OAAA,CACpD,OAAA,CAAA8F,CAAA,CAGVF,EAEG3oB,GAACiD,EAAQgY,CAAA,IACQ,SAAA,EACbqN,GAAAA,EAAAA,UAAuBhsB,EAEjB,CACF,GAAM2e,gBAGO4N,CACV,SAAA7I,CACH,CACAsI,CACA9rB,EAAAA,EAEM,CAAAhC,GAAA,SAAAC,OAAA,CAAAulB,SAAAA,CAAAA,CAAuC,CAAU,CAAC,CAAA1jB,OAAAA,EAAAA,CAAAA,MAClDjF,CAAA,EAAAixB,EAAA,OAAA,CAAA,CAAA,GAAA,CAAAtI,EAAyC,SAAU,CAAA7f,EAAAS,EAAA,CAAA,KACzD,cAAA,CAAA,EACFT,SAAY,CACVob,SAAOjf,EAADjF,EAER,CACC,GAAA,QAAA,EAIL8I,YACY7D,CAJZ,CAKM,CAAA,CAAA,CAAA,CAAA,EAAA0D,EAAuBiD,GAAA,CAAA,QAAC3G,IAAAA,CAAAA,EAAAA,SAAAA,GAAAA,SACxB,CAAA,GAAA9B,CAAsB,MAAAygB,EAAA,MAAAgN,EAAA,GAAA,SAAA,QAAAlF,EAAA,OAAA,EAAA,OAAA,CAAC,QAAA,CAAA6F,CAAA,CACtB,EAER3lB,GAAAA,EAAQgY,CAAA,IACQ,SAAA,EACbqN,GAAAA,EAAAA,eAAgChsB,EAE1B,CACF,GAAM2e,gBAGQ2N,CACX,SAAA5I,CACH,CACAsI,CACA9rB,EAAAA,EAEM,CAAAhC,GAAA,SAAAC,OAAA,CAAAulB,SAAAA,CAAAA,CAAyB,CAAU,CAAC,CAAA1jB,OAAAA,EAAAA,CAAAA,MACpCjF,CAAA,EAAAixB,EAAA,OAAA,CAAA,CAAA,GAAA,CAAAtI,EAAyB,SAAW,CAAA7f,EAAAS,EAAA,CAAA,KAC1C,QAAA,CAAA,EACFT,SAAY,CACVob,SAAOjf,EAADjF,EAER,CACC,GAAA,QAAA,EAIL8I,YACiB7D,CAJjB,CAIoB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,CAAA,EAAAstB,IAACttB,GAAAA,EAAAA,GAAAA,CAAAA,QAAAA,IAAAA,CAAAA,EAAG,SAAA,GAAA,SAAA,CAAA,GAAe,CAAC,GAAA+sB,GAAA,CACjD,MAAAtC,EAAA,MAAAkB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,MAAA,EACE+tB,EAAAxB,CAAA,EAGd6C,EAAwBjB,cAENrsB,EAEZ,CACK,GAAA,SACE+sB,OAAU,CACNtC,SAAAA,CAINwB,CACAD,CACA9rB,CAAAA,CAASF,KAAAA,CAAAA,MACPyqB,EAAA,MAAAkB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,IAAA,EAAA+tB,EAAAxB,CAAA,EAAAuB,EAAA,SAAA,EAAA9rB,GAAAwjB,EAAqD,CACvD,GAAA,SACF,OAAO,CACC+G,SAAAA,CAINwB,CACAD,CACA9rB,CAAAA,CAASF,CAAAA,MACP,CAAAgsB,EAAA,OAAA,EAAAe,GAAA7sB,GAAAwjB,EAA+C,CACjD,GAAA,SACF,OAAA,CACO3oB,SAAAA,CACPwB,CACAyvB,CACA,CAAA,EACWhsB,GAAAA,EACP,CAAA7B,GAAAA,SAAA,OAAAulB,CAAiC,SAAAA,CAAA,CAAkB,CACrD,CACF,CACW1jB,CAAAA,GAAAA,CACP,EAAA,SAAA,CAAA6D,EAAA1F,EAAA,CAAA,KAAA,aAAAulB,CAAAA,EAA+B1jB,EAA/B0jB,GAAiD,CACnD,GACF,QAAA,EAGJ9f,CAEIW,GAAK,QAAA,CAJP,CAKKvE,CAAAA,CAAAA,EACLwrB,GAAA8B,IAAA,CAAA7B,GAAA/nB,EAAAiD,GAAA,CAAA,QAAA,IAAA+kB,EAAA,EAAA,EAAA,SAA0B,CAAA7nB,EAAAS,EAAA,CAAC,KAAAtE,aAAAA,CAAAA,EAAAA,EAAAA,OAAAA,CAC3B,SAAA6D,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoB,CAAA,CAAC,CAAA,CAAA,CACjB,EAEXstB,GAAAA,EAAAA,IAGaxnB,QAASA,IAAM0nB,CAA4B9nB,GAC9C,EAAA,CAAA,EAAmB,SACxB,CAAAC,EAAAS,EAAA,CAAAV,KAAAA,MACE,CAAA,EAAA1F,GAAA,OAAAwF,EAAAC,EAAA,CAAA,SAAoC,CAAAD,EAAA,QAAA,CAC/B,MAAA,YAIZ2oB,SAAAA,CACC3oB,EAAAA,EAACiD,IACU3C,QACPgqB,CAAAA,EAAAA,EAAAA,KAAAA,CAAAA,CAAAA,EAAsBnqB,EAAI,OAAA,CAC5B,MAAA,qBAAED,SAEDU,GAAI,IAAAvG,GAAAA,EAAA,KAAA,EAAA,KAAA,IAAA,CAAA,CAACwG,CAAAA,CAAK,CAAQ,EAClByjB,EAAM1pB,SACLsF,MAAAA,qBACSO,SAAM6jB,GAAA,MAAA,CAAA,CAAWpkB,CACtB,CAAA,EAAAC,EAAA,OAAA,CAAA,SACAA,EAAAgC,GACA,GAAM1B,QAAM,CAAA,CACgC,CAAA,CAAA,CACrC,CAAA,EAAAN,EAETA,GAAA,EAAA,CAAA,CAAA,CAAA,EAAAypB,IAAa,CAAA7B,GAAA/nB,EAAAC,EAAA,CAAA,YAAsBqkB,GAAM1pB,CAAAA,QAAe,IAAAotB,EAAA,EAAA,EAAA,SAG1D,CAAA7nB,EAAAS,EAAA,CAAAV,KAAAA,aACE,CAAA,EAAA1F,wBAAA,CAAA,CAAA,EAAA2F,EAAmCiC,GAAA,EAAA,CAAA,CAAA,CAAA,EAACpC,EAEvCiD,GAAA,CAAA,QAGJb,IAAAA,CACD,MAEFwnB,EAAAA,IAAAA,GACC7B,MAAAA,EACC9nB,GAAAC,GAAAA,CACYI,UAASA,UAAM0nB,UAAAA,CAAsB,EAAM9nB,GACnDC,EAA2B,CAG7BA,GAACiC,QAAc,CAIZ,EAEL,MAAM8oB,CACN1uB,GAAIF,EAEFE,CAASF,GAAAA,QAAAA,CAAC,CAAA,CAAA,CAAe,EAAC,UACnBjF,EAAGuJ,EAAA,CACV/H,KAAAA,MACA2D,CAAAA,EAAAA,EAAAA,QAASF,CAAAA,SAAAA,CAAAA,EAAAA,EAAAA,CAAAA,GAAC,QAAA,CAAA,EAAA6D,EAAA3F,KAAA,CAAA,CAAA,EAAAwF,EAAA,OAAA,CAAA,MAAuB,kCAAC,SAAA,CAAA,IAAAupB,GAAA,MAAAI,EAAA,CAAA,CACpC,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,EAAEzpB,EAAAA,GAEDU,CAAI,KAACC,EAAW,OACjBb,SAAA,SAAAE,CAAAA,EACEC,EAAAgC,CAAA,KAAA,UAAA,CAAA,IACAhC,QAAA,CACA,MAAMM,oBAAM,SAAiCP,GACzCqpB,CAAAA,CAAqC,CAAA,CAAA,CAClC,CAAA,EACDvpB,EAAA,MAAA,CACA,MACVA,kBAAUoT,SAAMV,CAAAA,EAAAA,GAAAA,CAAKlR,QAAO,IAAA,CAAQtB,GAAAA,CAC5BW,UAAK,UAAA,UAAA6R,CAAA,EACXvS,GAAA7D,EAAgC4D,CAA8B,GAAA,QAAA,CAEhE,CAAW,CAAiBA,MAC1BF,IACWM,EAGLiW,CACA/Z,GAAAA,QAASF,CAAAA,CAAAA,CAAC,CAAA,EAAa,SAAC,CAAA6D,EAAAS,EAAA,CAC1B,WACE/H,CAAAA,EAAAA,EAAAA,QACA2D,SAAAA,EAASF,EAAAA,CAAAA,GAAAA,QAAAA,CAAAA,CAAC,CAAA,CAAA,CAAA,CAAA,EAAA,WAAqB,OAAA,WAAA,WAAA,CAAA,IAAAoW,CAAC,CAAA,GAClC1S,EAAAiD,GAAA,CACF,QAAA,IAAA,CAAE/C,GAAAA,CAEIW,UAAK,MAAA,CACXV,IAAAA,CAAA,CAAAD,CACE,MAAA,CAAkB,MAAA5D,EAGrBia,CAEG7D,GAAAA,QAAAA,CAES,EAEL,CACE6D,EAAgB,SACd7D,CAAAA,EAAAA,EAAAA,CAAAA,KACD,OAAA,CAAA,WACS,CACV7Z,SAAQ4Y,IAAO,CACf8J,GAAAA,QAAKjf,CAAAA,CAAAA,CAAAA,CAAAA,CAAC,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA4nB,GAA+BlkB,EAAAC,EAAA,CAAA,SAAC,CAAAE,EAAAiC,GAAA,CAAA,CAAA,EAAA6mB,EAAAjpB,EAAAiD,GAAA,CAAA,QACxC,IAAA,CACFqlB,EAAA,SAAA,GAAEpoB,SAEFC,CAAMU,GAAK,CACXV,MAAA4mB,EAAA,MAAAkB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,OAAA,EAAA0F,EACEiC,CAAA,EAAA3H,EAAA,SAAA,EAAoBgC,GAAAF,EAGzB,CAEF4nB,GAAAA,SAEC/jB,OAACiC,CAGY9B,SAAAA,CACPgoB,CACA,CACE,CAAA,EACEtuB,EAAM+sB,sBAAkB,GAAMkB,OAG9BpvB,EAAAA,sBAAwBkuB,SACxBwB,MAAAA,CACAD,EAAuB,OAAA,CACvB9rB,CAASF,GAAAA,CAAAA,EAAC,SAAA9B,CAAAA,EAAAoG,EAAA,CAAA,KAAA,QAAA,CAAA,EAAAT,EAAA,OAAA6f,CAAAA,SAAqB7f,EAAAgC,EAAA,CAAA,GAAC,SAAA,OAAC,CACjCnI,SAAAA,CACAA,EACF,WAAY,CACVnB,EAAAA,EAAQ4Y,OAAO,CACf6W,MAAAA,cAA8B,CAChC,CAAA,CACC,CACL,CAAA,CAAEpoB,CAAAA,CAEG,CAAA,EAACW,EAAKwB,GAAA,CAAQ,cACnB,YAAA,wBACE,UAAA,SAAA,SAAA5H,OAAA,MAAAulB,GAAAA,MAC8ChgB,EAAAC,EAAA,CAAA,SAAA6D,CAAAA,EAAAlD,EAAA,CAAA,WAArC,CAAA,EAAAT,EAAMM,OAAM,CAAA,MAAgC,YAAC,SAAAN,EAAAgC,EAAA,CAC/C,GAAA,SACF,OAAA,CAGRE,SAAAA,CAAQ,EAEP8oB,WAAY,CACZ/pB,EAAUjB,EAAA,OAAA,CACD,MAAA,cAAA,CACF,CAAA,CAEL,CAAAD,CACO,CAAA,EAACW,EAAK,OAAA,CAAQ,MACnB,CAAMJ,aAAM,MAAA,EACV,SAAA,CAAAN,EAAAS,EAAA,CAAAnG,KAAAA,MAAA,CAAA,EAAAulB,EAAAA,EAAAA,CAC4C,KAAA,eAAA,CAAA,CAAAlc,CAAA,CAAA,CAAA,CAArC,CAAA,EAAY,SAAgC3D,EAAA,MAAA,CAAA,MAAC,YAAA,SAC7CqnB,GAAA,IAAA4D,GAAAjrB,EAAA8C,GAAA,CACH,QACN,IAAA,CACEpB,EAAO,SAAA,GACLwpB,SAAAA,CACF,GAAA,CAAEnrB,MAEFC,GAAK,MAAA8nB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,KAAA,CAAM,SAAA4wB,CAAA,CACXjrB,EAAMU,EAAKkmB,EAAA,EAAkBuB,EAAA,SAAA,EACxB9rB,GAAAF,GAIA,GAAA,SACRkrB,OAAAA,CAEYlnB,EAAM,OAAAmnB,GAAA2D,CAAA,GAAA,WAAA3D,GAAA2D,CAAA,IAAAnZ,EAAAwV,GAAA2D,CAAA,CAAA,EACb9C,SAAAA,CACA,CACE,CACE,CAAA,EAGUtuB,EACJoxB,sBAAAA,GAAAA,OACFpxB,EAAC,sBAAA,SACLnB,MAAQga,CACR0V,EAAgBxB,OAAAA,EAChBuB,GAAAA,EACShsB,CACP,GAAA,SAAA9B,OAAA,CAAAC,SAAAA,CAAA,CAIuC,CAACulB,CAAAA,CAJrB,CAKlB,GAAA,CAEHhmB,EACAA,SAAAA,OAAOsxB,GAAsBC,CAAAA,GAAAA,WAAAA,GAAAA,CAAAA,EAAAA,EAAAA,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAE7B1yB,CAAAA,CACAyvB,CAAAA,EAAAA,GAAAA,EAAAA,GAAuB,CACvB9rB,QAAAA,GAASF,kBAAAA,SAAAA,aAAC0D,EAAAC,EAAA,CAAA,SAAA,CAAAE,EAAAS,EAAA,CAAA,KAAA,QAAA,CAAA,EAAAT,EAAA,OAAA6f,CAAAA,SAA4B7f,EAAAgC,EAAA,CAAA,GAAA,SAAC,OAAC,CAC1C,SAAA6d,CAAA,EAEJ,WAAA,CAAE9f,EAAAA,EAED,OAAOunB,CAIX,MAAA,cAAA,CACE,CAAA,CAIK,CACVlU,CAAO,CACPE,CAAAA,CAAkB,CAClBD,EACE,QAAAtT,IACEC,CAAKmoB,EAAM,SAAA,GAAU,SACrB,CAAApoB,GAAAA,CACE1F,MAAAusB,EAAA,MAAAkB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,oBAAA,EAAAC,EAAAssB,CAAA,EAAAuB,EAAAtI,SAAAA,EAC8CxjB,GAAAF,EAAAyH,CAA/BtD,GAAAA,SAAsC,OAAA,CAAC,SAAAuf,CAAA,CAE/C,CACF,CACP,IAEK1f,sBAAM,GAAA,YACbgoB,EAAAA,sBAAgC,SAC/B,MAAY,CACXA,EAAI,OAAA,CACF,CAGAzvB,GAAAA,CAIA0vB,EACAD,SAAAA,CAAAA,EAAAA,EAAAA,CACA9rB,KAAAA,QAASF,CAAAA,EAAAA,EAAAA,OAAAA,CAAAA,SAAC6D,EAAAgC,EAAA,CAAA,GAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA6d,CAAAA,EAAAA,EAAAA,GAAa,CAAA,QAAwB,GAAA,QAAC,CAAA+I,EAChD/uB,kBACAA,SAAAA,CAAOsxB,EAAAA,EAAAA,CACT,YACEzyB,CAAAA,EAAAA,EAAAA,QACAyvB,SAAAA,EAAAA,EAAAA,CACF,GAAA,SACC,OAAA,CACL,SAAAtI,CAAA,EAEMnf,WAAK,CACXV,EAAAA,EAAA,OAAA,CAAAD,MACEiC,cAAA,CAAA,CAAA,CAA8B,CACzB,CAAA,CAGXhC,CAAAA,CAAY,CACVoT,EACAiY,UAAUzC,CACVvV,UAAAA,QACE,EACO,kBAAM,SAAA,QACXrT,IAAA,CAAAmoB,EACEnmB,SAAA,GAAA,SAAA,CAAA,GAAA1H,CAAA,GAAAulB,EAAAA,CAC6C,MAAA+G,EAAA,MAAAkB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,QAAA,EAAAsJ,EAAAijB,CAAA,EAAAhjB,EAArC,SAAA,EAAAvH,GAAYF,EAAiC,CAC9C,GAAA,SACF,OAAA,CACP,SAAA0jB,CAAA,CAEO,CACE,CACb,CACAvM,KAAAA,OACSnT,EAAM,MAAA2nB,EAAA,GAAA,SAAA,QAAAsB,GAAA,IAAA/uB,CAAA,EAAA,MAAA,EAIb8tB,EAAAA,CAAgC,EAC/BA,EAAY,SAAA,EACP9rB,GAAAF,EAEA,CAGAzD,GAAQga,SACR0V,OAAAA,CACAD,SAAAA,CACA9rB,CAASF,CAAAA,CAAAA,CAAC,CAAAtC,EAAAS,sBAAA,GAAA,QAAAT,EAAA,sBAAAgmB,SAAAA,MAAuB,CAAAsI,EAAC,OAAA,EAACS,EACrCvsB,GAAOF,EAILzD,CACA0vB,GAAAA,SACAD,OAAAA,CACA9rB,SAAAA,CAASF,CAAAA,CAAC,CAAA,EAAAE,GAAAwjB,EAAsB,CAAC,GAAA,SACnC,OAAA,WAEAhmB,CAA6BuxB,CAE7B1yB,CAAAA,CAEA,CACE2D,GAAAA,CAASF,EAAAA,SAACysB,EAAA/oB,EAAAC,EAAA,CAAA,SAAAzF,CAAAA,EAAAoG,EAAA,CAAA,KAAA,SAAA,CAAA,EAAAT,EAAA,OAAA6f,CAAAA,SAA+B7f,EAAAgC,EAAA,CAAA,GAAC,SAAA,OAAC,CAC7C,SAAA6d,CACExjB,EAASF,WAAAA,CAAAA,EAAC6D,EAAA,OAAA,CAAA,MAAA,cAAA,CAAA,CAAA,CAAA6f,CAAAA,CAA6B,CAAA,CAAA,CAAC,CAAA,EAAAhgB,EAACC,EAAA,CAAA,SAC3C,CAAAE,EAAAS,EAAA,CACF,KAAA,OAAA,CACF,EAAGT,EAAA,OAAA,CACL,SAAAA,EAAAgC,EAAA,CAAEjC,GAED6oB,SACC7oB,OACEC,CAAMU,SAAAA,CAAK,EACXX,YACE1F,EAAA2F,EAAA,OAAA,CAAA1F,MAAA,cAAA,CAAAulB,CAAAA,CAC+C,CAAA,CAAA,CAAA,CAAA,CAArC,CAAA,CAAY,CAAA,EAAAhgB,EAAciD,GAAkB,CAAA,UAAC,SAAA,QAChD,IAAA,CAACjJ,EACH,gBAAA,CACP,QAEFiG,GAAAlE,CAAA,CACO,EAAM,SACXoE,CAAAA,EAAAS,EAAA,CAAA,KAAAV,MACE,CAAA,EAAAC,EAAA3F,OAAA,CAAA,SAAAC,EAAA0H,EAAA,CAAA,GAAA6d,SAAAA,OAC6C,CAAAlc,SAAAA,CAAA,EAArC,WAAMrD,CAAM,EAAgCN,EAAA,OAAA,CAAC,MAAA,cAAA,CAC9C,CAAA,CACF,CACP,CAAA,CAEO,CACbH,CAAS,CAAA,CACP0C,CAAU,CAAA,EACVpC,GAAempB,IAAA7B,GAAAnE,GAAA,wBAAA,GAAAzjB,EAAAC,EAAA,CACbjG,SAAAA,CAAOyxB,EAAAA,GAAkB,CAAA,CAAA,EAAAzrB,EAAAiD,GAAA,CAAA,YACdsmB,CACX1B,EAAA,EAAA,CACF,EAAE3nB,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,QAAA,CAAQ,EACnBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAAwlB,CAAAA,CAAAA,CAC8C,CAAA,EAAA,EAAAlc,CAAA,CAAA,EAAA,CAAAogB,GAArCmE,IAAA,WAAAloB,EAAA4jB,GAAA,CAAA,OAAA,EAAY,CAAA,EAAA,CAAA,CAAAG,GAAgC,CAAAwE,GAAAvoB,EAAAmT,GAAA,CAAA,QAACqV,GAAAQ,EAAA,aAC/ChpB,EAAA,OAAA,CAAA,SACF7D,EAAA6sB,EAIZhB,CAIGjoB,GAAAA,QAEW,EAGLA,CAEIW,GAAAA,SAAe,OACrB,CAAAX,EAAAA,EACEC,MAAAgC,EAAA,QAAA,CAAA,CALA0lB,CAMK,CAAA,EACE,kBAuBhB,SACI,YAEG5F,SAAM4I,kBAIU1B,SAAAA,GACtB3V,cAEclX,IAAAA,EACNqsB,GAAAQ,EAAA3uB,EAAA,MAAAytB,EAAA,GAAA,SAAA,QAAAlF,EAAA,OAAA,EAAA,SAAA,EAA2BzmB,EAAAA,MAAAA,EAAAA,GAAAA,SAAAA,QAAAA,EAAAA,OAAAA,EAAAA,OAAAA,EAC3ByqB,IAAAvsB,EAAAusB,CAAA,EAAAtsB,GAAAmvB,IAAA,CAAA7B,GAAAhB,EAAA,WAAAhjB,EAAgCic,2BAAAA,GAAWsI,EAAA,SAAA,CAC3C,OAAAjxB,EAAA,CAERoc,MAAAA,CAAAA,EACAnR,EAAM,OAAA,CACNE,KAEE8lB,EACA,SAACnoB,EAAY,SAAA,CACX,KAAI,SACF,MAAA,GAAI4mB,GAAAA,EAAAA,aAAAA,EAAAA,GAEJ,qBAA4BoC,EAAA,SAAA,GAQ1BpC,SAAAA,GAEY,SAEd4B,EAAO3oB,EAAAC,EAAA,CACL8mB,SAAAA,CAAAA,EAAAA,OAAkB,CAGpB,SAAA5mB,EAAAgC,EAAA,CAEA,GAAI4kB,QACFwB,CAAAA,CAGA,CAAA,EAAApoB,EACE2nB,OAAAA,CAKAE,SAAAA,EAAAA,EAAAA,CACF,GAAA,QAAA,CACF,CACAM,CAAAA,CAAAA,CAAgC,CAAA,IACtBtoB,EAAAC,EAAA,CACVsb,SAAO,CAAApb,EAAA,OAAA,CACPmoB,SAAAA,EAAAA,EAAuB,CACzB,GAAA,QAAA,CACC,CAAA,CACL,EAAAnoB,EAAA,OAAA,CAAED,SAEFC,EAAAgC,EAAA,CACO,GAAA,QAAA,CACL1B,CAAoD,CACpD,CAAA,CAAqD,CACrD+B,EAAAA,EAAUqoB,EAAAA,EAAAA,CAAQ3qB,SAEjByoB,CAAAA,EAAAA,EACC3oB,CAAAE,KAAAA,MACE,CAAA,EAAAA,IAAAA,SACEiC,CAAA,SAAAhC,EAAAgC,EAAA,CAAuB,GAAA,QAAA,CACnB,CACN,CAAA,CAAAjC,CACE,CAAA,EAAA5D,EAAwB,CAE1B,GACA6sB,QACF,CACE,CACE,CAAA,CAAA,CAAA,CAAA,CAAuB,CAAA,CAAA,CAEzB,CAAA,EAAA,CAAA,CAAAsB,IACEtoB,EAAAA,GAAA,CAAA,QAAA,IAAA3H,CAAA6vB,GAAuB,EAAA,CAAA,EAClB,SACPlqB,EACAqoB,GACFvoB,CAAA,KAAA2hB,EACO,OAAAC,EAAM,QAAQ,IACnB1hB,GAAA,EAAA,CAAA,CAAA,CACE,CAAA,EAAA,CAAA,CAAAuqB,IAAAvqB,EAAAkE,GAAA,CAAA,QAAA,IAAoB,CAAAimB,GACf,EAAA,CAAA,EACNhuB,SAAAA,EAAAA,GAAAA,CAAAA,UAEHymB,EAAA,QAAA,QAAAvoB,IAAA8vB,GAAA,EAAA,CAAA,CAAA,CAAQ,CAAA,EAAA,CAAA,CAAAC,IAACpqB,EAAAkE,GAAA,CAAA,QAEL,IAAA,CAACmmB,GAEZ,EAAA,CAAA,EAEA,SACFC,EAAAA,GACApmB,SACUlD,EACPkpB,KAAAA,GACF,qBAAAqB,GAAA,CAAExrB,EAED+mB,CAAAA,CACCrF,EACAC,QAAAA,IAAAA,GAAAA,EAAAA,CAAAA,CAAAA,CACyC,CAAA,CAAE,CAC5C,CAAA,CAIG,CAEFyI,SAAAA,GAAAA,EAAAA,CAA2B,GAC7B,CAAA5X,EAAA,OAAA,MAAExS,MAED6lB,MAAAA,CAAAA,EAAmB,GAAA,CAAA4F,SACGlzB,KACrB0I,CAA0C,KAAAyqB,EAC1C,SAAAhc,CAIE,EACJzO,EACEqpB,EAAAA,EAAAA,QAAwB,MAAK,EAAA,EAAA,QAAA,MAAA,EAAA,EAAA,OAC/BxqB,EAAAC,EAAA,CAAA,SAAEC,CAAAA,EAEDwmB,OAAAA,CAAgB,MACfpU,qBAASvW,SACHutB,CAAAA,GAAAA,UAAAA,CAAAA,EAAAA,GAAAA,CAAAA,CAAAA,EACN1C,EAAAA,MAAAA,CAAAA,CAAAA,EAAAA,EAAuB1C,OAAAA,CACrBqE,SAAAA,CAA4B,CAAA,CAAA,CAE9B,CAAA,CAC4C,CCl4BxD,MAAMsD,GAAQ,GAERC,GAAuB,IAAO,GAAK,GAEzC,SAASC,GAAuBlC,EAAWhwB,EAAO,CAChD,OAAOA,EAAMM,GAAG0C,SAASmvB,kBAAkBhxB,MAAM,CAC/CR,GAAI,CAACqvB,CAAS,CAAA,CACf,CACH,CACA,MAAMoC,GAA4BvvB,GAAKqvB,GAAwB,CAC7D7uB,OAAQ4uB,EACV,CAAC,EAED,eAAeI,GAAkBnJ,EAAWlpB,EAAO,CACjD,MAAMsyB,EAAgBtyB,EAAMM,GAAG0C,SAC5BC,QAAQimB,CAAS,EACjBhmB,SAAS1C,KAAK,CACbC,MAAO,EAAA,CACR,EACAG,OAAAA,EACAE,KAAAA,EAEG,CAAED,MAAOqC,CAAAA,EAAa,MAAMovB,EAClCtzB,GACA,MAAMuzB,EAAQ,OACZC,UAAOtvB,EACPuvB,QAAAA,EACAC,OAAAA,EACAC,OAAQ,CAAA,EAEV,OAAAzvB,EAAA,QAAA4R,GAAA,CAOA5R,EAASwK,OACP6kB,WACQI,EAAAA,aAAAA,EAAAA,qBAAAA,EAAAA,QAAAA,GACRJ,EAAA,UAIQG,OAAAA,EAAAA,OAAAA,IAAAA,EAAAA,OAAAA,cAAAA,IACRH,EAAA,SAKAA,EAAO,WACCE,CAAAA,EAETvvB,EAAA,SAGDqvB,oBAAqB,KAAA,MAAA,KAAA,MAAA,KAAA,MAAArvB,EAAAA,EAAA,OAAA,CAAA,EAAA,SAAA,GAAA,KAAA,GAKrBqvB,CAEAvzB,CACA,MAAA4zB,GAAOL,GAAAA,GAAAA,CACT,OAAAN,EACA,CAAA,EAAqD,SACnD5uB,GAAQ4uB,CACT,QAAAxZ,EAED,aAAAoa,EAASC,IAAY,CACnBra,EACAoa,WAAAA,EAAsB,SAAA5yB,EACtB8tB,cAAAA,EACA9tB,iBAAAA,EAAAA,EAAAA,EACA8f,CACAkO,KAAAA,CACF,KAAG3T,EACD,EAAA7X,CAAM,EAAE6X,GAAAA,EAAM/a,SACd,cAAM+uB,CAAA,EAAEtuB,GAAAA,CAAO+f,SAAAA,CAAeuO,GAC5BruB,CACD,MAAAmuB,EACD,SAAMC,CAAA,EAAEruB,GAAAA,EAAqBC,CAAAA,EAAUouB,CAAAA,EAAAA,EAAAA,SAAAA,EAAoB5sB,EAAI,OAAAgX,GAAA,SACzD,CAAC2O,EAAAA,CAASzD,EAAAA,IAAuB,KAASlL,CAAA,EAC1Csa,EAAkBta,GAAY,IAAAxY,IAAAouB,EAAA,CAAApuB,EAAAouB,CAAA,CAAA,EACpC1vB,EAAOuD,IAAM8wB,CAEb,GAAMC,CAAAA,EAAAA,CAKNt0B,EAAU8Z,CAAM,EACd,MACEua,CACArP,EAAA,SAAA,GACF,SAAA,CACAA,GAAAA,CACC,MAAAuP,EAAY,MAAAL,EAAA,EACX1yB,EAAI,SAAA,GAAA+yB,EAAA,EAAA,IAAAjzB,CAAA,EAAA,EAAAizB,EACFF,EAAM9wB,CAAAA,EACN/B,WAAmB+B,CACnB8wB,MAAQ9wB,CACRyhB,EAAAA,IAAW,IACD,OAAA,CACV3kB,CACAg0B,GAAAA,CACArP,EAAAA,CAAAA,EAAAA,EAAWkP,CAAO,CAAA,EAAA,KACpB,CACF,KAAA3M,EACF,OAAA2B,EAEA,aAAA/O,EACEoN,IAAAA,EACA2B,UAAAA,EACA/O,YAAAA,EACAqa,OAAAA,EACAlqB,OAAAA,EACA2e,eAAAA,EACAwL,eAAAA,EACApL,MAAAA,EAGAqL,GAAAA,EAAAA,aAAAA,EAAAA,OAAAA,EAGA1yB,KAAAA,EACAiuB,cAAAA,EACAD,IAAAA,GACA5G,SAAAA,EACAuL,SAAAA,GACAza,MAAAA,EACAsN,MAAAA,GACAoN,gBAAAA,EAAAA,EACA1E,GAAAA,CAAAA,EAAAA,IACA2E,GAAAA,GACAC,CACF,OAAA3L,EACA,aAAA4L,EACA,EAAIxxB,GAAA,CAAA,GAAE4lB,CAAAA,GAAAA,gBAAAA,KAAAA,CAAAA,IAAQ4L,GAAAA,CAAAA,gBAAAA,KAAAA,CAAAA,IAAiBxxB,EAAS2lB,EACpC8L,GAAW,GACT9L,GAAW,CAAA,qBAA2B/O,CAAG,IAC3CgP,GAASD,IAGQ/O,MACjB8W,GAAAnV,GAAA,IAAA9Z,IAAAmF,GAAA,EAAA,CAAAnF,CAAA,CAAA,EAAAhC,EACF,IAAA,CACF,MAAAi1B,EAAA,CAAA,EAAA1xB,GAAA,IAAAA,GAAA,UAAAA,GAAA,MAAAA,GAAA,QAAAA,GAAA,cAAAA,GAAA,aAAAA,GAAA,KAEA,GAAM0tB,OAAiBgE,GAEvBj1B,MAAUqE,GAAMiV,GAAA,EACd,IAAM2b,GAAAA,GASN5wB,GAAI4sB,YAAsBgE,CAClB5wB,QAAWiV,KAAAA,EAAY,IAAA4b,GAAA,cAAA5zB,IACzB6zB,GAAAA,KAAU5xB,EACdc,GAAS0K,GAEL+K,CAAAA,EACAqb,IACF7a,GAAAjW,EAAA,CAEF,CACEhE,EAAAA,CAAAA,GAAAA,EAAYiB,IACZgZ,MAAAA,GAAajW,GAAQ6V,EAAA,EACvB,CAAAkb,GAAAC,EAAA,EAAAr0B,EAAA,CAAA,CAAA,EACFs0B,GAAAv1B,EAAA,EACEkxB,GAAuBlxB,EAAA,EAAA,EAE3B,eAAMw1B,KAA+B,EAE/BC,GAACJ,CAAAA,GAAoBC,WAE3BC,WAA0Bv1B,EAAO,GAAA,SAAA,QAAAiC,CAAA,EAAA,UAAA,KAAA,CAC3ByzB,MAAAA,EACN,CAAA,EAAA,OAAA,GAEIH,MAAAA,GAAAA,MAAkBr1B,GAAmBoE,QAClCC,OAEQ+uB,GAAPvxB,KAEDG,EAAO,OAAAsvB,GACZ,KAAA,CACA,MAAArvB,EACA,EAAI+uB,GACJ,IAAIyE,MAEJ,GAAAF,EAAM,CAAEtzB,IAAAA,EAAAA,CAAAA,EAAM,GAAIqvB,CACdmE,EAAW,MAAAr0B,EAAA,GAAA,SAAA,kBAAA,MAAA,CAGXm0B,GAAAA,CAAAA,CAAAA,CACF,CAAA,CACA,MAAI,CACFhC,CAAoEiC,GAC3D,QAAAE,IAAA,CAAA,GAAA,UAAA,CAAA,EAAAD,GACR,CAAA,GAAAD,GAAA,QAAA,GAAAvzB,GAAA,OAAAgzB,IAAA,CAAAO,GAAA,QAAA,KAAAG,IAAAA,GAAA,KAAAV,GAAA,EAAA,CAAA,CAAA,CAAA,MACMr2B,IAAG,SAAC62B,GAAAxzB,GAAA,OAAAgzB,GAAA,CAAAO,GAAA,QAAA,KAAAG,IAAAA,GAAA,KAAAV,EAAA,EAAA,CAAA,GAEbQ,MAAAA,CASF,GAAAnE,GACEmE,MAAAA,EAKA,CAGF,CAAO,MACLG,GAAGtE,EAAAA,EAAAA,eACImE,GAAAA,EAAAA,CACT,OAAAF,GAAA,CAAAK,GAAA,WACFA,GAAA,QAAAx0B,EAAA,GAAA,SAAA,QAAAW,CAAA,EAAA,UAAA,KAAA,CAEM6zB,QACN,CAAA,EAAA,OAAA,GAEIA,MAAkB51B,GAAmBoE,QAClCC,MAEQ+uB,CAED,MACZyC,GAAA1G,EAAA,MAAA7T,GACAwa,GAAgBz0B,EAAMu0B,IAAAA,CAAkB51B,MAAAA,CAAQkC,GAAK,MAAAH,CAAA,GACrD,CAAAwxB,GAAOjC,EAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EACT,CAAAyE,EAAAC,EAAA,EAAAj1B,EAAA,EAEM80B,CAAAA,KAAiCva,EAAAA,EAAAA,SAAAA,EACjCwa,OAA6Bz0B,MAE7B40B,GAAoBC,MAAAA,GAAwBn1B,CAClD,GAAM,CACN,MAAOo1B,GAAAA,MAAqBC,GAA0Br1B,EAASyuB,CAAS,EACxE0G,GAAyBG,GAACN,CAAAA,EAAAA,SAAcnC,MAAAA,EAAAA,EAAAA,CAAAA,CAExC,MAAMqC,CAAAA,CACJ,EACEK,GAAkB,SAAM9C,CAIxBpzB,GAAAA,EACA81B,CAAAA,GACEG,WAEJ,IACEj2B,MAAAA,EAAcxB,MAACo1B,GAAAjyB,EAAAX,CAAA,EACjB40B,GAAArC,CAAA,EACFyC,GAAA,SAAA,CAEA,OACEA,GAAS,OAAA,CACTA,EACA,EACEjI,GAAoB6F,GAAAA,CAAAA,CACpBgC,aAAAA,EACAI,UAAAA,EAAgC,KAEhCh2B,EAAe,YACfg2B,GAAuBhF,EAAO,EAChC,CAAAjC,GAAAuF,EAAA,GACF4B,GAAA,EAGK7K,EAAc2F,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EAAgBmF,EAAAtvB,GAAA2iB,GAAA,CAC3BA,OAAcsG,IAChB+F,EAAAA,CAAAA,EACA10B,EAAK4tB,SAAAA,GAAcuF,EAAAA,EAAAA,IAAgBrzB,CAAG,EAAA,EAAAuoB,EAEjB,EAAA,CACrB7nB,EAAAV,CAAA,CAAA,EACFm1B,GAAArC,GAAAta,GAAA,eAAA,KAAAA,CAAA,EAEDsV,CAAAA,GACH,EAAApuB,EAAA,EAAA,EAEMw1B,CAAAA,EAAkBtvB,EACrB2iB,EAAe7oB,EAAA,EAAA,EACd,OAAI6oB,EAAAA,EAAkB7nB,CACpB3B,SAAQga,CAAAA,SACRga,SAAQxK,KACRroB,MAAO6C,qBAAYwlB,IAAiBvoB,UAAcuoB,WAAAA,EAAAA,GACpD,MAAA,CAED7nB,mBACHozB,GAAA,CAAA,EAEMqB,mBAAcrC,GAAuB,CAAA,EAErC,mBAAkB/E,GAAkB,CAAIruB,EAExC,mBAACuuB,GAAoBC,CAAAA,CAE3B,EACE9nB,SACEF,CAAAA,IAAA,SAAAA,EAAA,MAAA,CACEqS,MAAAA,WACA5R,SAAO,CAAAN,EAAA,IAAA,CACP0B,SAAO1B,EAAAgC,EAAA,CACL,GAAA,QAAwC,CACxC,CAAwC,CACxC,EAAAyqB,EAAAzsB,EAAoBytB,KACpB,SAAAqB,UACF,KAAA3c,EAAEpS,OAED+gB,SACMxgB,IAAM,WAAUP,SACnBC,CAAA,CAAAD,EAAAA,EACEC,OAAAgC,CAAA3H,MAAA,gBAAqC,SAAA8X,CAAA,CACpC,CAED,CAAA,EAAApS,EAAAA,IACG+uB,CACC,SAAS3c,EAAAA,IAAAA,CAAS9Q,KAAAA,GAAgByZ,OAAI,SAAU/a,IAAAA,WAE7C,SAEH,CAAAC,EAAAgC,EAAA,CAAM1B,GAAAA,QAAM,CAAeP,EAAAA,IAAAA,EAAEoS,EAAAA,CAAc,KAAA,UAAA,CAI/CnS,CAAAA,CAAA,CAAAD,CACE,CAAA,CAAA,CAASwS,CAAAA,EAAAA,IAAY,UAAA1S,EAAAC,EAAA,CAAA,SAAa,CAAAE,EAAA,SAAA,CAAA,SAAUD,EAC1CC,GAAA,CAAA,WAAA,OAAA,SAAkCA,EAAK,CAAA,CAAM,CAAA,EAAUH,EAAG,OAAA,CAAA,SACzD,CAAAA,EAAA,MAAA,CAEN,MAAA,OAGJihB,SAAY,CAAA9gB,EAAA,IAAA,CACXD,SACE,mBAAA,CAAAA,EAAAA,MACG8jB,CAAaC,SAAW,wCAAA,CAAOiL,CAAAA,CAAQ,CAAE,EAAAlvB,EAAA,MAAA,CAE5CA,MAAA,uBAAAE,SACEF,CAAAA,EAAA,MAAA,CAAKS,MAAM,mBAAMP,SACfC,CAAAA,EAAA,MAAA,CAAAD,MAAAA,gBACAC,SAAA,CAAAA,EAAA,IAAA,CAAAD,MAAG,qBAA0C,SAAA,KAAA,CAE/CF,EAAAG,EAAA,IAAA,CAAKM,SAAM,QAAA,CAAsBP,CAAAA,CAC/B,CAAKO,EAAAA,EAAM,MAAA,CAAkBP,MAAAA,gBACtBO,SAAM,CAAAN,EAAA,IAAA,CAAeD,MAAAA,qBACrBO,SAAM,MAAA,CAAA,EAAoBP,EAAAA,IAAC,CAAM,SACpC,aAAA,CAAA,CAAAA,CAAG,CAAA,CAAM,CAAI,CAAA,EACVF,EACLA,MAAA,CAAA,MAAKS,QAAM,SAAeP,CAAAA,EACxBC,MAAA,CAAA,SAAS,CAAAA,EAAA,OAAA,CAAoBD,SAAC,IAAA,CAAO,EACrCC,IAAAA,EAAAgC,EAAA,CAAAjC,GAAAA,QAAG,CAAc,CAAC,CAAA,CACf,EAACF,EAAA,MAAA,CAERA,SAAA,CAAAG,EAAA,OAAA,CAAKM,SAAM,IAAA,CAAOP,EAAAA,IAChBF,EAAAA,EAAA,CAAAE,GAAAA,iBACE,CAAA,CAAAA,CAAM,CAAA,EAAQF,EAAC,MAACmC,CAAA,SAAA,CAAAhC,EAAA,OAAA,CAAwB,SAAA,IAAA,CACrC,EACLH,IAAAG,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAAA,CAAM,CAAA,CAAE,CACR,CAAA,CAAA,CAAU,CAAA,EAAAF,EAAmC,MAAA,CAAA,MAE/CA,UAAA,SAAAE,CAAAA,EACEC,OAAA,CAAA,CAAA,EAAAA,EAAA,OAAA,CAAA,MAAAD,UAAM,SAASC,EAACA,SAAA,CAAA,KAAA,SAAA,MAAoB,QAChC,SAAA,GACF,SAAAA,EAAAS,EAAA,CAERZ,KAAA,OAAKS,KAAM,IAASP,IAClBC,EACqBD,CACN,GAAA,QAAA,CAAe,CAAgB,CAAAA,CACrC,CAAA,CAAM,CAAA,CAAA,CAAY,CAAA,CAAA,CAAO5D,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,GAAAA,EAAE2D,EAAA,CAAA,SAAA,CAAA,CAAA,CAAAyoB,GAAA1oB,EAAA,MAAA,CAAA,MAAA,gBAAM,SAAC,CAAAG,EAAA,IAAA,CAAA,SAAGA,EAAAgC,EAAA,CAAC,GACrC,SACH,OAAA,CACH,YAAAsf,CAAA,EAIV1lB,WACEkE,GACGE,EAAEuoB,IAAAA,CAAAA,EACD,CAAW,CAAexoB,CACxB,CAAA,EAAAA,EAAAA,GACEiC,CAAA,QAAAumB,EAAA,SAAA5uB,EAAA,QAAA2nB,GAAAA,CACiBpqB,EAAA,gBAAA,EAAAyM,EAAAA,YAAA4kB,CAAA,CAAI,CAAA,CAAA,CAAC,CAAA,EAAA,CAEf,CAAA/G,GAAA,CAAA,gBAAA,KAAAA,CAAA,GAAAxhB,EAAA,MAAA,CAAC,IAEVA,EAAa,IACXmS,GAASoW,MACT5uB,iBAAAA,GAAAA,mBAAAA,EAAAA,GAAAA,QACAwG,GAAUjJ,CACN83B,EAAAA,OAAAA,YACFn1B,EAAAA,OAAO+iB,MAAc2L,GACvBrxB,EAAA,OAAA,IAAAk2B,IAIH5L,EAAAA,OAAW,gBAAgBxd,aAAW,EAEhCwd,EAAAA,OAAAA,IAAAA,GAEEtqB,EAAA,OAAA,MACLm2B,GAEF4B,EAAAA,OAAU/3B,IAAMk2B,GAEZl2B,EAAA,OAAMmK,OAAOmb,CACI4Q,EAEfl2B,YAAEmK,YACFnK,UAASslB,CAAMgF,EACjB,OAAA,UAAA,IAAA,QAAA,EACF,GAAA,CACEtqB,SAAek2B,OAAAA,gBAAAA,IAAAA,gBAAAA,EAAAA,CAAAA,EAAAA,SAAAA,cAAAA,QAAAA,EACV8B,GAAAC,GAAA,WAAA,KAAA,CACH9tB,mBAAc,EAAA,CAClB,EACF8tB,GAAA,MAAAj4B,EAAA,OAAA,MACAk4B,GAAAA,OAAYl4B,EAAA,OAAA,OACZm4B,GAASn4B,sBAAM,GACXmK,GAAAA,UAAO8Y,EAAAA,OAAc,EAAA,CAAA,EACvB,MAAImV,GAAA,GAmDAC,GAjDap5B,CAAAA,GAAAA,aAAOq5B,EAAAA,EAAAA,GACdA,EACJp5B,EAAAA,KAASq5B,GAAAA,aAAcv4B,EAAA,OAAQ,MAAAo4B,GAAA,EAAAA,GAAAA,EAAA,EAAA,KAAAJ,GAAA,aAAA,EAAAh4B,EAAA,OAAA,OAAAo4B,GAAAA,GAAAA,EAAA,EAAA,KAAAJ,GAAA,aAAAh4B,EAAA,OAAA,MAAAo4B,GAAAp4B,EAAA,OAAA,OAAAo4B,GAAAA,GAAAA,EAAA,EAAA,IAAA,EAAA,IAAAniB,IAAA,CACnC,IAAM+hB,GAAAA,EACJQ,GAAAA,EACDxa,GAAA,EACDia,GAAOzkB,EACPykB,QAAOxkB,GAAAA,EAAWtJ,GAAAA,GAAOsJ,OAAAA,IAAAA,EACrBglB,IAAAA,GAAAA,EAAAA,EACAC,IAAAA,GAAU14B,GAAEmK,CAAAA,EAahB6T,IAAMoa,GAAAA,GAAAA,CAAAA,EACNvjB,IAAM8jB,GAAAA,GACJX,CAAAA,EAsBA,MAAIY,GAAI3iB,GAAA,OAAA,EACR,MAAI+H,CAAI6a,GAAAC,GAAAF,GAAAE,GAAA9a,GAAA8a,GAAAjkB,GAAAikB,EAAA,CACR,CAAA,EACoB7iB,IAAK1S,IAAa,CACpCs1B,KAAAA,CAAK5iB,MAAM+H,GAAAnJ,EAAA,EAAAkkB,GAAAC,EAAA,EACXJ,MAAK3iB,UAAS,KAAC2iB,EAAA,KAAA5a,EAAA,KAAAnJ,EAAA,GACfmJ,CAAAA,EACAnJ,GAAewjB,EAAA,CAAA,MACjB,CACA,CACA,CAIgB,CAAA,EAAAvvB,EAEjB,SAAA,CACD,SAAMuvB,EAAYM,EAAOrtB,GAAK0tB,CAC5B,MAAA,OAAUJ,WAAWG,yBAAgB,EAAA,QAAA,IAAA,GACrC,mBAAgB,CAClB,SAACjwB,EAAA6jB,GAAA,CACD6J,QAAAA,EACAh1B,SAAAA,EAAcm3B,WAAAA,OAAQN,QAAAA,IAAAA,CAAW,CAAA,EACvB,CACV,EAEJ,SAAA,CAAAvvB,EAAA,MAAA,CAGJA,MAAA,mBAAAD,SACG0nB,EAAAA,GACO,QAMJzU,SAAAA,CACE,CAAAjT,CACe,CAAA,EACXoS,EAAAA,GAASvW,CAAAA,QACTjC,IAAAA,CACAmqB,MAAAA,EAAWlE,EAAA,SAAA,GAAA,EAAA,IAAAA,CAAA,GAAA,IAAAA,CAAA,IAAAjmB,CAAA,GACXwG,IAAgB,UAAA,UAAA,UAAAgwB,CAAA,EACjB9zB,GAAAF,EAEJ4D,CAEU,GAAA,QAAA,CACS,CAAC6f,CAAYjmB,MAAAA,CAAqB0C,GAAAF,GAI5Cg0B,GAAAA,QAGN,CACE/Z,CAAAA,CACA/Z,CAASF,EAAAA,SAAC,CAAA6D,EAAAS,EAAA,CAAA,KAAApG,MAAA,CAAA,EAAA2F,EAAe,OAAA,CAAA,SAACA,EAAAgC,EAAA,YAE1BtJ,CAAAA,CACA2D,CAAAA,CAAAA,CAASF,CAAAA,EAAAA,EAAAA,GAAAA,CAAAA,KAACoW,GAAA,OAAAlY,SAAA,SAAuB,CAAA2F,EAAAS,EAAA,CAAA,KAAC,UAAA,CAAA,EACpCT,EAAA,OAAA,CACF,SAAAA,EAAAgC,EAAA,CAAEjC,GAAAA,QAEG,CAACW,CAAK,CAAQ,CAAA,CACnB,CAAA,EAAAX,EAAAA,GACEiC,CAAAA,CAAAA,EAAAnC,EAAAiD,GAAA,CAAA,QAAA,IAAA,CAAAjJ,EAAyB,eAAA,CACpB,iBAAA,CAAA,CAETgG,KAACiD,QAAeyP,IAAAA,CAAAA,CAAKlR,CAAO,CACrB,EAAgB,SACrB,CAAArB,EAAAS,EAAA,CAAAV,KAAAA,MACE,CAAA,EAAA1F,EAAA,OAAA,CAAA,SAAyC2F,EAAAgC,EAAA,CACpC,GAAA,QAAA,CAEThC,CACS,GAELnG,CAAAA,EAAAA,CAAAA,CAAAA,IAAOu2B,CAAAA,IAAiBvwB,EAAAiD,GAAA,CAAA,aAEpBjJ,EACEqG,eAAM,CAAA,iBACDsS,CAAAA,CACN,KAAA,QAEL,IAAA4a,EAAA,CACF,CAAA,CAEK,EAAY,SACjB,CAAAptB,EAAAS,EAAA,CAAAV,KAAAA,OACE,CAAA,EAAA1F,EAAA,OAAA,CAAA,SAAgC2F,EAAAgC,EAAA,CAC3B,GAAA,QAAA,CAEP,CACS,GAELnI,CAAAA,EAAAA,GAAwByvB,IAAAhG,GAAA,wBAAA,GAAAzjB,EAAAC,EAAA,CAAA,eAEpB,CAAA,CAAA,EAAAD,EAAAiD,GAAA,CAAA,QACE5C,IAAM,CAAAwnB,EACD0F,EAAAA,CAAAA,EAGX,SAAA,CAAAptB,EAAAS,EAAA,CACF,KAAA,QAAA,CAAEV,EAAAA,EAEFC,OAACS,CAAKC,SAAKV,EAAAgC,EAAA,CACXhC,GAAA,QAAA,CAAAD,CACE,CAAA,CAAA1F,CAAA,CAAA,CAAA,CAAiC,CAAA,CAAC,CAC7B,CAAA,IAGV2tB,GAAAA,CAGG,QAAAjoB,EAEW,SAAApG,EAEL+tB,WAAAA,OAAuB,SACzB,EAAA,CAAA,CAEK,CAAA,EAAA1nB,EAAA,MAAM,CAAA,MAAU,iBACrB,cAAAD,MACE,CAAA,EAAAF,EAAA,OAAA,CAAA,SAA0B,CAAA,CAAA,CAAAotB,IAAAjtB,EAAA,OAAA,CAAA,MACrB,MAAA,SACEA,EAAAgC,EAAA,CAEd,GAAA,QAAA,CACE,CAEM,CAAA,EACXmQ,CAAAA,CAAAA,GAASvW,EAAAA,OAAAA,CACTjC,MAAAA,MACAmqB,SAAAA,CAAAA,EAAWrjB,EAAA,CACX4vB,KAAAA,KAAQ,CACT,EAAA,IAAArwB,EAAAgC,EAAA,CAGLhC,GAAA,QAAA,CAAKM,CAAAA,CAAM,CAAiB,EAAA,CAAA,CAAAysB,GAAYltB,EAAA,OAAA,CACxCA,MAAA,eACI,CAACotB,EAAAA,EAAAA,CACK3sB,KAAM,OAAA,CAAKP,EAAAA,IAAAA,IACfiC,CAAA3H,GAAA,QAAA,CAAyB,CAAA,CAAA,CACrB,EAEP2F,EAAE6sB,OACKvsB,MAAM,OAAKP,IAAAA,OACV,QAAMuwB,GAAA,CAAO,SAAEtwB,CAAA,CAAA,EAAA,wBAAwB,CAG/C,OAAE+sB,GACDtL,EAAA,CAAMnhB,OAAAA,CAAM,CAAKP,CACV,CAAM,CAAA,EAASF,EAAC,MAACmC,CAAA,MAAA,uBAAA,SAAoB,CAAA0f,GAAA,OAAA,GAAA1hB,EAAA,MAAA,CAgB9CA,MAAA,mBACEM,SAAMohB,EAAA,IAAA,CAAA,CACNf,KAAAA,WAEEhnB,WAAAA,EAAUouB,EACXlgB,KAAAhI,EAAA,MAAA,CACD0wB,MAAAA,iBAAyBC,GAAA,mBAAA,EAAA,GACvBC,IAAAA,OAA+B3D,SAAAA,CAAAA,EAAAA,IAAAA,CAAQ,SAAA,CAAA9sB,EAAA0wB,GAAA,CACzC,KAAA1b,EAEF,OAAA8X,CAAA,CAAW,EAAA,IAAA,CAAA,CAAA0D,IAAAxwB,EAAAS,EAAA,MACRihB,eACMphB,KAAM,IAAkBP,IAC1B2hB,EAAoBnnB,CAAOi2B,GAAAA,QAAAA,CAC1B,CAEwC,CAGtC7P,CAAAA,CAAI,CAAM5gB,EAAAA,EAAAA,IAEVF,CAAAE,wBACG2wB,CAAUzJ,OAAMjS,GAAAA,GAAAA,CAAM8X,OAAAA,CAAAA,CAAiB,CAEjC,CACE,CAAA,CAAA,CACA,EAAA9X,EACLpU,EAAGzE,CAAAA,CAAAA,CAAAA,EAAAA,EAAAA,MAAAA,CAAAA,MAAAA,QAAE,SAAA9B,CAAAA,EAAA8zB,GAAA,CAAA,SAAU,EAAA,GAACC,GAAA,QAEnB,IAAA,CACA,WACH,IAAA,CACEmC,EAAAA,oBAAyB,CACvBE,GAAAA,YAAgC3D,QAAAA,EAClC,CACA,GAAA,QAAA,CAEL,EAGM,cAAA6D,GAAO5wB,SAAAA,EAEdmS,yBAAUoX,GAAA,CAAA,YAAA,EAAA,CAAA,EACN8E,UAAAA,GAAAA,EAGF50B,CACEK,GAAO+2B,QAAsB,CACvB,EACJC,MAAO10B,CAAAA,EAAAA,CAAAA,CAAE,EAAA,SAAW,CAAA,CAAA,CAAA0vB,GAAA,QAAA7rB,EAAA,OAAA,CAAA,MAAC,8BAAA,SACrB8wB,EAAAA,OAAeH,CAAAA,MACfh3B,6CAAAA,SACAo3B,GAA0BzH,IAAAA,GACrBtpB,KACD,CACJgxB,MAAW7D,aAAehxB,KAAAA,IAAAA,IACtB,GAAA80B,EAAA,WAAA,KAAAA,EAAA,IAAA,GAAA,SAAAA,GAAA,GAAA,CAAA,CAAA,CAA8D,CAAA,CAC9DxyB,CAAAA,EACNuB,EAAAgC,EAAA,CACF,GAAI,SACN,OAAA,MAEG6pB,CAAkBpxB,EACb6F,EAAAA,GAAM4wB,CAAA,EAA6BnxB,eAAAA,CACvC,EAAY,WACT8rB,CACQ,IACAoF,OAASze,CACd7R,MAAKuwB,CAAA,CAAA,EACyC,WACpCD,CAEb,MAAAC,CAAA,CACG,CAAA,CAGV,CAAA,CAAA72B,CAAA,CAAA,EAAAC,EAAAA,GAAA,CAAA,MAKS62B,gBAA4B,WAQA,GAACD,GAAAA,QAZf,IAAA,CAAAvtB,WAAAA,IAAA,CAAAC,sBAGjB,CAAMP,QAAO6tB,GAQP7tB,GAAO6tB,iBAAAA,CAEP,EAIV,cAAAE,GAEJvxB,SAAAA,EACES,yBAAMgpB,GAAA,CAAA,WAAA,EAAA,CAAA,EACNpX,UAAUib,GAAAhxB,GAIR3C,GAAW,QACTK,CAA6B,EAC3Bg3B,MAAO10B,CAAAA,EAAAA,CAAAA,CAAI,EACL,SAEN,CAAA6D,EAAAgC,EAAA,CAAA,GAAC,SAAA,OACD8uB,CAAeM,EACfz3B,GAAAA,CAAAA,EAAAA,eAAAA,CAGI,EACsBwC,WAAAA,CAAAA,EAAAA,EACtB,OAAA,CAAA,MAAA9B,CAAA,CAAA,CAA8D,CAC9DoE,CAAAA,EACNuB,EAAA,KAAA,EAAA,CAAA,CAAA,CAAA,EACFA,EAAImuB,GAAA,CACN,MAAA,gBAAEpuB,GAAAA,GAEF,SAAAC,EAAAgC,EAAA,CAAA1H,GAAAA,SAAA,QAKsC+2B,EAAAA,GAAAA,CAAAA,EAJf,EAAAF,GAAAnE,CAAA,EAAArpB,cAAAA,CAAA,EAGjB,WAAa0tB,CAAe,EAEtBrxB,EAAA,OAAA,CAAC,MAAAgtB,CAAA,CAKbhtB,EAEFA,EAACmuB,EAAAA,OAAS,CACR7tB,MAAM0sB,CAAA,CACFoB,CAAAA,CASJ,CAAA,CAAA,CAAA,EAAA9zB,CAAAA,CAAAA,GAAA0F,EAAA,MAAA,CAAA,MAKSmxB,gBAA2B,aAQbnE,CAAa,GAACA,SAZf,OAAA,CAAArpB,EAAAA,GAAAhB,EAAA,CAAAiB,SAGhB,EAAA,CAAA,CAAaopB,EAEP,WAMN,CAAA,EAAM3pB,EAAAA,OAAO2pB,CAEP,SAAArqB,CAAA,CAAC,CAAA,CAIZ,CACQ,CAET,CAAA,CAAKrC,CAAM,CAAA,CAAA,CACT,CAAA,EAAA,CAAA,CAAA+tB,GAAAruB,EAAAmuB,GAAA,CAAA,GAAAC,GAAA,MAAA,uBAG6B,QAExB,OAAC,SAAAzqB,EAAAA,MAAA,CAAA,MAAAC,mBAHJ,SAAMX,EAAAA,MAAUN,CAAAA,MAIV,yBAAA,SAAC2uB,EAAAzxB,EAAA,MAAA,CACF,MAAA,gBAEV,MAAAsb,GAAA,EAAAhf,EAGFkyB,CAEKD,GAAAA,SACE,OAAA,MAMM,UAAAC,EAAA,OAAA,eAAAra,EAAA,QAAA,OAAA,CAEJsa,MAAgB,SAAI,CAEtB7vB,KAGN4vB,EAAA,QAAAA,EAAA,OAAA,eAAAra,EAAA,QAAA,OAAA,CAAW,MAAA,SAAA,GACE,GAAAqa,EAAA,OAAAA,EAAA,OAAA,eAAAra,EAAA,QAAA,OAAA,CACRsd,MAAAA,SACC,CACQ,EACNjuB,YACuBlH,EAAAA,OAAAA,eAAAA,EAAAA,QAAAA,OAAAA,CAAAA,MAAAA,SAAAA,CACjB,CAAA,CAAA,CAAA,EAAAA,EAGS,CACR,GAAC0H,SAEyC,OACzCnC,CACF,GAAC2sB,EAAA,UAAAA,EAAA,OAAA,eAAAra,EAAA,QAAA,OAAA,CAAC1P,eAEyC,CAAA,EAE3C,GAAC+pB,EAAA,QAAAA,EAAA,OAAA,eAAAra,EAAA,QAAA,OAAA,CAACud,eAEyC,CAAA,EAE3C,GAAClD,EAAA,OAAAA,EAAA,OAAA,eAAAra,EAAA,QAAA,OAAA,CAAC,MAAA,SAAA,CAAQ,CAAA,CAAC7X,CAAAA,EACX,SAAA,CAAA6D,EAAA,MAAA,CAAA,SAAAquB,EAAA,kBAAA,IAAAmD,GAAA,EAE2C,CAE3C,GAAC,SAAC3tB,QAGAnC,EAAAA,EAAO,MACR,EAAA2sB,EAAA,kBAAC/pB,IACa+nB,kBAEb3qB,EAAAA,EAAO,kBACR,EAAA2sB,EAAA,MAAC,EAAAA,EAAA,MAAQ,EAAAA,EAAA,iBAAA,CAAC,CAGjB,EAAAtuB,GACGsuB,EACG,CAAAh0B,GAAA,SAAAC,OAAA,CAAAsJ,EAAOyqB,EAAanC,MAAKroB,EAErBwqB,EAAaoD,KAAAA,CAGoCA,CAIpCA,CAEevF,CAAAA,EAAAA,QACXmC,CAAanC,0BAAwCuF,SAAiB,CAAApD,EAAA,UAAA,GAAAruB,EAAA,MAAA,CAG1F,MAAA,8DAACwxB,CAAA1f,eAAAA,GAAAA,EAAAA,UAAAA,EAAAA,MAAAA,GAAAA,GAAAA,CACF,CAAA,EAAAzX,EAAA,QAAA,GAAA2F,EAAA,MAAA,CAAA,MAAA1F,sDAAA,MAAO+zB,CAAanC,eAEHmC,GAAanC,EAAAA,QAAAA,EAAAA,MAAAA,GAAAA,GAAAA,CAAK,CAAA,EAClCmC,EAAA,OAAA,GAAAruB,EAAA,MAAA,CAAC,MAAA,qDAERH,MAAA,CAAKS,eAAM,GAAA+tB,EAAA,OAAAA,EAAA,MAAA,GAAA,GAAA,CAEP,CAAA,EACE/tB,EAAM,OAAA,GAAAN,EAAA,MAAA,CACN0B,MAAO,qDAAA,OAMP,eAAA,GAAA2sB,EAAA,OAAAA,EAAA,MAAA,GAAA,GAAA,CAIF,CAAA,CACE/tB,CAAM,CAAA,EACNoB,EAAAA,MAAO,CAAA,8BAIA,SAEP,CAAA7B,EAAA,OAAA,CACD,MAEFwuB,KAEG/tB,SAAM,CAAAN,EAAA,OAAA,CACN0B,MAAO,uDAAA,CAAA,UAEF2sB,CAIL,GAAA,QAAA,CACD,CAEFA,CACC,CAAA,EACE/tB,IAAMT,EAAA,OAAA,CACN6B,MAAO,KAAA,mBAEF2sB,CAIL,MAAA,qDAAA,CAEH,EAAA,IAAAruB,EAAAgC,EAAA,CAEHnC,GAAA,QAAA,CAAKS,CAAAA,CAAM,CAAuBP,EAAAA,IAAAA,MAChCF,EAAA,OAAA,CAAMS,MAAM,KAAIP,UACdC,EAAA,OAAA,CAAMM,MAAM,oDAAA,CAAyD,EAAE,IACvEN,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAC,CAAA,CACnB,EAAEwF,EACRA,OAAA,CAAMS,MAAM,KAAIP,UACdC,EAAA,OAAA,CAAMM,MAAM,oDAAA,CAAuD,EAAE,IACrEN,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAC,CAAA,CAClB,CAAA,CAEJ,CAAA,CAAA,CAAY,CAAA,EAAA2F,EAAID,MACdC,CAAA,MAAMM,gBAAM,SAAwDN,EACpEA,EAAAgC,CAAA,GAAA3H,QAAA,CAAA,CAAqB,CAAA,CAGzB,CAAA,CAAY,CAAA,CACV,CAAA,EAAA,CAAAkuB,GAAMjoB,EAAAA,MAAM,CAAA,MAAA,uBACZ,SAAAN,EAAA3F,MAAA,CAAA,MAAA,gCAAqB,OAChB,CAAA,CAAAg0B,EAAA,SACHruB,EAAA,MAAA,CAAA,MAGRA,yBAAA,SAAWH,EAAA,SAAA,CAAeE,KAAAA,SACxB,MAAA,uBAAA,SAAqC0uB,KAAA,UAClC,QAAA,IAAA,CAEJG,GAAA,CACF,EAGPrG,UACAvoB,EAAA,MAAA,CAAW,MAAA,sBAAAyuB,KAAA,UAAA,UAAA,EAAA,EAAA,CAAsB1uB,EAC/BC,EAAAgC,EAAA,CACE1B,GAAM,QAAA,CACN9H,EAAQ,GAAE61B,CAAAA,CAAatuB,CAEvB,CAAA,CAAW,CAAA,CACT,CAAA,CAAA,CACO,CAAA,EAAAC,EAAA,SACC,CAAA,cACIyuB,CAAwB,KAAA7yB,EAEhCgzB,SAAAA,EAAmB,WAAAnH,EACrB,cAAAhO,EAEA,qBAAAgN,GAEsD,gBAAAoI,EAGtD,mBAAAnH,EAAA,iBAAAC,EAAkC,mBAAAC,EAK5B,sBAAAC,EACL,CAAA,CACF,CAAA,EAER7nB,EAAA2iB,GAAA,CACG,UACNtoB,EAAA0F,KAAAA,EACiB,KACbnE,EAAAA,0BACAjC,IAAAA,2BAAAA,CAAAA,CAAAA,CACA8tB,CAAAA,CAAAA,CACAhO,CAAAA,EAAAA,CAAAA,CAAAA,GACAgN,EAAAA,GAAAA,CAAAA,QACAoI,IAAAA,CAAAA,EACAnH,EAAAA,CAAAA,EACAC,SACAC,EAAAA,GAAAA,CAAAA,QACAC,CAAAA,CAA6C,MAAA/mB,EAEzC,QACP6hB,EAAY,EACXC,KAAAA,CACAhnB,EAAAA,EAAAA,EACAinB,IAAM+E,WAAAA,SAOb,CAAA,CACE,CAEG,CAAA,CACJ5mB,CACE0mB,CAAAA,CAAwB,CAC1B,MAAE3nB,GAED8gB,EAAgB,YACL,CAAAkP,EAAAD,EAAA5a,CAAA,EAAA,CAAA,MAAAwc,EAAE5wB,MAAAA,EAAAA,MAAAA,EAAAA,MAAAA,EAAAA,IAAAA,EAAOqR,OAAAA,GAAmB,IACpCuV,EAAAA,EACAgK,MACE7C,EAAAA,GACF8C,EACFD,EAAA,IACDC,EAEJ,KAAA,IAAA,EAAAA,CAAA,EACD,CAAA5B,EAAAD,EAAA5a,EAAAyc,CAAA,CAEN,CC3kCA,SAASC,GAAa,CAAEzf,QAAAA,EAASxY,SAAUk4B,EAAc7wB,QAAAA,CAAQ,EAAG,CAClE,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,EAAOC,SAAAA,EAAU8f,cAAAA,CAAAA,EAAkBte,GAAI,CAAExB,SAAUk4B,CAAAA,CAAc,EACnEpF,EAAW,OAAOta,GAAY,SAEpC9Z,OAAAA,EAAU,IAAM,CACTo0B,IACH5yB,EAAO6C,SAAS,GAAGyV,EAAQ9X,EAAE,IAAIV,CAAQ,EAAE,EAAIwY,EAEnD,EAAG,CAACA,CAAO,CAAC,EAEZqN,GAAkBxe,CAAO,EAGvBnB,EAAA,MAAA,CACES,MAAM,QAQNP,SAAA,CAEC,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,oBAAoBH,QAASa,EAAQjB,SAC/DC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEV2F,EAACwsB,GAAW,CACV7yB,SAAAA,EACA8f,cAAAA,EACAtH,QAAAA,EACAoa,aAAc,SAAY,CACxB,GAAIE,EACF,GAAI,CAKF,OAJa,MAAM/yB,EAAMM,GAAG0C,SAASo1B,OAAO,CAC1ClS,KAAMzN,EACN4f,eAAgB,EAAA,CACjB,CAEH,MAAY,CACV,MAAMC,EAAS,MAAMt4B,EAAMmwB,GAAGC,OAAO5vB,KAAK,CACxC6vB,EAAG5X,EACHjS,KAAM,WACN/F,MAAOsf,EAAgB,EAAI,GAC3BuQ,QAASvQ,CAAAA,CACV,EACD,GAAIuY,EAAOt1B,SAASjC,OAAQ,CAC1B,MAAMw3B,EAAwBD,EAAOt1B,SAASkY,KAC3C7I,GAAMA,EAAEwG,MAAQJ,GAAWA,EAAQ+f,WAAWnmB,EAAEwG,GAAG,CACtD,EACA,GAAI0f,EACF,OAAOA,CAEX,CACA,GAAI,6BAA6BjuB,KAAKmO,CAAO,EAAG,CAC9C,MAAMggB,EAAaC,IAAI5zB,MAAM2T,CAAO,EACpC,GAAIggB,EAAY,CACd,KAAM,CAAE7iB,SAAAA,EAAUG,SAAAA,CAAAA,EAAa0iB,EACzBvS,EACJnQ,EAASzB,QAAQ,MAAO,EAAE,EAAEA,QAAQ,MAAO,EAAE,EAC7C,IACAsB,EACI0iB,EAAS,MAAMt4B,EAAMmwB,GAAGC,OAAO5vB,KAAK,CACxC6vB,EAAGnK,EACH1f,KAAM,WACN/F,MAAO,EACP6vB,QAASvQ,CAAAA,CACV,EACD,GAAIuY,EAAOt1B,SAASjC,OAClB,OAAOu3B,EAAOt1B,SAAS,CAAC,CAE5B,CACF,CACF,KAEA,QAAOyV,CAEX,CAAA,CACD,CAAC,CAAA,CACC,CAET,CC/EA,SAASkgB,GAAO,CAAErxB,QAAAA,CAAQ,EAAG,CAC3B,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAACi5B,EAAQC,CAAS,EAAIl5B,EAAS,CAAA,CAAE,EACjC,CAAC2sB,EAAajU,CAAM,EAAIC,GAAY6C,GAAMA,EAAI,EAAG,CAAC,EAExDxc,EAAU,IAAM,CACdglB,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAMjZ,EAAO,MAAMouB,GAAGF,OAAOluB,KAAAA,EAC7B,GAAIA,EAAK3J,OAAQ,CACf,MAAMg4B,EAAKC,GAAAA,EACLC,EAAUvuB,EAAKwuB,UAAgB70B,EAAIm0B,WAAWO,CAAE,CAAC,EACvD,GAAIE,EAAQl4B,OAAQ,CAClB,MAAM63B,EAAS,MAAME,GAAGF,OAAOO,QAAQF,CAAO,EAC9CL,EAAOrd,KACL,CAAClJ,EAAGmJ,IAAMxS,KAAKlE,MAAM0W,EAAEkP,SAAS,EAAI1hB,KAAKlE,MAAMuN,EAAEqY,SAAS,CAC5D,EACAmO,EAAUD,CAAM,CAClB,MACEC,EAAU,CAAA,CAAE,CAEhB,MACEA,EAAU,CAAA,CAAE,EAEdlV,EAAW,SAAS,CACtB,MAAY,CACV3kB,SAAe,CACf2kB,CAAkB,GAAA,CACpB,EACF,CAAA2I,CAAG,CAAA,EACL,MAAIA,EAAYsM,GAAA,OAAA,EAEhB,OAAMQ,EAAAA,OAEN,cACOxyB,SAAM,CAAA,CAAA,CAAAU,GAAAhB,EAAA,SAAA,eAECE,MAAK,cAASI,QAAMU,EAAcb,SAASa,EAAAA,EAAAA,CAAQjB,KAAAA,IACnDW,IAAAA,EAAYvE,CAAE,GAAA,QAAA,CAAA,CAAO,CAAA,CAAC,CAAA,EAAG0D,EAAA,SAAA,CACzB,SAEV,CAAAA,EAAA,KAAA,CAAAE,SACEF,CAAAA,EAAAmC,EAAA,CAAAjC,GAAAA,QACE,CAAA,EAAA1F,IAAA2F,EAAA4jB,GAAA,CAA2B,OAC3B5jB,GAAQ8hB,OAAMhB,IAAA,SAAA,CAAA,CAACtoB,CAAoB,CAAA,EAAas6B,GAAA9yB,EAAA,MAAA,CAC9C,MACH8yB,gBACMxyB,SAAMN,EAAAgC,EAAA,CAAejC,GAAAA,QACxB,CAAA,CAAA,CAAA,CAAA,CAGO,CAAA,EAEVC,EAAA,OAAA,CACK,SACR8yB,EAAAjzB,EAAAC,EAAA,CAAAC,SACG+yB,CAAAA,EAAAA,KACCjzB,CAAAE,MAAAA,cACMO,SAAMgyB,EAAA,IAAAS,GAAA,CAAahzB,KAAAA,CAEnB,UAAAqkB,EAAQA,IAAAA,EAAWrmB,YAAAA,EAAK+sB,QAAAA,EAAakI,MAAAA,CAAAA,EAASC,EAAUF,EAAAA,IAAAA,KAAAA,CAAAA,EACxD,OAAMG,EAAAA,KAAAA,CACN,UACErzB,EAAA,MAAA,CAAAE,MAAAA,kBACOO,SAAM,CAAAT,EAAA,IAAA,CAAiBE,SAC1BF,CAAAA,EAAAY,EAAA,CAAAV,KAAAA,EACGU,QAAI,QAACC,KAAMsyB,GAAoB,CAAA,EAASryB,IAAKd,EAAA,OAAA,CAAK,SACnDA,CAAAA,CAAAA,CAAAmzB,GAAAnzB,EAAAC,EAAA,UACI,CAACkzB,EAAAA,QACDjzB,MAAAA,eACQO,SAAM,CAAA,IAAA0yB,EAAA,QAAA,IAAA,CAAA,CAAA,EAAcjzB,EAAAA,KAAC,EAAA,CACvBizB,CAAoB,CAAA,EAClBzvB,GACN2vB,CAAM,CAAA,CAAA,CAAA,CAAA,CAGkB,CAAA,EACvBlzB,EAAAmT,GAAA,CACN,aACFA,EAAAA,OAAW,CACVE,SAAAA,IACE,CAAAtT,GAAAA,QACE,CAAA,CAAA,CAAA,EAAiC,kBAC7B,SAERuT,MAAAA,MACAnR,SAAM2e,IAAA,UACNze,YAAUye,WACK,CACZ,GAAA,CACC,MAAI0R,GAAA,OAAA,IAAAz0B,CAAA,EAGFgU,EAAMygB,CACNzgB,MAAO,SAGF5V,CAAC,GAAA,QAAA,CAAA,CAAA,CAAyC,CAAC,GAAA,CAClD,EAEJ,SAAA6D,EAAA,SAAA,CAAED,KAAAA,SAGAG,MAAK,cACLI,SAAMwgB,IAAA,UACNze,SAAUye,EAAAA,EAAY,CAAU/gB,GAAAA,QAEhC,CAAA,CAAA,CAAA,CAAqB,CAAA,CAAC,CAChB,CAAA,EACIC,EAAA,SAAA,CACX,KACLA,SACEE,SAAK4gB,IAAA,UACLze,mBACA/B,QAAM,SAAA,OAGAV,EACJ,GAAIuzB,GAAAA,IAAAA,GAAAA,GAAAA,CAEF9V,GADFA,EAAahjB,SAAM44B,EACjB5V,EACA,GAAI2V,CACFpzB,EAAI,MAAAlG,EAAA,GAAA,SAAA,QAAAs5B,EAAA,EAAA,EAAA,MAAA,CACFpzB,MAAAA,SAKAwb,CAAKjf,GAAAA,QAAAA,CAAC,CAAA,EAAAkhB,EAAiC,SAAA,EAAC,MACxCA,CACA,GACF4V,EACF,GAAA,CACIA,EAAO,MAAAv5B,EAAA,GAAA,SAAA,QAAAu5B,EAAA,EAAA,EAAA,MAAA,CACT,MAAI,CACFE,MAAAA,EAIAz6B,CACA0iB,GAAKjf,QAAAA,CAAAA,CAAAA,EAACkhB,EAAA,SAAA,CAAA,CACNA,EAAAA,SAAW,CAAS,CAGtB,OACF,YAAA,CACAA,YAAAA,EACF,cAAAzd,EACAzJ,YAAAA,CAAqB,EACnB20B,EACAlrB,YAAAA,GAAAA,EACAuzB,WAAAA,EAAAA,EAEFt5B,SAAO+E,EAAAA,GAAc,CACrB/E,MAAAA,CAAoB,CACtB,CAAA,CAAA,CAAEkG,CAEQ,EAAAqkB,CAAC2O,CAAAA,CAAAA,CAAe,CAAA,EAAAT,EACnB,OAAA,GAAAtyB,EAAA,IAAA,CAAA,SA/FFokB,EAgGLjR,GAAA,CAEP,aAAAnT,EAAA,OAAA,CAEFsyB,SAAO73B,EAASuH,GACfjC,GACEC,QAAY,CACVqT,CACE,CAAA,EACE,kBAAA,SAAA,SAAgCyN,IAAA,UAAC,QAC7B,IAAA,EAERxN,SAAAA,GACUwN,SAAY,MAEnB,MAAA0R,GAAY,OAAA,QAAAF,EAAA,IAAAS,GAAAA,EAAA,GAAA,CAAA,EAGX1V,EAAW,SAAS,EACpBtL,EAAI,CACF,OAGAsL,MAAAA,GAGA3kB,GAAQ4Y,QACR8J,CAAKjf,CAAAA,EAAAA,EAAC,OAAA,CAAA,CAAA,GAAA,CAA0C,EAChDkhB,SAAAA,EAAAA,SAAkB,CAAA,KACpB,SAEF,MAAG,eACL,SAAAyD,IAAA,UAAE/gB,WAEFiC,EAAA,CACE9B,GAAK,QAAA,CACLI,CAAM,CAAA,CACgB,CAAA,CAEtB,CAAA,CAAA,CAAA,CAAA,EAAAN,EAAyB,IAAA,CAAA,SACnBA,EAAAgC,EAAA,CAAC,GACE,QAAA,CACZ,CACJ,CACD,CAEF,CAAA,CAAA,CACE,CAAA,CAAA,CAA8B,SAC7BoxB,GAAA,CAAA,MAAAL,CAEA,EACJ,CAET,KAAA,CAEA,EAAA/V,CAAmB,EAAE+V,GAAAA,EAAS,CAC5B,YAAAjI,EAAQ7xB,QAAAA,SACR,EAAA85B,EAAQjI,CAAakI,OAAAA,EAASC,YAAAA,EAAM,KAAA3rB,EACpC,iBAAAib,CAAM,EAAE/T,EAAQ6kB,EAAAA,GAAAA,SAAAA,OAAAA,EAAa/rB,EAAAA,GAAAA,OAAAA,EAAMib,EAAAA,CAAAA,CAAAA,GAAAA,GAAqBuI,EAAAA,GAAAA,GAAAA,EAClDwI,EAAgBxuB,GAASrK,IAAAA,CAC/B,GAAM84B,CAAAA,EAAWhR,OACjB,MAAMiR,EAAAA,EAAoBn5B,KAAAA,GAAAA,QAAAA,KAAAA,EAAAA,IAAAA,CAAAA,EAC1B,GAAMo5B,CAAAA,EAAAA,OACN,KAAMC,CACJ,KAAAtR,CACA,EAAAuR,EAEA,OADY,IAAA,gBAAAvR,CAAA,CACN,EAAA,CAAEA,EAAAA,CAAAA,CAAAA,EAAAA,OAASuR,EAAAA,EAAAA,CACjB,SAAMC,EAAAA,MAAgBC,CACtB,MAAOD,aACLL,SAAUhR,CAAAA,GAAiB1iB,EAAA,MAAA,CAC/B,MACEC,oBAAA4zB,EAAA,YAAA,EAAA,GAAA3zB,QACE,CAAKO,aAAM,OAAAozB,CAAA,GAAA,EAAY3zB,CAAAA,EAGjBO,SAAO,CAAAgzB,GAAAtzB,EAAoB0zB,EAAAA,MAEzBA,OAEM,IAAA1W,EAGPjd,CAEiBW,GAAK,QAAA,CAAUsc,CAAAA,CAAAA,EAAEuW,GAAA1zB,EAAA,OAAA,CAAA,SAAA,CAAAG,EAAAS,EAAA,CAAM,KAAA,aAAC,IAAAuc,EAExCjd,CACQW,GAAK,QAAA,CAAgBsc,CAAAA,CAAAA,EAAE,IAAAhd,EAAA,QAAA,CAAA,SAAAuiB,GAAA,MAAA,CAAA,CAAA,CAAO,CAAA,EAACiR,GAAAxzB,EAAAS,EAAA,CAAC,KAAI,QAC1C,MAGH+yB,CAAkB9yB,GAAK,QAAA,CAAWsc,CAAAA,CAAAA,CAAAA,CAAE,CAAA,EAAAnd,EAAAxF,MAAA,CAAA,MAAO,kBAAA,SAAC,CAAA,CAAA,CAAAg5B,GAAArzB,EAAA,MAAA,CAAI,MAAA,qBAGrDH,SAAAwzB,CAAA,CAAK/yB,EAAAA,CAAAA,CAAAA,GAAMN,EAAA,MAAA,2BACcM,SAAMkO,CAAA,CAAA,CAAoBzO,CAAEszB,CAAAA,CAAW,CACjD,CAAA,CAAW,CAAA,CAAqB7kB,CC5QvD,SAASslB,GAAW,CAAE5Z,KAAAA,EAAM3H,IAAAA,EAAK7H,MAAAA,EAAOC,OAAAA,EAAQ3J,QAAAA,EAAUA,IAAM,CAAC,CAAE,EAAG,CACpE,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACX,OACE2G,EAAA,MAAA,CAAKS,MAAM,wBAAuBP,UAChCF,EAAA,MAAA,CAAKS,MAAM,eAAcP,UACvBC,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,QAAQH,QAASA,IAAMa,EAAAA,EAAUjB,SAC3DC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EACPkY,GACC1S,EAAA,IAAA,CAAGoT,KAAMV,EAAKlR,OAAO,SAASyZ,IAAI,WAAWxa,MAAM,eAAcP,UAC/DC,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAgC,CAAA,CAC5B,EAAE,IACR2F,EAACS,EAAI,CAACC,KAAK,UAAA,CAAY,CAAC,CAAA,CACvB,CACJ,CAAA,CACE,EACLV,EAAA,MAAA,CACEM,MAAM,gBACNiwB,wBAAyB,CAAEE,OAAQvW,CAAAA,EACnCxY,MAAO,CACL,UAAWgJ,EAAQ,KACnB,WAAYC,EAAS,KACrB,iBAAkB,GAAGD,CAAK,IAAIC,CAAM,EAAA,CACtC,CACD,CAAC,CAAA,CACC,CAET,CChBA,SAAwBopB,GAAgB,CACtCp6B,SAAAA,EACAo3B,yBAAAA,EAA2B,CAAA,EAC3BiD,OAAAA,EACAhzB,QAAAA,EAAUA,IAAM,CAAC,EACjBgwB,UAAAA,CACF,EAAG,CACD,KAAM,CAAE/3B,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,EAAOC,SAAUouB,CAAAA,EAAoB5sB,GAAAA,EACvC84B,EAAoBt6B,EAAWA,IAAaouB,EAAkB,GAC9D9qB,EAAaC,GAAYrD,CAAM,EAE/B,CAACinB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAAC66B,EAAUC,CAAW,EAAI96B,EAAS,EAAK,EAI9C,GAFAmmB,GAAkBxe,CAAO,EAErB,CAAC/D,EAAW2zB,oBACd,OAAO,KAGT,KAAM,CACJv2B,GAAAA,EACAw2B,QAAAA,EACAC,cAAAA,EACAp0B,SAAU03B,EACVC,cAAAA,CAAAA,EACEp3B,EAAW2zB,oBAET,CAACl0B,EAAU43B,CAAW,EAAIj7B,EAC9B+6B,GAAgB35B,OAAS25B,EAAiB,EAC5C,EAEM,CAAChR,EAAkBC,CAAmB,EAAIhqB,EAAS,CAAA,CAAE,EAErDk7B,EAAoB,MAAO73B,GAAa,CAE5C,GADI,CAACA,GAAUjC,QACX,CAACw5B,EAAmB,OACxB,MAAMvQ,EAAgB,MAAMD,GAAmB/mB,EAAU0mB,CAAgB,EACrEM,GACFL,EAAoB,CAClB,GAAGD,EACH,GAAGM,CAAAA,CACJ,CAEL,EAEM8Q,EAAgB3G,GAAc,CAC7BiD,IACDjD,GAAa,CAACnxB,GAAUjC,QAAQ65B,EAAY,CAAA,CAAE,EAClDjX,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,KAAM,CAAEoX,KAAAA,EAAMl6B,MAAAA,CAAAA,EAAU,MAAMu2B,EAAcjD,CAAS,EACrD,GAAI/gB,MAAM4nB,QAAQn6B,CAAK,EAAG,CACxB,GAAIszB,EAAW,CACb,MAAMnxB,EAAW,CAAA,EACjB,QAASmL,EAAI,EAAGA,EAAItN,EAAME,OAAQoN,IAAK,CACrC,MAAMsK,EAAU5X,EAAMsN,CAAC,EACjB8sB,EAAaj4B,EAASkY,KAC1B,CAAC7I,GAAG6oB,IAAM7oB,GAAE1R,KAAO8X,EAAQ9X,IAAMwN,IAAM+sB,CACzC,EACKD,EAMHA,EAAWE,OAAOhf,KAAK,GAAG1D,EAAQ0iB,MAAM,EALxCn4B,EAASmZ,KAAK,CACZgf,OAAQ,CAAA,EACR,GAAG1iB,CAAAA,CACJ,CAIL,CACAmiB,EAAY53B,CAAQ,CACtB,MAGE43B,EAAajqB,GAAS,CACpB,MAAMyqB,EAAczqB,EACpB,UAAW8H,KAAW5X,EAAO,CAC3B,MAAMo6B,EAAaG,EAAYlgB,SAAY7I,GAAE1R,KAAO8X,EAAQ9X,EAAE,EACzDs6B,EAGHA,EAAWE,OAAOhf,KAAK,GAAG1D,EAAQ0iB,MAAM,EAFxCC,EAAYjf,KAAK1D,CAAO,CAI5B,CACA,OAAO2iB,CACT,CAAC,EAEHX,EAAY,CAACM,CAAI,EAEjBF,EAAkBh6B,CAAK,CACzB,MACE45B,EAAY,EAAK,EAEnB9W,EAAW,SAAS,CACtB,MAAY,CACV3kB,SAAe,CACf2kB,CAAkB,GAAA,EACpB,EAEJwQ,EAAAz1B,EAAA,EAAA,EAEAC,EAAMw1B,IAAAA,CACNx1B,GAAgB,OAAA,EACVqE,GAEF83B,EAAI1D,EAAe,EACjB0D,EAAAA,QAAiB,IAEnBD,EAAO73B,CAAA,GAGT83B,EAAO,EAAA,EACLA,EAAAA,QAAiB,GACG,EACtB,CAAA1D,CAAA,CAAA,EACFz4B,EAAIy4B,IAAAA,CAEJz4B,EAAgB,SACVw1B,EAAUv1B,uBAAS,KAAA+B,GAGvBm6B,EAAerJ,EAAAA,CACI,EACnB,CAAAluB,EAAA,sBAAA,OAAA,CAAA,EACF,MAAIA,EAAAA,EAAWkuB,SAAAA,CAAAA,EAEf,OAAMxrB,EAAO9F,MAAO+C,CAEpB,GAAA,6BACOvC,MAAG,QAA6BiG,SAAM,KAAQ6D,SAAS,CAAAnE,EAAA,SAAA,CAAID,KAAAA,SACtDG,MAAK,cAASI,QAAMU,EAAcb,SAASa,EAAAA,EAAAA,CAAQjB,KAAAA,IACnDW,IAAAA,EAAYvE,CAAE,GAAA,QAAA,CAAA,CAAO,CAAA,CAAC,CAAA,EAAG6D,EAAA,SAAA,CACzB,SACRA,EAAA,KAAA,CAAAD,YACE5D,EAAYA,CAAI,GAAA,QAAA,CAAA,CAAU,CAAA,CAAC,CAAA,EAAK0D,EAAA,OAAA,CAC1B,SACR,CAAAF,GAAAK,EAAA4T,GAAA,CAAA7T,GAAAA,IAAApG,GAEIqG,CAAK,MAAAL,EAAA,EAAA,GACHoC,MAAI,eACJzB,SAAMN,EAAA+0B,GAAA,CAAch1B,OAEpBC,EAAQwO,KAAAA,IAAc7N,SAAK,EAAA,CAAA,CAAY,CAAA,EAAEjE,EAAA,OAAA,EAAAmD,EAAAC,EAAA,CACrC,SAEPpD,CAASjC,EAAAA,KAAS,CACjBsF,MAAAA,gBACMO,SAAM5D,EAAA,IAAAyV,GAAA,CAAepS,MAAAA,EACRoS,EAAYA,EAAA,EAAA,EACnB4R,EAAAA,GAAAA,EAAeX,EAAAA,IAAAA,EAAAA,QAAiBjR,QAAU,EAAA,GAChD,OAAMpU,OAASoU,CACf,UACEkiB,GAAAliB,EAAA,QAAA,OAAA,GAAAnS,EAAA,MAAA,CAAAD,MAAAA,kBAESO,SAAM6R,EAAA,OAAA,IAAAjS,GAAAF,EAAAS,EAAA,OAGLC,OACE,SACEod,UAAQ,OAAA,EACRD,CAAAA,EACF,MAAM,GAAA3d,CAAA,OAAA,CAAA,CAERI,CAAc,CAAA,EAEjBN,EAAA,MAAA,CACE,MAEP,wBAAKM,SAAMN,EAAA6jB,GAAA,CAAuB9jB,QAAAA,EAE9BoS,UAAAA,GACA6iB,aAAAA,EACAjR,yBAAAA,CAAAA,CAAAA,CACAgN,CAAAA,CAAmD,CACpD,EACEhzB,CAAC,CAAA,CAAA,CACJ,CAAA,EAEP+iB,IAAA,UAAAoT,EAAAl0B,EAAAi1B,GAAA,CACC,SACHnU,GAAY,IAIL0T,EAAY,CACG,EAEjB,SAAAx0B,EAAA,SAAA,CAAED,KAAAA,SAGAG,MAAK,cACLI,QAAM,IAAAk0B,EAAA,EACNr0B,WAAeq0B,EAAAA,CAAez0B,GAAAA,QAE9B,CAAA,CAAA,CAAA,CAAwB,CAAA,EAClBC,EAAA,IAAA,CACF,MAERA,yBAAGM,SAAMN,EAAAgC,EAAA,CAAwBjC,GAAAA,QAC/B,CAAA,CAAA,CAAA,EAAsB+gB,IAAA,WAAA9gB,EAAA,IAAA,CACrB,MAGL8gB,WACKxgB,SAAMN,EAAA4jB,GAAA,CAAU7jB,OACjBC,EAAO,CAAA,CAAO,CAAA,CAAA,CAAE,CAAA,EAGrB8gB,IAAA,UAAA9gB,EAAA,IAAA,CACD,MACA8gB,WACCxgB,SAAMN,EAAA4jB,GAAA,CAAU7jB,OACjBC,EAAO,CAAA,CAAO,CAAA,EAAE8gB,IAAA,QAAA9gB,EAAA,IAAA,CACf,MACD8gB,WACCxgB,SAAMN,EAAAgC,EAAA,CAAUjC,GAAAA,QACjB,CAAA,CAAA,CAAA,EAAoCC,EAAA,IAAA,CACnC,MAEHA,yBAAGM,SAAM0wB,GAAA70B,EACGA,CAAI,GAAA,QAAA,CAAA,CAAiB,CAAA,CAAC,CAAA,CAAA,CAAA,CAEnC,CAAA,CACI,CCpOb,MAAM+4B,GAAwB,IAE9B,SAAwBC,GAAc,CAAEv0B,IAAAA,EAAKyT,KAAAA,EAAMrT,QAAAA,CAAQ,EAAG,CAC5D,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B,CAACutB,EAAgBgO,CAAiB,EAAI/7B,EAAS,EAAK,EACpD2f,EAAiBG,GAA2B,EAAI,EAChDuC,EACJze,EAAWW,SAAS8d,iCAAmC,CAAA,EACnD2Z,EACJ,CAAC,CAAChhB,GACFA,IAAS2E,GACT,CAACsc,GAAY,CAACjhB,CAAI,EAAG,CAAC2E,CAAc,CAAC,GACrC,CAAC0C,EAAgC9G,KAC9ByR,GAAMhS,IAASgS,GAAKiP,GAAY,CAACjhB,CAAI,EAAG,CAACgS,CAAC,CAAC,CAC9C,EAEFhuB,OAAAA,EAAU,IAAM,CACd,MAAMk9B,EAAa30B,GAAKnG,OAAS,GAAKmG,GAAKnG,QAAUy6B,GACjDG,GAAqBE,GACvBH,EAAkB,EAAI,CAE1B,EAAG,CAACC,EAAmBz0B,CAAG,CAAC,EAGzBf,EAAA,MAAA,CAAKS,MAAM,QAAQ6D,SAAS,KAAIpE,SAAA,CAC7B,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,oBAAoBH,QAASa,EAAQjB,SAC/DC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEVwF,EAAA,SAAA,CAAQS,MAAM,cAAaP,UACzBC,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA+B,CAAA,CAC7B,EACJ2F,EAAA,MAAA,CAAKM,MAAM,cAAaP,SACtBF,EAACkT,GAAK,CACJ5Q,MAAM,MACN6Q,WACEhT,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,SAAQP,SAClCC,EAACS,EAAI,CAACC,KAAK,OAAOE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAM,EAAGsG,KAAK,IAAA,CAAM,CAAA,CACrC,EACTZ,SAAA,CAEDF,EAACiD,GAAQ,CACPT,SAAU+kB,EACVjnB,QAASA,IAAM,CACbi1B,EAAkB,EAAI,CACxB,EAAEr1B,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,WAAA,CAAa,EACxBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAC,CAAA,CACC,EACTm7B,IACC31B,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbs1B,GAAM70B,EAAKyT,CAAI,CACjB,EAAEtU,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,OAAA,CAAS,EACpBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,CAAC,CAAA,CACC,CACX,CAAA,CACI,CAAA,CACJ,CAAC,CAAA,CACA,EACRwF,EAAA,OAAA,CAAMwU,KAAAA,EAAYsM,IAAI,OAAM5gB,UAC1BC,EAAA,IAAA,CACE0B,MAAO,CACLwlB,WAAY,WACZwO,SAAU,QAAA,EACV31B,SAEDa,CAAAA,CACA,GACDy0B,GAAqBjO,IACrBpnB,EAACmnB,GAAgB,CACfC,eAAAA,EACAuO,eAAgBthB,EAChB4S,KAAMrmB,CAAAA,CACP,CACF,CAAA,CACG,CAAC,CAAA,CACJ,CAET,CCvGA,KAAM,KAAE6Z,GAAG,IAAEC,EAAG,EAAK,KCCrB,MAAMkb,GAAc,CAAA,EACpB,QAAS5gB,IAAQ,CACb,UACA,SACA,SACA,WACA,QACA,OACA,SACA,YACA,MACJ,EACI4gB,GAAY,WAAW5gB,CAAI,GAAG,EAAIA,EAAK,YAAW,EAEvC,SAAA9U,GAAU21B,EAAK,CAC1B,OAAOD,GAAY,OAAO,UAAU,SAAS,KAAKC,CAAG,CAAC,GAAK,QAC/D,CCfA,MAAAC,GAAe,CAAC7/B,EAAM8/B,EAAW,OAEzB9/B,EAAK,QAAU,EAAU,MAAM,UAAU,MAAM,KAAKA,CAAI,EAGxDiK,GAAKjK,EAAK,CAAC,CAAC,GAAK,UAAY8/B,EACtBA,EACF,MAAM,EAAE,EACR,OAAQC,GAAM//B,EAAK,CAAC,EAAE+/B,CAAC,IAAM,MAAS,EACtC,IAAKA,GAAM//B,EAAK,CAAC,EAAE+/B,CAAC,CAAC,EAIvB//B,EAAK,CAAC,EAAE,MAAM,CAAC,ECf1B,KAAM,CAAE,GAAAggC,GAAI,IAAAxb,GAAK,IAAAC,EAAG,EAAK,KAWzB,MAAMwb,GAAQD,GAAK,EACbE,GAAUF,GAAK,EACfG,GAAUH,GAAK,IACfI,GAAU,IAAMJ,GCbP,SAASK,GAAiBC,EAAGC,EAAG,CAC3C,IAAIlc,EAAIic,EAAE,OAEL,MAAM,QAAQA,EAAE,CAAC,CAAC,IAEnBA,EAAI,CAACA,CAAC,GAGL,MAAM,QAAQC,EAAE,CAAC,CAAC,IAEnBA,EAAIA,EAAE,IAAK9tB,GAAM,CAACA,CAAC,CAAC,GAGxB,IAAID,EAAI+tB,EAAE,CAAC,EAAE,OACTC,EAASD,EAAE,CAAC,EAAE,IAAI,CAAC1kB,EAAGjK,IAAM2uB,EAAE,IAAK9tB,GAAMA,EAAEb,CAAC,CAAC,CAAC,EAC9C6uB,EAAUH,EAAE,IAAKI,GACjBF,EAAO,IAAKG,GACH,MAAM,QAAQD,CAAG,EAIfA,EAAI,OAAO,CAAC5qB,EAAG8I,EAAGhN,IAAMkE,EAAI8I,GAAK+hB,EAAI/uB,CAAC,GAAK,GAAI,CAAC,EAH5C+uB,EAAI,OAAO,CAAC7qB,EAAG8I,IAAM9I,EAAI8I,EAAI8hB,EAAK,CAAC,CAIjD,CACT,EAMI,OAJIrc,IAAM,IACNoc,EAAUA,EAAQ,CAAC,GAGnBjuB,IAAM,EACCiuB,EAAQ,IAAKhuB,GAAMA,EAAE,CAAC,CAAC,EAG3BguB,CACX,CCnCA,MAAMG,GAAe,CAEjB,GAAI,GAGJ,cAAe,MACf,GAAI,OACJ,GAAI,EACJ,GAAI,QAEJ,GAAI,WACJ,GAAI,WACJ,GAAI,UACJ,GAAI,WAEJ,GAAI,IAAQ,MACZ,IAAK,EACL,GAAI,MAAU,GAEd,YAAa,CAET,EAAG,OACH,EAAG,EACH,EAAG,OACX,EAEI,WAAY,CACR,IAAK,kBACL,IAAK,mBACL,IAAK,kBACL,IAAK,iBACL,IAAK,iBACL,IAAK,mBACL,IAAK,mBACL,IAAK,mBACL,IAAK,iBACb,EAEI,WAAY,CACR,IAAK,mBACL,IAAK,mBACL,IAAK,oBACL,IAAK,oBACL,IAAK,mBACL,IAAK,mBACL,IAAK,kBACL,IAAK,oBACL,IAAK,kBACb,EAGI,GAAI,kBACJ,GAAI,YACJ,GAAI,YAEJ,WAAY,CACR,IAAK,MACL,IAAK,OACL,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,MACL,IAAK,MACb,EAEI,YAAa,CACT,IAAK,kBACL,IAAK,mBACL,IAAK,qBACL,IAAK,oBACL,IAAK,kBACL,IAAK,mBACL,IAAK,mBACL,IAAK,kBACL,IAAK,iBACb,CACA,ECzCA,MAAMC,GAAWC,GAAW,CAExB,MAAMC,EAAO,KAAK,KAAKD,CAAM,EAC7B,OAAAA,EAAS,KAAK,IAAIA,CAAM,GAEnBA,GAAU,SACLA,EAAS,MACT,MAAQ,KAAK,IAAIA,EAAQ,EAAM,GAAG,EAAI,MAASC,CAE7D,EAEMC,GAAU,CAACvuB,EAAGC,EAAGuuB,IAAM,CACzB,KAAM,CAAE,WAAAC,EAAY,YAAAC,EAAa,WAAAC,EAAY,YAAAC,EAAa,GAAAC,EAAI,GAAAC,EAAI,GAAAC,CAAE,EAChEC,GAEEC,EAAKJ,EAAKJ,EAAW,IAAMK,EAAKL,EAAW,IAAMM,EAAKN,EAAW,IACjES,EAAKL,EAAKJ,EAAW,IAAMK,EAAKL,EAAW,IAAMM,EAAKN,EAAW,IACjEU,EAAKN,EAAKJ,EAAW,IAAMK,EAAKL,EAAW,IAAMM,EAAKN,EAAW,IAEjEW,EACFR,EAAY,EAAIH,EAAW,IAC3BG,EAAY,EAAIH,EAAW,IAC3BG,EAAY,EAAIH,EAAW,IACzBY,EACFT,EAAY,EAAIH,EAAW,IAC3BG,EAAY,EAAIH,EAAW,IAC3BG,EAAY,EAAIH,EAAW,IACzBa,EACFV,EAAY,EAAIH,EAAW,IAC3BG,EAAY,EAAIH,EAAW,IAC3BG,EAAY,EAAIH,EAAW,IAEzBc,GACDvvB,EAAIyuB,EAAW,IAAMxuB,EAAIwuB,EAAW,IAAMD,EAAIC,EAAW,MACzDW,EAAKH,GACJO,GACDxvB,EAAIyuB,EAAW,IAAMxuB,EAAIwuB,EAAW,IAAMD,EAAIC,EAAW,MACzDY,EAAKH,GACJO,GACDzvB,EAAIyuB,EAAW,IAAMxuB,EAAIwuB,EAAW,IAAMD,EAAIC,EAAW,MACzDa,EAAKH,GAEJO,EACFH,EAAKb,EAAY,IAAMc,EAAKd,EAAY,IAAMe,EAAKf,EAAY,IAC7DiB,EACFJ,EAAKb,EAAY,IAAMc,EAAKd,EAAY,IAAMe,EAAKf,EAAY,IAC7DkB,EACFL,EAAKb,EAAY,IAAMc,EAAKd,EAAY,IAAMe,EAAKf,EAAY,IAE7DrH,EAAI+G,GACNsB,EAAKf,EAAW,IAAMgB,EAAKhB,EAAW,IAAMiB,EAAKjB,EAAW,GACpE,EACUvH,EAAIgH,GACNsB,EAAKf,EAAW,IAAMgB,EAAKhB,EAAW,IAAMiB,EAAKjB,EAAW,GACpE,EACUniB,EAAI4hB,GACNsB,EAAKf,EAAW,IAAMgB,EAAKhB,EAAW,IAAMiB,EAAKjB,EAAW,GACpE,EAEI,MAAO,CAACtH,EAAI,IAAKD,EAAI,IAAK5a,EAAI,GAAG,CACrC,EC7FMqjB,GAAY,IAAItiC,IAAS,CAC3BA,EAAO6/B,GAAO7/B,EAAM,KAAK,EACzB,KAAM,CAACuiC,EAAGzsB,EAAGmJ,EAAG,GAAGujB,CAAI,EAAIxiC,EACrB,CAACyiC,EAAGC,EAAGC,CAAC,EAAIC,GAAa,CAACL,EAAGzsB,EAAGmJ,CAAC,CAAC,EAClC,CAAC6a,EAAGD,EAAGgJ,CAAE,EAAI7B,GAAQyB,EAAGC,EAAGC,CAAC,EAClC,MAAO,CAAC7I,EAAGD,EAAGgJ,EAAI,GAAIL,EAAK,OAAS,GAAKA,EAAK,CAAC,EAAI,EAAI,CAACA,EAAK,CAAC,CAAC,EAAI,CAAA,CAAG,CAC1E,EAGA,SAASI,GAAaE,EAAO,CAEzB,IAAIC,EAAW,CACX,CAAC,mBAAoB,mBAAqB,iBAAkB,EAC5D,CAAC,mBAAqB,kBAAmB,kBAAmB,EAC5D,CAAC,mBAAqB,mBAAqB,kBAAkB,CACrE,EACQC,EAAa,CACb,CAAC,EAAK,kBAAoB,iBAAkB,EAC5C,CAAC,EAAK,mBAAqB,kBAAmB,EAC9C,CAAC,EAAK,mBAAqB,mBAAmB,CACtD,EAEQC,EAAQ5C,GAAiB2C,EAAYF,CAAK,EAC9C,OAAOzC,GACH0C,EACAE,EAAM,IAAKrkB,GAAMA,GAAK,CAAC,CAC/B,CACA,CCRA,SAASskB,GAAgBC,EAAW,CAChC,MAAMpC,EAAO,KAAK,KAAKoC,CAAS,EAChC,OAAAA,EAAY,KAAK,IAAIA,CAAS,GAE1BA,GAAa,OACPA,EAAY,MACZ,KAAK,KAAKA,EAAY,MAAS,MAAO,GAAG,GACnCpC,CACpB,CAEA,MAAMqC,GAAU,CAACtJ,EAAGD,EAAG5a,IAAM,CAEzB6a,EAAIoJ,GAAgBpJ,EAAI,GAAG,EAC3BD,EAAIqJ,GAAgBrJ,EAAI,GAAG,EAC3B5a,EAAIikB,GAAgBjkB,EAAI,GAAG,EAE3B,KAAM,CAAE,WAAAokB,EAAY,WAAAnC,EAAY,YAAAC,EAAa,GAAAG,EAAI,GAAAC,EAAI,GAAAC,EAAI,GAAAE,EAAI,GAAAC,EAAI,GAAAC,CAAE,EAC/DH,GAEJ,IAAIhvB,EAAIqnB,EAAIuJ,EAAW,IAAMxJ,EAAIwJ,EAAW,IAAMpkB,EAAIokB,EAAW,IAC7D,EAAIvJ,EAAIuJ,EAAW,IAAMxJ,EAAIwJ,EAAW,IAAMpkB,EAAIokB,EAAW,IAC7DpC,EAAInH,EAAIuJ,EAAW,IAAMxJ,EAAIwJ,EAAW,IAAMpkB,EAAIokB,EAAW,IAEjE,MAAMxB,EAAKP,EAAKJ,EAAW,IAAMK,EAAKL,EAAW,IAAMM,EAAKN,EAAW,IACjEY,EAAKR,EAAKJ,EAAW,IAAMK,EAAKL,EAAW,IAAMM,EAAKN,EAAW,IACjEa,EAAKT,EAAKJ,EAAW,IAAMK,EAAKL,EAAW,IAAMM,EAAKN,EAAW,IAEvE,IAAIuB,EAAIhwB,EAAIyuB,EAAW,IAAM,EAAIA,EAAW,IAAMD,EAAIC,EAAW,IAC7DwB,EAAIjwB,EAAIyuB,EAAW,IAAM,EAAIA,EAAW,IAAMD,EAAIC,EAAW,IAC7DyB,EAAIlwB,EAAIyuB,EAAW,IAAM,EAAIA,EAAW,IAAMD,EAAIC,EAAW,IAEjE,OAAAuB,GAAKZ,EAAKH,EACVgB,GAAKZ,EAAKH,EACVgB,GAAKZ,EAAKH,EAEVnvB,EAAIgwB,EAAItB,EAAY,IAAMuB,EAAIvB,EAAY,IAAMwB,EAAIxB,EAAY,IAChE,EAAIsB,EAAItB,EAAY,IAAMuB,EAAIvB,EAAY,IAAMwB,EAAIxB,EAAY,IAChEF,EAAIwB,EAAItB,EAAY,IAAMuB,EAAIvB,EAAY,IAAMwB,EAAIxB,EAAY,IAEzD,CAAC1uB,EAAG,EAAGwuB,CAAC,CACnB,EC3DMqC,GAAY,IAAItjC,IAAS,CAC3B,KAAM,CAAC85B,EAAGD,EAAG5a,EAAG,GAAGujB,CAAI,EAAI3C,GAAO7/B,EAAM,KAAK,EACvCujC,EAAMH,GAAQtJ,EAAGD,EAAG5a,CAAC,EAE3B,MAAO,CAAC,GADMukB,GAAaD,CAAG,EACZ,GAAIf,EAAK,OAAS,GAAKA,EAAK,CAAC,EAAI,EAAI,CAACA,EAAK,CAAC,CAAC,EAAI,CAAA,CAAG,CAC1E,EAGA,SAASgB,GAAaC,EAAK,CAEvB,MAAMC,EAAW,CACb,CAAC,iBAAmB,kBAAoB,kBAAmB,EAC3D,CAAC,kBAAoB,kBAAoB,iBAAkB,EAC3D,CAAC,kBAAoB,kBAAoB,iBAAkB,CACnE,EACUC,EAAa,CACf,CAAC,iBAAmB,kBAAoB,kBAAmB,EAC3D,CAAC,mBAAoB,kBAAqB,gBAAiB,EAC3D,CAAC,kBAAoB,kBAAoB,kBAAmB,CACpE,EAEUC,EAAMvD,GAAiBqD,EAAUD,CAAG,EAI1C,OAAOpD,GACHsD,EACAC,EAAI,IAAKhlB,GAAM,KAAK,KAAKA,CAAC,CAAC,CACnC,CAEA,CCjCA,KAAM,CAAE,IAAAilB,GAAK,IAAAC,EAAG,EAAK,KAEfC,GAAU,IAAI/jC,IAAS,CAQzB,GAAI,CAACowB,EAAGxR,EAAGolB,CAAC,EAAInE,GAAO7/B,EAAM,KAAK,EAClC,OAAI,MAAMgkC,CAAC,IAAGA,EAAI,GAClBA,EAAIA,EAAI7D,GACD,CAAC/P,EAAG0T,GAAIE,CAAC,EAAIplB,EAAGilB,GAAIG,CAAC,EAAIplB,CAAC,CACrC,ECXMqlB,GAAY,IAAIjkC,IAAS,CAC3BA,EAAO6/B,GAAO7/B,EAAM,KAAK,EACzB,KAAM,CAACowB,EAAGxR,EAAGolB,EAAG,GAAGxB,CAAI,EAAIxiC,EACrB,CAACuiC,EAAGzsB,EAAG+sB,CAAE,EAAIkB,GAAQ3T,EAAGxR,EAAGolB,CAAC,EAC5B,CAAClK,EAAGD,EAAG5a,CAAC,EAAIqjB,GAAUC,EAAGzsB,EAAG+sB,CAAE,EACpC,MAAO,CAAC/I,EAAGD,EAAG5a,EAAG,GAAIujB,EAAK,OAAS,GAAKA,EAAK,CAAC,EAAI,EAAI,CAACA,EAAK,CAAC,CAAC,EAAI,CAAA,CAAG,CACzE,ECTM,CAAE,KAAA0B,GAAM,MAAAC,GAAO,MAAAC,EAAK,EAAK,KAEzBC,GAAU,IAAIrkC,IAAS,CACzB,KAAM,CAACowB,EAAGta,EAAGmJ,CAAC,EAAI4gB,GAAO7/B,EAAM,KAAK,EAC9B4e,EAAIslB,GAAKpuB,EAAIA,EAAImJ,EAAIA,CAAC,EAC5B,IAAI+kB,GAAKG,GAAMllB,EAAGnJ,CAAC,EAAIsqB,GAAU,KAAO,IACxC,OAAIgE,GAAMxlB,EAAI,GAAK,IAAM,IAAGolB,EAAI,OAAO,KAChC,CAAC5T,EAAGxR,EAAGolB,CAAC,CACnB,ECLMM,GAAY,IAAItkC,IAAS,CAC3B,KAAM,CAAC85B,EAAGD,EAAG5a,EAAG,GAAGujB,CAAI,EAAI3C,GAAO7/B,EAAM,KAAK,EACvC,CAACowB,EAAGta,EAAG+sB,CAAE,EAAIS,GAAUxJ,EAAGD,EAAG5a,CAAC,EAC9B,CAACsjB,EAAG3jB,EAAG,CAAC,EAAIylB,GAAQjU,EAAGta,EAAG+sB,CAAE,EAClC,MAAO,CAACN,EAAG3jB,EAAG,EAAG,GAAI4jB,EAAK,OAAS,GAAKA,EAAK,CAAC,EAAI,EAAI,CAACA,EAAK,CAAC,CAAC,EAAI,CAAA,CAAG,CACzE,sZCeM,CAAErgB,uBAAwBC,EAAgB,EAAInJ,GAEpD,SAASsrB,GAAW,CAClBjY,iBAAAA,EACAkY,SAAAA,EACA9gC,SAAAA,EACA0a,KAAAA,EACAiM,MAAAA,EAAQ,EACRtf,QAAAA,EAAUA,IAAM,CAAC,CACnB,EAAG,CACD,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAC4nB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1CqhC,EAActiC,EAAO,IAAI,EAEzB,CAACuiC,EAAcC,CAAe,EAAIvhC,EAASinB,CAAK,EAChDua,EAAoBziC,EAAO,IAAI,EACrC0iC,GAAgB,IAAM,CACpBD,EAAkBviC,SAASyiC,eAAAA,CAY7B,EAAG,CAAA,CAAE,EACL,MAAMC,EAAe5iC,EAAOqiC,CAAQ,EACpCpiC,EAAU,IAAM,CACd,MAAM4iC,EAAa3a,EAAQoa,EAAYpiC,QAAQ4iC,YACzCC,EAAoBH,EAAa1iC,UAAYmiC,EAC/CU,MAAgC7iC,QAAUmiC,GAC9CC,EAAYpiC,QAAQymB,MAAAA,EACpB2b,EAAYpiC,QAAQ8iC,SAAS,CAC3B3wB,KAAMwwB,GAAcI,GAAAA,EAAU,GAAK,GACnC9X,SAAU4X,EAAoB,OAAS,QAAA,CACxC,CACH,EAAG,CAAC7a,EAAOma,CAAQ,CAAC,EAEpB,KAAM,CAACa,EAAcC,CAAe,EAAIliC,EAAS,EAAI,EAErDhB,EAAU,IAAM,CACd,IAAImjC,EAAetkC,GAAM,CACvB8J,EAAQ9J,EAAGyjC,EAAcpY,EAAkBmY,CAAW,CACxD,EACA,OAAIA,EAAYpiC,SACdoiC,EAAYpiC,QAAQK,iBAAiB,cAAe6iC,CAAW,EAE1D,IAAM,CACPd,EAAYpiC,SACdoiC,EAAYpiC,QAAQmjC,oBAAoB,cAAeD,CAAW,CAEtE,CACF,EAAG,CAACb,EAAcpY,CAAgB,CAAC,EAEnCnmB,GACE,MACClF,GAAM,CACL8J,EAAQ9J,EAAGyjC,EAAcpY,EAAkBmY,CAAW,CACxD,EACA,CACE57B,gBAAkB5H,GACC,CAAC,CAACd,SAAS2I,cAAc,sBAAsB,GAC7C7H,EAAE8H,SAAW9H,EAAE+H,SAAW/H,EAAEgI,QAAUhI,EAAEwH,SAE7DG,OAAQ,EAAA,EAEV,CAACmC,EAAS25B,EAAcpY,CAAgB,CAC1C,EAEAlqB,EAAU,IAAM,CACd,IAAIqjC,EAAeA,IAAM,CACvB,KAAM,CAAER,YAAAA,EAAaD,WAAAA,CAAAA,EAAeP,EAAYpiC,QAC1CgoB,EAAQmC,KAAK4X,MAAM5X,KAAKkZ,IAAIV,CAAU,EAAIC,CAAW,EAC3DN,EAAgBta,CAAK,CACvB,EACA,OAAIoa,EAAYpiC,SACdoiC,EAAYpiC,QAAQK,iBAAiB,SAAU+iC,EAAc,CAC3DE,QAAS,EAAA,CACV,EAEI,IAAM,CACPlB,EAAYpiC,SACdoiC,EAAYpiC,QAAQmjC,oBAAoB,SAAUC,CAAY,CAElE,CACF,EAAG,CAAA,CAAE,EAELrjC,EAAU,IAAM,CACd,IAAIsmB,EAAQnlB,WAAW,IAAM,CAC3BkhC,EAAYpiC,SAASymB,QAAAA,CACvB,EAAG,GAAG,EACN,MAAO,IAAMxlB,aAAaolB,CAAK,CACjC,EAAG,CAAA,CAAE,EAEL,MAAMkd,EAAgB1nB,GAAQ,IACrBoO,GAAkB/f,IAAKs5B,GAAU,CACtC,KAAM,CAAEC,SAAAA,CAAAA,EAAaD,EACrB,GAAIC,EAAU,CACZ,MAAMC,EAAeC,GAAwBF,CAAQ,EACrD,OAAOxB,GAAUyB,CAAY,CAC/B,CACA,OAAO,IACT,CAAC,EACA,CAACzZ,CAAgB,CAAC,EACf2Z,EAAoB/nB,GAAQ,IACzB0nB,GAAer5B,IAAK25B,GACrBA,EACK,CACLC,MAAOlC,GAAU,CAAC,IAAM,IAAMiC,EAAQ,CAAC,CAAC,CAAC,EACzCE,KAAMnC,GAAU,CAAC,IAAM,IAAMiC,EAAQ,CAAC,CAAC,CAAC,EACxCG,QAASpC,GAAU,CAAC,GAAKiC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,CAAC,CAAA,EAG7C,IACR,CACF,EACKI,EAAuBpoB,GAAQ,IAAM,CAEzC,MAAMqoB,EAAQ,IAAMN,EAAkBzhC,OAChCo1B,EAASqM,EAAkB15B,IAAI,CAAC0tB,EAAOroB,IAAM,CACjD,MAAMoC,EAAQpC,EAAI20B,EAAQt7B,EACpBgJ,GAAOrC,EAAI,GAAK20B,EAAQt7B,EAC9B,OAAIgvB,GAAOkM,OAASlM,GAAOmM,KAClB,CACLD,MAAO;AAAA,sBACKlM,EAAMkM,OAAOpvB,KAAK,GAAG,CAAC,KAAK/C,CAAK;AAAA,sBAChCimB,EAAMkM,OAAOpvB,KAAK,GAAG,CAAC,KAAK9C,CAAG;AAAA,gBAE1CmyB,KAAM;AAAA,sBACMnM,EAAMmM,MAAMrvB,KAAK,GAAG,CAAC,KAAK/C,CAAK;AAAA,sBAC/BimB,EAAMmM,MAAMrvB,KAAK,GAAG,CAAC,KAAK9C,CAAG;AAAA,eAAA,EAKtC,CACLkyB,MAAO;AAAA,4BACanyB,CAAK;AAAA,4BACLC,CAAG;AAAA,cAEvBmyB,KAAM;AAAA,4BACcpyB,CAAK;AAAA,4BACLC,CAAG;AAAA,aAAA,CAG3B,CAAC,EACKuyB,EAAgB5M,EAAOrtB,IAAK0tB,GAAUA,EAAMkM,KAAK,EAAEpvB,KAAK,IAAI,EAC5D0vB,EAAe7M,EAAOrtB,IAAK0tB,GAAUA,EAAMmM,IAAI,EAAErvB,KAAK,IAAI,EAChE,MAAO,CACLovB,MAAOK,EACPJ,KAAMK,CAAAA,CAEV,EAAG,CAACR,CAAiB,CAAC,EAEtB,IAAIS,EAAWvkC,EAAO,IAAI,EAC1BC,OAAAA,EAAU,IACD,IAAM,CACXskC,EAASrkC,SAASskC,YAAAA,CACpB,EACC,CAAA,CAAE,EAEL9B,GAAgB,IAAM,CACpB,MAAM+B,EAAeX,EAAkBvB,CAAY,EACnD,IAAImC,EACAC,EACJ,GAAIF,EAAc,CAChB,MAAM7iB,EAAQvG,GAAM8B,MAAM5B,IAAI,OAAO,EACrC,GAAIqG,EAAO,CACT,MAAMgjB,EAAa,OAAOH,EAAa7iB,CAAK,EAAEhN,KAAK,GAAG,CAAC,IACvDtU,EAAQga,SAAI,cAAA,uDAAA,EAAEsqB,IAAYD,EAAAD,EAAA,QAC1BA,EAAQ1mC,UAIN2mC,KAAAA,CACAD,MAAAA,EAAgBE,OAAAA,WAAAA,8BAAAA,EAAAA,QAAAA,OAAAA,QAClBA,EAAA,OAAAH,EAAAI,CAAA,EAAA,KAAA,GAAA,CAAA,IACFH,EAAO,SAAA,cAAA,oCAAAG,CAAA,IAAA,EACLH,IAIAC,IAAmB,QACnBrkC,EAAQga,QAAIsqB,EAAEA,CACdF,CAGA,MAAA,IAAIA,CACFC,GAAAA,IACAD,EAAAA,QAAMI,EACR,CACF,EACF,CAAAvC,EAAAuB,CAAA,CAAA,EACAr8B,EAAO,MAAM,CAEX,iDAAwB0iB,GAAA,MAAA,GACtBua,SAAMI,CAAAA,EAAAA,MAAUH,CAClB,IAAArC,EACF,SAAA,IACEC,uBAAcuB,KAElB,iBAEI57B,QAAOpJ,GAAA,EAAsE6I,SAE7E,UAAA,SAAA,eAAA,GAAA7I,EAAA,OAAA,UAAA,SAAA,OAAA,GAAAA,EAAA,OAAA,UAAA,SAAA,YAAA,IACE+I,EAAKy6B,EAAAA,EAAAA,EAAAA,CAAAA,CAEL,EACAp6B,MAAMiiB,EAAA,OAAA,EAAA,CACNpiB,qBAAgB,QACd,0BACqBg9B,SAInBn8B,yBAAW25B,GAAgCD,IAE/C,EACAh5B,CAAAA,EAEM,SACE07B,GAAsB,IAAA,CAAAtB,EAAAj0B,IAAA,CACtB,UAA2B00B,SAAAA,EAAsBH,EAAAA,CAAAA,EAAAA,KACjD,gBAAgDC,MAAAA,gBAAAA,MAAAA,EAAAA,CAIjD,iBAAA,OAAAgB,EAAA,QAAA,KAAA,GAAA,CAAA,IACNt9B,uBAEkByC,SAAkB,OAAA,KAAA,GAAA,CAAA,IACnC,sBACE+f,OAAAA,EAAiB9nB,MAAeyhC,KAAAA,GAAAA,CAAAA,IAClC,uBACE,QAAAmB,EAAA,QAAA,KAAA,GAAA,CAAA,QAAA,EACE/8B,CAAAA,EACAoB,SACE27B,IACI,UACoBxC,EAAmByB,KAAiB,+BAI/B,SAAOe,OAAAA,OAGN,CAMhCl5B,EAEAlE,SAAK4H,CAAM8yB,CAAAA,CAAAA,EAAAA,aAAeE,EAAAA,SAAoB,CAC9C16B,KAAAA,SAKE,MAAOkB,YACLk6B,OAAAA,CAAAA,EACF,QAAA,IAAA,CACF1hC,EAAA,aAAA,KAECiiC,EAAEA,YAEC57B,KAAAA,CAAK,CAEL1H,EACA2H,SAASA,CAAAA,EAAM,OAAA,CACbtG,MAAOyjC,YAAe,SACfxB,KAAMyB,CAAAA,EACXlpB,EAAAA,OAAAA,CACF,MAAA,iBACF,KAAAA,EAAEtU,IAAAA,OAEIO,SAAMw7B,EAAA,WAAA,CAAA,CAAW/7B,CAAC,CAAA,EAASC,EACjCA,GAAA,CAAA,MAAA87B,EAAY,aAAiBznB,GAAAA,KAAAA,CAAgB,CAAA,CAAA,CACpCkpB,EAAAA,EACF,EAAA,CAAA,CAAA,CAGL,CAAA,EAAA19B,EAACi8B,MAAAA,CAAAA,MAAc0B,wBAAY,OAACnpB,CAAAA,EAAAA,SAAc,CAAArU,EAAA,OAAA,CAAA,SA9BrC3F,EA+BR,SAAA,CAER,KAAA,SAEHwF,MAAA,kBAAKS,QAAMpJ,GAAA8J,EAAA9J,EAAAyjC,EAAApY,EAAAmY,CAAA,WAAiCY,EAAAA,EAAAA,CAAav7B,KACvDC,IAAAD,IAAAA,EAGIO,IACUpJ,QAC8C,CAGnD,CAAM,CAAA,CAAOiF,CAAAA,CAAAA,CAAAA,EAAAA,GAAE,OAAA,EAAA6D,EAAA,OAAA,CAAA,MAAA,gBAAA,SAAOuiB,GAAA,IAAA,CAAAuZ,EAAAj0B,IAAA7H,EAAA,SAAA,CAAA,KAAC,SAAC,SAAE6H,IAAA8yB,EACzB,MAAA,gBAAA9yB,IAAA8yB,EAAA,SAAA,EAAA,GAETpY,QAAAA,GAAAA,CACOjiB,EAAAA,eAAM,oBACTiiB,EAGGriB,MAAKuK,EAAAiwB,EAAA,QAAA,YAAA7yB,GAAAwzB,GAAA,EAAA,GAAA,KACKxzB,QAAM8yB,MAAAA,EAChBr6B,EAAO,QAAA,SAAsBq6B,CAC7Bx6B,KAAAA,EACIE,SAAAA,QACFnJ,CAAAA,CACA,EAEAwjC,SAAAA,KACAA,KAAAA,QAA6B,KAAEjwB,IAAAA,IAAM8Y,GAAU,CAAA,CAAU,EAC3DuY,EAAA,EAAA,CAAA,CAAA,CAAA,EAAE/7B,EAAAA,SAEDU,EAAAA,EAAI,OAAA,CAAA,SAAM,CAAAZ,EAAAkT,GAAA,CAAA,SAAa,OAAA,MAAQ,MAAG,SAAE,SAAC,IAbjC+oB,gBAkBX,aAEF/7B,WACEF,EAACkT,SAAK,CACJ4X,KAAAA,SACAxoB,MAAM,kBACNsoB,SAASzqB,EAAAS,EAAA,CACTS,KAAK,OACLu8B,IAAAA,EAEUv9B,CAAcI,GAAM,QAAA,CACrB,CAAM,CAAA,CAAUnE,CAAAA,EAAAA,SAAE,CAAA0D,EAAAiC,GAAA,CAAA,KAAAzH,EAAAsgC,CAAA,GAAA,WAAApY,EAAAoY,CAAA,GAAA,IAAA,MAAM,kBAAA,OAAC,SAAC,MAAEx+B,EAEpC4D,IAIGwiB,QACgChQ,CAE5B,EAENlP,SAAKlH,CAAAA,EAAAA,EAAAA,CAAAA,KAAAA,QAAAA,CAAAA,EAAE6D,EAAA,OAAA,CAAA,SAAAA,EAAAgC,EAAA,CAAmC,GAAA,QAAA,CAAC,CAAA,CAACjC,CAAAA,CAEvC,CAAA,EAACW,EAAAA,CAAK,CAAA,EAAQ,IACnBV,CAAAA,CAAAA,GAAAH,EAAA+T,GAAA,CAAA,GAAA7T,GAAAA,MACEiC,CAAA,GAAA,EAAA,MAAAy4B,CAAA,GAAA,OAAA,WAAA,iCAAA,EAAA,QAAA,UAAAE,EAAA,CAAA,GAAA,EAAA,GAAA,MAAAtgC,yCAAA,SAAiC,CAAAwF,EAAA,OAAA,CAAC,MAC7B,wBA4CN,CAAAG,EAAAgC,EAAA,CACI,GACP,QACK,GACC,GAAGrI,CAGC,CAER2G,EAAAA,GAAM,CAAA,CAAA,CAQNP,CAEA,CAAA,CAAA,CAAY,CAAA,EAAAwiB,GACVviB,OAAAgC,GAAAnC,EAAA,MAAA,CAAA,MAAA,oBAAA,UAA4B,SACvB,CAETG,EAAA,SAAA,CAAA,KACD,SACI,MAAA,kBAERuiB,OAAAA,IAAkB9nB,EACZ6F,QAAMpJ,GAAA,kBAA6BokC,EAAav7B,EAAAA,gBACnD,EACEG,EAAK,QAAA,MAAA,EACLI,EAAM,QAAA,SAAA,MACEq6B,EAAAA,QAAiB,aAAAA,EAAA,IAAAU,GAAA,EAAA,GAAA,GACzBl7B,SAAUjJ,QACRA,CAAAA,CACAA,EACAwjC,SAAAA,KACAA,KAAAA,aAA6B,IAC3BjwB,EAKD,CACH,GAAA,QAAA,CAEK,CAAM,CAAA,CAAgBtO,CAAAA,EAAAA,EAAAA,SAAAA,CAAAA,KAAE,SAAA,MAAA9B,kBAAA,OAAUsgC,IAAApY,EAAA,OAAA,EAAA,QAACrrB,GAAA,CAAGA,EAAA,eAAA,EAE7C8I,EAAAA,gBAAA,EACEE,EAAK,QAAA,MAAA,EACLI,EAAM,QAAA,SAAA,CACN9H,KAAQmiC,EAAAA,QAAiBpY,aAAiB9nB,EAAS,IAAA4gC,GAAA,EAAA,GAAA,GACnDl7B,SAAUjJ,QACRA,CAAAA,CACAA,EACAwjC,SAAAA,KACAA,KAAAA,cAA6B,IAC3BjwB,EAKD,CACH,GAAA,QAAA,CAEK,CAAM,CAAA,CAAiBtO,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,CAAA,CAAA,CC/d1C,SAAwBuhC,GAAc,CAAEnrB,IAAAA,EAAKorB,SAAAA,EAAU38B,QAAAA,CAAQ,EAAG,CAChE,KAAM,CAAE/H,EAAAA,CAAAA,EAAGC,GAAAA,EACX,GAAI,CAACqZ,EAAK,OAAO,KAEjB,IAAIqrB,EAAarrB,EACjB,GAAI,CACF,MAAMiZ,EAAS4G,IAAI5zB,MAAM+T,CAAG,EACtBsrB,EAAWrS,EAAOqS,SAClBvuB,EAAWkc,EAAOlc,SAClBmpB,EAAOlmB,EAAI/F,MAAMgf,EAAOhc,OAAO/U,MAAM,EAC3CmjC,EACE/9B,EAAAC,EAAA,CAAAC,SAAA,CACG89B,EAAS,KAAE79B,EAAA,SAAA,CAAAD,SAASuP,CAAAA,CAAiB,EACrCmpB,CAAI,CAAA,CACL,CAEN,MAAY,CAAC,CAEb,MAAMqF,EAAaA,IAAM,CACvB,GAAI,CACF1nB,UAAU2nB,UAAUC,UAAUzrB,CAAG,EACjClW,GAASF,EAAC,CAAA9B,GAAA,QAAA,CAAa,CAAC,CAC1B,MAAY,CACV3B,KACSyD,CAAC,GAAA,QAAA,CAAA,CAAA,CAAqB,CAAC,EAEpC8hC,EAAA,IAAA,CAEA,GAAMA,iBAAcA,UAAM,SAAA,CACxB,IAAA1rB,CAA0C,CAAA,EAAO,GAAG,CAClD,UAAI,MAAA,CACF6D,IAAAA,CAAgB,CAAA,CAAE7D,MAAK,CAAA,CAEvB7Z,EAAe,OACjBmH,EAAA,MAAA,CACF,MAAA,oBACF,GAAA,kBAEA,cACOS,SAAM,CAAA,CAAA,CAAAU,GAAAhB,EAAA,SAAA,CAAoB3F,KAAG,SAAkB8J,MAAAA,sBACjDnD,EACSd,SAAKF,EAAAS,EAAA,CAASH,KAAM,IAAcH,IAAAA,EAClCO,CAASE,GAAGzE,QAAAA,CAAAA,CAAE,CAAA,CAAA,CAAA,EAAA6D,EAAO,SAAA,CAAA,MAAC,cAAC,SAAEA,EAAA,KAAA,CAGnCA,SAAAA,EAAAgC,EAAA,CAAQ1B,GAAM,QAAA,CAAaP,CACzB,CAAA,CACE,CAAA,EAAAF,EAAA,OAAA,CAAA,SAAwB,CAAA,CAAA,CAAA89B,GAAA99B,EAAAC,EAAA,CACtB,SAAA,CAAAD,EAAA,IAAA,CAENA,MAAA,qBACK89B,CAAAA,EAAAA,GACD59B,mBACKO,KAAM,IAAA,CAAWP,EAAAA,IAAAA,CACjBU,CAAI,CAAA,EAACC,EAAAA,MAAK,CAAA,MAAcC,QAAS,SAAKg9B,EAAAA,EAAQ,CAEjD39B,KAAA,YAAA,CAAKM,CAAM,CAAA,CAAOP,CACX,CAAA,EAAAC,EAACU,IAAK,CAAA,MAAc,WAAC,SACtBk9B,CAAA,CACN,CAAA,CAEJ,CAAA,EAAGt9B,EAAAA,SAAM,CAAA,SAAUP,CAAAA,EAAE69B,SAAAA,CAAe,KAAA,SAEtC/9B,MAAA,QAAAE,QACEC,EAAQE,SAAKF,EAAAgC,EAAA,CAAS1B,GAAAA,QAAM,CAAQH,CAASa,CAAAA,EAAQjB,EAAAA,OACnDiC,CAAA,MAAA,QAAA,CAAA,EAAoBhC,EAAA,SAAA,CACd,KACRA,SAAMM,MAAM,SAAU,QACtBw9B,EAAQ59B,SAAKF,EAAAS,EAAA,CAASH,KAAM,OAASH,IAAAA,EAC7BO,CAAYE,GAAGzE,QAAAA,CAAAA,CAAE,CAAA,CAAA,CAAA,EAAA,UAAM,UAAA,UAAA,SAAA,CAAA,IAAAoW,CAAC,CAAA,GAAGvS,EAAA,SAAA,CAC3B,KACPoW,SAA2C7D,MAAAA,SAAK,QAC/C0rB,EAAQ/9B,SAAKF,EAAAS,EAAA,CAASH,KAAM,QAASH,IAAAA,EAC7BO,CAAaE,GAAGzE,QAAAA,CAAAA,CAAE,CAAA,CAAA,CAAA,EAAA6D,EAAQ,IAAA,CAAA,MAAC,SAAC,KAAEuS,EAC9B,OAEV,SACEjS,IAAAA,sBACA2S,QAAMV,EACNlR,SAAOrB,EAAAgC,EAAA,CACP8Y,GAAI,QAAA,CACJ3a,CAASa,CAAAA,CAAQjB,CAEjB,CAAA,CAAA,CAAA,CAAA,CAAkB,CCvE5B,MAAMm+B,GAAa,CAAiB,OAAQ,QAAS,YAAa,OAAO,EAGnEC,GAAkB,CAKtBC,KAAM,CACJ97B,MAAO,CAAAjI,GAAA,QAAA,EACPkjC,YAAa,CAAAljC,GAAA,QAAA,CAA2D,EAE1EgkC,MAAO,CACL/7B,MAAO,CAAAjI,GAAA,QAAA,EACPkjC,YAAa,CAAAljC,GAAA,QAAA,CAAoD,EAEnEikC,UAAW,CACTh8B,MAAO,CAAAjI,GAAA,QAAA,EACPkjC,YAAa,CAAAljC,GAAA,QAAA,EACbkkC,WAAY,CAAAlkC,GAAA,QAAA,CAAa,EAE3BmkC,MAAO,CACLl8B,MAAO,CAAAjI,GAAA,QAAA,EACPkjC,YAAa,CAAAljC,GAAA,QAAA,EACbokC,aAAc,EAAA,CAElB,EAEA,SAASC,GAAqBC,EAAMC,EAAa,CAC/C,GAAI,CAACD,EAAKE,cAAgB,CAACD,EAAa,OAAO,KAC/C,MAAME,EAAqBrmB,OAAOrU,KAAKu6B,EAAKE,YAAY,EACxD,GAAI,CAACC,GAAoBrkC,OAAQ,OAAO,KAExC,IAAIskC,EAAczJ,GAAY,CAACsJ,CAAW,EAAGE,EAAoB,IAAI,EACrE,GAAI,CAACC,EAAa,CAIhB,MAAMC,EAAsBF,EAAmBt8B,IAAK6R,GACpCA,EAAK0L,MAAM,WAAW,EAEjCvd,IAAI,CAACy8B,EAAMp3B,IAAOA,IAAM,EAAIo3B,EAAOA,EAAKjhC,YAAAA,CAAc,EACtDgP,KAAK,GAAG,CACZ,EACD+xB,EAAczJ,GAAY,CAACsJ,CAAW,EAAGI,EAAqB,IAAI,CACpE,CAIA,GAAID,GAAeA,EAAYpwB,SAAS,GAAG,EAAG,CAC5C,KAAM,CAAC0F,EAAM6qB,CAAM,EAAIH,EAAYhf,MAAM,GAAG,EAC5Cgf,EAAc1qB,EAAO6qB,EAAOC,OAAO,CAAC,EAAEC,cAAgBF,EAAO1yB,MAAM,CAAC,CACtE,CAEA,OAAOuyB,CACT,CAEA,SAASM,GAAeC,EAAOV,EAAa,CAC1C,OAAKU,GAAO7kC,OACPmkC,EACEU,EAAM98B,IAAKm8B,GAAS,CACzB,MAAMI,EAAcL,GAAqBC,EAAMC,CAAW,EAC1D,MAAO,CACL,GAAGD,EACHY,gBAAiBZ,EAAKE,eAAeE,CAAW,GAAG9X,MAAQ,IAAA,CAE/D,CAAC,EAPwBqY,EADE,CAAA,CAS7B,CAEA,SAASE,GAAY,CAAErtB,QAAAA,EAASxS,KAAAA,EAAMqB,QAAAA,CAAQ,EAAG,CAC/C,KAAM,CAAE8Q,EAAAA,EAAG7Y,EAAAA,EAAG+a,KAAAA,CAAAA,EAAM9a,GAAAA,EACd,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAACwmB,EAAU4f,CAAM,EAAIttB,EAAQyN,KAAKG,MAAM,GAAG,EAE3C,CAAC2f,EAAiBC,CAAa,EAAIxrB,GAAQ,IAAM,CACrD,KAAM,CAAEmrB,MAAAA,EAAOG,OAAAA,CAAAA,EAAWG,GAAAA,EAE1B,MAAO,CAACP,GADSC,GAAS,CAAA,EACOtrB,EAAKS,MAAM,EAAGgrB,CAAM,CACvD,EAAG,CAACzrB,EAAKS,MAAM,CAAC,EAEV,CAACorB,EAAkBC,CAAmB,EAAIzmC,EAAS,IAAI,EACvD,CAAC0mC,EAAWC,CAAY,EAAI3mC,EAAS,EAAK,EAE1C4mC,EAAW7nC,EAAO,IAAI,EACtB,CAAC8nC,EAAUC,CAAW,EAAI9mC,EAAS,EAAK,EAE9C,OACEwG,EAAA,MAAA,CAAKS,MAAM,yBAAwBP,UACjCF,EAAA,MAAA,CAAKS,MAAM,eAAcP,UACvBC,EAAA,KAAA,CAAAD,SAAS5D,EAAJwD,EAAO,CAAAtF,GAAA,QAAA,EAAiB,CAAAA,GAAA,SAAAC,OAAA,CAAAulB,SAAAA,CAAAA,CAAoB,CAAxB,CAA0B,CAAK,EACxD7f,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,eACN+B,SAAUye,IAAY,UACtB3gB,QAASA,IAAMa,EAAAA,EAAUjB,SAEzBC,EAACS,EAAI,CAACC,KAAK,IAAIC,KAAK,KAAKC,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACnC,CAAC,CAAA,CACN,EACLwF,EAAA,OAAA,CAAAE,UACEC,EAAA,MAAA,CAAKM,MAAM,iBAAgBP,SACxBJ,EACCK,EAAC+0B,GAAM,CAACvmB,OAAQ7O,EAAMgB,KAAK,IAAIy/B,YAAW,EAAA,CAAE,EAE5CpgC,EAAC6jB,GAAY,CACX1R,QAAAA,EACA2R,WAAW,MACXuc,gBAAe,GACfrL,UAAS,GACTsL,aAAY,EAAA,CACb,CAAA,CAEA,EACJ,CAAC,CAACT,GACD,CAAC1B,GAAgB0B,CAAgB,EAAEpB,cACjC5+B,EAAA,OAAA,CACES,MAAM,eAEN,cAAY,OAAMP,SAAA,CAEjB+R,EACCqsB,GAAgB0B,CAAgB,EAAEtB,YAChCzsB,EAAEqsB,GAAgB0B,CAAgB,EAAEv9B,KAAK,CAC7C,EACAtC,EAAA,QAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA4B,CAAA,CACvB,CAAC,CAAA,EATHwlC,CAUD,EAEVhgC,EAAA,OAAA,CACE4lB,SAAWvuB,GAAM,CACfA,EAAEmJ,eAAAA,EAEF,MAAMyZ,EAAW,IAAIC,SAAS7iB,EAAEmK,MAAM,EAChCwE,EAAU4S,OAAOkF,YAAY7D,EAASjU,SAAS,EACrDnN,GAAAA,CAEA,SAAA6nC,EAAMA,QAAAA,EAAU1Z,QAAAA,CAAAA,EAAS2Z,EAAY36B,IAAAA,EAAAA,QACjC26B,IAAU3Z,OAAAA,EAAUpoB,IACxB,MAAI+hC,EAAYD,IAAMC,YAAU,OAAA,QAAA36B,CAAA,EAAA,OAAA,CAAA,CAAA9H,CAAA,IAAAA,EAAA,WAAA,UAAA,CAAA,EAAA,IAAA,CAAA,CAAAA,EAAAxD,CAAA,IAAAA,CAAA,EAAA,OAC1BkmC,EAAAA,CAON,SAAAF,EACEA,QAAAA,EACA1Z,QAAAA,EACA2Z,QAAAA,CAAAA,EAEFnjB,EAAA,SAAA,GACA3kB,UAEA2kB,GAAAA,CACC,MAAA3jB,EAAY,GAAA,QAAA,OAAA,CACP,UAAAyY,EAAA,GACF,UAAYnY,GAAG0mC,GAAQ5qB,CAAAA,EAAO,EAAA,EAAA,OAC5B6qB,SAAAA,EACAC,QAAAA,EACAL,QAAAA,EACA1Z,QAAAA,CAAAA,CAAAA,EACA4Z,EACAD,SAAAA,EACFnkC,GAACF,EAAAwD,EAEDtD,CAAcF,GAAAA,QAAAA,EAAmB,CAAAA,GAAAA,QAAAA,CAAhB,CAAmB,EAAA6E,EAAkB,CAAA,OAACsQ,EAAA,CACvDtQ,EAAQ,OAAA,KACDsQ,GAAO,SAAAnV,EAAAwD,EAEd0d,CACAhhB,GAAAA,QAESF,EACsB,CAACA,GAAAA,QAAAA,CADvBA,CAED,CAAA,CAAA,GAAA,CAA0B,EAClC,SACF,CAAA6D,EAAA,IAAA,CACF,SAAG7D,EAAAwD,EACHI,YAGK5D,EACiC,CAACA,GAAAA,QAAAA,CADlCA,CAED,CAAA,EAAA6D,EAAA3F,UAAA,CAAA,MAAqC,oBAAC,SAAA6jC,GAAA,IAAAqC,GAAAA,IAAA,aAAA,CAAAb,GAAA,OAAA,KAAA7/B,EAAAghC,EAAA,CAE5C7gC,SAAA,CAAAH,EAAA,QAAA,CAASS,MAAM,kBAAmBP,SAC/Bm+B,CAAAA,EAAAA,QAAgBqC,CAEJxgC,aACAO,KAAM,WAAiBP,MAAAA,EAE1BG,SAAK,GACL8U,SAAK8L,IAAA,UACLvmB,SAAOgmC,GAAAA,CACP7f,EAAQxpB,EAAA,OAAA,KAAA,IACE4pB,EAAAA,OAAY,QAAA,WAAA,CACtBxL,CACEwqB,CAAAA,EAAAA,EAAAA,OAAAA,CACAE,SAAAA,CAAAA,EAAAA,GAAsBzlC,CAAU,EAAA,KAAA,EAAW,KAAAyF,EAAA,QAAA,CAC7C,MAAA,mBAEFH,SAAAiS,EAAAqsB,GAAAoC,CAAA,EAAA,WAAA,CAAA,CAAAxgC,CAAAA,CAEE,CAAA,CAAA,CAAa,CAAA,EAAAwgC,IACVzuB,aAAEqsB,CAAAA,CAAgBoC,GAAUhD,QAAWv9B,EAAA,MAAA,CAAA,MAClC,gCAAA,OACH,CAAA+/B,WAERQ,EAAa,MAAA,CAEVjgC,MAAM,kCACGy/B,EAAAA,MAAAA,CAAUhgC,qBAEdO,IAAM2/B,EAAwBlgC,WACjC,IAAA,CAAA4+B,EAAA92B,IAAAhI,EAAA,QAAA,CAAKS,MAAM,cAAeL,SAAKggC,CAAAA,EAAAA,QAAAA,MAC5BP,WACQp/B,KAAM,YAAAuH,CAAA,IAAa9H,MAAAA,EACxBC,GACEE,SAAK6/B,GAAA,CAAAG,EACLlrB,aAAmB,UACnBza,SAAOokC,GAAKtkC,CACZqmB,KAAAA,UACsB,WAEpBrF,EAAQA,EAAAA,EAAAA,EACK4kB,EAAA,QAAA,iBAAA,eAAA,EACK,QAClBE,EAAO,EAAA,CAMHA,CAAiB,CAAA,EAAAngC,EACnB,OAAA,CAAA,SACF2+B,EAAA,iBAAAA,EAAA,IAAA,CAAA,CACF,CAAA,EACDA,EACD3+B,EAAAA,CAAA,CAAA,CAAA,CAAoCinB,CAAAA,CAAY,CAAA,CAAA,CAEnD,EAAAsZ,CACE,CAAA,CAAA,CAAA,EAAA1gC,EACF,UAAA,CAAA,MAER,iBAAA,UACOG,EAEd,IAAA,CAEFH,SAAAG,EAAA,QAAA,CAASM,IAAM,iBAAgBP,SAC7BC,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAOgb,CAAI,CAAA,CACT,CAAA,EAAA/a,EAAA3F,WAAA,CAAA,UAA6B,OAAC,KACzB,IACN,KACH2F,UACE8gC,GAAAA,iBACAC,SAAKjgB,IAAA,UACL9L,SAAK,CAAArV,CACF,CAAA,CACH0C,CAAsB,CAAA,EACtBqe,KAAW/gB,IAAAA,GAAAA,EAAAA,UAAAA,CAAAA,SAAAA,EAAAA,IAAAA,CACX,SAAAE,EAAA,QAAA,CAED4/B,SAAUA,CAAAA,EAAAA,QAAWE,CACtB5/B,gBACEA,UACEA,KAAAA,UAEIG,SAAK4gB,IAAA,SAAA,CAAA,EACLkgB,IAAAA,EAAM,OAAA,CACNhsB,SAAKhV,EAAAgC,EAAA,aAEJ,OACHhC,CAAAD,OAAAA,CACE,EAAAzF,WAAA,CAAAmlC,EAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CACuB,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAC,CAAA,CACrB,CAAA,EAAA5/B,EACF,SAAA,CAAA,SACF,CAAAG,EAAA,SAAA,CACN,KAAA,SAGPH,SAAAihB,IAAA,UAAA/gB,SACEC,EAAAgC,EAAA,CAAQ9B,GAAK,QAAA,EAA+B,CAAA,EAAUH,IAAAA,WACpDiC,CAAA,KAAA,SAAA,MAAyB,SACnB,SACRhC,IAAA,UACEE,QAAK,SAAA,CACLI,GAAAA,OACUwgB,EAAAA,GAAAA,SAAY,QAAA3O,EAAA,EAAA,EAAA,KAAA,KACbhW,EAEL,CACAE,GAAAA,SAASF,OAAAA,CAAC,SAAA0jB,CAAA,CAAA,CAAA,CAAA,CAAAA,MAAkB,CAAAxjB,GAACF,GAE7BzD,GAAQ4Y,SACRjV,OAASF,CAAAA,SAAAA,CAAAA,CAAC,CAAA,CAAA,CAAA,CAAA0jB,EAA2B,SAAC7f,EAAAgC,EAAA,CAAA,GAAC,SACzC,WAAA,CAEF,EAAAhC,EAAA,QAAA,CAAED,UAEF,CAAA1F,CAAA,CAAA,CAAA,CACc,CAAA,EAAA,IAAOiG,EAAAA,SAAM,CAAA,KAA0B,SAAA,MAAC,SAAA,SAC/CwgB,IAAA,UACD,QACR9gB,SAAA,CACEE,GAAK,CACLI,MAAM5G,EAAA,GAAA,SAAA,QAAAyY,EAAA,EAAA,EAAA,MAAA,KACI2O,EAEJ,CACF,YACAzkB,OAASF,CAAAA,SAAAA,CAAAA,CAAC,CAAA,CAAA,CAAA,MAAA0jB,CAAAA,GAAoB1jB,EAAE,IACzBjF,SACPwB,QACA2D,SAAAA,CAASF,CAAAA,CAAC,CAAA,CAAA,CAAA,EAAA0jB,SAA4B7f,EAAAgC,EAAA,CAAA,GAAC,SAAA,WAAC,CAC1C,EAAAhC,EAAA,QAAA,CAEF,MAAA,IAAA,CAAED,CAEF,CAAA,CAAA,CAAA,CAAA,EAAAC,EACcA,GAAA,CAAA,OAAOM,IAAM,SAAA,CAAA,CAAA,CAA2B,CAAA,CAAA,CAAC,CAAA,CAAA,CAChD,CAAA,CAAA,CAEF,CAAA,CAAqB,iFCnVxC,IAAI2gC,EAAY,UAAW,CAG3B,IAAIC,EAAI,OAAO,aACXC,EAAe,oEACfC,EAAgB,oEAChBC,EAAiB,CAAA,EAErB,SAASC,EAAaC,EAAUC,EAAW,CACzC,GAAI,CAACH,EAAeE,CAAQ,EAAG,CAC7BF,EAAeE,CAAQ,EAAI,CAAA,EAC3B,QAAS15B,EAAE,EAAIA,EAAE05B,EAAS,OAAS15B,IACjCw5B,EAAeE,CAAQ,EAAEA,EAAS,OAAO15B,CAAC,CAAC,EAAIA,CAErD,CACE,OAAOw5B,EAAeE,CAAQ,EAAEC,CAAS,CAC3C,CAEA,IAAIP,EAAW,CACb,iBAAmB,SAAUQ,EAAO,CAClC,GAAIA,GAAS,KAAM,MAAO,GAC1B,IAAInzB,EAAM2yB,EAAS,UAAUQ,EAAO,EAAG,SAAS11B,EAAE,CAAC,OAAOo1B,EAAa,OAAOp1B,CAAC,CAAE,CAAC,EAClF,OAAQuC,EAAI,OAAS,EAAC,CACtB,QACA,IAAK,GAAI,OAAOA,EAChB,IAAK,GAAI,OAAOA,EAAI,MACpB,IAAK,GAAI,OAAOA,EAAI,KACpB,IAAK,GAAI,OAAOA,EAAI,GACxB,CACA,EAEE,qBAAuB,SAAUmzB,EAAO,CACtC,OAAIA,GAAS,KAAa,GACtBA,GAAS,GAAW,KACjBR,EAAS,YAAYQ,EAAM,OAAQ,GAAI,SAASnhB,EAAO,CAAE,OAAOghB,EAAaH,EAAcM,EAAM,OAAOnhB,CAAK,CAAC,EAAI,CAC7H,EAEE,gBAAkB,SAAUmhB,EAAO,CACjC,OAAIA,GAAS,KAAa,GACnBR,EAAS,UAAUQ,EAAO,GAAI,SAAS11B,EAAE,CAAC,OAAOm1B,EAAEn1B,EAAE,EAAE,CAAE,CAAC,EAAI,GACzE,EAEE,oBAAqB,SAAU21B,EAAY,CACzC,OAAIA,GAAc,KAAa,GAC3BA,GAAc,GAAW,KACtBT,EAAS,YAAYS,EAAW,OAAQ,MAAO,SAASphB,EAAO,CAAE,OAAOohB,EAAW,WAAWphB,CAAK,EAAI,EAAG,CAAE,CACvH,EAGE,qBAAsB,SAAUqhB,EAAc,CAI5C,QAHID,EAAaT,EAAS,SAASU,CAAY,EAC3CC,EAAI,IAAI,WAAWF,EAAW,OAAO,CAAC,EAEjC75B,EAAE,EAAGg6B,EAASH,EAAW,OAAQ75B,EAAEg6B,EAAUh6B,IAAK,CACzD,IAAIi6B,EAAgBJ,EAAW,WAAW75B,CAAC,EAC3C+5B,EAAI/5B,EAAE,CAAC,EAAIi6B,IAAkB,EAC7BF,EAAI/5B,EAAE,EAAE,CAAC,EAAIi6B,EAAgB,GACnC,CACI,OAAOF,CACX,EAGE,yBAAyB,SAAUF,EAAY,CAC7C,GAAIA,GAAa,KACb,OAAOT,EAAS,WAAWS,CAAU,EAGrC,QADIE,EAAI,IAAI,MAAMF,EAAW,OAAO,CAAC,EAC5B75B,EAAE,EAAGg6B,EAASD,EAAI,OAAQ/5B,EAAEg6B,EAAUh6B,IAC7C+5B,EAAI/5B,CAAC,EAAE65B,EAAW75B,EAAE,CAAC,EAAE,IAAI65B,EAAW75B,EAAE,EAAE,CAAC,EAG7C,IAAImqB,EAAS,CAAA,EACb,OAAA4P,EAAI,QAAQ,SAAU/sB,EAAG,CACvBmd,EAAO,KAAKkP,EAAErsB,CAAC,CAAC,CAC1B,CAAS,EACMosB,EAAS,WAAWjP,EAAO,KAAK,EAAE,CAAC,CAIlD,EAIE,8BAA+B,SAAUyP,EAAO,CAC9C,OAAIA,GAAS,KAAa,GACnBR,EAAS,UAAUQ,EAAO,EAAG,SAAS11B,EAAE,CAAC,OAAOq1B,EAAc,OAAOr1B,CAAC,CAAE,CAAC,CACpF,EAGE,kCAAkC,SAAU01B,EAAO,CACjD,OAAIA,GAAS,KAAa,GACtBA,GAAS,GAAW,MACxBA,EAAQA,EAAM,QAAQ,KAAM,GAAG,EACxBR,EAAS,YAAYQ,EAAM,OAAQ,GAAI,SAASnhB,EAAO,CAAE,OAAOghB,EAAaF,EAAeK,EAAM,OAAOnhB,CAAK,CAAC,EAAI,EAC9H,EAEE,SAAU,SAAUqhB,EAAc,CAChC,OAAOV,EAAS,UAAUU,EAAc,GAAI,SAAS51B,EAAE,CAAC,OAAOm1B,EAAEn1B,CAAC,CAAE,CAAC,CACzE,EACE,UAAW,SAAU41B,EAAcI,EAAaC,EAAgB,CAC9D,GAAIL,GAAgB,KAAM,MAAO,GACjC,IAAI95B,EAAGtN,EACH0nC,EAAoB,CAAA,EACpBC,EAA4B,CAAA,EAC5BC,EAAU,GACVC,EAAW,GACXC,EAAU,GACVC,EAAmB,EACnBC,EAAkB,EAClBC,EAAiB,EACjBC,EAAa,CAAA,EACbC,EAAiB,EACjBC,EAAsB,EACtBC,EAEJ,IAAKA,EAAK,EAAGA,EAAKjB,EAAa,OAAQiB,GAAM,EAQ3C,GAPAT,EAAYR,EAAa,OAAOiB,CAAE,EAC7B,OAAO,UAAU,eAAe,KAAKX,EAAmBE,CAAS,IACpEF,EAAmBE,CAAS,EAAII,IAChCL,EAA2BC,CAAS,EAAI,IAG1CC,EAAaC,EAAYF,EACrB,OAAO,UAAU,eAAe,KAAKF,EAAmBG,CAAU,EACpEC,EAAYD,MACP,CACL,GAAI,OAAO,UAAU,eAAe,KAAKF,EAA2BG,CAAS,EAAG,CAC9E,GAAIA,EAAU,WAAW,CAAC,EAAE,IAAK,CAC/B,IAAKx6B,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EACpCC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAIJ,IADApoC,EAAQ8nC,EAAU,WAAW,CAAC,EACzBx6B,EAAE,EAAIA,EAAE,EAAIA,IACf66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,CAE/B,KAAiB,CAEL,IADAA,EAAQ,EACHsN,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EAAKnoC,EACzCooC,GAAwBZ,EAAY,GACtCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQ,EAGV,IADAA,EAAQ8nC,EAAU,WAAW,CAAC,EACzBx6B,EAAE,EAAIA,EAAE,GAAKA,IAChB66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,CAE/B,CACU+nC,IACIA,GAAqB,IACvBA,EAAoB,KAAK,IAAI,EAAGE,CAAe,EAC/CA,KAEF,OAAON,EAA2BG,CAAS,CACrD,KAEU,KADA9nC,EAAQ0nC,EAAmBI,CAAS,EAC/Bx6B,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,EAKrB+nC,IACIA,GAAqB,IACvBA,EAAoB,KAAK,IAAI,EAAGE,CAAe,EAC/CA,KAGFP,EAAmBG,CAAU,EAAIG,IACjCF,EAAY,OAAOF,CAAS,CACpC,CAII,GAAIE,IAAc,GAAI,CACpB,GAAI,OAAO,UAAU,eAAe,KAAKH,EAA2BG,CAAS,EAAG,CAC9E,GAAIA,EAAU,WAAW,CAAC,EAAE,IAAK,CAC/B,IAAKx6B,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EACpCC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAIJ,IADApoC,EAAQ8nC,EAAU,WAAW,CAAC,EACzBx6B,EAAE,EAAIA,EAAE,EAAIA,IACf66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,CAE7B,KAAe,CAEL,IADAA,EAAQ,EACHsN,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EAAKnoC,EACzCooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQ,EAGV,IADAA,EAAQ8nC,EAAU,WAAW,CAAC,EACzBx6B,EAAE,EAAIA,EAAE,GAAKA,IAChB66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,CAE7B,CACQ+nC,IACIA,GAAqB,IACvBA,EAAoB,KAAK,IAAI,EAAGE,CAAe,EAC/CA,KAEF,OAAON,EAA2BG,CAAS,CACnD,KAEQ,KADA9nC,EAAQ0nC,EAAmBI,CAAS,EAC/Bx6B,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,EAKrB+nC,IACIA,GAAqB,IACvBA,EAAoB,KAAK,IAAI,EAAGE,CAAe,EAC/CA,IAER,CAII,IADAjoC,EAAQ,EACHsN,EAAE,EAAIA,EAAE26B,EAAkB36B,IAC7B66B,EAAoBA,GAAoB,EAAMnoC,EAAM,EAChDooC,GAAyBZ,EAAY,GACvCY,EAAwB,EACxBF,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClDA,EAAmB,GAEnBC,IAEFpoC,EAAQA,GAAS,EAInB,OAEE,GADAmoC,EAAoBA,GAAoB,EACpCC,GAAyBZ,EAAY,EAAG,CAC1CU,EAAa,KAAKT,EAAeU,CAAgB,CAAC,EAClD,KACR,MACWC,IAEP,OAAOF,EAAa,KAAK,EAAE,CAC/B,EAEE,WAAY,SAAUf,EAAY,CAChC,OAAIA,GAAc,KAAa,GAC3BA,GAAc,GAAW,KACtBT,EAAS,YAAYS,EAAW,OAAQ,MAAO,SAASphB,EAAO,CAAE,OAAOohB,EAAW,WAAWphB,CAAK,CAAE,CAAE,CAClH,EAEE,YAAa,SAAU7lB,EAAQooC,EAAYC,EAAc,CACvD,IAAIC,EAAa,CAAA,EACbvoC,EACAwoC,EAAY,EACZC,EAAW,EACXC,EAAU,EACV1nC,EAAQ,GACRw2B,EAAS,CAAA,EACTnqB,EACAs7B,EACAC,EAAMC,EAAMC,EAAUC,EACtB1uB,EACA1H,EAAO,CAAC,IAAI21B,EAAa,CAAC,EAAG,SAASD,EAAY,MAAM,CAAC,EAE7D,IAAKh7B,EAAI,EAAGA,EAAI,EAAGA,GAAK,EACtBk7B,EAAWl7B,CAAC,EAAIA,EAMlB,IAHAu7B,EAAO,EACPE,EAAW,KAAK,IAAI,EAAE,CAAC,EACvBC,EAAM,EACCA,GAAOD,GACZD,EAAOl2B,EAAK,IAAMA,EAAK,SACvBA,EAAK,WAAa,EACdA,EAAK,UAAY,IACnBA,EAAK,SAAW01B,EAChB11B,EAAK,IAAM21B,EAAa31B,EAAK,OAAO,GAEtCi2B,IAASC,EAAK,EAAI,EAAI,GAAKE,EAC3BA,IAAU,EAGZ,OAAQ/oC,EAAO4oC,EAAI,CACjB,IAAK,GAID,IAHAA,EAAO,EACPE,EAAW,KAAK,IAAI,EAAE,CAAC,EACvBC,EAAM,EACCA,GAAOD,GACZD,EAAOl2B,EAAK,IAAMA,EAAK,SACvBA,EAAK,WAAa,EACdA,EAAK,UAAY,IACnBA,EAAK,SAAW01B,EAChB11B,EAAK,IAAM21B,EAAa31B,EAAK,OAAO,GAEtCi2B,IAASC,EAAK,EAAI,EAAI,GAAKE,EAC3BA,IAAU,EAEd1uB,EAAIqsB,EAAEkC,CAAI,EACV,MACF,IAAK,GAID,IAHAA,EAAO,EACPE,EAAW,KAAK,IAAI,EAAE,EAAE,EACxBC,EAAM,EACCA,GAAOD,GACZD,EAAOl2B,EAAK,IAAMA,EAAK,SACvBA,EAAK,WAAa,EACdA,EAAK,UAAY,IACnBA,EAAK,SAAW01B,EAChB11B,EAAK,IAAM21B,EAAa31B,EAAK,OAAO,GAEtCi2B,IAASC,EAAK,EAAI,EAAI,GAAKE,EAC3BA,IAAU,EAEd1uB,EAAIqsB,EAAEkC,CAAI,EACV,MACF,IAAK,GACH,MAAO,EACf,CAII,IAHAL,EAAW,CAAC,EAAIluB,EAChBsuB,EAAItuB,EACJmd,EAAO,KAAKnd,CAAC,IACA,CACX,GAAI1H,EAAK,MAAQ1S,EACf,MAAO,GAMT,IAHA2oC,EAAO,EACPE,EAAW,KAAK,IAAI,EAAEJ,CAAO,EAC7BK,EAAM,EACCA,GAAOD,GACZD,EAAOl2B,EAAK,IAAMA,EAAK,SACvBA,EAAK,WAAa,EACdA,EAAK,UAAY,IACnBA,EAAK,SAAW01B,EAChB11B,EAAK,IAAM21B,EAAa31B,EAAK,OAAO,GAEtCi2B,IAASC,EAAK,EAAI,EAAI,GAAKE,EAC3BA,IAAU,EAGZ,OAAQ1uB,EAAIuuB,EAAI,CACd,IAAK,GAIH,IAHAA,EAAO,EACPE,EAAW,KAAK,IAAI,EAAE,CAAC,EACvBC,EAAM,EACCA,GAAOD,GACZD,EAAOl2B,EAAK,IAAMA,EAAK,SACvBA,EAAK,WAAa,EACdA,EAAK,UAAY,IACnBA,EAAK,SAAW01B,EAChB11B,EAAK,IAAM21B,EAAa31B,EAAK,OAAO,GAEtCi2B,IAASC,EAAK,EAAI,EAAI,GAAKE,EAC3BA,IAAU,EAGZR,EAAWE,GAAU,EAAI/B,EAAEkC,CAAI,EAC/BvuB,EAAIouB,EAAS,EACbD,IACA,MACF,IAAK,GAIH,IAHAI,EAAO,EACPE,EAAW,KAAK,IAAI,EAAE,EAAE,EACxBC,EAAM,EACCA,GAAOD,GACZD,EAAOl2B,EAAK,IAAMA,EAAK,SACvBA,EAAK,WAAa,EACdA,EAAK,UAAY,IACnBA,EAAK,SAAW01B,EAChB11B,EAAK,IAAM21B,EAAa31B,EAAK,OAAO,GAEtCi2B,IAASC,EAAK,EAAI,EAAI,GAAKE,EAC3BA,IAAU,EAEZR,EAAWE,GAAU,EAAI/B,EAAEkC,CAAI,EAC/BvuB,EAAIouB,EAAS,EACbD,IACA,MACF,IAAK,GACH,OAAOhR,EAAO,KAAK,EAAE,CAC/B,CAOM,GALIgR,GAAa,IACfA,EAAY,KAAK,IAAI,EAAGE,CAAO,EAC/BA,KAGEH,EAAWluB,CAAC,EACdrZ,EAAQunC,EAAWluB,CAAC,UAEhBA,IAAMouB,EACRznC,EAAQ2nC,EAAIA,EAAE,OAAO,CAAC,MAEtB,QAAO,KAGXnR,EAAO,KAAKx2B,CAAK,EAGjBunC,EAAWE,GAAU,EAAIE,EAAI3nC,EAAM,OAAO,CAAC,EAC3CwnC,IAEAG,EAAI3nC,EAEAwnC,GAAa,IACfA,EAAY,KAAK,IAAI,EAAGE,CAAO,EAC/BA,IAGR,CACA,GAEE,OAAOjC,CACT,EAAC,EAI2CuC,GAAU,KACpDA,EAAA,QAAiBvC,EACR,OAAO,QAAY,KAAe,SAAW,MACtD,QAAQ,OAAO,WAAY,CAAA,CAAE,EAC5B,QAAQ,WAAY,UAAY,CAC/B,OAAOA,CACX,CAAG,+BCxfH,MAAAwC,GAAe,+fCAfC,GAAe,8lBCAfC,GAAe,yjCCGTjY,GAAQ,IACRkY,GAAY,GAEX,eAAeC,IAAoB,CACxC,KAAM,CAAEnqC,MAAAA,GAAUyB,GAAG,EACf2oC,EAAWpqC,EAAMM,GAAG+pC,aACvB7pC,KAAK,CACJC,MAAOuxB,EACT,CAAC,EACApxB,OAAM,EACH0pC,EAAO,CAAA,EACb,IAAIC,EAAa,EACjB,EAAG,CACD,KAAM,CAAE1pC,MAAAA,EAAOk6B,KAAAA,CAAK,EAAI,MAAMqP,EAAStpC,KAAI,EAC3C,GAAIi6B,GAAQl6B,GAAOE,SAAW,EAAG,MACjCupC,EAAKnuB,KAAK,GAAGtb,CAAK,EAClB0pC,GACF,OAASA,EAAaL,IACtBI,OAAAA,EAAK/uB,KAAK,CAAClJ,EAAGmJ,IAAMnJ,EAAEiJ,KAAKI,cAAcF,EAAEF,IAAI,CAAC,EAChDtc,EAAQga,QAER,WAASjY,IAAQ,CAEbgZ,GAAA,QAAA,IAAA,eAAA,CACAA,KAAAA,EACEuwB,UAAI,KAAA,IAAA,CACJ5f,CAAAA,CACF,EAAC,CAAC,EAEN4f,CAEA,CACF,MAAA/f,GAAA,GAAA,GAAA,GAAA,IAEMA,eAAeigB,IAAgB,CACrC,GAAA,CACE,KAAI,CACF,KAAAF,EAAQA,UAAAA,CAAM5f,EAAAA,GAAAA,QAAAA,IAAAA,cAAAA,GAAAA,CAAAA,EAAU,OAAI3Q,GAAMtB,QAC9B,KAAK,MAAQiS,EAASH,IAExB4f,GAAA,EACAA,GAJ4C,MAAAA,GAAqB,CAOnE,MAAOG,CACP,MAAO9sC,CAAAA,CACP,CACF,CACF,MAAAitC,GAAA,SAAA,cAAA,KAAA,EAEaC,GAAY3U,GAAoB,CAC7C,GAAA,CAAOyN,EAAMkH,MAAAA,CAAAA,EACX,GAAIlH,EAAQ,QAAE,GAAS,IAAA,GAAA,MAAA,CAAA,EACvBiH,GAAIjH,UAAgBA,EACpBiH,MAAAA,EAAoBjH,GAAO,iBAAA,WAAA,EAC3B,OAAAmH,EAAkB,OACbA,MAAAA,KAAa5pC,OAAiBsR,GAAAA,EAAA,UAAA,KAAA,EAAA,QAAA,WAAA,EAAA,CAAA,EADN1N,CAAAA,GCxD/B,SAASimC,GAAU,CAAEvkC,SAAAA,CAAS,EAAG,CAC/B,GAAI,OAAOA,GAAa,SAAU,OAAOA,EACzC,KAAM,CAACknB,EAAMsd,CAAO,EAAIlrC,EAAS,EAAE,EACnChB,OAAAA,EAAU,IAAM,CACdmsC,QAAQxa,QAAQjqB,CAAQ,EAAE0kC,KAAKF,CAAO,CACxC,EAAG,CAACxkC,CAAQ,CAAC,EACNknB,CACT,CCqBO,MAAMyd,GAAkB,EAEzBC,GAAQ,CACZ,YACA,WACA,gBACA,OACA,SACA,WACA,SACA,UACA,YACA,YAEA,EAEIC,GAAY,CAChBpc,UAAW,CAAAnuB,GAAA,QAAA,EACXJ,cAAe,CAAAI,GAAA,QAAA,EACfH,KAAM,CAAAG,GAAA,QAAA,EACNwqC,OAAQ,CAAAxqC,GAAA,QAAA,EACRyvB,OAAQ,CAAAzvB,GAAA,QAAA,EACR,mBAAoB,CAAAA,GAAA,QAAA,EACpByqC,UAAW,CAAAzqC,GAAA,QAAA,EACX0qC,WAAY,CAAA1qC,GAAA,QAAA,EACZ2qC,QAAS,CAAA3qC,GAAA,QAAA,EACT4qC,SAAU,CAAA5qC,GAAA,QAAA,EACV6qC,SAAU,CAAA7qC,GAAA,QAAA,CACZ,EACM8qC,GAAc,CAClBjrC,KAAM,CACJ,CACE+sB,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,KACNowB,YAAa,EAAA,CACd,EAEHP,OAAQ,CACN,CACE5d,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,QACN9U,KAAM,UAAA,EAER,CACE+mB,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,WACN9U,KAAM,OACNmlC,YAAa,CAAAhrC,GAAA,QAAA,EACb+qC,YAAa,EAAA,CACd,EAEHH,SAAU,CACR,CACEhe,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,WACN9U,KAAM,OACNmlC,YAAa,CAAAhrC,GAAA,QAAA,EACb+qC,YAAa,EAAA,CACd,EAEHtb,OAAQ,CACN,CACE7C,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,QACN9U,KAAM,OACNmlC,YAAa,CAAAhrC,GAAA,QAAA,EACb+qC,YAAa,EAAA,CACd,EAEH,mBAAoB,CAClB,CACEne,KAAM,IACNjS,KAAM,KACN9U,KAAM,OACNmlC,YAAa,yBAAA,CACd,EAEHL,QAAS,CACP,CACE/d,KAAM,IACNjS,KAAM,UACN9U,KAAM,OACNmlC,YAAa,CAAAhrC,GAAA,QAAA,EACbirC,QAAS,OAAA,EAEX,CACEre,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,QACN9U,KAAM,UAAA,EAER,CACE+mB,KAAM,CAAA5sB,GAAA,QAAA,EACN2a,KAAM,WACN9U,KAAM,OACNmlC,YAAa,CAAAhrC,GAAA,QAAA,EACb+qC,YAAa,EAAA,CACd,CAEL,EACMG,GAAoBhpC,GAAK,MAAO,CAAElC,GAAAA,CAAG,IAAM,CAC/C,MAAM8X,EAAU,MAAMhX,GAAAA,EAAMzB,MAAMM,GAAG0C,SAASC,QAAQtC,CAAE,EAAEQ,MAAAA,EAC1D,OAAOsX,EAAQ0N,UAAY1N,EAAQyN,MAAQzN,EAAQmP,WACrD,CAAC,EACYkkB,GAAiB,CAC5Bhd,UAAW,CACTnuB,GAAI,OACJgJ,MAAOA,CAACyO,EAAGwO,IACTA,IAAU,EAACkR,GAAA1f,EACP,CAAAzX,GAAA,QAAA,CAAM,EAACm3B,GAAA1f,EACL,CAAEzX,GAAI,iBAAA,CAAwC,EACtDorC,KAAM,IACN/kC,KAAM,MAAA,EAERwkC,SAAU,CACR7qC,GAAI,WACJgJ,MAAO,CAAAhJ,GAAA,QAAA,EACPorC,KAAM,YACN/kC,KAAM,IAAA,EAERzG,cAAe,CACbI,GAAI,gBACJgJ,MAAO,CAAAhJ,GAAA,QAAA,EACPorC,KAAM,iBACN/kC,KAAM,cAAA,EAERxG,KAAM,CACJG,GAAIA,CAAC,CAAEA,GAAAA,CAAAA,IAAUA,EAAK,OAAS,QAC/BgJ,MAAOA,CAAC,CAAEhJ,GAAAA,CAAAA,IAAUA,EAAKoqB,GAAapqB,CAAE,EAACm3B,GAAA1f,EAAG,CAAAzX,GAAA,QAAA,CAAO,EACnDorC,KAAMA,CAAC,CAAEprC,GAAAA,CAAAA,IAAUA,EAAK,MAAMA,CAAE,GAAK,KACrCqG,KAAM,OACNglC,gBAAiBA,CAAC,CAAErrC,GAAAA,CAAAA,IAAWA,EAAwB,CAAA,EAAnB,CAAC,cAAc,CAAI,EAEzDwqC,OAAQ,CACNxqC,GAAI,SACJgJ,MAAOA,CAAC,CAAEkS,MAAAA,CAAAA,IAAaA,EAAKic,GAAA1f,EAAG,CAAAzX,GAAA,QAAA,CAAO,EAACm3B,GAAA1f,EAAG,CAAAzX,GAAA,QAAA,CAAW,EACrDsrC,SAAUA,CAAC,CAAEhsC,SAAAA,CAAAA,IAAeA,GAAYwB,GAAAA,EAAMxB,SAC9C8rC,KAAMA,CAAC,CAAElwB,MAAAA,EAAO5b,SAAAA,CAAAA,IAAe,IAAIA,CAAQ,KAAK4b,EAAQ,KAAO,EAAE,GACjE7U,KAAMA,CAAC,CAAE6U,MAAAA,CAAAA,IAAaA,EAAQ,WAAa,OAAA,EAE7C0vB,SAAU,CACR5qC,GAAI,WACJgJ,MAAO,CAAAhJ,GAAA,QAAA,EACPsrC,SAAUA,CAAC,CAAEhsC,SAAAA,CAAAA,IAAeA,GAAYwB,GAAAA,EAAMxB,SAC9C8rC,KAAMA,CAAC,CAAE9rC,SAAAA,CAAAA,IAAe,IAAIA,CAAQ,YACpC+G,KAAM,OAAA,EAERopB,OAAQ,CACNzvB,GAAI,SACJgJ,MAAOA,CAAC,CAAEuiC,MAAAA,CAAAA,IAAaA,EAAQ,IAAIA,CAAK,IAAGpU,GAAA1f,EAAG,CAAAzX,GAAA,QAAA,CAAQ,EACtDorC,KAAMA,CAAC,CAAEG,MAAAA,CAAAA,IACPA,EACI,aAAaC,mBAAmBD,CAAK,CAAC,iBACtC,UACNllC,KAAM,SACNglC,gBAAiBA,CAAC,CAAEE,MAAAA,CAAAA,IAAcA,EAA2B,CAAA,EAAnB,CAAC,cAAc,CAAI,EAE/D,mBAAoB,CAClBvrC,GAAI,mBACJgJ,MAAOkiC,GACPE,KAAMA,CAAC,CAAEprC,GAAAA,CAAAA,IAAS,MAAMA,CAAE,GAC1BqG,KAAM,MAAA,EAERokC,UAAW,CACTzqC,GAAI,YACJgJ,MAAO,CAAAhJ,GAAA,QAAA,EACPorC,KAAM,KACN/kC,KAAM,UAAA,EAERqkC,WAAY,CACV1qC,GAAI,aACJgJ,MAAO,CAAAhJ,GAAA,QAAA,EACPorC,KAAM,KACN/kC,KAAM,OAAA,EAERskC,QAAS,CACP3qC,GAAI,UACJgJ,MAAOA,CAAC,CAAE2hC,QAAAA,CAAAA,IAAcA,EACxBW,SAAUA,CAAC,CAAEhsC,SAAAA,CAAAA,IAAeA,GAAYwB,GAAAA,EAAMxB,SAC9C8rC,KAAMA,CAAC,CAAET,QAAAA,EAASrrC,SAAAA,EAAUmiC,MAAAA,CAAAA,IAC1B,GAAGniC,EAAW,IAAIA,CAAQ,GAAK,EAAE,MAAMqrC,EAAQjlB,MAAM,KAAK,EAAE/S,KAAK,GAAG,CAAC,GACnE8uB,EAAQ,WAAa,EAAE,GAE3Bp7B,KAAM,SAAA,CAEV,EAEA,SAASolC,GAAkB,CAAE9kC,QAAAA,CAAQ,EAAG,CACtC,KAAM,CAAE8Q,EAAAA,CAAAA,EAAG5Y,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B,CAAEksC,UAAAA,CAAAA,EAAc9oC,EAChB,CAAC+oC,EAAUC,CAAW,EAAI5sC,EAAS,EAAK,EACxC,CAAC6sC,EAAkBC,CAAmB,EAAI9sC,EAAS,EAAK,EAExD,CAAC+sC,CAAmB,EAAIn6B,GAAAA,EAE9B,OACEpM,EAAA,MAAA,CAAKxF,GAAG,+BAA+BiG,MAAM,QAAQ6D,SAAS,KAAIpE,SAAA,CAC/D,CAAC,CAACiB,GACDhB,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,cAAcH,QAASa,EAAQjB,SACzDC,EAACS,EAAI,CAACC,KAAK,IAAIE,IAAG4wB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CACzB,EAEV2F,EAAA,SAAA,CAAAD,SACEF,EAAA,KAAA,CAAAE,SAAA,CACEC,EAACS,EAAI,CAACC,KAAK,UAAA,CAAY,EAAC,IAACV,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,EAAE,IAClD2F,EAAA,MAAA,CACE0B,MAAO,CACL2kC,SAAU,GACVC,QAAS,GACTC,cAAe,WAAA,EACfxmC,SAEFC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAkB,CAAA,CACf,CAAC,CAAA,CACJ,CAAA,CACE,EACRwF,EAAA,OAAA,CAAAE,UACEC,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAiE,CAAA,CAChE,EACH2F,EAAA,MAAA,CAAKM,MAAM,sBAAqBP,SAC7B,CACC,CACExF,MAAO,eACP+H,MAAKkvB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAiB,EACxBmsC,OAAQ/C,EAAAA,EAEV,CACElpC,MAAO,eACP+H,MAAKkvB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAc,EACrBmsC,OAAQ7C,EAAAA,EAEV,CACEppC,MAAO,eACP+H,MAAKkvB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAc,EACrBmsC,OAAQC,EAAAA,CACT,EACDjkC,IAAI,CAAC,CAAEjI,MAAAA,EAAO+H,MAAAA,EAAOkkC,OAAAA,CAAAA,IAAa,CAClC,MAAMnrB,EACJpe,EAAWW,SAASC,oBAAsBtD,GACzCA,IAAU,gBACT,CAAC0C,EAAWW,SAASC,kBACzB,OACEgC,EAAA,QAAA,CAAmBS,MAAO+a,EAAU,UAAY,GAAGtb,UACjDC,EAAA,QAAA,CACEE,KAAK,QACL8U,KAAK,sBACLza,MAAAA,EACA8gB,QAAAA,EACA/F,SAAWpe,GAAM,CACf2C,EAAO+D,SAASC,kBAAoB3G,EAAEmK,OAAO9G,KAC/C,CAAA,CACD,EAAE,IACHyF,EAAA,MAAA,CAAKwc,IAAKgqB,EAAQ5lC,IAAI,GAAG8J,MAAM,KAAKC,OAAO,IAAA,CAAM,EAAE,IACnD3K,EAAA,OAAA,CAAAD,SAAOuC,CAAAA,CAAY,CAAC,CAAA,EAXV/H,CAYL,CAEX,CAAC,CAAA,CACE,EACJwrC,EAAUtrC,OAAS,EAClBoF,EAAAC,EAAA,CAAAC,UACEC,EAAA,KAAA,CAAIM,MAAM,iBAAiBL,IAAKmmC,EAAoBrmC,SACjDgmC,EAAUnT,OAAO8T,OAAO,EAAElkC,IAAI,CAACmkC,EAAU9+B,IAAM,CAE9C,MAAM9J,EAAM0a,OAAOne,OAAOqsC,CAAQ,EAAE35B,KAAK,GAAG,EACtC,CAAE9M,KAAAA,CAAAA,EAASymC,EACjB,GAAI,CAACnB,GAAetlC,CAAI,EAAG,OAAO,KAClC,GAAI,CAAEQ,KAAAA,EAAM2C,MAAAA,EAAOsiC,SAAAA,EAAUD,gBAAAA,CAAAA,EAC3BF,GAAetlC,CAAI,EACjB,OAAOmD,GAAU,WACnBA,EAAQA,EAAMsjC,EAAU9+B,CAAC,EAEzBxE,EAAQyO,EAAEzO,CAAK,EAEb,OAAOsiC,GAAa,WACtBA,EAAWA,EAASgB,EAAU9+B,CAAC,EAE/B89B,EAAW7zB,EAAE6zB,CAAQ,EAEnB,OAAOjlC,GAAS,aAClBA,EAAOA,EAAKimC,EAAU9+B,CAAC,GAErB,OAAO69B,GAAoB,aAC7BA,EAAkBA,EAAgBiB,EAAU9+B,CAAC,GAE/C,MAAM++B,EAAmBlB,GAAiB/2B,SACxC1R,EAAWW,SAASC,iBACtB,EACA,OACEgC,EAAA,KAAA,CAAAE,SAAA,CACEC,EAACS,EAAI,CAACC,KAAAA,CAAAA,CAAa,EACnBb,EAAA,OAAA,CAAMS,MAAM,gBAAeP,SAAA,CACzBC,EAACskC,GAAS,CAAAvkC,SAAEsD,CAAAA,CAAiB,EAC5BsiC,GACC9lC,EAAAC,EAAA,CAAAC,SAAA,CACG,IACDC,EAAA,QAAA,CAAOM,MAAM,mBAAkBP,SAAE4lC,CAAAA,CAAgB,CAAC,CAAA,CAClD,EAEHiB,GACC5mC,EAAA,OAAA,CAAMM,MAAM,MAAKP,SACfC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAgD,CAAA,CAC5C,CACP,CAAA,CACG,EACNwF,EAAA,OAAA,CAAMS,MAAM,mBAAkBP,UAC5BC,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,cACN+B,SAAUwF,IAAM,EAChB1H,QAASA,IAAM,CACb,MAAM0mC,EAAe/5B,MAAMC,KAAKlT,EAAOksC,SAAS,EAChD,GAAIl+B,EAAI,EAAG,CACT,MAAMi/B,EAAOjtC,EAAOksC,UAAUl+B,EAAI,CAAC,EACnCg/B,EAAah/B,EAAI,CAAC,EAAI8+B,EACtBE,EAAah/B,CAAC,EAAIi/B,EAClBjtC,EAAOksC,UAAYc,CACrB,CACF,EAAE9mC,SAEFC,EAACS,EAAI,CAACC,KAAK,WAAWE,IAAG4wB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAS,CAAC,CAAG,CAAA,CAClC,EACR2F,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,cACN+B,SAAUwF,IAAMk+B,EAAUtrC,OAAS,EACnC0F,QAASA,IAAM,CACb,MAAM0mC,EAAe/5B,MAAMC,KAAKlT,EAAOksC,SAAS,EAChD,GAAIl+B,EAAIhO,EAAOksC,UAAUtrC,OAAS,EAAG,CACnC,MAAMqsC,EAAOjtC,EAAOksC,UAAUl+B,EAAI,CAAC,EACnCg/B,EAAah/B,EAAI,CAAC,EAAI8+B,EACtBE,EAAah/B,CAAC,EAAIi/B,EAClBjtC,EAAOksC,UAAYc,CACrB,CACF,EAAE9mC,SAEFC,EAACS,EAAI,CAACC,KAAK,aAAaE,IAAG4wB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAW,CAAC,CAAG,CAAA,CACtC,EACR2F,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,cACNH,QAASA,IAAM,CACb8lC,EAAY,CACVU,SAAAA,EACAI,cAAel/B,CAAAA,CAChB,CACH,EAAE9H,SAEFC,EAACS,EAAI,CAACC,KAAK,SAASE,IAAG4wB,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAM,CAAC,CAAG,CAAA,CAC7B,CAAC,CAAA,CAUL,CAAC,CAAA,EAtEA0D,CAuEL,CAER,CAAC,CAAA,CACC,EACHgoC,EAAUtrC,SAAW,GACpBwC,EAAWW,SAASC,oBAAsB,gBACxCgC,EAAA,MAAA,CAAKS,MAAM,yBAAwBP,SAAA,CACjCC,EAACS,EAAI,CAACC,KAAK,MAAA,CAAQ,EAAE,IACrBV,EAAA,QAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAEO,CAAA,CACF,CAAC,CAAA,CACL,CACN,CAAA,CACH,EAEFwF,EAAA,MAAA,CAAKS,MAAM,yBAAwBP,UACjCC,EAAA,IAAA,CAAAD,SACG9C,EAAWW,SAASC,oBAAsB,eAAc2zB,GAAA1f,EACrD,CAAAzX,GAAA,QAAA,CAA+C,EAACm3B,GAAA1f,EAChD,CAAAzX,GAAA,QAAA,CAAmD,CAAC,CACvD,EACH2F,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAsJ,WAAA,CAAAC,EAEE5D,EAAA,KAAA,EAAK,EAAC6D,EAEN7D,EAAA,IAAA,CACEiT,KAAK,IACL9S,QAAUjJ,GAAM,CACdA,EAAEmJ,eAAAA,EACFxG,EAAOksC,UAAY,CACjB,CACE7lC,KAAM,WAAA,EAER,CACEA,KAAM,eAAA,CACP,CAEL,CAAA,CAGC,CAAA,CAAC,CAEC,CAAA,CACN,CAAC,CAAA,CACD,EAEPF,EAAA,IAAA,CAAGM,MAAM,gBAAeP,SACrBgmC,EAAUtrC,QAAUiqC,KAClBznC,EAAWW,SAASC,oBAAsB,eAAc2zB,GAAA1f,EACrD,CAAAzX,GAAA,SAAAC,OAAA,CAAAoqC,gBAAAA,EAAAA,CAAuB,CAAS,EAAClT,GAAA1f,EACjC,CAAAzX,GAAA,SAAAC,OAAA,CAAAoqC,gBAAAA,EAAAA,CAAuB,CAAW,EAAC,CACxC,EACH7kC,EAAA,IAAA,CACE6B,MAAO,CACL0a,QAAS,OACT4qB,eAAgB,gBAChB1qB,WAAY,QAAA,EACZvc,UAEFC,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,QACNH,QAASA,IAAMgmC,EAAoB,EAAI,EAAEpmC,SAEzCC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA2B,CAAA,CACrB,EACRwF,EAAA,SAAA,CACEK,KAAK,SACLmC,SAAU0jC,EAAUtrC,QAAUiqC,GAC9BvkC,QAASA,IAAM8lC,EAAY,EAAI,EAAElmC,SAAA,CAEjCC,EAACS,EAAI,CAACC,KAAK,MAAA,CAAQ,EAAE,IACrBV,EAAA,OAAA,CAAAD,SACG9C,EAAWW,SAASC,oBAAsB,eAAc2zB,GAAA1f,EACrD,CAAAzX,GAAA,QAAA,CAAa,EAACm3B,GAAA1f,EACd,CAAAzX,GAAA,QAAA,CAAe,CAAC,CAChB,CAAC,CAAA,CACD,CAAC,CAAA,CACR,CAAC,CAAA,CACA,EACL2rC,GACChmC,EAACkE,GAAK,CACJ/D,QAAUjJ,GAAM,CACVA,EAAEmK,SAAWnK,EAAE0pB,eACjBqlB,EAAY,EAAK,CAErB,EAAElmC,SAEFC,EAACinC,GAAY,CACXN,SAAUX,EAASW,SACnBI,cAAef,EAASe,cACxBthB,SAAUA,CAAC,CAAEuM,OAAAA,EAAQkV,KAAAA,CAAAA,IAAW,CAC9BxuC,WACAmB,YAAamsC,EAAQ,aAAA,EAAAhU,EAErBn4B,EAAO,UAAA,KAAAm4B,CAAA,CACuB,EAEhC,QAAA,IAAAiU,EAAA,EAAA,CAAA,CAAA,CACgC,CAAA,EACjCC,GAAAlmC,EAAAkE,GAAA,CACI,QAERgiC,GAAAA,YAEmBhvC,EAAA,eACdivC,EAAmBvlB,EAAAA,CACQ,EAE7B,SAAA5gB,EAAAmnC,GAAA,CAAEpnC,UAAAA,EAGAgmC,QAAAA,IAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CACwC,CAAA,CAAE,CAC3C,CAAA,CAEJ,CAGP,MAAAqB,GAAA,CAEA,KACEltC,CAAM,GAAA,QAAA,EAA0G,OAChH4vB,CAAQ,GAAA,QAAA,EAAsF,QAC9Fkb,CAAS,GAAA,QAAA,CAAqD,EAChE,SAAAiC,GAAA,CAEA,SAAAxhB,EACEA,SAAAA,EACApjB,SAAAA,EACAskC,cAAAA,EACAI,QAAAA,CAAAA,EACA/lC,CACF,KAAG,CACD,EAAA8Q,CAAM,EAAEA,GAAAA,EAAG5Y,EAAA,CAAA,CAAAytC,EACXjuC,CAAAA,GAAgC,EAAAW,EAAAstC,GAAA,MAAA,IAAA,EAC1BzhB,CAAAA,EAAAA,CAAayhB,EAAAA,EAAAA,SAAAA,EACb,CAACU,EAAAA,CAAaC,EAAAA,MAEd,CAACxmB,EAASzD,CAAuB,EAAShkB,EAAA,CAAA,CAAA,EAChDhB,EAAO8rB,IAAO0B,EACd,SAAO0hB,CACPlvC,GAAAA,IAAgB,OACb,GAAA,CACCglB,WAAoB,EACpB,MAAIuN,EAAA,MAAAvG,GAAA,EACFhH,EAAAA,CAAW,EACXA,EAAM8G,UACN0B,MAAS1B,CACT9G,EAAW,OAAA,CACb,CACE3kB,GAAAA,GACA2kB,SAAAA,CACF,GAAAgqB,IAAA,UACF,GAAG,CAEF,MAAArD,EAAY,MAAAH,GAAA,EACX2D,EAAoBxD,CAAA,CACpB,MAAI,CAAA,CACF,GAAA,CACAwD,EAAAA,CAAAA,CAAAA,CAAAA,EAAwB,QACdpvC,EAAA,EACVM,OAAAA,EAAAA,KAAe,GACjBwsB,GAAAmiB,GAAAlC,GAAAkC,CAAA,EAAA,CACF,MAAGI,EAAAC,EAAA,QACDL,GAAYA,CAAA,EAAA,QAAA,CAAA,CAEVK,KAAAA,EACNrvC,KAAAA,CACE,IAAI6sB,CAEF,QAAawiB,EAAQpvC,cAAAA,UAAAA,CAAAA,IAAAA,EACrB6sC,GAAYkC,EAAWryB,CAAE5N,IAAW4N,IAAAA,WAAM9U,EAAAA,QAAAA,EAAAA,CAAAA,IAAAA,KACxCuhC,EAAMA,MAAQgG,EAAK1oC,CAAAA,EAGf0iC,CAAAA,CAAiD,CAEjDA,EAAAA,CAAAA,EAAAA,IAA2B5hC,EAC7B,MAAA,CAAA,GACF,yBAAA,MACD,QACH,SAAA,CAAA,CAAA,CAAAmB,GAAAhB,EAAA,SAAA,CACEklB,KAAAA,SAEJ,oBACO7qB,QAAG2G,EAAyBV,SAAMN,EAAAS,EAAA,MAAO,IAElCP,IAAKsxB,GAAA,EAA6BrxB,CAAiBJ,GACzDC,QAAK,CAAM,CAAO8R,CAAAA,CAAAA,CAAAA,EAAAA,EAAE,SAAA,CAAA,SAAA9R,EAAA,KAAA,CAAA,SAAOklB,EAAAsM,GAAA,EAAI,CAGnCxxB,GAAA,QAAA,CACE,EAAAD,GAAKmlB,EAAW,CAAA7qB,GAAA,QAAA,CAAe,CAACyX,CAAAA,CAAAA,CAAAA,EAAAA,EAAG,OAAA,CAAA,SAAA,KAAA,SAAcjS,EAAA,OAAA,CAAC,IAAA6nC,EAAK,SAAAxwC,GAAA,CAEzD8I,EAAAA,eAAA,EAAMmE,MAASgJ,EAAA,IAAA,SAAAjW,EAAA,MAAA,EACb2I,EAAA,CAAA,EACEI,EAAKynC,QAAAA,CAAAA,EAAAA,IAAAA,GACMxwC,CAAAA,EAAMqD,GAAA,KAAA,EAEb8F,IAAAA,aACF2xB,EAAM7kB,CAAO,EAAI4M,EAAAA,CAAW1Y,EAAAA,QAAM,eAAA,EAAA,EAAA,QAAA,OAAA,EAAA,EAClC2wB,KAAgBA,EAAAj0B,CAAA,EAAA,QAAA,YAAA,EAAA,EAEdi0B,CAAAA,EACAA,SAEEA,EAAAA,CAIAA,OAAAA,EACF,KAAA9M,EAAA,OAAA,KAAA,CACD,EACDxsB,EAAAA,OAAQga,QACR40B,EAAYpnC,IAAM,EAClBulB,IAAAA,EAAS,EACPuM,SACM9M,OAAW,CACnB,SAACrlB,EAAA,QAAA,CAECwB,SAAOsmC,CAAAA,EAAM,OAAA,CACfL,SAAAA,EAAmBtlC,EAAA,CACnBhB,GAAU,QAAA,CACZ,CAAA,CAAEjB,EAAAA,EAEFC,SAAA,CAAAD,YACEA,SAAAA,EACEA,YACEiC,CAAA3H,EAAAnD,EAAA,OAAA,KAAA,CAAA,EACI,aACNguB,EAAAyhB,EAAA,KAAA,OACEjmB,KAAAA,OACAre,IAAAA,OACAiT,SAAWpe,CAAAA,EAAAA,SAAM,EAAA,EAAAytC,GAAA,IAAAzkC,GAAAF,EAAA,SAAA,CACfsnC,MAAAA,EACF,SAAAx1B,EAAA8yB,GAAA1kC,CAAA,CAAA,CAAA,CACAnI,CAAAA,CAAAA,CAAyC0G,CAAAA,CACzCuW,CAAK,CAAA,CACD,CAAA,EAAAmwB,GAAMkC,CAEV,GAAA,MAAgB,CACf1C,CACC,KAAA1d,EAAe/mB,KAAAA,EAAwB,KAAAA,EACvC,YAAAmlC,EACK,QAAAC,EAEV,YAAAF,CAEA,IAAQpwB,IAAAA,OAAM9U,EAAAA,IAAAA,CAAMmlC,SAAAA,EAAAA,QAAAA,CAAaC,SAAAA,CAAAA,EAAAA,OAAAA,CAASF,SAAAA,EAAAA,EAAAA,CAAkB,GAAA,QAC3D,EACE,CAAA,IACE,SAAA,CAAArlC,KACEF,KAAAE,SACEC,CAAAA,EAAAD,SACEC,GAAAgC,IAAA,UAAA,aAAAkjB,EAAAyhB,EAAA,GAAA,OAAA,IAAkB,OACd,SACN,CAAA3mC,EAAA,SAAA,CACEgV,MAAK,EAAA,KACK,IAACowB,GAAAA,EAAAA,SAAAA,CACX/iC,MAAAA,KACAtK,SAAAA,EAAcmtB,KAAyBzmB,CACvCkiB,CAAAA,CAAAA,CAAI,CAAA,CAAM5gB,CAEV,CAAA,CAAc,CAAA,EAEQ1F,OAAUgJ,SAC9BxD,EAAA,QAAA,CAAA,SACK,CAAAG,EAAA,OAAA,CACJ,SAAA8R,EAAAmV,CAAA,CAAA,CACN,EAAA,IAAAjnB,EAAA,QAAA,CAEP,KAAAE,EAEA,OACEA,IAAA,YAAA,OAAAH,KAAAA,EACEA,YACEC,EAAAqlC,CAAA,EAAAtlC,SAAO+R,IAAM,QAAA,CAAAszB,EAAQ,SAAA/iC,EAEnBnC,KAAAA,IAAAA,UAAAA,6BAAAA,KACA8gC,kBACAhsB,eAAAA,MACAqwB,WAAAA,GACA3kB,QAAAA,EACAre,IAAAA,MAAAA,CAAAA,EACAnI,IACEmtC,WAAgBE,EACZ,OAAA,GAAAvnC,EACA,WAAA,CAEN4nC,GAAAA,6BACAC,SAAAA,EAAe,IAAAC,GAAA9nC,EAAA,SAAA,CACf+nC,MAAAA,EAAY,IAAA,CACZzC,CAAAA,CAAAA,CAAAA,CACA3kB,CAAI,CAAA,CAIF,CAAA,CAAa,EAAA,CAAA,CAAAymB,GAA4BrnC,CACtCwnC,GAAAA,EAAsBO,IAAAA,CACrB,MAAA,0BAAmB9yB,SACpB,CAAAhV,EAAAS,EAAA,CAAA,KAEJ,MAAA,CAAA,EACEqR,EAAAs1B,GAAAC,CAAA,CAAA,CAAA,CAAA,CAAA,EACNxnC,EAAA,SAAA,aAIKwnC,SAAW,CACpB/mC,KAAM,SAAyBP,MAAAA,QAC1BW,SAAK2B,GAAAye,IAAA,UAAQ,SAChBsmB,EAAWC,GAAY,EAG9BtnC,CAEIG,GAAK,QAAA,CACC,EACNmC,GAAUA,EAEDyP,CAAG,GAAA,QAAA,CAAA,CAAM,CAAA,KAACA,EAAAA,SAAAA,CAAAA,KAAAA,SAAAA,MAAG,eAAA,QAAA,IAAA,CAAKjY,EAAA,UAAA,OAAAktC,EAAA,CAAA,EAAC/lC,IAAA,CACtB,EAGJd,SAAKF,EAAAgC,EAAA,CACL1B,GAAAA,QAAM,EAEJzG,CAAAA,CAAAA,CACAmH,CAAAA,CAAAA,CAAU,CAAA,CACZ,CAAA,CAAA,CAEA,CAAA,CAAA,CAAoB,SAAAmmC,GAEvB,CAAA,UAAApB,EACM,QAAA/kC,CACL,EAAA,CACD,KACJ,CAET,EAAA8Q,CAEA,EAAA5Y,GAASiuC,EAAepB,CAAW/kC,MAAAA,CAAQ,EAAG7F,GAAA,EACtC6sC,EAAA7zB,GAAA,IAAErC,CAAAA,GAAG5Y,CAAAA,EAAA,OAAA,OAAA,EAAA,OAAA,GACL+uC,GAAAA,8BAAA,KAAA,UAAAlC,EAAA,OAAA,OAAA,CAAA,CAAA,EAAErsC,CAAAA,CAAAA,CAAAA,EAAUyB,CAAAA,EAAI+sC,CAAA,EAAA7uC,EAAA,EAAA,EAChB2uC,CAAAA,GAA6B,EAAA3uC,EAAA,SAAA,EAC7B8uC,EAAmBh0B,GAAA,IAAA,CACvB,GAAI,CAAC4xB,EACL,OAAAqC,aAGErC,KAEJ,GAAM,CACN,MAAMoC,EAAAA,KAAAA,MAAAA,GAAAA,kCAAwCE,CAAA,CAAA,EAC5C,GAAKA,CAAAA,MAAAA,QAAAA,CAAmB,EAAA,MAAA,IAAA,MAAA,cAAA,EACtBD,OAAAA,EAAiB,SAAS,EACnBE,CACT,MAAA,CACA,GAAI,CACF,MAAMA,EAAS/pC,KAAKC,MAClB+pC,CAAAA,EAGF,UAAW7T,QAAQ4T,CAAS,EAAA,MAAM,UAAU,cAAc,EAC1DF,OAAAA,EAAiB,SAAS,EACnBE,OACK,CAGZ,OAAAF,EAAI,OAAA,EACIE,IACN,CACAF,CACA,EAAA,CAAAC,CAAOC,CAAAA,IACKzuC,EAAA,UAAA,OAAA,EACZuuC,EAAwBhwC,EAAA,EACxB,OAAAyH,EAAO,MAAA,CAAA,GACT,0BACF,MAAA,QACF,SAAIwoC,CAAAA,CAAAA,CAAAA,GAAkBroC,EAAA,SAAA,CACtB,KAAMwoC,SAEN,oBAEA,QACExnC,EAAK3G,SAAG2F,EAAAS,EAAA,CAA0BH,KAAM,WACnCU,EACqBV,CAAoBH,GAASa,QAAAA,CAC5C,CAAM,CAAA,CAAO8Q,CAAAA,EAAAA,EAAAA,SAAAA,CAAAA,SAAE9R,EAAA,KAAA,CAAA,SAAAA,EAAAgC,EAAA,CAAO,GAAA,SAAC,WAAA,CAAG,EAAAhC,EAAA,QAAA,CAGnC,MAAA,kBAAA,CAAAD,CACE,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,EAAAF,EAAA+D,OACgB,CAAA,SAAOtD,KAAM,SAAmC,CAAAT,EAAA,UAAA,CAAA,SAAC,CAAAA,EAAA,KAAA,CAC1D,SAAA,CAAAG,EAAAS,EAAA,CACL,KAAA,oBAENZ,KAAA,IAAMsE,MAAS,eAAA,CAAIpE,EAAAA,IACjBF,EAAA,OAAA,CAAAE,SACEF,EAAAmC,EAAA,CAAAjC,GAAAA,QACO,CAACW,CAAK,CAAA,CAAoBC,CAAK,CAAA,EAAIL,EAAAA,IAAM,CAAe,MAAI,eACjE,SAAAP,CAAAA,UACE,CAAA,IAAA1F,EAAA,KAAoB,OACf,KAAA,SAETwF,YAAA2xB,GAAA,EAAuBzxB,CAEnBE,GAAKwoC,QAAAA,CACA,EAELpD,cAAWvzB,QAAAA,GAAAA,CAAEo2B,EAAAhxC,EAAA,OAAA,KAAA,CAAA,EAAA,IAAsB,MAAA,CAAA,EAAC2C,EAAA,SAAA,mCAAAgG,EAAA,SAAA,CACpCS,KAAAA,SACAuZ,qBACEquB,SAAAA,wBACF,QAAA,SAAA,CACAvnB,EAAI,mBAAA,EAEL9mB,MAAAA,EAAgBmiB,GAAAA,EAEb9b,GAAKsxB,GAAA,MAGI,QACP4W,CACA,CAAA,EACA/rC,GAAAA,CACqD,MAAA0nB,GAD5CjS,MAAAA,EAAAA,GAAAA,SAAAA,cAAAA,MAAAA,CACP,GAAA,CAAAF,CAAA,CAAA,CAAA,GAAmD,CAAA,EACrD,GAAAmS,EAAA,CACI,KAAA,CACF,KAAAtC,IAC8C,EACtCsC,EACL,GAAA,+DAAA,KAAAtC,CAAA,EAAA,CACH,MAAMsC,EAAeL,sEAAe,EAAA,CAAA,EAChCK,CACF,EAAA7V,EAAQuT,GAAAA,EAAcsC,KAAAA,CACtB,EACE,KAAA,MAAAnmB,CAAA,EAIA6qC,EAAsBC,QACpB,MAAAv7B,EAEFs7B,EAAM,QAAA,cAAA,IAAA,MAAA,OAAA,CAAA,CAAA,CAAEv6B,CAAGy6B,EAAIx7B,SAAAA,CAAAA,MAAS5O,CACxBkqC,EAAAA,OAAAA,EACAA,GAAAA,GAAAA,EAIJ,CACAL,GAAAA,QAA0B,CAE1B1vC,CAAAA,CACA0vC,CACA/rC,EAASyV,MAAAA,GAAAA,EAAC,CAAA,GAA8B,QAAA,CAAC,EAE7C,SAAA,CAAA9R,EAAAS,EAAA,MACK+wB,OAAA1f,CAAAA,EAAAA,EAAAA,EAAAA,CAAE,KAAA,YAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyC,CAAA,EAAC,CAAA,CAAAq2B,GAAA,MAAA,QAAAA,CAAA,GAAAtoC,EAAAC,EAAA,CAAA,SAACC,CAAAA,EAElDC,IAACS,CAAI,SAAM,CAAAT,EAAA,IAAA,CAAS,SACnBS,EAAI,MAAA,CAAA,EAACC,YAAKynC,EAAA,OAAA,EAAA,IAAA,GAAA,IAAAtoC,EAAA,QAAA,CAAe,MAAA,gBAE7B,SAAA,CAAA,IAAAwoC,EAAA,OAAA,cAAA,CAAA,CAED,CAACF,CAEC,CAAApoC,EAAAA,EAAAA,KACEF,CAAAE,MAAAA,uBACE,WAAIooC,IAAwB1tC,GAAAA,EAAAA,KAAAA,CAAU,SAAC,CAAAuF,EACtCmoC,OAAAA,CACM7nC,MAAM,CAAeP,QAACgmC,EACzBsC,KAAAA,GAGN,OAAA,KAAAO,CAAA,EAAA,MAAA7qC,GAAA6qC,EAAA7qC,CAAA,IAAA4oC,EAAA5oC,CAAA,CAAA,CAAU,EAAA,EAAA,CAAA,EAENgC,SACEC,GAAA,CAAA,EACE0B,EAAO,OAAA,CAAA,SACL4kC,CAASP,KAAU8C,EAAMD,IAAAA,CAAAA,EAAAA,EAAAA,OAAAA,QAAAA,MAAAA,IAAAA,GAAAA,EAAAA,IAAAA,GAAAA,MAAAA,CAAAA,CAAAA,KAAAA,EAAAA,KAAAA,EAIvB,KAAA1oC,CAGE,IACNymC,EAAA3xB,CAAA,EAAAnV,EAAAC,EAAA,CAAEC,SACH,CAAAF,EAAA,OAAA,CAGDA,MAAA,8CACe8mC,IAAAA,IACZA,WAASzmC,EAAS8U,CAAA,SAAiB,IACnCmwB,IAAAA,GAAqBjlC,CAAI,CACvB,CAAE+mB,EAAAA,GAAAA,CAAAA,CAAAA,EAAMjS,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAM9U,CAAAA,CAAAA,CAEX,CAAA,EAAAL,EAAAE,IAAAA,CACE,SAAMO,CAAAA,EAAM,QAAA,CAAA,SAA6BP,EAAAA,EACjC,CAKY,WACT,CAAA,CAGlB,CAAA,EACIC,EAAA,KAAA,CAAA,CAAA,EAAAH,EAAA,QAAA,CAEV,SAAA,CAAA,KAAA,IAAAG,EAAAgC,EAAA,CAEHnC,GAAA,QAAA,CAAAE,CAAAA,CACE,CAAA,CAAAA,CACE,CAAA,CAAA,CAAA,CAAA,EAAA+oC,IAA2C,SAAA9oC,EAAA,IAAA,CAAA,MAE7CA,QACA,SAAAD,EAAO,QACF,CACH,SAAA,CAAA,MAAAC,EAAAgC,EAAA,CAAA,GAEQ,QAAA,CACH,CAAC,CAAA,CACP,CAAC,CACJ,EAEL8mC,EAAAA,IAAAA,CACIxoC,SAAM,CAAAkoC,GAAA3oC,EAAAC,EAAA,CAAOC,YACdoT,GAAA,CAAApT,aAAOyxB,GACFxxB,EAAsC,CACpC,GAAA,QAAA,CAGX,EAEID,WACEC,EAACmT,MAAAA,gBACarB,SAAAA,EAAAA,EAAAA,CAAE,GAAA,QAAA,CAAA,CAAA,CAAA,EAA+B,QAAA,IAAA,CAC7Ci3B,MAAAA,EACEZ,EAAA,OAAAxB,GAAA,CAAA9sC,EAAA,UAAA,KAAA+uC,GAAmB7oC,OAAAA,MACjBiC,EAAAA,MAAAjE,GAAA6qC,EAAA7qC,CAAA,IAAA4oC,EAAA5oC,CAAA,CAAA,CAAA,CAAA1D,EAAA,GAGO,CAAA2uC,EAAA,OAAA,CACJ3sC,GAAAm1B,GAAA,EAQL,CAE4BoX,GAAAA,QAAAA,CAItB,CAEN,EACA,MACEvsC,CAASyV,IAAAA,EAAAA,CAAAA,GAAAA,EAAAA,UAAAA,GAAAA,CAAAA,EAAAA,MAACm3B,EAAAC,EAAA,OAAAxE,GAAAuE,IAAAC,EAA4BA,EAAA,MAAA,EAAAxE,EAAA,GACtC7qC,EAAA,UAAAqvC,EACF7sC,GAAA4sC,EAAAzX,GAAA,EAKA,CACIyX,GAAAA,SAEFC,OAAAA,CACF,gBAAAxE,EACA7qC,CACAwC,CACeyV,EAAAA,GAAAA,EACT,CAAAxX,GAAAA,QAAA,CAAAoqC,CAAAA,EAAoD1jC,IAAgC,CAAA,EAAC8Q,SAAAA,EAAAA,SAAAA,CAAAA,KACrF,SAAA,MAAAzX,SAAA,SAAoB,CAAA8tC,EAAC,SAC3BnoC,EAAAgC,EAAA,CACAhB,GAAAA,QAAU,CACZ,CAAA,CAAEjB,CAEF,CAAA,EACEG,GAAAA,CAAK,CAAA,EAAAF,EACLM,GAAM,CAAA,aACIkoC,EAACL,GAAAA,EAEX,CAAA,GAA8B,QAAA,CACxB,EACK3W,GAAG,EAIpBne,CACoBvB,GAAAA,QAAAA,CACd,EAAA,kBAA6B02B,EAAA,SAAA,OAAC,QAAAhX,IAAA1f,CAAAA,EAAAA,UAAAA,EAC9BzV,GAAAm1B,GAAA,EAAmB,CAAC,GAAA,QAAA,CAEyB/yB,GAEjD5E,IAAOksC,CACP1pC,EAASyV,SAAAA,EAAAA,SAAAA,CAAAA,KAAC,SAAA,MAAAzX,SAAA,SAAoB,CAAA8tC,EAAC,SAAAK,EAAAhX,GAAA,EAEjC,CAAEzxB,GAEFC,QAAA,CACO,EACLM,GAAM,EAC6BP,CAEhB+R,GAAAA,QAAAA,CAAG,CAAA,CAAA,CAAc,CAAA,CAAA,CAACA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,EAAG,UAAA,CAAA,SAAAzX,CAAAA,EAAA,KAAA,CAAA,SAAS,CAAA2F,EAAAS,EAAA,CAAA,KAAC,kBAAA,KAC5C,IACI,MAAA,eAAA,CACZ,EAAA,IAAAT,EAAA,OAAA,CAENH,SAAAG,EAAAgC,EAAA,CAAAjC,WACE,CAAAA,CACO,CAAA,CAACW,CAAK,CAAA,EAAkBC,EAAAA,IAAK,CAAA,SAAUX,EAAA,QAAA,CAAiB,MAC7DA,CAAAD,MAAAA,MACE,EAAA,KAAoB,OACf,MAAAioC,EAEThoC,SAAA,GAAAD,WACE,CACE2B,GAAOxK,EAAA,OAAA,MAAEwT,CAAAA,EAAAA,OAAO,OAAA,EAAO,GAAA,CACvBxK,UAAK,UAAA,UAAAhJ,EAAA,OAAA,KAAA,EACLqD,GAAOytC,GAAAA,GAGA9wC,GAAEmK,QACPnK,CAEA,CAAA,CACEkf,MAAU2nB,CACV1hC,GAASm1B,GAAA1f,EAAC,CAAAzX,GAAA,QAAA,CAAkB,CAAC,CAC/B,EACE3B,EACA2D,IAAAA,MAASyV,CAAAA,CAAAA,CAAAA,EAAAA,EAAC,IAAA,CAAA,SAAAzX,CAAAA,EAAA,SAAA,CAAA,KAA0B,SAAA,MAAC,SAAA,SACvC,CAAA2tC,EACF,QAAA,IAAA,CACArnB,GAAI,CACL,UAAA,UAAA,UAAAqnB,CAAA,EAEHnoC,GAAA2xB,GAAA,EAES,CACC,GAAA,QAAA,CACKwW,EAET,MAAI,CACF5xB,GAAU2nB,GAAAA,EACDjsB,CAAC,GAAA,QAAA,CAAA,CAAA,CAA0B,CAAC,EAErCpZ,SAAAA,CAAAA,IAAe,CACf2D,KAAAA,WAASyV,CAAAA,EAAAA,IAAAA,EAAAA,OAAAA,CAAAA,SAAC9R,EAAAgC,EAAA,CAAA,GAAA3H,QAAA,CAAA,CAAkC,CAAA,CAAA,CAAC,CAAA,EAC/C,IAAA,WAAA,OAAA,WAAA,WAAA,CACF,KAAA2tC,CAAA,CAAA,GAAEjoC,EAAA,SAEDU,CAAI,KAACC,SAAgB,MAAI,SAC1B,SAAAX,CAAAA,EACE,QAAA,IAAA,CAAA,GAAkB,CACb,UAAA,MAAA,CACC,KACTqW,CACuB,CACpB6Q,CACD,MACC,CACE/mB,MAAKsxB,GAAA,MAGIrxB,QACP,CACEiW,CAAAA,CAAgB,CACR4xB,EACP,UACM9wC,EAAGuJ,EAAA,CACV/H,KAAAA,OACA0iB,CAAAA,EAAAA,IAAAA,EAAKoW,OAAA1f,CAAAA,SAAAA,EAAAA,EAAAA,CAAAA,GAAC,QAAA,CAAA,CAAA,CAAA,CAAA,CAA+B,CAAA,EAAA,IAACjY,EAAA,SAAA,mCAAAgG,EAAA,SAAA,CAAA,KACxC,SACF,MAAA,SAAEE,SAAA+oC,IAEG,kBAAA,QAAM,SAAA,CAASV,EACpB,iBAAA,EAAAroC,MAAAA,EACEP,GAAA,EAAA,GAAAnF,CAMJ6F,MAAK6jB,GANkB,MAAArqB,EAAA,GAAA,SAAA,cAAA,MAAA,CACd,GAAA,CAAAkY,CAAA,CAAA,CAER,GAGI,CAAA,EACLtR,GAAMyjB,EAAA,MACI+kB,QACD,EACPV,EAAAA,EACA,SACI,MAAAe,EAAA,KAAA,UAAA,CACF,MAGG,GAAA,KAAA,IAAA,EAECplB,KAAAA,CACI,CAAA,EAAgBA,+DAAAA,KAAAA,CAAAA,EAEtBqlB,EAAIA,EAAU,QAAA,+DAAA,8BAAAD,CAAA,8BAAA,EAEZj7B,EAAG,GAAAuT,CAAA;AAAA;AAAA;AAAA,6BACU0nB,CAAA,+BACPnB,GAAAA,GAAAA,EAER,CAKEoB,GAAAA,QAGA,CAEAA,CAAAA,EAAiB,MAAA1vC,EAAA,GAAA,SAAA,QAAAkY,CAAA,EAAA,KAAA,OAAA,CAAA,QAAAw3B,CAAA,CAAA,EACnBhB,EAAA,SAAA,EACA/rC,GAASm1B,GAAA1f,EAAC,CAAAzX,GAAA,QAAA,CAAsC,CAAC,CACjD,CAEe,MACXwsB,CAASuiB,EACV,OAAA,EACHhB,GAAAA,GAAAA,EACSt2B,CAAC,GAAA,QAAA,CAAA,CAAA,CAAiB,CAAC,EAC9B,SACO5a,EAEPkxC,CACA/rC,GAAAA,QAASyV,CAAAA,EAAC,SAAAzX,CAAAA,EAAAoG,EAAA,CAAA,KAA0B,OAAA,CAAA,EAACT,EAAAS,EAAA,CACvC,KAAA,UAAA,CACF,CAAA,CAAA,CAAA,MACK+wB,EAAA1f,OAAAA,GAAAA,EAAAA,QAAAA,CAAAA,MAAAA,mBAAAA,SAAE9R,EAAAgC,EAAA,CAAA,GAAA3H,SAAyB,OAAA,CAAC,EAAA2tC,EAAA,MAAA,CAE5B,CAAA,CAAM,CAAA,CAAO,CACb,CAAA,EAAA,CAAA,CAACtnC,GAAKb,EAAA,UAAA,CAAA,SAAa,CAAAG,EAAA,UAAA,CAClB,MAETgoC,gBACQ1nC,SAAMN,EAAA,QAAA,CAAkBD,WAC7BiC,EAAA,CAAA3H,GAAA,QAAA,CAAAC,CAAA,CAAA,CACsBG,CAAAA,EAAMuF,EAAA,WAAA,CAAA,MAG3B,CAEJ,MAAA,MAAA,EAGDD,KAAAA,GACWO,SAAM,GAAeP,SAC5BC,KAAA,UAAA+lC,EAAA,OAAA,OAAA,EAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,EAAAlsC,EAAgC,SAAA,mCAAAmG,EAAA,SAAA,CAAA,SAC3BH,EAAA,IAAA,CAAC,SAEV,CAAAG,EAAAS,EAAA,CAAUiB,KAAAA,OAAO,CAAA,EAAEgJ,IAAAA,EAAO1I,EAAA,CAAO,GAAA,QAAA,CAAA,CAAG++B,CAAM,CAAA,CAAY,CAAA,CAAA,CACF,CAAA,CAAA,CACzC,CAAA,CAEd,CCpnCXxlC,GAAU1B,EAASwvC,GAAY,CAC7B,SAAW,CAAChlC,EAAQohC,EAAMlrC,EAAO+uC,CAAS,IAAKD,EAEzC,SAASrlC,KAAKyhC,CAAI,GAAK,CAAClrC,GAC1BmkB,GAAAA,CAGN,CAAC,EAED,SAAwB6qB,IAAS,CAC/B,KAAM,CAAEtwC,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B2vC,EAAWC,GAAAA,EACXp6B,EAAWoQ,GAAAA,EAEjBpnB,OAAAA,EAAU,IAAM,CACdmB,WAAWkwC,GAAS,GAAI,CAC1B,EAAG,CAAA,CAAE,EAGH7pC,EAAAC,EAAA,CAAAC,SAAA,CACG,CAAC,CAAC9C,EAAW2B,aACZoB,EAACkE,GAAK,CACJ5D,MAAO,SAASrD,EAAWgB,cAAcC,UAAY,MAAQ,EAAE,GAC/DA,UAAW,CAAC,CAACjB,EAAWgB,cAAcC,UAAU6B,SAEhDC,EAAC2pC,GAAe,CACd/pC,cACE,OAAO3C,EAAW2B,aAAgB,UAC9B3B,EAAW2B,YAAYgB,cACvBzJ,OAAOyzC,aAAahqC,eAAiB,KAE3CiqC,UACEhwC,EAAO+E,aAAairC,WACpB1zC,OAAOyzC,aAAaC,WACpB,MAEFC,WACEjwC,EAAO+E,aAAakrC,YACpB3zC,OAAOyzC,aAAaE,YACpB,KAEFhf,YACEjxB,EAAO+E,aAAaksB,aACpB30B,OAAOyzC,aAAa9e,aACpB,KAEFqI,YACEt5B,EAAO+E,aAAau0B,aACpBh9B,OAAOyzC,aAAazW,aACpB,KAEFnyB,QAAU4oB,GAAY,CACpB,KAAM,CAAEmgB,UAAAA,EAAWpwC,SAAAA,EAAUuG,KAAAA,EAAM8pC,YAAAA,CAAAA,EAAgBpgB,GAAW,CAAA,EAC9D/vB,EAAO+E,YAAc,GACrBzI,OAAOyzC,YAAc,KACjBG,IACFlwC,EAAOowC,mBACHD,GAAanwC,EAAOqwC,uBACxB7tC,GAAU,CACR4qB,KAAM,CACJtnB,KAAiBxD,EAAX6tC,EACF,CAAA3vC,GAAA,QAAA,EACA,CAAAA,GAAA,QAAA,CADgB,EAEpB8vC,MAAkBhuC,EAAX6tC,EACH,CAAA3vC,GAAA,QAAA,EACA,CAAAA,GAAA,QAAA,CADiB,EAErB+vC,KAAIjuC,EAAE,CAAA9B,GAAA,QAAA,CAA6B,CAAC,EACpC6F,GAAQ,MAAM,EAChB8G,MAAO,IACPikB,SAAU,IACV9qB,QAAUkqC,GAAU,CAClBA,EAAMzN,UAAAA,EACN/iC,EAAOywC,aAAej7B,EAEpBm6B,EADEQ,EACO,MAGPrwC,EACI,IAAIA,CAAQ,MAAMowC,EAAU1vC,EAAE,GAC9B,MAAM0vC,EAAU1vC,EAAE,EALV,CAQlB,CAAA,CACD,EAEL,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAAC4C,EAAWstC,cACZvqC,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAO0wC,aAAe,EACxB,EAAExqC,SAEFC,EAAC6Y,GAAQ,CACP7X,QAASA,IAAM,CACbnH,EAAO0wC,aAAe,EACxB,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAACttC,EAAWutC,cACZxqC,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAO2wC,aAAe,EACxB,EAAEzqC,SAEFC,EAAC0R,GAAQ,CACP1Q,QAASA,IAAM,CACbnH,EAAO2wC,aAAe,EACxB,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAACvtC,EAAW2f,aACZ5c,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAO+iB,YAAc,EACvB,EAAE7c,SAEFC,EAAC4xB,GAAY,CACXzf,QAASlV,EAAW2f,aAAazK,SAAWlV,EAAW2f,YACvDjjB,SAAUsD,EAAW2f,aAAajjB,SAClCqH,QAASA,CAAC,CAAEypC,YAAAA,CAAAA,EAAgB,KAAO,CACjC5wC,EAAO+iB,YAAc,EAKvB,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAAC3f,EAAWytC,cACZ1qC,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAO6wC,aAAe,EACxB,EAAE3qC,SAEFC,EAAC09B,GAAa,CACZnrB,IAAKtV,EAAWytC,aAAan4B,IAC7BorB,SAAU1gC,EAAWytC,aAAa/M,SAClC38B,QAASA,IAAM,CACbnH,EAAO6wC,aAAe,EACxB,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAACztC,EAAWif,YACZlc,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAOqiB,WAAa,EACtB,EAAEnc,SAEFC,EAACqyB,GAAM,CAACrxB,QAASA,IAAOnH,EAAOqiB,WAAa,EAAA,CAAS,CAAA,CAChD,EAER,CAAC,CAACjf,EAAWmzB,gBACZpwB,EAACkE,GAAK,CACJ/D,QAAUjJ,GAAM,EAEZA,EAAEmK,SAAWnK,EAAE0pB,eACf1pB,EAAEmK,OAAO8Y,UAAUgjB,SAAS,OAAO,KAEnCtjC,EAAOu2B,eAAiB,GAE5B,EAAErwB,SAEFC,EAACw6B,GAAU,CACTjY,iBAAkBtlB,EAAWmzB,eAAe7N,iBAC5C5oB,SAAUsD,EAAWmzB,eAAez2B,SACpC2mB,MAAOrjB,EAAWmzB,eAAe5N,WACjCiY,SAAUx9B,EAAWmzB,eAAeqK,SACpCz5B,QAASA,IAAM,CACbnH,EAAOu2B,eAAiB,EAC1B,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAACnzB,EAAW0tC,uBACZ3qC,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAO8wC,sBAAwB,EACjC,EAAE5qC,SAEFC,EAAC8lC,GAAiB,CAChB9kC,QAASA,IAAOnH,EAAO8wC,sBAAwB,EAAA,CAChD,CAAA,CACI,EAER,CAAC,CAAC1tC,EAAW2zB,qBACZ5wB,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAO+2B,oBAAsB,EAC/B,EAAE7wB,SAEFC,EAAC+zB,GAAe,CACdp6B,SAAUsD,EAAW2zB,oBAAoBj3B,SACzCo3B,yBACE9zB,EAAW2zB,oBAAoBG,yBAEjCiD,OAAQ/2B,EAAW2zB,oBAAoBoD,OACvChzB,QAASA,IAAOnH,EAAO+2B,oBAAsB,GAC7CI,UAAW/zB,EAAW2zB,oBAAoBI,SAAAA,CAC3C,CAAA,CACI,EAER,CAAC,CAAC/zB,EAAWqgC,cACZt9B,EAACkE,GAAK,CACJlD,QAAU9J,GAAM,CACd2C,EAAOyjC,aAAe,EACxB,EAAEv9B,SAEFC,EAACm1B,GAAa,CACZv0B,IAAK3D,EAAWqgC,aAAa18B,KAAO3D,EAAWqgC,aAC/CjpB,KAAMpX,EAAWqgC,cAAcjpB,KAC/BrT,QAASA,IAAM,CACbnH,EAAOyjC,aAAe,EACxB,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAACrgC,EAAW2tC,gBACZ5qC,EAACkE,GAAK,CACJ5D,MAAM,QACNU,QAASA,IAAM,CACbnH,EAAO+wC,eAAiB,EAC1B,EAAE7qC,SAEFC,EAAC8zB,GAAU,CACT5Z,KAAMjd,EAAW2tC,eAAe1wB,KAChC3H,IAAKtV,EAAW2tC,eAAer4B,IAC/B7H,MAAOzN,EAAW2tC,eAAelgC,MACjCC,OAAQ1N,EAAW2tC,eAAejgC,OAClC3J,QAASA,IAAM,CACbnH,EAAO+wC,eAAiB,EAC1B,CAAA,CACD,CAAA,CACI,EAER,CAAC,CAAC3tC,EAAWquB,iBACZtrB,EAACkE,GAAK,CACJlD,QAASA,IAAM,CACbnH,EAAOyxB,gBAAkB,EAC3B,EAAEvrB,SAEFC,EAACw/B,GAAW,CACVrtB,QAASlV,EAAWquB,gBAAgBnZ,QACpCxS,KAAM1C,EAAWquB,gBAAgB3rB,KACjCqB,QAASA,IAAM,CACbnH,EAAOyxB,gBAAkB,EAC3B,CAAA,CACD,CAAA,CACI,CACR,CAAA,CACD,CAEN,CCtRA,MAAAuf,GAAe9xC,GAAK,UAA6B,CAC/C,MAAMywC,EAAWC,GAAAA,EAEXqB,EAAgB,CACpBjsC,OAAQ,GACRC,gBAAkB5H,GACC,CAAC,CAACd,SAAS2I,cAAc,sBAAsB,GAC7C7H,EAAE8H,SAAW9H,EAAE+H,SAAW/H,EAAEgI,MACjD,EAGF9C,OAAAA,GAAW,MAAO,IAAMotC,EAAS,GAAG,EAAGsB,CAAa,EACpD1uC,GAAW,MAAO,IAAMotC,EAAS,gBAAgB,EAAGsB,CAAa,EAE1D,IACT,CAAC,ECXD,SAASC,GAAqB,CAAEnoB,UAAAA,EAAWtN,SAAAA,CAAS,EAAG,CACrD,KAAM,CAAErc,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAAC2lB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAAC2xC,EAAcC,CAAe,EAAI5xC,EAAS,IAAI,EAC/C,CAAC0qB,EAAcqE,CAAe,EAAI/uB,EAAS,IAAI,EAE/C6xC,EAAkBnnB,IAAiB,KAEzC,OACElkB,EAAA,IAAA,CAAGS,MAAM,yBAAwBP,UAC/BC,EAAA,SAAA,CACEE,KAAK,SACLmC,SAAUye,IAAY,WAAaoqB,EACnC/qC,QAASA,IAAM,CACbkd,EAAW,SAAS,EACpB4tB,EAAgB,QAAQ,GACvB,SAAY,CACX,GAAI,CACF,MAAMnwB,EAAM,MAAMphB,EAAMM,GAAGmxC,eACxBxuC,QAAQimB,CAAS,EACjBwoB,UAAAA,EACH,GAAI,CAACtwB,GAAK6N,WACR,MAAM,IAAI0iB,MAAM,6BAA6B,EAE/CjjB,EAAgBtN,CAAG,EACnBxF,EAAAA,CACF,MAAY,CAAA,CACV5c,WAAe,CAAA,GAAA,CAEjB2kB,EAAoB,SACnBrd,EAAAgC,EAAA,CACL,GAAA,QAAA,CAAEjC,CAEF,CAAA,EAAA1F,IAAA2F,EAAA,SAAA,CAAA,KAAoB,SACd,SACRA,IAAA,WAAAkrC,EACEhrC,MAAK,eACLmC,QAAAA,KACA/B,EAAM,SAAA,IACS,QAAA,GACb+c,SAAW,CACX4tB,GAAAA,CACC,MAAAnwB,EAAY,MAAAphB,EAAA,GAAA,eAAA,QAAAkpB,CAAA,EAAA,OAAA,EACX,GAAI9H,GAAA,WACF,MAAMA,IAAM,MAAMphB,6BACfiD,EAGDyrB,GAAgB,EAClB9S,EAAA,CACA8S,MAAAA,CACA9S,EAAS,SAAA,CACX,CACE5c,GAAAA,CACA2kB,EAAoB,SACtBrd,EAAAgC,EAAA,CACF,GAAG,QAAA,CACL,CAAA,CAAA,EAAEjC,EAAAA,OAEFiC,CAAA,MAAA,wBAAA,SAAoBkpC,GAAAF,EAAAA,IAAA,SAAAhrC,EAAAS,EAAA,CAEtBT,KAAA,eAAMM,IAAMnE,EAIJuE,CACAE,GAAGzE,QAAAA,CAAAA,EAAE,MAAA9B,iBAAA,CAAA,EAAU2F,EAAAS,EAAA,CAAC,KAAA,WAChBH,IAAAA,EAGII,CAAgBE,GAAGzE,QAAAA,CAAAA,EAAE,MAAA9B,iBAAA,CAAA,EAAU2F,EAAA4jB,GAAA,CAAC,OAAA9C,IAAA,SAAA,CAAA,CAAQ,CAAA,CAAiB,CAG1D,CAAA,CAAqB,CC9DtC,MAAMwqB,GAAqB,CACzB1tB,QAAS,UACTpP,OAAQ,eACRsP,OAAQ,SACRC,OAAQ,SACRwtB,eAAgB,aAChB1tB,UAAW,QACXvW,KAAM,OACN2O,OAAQ,SACR,eAAgB,eAChB,eAAgB,kBAChBu1B,sBAAuB,cACvBC,mBAAoB,QACpBC,eAAgB,SAChB,yBAA0B,SAC1BC,cAAe,YACf1Y,MAAO,QACP2Y,cAAe,QACjB,EAqBA,SAASC,GAAU,CAAE15B,QAAAA,EAAS25B,MAAAA,EAAOC,UAAAA,CAAU,EAAG,CAChD,IAAIx5B,EACAy5B,EACA,OAAOD,GAAc,SACvBx5B,EAAMw5B,GAENx5B,EAAMw5B,GAAWx5B,IACjBy5B,EAAYD,GAAWC,WAEzB,MAAMC,EAAc15B,EAClBvS,EAACksC,GAAW,CAAC35B,IAAAA,EAAUy5B,UAAAA,EAAsBprC,IAAKkrC,CAAAA,CAAQ,EAE1DA,EAEF,OACE9rC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,EACU85B,YAAAA,CAAAA,CAAwC,CAC3C,CAEX,CAEA,MAAME,GAAc,CAClB39B,OAAQA,CAAC,CAAE2D,QAAAA,CAAAA,IAAcnS,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,CAAAA,CAAe,CAA0B,EAClE2L,OAAQA,CAAC,CACPsuB,MAAAA,EACAj6B,QAAAA,EACAk6B,WAAAA,EACAC,SAAAA,EACA3oC,WAAY,CAAE4oC,QAAAA,CAAAA,CAAQ,IAEtBvsC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsJ,EAyBiCutB,GAAcib,CAAK,EAACvoC,EAQpBstB,GAAcib,CAAK,EAACA,MAAAA,EAhCvCC,WAAAA,EAayBC,SAAAA,EAOlBn6B,QAAAA,CAAAA,EAPHxO,WAAA,CAAAC,EAUR5D,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAACvoC,EADR7D,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,EAAC9nC,EAOnDtE,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAAC7a,EADRvxB,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,CAAA,CAAC,CAO5D,EAEHruB,OAAQA,CAAC,CAAE5L,QAAAA,EAASi6B,MAAAA,EAAOzoC,WAAY,CAAE4oC,QAAAA,CAAAA,CAAQ,IAC/CvsC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsJ,EAM6ButB,GAAcib,CAAK,EAACA,MAAAA,EALnCj6B,QAAAA,CAAAA,EACOxO,WAAA,CAAAC,EAGf5D,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAACvoC,EADR7D,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,CAAA,CAAC,CAKxD,EAEHb,eAAgBA,CAAC,CAAEp5B,QAAAA,CAAAA,IACjBnS,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,CAAAA,CAAe,CAAiC,EAElD0L,UAAWA,CAAC,CACV1L,QAAAA,EACAi6B,MAAAA,EACAC,WAAAA,EACAC,SAAAA,EACA3oC,WAAY,CAAE4oC,QAAAA,CAAAA,CAAQ,IAEtBvsC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsJ,EAyBiCutB,GAAcib,CAAK,EAACvoC,EAQpBstB,GAAcib,CAAK,EAACA,MAAAA,EAhCvCC,WAAAA,EAauBC,SAAAA,EAOhBn6B,QAAAA,CAAAA,EAPHxO,WAAA,CAAAC,EAUR5D,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAACvoC,EADR7D,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,EAAC9nC,EAOnDtE,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAAC7a,EADRvxB,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,CAAA,CAAC,CAO5D,EAEH9kC,KAAMA,IAAAkqB,GAAA1f,EAAM,CAAAzX,GAAA,QAAA,CAAgD,EAC5D,YAAaoyC,IAAAjb,GAAA1f,EAAM,CAAAzX,GAAA,QAAA,CAAoC,EACvD,aAAcqyC,IAAAlb,GAAA1f,EAAM,CAAAzX,GAAA,QAAA,CAAqC,EACzD4b,OAAQA,CAAC,CAAE9D,QAAAA,CAAAA,IACTA,EACEnS,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,CAAAA,CAAe,CAAuB,EAACqf,GAAA1f,EAEvC,CAAAzX,GAAA,QAAA,CAA6C,EAEjD,mBAAoBsyC,CAAC,CACnBP,MAAAA,EACAj6B,QAAAA,EACAk6B,WAAAA,EACAC,SAAAA,EACA3oC,WAAY,CAAE4oC,QAAAA,CAAAA,CAAQ,IAEtBvsC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsJ,EAyBiCutB,GAAcib,CAAK,EAACvoC,EAQpBstB,GAAcib,CAAK,EAACA,MAAAA,EAhCvCC,WAAAA,EAaiCC,SAAAA,EAO1Bn6B,QAAAA,CAAAA,EAPHxO,WAAA,CAAAC,EAUR5D,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAACvoC,EADR7D,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,EAAC9nC,EAOnDtE,EAACusC,EAAO,CAACC,UAAWJ,EAAQ,CAAA,CAEnB,EAAC7a,EADRvxB,EAAA,OAAA,CAAMqD,MAAO+oC,CAAAA,CAAmC,CAAA,CAAC,CAO5D,EAEHR,cAAeA,CAAC,CAAEz5B,QAAAA,CAAAA,IAChBnS,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,CAAAA,CAAe,CAAuC,EAExD,gBAAiBy6B,CAAC,CAAEz6B,QAAAA,CAAAA,IAAcnS,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,CAAAA,CAAe,CAAmB,EACpE,eAAgB06B,CAAC,CAAE16B,QAAAA,EAAS26B,cAAAA,CAAAA,IAC1B9sC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA6X,QAAAA,EACU26B,cAAAA,CAAAA,CAAyB,CAC5B,EAETtB,sBAAuBA,CAAC,CAAEx2B,KAAAA,CAAAA,IACxBhV,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA0a,KAAAA,CAAAA,EACgCrR,WAAA,CAAAC,EAAR5D,EAAA,IAAA,CAAA,CAAY,CAAA,CAAC,CAC9B,EAETyrC,mBAAoBA,IAClBzrC,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAgC,CAAA,CAC/B,EAELqxC,eAAgBG,GAChB,yBAA0BA,GAC1BF,cAAeA,CAAC,CAAEoB,KAAAA,CAAAA,IAAW/sC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAyyC,KAAAA,CAAAA,CAAiB,CAA6B,CAC7E,EAGMC,GAA6B,CACjCC,mBAAoBA,CAAC,CAAElgC,KAAAA,EAAMmgC,WAAAA,CAAAA,IAC3BltC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAyS,KAAAA,EACwBmgC,WAAAA,CAAAA,EAAkCvpC,WAAA,CAAAC,EAA1C5D,EAAA,IAAA,EAAY,EAAC6D,EAAe7D,EAAA,IAAA,CAAA,CAAkB,CAAA,CAAC,CAExD,EAETmtC,aAAcA,CAAC,CAAEpgC,KAAAA,EAAMmgC,WAAAA,EAAYhc,eAAAA,EAAgBG,eAAAA,CAAAA,IACjDrxB,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAyS,KAAAA,EACwBmgC,WAAAA,EAAgChc,eAAAA,EAC5BG,eAAAA,CAAAA,EAA8B1tB,WAAA,CAAAC,EAD1C5D,EAAA,IAAA,EAAY,EAAC6D,EAAa7D,EAAA,IAAA,CAAA,CAAkB,CAAA,CAAC,CAEtD,EAETotC,kBAAmBA,CAAC,CAAEF,WAAAA,EAAYhc,eAAAA,EAAgBG,eAAAA,CAAAA,IAChDrxB,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA4yC,WAAAA,EACiChc,eAAAA,EAAyCG,eAAAA,CAAAA,EAC7C1tB,WAAA,CAAAC,EADV5D,EAAA,IAAA,CAAA,CAAkB,CAAA,CAAC,CAE/B,CAEX,EAEMqtC,GAA0B,CAC9BC,KAAM,CAAAjzC,GAAA,QAAA,EACNkzC,QAAS,CAAAlzC,GAAA,QAAA,EACTmzC,2BAA4B,CAAAnzC,GAAA,QAAA,EAC5BozC,gBAAiB,CAAApzC,GAAA,QAAA,EACjBqzC,UAAW,CAAArzC,GAAA,QAAA,EACXszC,QAAS,CAAAtzC,GAAA,QAAA,EACTuzC,QAAS,CAAAvzC,GAAA,QAAA,CACX,EAEMwzC,GAAgB,GAEtB,SAASpvB,GAAa,CACpBnjB,aAAAA,EACA3B,SAAAA,EACAm0C,SAAAA,EACAC,mBAAAA,CACF,EAAG,CACD,KAAM,CAAEj8B,EAAAA,CAAAA,EAAG5Y,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CACJd,GAAAA,EACAmU,OAAAA,EACA2D,QAAAA,EACA67B,OAAAA,EACA33C,MAAAA,EACAo1C,mBAAAA,EACAwC,aAAAA,EAEAC,KAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAC,WAAAA,EAEAC,eAAAA,EACAC,mBAAAA,EACAC,SAAAA,EACAC,oBAAAA,EACAC,qBAAAA,CAAAA,EACEpzC,EACJ,GAAI,CAAE4E,KAAAA,CAAAA,EAAS5E,EAEf,IAAK4E,IAAS,WAAaA,IAAS,UAAY,CAACsO,EAE/C,OAAO,KAIT,MAAMmgC,EAAengC,GAAQsP,QAAUtP,EACjCogC,EAAiBD,GAAct0C,GAE/BuX,EAAiBpS,GAAAA,EACjB8pB,EAAS1X,IAAmBO,GAAS9X,GACrCw0C,EAAUrgC,GAAQlH,MAAMwnC,MACxBC,EACJ,CAAC,CAACvgC,GAAQwgC,oBACVxgC,GAAQwgC,qBAAuBp9B,GAC/BpD,GAAQ2D,SAAS9X,KAAOuX,EAE1B,IAAIq9B,EAAY,EACZC,EAAe,EACnB,GAAIhvC,IAAS,mBAAoB,CAC/B,GAAIiuC,EACF,UAAWh8B,MAAWg8B,EAChBh8B,GAAQ0iB,QAAQlmB,SAAS,WAAW,GACtCsgC,IAEE98B,GAAQ0iB,QAAQlmB,SAAS,QAAQ,GACnCugC,IAIF,CAACA,GAAgBD,IAAW/uC,EAAO,aACnC,CAAC+uC,GAAaC,IAAchvC,EAAO,SACzC,CAEA,IAAI+mB,EACA/mB,IAAS,OACX+mB,EAAOklB,GAAY7iB,EAAS,YAAculB,EAAU,aAAe,MAAM,EAChE1C,GAAYjsC,CAAI,EACzB+mB,EAAOklB,GAAYjsC,CAAI,EAIvB+mB,EAAIuK,GAAA1f,EAAG,CAAAzX,GAAA,SAAAC,OAAA,CAAA4F,KAAAA,CAAAA,CAAoC,CAAE,EAG/C,MAAMqsC,EAAUA,CAAC,CAAEC,UAAAA,GAAW,GAAG2C,EAAAA,IAC/B3C,GACExsC,EAAA,IAAA,CAAGkS,SAAS,IAAI/R,QAASivC,EAA0B,GAAKD,EAAAA,CAAQ,EAEhEnvC,EAAA,IAAA,CAAA,GAAOmvC,EAAAA,CAAQ,EAGbE,EACJd,EAAqB,GAAKA,EAAqBD,GAAgB7zC,OAC3D60C,GAAiBD,EAAY,SAAW,QAE9C,GAAI,OAAOpoB,GAAS,WAAY,CAC9B,MAAMmlB,IACHlsC,IAAS,aAAeA,IAAS,WAAaquC,EAC3Cc,EACEd,EACAD,GAAgB7zC,OAClB0zC,GAAW1zC,QAAU6zC,GAAgB7zC,SAAW0X,EAAU,EAAI,GAC9Dk6B,GAAa+B,GAAW3zC,SAAW+T,EAAS,EAAI,GACtD,GAAItO,IAAS,eAAgB,CAC3B,MAAM4sC,GAAgBkB,GAAQlB,cAC1BA,KACF7lB,EAAOA,EAAK,CACV9U,QAASnS,EAAC4S,GAAQ,CAACT,QAAAA,EAAkBo9B,WAAU,EAAA,CAAE,EACjDzC,cAAe9sC,EAAC4S,GAAQ,CAACT,QAAS26B,GAAeyC,WAAU,EAAA,CAAE,CAAA,CAC9D,EAEL,SAAWrvC,IAAS,wBAAyB,CAC3C,MAAMgtC,GAAa72C,GAAO62C,WACtBA,KACFjmB,EAAOA,EAAK,CAAEjS,KAAMk4B,EAAAA,CAAY,EAEpC,UACGhtC,IAAS,kBAAoBA,IAAS,2BACvC5E,EAAawwC,MACb,CACA,MAAM0D,GACJl0C,EAAaywC,WACbv9B,GAAQse,QAAQlY,OACbk3B,GACCA,GAAO2D,YACPn0C,EAAawwC,MAAM99B,QAAQ,KAAM,EAAE,EAAEA,QAAQ,KAAM,EAAE,CACzD,EACFiZ,EAAOA,EAAK,CACV9U,QAASnS,EAAC4S,GAAQ,CAACT,QAAAA,EAAkBo9B,WAAU,EAAA,CAAE,EACjDzD,MAAOxwC,EAAawwC,MACpB0D,SAAAA,EAAAA,CACD,CACH,MAAWtvC,IAAS,gBAClB+mB,EAAOA,EAAK,CACV,GAAG3rB,EAAa2yC,YAAAA,CACjB,EAEDhnB,EAAOA,EAAK,CACV9U,QAASA,EACPnS,EAAC4S,GAAQ,CAACT,QAAAA,EAAkBo9B,WAAU,EAAA,CAAE,EAExCjB,IAAiB,CAAC,GAChBtuC,EAAC4S,GAAQ,CAACT,QAASm8B,EAAe,CAAC,EAAGiB,WAAU,EAAA,CAAE,EAGtDnD,MAAAA,GACAC,WAAAA,GACAC,SAAUyC,EAAkB,QAAU,OACtCprC,WAAY,CAAE4oC,QAAAA,CAAAA,CAAQ,CACvB,CAEL,CAEA,MAAMmD,EACJp0C,EAAaqH,WAAa,IAAID,KAAKpH,EAAaqH,SAAS,EAAEW,eAAAA,EAEvDqsC,GACJ,CACE,mBAAkBne,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAmB,EACvCwjB,UAAS2T,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAW,EACtByjB,OAAM0T,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAa,EACrB0jB,OAAMyT,GAAA1f,EAAE,CAAAzX,GAAA,QAAA,CAAc,CAAC,EACvB6F,CAAI,GAACsxB,GAAA1f,EAAI,CAAAzX,GAAA,QAAA,CAAU,EACjB+0C,EAA4BA,IAAM,CACtCv1C,EAAO+2B,oBAAsB,CAC3BC,QAAS8e,GACTjzC,SAAUyxC,EACV9Z,cAAen0B,IAAS,mBACxB6wB,yBAA0B7wB,IAAS,SAAW,CAAC,YAAY,EAAI,CAAA,EAC/D8zB,OAAQ4b,GAAUhB,EAAgBj1C,CAAQ,CAAA,CAE9C,EAEAjB,GAAAA,GAAc,SAAA,CAGd,MAAM8V,GAAQqhC,GAAU,SAAA,KAAAj+B,EAChBk+B,GAAYthC,GAAQ2D,EAAS9X,SAAOuX,eAAAA,EAC1C,GAAA,CAAA0X,GAAMymB,CAAAA,IAAaC,IAAkBH,SAAU,OAC/C,OAAKvmB,IACI,CAEX,OAAAzpB,EAAA,MAAA,CAEA,mCACEK,CAAA,GACEI,4BACA,oBAAsB4tC,KAAQ7zC,GAAAA,GAAAA,EAC9B,SAAA,IACA6X,SAAS,CAAAlS,EAAA,MAAA,CAAGD,MAAAA,kCAEZG,CAAA,GACEI,MAAOovC,EACPrsC,SAAOqsC,IAAAA,mBAAAA,EAAAA,EAAAA,CAAmB3vC,SAEzBG,CAAAA,EAAAA,EAAS,CACRH,KAAAA,SACQW,KAAK,KAASC,IAAAA,EAAUC,MAAKV,aAAAA,CAAAA,EAAMI,EAAMG,EAAA,CAAe,KAC9DT,QAAMU,KAAK,KAAQC,IAAAA,EAAUC,MAAKV,gBAAAA,CAAAA,CAAMI,CAAM,CAAA,EAAmBN,EAAAS,EAAA,CACjE,KAEFT,GAAKE,CAAA,GAAA,eACHQ,KAAM4qC,KACN3qC,IAAAA,CAAK,CAAA,CACAT,CAAAA,EACNL,EAAA,MAAA,CAEA,MACLA,uBAAKS,SAAM,CAAAJ,IAAA,WAAAA,IAAA,SAAAL,EAAAC,EAAA,UAgBRI,CAAAA,EAAAA,KACCH,SACEC,CAAA,CAAA,EAAAD,IAAIknB,kBAAAA,EAAAA,GAAAA,CAAQ,UACF9U,EAAA,EACa,CAAA,MAAYA,yBAAQ9X,EAAAA,MAAAA,CAAK,SAE/C6F,CAAS8sC,GACRntC,EAAA,IAAA,EAAA,CAAAE,KAAAA,EAEIgN,GAAAA,CAAMpT,CAAAA,EACNqG,EAAG3J,KAAAA,CAAAA,CAAAA,EAAAA,EAAAA,IAAAA,MAEL2J,WAAKrG,CACL,yBACEsZ,gBACA5R,IAAAA,WACAyZ,SAAI9a,EAAAgC,EAAA,CAAUjC,GAAAA,SAEd1F,WAAA,CAAAsJ,EAAAA,EAAAA,EAAA,CAAAC,KACcnD,WAAKC,KAAK,GAAA,CAAA,CAAgB,CAAK,CAAA,CAAC,CAAA,EACvC,GAAA,CAAA,CAAA,MAGX,sBAAA,CAAA,CAAA+qC,GAAA5rC,EAAA,MAAA,UAEDK,CAAS4R,EAAAu7B,GAA0B5B,EAAAA,SAClC,EAAAzrC,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,IAAA,CAAAD,KAAAA,qBACKstC,OAGDp6B,OAAM,SACN5R,IAAAA,WACAyZ,SAAI9a,EAAAgC,EAAA,CAAUjC,GAAAA,SAEd1F,WAAA,CAAAsJ,EAAAA,EAAAA,EAAA,CAAAC,KACcnD,WAAKC,KAAK,GAAA,CAAA,CAAgB,CAAK,CAAA,CAAC,CAAA,CAAA,CACvC,CAAA,EACLR,IAAA,iBAAAF,EAAA,MAAA,CACD,SAENE,EAAS0T,GAAA,CACR7T,GAAAA,kBACOkuC,GAAA,IAAA,GAAClsC,SAAI/B,EAAAgC,EAAkBisC,CAAqBluC,GAAAA,QAC/C,CAAA,CAAA,CAAA,CAA8B,CAAA,CAAC,CAC3B,CAAA,EAETouC,GAAA,OAAA,GAAAtuC,EAAA,IAAA,CACD,MAEHsuC,gBACI7tC,SAAM,CAAA6tC,EAAA,MAAA,EAAAN,EAAA,EAAA,IAAAtgB,IAAA1tB,EAAAghC,EAAA,CAAe9gC,SACrBouC,CAAAA,EAAAA,IAAU3hC,CACAzM,KAAAA,GACP,IAEEkT,eACA6H,MAAI,uBACJxa,QAAMpJ,IAAA,mBACU,EACdA,EAAEmJ,YAAektB,EACjB1zB,EACF,SAAA,CAAAmG,EAAAsS,GAAA,CAAEvS,IAAAA,GAEDuS,aACCC,KAAKJ,EAAQK,QAAAA,GAAAA,MAAAA,EAAAA,OAAAA,GAAAA,KAAAA,IACb7R,IAAAA,MACYlG,WAAU,QAEhB0zC,IAAAA,GAKNvtC,SAAQuR,IAAQmP,GAA4B,KAClCnP,EAAAA,EAAAA,IAAS0a,oBAAAA,EAAAA,MAAAA,OAFd1a,oBAKA7R,SAAMitB,GAAA,OAAA,IAAA0iB,IAAAjwC,EAAAS,EAAA,WACYP,EAEjBQ,KAAM4qC,IACN3qC,MAAK,GAAAsvC,EAAA,OAAA,CAAA,CACL3vC,CAAc,CAAA,CAAQ,CAEzB,EACEitB,GACN,EAAA,EAAA,GAAA,CAAA,EAAAA,GAhCIpb,EAAQ9X,CAAAA,GAiCV6F,IAAG,oBAAAA,IAAA,aAAAA,IAAA,WAAAovC,KAAA,SAAAzvC,EAAA,SAAA,CAAA,KAnCKsS,SA2CbjS,MAAK,cACLI,kBAAM+tC,GAAA,KAAA,GAAA,EACN,QAAA,IAAA,GACSluC,oBAAM,CACbtG,QAAO+2B,GACLC,SAAS8e,EACTjzC,cAAUyxC,SAAAA,UACK,MAAY,QAAA,WAAAE,EAAA,IAAA,MAAA6B,IAAA,CACzB,UAAoB,GAAM1L,sBACxB6J,EAAAA,EAAW7rC,cAAW0tC,EAAAA,OAAS,EAC7B,MAAMpM,CAAAA,IAAAA,MAAWpqC,EAASO,KAAAA,GAAAA,KACvB0C,CAGH,CAAA,CAAA,EAEJD,GAAA,CAAA,EACA,gBAAiByzC,GAAA,CACjB,KAAA,CAAApyC,MAAyBoyC,GAAa,MAC9BF,GAAM9B,aAAaiC,KAAAA,CAAAA,EAAW71C,YAAAA,UAAAA,KAAAA,CAAAA,EAAAA,SAAAA,KACpC,GAAA01C,GAKA,UAAW1iB,MAAA8iB,GAAA,CACX,MAAA1b,MAAsBwZ,KAAWpiC,IAAAA,GAAA,KAAAwhB,GAAA,EAAA,EAC/BoH,GAGAA,GAAIA,OAAY,KAAAsb,EAAA,GAEhB1iB,GAAO,OAAA,CAAA0iB,EAAA,EACL99B,GAAQ0iB,KAAAA,EAAU30B,EACG,CACvB,CAEJ,MAAA,CACA,KAAO,GACLu0B,MAAM/3B,EAAA,CACCA,EAEX,cAAAwD,IAAA,mBACAm0B,UAAen0B,EAASvG,CAAA,CAAA,CACkB,EAE9C,SAAA,CAAA,KAAAuG,IAAA,aAAAA,IAAA,WAAAquC,EAAAJ,EAAA,OAAAnuC,EAAAS,EAAA,CAAEV,KAAAA,cAKG,CAAA,CAACW,CAAK,CAAA,EAAiBb,EAAA,SAAA,CACtB,KAERA,SACEK,MAAK,cACLI,QAAM8uC,EACNjvC,SAASivC,CAAAA,EAAAA,OAAAA,IAAAA,IAAAA,EAAAA,OAAAA,EAAAA,GAAAA,EAAAA,EAAAA,CAA0BrvC,KAAAA,cAI9B,CAAA,CAACW,CAAK,CAAA,CAAc,CAAG,CAAA,EAE/B,CAAAytC,GAAA,QAAAG,GAAA,OAAA,GAAAzuC,EAAA,IAAA,OAGHsuC,gBACG7tC,SAAM,CAAAguC,EAAA,IAAA/gB,IAAA1tB,EAAAghC,EAAA,UACNyN,CAAAA,EAAAA,IAAAA,CACUvuC,KAAAA,GACP,IAEEkT,eACA6H,MAAI,uBACJxa,QAAMpJ,IAAA,mBACU,EACdA,EAAEmJ,YAAektB,EACjB1zB,EACF,SAAAmG,EAAAsS,GAAA,CAAEvS,IAAAA,GAEDuS,aACCC,KAAKJ,MACLxR,IAAAA,GAAK4sB,GAAA,WAAA,KAAAA,GAAA,IAAA,GAEL3sB,SAAQuR,IAAQmP,GAA4B,KAClCnP,EAAAA,CAAS0a,EAAIU,KAFVlzB,EAGd,GAAA,CAAA,EAACkzB,GAfGpb,EAAQ9X,CAAAA,EA2BZk0C,EAAKD,EAAA,QAAAzuC,EAAA+T,GAAA,CAAA,SAGX26B,CAAAA,MAAAA,EAAqBD,EAAAA,GAAAA,MAAe7zC,EAAAA,EACnCoF,GACEkC,MACEpI,8BAEF2G,SAAM,CAAA,IAAAiuC,EAAAD,EAAA,OAAAtuC,EAAAS,EAAA,qBAGD,CAAA,CAACC,CAAK,CAAA,CAAe,CAAG,CAAA,EAEhC0tC,GAAA,OAAA,GAAApuC,EAAA,KAAA,CACA,MAEJouC,8BACK9tC,SAAM8tC,EAAA,IAAAkC,IAAAtwC,EAAA,KAAA,UACPouC,EAAAA,GAAe5/B,CACdzO,MAAAA,2BACgBG,CAAA,GACZI,GAAAA,gBAAsC,EAAA,GAAA,MAAAgwC,GAAA,EAAA,GACtCvuC,SACEpI,EAAWo7B,GAAIp7B,CAChBoG,OAEDC,GACEwO,KAAAA,IACA7N,YAAK,GACLy/B,iBAAW,GACXmQ,aAAAA,EAAgB,CAAA,CACJ,CAAA,CACb,EACYD,GAAA,EAAA,CAAA,CAAA,CAAA,EAAC9hC,IACd,CACL4/B,GAAA,QAAAA,GAAA,QAAA,IAAApuC,EAAAwwC,GAAA,CACC,MAELhiC,4BAAiC4/B,GAE9B9tC,GAAAA,cAAsC,GAAA,MAAAsuC,CAAA,GACtC7sC,cAEMgsC,EAiBE,OAjBgBa,IAAAA,CAGxBxuC,MAAAA,GACElJ,GAAC62C,OAAAA,cACI72C,SAAM,EACL,GAAAyI,GAAMA,CACN,GAAIA,GAAAA,QAAM,OAERzI,GAAA,eAAe,EACfA,GAAEmJ,cAAe,IAAA,WAAA,cAAA,CACjBV,QAAK8wC,GAAAA,QAEDC,QAASx5C,GAAEw5C,OAAAA,CAAAA,CACXC,CAAWA,CAEf,EAEJ,SACAlyC,EAAAA,EAAAA,GAAAA,CACLsB,OAEA+tC,EAEGt/B,KAAAA,IACA7N,SAAK,GACLkc,iBAAQ,GACR0zB,aAAAA,EAAgB,CAAA,EAChBK,EAAAA,GAAY,CACb,SAEA7b,EACC0F,KAAAA,IACA95B,SAAK,GACLkc,iBAAQ,GACR0zB,aAAAA,EAAgB,CAAA,CACJ,CAAA,CAAA,CACb,CAAA,CACF,CAEJ,CAAA,CACG,CAGZ,SAAAC,GAAArB,EAAA,CAEA,MAAAlvC,KAAuBkvC,EACrB,SAAY0B,GAAAA,CACZ,GAAA1B,EAAY,iBAAKA,GAAAA,EAAOr9B,CAAgB,GAAA,QAAA,CAAA,EAAc,IAAA7R,CAAA,CAAA,CAAEA,CAC1D,MAAA6wC,GAAA/3C,GAAA0lB,GAAA,CAAAsyB,EAAAC,IAEAD,EAAeh4C,cAAK0lB,KAAesyB,EAAUC,cAAa,EACxD,EC7xBI,kBAAmB56B,WACrB1d,wBAAY,iBAA0B,UAAArC,GAAA,CACtC+f,KAAAA,CACE1d,KAAAA,EACA,GAAA2B,EAAQ6F,YAAAA,CAAAA,EAAM7F,GAAAA,MAAAA,CAAAA,EAAI42C,IAAAA,iBAAYp3C,EAAIxD,kBAAgB,CAC9C6J,GAAAA,EACFrG,YAAAA,CAA2B,EAEzBo3C,CAAAA,EAGL,MAAAC,GACHn4C,GAAA,UAAA,CACF,KAAA,CAEA,EAAAoD,CACE,EAAAjD,GAAM,EAAA,GAAED,EAAAA,kBAAAA,WAAAA,OAAAA,KAAE,MAACC,EAAAgE,GAAArD,CAAA,EACL,CAEN,kBAAAs3C,CACA,EAAAl0C,EAAQk0C,CAAkB,GAAA92C,EAE1B3B,YAAAA,CAEA,EAAAy4C,GAAM,CAAA,EAAE92C,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,EAAAA,EAAAA,GAAI42C,IAAAA,CAAY,UAA0B,OAClD,KAAOG,CAEPtW,SAAAA,CACE,EAAI3/B,GAACd,EACC,CAAEV,MAAAA,YACR,EAAAwB,GAAM,CAAEzB,YAAAA,CAAAA,CAAAA,EAAoByB,EAAI4sB,IAAApuB,EAC9Bs3C,EAAAA,EAAAA,GAAAA,CAAAA,EAAAA,GAAAA,GACD,SAAA,CACDv4C,MAAQga,EAAW,MAAAhZ,EAAA,GAAA,cAAA,QAAAW,CAAA,EAAA,MAAA,EAAE42C,GAAAA,GAAAA,EAAAA,CAAalpB,MAAAA,EAAAA,EAAAA,YAAiBpuB,CAAU,KAAAuG,EACvD+nB,OAAAA,EACA9V,QAAAA,CAGN,EAAC7W,EACOA,EAAAA,CAAAA,CAAe,SAAM5B,oCAAmCmB,QAC1CsX,UAAS,CAAA,CAAAk/B,GAAA,GAC3B34C,EAAY,CAAA,CAAA24C,GAAoB,GAAEh3C,EAAAA,CAAAA,CAAAA,GAAAA,GAAIiB,GAAAA,EAAc6W,EAAAA,YAAAA,CAAS,QAAAk/B,EAC7D,UACA,EAAQnxC,GAAAA,CAAAA,GAAAA,GAAAA,EAAMsO,EAAAA,CAAQ2D,GAAAA,EAAiC7W,QAAAA,EACvD,aAAAA,EACA,aAAA2sB,CACA,CAAA,IAIEpuB,SAAO+iB,KAAAA,IAAcmL,CAAA,MAAAvZ,EAAA,EAAA,GACV6iC,EACT13C,SAAAA,KAAUi0B,IAAAA,CAAAA,MAAAA,EAAAA,EAAAA,GAEd,SAAW0jB,KAAAA,gBAMPj3C,CACA8X,GAAAA,CACA7W,EAAAA,CAAAA,EAAAA,CACA2sB,CAAAA,EAAAA,GACD,IAAA,CACH,WAAO,eACL,UAAIspB,cAAW,CAEqC,EAAA,CAAA,CAAA,EAGlDliC,GAASpL,GAAW8jB,CAA2C5uB,GAC1D,WAAA,eAELkW,UAAAA,cAAgB,CAClB,CAAA,EACF,MACFrO,EAAO,IAAA,CACLtI,MAA6CmB,EAC/C,kBAAA,KACC,wBAAA,KAAA,SAAA,IAAA,IACDQ,SAAI42C,KAAY,iBAuBlB,EACE76B,GAAAA,EAAUo7B,CACZ,KAAA,IACGC,EACLx5C,QAAAA,EACE,aAAAqD,EACE5C,aAAAA,CACA0d,EAAAA,EACF,OAAApW,EAAAkE,GAAA,CACD,QAAAhN,GAAA,YAEqBA,EAAA,eACpBw6C,EAAAA,CAIA,EACEriC,SAASpL,EAAO,MAAA,CAClB,MAAA,QACF,SAAA,KAEImtC,SAAAA,CAAAA,EAAAA,SAAuB,CACnB,KAAA,SAAE/2C,MAAAA,cAAI8X,QAAAA,EAAS7W,SAAAA,EAAAA,EAAAA,CAAc2sB,KAAAA,IAAiBmpB,IAAAA,GAIxC/vC,GAAAA,QACJL,CAAQ,CACV,CACF,CAAA,CAAEjB,EAAAA,WAEF,CAAKO,SAAMN,EAAA,IAAA,CAAQkS,SAASlS,EAAAgC,EAAA,CAAIjC,WAC9B,CAAQG,CAAK,CAASI,CAAM,CAAA,EAAcH,EAAAA,OAASa,CAAQjB,SACzDC,KAAKA,EAAA,IAAA,CAACU,SAAKV,EAAAgC,EAAA,CAAIpB,GAAGzE,QAAAA,CAAAA,CAAAA,CAAAA,EAAE6D,EAAA,MAAA,CAAA,MAAA3F,oBAAA,QAAOnD,GAAA,CAAC,KAAA,CAAG,OAAAmK,CAAA,EAEjCnK,GAAA6I,EACEC,OAAA,UAAA,UAAA9I,EAAA,OAAA,UAAA,MAAA6I,GACE,EACC,SAAAC,EAAAye,GAAA,CAEL5e,SAAAsS,EAAA,YAAApS,aAAAA,EAEIA,WACE,CAAA,CAAA,CAAA,EAA2DC,EAAA,MAAA,CAC1D,MAEL,CACEM,UAAM,KAAA,EAKJ,SAAMT,EAAA+T,GAAA,CAAA,GAAEvS,iBAAO,MAAInK,eAEnB,QAAMmK,EACJL,SAAQ,CAAAhB,EAAA,OAAA,CACV,SAAAA,EAAAgC,EAAA,CACF,GAAA,QAAA,CAAEjC,CAEW,SACDoS,EAAQ9D,CAClB/S,KAAAA,aAAAA,CACAwyC,CAAAA,CAAQ,CACT,CAAA,CACE,CAAA,CACL,CAAA,CAAA,CACS,CAAA,CACM,CAAA,CACb,CAEK,OAAA,IAAI,CAAA,EC/LV6D,GAAmBA,CAAC,CAAEx3C,MAAAA,CAAM,EAAI,KAAO,CAClD,MAAMy3C,EAAUn+B,GAAMtB,QAAQwB,IAAI,eAAe,GAAK,CAAA,EACtD,OAAOxZ,EAAQy3C,EAAQplC,MAAM,EAAGrS,CAAK,EAAIy3C,CAC3C,EAEMC,GAAqB,GACdC,GAAqBA,CAAClM,EAAOmM,EAAY,OAAS,CAC7D,GAAI,CAACnM,GAAOjf,SAAU,OAEtB,MAAMirB,EAAUD,GAAgB,EAC1BK,EAAgBJ,EAAQ9sB,UAC3BmtB,GAASA,EAAKrM,QAAUA,GAASqM,EAAKF,YAAcA,CACvD,EAIIC,IAAkB,IACpBJ,EAAQ1+B,OAAO8+B,EAAe,CAAC,EAGjCJ,EAAQM,QAAQ,CACdtM,MAAOA,EAAMjf,KAAI,EACjBorB,UAAAA,EACAI,UAAWzvC,KAAK1G,IAAG,CACrB,CAAC,EACD,MAAMo2C,EAAiBR,EAAQplC,MAAM,EAAGqlC,EAAkB,EAE1Dp+B,GAAMtB,QAAQqD,IAAI,gBAAiB48B,CAAc,CACnD,EAEaC,GAA0BA,CAACzM,EAAOmM,EAAY,OAAS,CAElE,MAAMO,EADUX,GAAgB,EACA/e,OAC7Bqf,GAAS,EAAEA,EAAKrM,QAAUA,GAASqM,EAAKF,YAAcA,EACzD,EACAt+B,GAAMtB,QAAQqD,IAAI,gBAAiB88B,CAAe,CACpD,EAEaC,GAAwBA,IAAM,CACzC9+B,GAAMtB,QAAQqD,IAAI,gBAAiB,CAAA,CAAE,CACvC,EC9Bag9B,GAAyBA,CAAC5M,EAAOmM,EAAWp4C,IAAa,CACpE,IAAI2I,EAAOP,EAAIrB,EAEf,GAAIqxC,IAAc,WAChBzvC,EACEtC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsrC,MAAAA,CAAAA,EACsBjiC,WAAA,CAAAC,EAAT5D,EAAA,IAAA,CAAA,CAAa,CAAA,CAAC,CACpB,EAET+B,EAAK,aAAa8jC,mBAAmBD,CAAK,CAAC,iBAC3CllC,EAAO,mBACEqxC,IAAc,WACvBzvC,EACEtC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsrC,MAAAA,CAAAA,EACyBjiC,WAAA,CAAAC,EAAT5D,EAAA,IAAA,CAAA,CAAa,CAAA,CAAC,CACvB,EAET+B,EAAK,aAAa8jC,mBAAmBD,CAAK,CAAC,iBAC3CllC,EAAO,gBACEqxC,IAAc,WAAY,CACnC,MAAMU,EAAa7M,EAAM,CAAC,EACpB8M,EAAc9M,EAAM53B,QAAQ,QAAS,EAAE,EACvCg3B,EAAU,GAAGyN,CAAU,GAAGC,CAAW,GAC3CpwC,EACEtC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAA0qC,QAAAA,CAAAA,EACkCrhC,WAAA,CAAAC,EAAd5D,EAAA,OAAA,CAAA,CAAqB,CAAA,CAAC,CACnC,EAET+B,EAAK,IAAIpI,CAAQ,MAAM+4C,CAAW,GAClChyC,EAAO,SACT,MAEE4B,EACEtC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsrC,MAAAA,CAAAA,EACQjiC,WAAA,CAAAC,EACN5D,EAAA,QAAA,CAAOM,MAAM,eAAA,CAAuD,CAAA,CAAC,CAChE,EAETyB,EAAK,aAAa8jC,mBAAmBD,CAAK,CAAC,GAC3CllC,EAAO,SAGT,MAAO,CAAE4B,MAAAA,EAAOP,GAAAA,EAAIrB,KAAAA,CAAAA,CACtB,EAEMiyC,GAAaC,GAAW,CAACzD,EAAOlvC,IAAQ,CAC5C,KAAM,CAAEhH,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAES,SAAAA,CAAAA,EAAawB,GAAAA,EACf,CAAC03C,EAAcC,CAAe,EAAIC,GAAAA,EAClC,CAACC,EAAgBC,CAAiB,EAAI55C,EAAS,EAAK,EACpD,CAACusC,EAAOsN,CAAQ,EAAI75C,EAASw5C,EAAal/B,IAAI,GAAG,GAAK,EAAE,EACxDzT,EAAO2yC,EAAal/B,IAAI,MAAM,EAC9B+zB,EAAUtvC,EAAO,IAAI,EAErB+6C,EAAiB/6C,EAAO,IAAI,EAClCg7C,GAAoBnzC,EAAK,KAAO,CAC9BozC,SAAW94C,GAAU,CACnB24C,EAAS34C,CAAK,CAChB,EACAwkB,MAAOA,IAAM,CACXo0B,EAAe76C,QAAQymB,MAAAA,CACzB,EACAjC,OAAQA,IAAM,CACZq2B,EAAe76C,QAAQwkB,OAAAA,CACzB,EACAw2B,KAAMA,IAAM,CACVH,EAAe76C,QAAQg7C,KAAAA,CACzB,CAAA,EACA,EAEF,MAAMC,EAAgBp/B,GACpB,IAAMw9B,GAAiB,CAAEx3C,MAAO,CAAA,CAAG,EACnC,CAACg1C,GAAO32C,MAAM,CAChB,EAEMg7C,EAAwBr/B,GAAQ,IAAM,CAC1C,GAAI,CAACyxB,EAAO,MAAO,CAAA,EAWnB,MAAM6N,EATkBF,EACrB3gB,OAAQ8gB,GAEHA,EAAY9N,QAAUA,EAAc,GAEjC8N,EAAY9N,MAAM5nC,YAAAA,EAAc2Q,SAASi3B,EAAM5nC,aAAa,CACpE,EACAwO,MAAM,EAAG,CAAC,EAE6BhK,IAAKkxC,IAAiB,CAC9D,GAAGlB,GACDkB,EAAY9N,MACZ8N,EAAY3B,UACZp4C,CACF,EACAo4C,UAAW2B,EAAY3B,UACvB4B,eAAgB,GAChBD,YAAAA,CAAAA,EACA,EA+CF,MA7CiB,CAEf,CACE,GAAGlB,GAAuB5M,EAAO,KAAMjsC,CAAQ,EAC/C6Q,IAAK,CAACtK,GAAQ,CAAC,KAAK8D,KAAK4hC,CAAK,EAC9BptC,OAAQ,CAAC,CAAC0H,CAAAA,EAGZ,GAAGuzC,EAEH,CACE,GAAGjB,GAAuB5M,EAAO,WAAYjsC,CAAQ,EACrDnB,OAAQ,WAAWwL,KAAK4hC,CAAK,EAC7Bp7B,IAAK,KAAKxG,KAAK4hC,CAAK,EACpBmM,UAAW,UAAA,EAGb,CACE,GAAGS,GAAuB5M,EAAO,WAAYjsC,CAAQ,EACrDnB,OACE,QAAQwL,KAAK4hC,CAAK,GAAK,WAAW5hC,KAAK4hC,CAAK,GAAK,KAAK5hC,KAAK4hC,CAAK,EAClEp7B,IAAK,QAAQxG,KAAK4hC,CAAK,EACvB1lC,KAAM,OACN6xC,UAAW,UAAA,EAGb,CACEzvC,MACEtC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAsrC,MAAAA,CAAAA,EACsBjiC,WAAA,CAAAC,EAAZ5D,EAAA,OAAA,CAAA,CAAmB,CAAA,CAAC,CACvB,EAET+B,GAAI,IAAI6jC,CAAK,GACbptC,OAAQ,CAAC,WAAWwL,KAAK4hC,CAAK,EAC9Bp7B,IAAK,WAAWxG,KAAK4hC,CAAK,EAC1B1lC,KAAM,OACNQ,KAAM,aAAA,EAGR,CACE,GAAG8xC,GAAuB5M,EAAO,WAAYjsC,CAAQ,EACrDo4C,UAAW,UAAA,CACb,EAIC98B,KAAK,CAAClJ,EAAGmJ,IAAM,CACd,GAAIhV,EAAM,CACR,GAAI6L,EAAEgmC,YAAc7xC,EAAM,MAAO,GACjC,GAAIgV,EAAE68B,YAAc7xC,EAAM,MAAO,EACnC,CACA,OAAI6L,EAAEvB,KAAO,CAAC0K,EAAE1K,IAAY,GACxB,CAACuB,EAAEvB,KAAO0K,EAAE1K,IAAY,EACrB,CACT,CAAC,EACAooB,OAAO,CAAC,CAAEp6B,OAAAA,CAAAA,IAAa,CAACA,CAAM,CACnC,EAAG,CAACotC,EAAO1lC,EAAMvG,CAAQ,CAAC,EAE1B,OACEkG,EAAA,OAAA,CACEI,IAAKynC,EACLpnC,MAAM,2BACNmlB,SAAWvuB,GAAM,CAIf,GAHAA,EAAEmJ,eAAAA,EAEmB,WAAW2D,KAAKqL,SAASpL,IAAI,EAEhD,GAAI2hC,EAAO,CACT,MAAMtvC,EAAS,CACbyzB,EAAG6b,CAAAA,EAED1lC,MAAaA,KAAOA,GACxB4yC,EAAgBx8C,CAAM,CACxB,MACEw8C,EAAgB,CAAA,CAAE,OAGhBlN,EACFv2B,SAASpL,KAAO,aAAa4hC,mBAAmBD,CAAK,CAAC,GACpD1lC,EAAO,SAASA,CAAI,GAAK,EAAE,GAG7BmP,SAASpL,KAAO,UAIpB6tC,GAAmBlM,EAAO1lC,CAAI,EAE9BivC,GAAO1pB,WAAWvuB,CAAC,CACrB,EAAE6I,UAEFC,EAAA,QAAA,CACEC,IAAKkzC,EACL54C,MAAOqrC,EACP5wB,KAAK,IACL9U,KAAK,SAELmlC,YAAWlpC,EAAE,CAAA9B,GAAA,QAAA,CAAQ,EACrBsmB,IAAI,OACJizB,aAAa,MACbhM,YAAY,MACZC,eAAe,MACfE,WAAW,QACX8L,SAAW38C,GAAM,CACVA,EAAEmK,OAAO9G,OACZu4C,EAAgB,CAAA,CAAE,CAEtB,EACAj5B,QAAU3iB,GAAM,CACdg8C,EAASh8C,EAAEmK,OAAO9G,KAAK,EACvB04C,EAAkB,EAAI,CACxB,EACAa,QAASA,IAAM,CACbb,EAAkB,EAAI,EAEtB,MAAMc,EAAYrM,EAAQpvC,SAASyG,cACjC,sBACF,EACIg1C,GACFA,EAAU55B,UAAUhS,IAAI,OAAO,CAEnC,EACA6rC,OAAQA,IAAM,CACZx6C,WAAW,IAAM,CACfy5C,EAAkB,EAAK,CACzB,EAAG,GAAG,EACNvL,EAAQpvC,SACJyG,cAAc,4BAA4B,GAC1Cob,UAAU9R,OAAO,OAAO,CAC9B,EACA4rC,UAAY/8C,GAAM,CAChB,KAAM,CAAE6G,IAAAA,CAAAA,EAAQ7G,EAChB,OAAQ6G,EAAAA,CACN,IAAK,SACHk1C,EAAkB,EAAK,EACvB,MACF,IAAK,OACL,IAAK,YAEH,GADA/7C,EAAEmJ,eAAAA,EACE2yC,EAAgB,CAClB,MAAMkB,EAAYxM,EAAQpvC,QAAQyG,cAChC,4BACF,EACA,GAAIm1C,EAAW,CACb,IAAIC,EAAWD,EAAUE,mBACzB,KAAOD,GAAYA,EAAS37C,QAC1B27C,EAAWA,EAASC,mBAElBD,IACFA,EAASh6B,UAAUhS,IAAI,OAAO,EACb2E,MAAMC,KACrBonC,EAASE,cAAct0C,QACzB,EAAE6yB,OAAQ/6B,GAAOA,IAAOs8C,CAAQ,EACvB/sC,QAASvP,GAAO,CACvBA,EAAGsiB,UAAU9R,OAAO,OAAO,CAC7B,CAAC,EAEL,KAAO,CACL,MAAM0rC,EAAYrM,EAAQpvC,QAAQyG,cAChC,sBACF,EACIg1C,GACFA,EAAU55B,UAAUhS,IAAI,OAAO,CAEnC,CACF,CACA,MACF,IAAK,KACL,IAAK,UAEH,GADAjR,EAAEmJ,eAAAA,EACE2yC,EAAgB,CAClB,MAAMkB,EAAY99C,SAAS2I,cACzB,4BACF,EACA,GAAIm1C,EAAW,CACb,IAAII,EAAWJ,EAAUK,uBACzB,KAAOD,GAAYA,EAAS97C,QAC1B87C,EAAWA,EAASC,uBAElBD,IACFA,EAASn6B,UAAUhS,IAAI,OAAO,EACb2E,MAAMC,KACrBunC,EAASD,cAAct0C,QACzB,EAAE6yB,OAAQ/6B,GAAOA,IAAOy8C,CAAQ,EACvBltC,QAASvP,GAAO,CACvBA,EAAGsiB,UAAU9R,OAAO,OAAO,CAC7B,CAAC,EAEL,KAAO,CACL,MAAMmsC,EAAQp+C,SAASiI,iBACrB,sBACF,EACMo2C,EAAWD,EAAMA,EAAM/5C,OAAS,CAAC,EACnCg6C,GACFA,EAASt6B,UAAUhS,IAAI,OAAO,CAElC,CACF,CACA,MACF,IAAK,QACH,GAAI6qC,EAAgB,CAClB,MAAMkB,EAAY99C,SAAS2I,cACzB,4BACF,EACIm1C,IACFh9C,EAAEmJ,eAAAA,EACF6zC,EAAUQ,MAAAA,GAEZzB,EAAkB,EAAK,EACvB9D,GAAO1pB,WAAWvuB,CAAC,CACrB,CACA,KAAA,CAEN,CAAA,CACD,EACD2I,EAAA,MAAA,CAAKS,MAAM,iBAAiB9H,OAAQ,CAACw6C,EAAejzC,SAAA,CAEjD,CAAC6lC,GAAS2N,EAAc94C,OAAS,GAChCoF,EAAA,MAAA,CAAKS,MAAM,iCAAgCP,UACzCF,EAAA,MAAA,CAAKS,MAAM,wBAAuBP,SAAA,CAChCC,EAACS,EAAI,CAACC,KAAK,UAAUC,KAAK,GAAA,CAAK,EAC/BX,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6B,CAAC,CAAA,CAC3B,EACJk5C,EAAc/wC,IAAI,CAACkxC,EAAa7rC,IAAM,CACrC,KAAM,CAAEvF,MAAAA,EAAOP,GAAAA,EAAIrB,KAAAA,CAAAA,EAAS8xC,GAC1BkB,EAAY9N,MACZ8N,EAAY3B,UACZp4C,CACF,EAEA,OACEkG,EAAC+T,GAAI,CAEH7R,GAAAA,EACAzB,MAAO,uBAAuBuH,IAAM,EAAI,QAAU,EAAE,GACpD1H,QAAUjJ,GAAM,CACd46C,GACE4B,EAAY9N,MACZ8N,EAAY3B,SACd,EACA5C,GAAO1pB,WAAWvuB,CAAC,CACrB,EAAE6I,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAAA,EAAYJ,MAAM,oBAAA,CAAsB,EAC9CN,EAAA,OAAA,CAAAD,SAAOuC,CAAAA,CAAY,CAAC,CAAA,EAZf,GAAGoxC,EAAY9N,KAAK,IAAI8N,EAAY3B,SAAS,IAAI2B,EAAYvB,SAAS,EAavE,CAEV,CAAC,EACDtyC,EAAC+T,GAAI,CACH7R,GAAG,UACHzB,MAAM,6CAA4CP,SAAA,CAElDC,EAACS,EAAI,CAACC,KAAK,QAAQJ,MAAM,oBAAA,CAAsB,EAC/CN,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAA,CACjB,CAAC,CAAA,CACH,CAAC,CAAA,CACJ,EAINm5C,EAAsBhxC,IACrB,CAAC,CAAEF,MAAAA,EAAOP,GAAAA,EAAIrB,KAAAA,EAAMqxC,UAAAA,EAAW4B,eAAAA,EAAgBD,YAAAA,CAAAA,EAAe7rC,IAC5DhI,EAAC+T,GAAI,CAMH7R,GAAAA,EACAzB,MAAO,uBAAuBqzC,EAAiB,6BAA+B,EAAE,IAAI9rC,IAAM,EAAI,QAAU,EAAE,GAC1G1H,QAAUjJ,GAAM,CACTy8C,GACH7B,GAAmBlM,EAAOmM,CAAS,EAErC5C,GAAO1pB,WAAWvuB,CAAC,CACrB,EAAE6I,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAAA,EAAYJ,MAAM,oBAAA,CAAsB,EAC9CN,EAAA,OAAA,CAAAD,SAAOuC,CAAAA,CAAY,CAAC,CAAA,EAdlBqxC,EACI,UAAUD,EAAY9N,KAAK,IAAI8N,EAAY3B,SAAS,IAAI2B,EAAYvB,SAAS,GAC7E,cAAcJ,GAAa,SAAS,IAAIlqC,CAAC,EAa3C,CAEV,CAAC,CAAA,CACE,CAAC,CAAA,CACF,CAEV,CAAC,ECpYD8sC,GAAe57C,GAAK,SAAuB,CAAEiI,QAAAA,EAAUA,IAAM,CAAC,CAAE,EAAG,CACjE,KAAM,CAAC4zC,EAAYC,CAAa,EAAIx7C,EAAS,EAAK,EAC5Cy7C,EAAgB18C,EAAO,IAAI,EAEjCgE,GACE,CAAC,QAAS,GAAG,EACZlF,GAAM,CACL29C,EAAc,EAAI,EAClBr7C,WAAW,IAAM,CACfs7C,EAAcx8C,SAASymB,QAAAA,EACvB+1B,EAAcx8C,SAASwkB,SAAAA,CACzB,EAAG,CAAC,CACN,EACA,CACEje,OAAQ,GACRwB,eAAgB,GAChBvB,gBAAkB5H,GAAM,CACtB,MAAM69C,EAAe,WAAW/wC,KAAKqL,SAASpL,IAAI,EAC5CqtC,EAAW,CAAC,CAACl7C,SAAS2I,cAAc,sBAAsB,EAChE,OACEg2C,GACAzD,GACAp6C,EAAE8H,SACF9H,EAAE+H,SACF/H,EAAEgI,QACFhI,EAAEwH,QAEN,CAAA,CAEJ,EAEA,MAAMs2C,EAAcA,IAAM,CACxBH,EAAc,EAAK,EACnB7zC,EAAAA,CACF,EAEA5E,GACE,MACClF,GAAM,CACL49C,EAAcx8C,SAASg7C,OAAAA,EACvB0B,EAAAA,CACF,EACA,CACEhwC,QAAS4vC,EACTK,iBAAkB,GAClB50C,eAAgB,GAChBxB,OAAQ,GACRC,mBAAwB5H,EAAE8H,SAAW9H,EAAE+H,SAAW/H,EAAEgI,QAAUhI,EAAEwH,QAAAA,CAEpE,EAEA,MAAMlG,EAAS,CAACo8C,EAEhB,OACE50C,EAAA,MAAA,CACE3F,GAAG,2BACH7B,OAAAA,EACA2H,QAAUjJ,GAAM,CACdwB,EAAAA,SAAaxB,EAAA,eACb89C,EAAM3zC,CACQ,EAEhB,SAAArB,EAAA2yC,GAAA,CAAE5yC,IAAAA,EAGAE,OAAAA,EACAzH,SAAAA,IAAAA,GACUitB,CACRuvB,CAAY,CAAA,CACd,CAAA,CACD,CAAA,ECvDP,SAASE,IAAY,CACnB,KAAM,CAAEj8C,EAAAA,EAAG6Y,EAAAA,CAAAA,EAAG5Y,GAAAA,EACR,CAAES,SAAAA,CAAAA,EAAawB,GAAAA,EACf8B,EAAaC,GAAYrD,CAAM,EAC/B,CAAEksC,UAAAA,EAAWnoC,SAAAA,CAAAA,EAAaX,EAEhC,GAAI,CAAC8oC,EAAUtrC,OACb,OAAO,KAET,MAAM06C,EACJv3C,EAASC,oBAAsB,gBAC9B,CAACD,EAASC,mBAAqBD,EAASw3C,qBAErC13C,EAAUtF,EAAAA,EACVi9C,EAAYj9C,EAAAA,EAEZk9C,EAAWl9C,EAAO,EAAK,EACvBm9C,EAAqBxP,EACxBvjC,IAAI,CAACgzC,EAAK3tC,IAAM,CACf,KAAM,CAAE3H,KAAAA,EAAM,GAAGiN,CAAAA,EAASqoC,EAC1B,GAAI,CAAChQ,GAAetlC,CAAI,EAAG,OAAO,KAClC,GAAI,CAAE7F,GAAAA,EAAIorC,KAAAA,EAAMpiC,MAAAA,EAAOsiC,SAAAA,EAAUjlC,KAAAA,CAAAA,EAAS8kC,GAAetlC,CAAI,EAE7D,OAAI,OAAO7F,GAAO,aAChBA,EAAKA,EAAG8S,EAAMtF,CAAC,GAEb,OAAO49B,GAAS,aAClBA,EAAOA,EACL,CACE,GAAGt4B,EACHxT,SAAUwT,EAAKxT,UAAYA,CAAAA,EAE7BkO,CACF,GAEE,OAAOxE,GAAU,WACnBA,EAAQA,EAAM8J,EAAMtF,CAAC,EACZxE,GAAOhJ,KAEhBgJ,EAAQyO,EAAEzO,CAAK,GAEb,OAAOsiC,GAAa,WACtBA,EAAWA,EAASx4B,EAAMtF,CAAC,EAClB89B,GAAUtrC,KAEnBsrC,EAAW7zB,EAAE6zB,CAAQ,GAEnB,OAAOjlC,GAAS,aAClBA,EAAOA,EAAKyM,EAAMtF,CAAC,GAGjBxN,IAAO,UACTi7C,EAASh9C,QAAU,IAGd,CACL+B,GAAAA,EACAorC,KAAAA,EACApiC,MAAAA,EACAsiC,SAAAA,EACAjlC,KAAAA,CAAAA,CAEJ,CAAC,EACAkyB,OAAO8T,OAAO,EAGjBruC,EAAU,IAAM,CACd,GACE4E,EAAWW,SAASC,oBAAsB,gBAC1Cw3C,EAAU/8C,QACV,CACA,MAAMm9C,EAAYj8C,WAAW,IAAM,CACjC,MAAMk8C,EAAYL,EAAU/8C,SAASyG,cAAc,YAAY,EAC3D22C,GACFA,EAAU3a,eAAe,CACvBxX,SAAU,SACVC,MAAO,UACPmyB,OAAQ,QAAA,CACT,CAEL,EAAG,GAAG,EAEN,MAAO,IAAMp8C,aAAak8C,CAAS,CACrC,CACF,EAAG,CAAA,CAAE,EAEL,MAAMjM,EAAWC,GAAAA,EACjBrtC,GACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3ClF,GAAM,CACL,MAAMopB,EAAQ1F,SAAS1jB,EAAE6G,IAAK,EAAE,EAAI,EACpC,GAAIuiB,EAAQi1B,EAAmB96C,OAAQ,CACrC,KAAM,CAAEgrC,KAAAA,CAAAA,EAAS8P,EAAmBj1B,CAAK,EACrCmlB,IACF+D,EAAS/D,CAAI,EACb/nC,EAAQpF,SAASsJ,YAAAA,EAErB,CACF,EACA,CACEoD,QAAS,CAACmwC,EACVt2C,OAAQ,GACRC,mBAAwB5H,EAAE8H,SAAW9H,EAAE+H,SAAW/H,EAAEgI,QAAUhI,EAAEwH,QAAAA,CAEpE,EAEA,KAAM,CAACylB,EAAO0B,CAAQ,EAAIxsB,EAAS,CAAA,CAAE,EAErC,OAAI87C,EACK,KAIPn1C,EAAA,MAAA,CAAK3F,GAAG,YAAW0F,SAChB9C,EAAWW,SAASC,oBAAsB,eACzCmC,EAAA,MAAA,CACEC,IAAKo1C,EACL/0C,MAAM,UACNF,cAAgBlJ,GAAM,CACpBA,EAAEmJ,eAAAA,EACFxG,EAAO8wC,sBAAwB,EACjC,EAAE5qC,SAEFC,EAAA,KAAA,CAAAD,SACGw1C,EAAmB/yC,IAClB,CAAC,CAAEnI,GAAAA,EAAIorC,KAAAA,EAAMpiC,MAAAA,EAAOsiC,SAAAA,EAAUjlC,KAAAA,CAAAA,EAAQmH,IAElC7H,EAAA,KAAA,CAAAD,SACEF,EAAC+T,GAAI,CACHtT,MAAOqlC,EAAW,eAAiB,GACnC5jC,GAAI0jC,EACJtlC,QAAUjJ,GAAM,CACd,GAAIA,EAAEmK,OAAO8Y,UAAUgjB,SAAS,WAAW,EAAG,CAC5CjmC,EAAEmJ,eAAAA,EACF,MAAMkf,EAAOnpB,SAASyoB,eAAe,GAAGxkB,CAAE,OAAO,EACjD3B,GAAAA,EAAQga,CACR6M,EAAIA,UAAM,EACRA,MAAKq2B,EAAYr2B,EAAA,cAAA,iBAAA,EACjBs2B,GAEAA,EAAIA,MAAe,CACG,CACtB,CACF,EAEJ,SAAA,CAAA71C,EAAAS,EAAA,CAAEV,KAAAA,EAEIW,KAAAA,IAAAA,CAAAA,EAAYC,EAAK,OAAA,CAAM,SAC7B,CAAAX,EAAAskC,GAAA,CAAAvkC,SACEC,CAAU,CAAA,EAAAD,GAAEsD,EAAAA,EAAAA,CAAiB,SAC5BsiC,CAAAA,EACC9lC,KAAAC,CAAAA,CAAAA,EAAAA,EAAA,QAAA,CAAAC,SACEC,CACA,CAAA,CAAAD,CAAQ4lC,CAAAA,CAAQ,CAAS,CAAA,CAAA,CAE5B,CAAA,CACI,EACH,GAAA99B,CAAA,IAAAxN,CAAA,IAAAgJ,CAAA,IAAAsiC,CAAA,IAAAF,CAAA,EAAA,CAAA,CACJ,CAAA,CAGV,CAAA,EACEzlC,EAAA+S,GAAA,CACD,YAEJA,EACC+iC,SAAAA,OACAnrB,WAAS,QACTorB,cAAW,4BACXtY,IAAAA,EACAv8B,SAAK,SACLupB,aAASvzB,GAAA,SACMA,EAAM,SACnBmtB,GAAMxB,EAAAA,KAAQyyB,CAASh9C,CACG,EAE5B,WAAA0H,EAAA,SAAA,CACAgT,KAAAA,SAEI9S,GAAAA,mBACA7F,MAAG,QACHiG,cAAMpJ,GAAA,kBACUA,EACdA,EAAEmJ,sBAAe,EACjBxG,EACF,kBAAA3C,GAAA,KAGE,KAAI,CACF,OAAAmK,CAAM,EAAEA,EAAWnK,iBAAAA,CAAAA,EAAAA,gBAAAA,QACnBwG,EAAIs4C,SAAAA,YAAuB,CACI,MAC/B,CACF,CAAY,EACd,SAAAh2C,EAAAS,EAAA,CAAEV,KAAAA,WAEIW,KAAK,KAAWC,IAAAA,EAAaxE,CAAE,GAAA,QAAA,CAAA,CAAW,CAAA,CAAC,CAAA,EAAI,SAC/Co5C,EAAA,IAAA,CAAA,CACTx1C,GAAAA,EAE0B1F,KAAAA,EAAIorC,MAAAA,EAAMpiC,SAAAA,EAAOsiC,KAAAA,CAAAA,EAAUjlC,IAAQmH,IAAM,UACvD3F,GAAS,CAClB,cACGA,aACCu7B,SAAAA,OACA9S,IAAAA,GACAzpB,MAAKrB,EAAAC,EAAA,CACLwC,UACExC,EAAAA,EAAA,CAAAC,KAAAA,EACQW,KAAAA,GAAAA,CAAAA,EAAYC,EAAK,OAAA,CAAK,MAC5B,YAAML,SAAMN,EAAAskC,GAAA,CAAWvkC,UACX,CAAA,CAAEsD,CAAAA,EAAiBrD,EAAAS,EAAA,CACzB,KACNT,eAAK,CAAA,CAACU,CAAK,CAAA,EAAkB,SAC7B,CAAAV,EAAA8B,GAAA,CACH/B,GAAAA,KAESgC,SAAG/B,EAAA,OAAA,CAAID,WACfiC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAuB,CAAA,EACnBC,EAAAiC,GAAA,EAAA,EAAAkiB,GAAA,IAAAjqB,GAAA8F,EAAA8B,GAAA,CACE,GACV9B,MAACiC,EAAAA,EAAAA,GAEyBF,SAAU7H,EAAKG,OAAE,CAAG0F,YAC1C,MAAA7F,EAAA,WAAA2F,EAAAC,EAAA,UACG5F,CAAAA,MACAA,OACC,CAAA,CAAA6F,CAEwB,CAAA,CAEzB,EACG7F,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,EAKhB2F,EAAAiC,GAAA,CAEA,GAAA2jC,EAEI1jC,MAAI0jC,kBAEJnlC,SAAM,CAAAN,EAAAS,EAAA,CAAiBV,KAAAA,EAEjBW,KAAAA,GAAAA,CAAAA,EAAYC,IAAKd,EAAA,OAAA,CAAK,MAC5BA,YAAMS,SAAM,CAAAN,EAAA,OAAA,CAAWD,SACrBC,EAAAskC,GAAA,CAAAvkC,UACY,CAAA,CAAEsD,CAAAA,EAAiBsiC,GAAA9lC,EAAAC,EAAA,CACzB,SACL6lC,CAAAA,IACC9lC,EAAAC,QAAAA,CAAAC,MAAAA,qBAESO,SAAMqlC,CAAA,CAAA,CAAoB5lC,CAAE4lC,CAAAA,CAAQ,CAAS,CAAA,EAEvD3lC,EAAA,OAAA,CACG,MACN,yCAAMM,SAAMuH,EAAA,CAAA,CAAA,CAAwC9H,CAC7C,EACD,GAAC8H,CAAA,IAAAxN,CAAA,IAAAgJ,CAAA,IAAAsiC,CAAA,IAAAF,CAAA,EAAA,CAAA,CACC,CAAA,CAEb,CAAA,CACI,CAIf,MAAAwQ,GAAAl9C,GAAAm8C,EAAA,EC3RO,SAASgB,GAAY57C,EAAQ,CAClC,IAAI67C,EAAY,CAAA,EACZC,EAAa,CAAA,EACbC,EAAe,EACnB,QAASxuC,EAAI,EAAGA,EAAIvN,EAAOG,OAAQoN,IAAK,CACtC,MAAMoqC,EAAO33C,EAAOuN,CAAC,EACjBoqC,EAAKn0B,QAAU,CAACm0B,EAAK9/B,SAAS4a,OAChCqpB,EAAWvgC,KAAKo8B,CAAI,EACpBoE,MAEAF,EAAUtgC,KAAKo8B,CAAI,EACfoE,EAAe,IACjBA,EAAe,GAGrB,CAGA,GACE/7C,EAAOG,OAAS,KACf27C,EAAW37C,OAASH,EAAOG,OAAS,GAAK47C,GAAgB,GAC1D,CAEA,MAAMC,EAAeF,EAAW5zC,IAAKgM,GAAWA,EAAOnU,EAAE,EACzD,GAAI+7C,EAAW37C,OAAUH,EAAOG,OAAS,EAAK,EAE5C07C,EAAY,CACV,GAAGA,EACH,CAAE97C,GAAIi8C,EAAc9B,MAAO4B,EAAYl2C,KAAM,QAAS,CAAC,MAEpD,CAEL,MAAMq2C,EAAO9zB,KAAK+zB,MAAML,EAAU17C,OAAS,CAAC,EAC5C07C,EAAY,CACV,GAAGA,EAAU3pC,MAAM,EAAG+pC,CAAI,EAC1B,CACEl8C,GAAIi8C,EACJ9B,MAAO4B,EACPl2C,KAAM,UAER,GAAGi2C,EAAU3pC,MAAM+pC,CAAI,CAAC,CAE5B,CACA,OAAOJ,CACT,KACE,QAAO77C,CAEX,CAEO,SAASm8C,GAAajC,EAAO76C,EAAU,CAC5C,MAAM+8C,EAAmBjjC,GAAMtB,QAAQwB,IAAI,kBAAkB,GAAK,CAAA,EAC5DgjC,EAAgBnC,EAAM5hB,OAAQqf,GAAS,CAC3C,GAAI,CAACA,EAAKn0B,OAAQ,MAAO,GACzB,MAAM8xB,EAAY,GAAGj2C,CAAQ,IAAIs4C,EAAKn0B,OAAOzjB,EAAE,GACzCu8C,EAAYF,EAAiB9G,CAAS,EAC5C,OAAIgH,GAAaA,IAAc3E,EAAK53C,GAC3B,IAMRq8C,EAAM9G,CAAA,EAAAqC,EAAA,GAEP,GACA,CAAA,EAEF7tC,EAAA,OAAA,KAAAsyC,CAAA,EACA,OAAAtyC,SAAaqU,IACbrU,EAAIA,MAAK3J,EAAM2J,EAAK,OAAE,EAAA,EAAA,QAAArG,GAAA,CACpBqG,OAAKoI,EAAoBzO,KAG3B0V,GAAA,QAAA,IAAA,mBAAAijC,CAAA,GAEA,CACF,SAAAG,GAAArC,EAAA76C,EAAA,CAEA,QAAgBk9C,CAAAA,EACd,IAAAC,EAAmB,EACnBtC,EAAIsC,QAAAA,GAAgB,CACpBtC,QAAMptC,EAAS6qC,EAAIpqC,EAAKkvC,EAAA,OAAAlvC,IAAA,CACtB,GAAKkvC,EAASlvC,CAAEA,EAAC,KAAGkvC,GAAQ99C,EAACwB,KAAQoN,EAAK,EAAA,EAAA,OACxC,GAAIkvC,EAASlvC,CAAC,EAAE+M,KAAM3b,GAAMA,EAAEoB,KAAO43C,EAAK53C,WAAK,GAAA08C,EAAAlvC,CAAA,EAAA,KAAA5O,GAAAA,EAAA,cAAAg5C,EAAA,EAAA,EAAA,CAC/C8E,EACEA,CAAQ,EAAE,KAAEniC,CAAO,EAGnBmiC,MACA,CACF,CACF,MAAAC,EAAAxC,EAAA,KAAA3sC,GAAAA,EAAA,KAAAoqC,EAAA,WAAA,EACA+E,IACAD,KAAiB,EAAA,CAAA9E,EAAA+E,CAAA,EAEjB,CAAA,EAIF,QAAAnvC,EAAA,EAAAA,EAAAkvC,EAAA,OAAAlvC,IACA,QAAU+sB,EAAI/sB,EAAG,EAAGkvC,EAAAA,EAAe,OAAOniB,IACnBmiB,KAAYt8C,KAAAA,KAAam6B,CAAA,EAAA,SAAA37B,CAAA,CAAA,IAE5C89C,KAAgB,CAAA,GAAAA,EAAAlvC,CAAA,EAAA,GAAAkvC,EAAAniB,CAAA,CAAA,EAEdmiB,EAAAlvC,CAAA,EAAAkvC,EAAAlvC,CAAA,EAAA,OAAA,CAAAoqC,EAAA3xB,EAAA22B,IAAAA,EAAA,UAAAh+C,GAAAA,EAAA,KAAAg5C,EAAA,EAAA,IAAA3xB,CAAA,EACAy2B,EAASlvC,YAITkvC,KAMNA,EAAA,QAAA/gD,GAAA,CACA+gD,EAAS3vC,KAAAA,CAAO2E,EAAE/V,IAChBA,CAAO+V,EAACkJ,aAAe,CAAAC,EAAA,YACdgiC,KAAAA,QAAe,SAAGA,EAAAA,KAAa,MAAAhiC,EAAA,SAAA,EAEtCnJ,EAAA,cAAAmJ,EAAA,GAAA,EACInJ,EAAEmrC,cAAgBhiC,EAAE7a,IACpB6a,CAACnJ,EAACmrC,YAAoB,GACrBnrC,EAAEmrC,YACAA,KAAAA,MAAWnrC,EAAE,SAAQ,EAAA,KAAA,MAAAmJ,EAAA,SAAA,EADD,CAE3B,CACF,CAAA,EAGF6hC,EAAA,QAAA/gD,GAAA,CACA+gD,MAAQI,EAAsBnhD,EAAA,CAAA,EAAA,QAAA,GAC5BA,EAAMmhD,QAAAA,GAAkB,CACxBnhD,EAAQoR,QAAS6qC,KAASkF,IACxBlF,sBAEA,CAAA,CACF,CAAA,EACA8E,EAAA,OAIF,MAAMK,EAAW,CAAA,EACXC,EAAwB,CAAA,EACxBC,EAAe,CAAA,EACrB9C,OAAAA,EAAMptC,QAAS6qC,GAAS,CACtB,GAAIA,EAAKn0B,OAAQ,CACfs5B,EAASvhC,KAAKo8B,CAAI,EAClB,MACF,CACA,QAASpqC,EAAI,EAAGA,EAAIkvC,EAASt8C,OAAQoN,IACnC,GAAIkvC,EAASlvC,CAAC,EAAE+M,KAAM3b,GAAMA,EAAEoB,KAAO43C,EAAK53C,EAAE,EAAG,CAC7C,GAAIg9C,EAAsB1oC,SAAS9G,CAAC,EAAG,OACvC,MAAM0vC,EAAeR,EAASlvC,CAAC,EAC/B0vC,EAAatiC,KAAK,CAAClJ,EAAGmJ,IACbxS,KAAKlE,MAAMuN,EAAEpJ,SAAS,EAAID,KAAKlE,MAAM0W,EAAEvS,SAAS,CACxD,EACD,MAAMw0C,EAAqBI,EAAa,CAAC,EAAEplC,QAAQ9X,GACnD+8C,EAASvhC,KAAK,CACZxb,GAAIk9C,EAAa/0C,IAAKqF,GAAMA,EAAExN,EAAE,EAChCm6C,MAAO+C,EACPr3C,KAAMq3C,EAAaC,MAAOC,GAAOA,EAAGtlC,QAAQ9X,KAAO88C,CAAkB,EACjE,SACA,cACN,CAAC,EACDE,EAAsBxhC,KAAKhO,CAAC,EAC5B,MACF,CAIF,GAAIoqC,EAAKiF,aAAejF,EAAKjD,qBAAuBiD,EAAK9/B,QAAQ9X,GAAI,CACnE,MAAMq9C,EAAO9H,GAAUqC,EAAK53C,GAAIV,CAAQ,EACnCE,EAAO89C,YAAYD,CAAI,GAE1BJ,EAAazhC,KAAK,CAChB6hC,KAAAA,EACAR,YAAajF,EAAKiF,WACpB,CAAC,CAsBL,CAEAE,EAASvhC,KAAKo8B,CAAI,CACpB,CAAC,EAGGqF,GAAc78C,QAChBm9C,eAAe,IAAM,CACnB,KAAM,CAAEl+C,MAAAA,GAAUyB,GAAI,CAAExB,SAAAA,CAAS,CAAC,EAGlC,eAAAk+C,GAAA,CACA,QAAAhwC,EAAegwC,EAAAA,EAAAA,EAAgB,OAAAhwC,IAAA,CAC7B,KAAK,CACH,KAAA6vC,EAAQA,YAAAA,CAAMR,EAAAA,EAAAA,CAAAA,EAAY,GAAII,CAC9B,MAAI13C,EAAA,MAAAk4C,GAAAZ,EAAAx9C,CAAA,EACFq+C,GAAMn4C,EAAgBjG,EAAMm+C,CAC5BC,cAAWn4C,EACTnE,CAAAA,EACF5B,EAAE,YAAA69C,CAAA,EAAA,CACF79C,GAAM+F,EAAa83C,GACjBr9C,SAAAA,CACAV,EAEF,MAAA,IAAA,QAAAqwB,GAAA,WAAAA,EAAA,GAAA,CAAA,OACUwa,CAAAA,EAEV,CACA9rC,GAAAA,GAAO,mCAAS,EAAA,CAGtB,MAAAs/C,EAAAV,EAAA,IAAA,CAAA,CAEIh0B,YAAAA,CACF,IAAA4zB,CAAA,GACA,SAAA,CACA,GAAMc,CAA0Bd,MAAAA,EAAAA,MAAAA,EAAAA,GAAAA,SAAAA,KAAAA,CAAkBA,IAClD,CAAC,EACC,GAAIe,GAAA,OACF,UAAMA,KAAwBv+C,EAAiB,CAAUq+C,GAAEC,EAAAA,EAAAA,CAAM,cAAA,GAC7DC,EACF,MAAKP,EAAM93C,EAAiBq4C,KAAAA,CAAAA,CAC1BF,YAAAA,CACEt8C,IAAAA,IAAemE,EAAA,EAAA,GAAA,KACf83C,IACF79C,cAAay9C,CAAY,EAAC1iC,CACrBsiC,GAAAA,EAAAA,GAAa,SAAAv9C,CAElB,UAIG,CAEL,MAAA,CACFk+C,EAAO,CACLA,CACF,GAAA,OAEAA,EAAA,CAEAA,CAAAA,EAEHT,CACH,CACES,MAAAA,GAAAA,GAAe,CAAApd,EAAA/gC,IACjBA,EAAA,GAAA,SAAA,QAAA+gC,CAAA,EAAA,MAAA,CACF,EACF,eAAAyd,GAAA1D,EAAA76C,EAAA,CAEA,MAAAoqC,EAAe,MAAAG,KACjB,GAAA,CAAAH,EAAA,OAAA,OAEA,KAAM+T,CACJ,mBAAAK,CACF,EAAEt+C,IAEoBq+C,CAAAA,KACpB1D,EAAMzQ,WAAe,CACrB,GAAKA,EAAAA,OAAatpC,OAClB,KAAM,CAAE09C,GAAAA,EAAuBt+C,QAAAA,EAC/BnB,KAAAA,EAAW,CAAA,GACL0/C,EACAhxC,EAAS6qC,GAAS53C,EAAAV,CAAA,EACtB,GAAIs4C,EAAayF,CAAA,GAAA,OAAA,OACjB,MAAMW,EAAAjU,GAAAlH,CAAA,KAAI,CAAAmb,EAAA,QAAA,CAAArU,EAAA,OAAA,aAAE9G,EAAO6G,EAAA,OAAA,CAAA3iB,EAAA0mB,MAAMuQ,EAAG,KAAAp/C,GAAAA,EAAA,YAAA,IAAA6uC,EAAA,KAAA,aAAA,GAAA9D,EAAA,KAAA/qC,GAAAA,EAAA,KAAA,YAAA,IAAA6uC,EAAA,KAAA,YAAA,CAAA,IAAOmK,EAAI,KAAAnK,EAAA,IAAA,KAGvC,CAAA,CAAA,EACIwQ,EAAe79C,QAEjB29C,EACsBn/C,KAAMA,CAG1BmoB,KAAAA,EACF,KAAAs2B,EACA,aAAUY,EACT,CAED,CAAA,EACAF,EAAuBviC,OAAK,OAC1Bo8B,EAAImG,EAAA,IAAAxP,GAAAA,EAAA,KAAA,OAAA,EACJ8O,EAAI,MAAAj0B,GAAA/mB,CAAA,EACJqnC,GAAAA,CAAAA,EAAcuU,OAChBF,EAAE,QAAAxP,GAAA,CACJ,KAAA,CACA,KAAAqJ,EAEEmG,KAAAA,EACF,aAAArU,CACA,EAAMrgB,MACcuuB,EAAA,QAAA,EAAA,EAEpBmG,GAAAA,CAAAA,EAAAA,YACED,EAAMT,CAAA,EAAA3T,IAAcA,CAAa,CACjC,SAAUrgB,IAAmBvR,CAC7BtY,EAAA,mBAAuB,CAAA,CACrBs+C,CCpUO,SAASI,GAAU,CAChCC,cAAAA,EACAC,kBAAAA,EAAoB,EACpBC,gBAAAA,EAAkB,EAClBC,qBAAAA,EAAuB,GACvBC,mBAAAA,EAAqB,GACrB33C,UAAAA,EAAY,WACZ43C,oBAAqBC,EACrBC,kBAAmBC,CACrB,EAAI,GAAI,CACN,KAAM,CAACC,EAAiBC,CAAkB,EAAI7/C,EAAS,IAAI,EACrD,CAAC8/C,EAAYC,CAAa,EAAI//C,EAAS,EAAK,EAC5C,CAACggD,EAAUC,CAAW,EAAIjgD,EAAS,EAAK,EACxC,CAACkgD,EAAgBC,CAAiB,EAAIngD,EAAS,EAAK,EACpD,CAACogD,EAAcC,CAAe,EAAIrgD,EAAS,EAAK,EAChDsgD,EAAa14C,IAAc,WAEjC65B,OAAAA,GAAgB,IAAM,CACpB,MAAM8e,EAAoBpB,EAAclgD,QACxC,GAAI,CAACshD,EAAmB,MAAO,CAAA,EAC/B,IAAIC,EAAsBF,EACtBC,EAAkBhE,UAClBgE,EAAkB3e,WAEtB,SAAS6e,GAAW,CAClB,KAAM,CACJlE,UAAAA,EACA3a,WAAAA,EACA8e,aAAAA,EACAC,YAAAA,EACAC,aAAAA,EACA/e,YAAAA,CACF,EAAI0e,EACEM,EAAcP,EAAa/D,EAAY3a,EACvCkf,EAAkBR,EAAaI,EAAeC,EAC9CI,EAAkBT,EAAaM,EAAe/e,EAC9Cmf,EAAiB53B,KAAKkZ,IAAIue,EAAcL,CAAmB,EAC3DhB,EACJC,GACAr2B,KAAKhI,IACH2/B,EAAkB3B,EAClB0B,EACAD,CACF,EACInB,EACJC,GACAv2B,KAAKhI,IACH2/B,EAAkB1B,EAClByB,EACAA,EAAkBD,EAAcE,CAClC,EAGAC,IACCR,EAAsBK,EACnBtB,EACAD,KAEJO,EAAmBW,EAAsBK,EAAc,MAAQ,OAAO,EACtEL,EAAsBK,GAGxBd,EAAcc,GAAe,CAAC,EAC9BZ,EAAYY,EAAcE,GAAmBD,CAAe,EAC5DX,EAAkBU,GAAerB,CAAmB,EACpDa,EACEQ,EAAcE,GAAmBD,EAAkBpB,CACrD,CACF,CAEAa,OAAAA,EAAkBjhD,iBAAiB,SAAUmhD,EAAU,CAAEle,QAAS,EAAK,CAAC,EAEjE,IAAMge,EAAkBne,oBAAoB,SAAUqe,CAAQ,CACvE,EAAG,CACDrB,EACAC,EACAC,EACAC,CAAkB,CACnB,EAEM,CACLK,gBAAAA,EACAE,WAAAA,EACAE,SAAAA,EACAE,eAAAA,EACAE,aAAAA,EACAa,KAAMA,IAAM,CACN9B,EAAclgD,SAChBkgD,EAAclgD,QAAQm4C,cAAc,IAAI8J,MAAM,QAAQ,CAAC,CAE3D,EAEJ,CC3Fe,SAASC,GACtB,CACEhC,cAAAA,EACAC,kBAAAA,EAAoB,EACpBC,gBAAAA,EAAkB,EAClBC,qBAAAA,EAAuB,GACvBC,mBAAAA,EAAqB,GACrB33C,UAAAA,EAAY,WACZ43C,oBAAqBC,EACrBC,kBAAmBC,EACnBsB,KAAAA,CACF,EAAI,CAAA,EACJ/yC,EACA,CACA,GAAI,CAACA,EAAU,OACf,MAAMoyC,EAAa14C,IAAc,WAC3B44C,EAAsBzhD,EAAO,IAAI,EACjC6gD,EAAkB7gD,EAAO,IAAI,EAE7B0hD,EAAWW,GACf,IAAM,CACJ,IAAItB,EAAa,GACbE,EAAW,GACXE,EAAiB,GACjBE,EAAe,GAEnB,MAAMG,EAAoBpB,EAAclgD,QAClC,CACJs9C,UAAAA,EACA3a,WAAAA,EACA8e,aAAAA,EACAC,YAAAA,EACAC,aAAAA,EACA/e,YAAAA,CACF,EAAI0e,EACEM,EAAcP,EAAa/D,EAAY3a,EACvCkf,EAAkBR,EAAaI,EAAeC,EAC9CI,EAAkBT,EAAaM,EAAe/e,EAC9Cwf,EAAcR,EAAcL,EAAoBvhD,QAChDqiD,EAAqBD,EAAc,EACnCr7C,EAAYs7C,EACd/B,EACAD,EACEE,EACJC,GACAr2B,KAAKhI,IACH2/B,EAAkB3B,EAClB0B,EACAD,CACF,EACInB,EACJC,GACAv2B,KAAKhI,IACH2/B,EAAkB1B,EAClByB,EACAA,EAAkBD,EAAcE,CAClC,EAEE33B,KAAKkZ,IAAI+e,CAAW,GAAKr7C,IAC3B45C,EAAgB3gD,QAAUqiD,EAAqB,MAAQ,QACvDd,EAAoBvhD,QAAU4hD,GAGhCf,EAAae,GAAe,EAC5Bb,EAAWa,EAAcE,GAAmBD,EAC5CZ,EAAiBW,GAAerB,EAChCY,EACES,EAAcE,GAAmBD,EAAkBpB,EAErDxxC,EAAS,CACP0xC,gBAAiBA,EAAgB3gD,QACjC6gD,WAAAA,EACAE,SAAAA,EACAE,eAAAA,EACAE,aAAAA,CACF,CAAC,CACH,EACA,IACA,CACEmB,QAAS,EACX,CACF,EAEA9f,OAAAA,GAAgB,IAAM,CACpB,MAAM8e,EAAoBpB,EAAclgD,QACxC,OAAIshD,IACFC,EAAoBvhD,QAClBshD,EAAkBD,EAAa,YAAc,YAAY,EAC3DC,EAAkBjhD,iBAAiB,SAAUmhD,EAAU,CAAEle,QAAS,EAAK,CAAC,GAEnE,IAAM,CACPge,GACFA,EAAkBne,oBAAoB,SAAUqe,CAAQ,CAE5D,CACF,EAAG,CAAA,CAAE,EAELzhD,EAAU,IAAM,CACViiD,GAAQ9B,EAAclgD,SACxBs/C,eAAe,IAAM,CACnBY,EAAclgD,QAAQm4C,cAAc,IAAI8J,MAAM,QAAQ,CAAC,CACzD,CAAC,CAEL,EAAG,CAACD,CAAI,CAAC,EAEF,CACLO,qBAAsBA,IAAM,CAC1B5B,EAAgB3gD,QAAU,IAC5B,EAEJ,CCjGA,SAASwiD,GAAU,CACjBx6C,MAAOiC,EACPk4B,SAAAA,EACAjsB,OAAAA,EACA7U,SAAAA,EACAwN,OAAAA,EAEA4zC,aAAAA,CACF,EAAG,CACD,KAAM,CAAE9hD,EAAAA,CAAAA,EAAGC,GAAAA,EACX,IAAIw+C,EAAO9H,GAAUnV,EAAU9gC,CAAQ,EACvC,MAAMsD,EAAaC,GAAYrD,CAAM,EAKrC,GAJK2U,IACHA,EAASvR,EAAWL,SAAS86C,CAAI,GAAKz6C,EAAWL,SAAS69B,CAAQ,EAClEid,EAAO9H,GAAUphC,GAAQnU,GAAIV,CAAQ,GAEnC,CAAC6U,EACH,OAAO,KAGT,KAAM,CACJ2D,QAAS,CACPyN,KAAAA,EACA2B,OAAAA,EACA/O,aAAAA,EACAnY,GAAIsmC,EACJpuB,IAAK4f,EACL7Q,YAAAA,EACAzB,SAAAA,EACAiN,OAAQkuB,EACRnuB,IAAAA,EACAE,MAAAA,CAAAA,EAEF1yB,GAAAA,EACA4gD,aAAAA,EACAC,UAAAA,EACAhM,aAAAA,EACAiM,WAAAA,EACAC,gBAAAA,EACAC,WAAAA,EACA/zC,KAAAA,EACAg0C,MAAAA,EACA5N,UAAAA,EACAra,YAAAA,EACAkoB,WAAAA,EACAC,SAAAA,EACAC,SAAAA,EACA5L,SAAAA,EACA6L,KAAAA,GACA/4C,UAAAA,EACAu0C,YAAAA,GACAlI,mBAAAA,EACA9R,QAAAA,GACAgI,SAAAA,GACA3iB,iBAAAA,GACAzE,OAAAA,EACA69B,IAAAA,GACAppC,IAAAA,GACAua,OAAAA,GAEA8uB,SAAAA,GACAC,QAAAA,EAAAA,EAEErtC,EAEJ,GAAI,CAAC+T,IAAkB9nB,OACrB,OAAO,KAGT,MAAMqhD,GAAc5kD,IAAM,CACpBA,GAAEwH,QACJhG,EACEkZ,GAAGpD,GAAAA,IACJhP,GAAA,EACH,CAAA,CAAA,EACF8pB,GAAAnV,GAAA,IAEMvC,SAA+B+uB,EACnC,CAAAA,EAAOnhC,EAAoB,CAAA,EACxBu8C,GAAAC,GAAAC,EAAA,EACC3yB,QAAuB0mB,GAAAH,EAAAkM,EAAA,EAC3B,GAAAhM,aAAyBn+B,OAC3B,OAAI+uB,KAGJ,MAAMoP,GAAarC,EAInBwO,IAFInM,GAAuB,EAClB,sBAAA,GAAA,YAAA,GAAA,aACT,WAEAr3C,EAAcyO,GAAA,MAEd,OAAMg1C,GAAazO,IAAAA,CAAAA,GAAAA,KAAAA,CACnB,SAAcl0B,GAAAA,CAAAA,IAAesiB,GAAA,EAAA,GACvBsgB,EAAAA,IACE,UACR,YAEA,qBAAyB1E,EAEzB,aAAOn1B,GACL,oBAAoBm1B,IAAgBhK,EAAAvxC,EAEpC,CAEI,GAAA,QAAoBu7C,CACNoE,EAEd,QAC2B3/C,qBAAAA,GAAAA,EAAAA,EAAG,CAAiB,GAAA,SAAIsC,OAAAA,CAEnD,eAAA49C,CAEoBlgD,CAAAA,EACZ,CAA4B,GAAA,QAAA,CAA5B,EAA8BA,OAAAA,MAAAA;AAAAA;AAAAA,YAC9B9B,GAAA,WAAA,EAAA;AAAA,YAAU8hD,GAAA,cAAA,EAAA;AAAA,YACZ19C,GAAAA,aAAAA,EAAAA;AAAAA,UAEC,SAAAuB,EAAAs8C,GAAA,CAAA,MAEHvM,EAA4B,MAAAjU,GACG,KAC/BogB,EAAoC,GAAA,IAAAviD,CAAA,MAAAU,CAAA,eAAAwN,GAAA,CAAA,GACtC9H,UAEI7I,IAAA6jD,EAAA7jD,GAAA2Q,GAAAi0B,GAAAttB,CAAA,EAAA,MAAA,CAAA,CACGjM,EAAAA,EACPu5B,CAAAA,CAAAA,CACM0f,CACsC,MAAAe,GAC5Cp8C,OC5HV,SAASq8C,GAAQrN,EAAO,CACtB,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B,CAAEH,MAAAA,EAAOC,SAAAA,EAAU8f,cAAAA,CAAAA,EAAkBte,GAAAA,EAErC,CAACyW,EAAgBC,CAAkB,EAAIsC,GAAQ,IAAM,CACzD,MAAMzX,EAAWiV,GAAAA,EAIjB,MAAO,CAFLjV,EAASkY,KAAMzC,GAAYA,EAAQvW,KAAKvB,KAAOmF,GAAAA,CAAqB,GACpE9C,EAAS,CAAC,EACCA,EAASjC,OAAS,CAAC,CAClC,EAAG,CAAA,CAAE,EAMCgiD,GACHx/C,EAAWW,SAASC,oBAAsB,gBACxC,CAACZ,EAAWW,SAASC,mBACpBZ,EAAWW,SAASw3C,uBACxB,CAACn4C,EAAW8oC,UAAUnxB,KAAM4gC,GAAQA,EAAIt1C,OAAS,WAAW,EAExDf,EAAgBC,GACpB,IAAM,CACJvF,EAAO2wC,aAAe,EACxB,EACA,CACEnrC,UAAW,IACXq9C,OAAQ,QACRC,iBAAkB,EAAA,CAEtB,EAEMl/C,EAAYrF,EAAAA,EACZ,CAACwkD,EAAWC,CAAY,EAAIxjD,EAASoF,MAAS,EAE9C8C,EAAqBC,GAAuB,CAChD,EACA,EACAvE,EAAWW,SAASC,oBAAsB,eAAiB,GAAK,EAChE,CAAC,CACF,EAEKi/C,EAAgB1kD,EAAAA,EACtB,eAAe2kD,EAAWlvB,EAAW,CACnC,OAAIA,GAAa,CAACivB,EAAcxkD,WAC9BwkD,EAAcxkD,QAAUoB,EAAMM,GAAGgjD,MAC9B9iD,KAAK,CACJC,MAAO,EAAA,CACR,EACAG,OAAAA,GAEW,MAAMwiD,EAAcxkD,QAAQkC,KAAAA,CAE9C,CAEA,MAAMyiD,EAAiB7kD,EAAAA,EACvB,eAAe8kD,EAAYrvB,EAAW,CACpC,OAAIA,GAAa,CAACovB,EAAe3kD,WAC/B2kD,EAAe3kD,QAAUoB,EAAMM,GAAGmjD,OAC/BjjD,KAAK,CACJC,MAAO,EAAA,CACR,EACAG,OAAAA,GAEW,MAAM2iD,EAAe3kD,QAAQkC,KAAAA,CAE/C,CAEA,MAAM4iD,EAAgBhlD,EAAAA,EACtB,OACEyH,EAAAC,EAAA,CAAAC,UACEF,EAAA,SAAA,CACEI,IAAKxC,EACLyC,KAAK,SACLI,MAAO,gCACLuR,EAAqB,cAAgB,EAAE,IACrC+qC,IAAc,OAAS,SAAW,EAAE,GACxCl7C,MAAO,CAAE+oB,SAAU,UAAA,EACnBtqB,QAASA,IAAM,CACbi9C,EAAc9kD,QAAUoK,KAAK1G,IAAAA,EAC7B6gD,EAAc/7C,GAAYA,EAAiBrC,OAAT,MAAmB,CACvD,EACA2B,cAAgBlJ,GAAM,CACpBA,EAAEmJ,eAAAA,EACFxG,EAAO2wC,aAAe,EACxB,EAAE,GACErrC,EAAAA,EAAeY,SAAA,CAElB8R,GACC7R,EAACsS,GAAM,CACLC,IACEX,GAAgBhW,MAAM2lB,QAAU3P,GAAgBhW,MAAM4W,aAExD7R,KAAK,IACL08C,SAAUzrC,GAAgBhW,MAAMixB,GAAAA,CACjC,EAEH7sB,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAMkR,EAAqB,IAAM,IAAKjR,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAM,CAAC,CAAG,CAAC,CAAA,CAClE,EACRwF,EAACgB,GAAc,CACb48B,cAAc,WACd38B,MAAO87C,EACP77C,UAAWtD,EACXuD,QAASA,IAAM,CACb67C,EAAap+C,MAAS,CACxB,EACAgD,eAAgB,CACdC,MAAO,CACLC,OAAQ,EAAA,EAEVxB,QAASA,IAAM,CACTuC,KAAK1G,IAAAA,EAAQohD,EAAc9kD,QAAU,GAI3C,CAAA,EAEF8I,OAAQ,CACNC,OAAQjL,SAASkL,IAAAA,EACjB,GACE6tC,EACJxkB,SAAS,OACTorB,WAAW,QACXtrB,SAAS,SACTtoB,MAAM,SACNZ,mBAAAA,EACAJ,eAAc,GAAApB,UAEb,CAAC,CAAC9C,EAAWhB,YAAYqhD,YACJrgD,EAAWhB,WAAWqhD,aAA1CC,WACE19C,EAAA,MAAA,CAAKS,MAAM,WAAUP,SAAA,CACnBF,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACDkrB,QAAOlvB,EAAC,CAAA9B,GAAA,QAAA,CAA4B,CAAC,IAE9C,SAAY,CACX,GAAI,CACFgV,SAAS0C,OAAAA,CACX,MAAY,CAAC,CACf,GAAA,CAEJ,EAAEhS,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,WAAWJ,MAAM,eAAeK,KAAK,GAAA,CAAK,EAAE,IACvDX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmC,CAAA,CAC/B,CAAC,CAAA,CACC,EACV2F,EAACiC,KAAa,CAAC,CAAA,CACZ,EAETpC,EAAA,UAAA,CAAAE,SAAA,CACEF,EAACiC,GAAQ,CAACC,GAAG,IAAGhC,SAAA,CACdC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAAE,IAC9BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAkB,CAAA,CACd,CAAC,CAAA,CACC,EACTof,EACC5Z,EAAAC,EAAA,CAAAC,SAAA,CACG08C,GACC58C,EAACiC,GAAQ,CAACC,GAAG,aAAYhC,SAAA,CACvBC,EAACS,EAAI,CAACC,KAAK,YAAYC,KAAK,GAAA,CAAK,EAAE,IACnCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAU3H,GAAA,iBAAA,CAAkC,CAAA,CACxC,CAAC,CAAA,CACC,EAEZwF,EAACiC,GAAQ,CAACC,GAAG,WAAUhC,SAAA,CACrBC,EAACS,EAAI,CAACC,KAAK,WAAWC,KAAK,GAAA,CAAK,EAChCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAA,CAClB,CAAC,CAAA,CACC,EACTipB,GAAS,oBAAoB,GAC5BzjB,EAACiC,GAAQ,CAACC,GAAG,YAAWhC,SAAA,CACtBC,EAACS,EAAI,CAACC,KAAK,KAAKC,KAAK,GAAA,CAAK,EAAE,IAC5BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAA,CAClB,CAAC,CAAA,CACC,EAEZwF,EAACiC,GAAQ,CAACC,GAAG,iBAAgBhC,SAAA,CAC3BC,EAACS,EAAI,CAACC,KAAK,eAAeC,KAAK,GAAA,CAAK,EAAE,IACtCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA2B,CAAA,CACvB,EACL4C,EAAWvC,sBACVmF,EAAA,MAAA,CAAKwD,MAAKlH,EAAE,CAAA9B,GAAA,QAAA,CAAK,EAAGqH,MAAO,CAAE4kC,QAAS,EAAA,EAAMvmC,SAAA,CACzC,IAAI,GAEP,CAAA,CAAK,CACN,CAAA,CACO,EACVC,EAACiC,KAAa,EACb2P,GAAgBhW,MAAMvB,IACrBwF,EAACiC,GAAQ,CAACC,GAAI,IAAIpI,CAAQ,MAAMiY,EAAehW,KAAKvB,EAAE,GAAG0F,SAAA,CACvDC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAAE,IAC9BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAA,CACjB,CAAC,CAAA,CACC,EAEZ2F,EAACw9C,GAAQ,CAACZ,UAAAA,CAAAA,CAAuB,EACjC/8C,EAACiC,GAAQ,CAACC,GAAG,KAAIhC,SAAA,CACfC,EAACS,EAAI,CAACC,KAAK,WAAWC,KAAK,GAAA,CAAK,EAAE,IAClCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAC,CAAA,CACC,EACVwF,EAACqC,GAAQ,CACPu7B,cAAc,cACd9S,SAAS,OACTzpB,IAAK,GACLoB,MACEzC,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAC5BX,EAAA,OAAA,CAAMM,MAAM,YAAWP,SACrBC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,EACN2F,EAACS,EAAI,CAACC,KAAK,eAAA,CAAiB,CAAC,CAAA,CAC7B,EACHX,SAAA,CAEDF,EAACiC,GAAQ,CAACC,GAAG,KAAIhC,SAAA,CACfC,EAACS,EAAI,CAACC,KAAK,QAAQC,KAAK,GAAA,CAAK,EAAE,IAC/BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,CAAC,CAAA,CACC,EACVwF,EAACiC,GAAQ,CAACC,GAAG,MAAKhC,SAAA,CAChBC,EAACS,EAAI,CAACC,KAAK,UAAUC,KAAK,GAAA,CAAK,EAAE,IACjCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA+B,CAAA,CAC3B,CAAC,CAAA,CACC,EACVwF,EAACiC,GAAQ,CAACC,GAAG,MAAKhC,SAAA,CAChBC,EAACS,EAAI,CAACC,KAAK,WAAWC,KAAK,GAAA,CAAK,EAAE,IAClCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6B,CAAA,CACzB,CAAC,CAAA,CACC,EACV2F,EAACiC,GAAW,CAAA,CAAE,EACbqhB,GAAS,mBAAmB,GAC3BzjB,EAACiC,GAAQ,CAACC,GAAG,MAAKhC,SAAA,CAChBC,EAACS,EAAI,CAACC,KAAK,UAAUC,KAAK,GAAA,CAAK,EAAE,IACjCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAA,CACjB,CAAC,CAAA,CACC,EAEZwF,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAO+2B,oBAAsB,CAC3Bv2B,GAAI,OACJw2B,QAAO10B,EAAE,CAAA9B,GAAA,QAAA,CAAa,EACtBy2B,cAAeisB,EACfhsB,yBAA0B,CAAC,QAAQ,CAAA,CAEvC,EAAEhxB,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAAE,IAC9BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA0B,CAAA,CACtB,CAAC,CAAA,CACC,EACVwF,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAO+2B,oBAAsB,CAC3Bv2B,GAAI,QACJw2B,QAAO10B,EAAE,CAAA9B,GAAA,QAAA,CAAe,EACxBy2B,cAAeosB,EACfnsB,yBAA0B,CAAC,UAAU,CAAA,CAEzC,EAAEhxB,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,QAAQC,KAAK,GAAA,CAAK,EAAE,IAC/BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA4B,CAAA,CACxB,CAAC,CAAA,CACC,EAAE,GAAG,CAAA,CACP,EACV2F,EAACiC,KAAa,EACdpC,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAO2wC,aAAe,EACxB,EAAEzqC,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,QAAQC,KAAK,GAAA,CAAK,EAAE,IAC/BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAC,CAAA,CACC,CAAC,CAAA,CACX,EAEFwF,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACiC,KAAa,EACdpC,EAACiC,GAAQ,CAACC,GAAG,SAAQhC,SAAA,CACnBC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAAE,IAC9BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoB,CAAA,CAChB,CAAC,CAAA,CACC,CAAC,CAAA,CACX,CACH,CAAA,CACM,EACTwF,EAAA,UAAA,CAAAE,SAAA,CACEC,EAACiC,KAAa,EACdpC,EAACiC,GAAQ,CAACC,GAAI,UAAUhC,SAAA,CACtBC,EAACS,EAAI,CAACC,KAAK,SAASC,KAAK,GAAA,CAAK,EAAE,IAChCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoB,CAAA,CAChB,CAAC,CAAA,CACC,EACVwF,EAACiC,GAAQ,CAACC,GAAI,IAAIpI,CAAQ,YAAYoG,SAAA,CACpCC,EAACS,EAAI,CAACC,KAAK,QAAQC,KAAK,GAAA,CAAK,EAAE,IAC/BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAA,CAClB,CAAC,CAAA,CACC,EACVwF,EAACiC,GAAQ,CAACC,GAAI,IAAIpI,CAAQ,OAAOoG,SAAA,CAC/BC,EAACS,EAAI,CAACC,KAAK,WAAWC,KAAK,GAAA,CAAK,EAAE,IAClCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,CAAC,CAAA,CACC,EACVwF,EAACiC,GAAQ,CAACC,GAAI,IAAIpI,CAAQ,KAAKoG,SAAA,CAC7BC,EAACS,EAAI,CAACC,KAAK,QAAQC,KAAK,GAAA,CAAK,EAAE,IAC/BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAC,CAAA,CACC,EACTof,EACC5Z,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACiC,GAAW,CAACM,UAAU,cAAA,CAAgB,EACvC1C,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAOkK,0BAA4B,EACrC,EAAEhE,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,WAAWC,KAAK,GAAA,CAAK,EAAE,IAClCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAgC,CAAA,CAC5B,CAAC,CAAA,CACC,EACVwF,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAO8wC,sBAAwB,EACjC,EAAE5qC,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,WAAWC,KAAK,GAAA,CAAK,EAAE,IAClCX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAkC,CAAA,CAC9B,CAAC,CAAA,CACC,EACVwF,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAO0wC,aAAe,EACxB,EAAExqC,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAAE,IAC9BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAC,CAAA,CACC,CAAC,CAAA,CACX,EAEFwF,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACiC,KAAa,EACdpC,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbtG,EAAO0wC,aAAe,EACxB,EAAExqC,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAAE,IAC9BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAC,CAAA,CACC,CAAC,CAAA,CACX,CACH,CAAA,CACM,CAAC,CAAA,CACI,CAAC,CAAA,CACjB,CAEN,CAEA,SAASmjD,GAAS,CAAEZ,UAAAA,CAAU,EAAG,CAC/B,MAAMa,EAAgBn6B,GAAS,iBAAiB,EAC1C,CAACa,EAAO0B,CAAQ,EAAIxsB,EAAS,CAAA,CAAE,EACrChB,OAAAA,EAAU,IAAM,CACTolD,GACDb,IAAc,QAChBv4B,GAAAA,EAAWogB,KAAK5e,CAAQ,CAE5B,EAAG,CAAC+2B,EAAWa,CAAa,CAAC,EAEtBt5B,EAAM1pB,OAAS,EACpBoF,EAACqC,GAAQ,CACPu7B,cAAc,cACd9S,SAAS,OACTzpB,IAAK,GACLoB,MACEzC,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAC5BX,EAAA,OAAA,CAAMM,MAAM,YAAWP,SACrBC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,EACN2F,EAACS,EAAI,CAACC,KAAK,eAAA,CAAiB,CAAC,CAAA,CAC7B,EACHX,SAAA,CAEDC,EAAC8B,GAAQ,CAACC,GAAG,KAAIhC,SACfC,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAA,CACE,EACT8pB,GAAO1pB,OAAS,GACfoF,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACiC,KAAa,EACbkiB,EAAM3hB,IAAKtI,GACV8F,EAAC8B,GAAQ,CAAeC,GAAI,MAAM7H,EAAKG,EAAE,GAAG0F,SAC1CF,EAAA,OAAA,CAAAE,SAAA,CACG7F,EAAKmJ,MACLnJ,EAAKqrB,WACJ1lB,EAAAC,EAAA,CAAAC,UACG,IACDC,EAAC+kB,KAAoB,CAAC,CAAA,CACtB,CACH,CAAA,CACG,CAAA,EATO7qB,EAAKG,EAUV,CACX,CAAC,CAAA,CACF,CACH,CAAA,CACO,EAEVojD,GACE59C,EAACiC,GAAQ,CAACC,GAAG,KAAIhC,SAAA,CACfC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,GAAA,CAAK,EAC5BX,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmB,CAAA,CACf,CAAC,CAAA,CACC,CAGhB,CAEA,MAAAqjD,GAAe3kD,GAAKyjD,EAAO,ECtbrBmB,GAAwB,CAC5Bn6B,MAAO,QACPmyB,OAAQ,SACRpyB,SAAU,QACZ,EAEA,SAASq6B,GAAS,CAChBv6C,MAAAA,EACAw6C,eAAAA,EACAxjD,GAAAA,EACAV,SAAAA,EACAmkD,UAAAA,EACAC,UAAAA,EACAC,UAAAA,EACAziC,eAAAA,EACA0iC,WAAAA,EAAaA,IAAM,CAAC,EACpBniD,gBAAAA,EAAkBA,IAAM,CAAC,EACzBoiD,wBAAAA,EAA0B,KAC1BC,YAAAA,EACAC,UAAAA,EACAC,cAAAA,EAEAC,QAAAA,EACAC,KAAAA,EACAxC,cAAAA,EACAyC,iBAAAA,EACAC,gBAAAA,EACAC,iBAAAA,CACF,EAAG,CACD,KAAM,CAAEzlD,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B,CAAC26C,EAAOmK,CAAQ,EAAItlD,EAAS,CAAA,CAAE,EAC/B,CAACynB,EAASzD,CAAU,EAAIhkB,EAAS,OAAO,EACxC,CAAC66B,EAAUC,CAAW,EAAI96B,EAAS,EAAK,EACxC,CAACulD,EAASC,CAAU,EAAIxlD,EAAS,EAAK,EACtC,CAACF,EAASC,CAAU,EAAIC,EAAS,EAAI,EACrCm/C,EAAgBpgD,EAAAA,EAEtBM,YAAQomD,MAAM,YAAAzkD,CAAA,OAAuBikD,EACrCS,MAAAA,EAAkB5qC,GAAA,IAAc6qC,GAAO,EAAA,CAAA,CAAA,EAEjCC,GAAa9qC,IAAQ,QAErB+qC,IAAgBX,CAAAA,EAChBY,GAAAA,GAAsBC,IAAA,CAC5BP,EAAMQ,EAAYC,EAEdT,EAAW,SAAK,GAEhBxhC,SAAW,CACV,GAAA,CACC,MAAIkiC,GAAAJ,EAAA,QAAA,KAAA,IAAA,EACF,GAAA,CACA,KAAA1qB,GAAMA,MAAAA,CAAAA,EAAMl6B,MAAAA,EAAAA,EAAAA,EAAM,GAAIglD,KAAMtB,EAAWpwB,QAAS,OAChD,GAAI0xB,MAAAA,SAAmBjnD,EAAAA,CACvB,KAAIwU,CAAAA,GAAcvS,EAAQ,EAAAA,EAAA,OAAA,CAAA6mB,GAAA6wB,KAElBA,UAEF7wB,MAASy6B,KAAAA,CAAS,EAElBz6B,GAAA,CAAO,EAAA,KAAA6wB,CAAA,EAEP7wB,IACA,CAAA,GAAA,CAAA,CAAOA,CAAAA,EACT7mB,EACKilD,GAEPjlD,KACI2kD,IACF3kD,EAAIghB,GAAgBhhB,CAAA,GAEpBA,EAAAs8C,GAAAt8C,EAAAZ,CAAA,GAEF8lD,GAAA,SACAllD,KAAgBE,OAAQF,CAAA,GAGxB7B,EADA0mD,KAGW7kD,IAAK,CAAA,GAAAmlD,GAAA,GAAAnlD,CAAA,CAFJA,EAIVokD,EAAUnK,SAAAA,OACZrgB,EAAA,CAAAM,EAAA,CACA,MACAN,EAAY,EAAK,EAEjBA,EAAAA,SAAiB,EACnB,YAAA,IAAA,YAAA95B,CAAA,OAAA,CACAgjB,MAAAA,CACA0hC,EAAAA,OAAgB,MACN,CAAAvK,EAAA,QAAAuJ,GACVrlD,IAAe,CAEf,QAAA,CACE2D,GAAAA,OAAU0hD,CAAS,CACrB,GAAA,CAEAsB,EAAAA,IAAAA,CAAiB,QACnB,EACC,GAIHzE,EAAS,qCAAA+E,GAAAvjD,GAAA,aAAA,CAAAlF,GAAA0oD,KAAA,CAGb,GAAA1oD,GAAA,WAAA0oD,GAAA,MAAA,OAEA,MAAMC,GAAAA,SAAgB,cAAA,QAAAA,CAAA,EAEhBF,EACJG,IAAA,sBACgB,EAERphD,GAAAA,MAAakhD,KAAQx9C,EAAO,QAAA,iBAAAy9C,CAAA,CAAA,EAAA,OAAA5N,IAAA,CAAA,CAAAA,GAAA,YAAA,EAGlC,GAAA6N,IAAMA,EAAsBC,IAAAA,EAAsBF,QAAAA,cAAaG,EAAA,OAAA,EAAA,CAC/D,MAAMA,MAA6B9gC,QAAAA,EAAAA,EACnC,IAAM+gC,GAAWnzC,GAAMC,MAIrB+yC,GAAAA,QAIA3L,GAAM+L,GAAAA,KAAkBD,CAAAA,EAASE,KAAQL,GAAUI,IAAA,CAAAjO,EAAA,UAAA,SAAA,mBAAA,CAAA,GAE/C2N,KAEFzL,GAAAA,MAAW8L,EAKb9L,GAAA,eAAAwJ,EAAA,EAEExJ,KAAAA,CACAA,MAAAA,MAAwBwJ,KAAAA,IAAAA,CAC1B,MAAAyC,EAAAnO,GAAA,sBAAA,EACF,OAAOmO,EAAA,KAAA,IAAAA,EAAA,MAAA,CAEL,CAAA,EACEC,KACAA,GAAOD,MAAS51C,EACjB61C,GAAA,eAAA1C,EAAA,EAEC0C,CACAA,EAAAA,CAAgD,OAClD,GACF,gBAAAnpD,IAAAA,GAAA,SAAAA,GAAA,SAAAA,GAAA,MAAA,CACF,EAEE2H,GAAQzC,GAAA,aAAA,CAAAlF,GAAA0oD,KAAA,CACR9gD,iBAAkB5H,GAAQ8H,MAAAA,OAE9B,MAAA8gD,GAAA,SAAA,cAAA,QAAAD,CAAA,EAEMS,EACJR,IAAA,sBACgB,EAERphD,GAAAA,MAAakhD,KAAQx9C,EAAO,QAAA,iBAAAy9C,CAAA,CAAA,EAAA,OAAA5N,IAAA,CAAA,CAAAA,GAAA,YAAA,EAGlC,GAAA6N,IAAMA,EAAsBC,IAAAA,EAAsBF,QAAAA,cAAaG,EAAA,OAAA,EAAA,CAC/D,MAAMA,MAA6B9gC,QAAAA,EAAAA,EACnC,IAAM+gC,GAAWnzC,GAAMC,MAIrB+yC,GAAAA,QAIAxL,GAAM4L,GAAAA,SAAkBD,CAAAA,EAASE,KAAQL,GAAUI,IAAA,CAAAjO,EAAA,UAAA,SAAA,mBAAA,CAAA,GAE/C2N,KAEFtL,GAAAA,MAAW2L,EAKb3L,GAAA,eAAAqJ,EAAA,EAEErJ,KAAAA,CACAA,MAAAA,MAAwBqJ,KAAAA,IAAAA,CAC1B,MAAAyC,EAAAnO,GAAA,sBAAA,EACF,OAAOmO,EAAA,KAAA,IAAAA,EAAA,MAAA,CAEL,CAAA,EACEC,KACAA,GAAOD,MAAS51C,EACjB61C,GAAA,eAAA1C,EAAA,EAEC0C,CACAA,EAAAA,CAAgD,OAClD,GACF,gBAAAnpD,IAAAA,GAAA,SAAAA,GAAA,SAAAA,GAAA,MAAA,CACF,EAEE2H,GAAQzC,GAAA,CAAA,QAAA,GAAA,EAAA,IAAA,CACR0C,SAAkB5H,SAAQ8H,cAE9B8gD,IAAA,QAAAD,CAAA,GAEAC,GAAa1jD,MAAAA,CAKT,EAAA,CACE0jD,OAAAA,GACF,gBAAA5oD,IAAAA,GAAA,SAAAA,GAAA,SAAAA,GAAA,QAAAA,GAAA,QAAA,CACF,EAEE2H,EAAQ21C,EAAA,OAAA,GAAA1zB,IAAA,WAAA89B,EACR9/C,GAAwB5H,GAAaA,IAAE+H,CAE3CshD,GAAAlB,GAAA,EAAA,EAEA7G,EAAM+H,SAAAA,SACJ/L,CACF,IAAMgM,EACJ,SAAID,QACJ/H,CAAAA,CAAgC,EAAA,CAC9BhuC,GAAK+1C,CAAA,CAAA,EACLh9B,GAAUnnB,GAAA,IAAAokD,GAAA,CACZ,OAAC,GACH,gBAAeD,IAAAA,GAAAA,SAAsBrpD,GAAA,SAAAA,GAAA,QAAAA,GAAA,QACrC,CAAA,EACE2H,GAAQzG,EAAA,EACR0G,CAAAA,OAAuCG,EAAW/H,IACnDupD,GAAAlhD,GAAA,CAAA,CAaD,gBAAA05C,GAEA,eAAOM,GACP,WAAAJ,EACG,IAAEF,CAAiBM,GAAAA,GAAAA,QAAAA,CAAgBJ,MAAAA,EAAAA,KAAAA,OAAAA,CAAAA,GAAWuH,GAAM,QAAA,OAAAC,CACnD,CACEnH,GAAMmH,EAAW1H,EACjByH,IACFrB,GAAA,EAAA,CAEA,EAAA,CAAA7F,GAAgB6F,EAAA,CAAA,EACdA,CACF,qBAAAxE,EAAA,EAEDrB,GAAAA,CAEH,cAAAhB,EAAQqC,gBAAAA,uBACN,EAAA,EACErC,EAAAA,EAAAA,EACAE,IAAAA,CACAC,EAAAA,SAAsB,SAAA,CAExB8H,IAAAA,CAGFpoD,CAAAA,EACEmgD,GAAAA,EAAclgD,CAAkB,EAAA,CAAA,CAAEkS,EAAK,MAAGqjB,GAAAz1B,EAAA,EAAA,EAC1CinD,EAAAA,IAAc,CAChB,GAAKxxB,GAAA,QAAA,CACLA,GAAMA,WACNx1B,MACE,CACEw1B,GAAoB2mB,GAAA,SACpB6K,GAAA,SAAA,EACFV,EAAA,CAAA,CAAA,GAEEU,GAAAA,EAAUuB,CACVjC,EAAAA,CAAAA,EAAWL,CAAA,CAAA,EAAA,MACbuC,GAAAzoD,EAAAmmD,CAAA,EACAc,EAAAA,IAAc,CACZX,GAAAA,UAAkBJ,IActBuC,GAAMA,UACNxoD,EAAU,CAAA,CAAA,EAENwoD,EAAAA,CAAAA,CAAAA,CAAAA,EACAlC,MAAAA,GAAWp/C,GAAA,MAAA,CACb,iBAAAuhD,GAAA,EAAA,EACEvC,KAAK,CAET,MAAMwC,GAAAA,UACJ,iBAAOvI,EAAA,OAAA,EAAA,gBAAA,OAAA,GAAEsI,EAAAA,SAAmB,aAAAtI,EAAA,QAAA,UAAA,KAAAsI,IAAA,OAAA,WAAA,CAAAE,GAAA,GAAA,CAAAC,GAAU5B,GAAO,EAAA,UAIJhlD,GAErCu7C,KAEasL,EAAAA,CACbF,KAAcA,EAAa/jD,EAAA,SAAA,WAAA,CAAA,EAC3BgkD,GAAAA,EAAAA,EAAAA,OAAAA,GACDE,IAAA,CACD,GACElkD,GAAAA,CAMAvE,MAAAA,GAAY,KAAA,IAAA,EAAkB2B,GAAeuD,SAC7CyhD,CAAAA,GAAc,SAAA9nD,GAAA,IAAA,IAChBwpD,GAAO,CACLroD,iBAAY,EACZ,CAAA,CAEEA,MACAmmD,GAAW,QAAI,KAAA,IAAA,EAEnBzlD,EAAA+nD,EAAA,CACF,EACA,CAAC9mD,KAAgC4C,EAAWW,oBAC9C,CAAA,EAEA/B,MAA8B1C,GAAA,CAAAylD,EAAAV,GAAA3E,GAAA,EAAA,GAAA,IAAA,EAC9BthD,EAAAA,GACGkB,SAAY,CACX,MAAIA,EACF,SAAM5B,EAAAA,MAAWmL,CACjB,GAAI,GAAC0+C,CAAAA,QAEHL,MAAAA,kBAAmB9B,EAAA,6BAAA,EAAA,GAAA,IACjB6B,IAAAA,CACFtI,EAAC,QAAA5wC,GACH+3C,GAAA,QAAA/3C,GACF04C,GAAO,QAAA14C,GACLw5C,GAAAA,QAAe9oD,GACjB+oD,GAAA,QAAAz5C,EACAxO,EAED0C,SAAAA,KAIHD,QACEklD,IAAAA,CASA/gD,YAAeshD,GAAAA,OAAQ,QAAA,oCAAA,GAAC/mD,WAAOwhD,IAAAA,CAAch8C,GAC3C,QAAA,OAAA,MACW,CACTO,EAAO,GAAA,CAILk4C,EACAmH,SAAKrnD,EAAAA,MAAUsP,CACf04C,MAAKhoD,qBACLipD,SAAKjpD,CAAAA,EAAUsP,SAAAA,CACfy5C,IAAO/oD,GACT,QAAApB,IAAA,CACSA,GAAA,OAAA,QAAA,WAAA,KACO,SAAA,SAAA,OAMZsC,SAAW,QACTknD,CAAAA,CAEF,EACF,WAAAxpD,IAAA,CACFA,GAAA,OAAA,QAAA,WAAA,GAAE6I,GAEF,EAAA,CAA+BA,EAE3BE,MAAKygD,IAAAA,UAAAA,UAAAA,GAELvgD,SAAUjJ,CAAAA,EAAM,MAAA,CACd,MAAOmK,cACLm3C,SAAAA,CAAAA,SAAgC,MACzB,cAAA,SACLj1B,CAAAA,EAAUi5B,GAAA,CAAA,CAAA,EAAA2B,GAAAn+C,EAAA4T,GAAA,CACX,GAAA,IACH,MAAA,2BACF,SAAA5T,EAAAS,EAAA,MACavJ,OACNA,KAAEmK,IACLg+C,IAAAA,EAEJ,CACOv+B,GAAAA,QAAoC,CAE3C,CAAW,CAAa/gB,CACtB,CAAKO,CAAAA,CAAM,CAAA,EAAaP,IACtBC,GACiBA,EAAA,KAAQm+C,CAGlB,SAAI96C,CAAA,CAAA,GAAI/C,EAAAA,MAAM,CAAA,MAA0BP,cACtC,SAAM,CAAA,CAAAq+C,GAAAA,CAAA,CAAA,CAAA,CAAY,CAAA,EAAAmC,GAAOpkD,EAAAA,SAAAA,CAAAA,MAAAA,4BAAAA,KAAAA,SAAE,QAAAqkD,GAAA,SAAM,CAAAxgD,EAAAS,EAAA,CAAA,KAAC,UAAA,CAAA,EAAC,IAAET,EAAAgC,EAAA,CAAC,GAE9C,QAAA,CACE,CAAA,CACwC,CAAA,CAAA,CAAKqB,CAAAA,EAAK,CAAK,CAAAg7C,GAC5Dr+C,EAAA,MAAA,CAAA,MAAKM,kBAAMwgB,IAAA,UAAA,UAAA,EAAA,GAAA,SAAa/gB,CAENq+C,CAAAA,EACZ5J,EAAA,OAAA30C,EAAAC,EAAA,CAAA,SAEPygD,CAAAA,EAAAA,KAAAA,CAEGjgD,MAAM,YAAAi+C,EAAA,YAAAA,CAAA,GAAA,EAAA,GACNr+C,SAAK,CAAAs0C,EAAA,IAAAhmC,IAAAxO,EAAAwhD,GAAA,CACLrhD,OAAAA,GAA4BJ,SAAAA,EAEtBW,UAAAA,EAAiB,cAAAq7C,EAAE1hD,KAAAA,EAAwB,iBAAAmkD,EAEpD,gBAAAC,EAEAJ,WAAAA,CACD,EACE/9C,GAAO,GAAAkO,IAAkBsS,QAAAA,CAAY,CAAA,EAAAoT,OAA0B,YAAAqqB,IAAA,QAAA,KAAA1+C,EAAAC,EAAA,CAAGC,SAEjEs+C,CAAAA,EAAAA,KAAAA,CAGF7J,MAAM/5C,CACPsF,OACEF,MAAA,WACG20C,EAAMhyC,GAAKgM,CAERA,SAAAA,GACA7U,WAAAA,CAAAA,CACAqkD,CAAAA,CAEAjC,EAAAA,EAAAA,KAAAA,CAEAwC,MAAAA,CACAC,OAAAA,MAAAA,EAEAS,SAAAA,EAAAA,GAAAA,CAJKzwC,SAAYA,GAUjBzO,WAAAA,CACE,CACE2B,CAAO,CAAA,CAAA,CACG,CAAA,EAAA,CACV,CAAA,EAAAof,IAEA9gB,YAAOk0B,EAAAl0B,EAAAi1B,GAAA,CAAA,KAAClG,EAAQ,QAAA,WAACkwB,WAAAA,OAAAA,OAAAA,GAAAA,SAAAA,SAAyBwC,IAAA,CAE5CzhD,IACE0B,GAAO,CACG,EACV,SAAE3B,WAEDg1B,CAAM,KAAChG,SAAQ,MAACkwB,cAAAA,QAAyB,IAAAI,GAAA,EAAC,MACxC,CAEP,eAAA,KAAA,WAKM7G,EAAAA,EAAclgD,CACpBqO,GAAAA,QAA0C,EAExC,CAAA,CACE04C,CAAAA,EAAAA,EAAAA,IAAAA,CAAU,MACZ,yBACF,SAAAr/C,EAAAgC,EAAA,CAAEjC,GAAAA,QAEF,CAAA,CACO,CAAA,EAAA,CACC,CAAA,EAAA+gB,cACSu+B,EAAU,KAAA,CAAA,MACzB39C,WAAO,SAAEggD,MAAAA,KAAAA,CAAgB,OAAM,CAAA,CAAA,EAAA,IAAE3hD,CAAAA,GAAAA,SAEjCiC,QAAAhC,EAAA,MAAA,CAAA,MAAA3F,CAAA,OAAwB,MAAA,CAClB,CACF,EAER2F,EAAA,KAAA,CAAGM,SAAMN,EAAA+0B,GAAA,CAAwBh1B,YAC/B1F,WAAAA,CAAA,CAAsB,CAAA,EAExBwN,EAAA,CAAA,CAAA,CACJ,EACAiZ,IAAY,SAAAA,IACd,SAAA9gB,EAAA,IAAA,CAAIM,MAAM,WAAUP,SACjB+M,CAAW,CAAA,EAAErS,IAAQ,SAAAoF,EAAA,IAAA,CAAE,MAAO,WAE3B,SACS,CAAAk+C,EAAA/9C,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,SAAA,CAAA,KACL2K,SACF,QAAA,IAAA00C,GAAA,CAAA7K,EAAA,MAAA,EACD,SAEDx0C,EAAAgC,EAAA,CAAAjC,GAAAA,QACS,CAAA,CAAS,CAAA,CAAA,CAACk/C,CAAAA,CAAAA,CAAyB,CAAA,CAGhD,CAAA,CAIqB,CAAA,CAAS,CAAYnB,MAAAA,GAE7Ch9B,GAAY,CAAA,CACX,OAAAtS,EAAS,SAAA7U,EAIP,UAAAqkD,EAA4D,cAAAjC,EAC1D,KAAAwC,EAAA,iBAAAC,EAAuB,gBAAAC,EAChB,WAAAQ,CAEZ,IAAA,CACE,KACF,CACiB,EAAAjiC,CAE5B,EAAA9jB,GAAA,EAEMsoD,CAEFhzC,GAAAA,EACA7U,OAAAA,EACAqkD,MAAAA,EAAAA,KAAAA,EAEAjC,QAAAA,CAAAA,EACAwC,EACAC,IAAAA,EAAAA,IACAC,MAAAA,EAAAA,GAAAA,IAAAA,EACAQ,EAAAA,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAAA,MAAAA,CAAAA,GACF,GAAMzK,EAAA,CACJ,IAAMmN,EAAAhL,GAAAnC,EAAAuH,CAAA,EAAE9iD,EAAAA,GAaI,GAbDC,IAAA,SACXR,EAAQomD,GAAM,EACFrkB,CAAU3c,GAAAA,SAAQ02B,OAAAA,CAAOt0C,EAAAA,EAAAA,MAAAA,CAAM27C,CAC3C,EACMjN,IAAAA,WACNvrC,EAAY1J,EAKNgoD,CACAt+C,GAAAA,QACJ,CACEA,GAAQnD,IAAA,UAAAA,IAAA,SAAA,CAAA,MAAA5F,EAAA,IAAA,IAmBN,GAnBMqnD,OAAOA,CAAAA,EAAOlnD,IAAAA,CAAAA,MAAMmnD,EAAA5R,GAAAjkC,EAAA,SAAAgwC,CAAA,EAG3B8F,EAAA7R,GAAA96B,EAAA,SAAA6mC,CAAA,EAEqB,OAFpB6F,GAAAA,GAAA,SAAA,QACJE,EAAoB,IAAA/1C,EAAA,EAAU,EACvBiR,GAAAA,GAAAA,SAAAA,QAAG8kC,EAAA,IAAA5sC,EAAA,EAAA,EAAc0sC,GAAA,CAAAC,EAAC,EAEnBE,CAAAA,GAAa7hD,EACf6hD,GAGK9sC,CAOL,CAAA,EACA6sC,EAAkB9R,MAAAA,EAAW96B,CAE3B4sC,MAAAA,EAAiB35C,CAAAA,EACnB0nC,EAAA,CAAA,EACA8R,EAAIE,QAAAA,GAAaA,CACfC,EAAqB5sC,IAAI+8B,EAAA,EAAA,EAC3BpC,EAAA,KAAAoC,CAAA,EAEE+P,EAAO,KAAA/P,CAAA,CAET,CAAA,EACE,MAAAgQ,EAAO,CAAA,EACT,QAAAp6C,EAAA,EAAAA,EAAAgoC,EAAA,OAAAhoC,GAAA,EACAo6C,EAAO,KAAA,CACR,SAAA,GAEGH,MAAAA,UAAyBj6C,EAAG,CAAA,CAC9B,CAAA,EAGA85C,IAAiB,OAAAM,CAAA,CACjBN,CACE,OAAA3hD,EAAI8hD,KAAAA,CACFjS,MAAAA,yBAAkB,SACb7vC,EAAAkiD,GAAA,CACLF,MAAAA,EACF,MAAA,GAAA9hD,CAAA,YACD,SAAAyhD,EAAA,IAAA1P,GAAA,CACD,MACA,cAEIkQ,QAAUC,EACV3iD,SAAAA,CAAuC,EACxCwyC,EACH,GAAAkQ,EACAR,OAASK,EAAAA,MACX,MAAA,wCAGE/P,EAAA,MAAA,IAAAoQ,GAAA,CAAuC,KAAA,IACpCH,EAAe7+C,OAAAA,EAAwBnD,QAAIoiD,CAAA,EACzCX,EACOY,EAAAC,GAAA,IAAAC,EAAMhoB,GAAAA,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAAA,MAAAA,CAAAA,GAAU3c,OAAAA,IAAAA,EAAAA,IAAQ+9B,EAAAA,GAAAA,CAASsG,MAAAA,yCAAalQ,GAAAA,GAChDkQ,SAAUnE,EAAAh+C,EAAA+0B,GAAA,UAEV0tB,EAAmBniD,SAAAA,EAAoCP,KACpDkyC,GACC,CAAA,EAAMjyC,EAAA+0B,GAAA,CAAE16B,OAAIogC,EAAU3c,SAAAA,EAAQ+9B,KAAAA,GAAAA,CAAQ,CACtC,CAAA,CACA,CAAA,CAGA,EAAA6G,GAEO,MAAAC,EACGC,GAAA,IAAAF,EAAAG,EACFtwC,EAAAA,IAAAA,CAAAA,MAAAA,CAAAA,GAAAA,MAAAA,CAAAA,GAAAA,OAAAA,IAAIxS,EAEPi+C,IACQh+C,EACLy6B,KAAAA,CAAUA,SACV9gC,EAAAA,GAAAA,CAAAA,MACAgH,yCAAK,GAAGkiD,EAGH,SACLr0C,EAAQyjC,EAAAA,GAAAA,CAAAA,SACRt4C,EAAAA,SAAAA,EACK,KACN,IACF,kBACG,GAET,kBAAA,GA5BM8gC,WAAAA,CA6BL,CAER,EAAAz6B,EAAA+0B,GAAA,CAEM6Z,OAAAA,EACAr8B,SAAAA,WAIN,kBACE,GAAAxS,kBACO,GACHO,WAAAA,CAAM,CACNyB,CAAIwQ,CAAAA,CAGK,EAAAmwC,CACLjoB,CAAUA,CAAAA,CACV9gC,CAAAA,CACK,EAAA,YACLmpD,CAAAA,EAAAA,CAAiB,CACA,MAAAC,EAEjB9D,EAAAA,OAAAA,EAAAA,OAAAA,EACD,IAEDj/C,CAAAA,EAAC+0B,IAAM,CAAA,KAAA,CACGkd,GAAAA,EACRt4C,iBAAAA,CACK,EAAAs4C,EACY4Q,EACjBG,EAAAA,IAAAA,CAAiB,MAAAN,CAAA,GAAA,MAAAA,CAAA,GAAAO,EAEjBhE,EAAAA,GAAAA,EAAAA,EAAAA,OAAAA,EAAAA,EACDhN,EAAA,WAAA,CAAA,CAAAA,EAAA,YAAAiR,EAEC,CAAAC,GAAAC,GAAAv7C,EAAA,GAAAk7C,GAAAE,IAAA/iD,IAAA,UAAAA,IAAA,gBAAA,CAAAijD,GAAA,CAAAxB,EAAA95C,EAAA,CAAA,EAAA,kBAAA,CAAA85C,EAAA95C,EAAA,CAAA,EAAA,kBAACw7C,EA1BA5oB,IA2BL,EAEP6oB,EAAAz7C,IAAA85C,EAAA,OAAA,EAAA,OACa3hD,EAAA,KAAA,CAAC,MA3EV,wDA4ELE,CAAA,4BAAAmjD,EAAA,QAAAC,EAAA,MAAA,QAAA,IAAAH,EAAA,4BAAA,EAAA,GAER,SAAAnjD,EAAA4T,GAAA,CACMmvC,MAAAA,4BACN,GAAOpB,EACL,SAAMuB,EAAAljD,EAAAujD,GAAA,CAAM9oB,OAAAA,EAAU0oB,SAAAA,EAAqBlR,cAAAA,CAC3C,CAAA,EAAM1/B,IAAiBwiB,GAAIp7B,CACrBspD,SAAAA,EACAG,SAAAA,EACAF,kBACFC,EAQEE,iBAAAA,CAEN,CAAA,IACEtuB,GAAA,CAEEz0B,OAAO2xC,EAEmDlyC,SAAAA,EAEpDO,kBAAMgjD,EAA4BvhD,iBAAAA,CAEd,CAAA,CACZkwC,CAAAA,CACRt4C,EAAAA,YACAoiD,CAAAA,EAAAA,CAAAA,CAAAA,CAGK,CACKthB,MAAAA,EACV9gC,YAAAA,EAAAA,CAAAA,GAAAA,OAAAA,IACAqpD,QAAmBM,EACnB9E,EAAAA,GAAAA,CAAAA,MAAAA,gBAAAA,OAED,KAEM,SAAA/jB,EACGwX,SAAAA,CAEWqR,EAAAA,CACnB9E,EAAAA,EAAAA,GAAAA,CAAAA,MAAAA,gBAAAA,OAED,KAAA,OAAAhwC,EAEE,SAAA7U,CAGZ,EACH6pD,CAAA,SAIa,CACX,SAAOxF,EAAAA,IAEH19C,MAAM,4BACN6G,GAAAA,EAEAszB,SAAAA,EAAAA,EAAAA,GAAAA,CACA9gC,SAAAA,EAAAA,SAAAA,EAFK6pD,kBAMN1I,GACCx6C,iBAAAA,EACA6G,gBAAAA,EAEAqH,WAAAA,CAAAA,CACA7U,EAAAA,EAAAA,GAAAA,CAAAA,OAAAA,EAFK6pD,SAAAA,EAMX,kBAAA,GAEA,iBAAAhF,EACEz+C,gBAAAA,EACQO,WAAAA,CAAM,CAA4ByB,CAAIwQ,CAAAA,CAEjC,EAAAixC,CACL/oB,CAAAA,EAAAA,CAAAA,EACA9gC,IAAAA,CAAAA,MACAqpD,GAAAA,EAAAA,QAAiB,IAAA,IAAA,SAAA,EACjBxE,GAAAA,EAAAA,QAAAA,IAAAA,IAAAA,SAAAA,EAAAA,OACAC,IAAAA,GAAAA,EAAAA,WAAAA,EAAAA,UAAAA,EAAAA,OAAAA,EAAAA,IAAAA,CAAAA,EAEAQ,SACDiD,GAEM,CAAA,MAAA7+C,EACLmL,MACA7U,EAAAA,SAAAA,CACiB,EAAA,CACjB6kD,KACAC,CAAAA,EAAAA,CAEAQ,EAAuB/lD,GACxB,EAECwhC,EAAAtiC,EAAA,EAvBCorD,EAwBLprD,EAAA,IAGG44C,EAAa,EAChByS,CAAAA,EAAS1S,CAASviC,EAAAA,EAAQnU,EAAUkS,EAC1ClU,OAAAA,EAAMqrD,IAAS1S,CACf,WACEyS,KAKNE,EAAA,EAAA,CAEA,EAAA,CAAA,CAA0BtgD,EAAAA,CAAAA,CAAAA,EAAcd,EAAAA,MAAAA,CAAWxC,MAAAA,mBAAAA,CAAAA,GAAY,SAAA,CAAAF,EAAA,SAAA,CAC7D,SAAM,CAAAG,EAAA,KAAA,CAAE/G,SAAAA,CAAAA,CAAGC,EAAAA,EAAAA,OAAA,CACLwhC,YAActiC,SAAO,qBAIpBwrD,MAAQD,eACftrD,QAAgB,IAAA,CACdmB,MAAWiR,EAAM,KAAA,IAAA,IAAAiwB,EAAA,SAAA,WAAA,GAAAW,GAAA,EAAA,EAAA,IACfsoB,EAAc,SAAA,SAAA,CACZ,KAAAl5C,EACD,SAAA,QAEL,EACOnK,EAAsCP,SACzCF,EAAAY,EAAA,CAAAV,KACEC,eAAAD,IAAAA,EACAA,CAES8jD,GAAAA,QAAAA,CACA,CACC,EAGJ,CAAA,EAAA,IAAA7jD,EAAMyK,SACCgQ,CAEPigB,IAAAA,EAA8B,KAC5BjwB,SAAAA,MACA8Y,eAAU,QACX,IAAA,CACH,MAAA9Y,EAAA,KAAA,IAAA,IAAAiwB,EAAA,SAAA,WAAA,GAAAW,GAAA,EAAA,GAAA,GAAEt7B,WAEG,SAAA,CAACW,KAAAA,EAAoBE,SAAGkjD,QAAAA,CAAAA,CAAAA,EAAE,SAAA9jD,EAAAS,EAAA,CAAA,KAAU,gBAAC,IAAAqjD,EAClC,CAEHC,GAAAA,QAAAA,CACA,CACC,EAGJ,CAAA,CAAA,CAGArpB,CAAAA,CAAAA,CAA8B,CAAA,EAAA76B,EAC5B4K,KAAAA,CAAAA,IAAAA,EACU,SACX,CAAAzK,EAAAi1B,GAAA,CAAA,MACH,yBAAA,SAAEl1B,GAEDU,CAAKC,EAAK,UAAAmjD,EAAA,QAAA,SAAApC,EAAA,CAAmBqC,CAAAA,EAAAA,EAAAA,CAAAA,EAAAA,GAAAA,EAAAA,MAAAA,CAAAA,EAAAA,EAAAA,GAAAA,CAAAA,MAAE,yBAAA,SAAAzpD,GAAA,CAAM0pD,EAAA,UAAAA,EAAA,QAAA,SAAAtC,EAAA,CAAC,CAAA,CAAA,CAAG,CAAA,CAAA,CACnC,CAAA,CACJ,CAET,SAAIxhD,GAAKy6B,CAAAA,OAAAA,EACA,SAAA/gC,EACC,cAAAoiD,CAEJ,EAAA,CACoC0F,KACtC,CAAA,EACDuC,CAGM,EAAA9qD,GACC,EACNoc,EAAWmsC,GAAW5nD,CAAA,EACpB,CAA0D4nD,GAAAA,EAC5D,WAAAlG,EACA,SAAAC,CACC,EACFhtC,EAETy1C,EAAAlhD,GAAAyL,CAAA,EAEAkpC,EAAS6L,GAAAA,EAAAA,CAAsB,EAAE/0C,EAAAA,GAAAA,EAAAA,SAAAA,CAAAA,EAAQ7U,OAAAA,EAAAA,UAAAA,CAAUoiD,MAAAA,yBAAAA,IAAAA,SAAAA,oBAAAA,EAAAA,GAAiB,SAAA,KAClE,SAAM,CAAA/7C,EAAA,MAAA,CAAE/G,MAAAA,gCAAGC,SAAAA,EAAAgrD,GAAA,CACLjnD,MAAAA,qBAA+By6C,CAAA,CACrC,CAAA,CAAM,CAAEr9C,EAAAA,EAAAA,MAAAA,CAAIkhD,MAAAA,kBAAYC,MAAAA,EAAahtC,KAAAA,EACrC,IAAMy1C,OACN,SAAarU,GAAcj2C,GAAQ,SAAA,OAAAqG,EAAA,IAAA,CAC7B+vC,MAAAA,8CACN,MACEA,GAAA,WAAA,GACEzvC,SAAOyvC,GAAA,UACLwL,EAAAA,EAAe,CAEjBp3C,GAAS,SAAIpE,OAEbC,CAAKM,EAAMyvC,EAAA,SAAA,EACIzvB,WAAOrjB,CAAsC,EAAA+C,EAAA,OAAA,EAAA,EAE5DA,EAAAA,EAAA,OAAA,CAAA,CAAA,CAAA,CACQ,CACNqD,EAAO4gD,EAAAA,OAAAA,CACP5vC,SAAMmnC,EAAAA,EAAAA,CACF,GAAA,QAAA,CAAMz7C,CAGR,CACEO,CAAM,CAAA,EACN+C,IAAmB8gD,CAAgBpkD,SAElCgwC,CAAAA,EAAYoU,EACXnkD,WAAAwO,EAAA,aAAA3O,EAAAC,EAAA,CAAAzF,SAAA,CAAA,IAAA2F,EAAA,OAAA,CAAA1F,MAAA,gBAAAsJ,SACgCmsC,EAAWoU,EAAAA,CAAS,KAAA,YAAAxgD,KAAAA,IAAAC,IAAlD5D,EAA0D,CAG5D,GAAA,QAAA,CACE,CAAA,CAAsB,CAAA,CAClB,CAAA,CAAA,CAEP,CAAA,CAEH,CAAA,CAGI,CAAA,CAAA,CAEE,CAAA,CAAY,CACL,SAAAghD,IAAM,CAAA,MAAA,CAAA,CAAA,SAAiB,cAAA,sCAAA,CAAA,CC97B9C,MAAMt1B,GAAQ,GACR04B,GAAW,KACXC,GAAiB,GAAGD,EAAQ,MAE5BE,GAAqBC,GAAI,IAAM,CACnC,GAAI,CACF,MAAM9iB,EAAQrrC,SAASq5B,cAAc,OAAO,EAC5CgS,OAAAA,EAAM+iB,aAAa,OAAQ,OAAO,EAC3B/iB,EAAMvhC,OAAS,OACxB,MAAY,CACV,MAAO,EACT,CACF,CAAC,EAED,eAAeukD,GAAiB9qD,EAAU,CACxC,KAAM,CAAED,MAAAA,CAAAA,EAAUyB,GAAI,CAAExB,SAAAA,CAAAA,CAAU,EAMlC,MAAO,CAAC,EALQ,MAAMD,EAAMmwB,GAAGC,OAAO5vB,KAAK,CACzC6vB,EAAG,UACH7pB,KAAM,WACN/F,MAAO,CAAA,CACR,IACiByC,UAAUnC,MAC9B,CACA,MAAMiqD,GAAkBnoD,GAAKkoD,EAAgB,EAE7C,SAASE,IAAkB,CACzB,KAAM,CAAE3wC,KAAAA,EAAM/a,EAAAA,CAAAA,EAAGC,GAAAA,EACX+D,EAAaC,GAAYrD,CAAM,EAC/B,CAAEQ,GAAAA,EAAI,GAAG/D,CAAAA,EAAWsuD,GAAAA,EACpB,CAAC/R,EAAcC,CAAe,EAAIC,GAAAA,EAClC8R,EAAQhS,EAAal/B,IAAI,OAAO,EAChCmxC,EAAiB,CAACjS,EAAal/B,IAAI,SAAS,EAC5CoxC,EAAgB,CAAC,CAAClS,EAAal/B,IAAI,QAAQ,EAC3CqxC,EAASnS,EAAal/B,IAAI,QAAQ,EAClCmoB,EAAQ,CAAC,CAAC+W,EAAal/B,IAAI,OAAO,EAClC,CAAEja,MAAAA,EAAOC,SAAAA,EAAU8f,cAAAA,CAAAA,EAAkBte,GAAI,CAAExB,SAAUrD,EAAOqD,QAAAA,CAAU,EACtE,CAAED,MAAOouB,EAAcnuB,SAAUouB,CAAAA,EAAoB5sB,GAAAA,EACrD8pD,EAA0B7sD,EAAAA,EAE1B8sD,EAAkB,CAACL,EAAOC,EAAgBC,EAAeC,EAAQlpB,CAAK,EACtE,CAAC3pB,EAAS4O,CAAU,EAAI1nB,EAAAA,EACxB8rD,EAAkB/sD,EAAO,CAAC,EAChCC,EAAU,IAAM,CACd8sD,EAAgB7sD,QAAU,CAC5B,EAAG4sD,CAAe,EAElB,MAAMjG,EAAa9qC,GAAQ,IAAM6qC,GAAAA,EAAwB,CAAA,CAAE,EAErDryB,EAAsBxY,GAC1B,IAAMxa,IAAaouB,EACnB,CAACpuB,EAAUouB,CAAe,CAC5B,EACM,CAACq9B,EAAeC,CAAgB,EAAIhsD,EAAS,EAAK,EACxDhB,EAAU,IAAM,CAGTs0B,GACAxa,GAASyN,OACb,SAAY,CACX,MAAM5a,GAAU,MAAM0/C,GAAgB/qD,CAAQ,EAC9CjB,EAAYsM,EAAA,CAAA,GAAA,CAAEA,EAAAA,CAAQrL,EAACgzB,EAAAxa,GAAA,IAAA,CAAA,EACvBkzC,eAAAA,EAAwBx3B,GAAA,CAC1B,MAAGy3B,EAAA,iBAAA,KAAAT,CAAA,EACDlrD,GAAUgzB,GAAAA,QAAqBxa,GAAAA,IAASyN,IAAKwkC,GAEjD,GAAAkB,OACE,GAAMA,CAAAA,EACN,gBAEM,KAACnzC,EACH,EACS,KACPsiB,CAAAA,GAAM8wB,EAAA,EAAAV,EAAA,MAAA,GAAA,EACRW,GAAA,SAAAD,GAAA,EAAA,EAAA,EACFE,GAAA,IAAA,KAAAC,GAAAF,GAAA,CAAA,EACMG,GAAQJ,GAAME,GAAIZ,YAAY,CAAG,KAAAY,GAAA,WAAA,GAAA,SAAA,EAAA,SAAA,EAAA,GAAA,CAAA,IAAAA,GAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,GAAA,CAAA,GACjCD,GAAAA,IAAa5qC,KAAAA,GAAS2qC,GAAc,EAAA,CAAA,EAQpCE,GAAY/iD,GAAAA,GAAKgjD,kBAAoBE,GAAA,WAAA,GAAA,SAAA,EAAA,SAAA,EAAA,GAAA,CAAA,IAAAA,GAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,GAAA,CAAA,GAC3C,IAAAzrD,GAIA0zB,IACA1zB,GAAM0rD,GAAY,EAGlBntD,EAAY,QAAA,IAEVgtD,GAAAA,GAAAA,EAAAA,QAAAA,EACAH,EAAAA,SAAAA,IACAC,MACAC,GAAAA,MAAAA,EAAAA,GAAAA,OAAAA,KAAAA,CACAG,EAAAA,QAAAA,EAAAA,IAAAA,UAAAA,EAAAA,WAAAA,EAAAA,GACAD,KAAAA,WACAE,MAAAA,GACD,OAAAV,EAAA,OAED,CAAA,EACA,GAAIt3B,IAAW,UAAA,OAAA,CACb1zB,MAAAA,GAAQuxB,GAAQ,SAAA,MAAA,EAAAA,EAAA,EAChBy5B,GAAAA,QAAgB7sD,IAAAA,CAClBy/C,GAAO9F,GAAAt4C,CAAA,CACLQ,CAAAA,EACAgrD,MAAAA,EAAAA,GAA2Bz5B,SAAAA,QAAAA,GAC7B,MAAA,CAEA,MAAMo6B,QACDC,CAA0D,CACvD,KAENC,QACD,MAAA,CAAA,EACGF,KAAAA,EACF,CAEE/N,CAAyB,IAC3BnuB,GAAC,CAAA,EACD,GAAAiE,GAAM4G,CACN,KAAA,CAAO,MAAEl6B,EAAAA,EAAOk6B,MAAAA,EAAAA,GAAAA,SAAAA,QAAAA,CAAAA,EAAAA,SAAAA,KAAAA,CAAK,OAAA,EAAA,CACvB,EAAA,OAAO,EAAA,KAAA,EACL,GAAAwxB,IAAO,QAAA,CAAAjB,GAAA,CAAAlpB,EAAA,CAAA,SAASmqB,GAAA,IAAAz3C,KAAIimB,GAAMjmB,GAAA7U,CAAA,EAAK,CACjC,GAAA6U,GACF,QAAA,EAEA,EACIqf,EACF,GAAMq4B,GAAA,QAAA,EAAA,CAAE3rD,MAAAA,GAAAA,GAAAA,IAAAA,IAAAA,GAAAA,EAAAA,EAAUqvB,GAAMlwB,KAAMM,CAG1BmsD,GAAQC,GAET9rD,MACAE,GACCD,KAAOE,QACT,CAAA,CACEs9C,MACAnuB,GAAO,KAAA,GAAAs8B,EAAA,CACF13C,CACM,EAEbqf,IAAC,CAAAo3B,EAAA,WACDA,UAAgCvrD,EAAA,GAAA,SAAA,QAAAW,CAAA,EAAA,SAAA,KAAA,CAC9B,MAAAqxB,GACA9B,gBAAak7B,EAAA,gBACPsB,EAAAA,WACGF,GAAAA,OAAAA,OAAAA,CACD,CAAA,EAAA,OACP,GAEDt8B,KAAAA,CAA8B,MAAArvB,GAElC,KAAAk6B,EAAA,EACF,MAAAwwB,EAAA,QAAA,KAAA,EACA,GAAIp3B,IAAAA,OAAco3B,CAChBA,GAAAA,CAAAA,GAAAA,2BAGI9qD,GAAOuxB,OAAAA,CACP7uB,IAAAA,GAAiBioD,CAAAA,EACjBhoD,GAAAA,CAAAA,GAAiBioD,OAAAA,YACItmD,GAAAA,CAAAA,EAAAA,GAGtBnE,GAAOsvB,GAAA,OAAApb,IAAAA,GAAA,OAAA,EAAA,IAAAA,IAAAA,GAAA,EAAA,EAEN43C,GAAA,MAAAC,IAAA9rD,GAAA,KAAAiU,IAAAA,GAAA,KAAA63C,EAAA,CAAA,IAAS5xB,GAAAA,CAAAA,EACXl6B,CAKAqvB,WAAYnvB,EAAAA,EACVF,GAAA,aACAw9C,GAAInuB,GAASjwB,CAAGuG,CACdkmD,CAAAA,CAA+B/rD,CAE/B+rD,MAAAA,CAE4B,MAC9Bx8B,GACA,KAAA6K,EAGA,CAEE7K,CAAU,KAAA,CAAA08B,EACZC,CAAA,EAAAltD,EAAA,CAAA,CAAA,EAAA,IAAAgK,EACFlH,EAGFytB,CAEArvB,GAAAA,QACEw9C,CAAyB,EAC1B,GACH5lC,GAAA,KAAA,CACA,MAAAq0C,IAAO,IAAA,KAAAr0C,EAAA,IAAA,EAAA,GAAA,KAAAA,EAAA,KACL5X,EAAOqvB,GAAAA,YAAAA,GAAAA,EAAAA,WAAAA,KAAAA,EAAAA,IAAAA,GAAAA,EAAAA,GAAAA,GACP6K,CAAAA,EACFpxB,EAAAlH,EAGI,CACFkH,GAAKlH,SAAAA,OAAAA,CAAG,eAAAsqD,CAAA,CAAA,CAAe,UACd7mC,EACXvc,EAAMmjD,EAIF,CACFnjD,GAAKlH,SAAAA,OAAAA,CAAG,eAAAsqD,CAAA,CAAA,CAAA,UAAkBzB,EAAA3hD,EAAalH,GAEvCkH,GAAKlH,SAAAA,OAAAA,CAAG,eAAAsqD,EAAApsD,OAAAA,CAAA,CAAA,CAAAosD,UAA8B3qB,EAACz4B,EAAAlH,EAEvCkH,CAAKlH,GAAAA,SAAG,OAAA,CAAA9B,eAAAA,CAAA,CAAA,CAAAosD,UAA8B5B,EAAA,CAAA,MAAE6B,GAAA,IAAA,KAAA7B,CAAA,EAAA,eAAA7wC,EAAA,OAAA,CAAC,MAAA,qBAEzC3Q,CAAAA,EAAKlH,EAAAA,EAAG,CAAA7B,GAAAA,SAAA,OAAAmsD,CAAkB,eAAAA,EAAS,UAAAC,EAAA,CAAC,CAEpC,CAA8D,MACrDrjD,EACDojD,CAERpjD,CAAKlH,GAAAA,EAAAA,mBAAAA,EAAAA,MAAGwqD,EAAApnD,GAAA,IAAAlF,GAAAA,EAAAX,CAAA,EAAA,CAAAW,EAAAC,CAAAA,CAAAA,EAAAjC,EAAAouD,IAAAA,EAAAA,SAAkBC,CAAAA,GAAc,CAAE,MAAAtlC,GAAA,MAAAulC,EAAA,EAAC5lC,EAAAK,EAAA,CAC7C,MAAO,CAAA,CACL/d,GAAAA,CAAAA,EACF,GAAA,CACF,MAAAujD,GAAA,MAAAltD,EAAA,GAAA,SAAA,QAAAW,CAAA,EAAA,aAAA,KAAA,EACAwsD,EAAgBD,EAAmB,CAE7Br6B,MAAAA,CAAAA,CAEN,GAAG,CAEHl0B,EAAAA,CAAAA,EAAAA,CAAgB,CAAA,EACd,KAAC,CACC,YAAAipB,EACE,KAAA1B,EACAlnB,OAAAA,CACAqoB,EAAAA,GAAAA,CAAAA,KACO7pB,GAAG,IAAAib,GAAA,KAAA3S,KAAA,CAAA2S,GAAA,EAAA,CAAA,EACVzZ,EAAeN,EAAA,EACjB0uD,GAAA3yC,GAAA,IAAA,CAGA,MAAI07B,GAACoP,CAAAA,GAAY8F,GAAAC,GAAAlpB,GAAA,CAAA,CAAA+oB,EACfkC,EAAI9pD,EAAA,SAAA,GAAA5C,CAAA,IAAAV,CAAA,EAAA,EACF,OAAAkG,EAAMymD,EAAAA,CAGN5tD,SAAAA,CAAAA,EAAY8zB,GAAA,CAAA,SAAA7yB,EAAE2sD,QAAcS,GAAA1sD,EAC5BksD,aAAAA,EACF,cAAA9sC,EACE/gB,cACF,iBAAA,EAAA,CACF,EAAA,CAAAumD,GAAAp/C,EAAA,MAAA,CACC,MAAA,aACDxF,IAAI4kD,EAEF,MAAA,CAAE39B,SAAAA,UAAAA,EAAmBwL,SAAAA,CAAAA,GAAAA,EAAAA,GAAAA,QAAuBnzB,CAAA,MAAAU,CAAA,GAE5CivB,MAASnV,iDAWb,CACE,EAEIxa,SAAAA,EAAAA,EAAAA,MACSotD,IACTx6B,KAAAA,IACA9S,IAAAA,EAEAkO,CAEAs3B,GAAAA,QACA,CACQ,CACD+H,CACLtlD,CAAO,EACL+oB,eAAU,EAAAzqB,EAAAS,EAAA,CACZ,KAAA,SAAEV,MAAAA,gBAIEgC,KAAI,IACJzB,IAAAA,EACKnE,CAAE,GAAA,QAAA,CAAA,CAAe,CAAA,EAAC6D,EAAA4T,GAAA,CAAC7T,GAAAA,IAAAA,CAGvBU,MAAIpG,CAAA,GAAAyqD,EAAA,aAAA,EAAA,GAAA,QAAM,IAAA,CAAInkD,GAASC,GAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAI,EAIzCqG,MAAKokD,EAAA,GAAA,YACLxkD,SAAMN,EAAAgC,EAAA,CACNrB,GAAK,QAAA,CACLC,CAAGzE,CAAAA,EAAAA,EAAAA,GAAAA,CAAAA,GAAE,IAAAxC,CAAA,MAAAU,CAAA,GAAA0qD,EAAA,GAAA,WAAA,GAAA,QAAA,IAAA,CAASA,GAAC1oD,GAAAF,MAKRgE,QACP,CACE9D,CAAAA,CAASF,EAAC,MAAA9B,EAAA,YAAA,GAAA,SAA2B2F,EAAAgC,EAAA,CAAA,GAAC,QAAA,CAAA,CACxC,CAAA,EACFhC,EAAA4T,GAAA,CACAtT,GAAAA,YAAwB,GAAAw7B,EAAK,GAAA,UAAA,GAAY/7B,QAAAA,IAEzCiC,CAAA85B,GAAuBz/B,GAAAF,MAIdgE,QACP,CACE9D,CAAAA,CAASF,EAAC,MAAA2/B,EAAA,YAAA,GAAA,SAA8B97B,EAAAgC,EAAA,CAAA,GAAC,QAAA,CAAA,CAC3C,CAAA,EACFskD,EAAA,IAAAxe,IAAA9nC,EAAA4T,GAAA,CACAtT,GAAAA,IAAQykD,CAAAA,MAAAA,CAAgB,GAAAC,IAAKld,GAAA,KAAA,GAAA,WAAA,mBAAAA,GAAA,IAAA,CAAA,EAAA,GAAY/nC,QAAAA,IAEzCiC,CAAAgjD,IAAAld,GAAA,MAAsBzrC,GAAAF,MAIbgE,SACF27B,OAAO,CACVz/B,EAAAA,GAASF,IAAAA,CAAAA,CAAC,CAAA,CAA0B,EAAC,MACvC6oD,IAAAld,GAAA,KAAA,YAAA,GACF,SAAAjoC,EAAA,OAAA,CACAS,YAAe,OAAA,CAAiBP,2BAEhC1F,SAAA,GAAA,CAAmB,EAAAytC,GAAA,IAAA,CAAA,CACf,CAEC,EAEH/lC,GAAI,EAAA,CAAIpI,EAAAA,IACNqrD,GAAehwC,IAEX,QAAW6wB,CAEjB1lC,sBAAe0kD,EAAA,YAAA,EAAA,GACb,SAAIG,CAAAA,EAAAA,EAAehwC,CACjB3Y,KAAAA,QAASF,KAAAA,GAAAA,CAAAA,EAAAA,EAAC,QAAA,CAAA,KAAA9B,QAAA,SAAAC,CAAAA,GAAA,KAAA,MAAAuqD,GAAmC7vC,GAAAA,IAAAA,GAAI,IAAC,IAAA,KAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,EAAA,QAAC9d,IAAA,CACrD,KAAA,CACF,MAAAqD,GACA+F,SAAAA,EAA2C,EAAGP,GAE9CF,cAAAE,GAAAA,CAAAA,GACE,MAAA,OAAMO,EAAM/F,GAAA,CAAoBwF,MAAAA,EAAC,EAChC+nC,EAAI9yB,EACD,KAAA,CAAA+3B,GAAAka,EAAA,EAAA1sD,GAAA,MAAA,GAAA,KAOT6qD,SACEd,GAAAA,EAAAA,EAAAA,EACe4C,GAAA,IAAA,KAAgBrC,GAAQW,EAAA,EAAmBzlD,GACvDC,EAAmBW,CACnBX,GAAA,SACO,OAAA,CACLqC,EAAW8P,GAAAA,eAASyN,EAAAA,OAAAA,CACbilC,MAAS,OACXR,KAAAA,SAAAA,EACmC,CAEtC,CAAM,CAAA,CAAE9pD,CAAO4sD,CAAAA,CAAAA,CACf,CAAA,EAGMnnD,EAAAonD,GACS7sD,CAAAA,MAER,gBACPsqD,EAAA,YAAA,EAAA,GACA,SAAO9X,CAAAA,GAAM8X,KACb,MAAAA,GAAMW,GACN,IAAAnB,GACAhoD,IAASF,IAAAA,KAAAA,EAAAA,YAAAA,EAAAA,MAAAA,EAAAA,CAAAA,EAAAA,QAAAA,IAAAA,CAAAA,KACP,CAAA,MAAA5B,GAAA,SAAA4sD,EAAA,EAAAjwD,GAAsDiwD,GACpDtC,OAAO/R,EACDv4C,GAAA,CAAA,MACPA,EAAA,EAAC,EAAA,CAAA,CAAC,CAAA,EACL,CACF,CAAA,CAAA,CACA,CAAA,CACG,EAAA,CAAAF,EAAAV,EAAA8f,EAAA6sC,EAAAK,EAAAvB,EAAA,GAAAF,CAAA,CAAA,EAAA7sD,MAGN+uD,CAAW,MAAAC,GACHL,EAAA,SAAgBnC,cAAQ,YAAgB,EAAAwC,IAC3BznC,EACbilC,QAAAA,SAAS,CAAA,SACXR,SAAAA,KACL3pC,qCAAwC2sC,GAAA,aAAA,CAAA,CAAA,CAEhC,EAAA,CAAAf,EAAE/rD,EAAAA,GAAAA,CAAAA,CAAAA,EAAAA,MAAAA,EAAO4sD,GAAAA,IAAAA,GAAajwD,IACvBiwD,UAASG,EAAO,GAAA,GAAA,SADOpwD,KAItB,CAAAib,CAAA,CAAA,EAINo1C,GACF,CAAA,CAAAp1C,GAAA,EADExY,IAAAi0B,GACF,OAAA/tB,EACDC,EAAA,CAAA,SACD,CAAAE,EAAA49C,GAAA,CAAA,MAEP,GAAAzrC,GAAA,KAAA,IAAAA,EAAA,KAAAhW,EAIL9B,CASFhC,GAAU,QAER,CACA,CAAA,GACEK,eAAYmH,EAAUwnD,KAAAA,CACtBL,MAAAA,qCACEzjC,SAAU,CAAAvjB,EAAA,IAAA,UAERqnD,EAAOG,IAEV,KAAAlmC,EACH,OAAAwL,EACEw5B,YAAclB,GAAAA,GAElB,CAAMx3B,CACJ,CAAKzb,EAAAA,EAAAA,MAAc,CACbstB,SAASrN,EAAI5zB,OAAM2T,CAClBstB,MAAAA,eACLttB,SAAQ,CAAA,IAAAyN,CAAA,CACZ,EACA,CAAM2nC,CAAAA,CAEN,CAAA,EACExnD,GAAAA,mBAGIsD,SAAAA,EAA4ClH,UAAAA,EAAG,CAAO,GAAA,QAAA,CAAC,EAErD,UACQA,EAQN,CACY,GACR8qB,QAAM3F,CACNwL,EACsBva,WACvBk1C,EAAA,UAEH,GAAA,KAAA1nD,KACE,QAAA,OAAA,eAAY9C,EAAA,SAAA,eAAA,cAAc8C,GAAO,QAAO,CAAA+kD,EAAAC,EAAAC,EAAAlpB,EAAA+oB,EAAA1yC,GAAA,IAAA,EAAA,SAAA,EAAA,UACpCtS,EAAAkT,GAAA,CACJ,OAAA,GAEN1Y,SAAG,OACHV,WAAAA,QACAmkD,SAAS3hD,SAAAA,WAAAA,EAAAA,SAAAA,CAAE,KAAA,SAAA9B,MAAA,QAA0B,SAAA2F,EAAAS,EAAA,CAAC,KAAA,OACtCs9C,KAAS5hD,IAAAA,IAAAA,EAAE,CAAsB,GAAA,QAAA,CAAC,CACtBsrD,CACZzJ,CAAS,CACTO,EACAhjC,SAAAA,CAAAA,KAA2B3d,CAC3BygD,SAAAA,CAAeyI,GACfxI,QACEwG,IAAAA,EAMF1G,SACGrrC,CACC3R,GAAM,CAENupB,KAAS,CACTorB,MAAW2R,EAAA,EACFvsD,GAAA,CACT6X,SACE4a,CAAA,CAAa,EAAexM,EAAA,MAAAsmC,GAAA,GAAA,SAAA,OAAA,CAAO3nD,OAC5B,IAAA,CAACW,EAAiB,CAAOvE,GAAAA,EAAAA,EAAAA,EAAE,SAAA,KAAA,IAAAyxB,CAAA,MAAA6jB,EAAA,EAAA,MAAA,CAAM,MAAAt1C,EAAI,CACpC,GAAA,QAAA,CAGD,GAGL,GAAC,CACC,EACE,SAAA,CAAA6D,EAAMS,EAAA,CAAA,KAAE/G,UAAAA,CAAAA,EAAAA,MAAc,QAAA,CAAA,MACpBC,oBAAUi0B,SACX5tB,EAAAgC,EAAA,CACD,GAAA,SAA2C,QAE3C,EAAC4rB,EAAA/tB,EAAAC,EAAA,CACD,SAAM,CAAA,IAAA,IAAAE,EAAA,IAAA,CAAE3F,SAAAA,GAAAA,UAAAA,CAAAA,CAAAA,CAAG,EAAI+mB,GAAAA,CACf/R,CAAAA,EAAAA,IAA2C,CAE3C3W,CAAAA,CACA0iB,CAAAA,CAAAA,CAAKjf,CAAAA,EAAAA,CAAAA,GAAAA,EAAAA,GAAAA,CAAAA,QAAC,IAAA,EAAA,SAAA,CAAA,GAA8B,CAAC,MAAAilB,GAAA,MAAA0G,EAAA,GAAA,SAAA,OAAA,CACvC,KAAA3V,EAAA,KAAA,IAAAxY,CAAA,CACC,EACL,CAAEoG,GAEFC,CAAK,EAAMohB,GAAc,SACzB,KAAA,IAAA2G,CAAA,MAAA0pB,CAAA,EAAOnxC,MAAM,CAAmBP,MAC9BC,EAAA1F,CAEGszB,GAAAA,QACC,CAEG,CAAA,CAAsC,CACzC,GAAA,CACE,EAAI,SACH,CAAA5tB,EAAAS,EAAA,CACD,KAAA,UAAA,CACA,EACRksB,IAAAA,EAAAA,QAAAA,OAEWxsB,oBACP,SAACH,EAAYgC,EAAA,CACX,GAAI,SACF,OAAMof,CAA4C,gBAAA2G,CACrBpuB,EAE7B,WAAM,CAAA,EAAEU,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CACRgV,CAAAA,CAA2C,CAAA,CAAA,CAE3C3W,CAAAA,CAAAA,CACA0iB,CAAAA,CAAKjf,EAAAA,CAAAA,EAAAA,GAAAA,CAAAA,IAAAA,EAAAA,OAAAA,CAAAA,MAAAA,eAAC,MAAA,KAAA,UAAA,CAAA,YAA8B,CAAA,OAAC,IAAAyjB,CAAA,GAAA,CACvC,CAAA,CACC,CAAA,CAAA,CACL,CAAA,CAEK,CAAM,SAAAwnC,GACXpnD,EAAA,CAAA,KAAA,CAAa,KAAAgU,CACX,EAAA9a,GAAAmB,EAAA,CAAA,MAAAkI,EAAAwlB,SAAAA,EAC4C,MAAAxtB,EAAA,IAAAkgB,EAAI,IAAAC,EAAC,QAAAb,EAC1C,IAAA,CAAA,CACD,EAAAs1B,EAGP,CAAAuW,EAAAH,CAAA,EAAAhrD,GAAA,MAAA,GAAA,GAAA,CAAA,EA/GJF,EAkHGivB,EAAAA,EAENhpB,EAAMlI,EAAA,EACNmC,EAAYotD,CAAAA,EAAU5a,IAAA,CAAA,KACpBjiB,CAAAA,EAAAA,CAAa,EAAArQ,GAAA,MAAA,GAAA,GAAA,CAAA,EACXjM,CAAAA,GAAgB,EAAAkM,GAAA,MAAA,GAAA,GAAA,CAAA,EAKxB,MAJM,EAAAqyB,EAAA6a,GACD7a,EAAA8a,GAEJ9a,IAAA6a,GAAA/C,EAAAiD,GACD/a,IAAA8a,GAAAhD,EAAAkD,EAIN,EACE,OAAMloD,EAAA,MAAA,CAAEmU,MAAAA,WAAM9a,CAAAA,EAAAuH,EAAA,CACd,KAAM,QACJH,KAAOiC,GAAAA,CACPF,EAAAA,EAAAA,SAAAA,CACA9H,IAAAA,EACAkgB,SAAAA,EACAC,MAAAA,GAAAA,WACUb,GAAM,CAAC,KAAA,CACfs1B,MAAAA,CACJ,sBAC6B,QAAA,MACvB6Y,MAAe5vD,EAAO20C,CAAA,EAAA,MAAA,CAEtBkb,MAAAA,GACE,SAAUH,SAEhB,CACA,EACI/a,EAAAA,CACAA,MAAS8a,EAAAA,GAAWhD,CAAAA,IAAQkD,CAAAA,GAAU,GAC1C,SAAO,CACT,MAAA,EAEA,CACE,CAAKznD,CAAiBP,EACdW,SAAK,CAAAV,EAAA,SAAA,CAAQW,MAAK,GACxBd,SAAAG,EAAAgC,EAAA,CACE/B,GAAKioD,QAAAA,CACL7lD,CAAAA,KACOkjD,SAAU,UACPruD,GACR,SAAM,OAAA,CAAA,EAAEqD,MAAAA,KAAOsqD,CAAM,OAAMjkC,EAC3B,EAAA,CAAA9O,EAAAjK,IAAMklC,WAAoBz0C,CAC1B,OAGI6uD,EAAAA,GAAAA,SAAU,EAAA,SAAA,EAAA,GAAA,EACD,SACT,IAAA,KAAA,EAAAt/C,CAAA,EAAA,eAAAmM,EAAA,OAAA,CACF,MAAA,MACF6F,CAAAA,CAAQ,EAAAhS,CACNtN,GAAoC,CAAA,EAAA,IACpC4sD,EAAAA,QAAU,CAAA,IAAAa,EACD,KACT,SAAA,SAAA3lD,EAEJ,MAAAqjD,GAAA,IAAA,KAAA,EAAA,YAAA,EAAE3lD,IAAAA,SAEF,EAAA,CAAA,GAAAqkD,GAAA,IAAQ7pD,GAAM,MAAA,EAAA,CAAA,GAAA,IAAA,KAAA,EAAA,YAAA,EAAA,QAAEwF,IACd,KAAA,CAAmB,MAAAgtC,EAErB/sC,SAAAA,CAAA,EAAQqC,EAAAA,cAAQtC,EAACmoD,EAAA,QAAA,MAAa,GAC7Bp7C,CAAAA,EAAW,OAAA,CAAAm7C,EAAApD,EAAA9X,CAAA,EAAA,MAAA,CAAEtyC,MAAQ,GAAOqX,UAEzBvX,MAAAA,EAAAA,CAAAA,EAIoBsf,EAAA,CACnB9Z,MAAAA,EAGI2C,GAAKqqC,CAAI,IAAEzpC,CAAAA,GAAAA,GACduhD,SAAO,CACR,MAAA,EAAA,CAEH,CACM,CAER5kD,EACAC,MAAK,CACLmC,MAAAA,OAAAA,CACuC,CAAA,CACvCoY,CAAyB2pC,CAAAA,CACuB,CAE9C,SAAA73B,GAAMlyB,EAAAX,EAAA,CAAA,OAAAA,EAAEa,GAAOwyC,SAAAA,QAAAA,CAAAA,EAAAA,MAAAA,CAAAA,CAAMoa,MAAAA,GAAevmC,GAAAA,GAAAA,CACpC,OAAA,GAAMikC,GAAAA,GAEG,CAAA,ECjrBnB,SAAwBsD,IAAe,CACrC,MAAM7xD,EAASsuD,GAAAA,EACT,CAAE7X,KAAAA,CAAAA,EAASz2C,EACjBuwD,GAAS9Z,EAAO,kBAAkBA,CAAI,GAAK,eAAe,EAC1D,KAAM,CAAErzC,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtB,CAACyuB,EAASw+B,CAAU,EAAI/uD,EAAS,IAAI,EACrC,CAACynB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAEhDhB,EAAU,IAAM,CACV00C,IACD,SAAY,CACX1vB,EAAW,SAAS,EACpB,MAAMuM,EAAU,MAAMlwB,EAAMM,GAAGquD,cAAc1rD,QAAQowC,CAAI,EAAElyC,MAAAA,EAC3DnC,EAAQga,GACR01C,EAAWx+B,SAAO,CAClBvM,GAAAA,CACC,EACL,CAAA0vB,CAAA,CAAA,EACF,KAAIA,CAEJ,SAAArwC,EAAQA,cAAAA,EAAU2rD,SAAAA,CAAAA,EAAezrD,GAAAA,CAAAA,IAAwByrD,GAAC,KAAAC,GAAAA,EAAA,MAAAvb,CAAA,GAAA,KACpDiB,WAEN,OAAMua,EAAAA,MAAAA,CAEN,GAAA,qBACOluD,MAAG,iBAAqBiG,SAAM,KAAiB4R,SAAS,CAAArS,EAAA,MAAA,CAAIE,MAAAA,SAC1DO,SAAM,CAAAT,EAAA,KAAA,CAAQE,SACjBF,CAAAA,EAAA,cAAA,CAAA,CAAA,EAAAE,IAAKgtC,WAAKltC,EAAY,IAAA,CAAI,SACzBihB,CAAAA,EAAY8C,GAAA,CACX7jB,OAAA,EACS,CAAA,EAAC+hB,IAAAA,EAAM9f,EAAA,CAAE,GAAC,QAAC,CAAA,CAAA3H,CAAA,CAAA,EAAuB,CAAA,CAAA2zC,GAAAhuC,EAAA,KAAA,CACxC,SAEFguC,eACDA,CAAA,EAAA,IAAA,CAAA,CAAAjwC,EAAAxD,CAAA,IAAAsF,EAAAC,EAAA,CAAAC,SACG0Y,CAAAA,EAAO5S,KAAAA,CACN9F,SACEC,CAAA,CAAA,EAAAD,EAAAA,KAAKhC,CAAQ,MACb,UAAAA,CAAA,GAAIuC,uBAAoB/F,CAAA,EAAAsF,EAAA,QAAA,UACrBiN,CAAAA,EAAM4nB,QAAQn6B,CACbwF,SACEC,EAAA,KAAA,CAAAD,gBACE,QAAAxF,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAAmJ,EAAAuiD,CAAA,IAAAjmD,EAAA,KAAA,CAAAD,MAAAA,IACU8F,SAAQtL,OAAUiI,GAAWjI,SAAK,SACxC,GACE+F,SACEvC,CAEI,CAAA,CACLgC,CAEAhC,CAAAA,CAEJ,CAAA,EACCiC,EAAA,QAAA,CACC,SACPzF,EAAA,IAAA03C,GAAAjyC,EAAA,KAAA,CAAAD,SACGxF,OAAMiI,QAAKyvC,OACV,CAAA,CAAA,EAAAgU,CAAA,IAAAjmD,EAAA,KAAA,CAAAD,MAAAA,IACG0Y,SAAew5B,OAAMzvC,GAASjI,SAC7ByF,SAAA,GACEM,SACE01B,GAAM,eAAkBz7B,KAAAA,CAAAA,+DAEpB,KAAAwD,CAAA,EAAAiC,EAAA4S,GAAA,CACL7S,QAEAxF,GACD,KAAAwR,GAAAA,EAAe/H,KAAMiiD,CACrB,EAII9zC,WAASzV,EAET,CAAA,EACA6yC,IAAAA,QAAUgZ,EAAA,SAAAtC,EAAA,CAAA,GAAAsC,EAAA,eAAA,OAAA,CACX,MACCvyB,MAEwC,CAAA,EACxC6uB,OAAOoB,GAAA,SAAAA,EAAA,eAAA,EAAAA,CAAA,CAAA,CACT,CAIA1rD,CAAAA,CACD,CAEJ,CAAA,CAAC,CAEL,CAAA,EACK,OAAAA,GAAA,SAAA,mBAAA,KAAAwD,CAAA,EAAAiC,EAAA,KAAA,CACH,SACEzF,OAAAA,QAAUA,CAAA,eACAyJ,EAAQlE,EACzB,CAAAC,SACG0Y,CAAAA,EAAO5S,KAAAA,CACN9F,SACEC,CAAA,CAAA,EAAAD,EAAAA,KAAKi2B,CAAM,SACXiwB,GAAAjmD,EAAA4T,GAAA,CAAA7T,GAAAA,IACGxF,CAAAA,MACCyF,CAAC4T,GAAK7R,SAAQpI,EAAAA,GAAcY,CAAQwF,OAClCC,GAAC+0B,KAAM6T,GAAAA,EAAA,KAAAqd,CAAA,EACLz3C,SAGA7N,SAAK,EAAA,CAAA,CACG,CAAA,CACT,CAAA,CAAC,CACE,CAAA,CACP,CACE,CAAA,EAERX,EAAA,QAAA,CACC,SAEJA,EAAA,QAAA,CAAAD,gBACE,QAAAxF,CAAA,EAAA,IAAA,CAAA,CAAAy7B,EAAAiwB,CAAA,IAAApmD,EAAA,KAAA,CAAAE,SACG0Y,CAAAA,EAAO5S,KAAAA,CACN9F,SACEC,CAAA,CAAA,EAAAD,EAAAA,KAAKi2B,CAAM,MACX,OAAAiwB,GAAA,SAAA,SAAA,GACE3lD,SACE2lD,CAAuC,CAAA,CACxClmD,CAEAxF,CAAAA,CAAK,CACH,CAAA,CAER,CAAA,EACI,OAAAA,GAAA,SAAAA,EAIXA,KAAAA,UAAAA,EAAAA,KAAAA,CAAAA,CAG6B,CAAA,CAAA,CAAA,CAAA,CAC9B,CACE,CAAA,CAAA,CAER,CAAA,EAEJyF,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,IAAA,OAEH,CACG0B,UAAO,QAAA,EAAsB,SAAA1B,EAAA4T,GAAA,CAAE7T,GAAAA,IAC1BgC,SAAG/B,EAAAgC,EAAA,CAAGjC,GAAAA,QACV,CAAA,CAAA,CAAA,CAAqB,CAAA,CAAC,CAClB,CAAA,CACJ,CC9JV,MAAM2rB,GAAQ,GAEd,SAAS88B,IAAY,CACnB,KAAM,CAAEvvD,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAW,EAAG,IAAI,EAC3B,KAAM,CAAEX,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtBstD,EAAoBrwD,EAAAA,EAC1B,eAAeswD,EAAe76B,EAAW,CACvC,OAAIA,GAAa,CAAC46B,EAAkBnwD,WAClCmwD,EAAkBnwD,QAAUoB,EAAMM,GAAG8qC,UAClC5qC,KAAK,CAAEC,MAAOuxB,EAAAA,CAAO,EACrBpxB,OAAAA,GAEE,MAAMmuD,EAAkBnwD,QAAQkC,KAAAA,CACzC,CAEA,OACEwF,EAAC49C,GAAQ,CACPv6C,MAAKlH,EAAE,CAAA9B,GAAA,QAAA,CAAW,EAClBA,GAAG,YACHyjD,UAAS3hD,EAAE,CAAA9B,GAAA,QAAA,CAA0C,EACrD0jD,UAAS5hD,EAAE,CAAA9B,GAAA,QAAA,CAA2B,EACtCV,SAAAA,EACAskD,WAAYyK,CAAAA,CACb,CAEL,CCjCA,MAAAC,GAAe,yDCkDTC,GAAiB,OAEjBC,GAAS,CACb,CAAEvmD,MAAO,CAAAjI,GAAA,QAAA,EAAkBE,MAAO,CAAE,EACpC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAmBE,MAAO,CAAE,EACrC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAoBE,MAAO,EAAG,EACvC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAoBE,MAAO,EAAG,EACvC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAoBE,MAAO,EAAG,EACvC,CAAE+H,MAAO,CAAAjI,GAAA,QAAA,EAAsBE,MAAO,EAAG,CAAC,EAGtCuuD,GAAc,CAClBC,SAAU,CAAA1uD,GAAA,QAAA,EACV+xB,QAAS,CAAA/xB,GAAA,QAAA,EACTgyB,OAAQ,CAAAhyB,GAAA,QAAA,EACR2uD,OAAQ,CAAA3uD,GAAA,QAAA,EACR0pC,aAAc,CAAA1pC,GAAA,QAAA,EACd4uD,OAAQ,CAAA5uD,GAAA,QAAA,EACRw1C,SAAU,CAAAx1C,GAAA,QAAA,CACZ,EACM6uD,GAAe,CACnB,YACA,eACA,kBACA,eAKA,SAAS,EAELC,GAAgB,CAAC,KAAM,SAAS,EAEhCC,GAAM7E,GACT9vC,GACC,IAAI40C,KAAKC,eAAe70C,GAAUhW,OAAW,CAC3CsuC,KAAM,UACN8X,MAAO,QACP0E,IAAK,UACLC,KAAM,UACNC,OAAQ,SACV,CAAC,CACL,EAEA,SAASj2B,GAASP,EAAO,CACvB,OAAOA,GAAO54B,IAAM44B,GAAOy2B,cAAcrvD,EAC3C,CAEA,SAASsvD,IAAU,CACjB,KAAM,CAAE31C,KAAAA,EAAMlC,EAAAA,EAAG7Y,EAAAA,CAAAA,EAAGC,GAAAA,EACd0wD,EAAMR,GAAIp1C,EAAKS,MAAM,EAE3BoyC,GAAS,WAAY,UAAU,EAC/B,KAAM,CAAEntD,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtB,CAAC03C,EAAcC,CAAe,EAAIC,GAAAA,EAClC14C,EAAKw4C,EAAal/B,IAAI,IAAI,EAC1B,CAACmN,EAASzD,CAAU,EAAIhkB,EAAS,OAAO,EACxC,CAACwwD,EAAcC,CAAe,EAAIzwD,EAAS,EAAK,EAEhDuY,EAAiBuC,GAAQ,IACtB3U,GAAAA,EACN,CAAA,CAAE,EACC8pB,KAAwB1G,IAAchR,EAEtCm4C,EAAmBzmC,GAAS,gCAAgC,EAElE,eAAe0mC,EAAU,CAAEC,aAAAA,CAAAA,EAAgB,CACzCvxD,MAAAA,KACMwxD,EAAaxwD,EAAA,GAAA,UAAA,KAAA,KAAA,CACnB,MAAMywD,EAA4C,CAAA,EAAaC,GAAAD,EAAA,OAAA,EAC/DE,EAAMD,OACNC,GAAAA,CACMN,GAAAI,EAAA,SACEJ,OAAAA,UAAiCzzD,SACnC6zD,EAAWA,QAAa7zD,wBAExB6zD,EAAO,OAAA,gBAAA,IAGT,MAAAvgC,EAAA,MAAAwgC,GAAA,KAAA,EACMxgC,CACN,MAAArvB,EAAM,EAAEA,EAAM,GAAIqvB,IAAAA,OAAAA,CAClB,SAAmBrvB,GAAAZ,CAAA,EAEjB,IAAA2wD,GAAMpS,GACN,QAAIoS,GAAAA,EAAAA,GAAe/vD,GAAA,OAAAsN,KAAA,CACnB,MAAAoqC,EAAa13C,GAAOA,EAAAA,EACZ03C,GAAc,KAAA,MAAAA,EAAA,SAAA,EACpB,GAAA,CAAAgY,GAAMM,IAAgC5nD,EAAS,CAG7C,MAAM6nD,IAFHP,EAAgBM,EAAAA,QAAiBN,SAAAA,IAAchY,EAAA,QAAA,EAAA,GAG3Cn0B,KAAiBzjB,QAAM43C,UAC9BA,EAAA,SAAA2W,EAAA,EACA,GAAA7Y,IAAMA,SACHya,OACDxa,SAIFiC,EAAIlC,aACJkC,MAAKwY,GAAAA,GAAY1a,EAAAA,GAAAA,CAAAA,EAGjBkC,EAAA,cAAarC,EAAev1C,mBAAYq9C,EAAA,EAAA,CAAA,GAAA79C,EAAA,mBAAA69C,EAAA,CAAA,EAAA,CAAA,EACxCzF,EAAKyY,KAAAA,CAAAA,EAILR,KACAI,CAGA,GAAA,CAAAA,GAGF,MAAKA,CACGD,CACR,KAEJ,OAAOA,EAEP,MAAA,IAAA,QAAArgC,IAAA,WAAAA,GAAA,GAAA,CAAA,CAEA,MAAUwa,QAEV9rC,CACM2xD,OAAAA,EACR,QAAA77C,GAAA,CACF,GAAAA,GAAA,YAAA,CAIA07C,MAAAA,GAAoB17C,EAAW,KAAAo6B,IAAAA,GAAA,KAAAp6B,EAAA,WAAA,MACjB0oC,CAAAA,GAAa,cACvBt3C,WAAsBsqD,GAIpBtqD,CAAwB,CAAA,EAE5BsqD,CAAA,CAGF,KAAA,CAAAzqD,EAAOyqD,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EACTS,EAAAvyD,EAAA,EAEMwyD,EAAgBxyD,EAAIiB,EACpBsxD,SAAkBvyD,GAAO,EAAA,CAAA,CAAA,EACzBwyD,EAAiBxyD,GAAO,MAAA,CAC9B,SAAA6yB,CACA,EAAA,KAAM4/B,CAA0C5/B,MAAAA,EAAAA,KAAAA,IAAAA,EAAcg/B,EAAMh/B,EAAAjvB,EAAAivB,EAAA,KAClE5N,EAAMrhB,SAAWA,EACjB,MAAMiuD,GAAAA,MAAeh/B,EAAWjvB,CAChCqhB,aAAAA,CACA,CAAA,EAAkC4sC,EAAAA,GAAAA,CAAAA,IAAAA,GAAAA,CAAAA,GAAa,GAAC,CAGhD,MAAMa,GAAAA,QAAY,IAAKA,EAAS,CAC5B,GAAAA,EACF,MAASC,GACP1wD,MAAIywD,GAAAA,OACJrrD,QAAOmqB,EACPwiB,MAAOxiB,CAAQnvB,CAAAA,EACNwvD,EACFjuD,CACR,GAAA8uD,CACDhY,CAAAA,CAAgB,MAAMgY,CAAAA,CAAAA,EAAAA,CAAAA,CAAW,EAAAzyD,MACvB,CACVK,GACF,SAAA,CACG,MAAAqyD,EAAA,MAAAv4B,GAAA,QAAA,IAAAn4B,CAAA,EAEK0wD,IACJ1wD,EAAI,MAAA,KAAA,CAAA0R,EAAAmJ,IAAAnJ,EAAA,UAAAmJ,EAAA,UAAA,EAAA,EAAA,EACL81C,EAAYD,EAAA,KAAA,EACX1tC,EAAM0tC,SAAgBv4B,EAEpBu4B,GAAAA,EACAC,IAAiBvrD,YACjB4d,EAAAA,CAAAA,CAAAA,EAAoBA,EACtB,OAAA,EACC,EACL,CAAAhjB,CAAA,CAAA,EACE2wD,KAAAA,CAAAA,EAAWC,CAAA,EAAAj5C,GAAA6C,GAAAA,EAAA,EAAA,CAAA,EACXwI,CAAAA,EAAkB6tC,CAAA,EAAA7xD,EAAA,IAAA,EACpB,CAAA8xD,EAAAC,CAAA,EAAA/xD,EAAA,CAAA,CAAA,EACFhB,EAAO,IAAA,EAEP,UACA,GAAOgzD,CACD,MAACF,EAAcC,MAAAA,GAAAA,QAAmB/xD,KAAAA,EACxChB,GAAUizD,EAAM,OAAA,CACb,MAAA74B,EAAYC,GAAA,EACPC,EAAA24B,EAAA,OAAAvtD,IAAAA,GAAA,WAAA,GAAA00B,CAAA,GAAA,CAAA,EACF,GAAM64B,EAAAA,OAAW,CACbA,OAAiB,MAAA94B,GAAA,QAAA,QAAAG,CAAA,EACnB44B,GAAW74B,KAAAA,CAAAA,GAAAA,IAAAA,EAAoB,MAAA3mB,GAAA,KAAA,EAC/B,IAAM4mB,KAA2B50B,MAAAA,QACbwtD,GAAA,MAAA,CAAA,EAClB,MAAIA,GAAoB/4B,UAAmBG,CAC3C44B,KAAAA,CAGIC,GAAAA,EACAC,MAAAA,GAEJ,QAAAC,GACE,MAAAC,EAAM,EAAEtxD,GAAAA,MAAI+xC,CAAOsf,GAAAA,EAASC,MAAAA,GAAM,QAAAD,GAClC,MAAAC,EAAO,CACLtxD,CAAAA,EACA+xC,EACAsf,EAAAA,EAAAA,EACAC,EAAAA,CAAAA,EAAAA,KAAAA,EAAAA,GACF,KACFH,EAAC,KACDJ,eAAAA,IAAgBQ,CAChBV,GAAAA,QAGAK,GAAAA,QAAc,QAAAE,GAAA,IAAA52C,IAAAA,GAAA,EAAA,CAAA,EAAA,KAAA,IAAA,CACd22C,GAAe,IAEf5T,CAAAA,EAAAA,MAAAA,IAAe,CAAM,CAAA,CAGjBplB,CAAAA,EAIIi5B,MAAe,CAGf/yD,CAAe,MAChB,CAAA,CAAA0yD,EACL,CAAA,CAAA,CAAA,GAAA,CAGF,EAAA,CAAAS,CAAA,CAAA,EAAAxzD,EACF,IAAA,CACFyoB,IAAA,SACFmqC,EAAY,CACK,EAAA,CACjBnqC,IAAA,OAAA,CAAA,EACAsqC,KAAAA,CAAAA,GAAkB,EAAAj3C,GAAA,IAAA,CACpB,IAAG07B,EAAA,EAAAoZ,EAAA,EAAA58B,EAAA,EAAA28B,GAAA,EAAA58B,EAAA,EAAA2X,GAAA,EAAAglB,GAAA,EACL,MAAI8C,GAAAA,CAAAA,EACJxzD,UAAUsH,MAAMF,EAAA,eACEE,GAAS,WAAA,SAAA,QACvBsrD,IACFtrD,GAAA,SAAA,YACEmhB,GAAY,OAEVmoC,IACApZ,GAAAA,SACFoZ,aAMa,QACf58B,IACE1sB,GAAIA,SAAK8qD,UACP5a,GAAAA,GAAAA,GAAAA,GAAAA,KAAAA,GACAlwC,KACFA,GAAA,SAAgBotB,UACdk8B,GAAAA,eAAAA,QACAtpD,KACFA,GAAA,SAAgBme,gBACduO,GAAAA,aAAAA,GAAAA,qBAAAA,GAAAA,SAAAA,IACA1sB,gBACSwb,YAETxb,KACFA,GAAA,SAAgB+qD,YAEd/qD,MAAAA,GAAKmsD,GAAW,QAAAnsD,GAClB,iBACOu3C,YACAlI,GAAAA,MAAAA,KAAAA,gBACL+c,GAAA,MAAA,OAAA,OAAA,CACA3/B,KAAAA,CACAzsB,KAAAA,GACF,gBAAAy7C,GACE2N,aAAAA,EACAppD,EAAAA,GACF,GAAA,CAEA,IAAA4S,EACA,EACE5S,GAKM,GAAN4S,GAAMA,GAAA,QAAA,MAAA,EAAA,EAAEmpC,CAAAA,GAAAA,EAAAA,EAAMN,GAAAA,EAAAA,EAAAA,CAAiBlM,OAAAA,GAAAA,GAAiB6c,KAAAA,GAC5C,OAAA,EAAEx5C,QAAAA,CAAAA,GAAAA,OAAAA,EAAQmpC,MAAAA,GACdnpC,OAAUvE,EACV,MACEg+C,CAAa,MACHD,EAAAA,EAAAA,QAAQ1xD,KAAAA,IAAAA,GAAAA,KAAAA,GAAAA,QAAAA,EAAAA,EAChBqhD,SACQuQ,GACRC,EAAAA,EAAUvsD,SAAYssD,GACtBE,EAAO/Q,EAAAA,QAAAA,KAAAA,GAAAA,OAAAA,EACP/uB,GAAQ6iB,EAAAA,EAAAA,SAAAA,GAAAA,KACV+c,GAAA15C,EAAA,EAAA,OAAA6oC,GACF6Q,GAAO15C,EAAA,EAAA,QAAA28B,GAEH,CAAA,CAEF8c,CACAA,IAAAA,EAAMz5C,CAAAA,EACN,UAAIy5C,MAAMz5C,GACRy5C,EAAAA,KAAMz5C,CACNy5C,IAAAA,GAAqB9c,GACvB+c,GAAAG,EAAA,CAAA,CAAA,EAeJ,GAZFC,EAAA,KAAA,CAAAtgD,GAAAmJ,eAEeA,GAAA,OAAA,GACfnJ,GAAA,UAAmBigD,OAAO,EACxBK,GAAAA,OAAcn3C,GAAA,OAAA,GACZ3C,GAAAA,OAAK65C,GAAAA,OAAAA,EACLrgD,SAASqgD,GAAI,MAAA,GACdrgD,GAAA,MAAAmJ,GAAA,MAAA,EACHnJ,GAAA,OAAAmJ,GAAA,OAAA,GACAm3C,GAAAA,OAAetgD,GAAGmJ,OAAM,EAChBo3C,CACN,EACAD,EAAMhgC,OAAWA,GACjBkgC,EAAMlgC,QAAWA,GAAQ,GAAAxkB,GAAOwkD,EAAA,OAAAxkD,KAAA,CAChC,KAAMskD,CACFpgD,OAAAA,EACJ,EAAMi9C,EAAS9zC,EAAAA,EACf,GAAM8zC,IAAS9zC,EAAE8zC,CACjBqD,EAAOA,EAAA,MAAA,EAAAxkD,EAAA,EACR,MAAA0kD,CAGGF,CACFE,CACQ,MAAED,CAAAA,CAAAA,SAAAA,EACR,OAAArD,EACEoD,OAAAA,EACA,OAAArD,GAAMuD,QAAAA,EAEV,aAAAxoB,GACF,SAAAglB,EAEA,EAAAsD,CACE,CAAA,EAAA,CACExc,CAAAA,CAAAA,EACAoZ,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,KAAAA,EACA58B,CAAAA,EAAAA,EAAAA,EAAAA,EAAAA,IAAAA,EACA28B,CAAAA,EAAAA,EAAAA,EAAAA,EAAAA,CAAAA,EACA58B,CAAAA,EAAAA,EAAAA,EAAAA,EAAAA,WAAAA,EACA2X,CAAAA,GAAAA,EAAAA,EAAAA,EAAAA,KAAAA,EACAglB,CAAAA,EAAAA,EAAAA,EAAAA,EAAAA,IAAAA,EAEFsD,CAAAA,GAAQG,GAAAC,EAAA,EAAAt4C,GAAA,IAAA,CAEZ,MAAI1U,EAAM,CAAA,EAEHitD,EAAwBC,IAAAA,IAC/B,IAAMC,EAAiBC,EAAAA,OAAAA,IAEvB,MAAOrwB,OAA6B,OAAA78B,EAAA,WAAA+sD,EAEpC,OAAOI,KACDC,EAAYC,EAAAA,QAAY,EAAA,YACxBC,EAAUC,IAAUvtD,UAAa,IAAIstD,EAAA,IAAAttD,EAAA,QAAA,EAAA,GAAA,GAAA,CAAA,KAIzC,CAAA,EAEA,MAAIwtD,GAAgB1tD,CAAAA,EAClB,OAAAmtD,EAAMQ,QAAAA,GACJV,CAGEU,EAAAA,SACFL,GAAiB56C,EAAAA,OAAU,EAAIxS,GAC/BstD,GAAgBz3C,EACd7V,OAAKwS,EAAQ9X,EAAAA,WAGjBgzD,GAAA1tD,EAAA,OAAA,EAAA,EAAA,WAAA,IAAAA,EAAA,OAAA,EAGD0tD,GAAA1tD,EAAA,OAAA,EAAA,EAAA,WAAA,IAAA,IAAA,CAAAA,EAAA,OAAA,CAAA,EAIDwtD,EAAAA,aAEIE,GAAIA,EAAa1tD,OAAKme,EAAOzjB,EAAEsF,EAE6B,CAAA,EAExD0tD,GAAa1tD,EAAgB2tD,IAAAA,KAAmCV,EAClEA,EAAA,OAAAjtD,GAAAA,EAAA,QAAA,KAAA4tD,GAAA,CAAA,GAAA5tD,EAAA,YAAA,CAAA,CAAA,EAAA,KAAAoM,IAAAA,GAAA,KAAAwhD,CAAA,CAAA,GAEF,CAAAX,EAAOG,EAAA,OAAA,YAAAE,CAAA,CAAA,CACLI,EAAAA,CAAAA,EAAkBvvC,EAAane,CAAAA,CAAAA,EACjC6tD,GAAAr5C,GAAA,IAAA,CAAA,MACF3R,EAAA,CAAA,EACF,OAAA2qD,GAAC,QAAAxtD,GAAA,CAED6C,EAAI+qD,EAAAA,EAAAA,EAAAA,CACFJ,CAAAA,EAKF3qD,CAEA,EAAA,CAAA2qD,EAAQA,CAAAA,EACNT,GAAAA,GAAwBa,IAAAA,YAAsBd,EAAA,EAAA,KAAA,CAAA1gD,EAAAmJ,IAAAu3C,GAAAv3C,CAAA,EAAAu3C,GAAA1gD,CAAA,CAAA,EAAA,CAAA0gD,EAAA,CAAA,EAE5Ce,MAA2B,IAAM,CACrC,MAAMhrD,EAAO,CAAA,EACb2qD,OAAAA,WAAuBxtD,CAAAA,EAAS2gB,IAAA,CAC9B9d,EAAWirD,CAAI9tD,EAAAA,CACjB,CAAC,EACM6C,GAAAA,OAAAA,GAAAA,CAAAA,EAAAA,QAAAA,EAAAA,KAAAA,CAAAA,EAAAA,IAAAA,CACL2qD,GAAAA,IAAc,UAAA,CAEZO,MAAAA,GAAmBv5C,UACvB,GAOIw5C,EAAAA,EAAAA,gBACmBC,EAAA,EACvBF,GAAiBtmD,EAASqmD,CAAUntC,EAClCutC,MAAsBC,GACvB,GAAA34C,KAAA,EACD,OAAOg4C,EAID,CACA,GAAAL,IAAMiB,cACNhiD,EAAAA,EAAMiiD,UACN94C,EAAAA,EAAM44C,UACNhB,IAAckB,WAASF,EAAAA,CAAAA,IAAAA,EAAAA,CAAAA,GACvB,mBAAiB54C,EAAA,UAAA,EAAA,GAGnB,GAAA43C,IAAA,UAAA,CACA,SAAemB,GAAaliD,CAAA,EACpB+R,EAAU/R,GAAAA,CAAAA,EAChBmJ,OAAIA,KAAYA,SACDg5C,OAEfA,EAAAC,GAAA,EAAA,EAEF,CACE,OAAAC,KAAMD,MACAD,EAAAA,CAAAA,OAAwB,EAAA,GAE5Bh5C,EAAOi5C,CAAAA,EAAAA,KAAsB,EAAI,EAEjC,CAAA,CAAiC,EAAA,CAAAhB,GACnCL,EAAAsB,GAAAC,EAAAX,EAAA,CAAA,EACFY,GAAAl2D,EAAA,IAAA,EACAm2D,GAAkBn2D,EAAO,IAAA,EACvBo2D,GAAep2D,EAAM00D,EAAM,EAAQz0D,EACrC,IAAO,CACLoH,EAAA,OAAe,KAAMqtD,GAAc,SACrCyB,GAAA,UACD5iD,GAAA4iD,GAAA,QAAA,CACDpB,SAAAA,GAEJ,CAAA,EAEAqB,GAAMD,WAENl2D,EAAAA,CAAAA,EAAUk2D,EAAM,CAAA,EACd,MAAI9uD,GAAeA,EAAA,OAAO+uD,IAAal2D,KAAS,KAC5Ci2D,MAAkBj2D,IACpBqT,UAA8BrT,KAC5B2yB,EAAAA,IAAUtrB,GAAA,CACZ,MAAC8uD,EAAAjB,GAAA7tD,EAAA,EAAA,EACD6uD,OAAAA,EAAAA,OAAal2D,CACf,MAAA,YAAAm2D,EAAA,qBAAA,EAAA,EAAA,EACEhvD,EAAO8uD,EAAAA,CAEX,CAAA,EAEA,CAAAf,KACMkB,GAAAA,OACJA,KAAkB/uD,MAEhB,CAAAF,GAAMuwC,OAAawd,QAEjB/tD,EAAA,YAAA,GAAA,EAES,IAAA,CAAAkvD,EAAY3e,MACpB,MAAA,CAEJ,MAAA,YACCwd,SAAAA,EAAiB,IAAA7tD,IAAA,CAEfivD,MAAAA,EAAoBpB,GAAM7tD,GAAA,EAAA,EAC1B+uD,OAAAA,EAAAA,OAAuB,CACtBjvD,MAAOhF,YAAeg0D,EAAA,qBAAA,EAAA,EAC3B,EAAMI,GAAOC,EAAAA,CACb,CAAA,CACE,EAAAjnD,CAAA,CACE,EAAW,CAAA2lD,EACR/tD,CAAAA,EACC+4C,GAAMxI,EAAawd,IAAAA,EACnBuB,EACE56C,GAAA,IAAAk3C,GAE8D,SAC7D,EAAAA,GAAA,IAAA,GAAA,GADoBrb,KACpB,CAAAqb,EAEJ7uB,CAAA,CAAA,EAAAnkC,EACE,IAAA,CAET,GAACyoB,IAAA,UAAA,OACH,MAAI0sC,EAAiBD,GAAAf,GAAAe,CAAA,EAAAf,GAAAe,CAAA,EAAA,SAAA,GAEf/U,OAA2B,MAAA,EAAA,EAG3BuW,EAAAA,CAEJ,iBACA,EACF,IAAI1D,GAAAA,GAAkB7uB,CAEtBnkC,SAAU,IAMR,KAAM22D,EAEJ78C,CACF,GAAA,gBACY9V,CACV4uB,uBAAAA,EAAU,OAAA6hC,EAAA,UAAAsB,GAENjyD,QAAAA,CAAAA,CAAAA,CAAE,CAAA,CAAA,EAAA,MAAA,IAAAuwD,CAAAA,IAAyCI,YAAAA,CAAAA,CAS3BsB,EAAAA,CAAAA,EAiBOC,EAAAA,EAAAA,EAAAA,GAAAA,EAAAA,EAAAA,CAAAA,EAAAA,EACF,IAAA,CAAA,GAGtBd,GAACf,GAAAe,CAAA,EAAA,CACL,MAAA0B,EAAAV,GAAA,QAAA,cAAA,iBAAAhB,CAAA,IAAA,EACM2B,EAAMX,GAAA,SAAA,sBAAA,EACJ3xB,EAAYqyB,GAAA,sBAAA,EACrBE,EAAA,KAAAD,EAAA,MAAAC,EAAA,MAAAD,EAAA,MAEApuC,EACA4rC,eACAa,CAOQ,MAAM,UACVA,OAAAA,SACEf,iBAEF,CAAA,EAGM0C,EAAAA,IACJX,GACFU,EAAME,gBACNz2D,MAAQga,iBACCw8C,mBACCA,QAAeE,EAEJA,CAMnBH,EAAAA,CAAAA,EAAAA,EAAcl0B,CAAAA,EAAe,KAAA,CAAAs0B,GACpBC,EAAA,EAAAj2D,EAAA,EAAA,EAAAwmD,GACC,yBAAAF,EACRp8B,GAAU,IAAA,IAAA,CAAA,MACZu8B,EAAC,SAAA,cAAA,QAAAD,EAAA,EACHG,EAAWmP,GAAoB,sBAAA,EAC7BF,EAAAA,MAAcl0B,KAAAA,GAAe,QAAA,iBAAA8kB,EAAA,CAAA,EAAA,GAAAC,GACpBE,EAAA,IAAAxH,GAAA,QAAA,cAAAwH,EAAA,OAAA,EAAA,CAAA,MACPrK,GAAQsK,EAAA,QAAAH,CAAA,EACRv8B,EAAU08B,EAAAC,GAAA,CAAA,EACZ/L,IACFA,EAAA,MAAA,EACFA,EAAA,eAAA,CACF,MAAA,SACEoZ,OAAAA,SAEG8B,SAAUC,QAEjB,CAAMzP,EAIF,KAAMC,CACN,MAAME,GAAAA,OAA6B9gC,GAClBpS,EAAMC,sBACPzU,QAOd,EACA+nD,KACAA,GAAc,MAAA,EACZlM,GAASp1B,eAAM,CACfo1B,MAASpZ,UACPvX,OAAO,SACPmyB,SAAQ,QAAA,CAAA,EAET,CACH,EACF,CACE,OAAM0K,GACJ,eAAMD,GACN,mBAAgB51C,EAAAA,SAAOtT,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CAAA,EAEzBopD,GAAID,GAAa,IAAA,IAAA,CACfA,MAAAA,EAAYthC,SAAM,cAAA,QAAA8gC,EAAA,EAClBQ,EAAYtlB,GAAe,sBAAA,EACzBvX,EAAO,MAAA,KAAAg1B,GAAA,QAAA,iBAAAqH,EAAA,CAAA,EAAA,GAAAC,GACCE,EAAA,IAAAxH,GAAA,QAAA,cAAAwH,EAAA,OAAA,EAAA,CAAA,MACRz8B,GAAU08B,EAAA,QAAAH,CAAA,EAAA,IACXxL,EAAA2L,EAAAC,GAAA,CAAA,EACH5L,IACFA,EAAA,MAAA,EAEFA,EAAA,eAAA,CACEz1C,MAAQ,SACRwB,OAAAA,SACAvB,SAAAA,QAAgEJ,CAEpE,EAKI,KAAMohD,CACN,MAAME,GAAAA,OAA6B9gC,GAAAA,CACnC,SAAiBpS,EAAMC,sBACPzU,EAGdwnD,OAAAA,YACet1C,GAAMguC,MAAAA,CAGrB,CAAA,EACIlE,KACJ+L,GAAc,MAAA,EACZ/L,GAASv1B,eAAM,CACfu1B,MAASvZ,UACPvX,OAAO,SACPmyB,SAAQ,QAAA,CAAA,EAET,CACH,EACF,CACE,OAAM0K,GACJ,eAAMD,GACN,gBAAOA,GAAS51C,EAAAA,SAAa41C,EAAAA,SAAiBlpD,EAAA,QAAAA,EAAA,QAAA,CAAA,EAEhDq4D,GAAIlP,GAAa,OAAA,CAAAmP,EAAA5P,IAAA,CACfS,MAAAA,EAAAA,EAAYthC,KAAM,CAAA,EAClBshC,GAAAA,EAAYtlB,CAAe,MACzBvX,GAAOkqC,GAAA,QAAAH,CAAA,EACP5X,IAAQ,IACRpyB,GAAU,GAAAjD,GAAAotC,GAAA,SACXb,GAAAa,GAAAptC,GAAA,CAAA,CAAA,EACHk4B,GAAA,SAAA,MAAA,GAGJz6C,IAAA,KACUuiB,GAAAotC,GAAA,OAAA,GAAAptC,IAAA,IACRjgB,GAAgBqtD,GAAAptC,GAAA,CAAA,CAAA,EAChBxhB,YAA0BE,MAAAA,EAQ1B,MAAMjB,IAAM6hD,MACZiN,GAAoBa,GAAA,CAAA,CAAA,EAClBlV,GAAckV,SAAAA,MAAAA,EAEZ,EAAA,CACEb,OAAAA,GACArU,eAAAA,GAA6B,gBAC/BthD,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,SAAA,yBACsB,CACtB,CAAA,EACE21D,GAAAA,GAAkBa,MAAAA,IAAAA,CAClBlV,GAAAA,MAA6BA,GAC/B,SAAA,MAAA,CAAA,EAAA,CAEJ,kBACEqU,gBAAAA,GAAkBa,EAAAA,SAAiBx2D,EAAE,SAAAA,EAAA,QAAAA,EAAA,SACrCshD,yBAAuBz5B,EACzB,OAAA,EAAA,CACF,EAEElgB,EAAQzC,GAAA,IAAA,IAAA,CACRiE,GAAAA,SAAgB,SAAA,CAChBvB,IAAAA,EACAm2C,SAAAA,QAA0B,CAE9B,CAEA,EAAA,CAGI4X,OAAAA,GACArU,kBACF,gBACAthD,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,SACEmJ,iBAAgB,CAAA,OAAA,CAAA,CAAA,EAEhB40C,GAAmB11C,GAAOrI,GAAA,CAC1B2H,MAAAA,EAAQ,SAAA,cAEZ4wD,EAAA1P,GAAA,UAAA,SAAAA,EAAA,OAAA,QAKIvH,IAHWp8C,EAAAA,MAEb,aAAMlF,EAAA,MAAA,WAAAA,EAAA,MAAA,aAAAA,EAAA,MAAA,iBACmBkkC,CACrB5wB,EAAK,KAAA,EACL+Y,MACF,CACF,EACA,CAAA,CAAA,EAAA,OACE1kB,EAAQ,MAAA,CACRwB,IAAAA,GAAAA,CACAvB,GAAAA,QAA0BE,EAC1Bi2C,EAAAA,QAAAA,EAEJqL,GAAA,QAAA14C,EAEA2nD,GAAMG,QAAAA,EACJC,aACAtO,EAAMoO,QACJ1P,CACF,EAKA,GAAI6P,eAEF7P,MAAAA,iBACA,SAAA,KACF,SAAA,CAAAlgD,EAAA,MAAA,OACG,0BAEL,SACE,CAAAG,EAAA,SAAA,OACQ4H,GAAAA,IAAS,UAAA,UAAA,EAAA,GACb4wC,QAAAA,GAAclgD,CACTA,EAAAA,OAAUsP,QAAAA,WAAAA,GACVtP,GAAUsP,SAAAA,SAAAA,CACTtP,IAAAA,EACCA,SAAUsP,QACjBy5C,CAAO/oD,CAEN,EACHgI,SAAMT,EAAA,MAAA,CACNqS,MAAS,cAAInS,SAEbF,CAAAA,EAAA,MAAA,CAAKS,MAAM,cAAyBP,SAClC,CAAAC,EAAAw8C,GAAA,CAAA,CAAA,EAAA17B,IAAA,WAAA9gB,EAAA4T,GAAA,CACEtT,GAAUwgB,iBACA5pB,eACJ,SAAU24D,EAAAA,GACZrX,KAAAA,WACEhuC,KAAK,IACL+Y,IAAAA,EAEJ,CACF,GAAA,QAAA,CAEA,CAAW,CAAaxjB,CACtB,CAAKO,EAAAA,IAAM,SAAAN,EAAA4T,GAAA,CAAa7T,GAAAA,IAGdgC,MAAG,eAAWzB,SAAMN,EAAAS,EAAA,CAAcV,KAAAA,OAChCW,KAAK,IAAWC,IAAAA,EAAYxE,CAAE,GAAA,QAAA,CAAA,CAAU,CAAA,CAAC,CAAA,CAAC,CAAE,CAAA,EAC9C6D,EAEP8gB,KAAAA,CACM,SAAIA,IAAA,SAAA9gB,EAAAgC,EAAA,CAAI1B,GAAAA,SAAoBP,YACzBW,EAAAA,EAAK,MAAA,CAAA,CAAA,CAAA,CAAY,CAAA,CAAOvE,CAAAA,EAAAA,EAAAA,MAAAA,CAAAA,MAAE,cAAA,SAAA9B,IAAA,SAAAymB,IAAA,WAAA9gB,EAAA,SAAA,CAAA,KAAM,SAAA,MAAC,QAAC,QAAE,IAAA,CAE7CsvD,GAAA,EAAA,CAEHtvD,EAAAD,SACG+gB,EAAAA,EAAY,CACXzmB,GAAA,QAAA,CAAAsJ,CAAA,CAAA,CACyB,CAAA,CAAA,CAAC,CAAA,CACnB,CAAA,EACR9D,EAEHG,OAAA,CAAA,UAAW0vD,GAAA,cACR5uC,SAAYjhB,EAAWihB,MAAAA,CACtB,MACE5gB,gBAAK,SACLI,CAAMN,EAAA,KAAA,CAAA,WACGG,EAAM,CACbmvD,GAAAA,SACF,WAAA,CAAEvvD,EAAAA,EAEFC,MAAAgC,CAAAA,CAAAA,CAAA,CAAA,CAAA,CAAkB,CAAA,EACZnC,EAAA,UAAA,CAEN,SAAA,CAAAG,EAAA,UAAA,CACH,SAAAA,EAAAgC,EAAA,CAEP,GAAA,QAAA,CAAMiyC,CAAWyb,CAAgB3vD,EAAAA,EAC9B+gB,IAAAA,CACMxgB,SAAMN,EAAAgC,EAAA,CAAejC,WACxB,CAAAA,CACE,CAAA,EAAA1F,EAAA,MAAA,CAAAsJ,IAAAA,GAAA,MACW3D,OAAe,OAAA,MACnB,IAAA7D,EAET4D,CACEA,GAAAA,QACE,CAAA,CAA2B,CACpB,EACTC,EAAA,IAAA,CAAAD,SACEC,EAAAgC,SAAA,CAAA3H,KAAA,SAKO,QAAAnD,GAAA,CAET8I,EAAAA,OAAA,QAAA,SAAA,EAAA,KAAA,EACEwc,EACA9R,SAAM1K,EAAAgC,EAAA,CACN2I,GAAO,QAAA,CACP/J,CAAGzE,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,CAAA,EAAA6D,EAAA3F,IAAA,CAAA,SAAwB2F,EAAAgC,EAAA,CAAC,GAAA,QAAA,CAC/B,CACD,CAAA,EAAAjC,EAAAA,IACEC,CAAA,SACOA,EAAA,IAAA,CAAA,WACK9I,EAAM,CACdA,GAAEmK,QAAiC,CAAA,CACrC,CAAA,CAEA,CAAA,EAAAxB,EAAAxF,MAAA,CAAA,MAA4B,eAAA,SACtB,CAAA2F,EAAA,QAAA,CACN,IAAA2qD,EAEN3qD,KAAA,QAAAD,MAAAA,EACE1F,IAAAwuD,GAAA,CAAA,EAAA,MAA+D,IAAAA,GAAAA,GAAA,OAAA,CAAA,EAAA,MAEjE7oD,KAAA,IAAAD,KAAAA,iBACEA,YACEiC,GAAA,CAAA9K,EAAA,OAAA,KAAA,CAAA,CAAA,EAAAmD,IAAAwF,EAAA,OAAA,CAAA,MAAqC,CACpC,MAAA,KAAA,EAEAS,SAAM,CAAAwR,EAAA+2C,GAAArsB,EAAA,CAAA,EAAA,KAAA,EAAAx8B,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,QAAA,CAAcD,MACvBC,gBACEC,SAAK0qD,GAAAA,GAAAA,GAAAA,OAAAA,CAAAA,EAAAA,MAAAA,EAELpwD,CACKsuD,GAAAA,QAAUtuD,CACgBA,EAC1BgJ,GAAA,IAAA,KAAA,KAAA,IAAA,EAAAi5B,EAAA,GAAA,GAAA,GAAA,CAAA,CAAA,CACLtiC,CAAAA,CAAK,CAAA,eACY41D,CAClB,GAAE,iBAEDpuD,SAAOmnD,GAAA,IAAA,CAAA,CACLn+C,MAAAA,EACF,MAAAnQ,CAAA,IAAEwF,EAED+R,UAEMxR,MAAAA,EAAqBP,SACzBy8B,CAAwCrgC,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,IACrC6D,EAAA,SAAA,CAAA,KAAA3F,SAAA,QAAe,IAAA,CAAC,GAChBkJ,EAAAA,GACEslD,GAASnmD,OAAS,CAAA,EAAA,MAAI85B,CAEtB,IAAAvR,EAEVuR,IAAAqsB,GAAAA,GAAA,OAAA,CAAA,EAAA,OAAA+B,EAAA,SAAA,QAAa3/B,EAAA,KAAA,IAAA,EAAAogC,EACI/oD,EAAAA,EAAAA,GAAAA,GAAAA,IAAauoD,EAC1B,CAAQtwD,SAAAA,CAAAA,CAAc+H,CACvB,MACSuoD,EACZ,CAEE1qD,EACE,WAAY0oD,EAAOA,CACjB,GAAA,QACA,CAAA,CAIE59B,CAAAA,CAAAA,CAAwBogC,CAAAA,EAAAA,GACnB7uB,EAAAuyB,EAAAlvD,EAAA,IAAA,CACLorB,MAAAA,eAA6B,SAC/B,CAAAjrB,EAAAS,EAAA,CACAoqD,KAAAA,MAAmB,CAAA,EAAA,IAAE5/B,EAAAA,EAAAA,CAAAA,GAAS,QAAC,CAAA,CAAA,CAE/B4/B,CAAAA,EAAAA,IAAAA,GAAAA,GAAmB,OAAA,CAAA,EAAA,OAAAQ,EAAArrD,EAAA,IAAA,CAAA,MACrB,eAAA,SACFH,EAAA,QAAA,CAAEE,SAEFC,GAAAgC,QAAA,CAAA3H,KAAA,WAAsB,OAAA,GACf,QAAA,GAEV00D,IAAAA,CACC,CAAGzuD,EAAAA,IAAMN,EAAAgC,EAAA,CAAcjC,GAAAA,SACfW,OAAK,CAAU,EACrBV,EAAAA,OAAAgC,IAAA,KAAAqpD,CAAA,CAAA,CAAA,CAAA,CAA+C,CAAA,CAAA,CAC9C,CAGH,CAAA,EAAG/qD,KAAMN,EAAA,IAAA,CAAcD,MAAAA,gBACrB,SAAAA,EACEC,QAAA,CAAA,SACOA,EAAAgC,EAAA,CACLg/B,GAAAA,QAAM,CAAA,CACC,CAAA,CACF4pB,CAAAA,EAAe,CACrB,CAAAO,GACDnpD,QAAAnC,EAAA,MAAA,CAAA,MAAAxF,eAAA,SAAAC,CAAAA,EAAA,IAAA,CAAA,SAEGsvD,EAAI1mD,EAAWR,CAAuB,GAAA,QAAA,CAClC,CAAC,CACH,EAAA1C,EAAA,KAAA,CACN,SAELA,EAAA,IAAA+vD,GAAAlwD,EAAA,KAAA,CAAGS,SAAM,CAAAT,EAAA+T,GAAA,CAAe7T,GACtBC,eAAA+vD,EAAA,EAAA,GAAAhwD,UACEiC,EAAAA,EAAA,CAAA,KAAA,UAAA,CAIO,EAAA,IAAAhC,EAAA,OAAA,CACF,SAAA+vD,EAAA,QAAAnG,EAAA,YAAA,IAAA,KAAAmG,EAAA,OAAA,EAAA,IAAA,KAAAA,EAAA,KAAA,CAAA,EAAA,OAAAnG,EAAA,OAAA,IAAA,KAAAmG,EAAA,KAAA,CAAA,CAAA,EAAA,CAEN5E,CAAAA,CACD,CAAK7qD,EAAM,IAAAT,EAAA,OAAA,CAAcE,SACvB,CAAAC,EAAA,QAAA,CAAAD,yBACE,SAAAC,EAAAgC,EAAA,CAAyB,GAAA,SAE3B,OAAA,CACGmpD,EAAAA,EAAAA,KACC,CACO,CAACppD,CAAwB,CAAGhC,EAAAA,IAAAA,EAC/BC,SAAK,CAACU,KAAK,SAAY,MACvBV,qBAAAD,QAAAA,SACM2rD,CAUJpxD,GAJK,QAAA6B,EAET4D,CACSO,GAAM,QAAA,CACX,CAAAjG,EAAA,CAAAuJ,IACSmsD,EAAG3jB,GAAAA,EAGX,CAEHpsC,GAAA,SACO,OAAA,CACC,EAAA+vD,EAAA,EAAA,CAEJ,CAAmB5zD,CAAAA,EAAC,MAAAq2B,GAAA,QAAA,IAAAu9B,EAAA,EAAA,EAAAC,GAAA31D,YAAA,EAAuBgC,GAAAF,EACvC8zD,CACED,YAAc7zD,OAAAA,CAChB,EAAA4zD,EAAA,EAAA,CAAA,CAAA,CAAA,EAAyB11D,EAAE,CAAA,CAAC,EAE9B,SAAMm4B,EAAGu4B,EAAQmF,CACjBF,KAAIpzB,IACJvgC,IAAAA,EAASF,CAAC,GAAA9B,QAAA,CAAA,CAAgBA,CAAAA,CAAE,CAAA,CAAA,CAAS,CAAA,CAAA,CACrC4wD,EAAAA,EAAAA,EAAAA,CAAAA,CAAe,CAAA,EAAAE,EACjB,QAAA,GAAAnrD,EAAA,IAAA,CAAA,SACFA,EAAA,QAAA,CAAA,SAAED,IAEDU,CAAI,GAACC,QAAK,CAAA,CAAOvE,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,CAAA,CAAA,CAAA,CAAA,EAAA2kB,IAAQ,WAAAjhB,EAAA,MAAA,CAAA,MAAA,yBAAC,SAAC,CAAEG,EAAA4jB,GAAA,CAAA,OACzB,EAAA,CAAA,EAAA5jB,EACJ,IAAA,CAAA,MAtCA+vD,gBAwCT,SAEH5E,EAAAA,EAAa1wD,CACZsF,GAAAA,QACE,CAAA,CACE,CAAA,EAAAC,EAAA3F,IAAA,CAAA,MAGO,gBAAA,SACF2F,EAAAgC,EAAA,CAEV,GAAA,QAAA,CAEJ,CAAA,CACE,CAEN8e,CACC,CAAA,EAAKxgB,IAAM,WAAAT,EAAAC,EAAA,CAAwBC,SAAA,CACjCC,EAAC4jB,MAAM,CAAC9B,MAAAA,iBAAQ,SAChB,CAAAriB,EAAA,OAAA,GAAAO,EAAA,IAAA,CAAGM,SAAMN,EAAA,IAAA,CAAeD,WACtB1F,SAAAuvD,EAAA,YAAA,IAAA,KAAAnqD,EAAA,CAAA,EAAA,SAAA,EAAA,IAAA,KAAAA,EAAAA,EAAA,OAAA,CAAA,EAAA,SAAA,CAAA,CAAA,CAA6B,CAAA,CAC5B,EACHO,EAAA,QAAA,CAAGM,SAAM,CAAAN,EAAA,SAAA,CAAeD,WACtB,OAAA,CAAAwtD,GAAAT,IAAA,aAAAsB,KAAA,MAAA/zD,KAAA,SAAsC,MAAA,eACpC,QAAA,IAAA,CAGPymB,EACChhB,KAAAA,EAAAC,GACE,IAAA,EAAKO,GAAM,WAAA,KACF7F,IAAAA,EACLsF,GACE,KAAA,CAAGO,EAAUP,SACV6pD,EAAIuG,EAAAA,CAIJ,GAAA,QAAA,CAGPtwD,CAAA,CAAAE,EAAAA,GACEC,OAAA,GAAAH,EAAA,SAAA,CACErH,cAMA0H,MAAK,cACLI,QAAM,IAAAwpD,EAAA,CAAAD,CAAA,EACN1pD,SAASA,CAAAA,EAAM6B,EAAA,CACb2qD,GAAAA,QACAE,CAAAA,EAAAA,IAAAA,EAAAA,EAAkB,CAClBuD,KAAAA,eACAlD,MAAAA,CACAF,UAAanD,EAAK,iBAAA,cAAA,CACpB,CAAE9pD,CAAAA,CAEF,CAAA,CAAA,CAAA,CAAA,CAAA,CAA2B,CAAA,EAACC,EAE7BgsD,MAAOvxD,CACN,MACEyF,gCAAK,OACLI,CAAAA,EAAM,SACNH,EAASA,MAAM2pD,CAA6B,MAAE/pD,yBAE9C,SAAAC,EAAA,MAAA,CAAA,MAAyB,8BACpB,SACEgsD,EAAA,IAAAI,GAAA,CACL1qD,KAAAA,CACE2uD,KAAAA,EAGF,OAAA/D,EACA,QAAAJ,GAEL,MAAAC,EACK,OAAA9/B,EAAA,EAEV+/B,EAAW,CAAwC,SAAArwB,GAAch8B,MAAAA,GAC1DO,YAAAA,EAA8BP,IAAAA,GAC5BO,MAAAA,GAAmCP,iBAAAA,GAEpC,SAAAy7C,GAAQE,MAAAA,GAAM4Q,OAAAA,GAAQJ,YAAAA,EAAAA,EAASC,EAAO9/B,GAAAA,GAAAA,EAAAA,EAAO,IAAI+/B,GACjD,GAAArwB,GAAM,CACJA,MAAAA,GAAAA,GAAAA,EAAAA,EACA14B,GAAAA,GAAAA,EAAAA,EACAk6B,GAAAA,GAAAA,CAAAA,GAAAA,GAAAA,CAAAA,EAAAA,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACAhrB,OACAohB,EAAAA,IAAAA,CACA28B,KAAAA,GACA9U,OAAAA,SACA9wC,IAAAA,WACAC,MAAAA,aACA4lD,MAAAA,GAAAA,CACE7U,iBAAAA,OAAAA,GAAAA,KAAAA,GAAAA,CAAAA,IACJ,uBAA4B,QAAAre,GAAA,KAAA,GAAA,CAAA,QAC5B,EAAIA,CAAAA,EACJ,SAAItB,EAAU,UAAA,CACZ,SAAMC,CAAAA,EAAAA,UACN,SAAMw0B,EAAAA,OACNnzB,IAAAA,GAKF,IAAAizB,YAKU/9C,OAAAA,GACNlR,QAAO,MAAA,CACH,CAAA,CACJf,EAAAA,EAAM,MAAA,OAEJ+8B,eAEM,SAAA,CAAAx9B,EAAkB,SAAOw9B,CAGzB,SAAA,CAAAx9B,EAAA,MAAwB,CAIzB,MAAA,eACNE,SAED,CAAAC,EAAA,OAAA,CAAAD,MACEC,SAAAD,SACE0/B,EAAA,CACEjjB,EAAKmX,IAAAA,CAAAA,CAAAA,IAAAA,EAAAA,EAAAA,CACL/yB,SAAK0vD,IAAAA,CACL5lD,EAAAA,CAAAA,CAAAA,IAAAA,EAAAA,EAAAA,CACAC,SAAAA,EAAAA,GAAAA,CACA+f,SAAQ6lC,GACT,OAAA,OAAA,CAEH1wD,CAAA,CAAKS,CAAAA,CAAM,CAAcP,EAAAA,CAAAA,CAAAA,IACvBC,EAAA,KAAA,CAAAD,MAAAA,QACOO,KAAAA,GAAoBP,IAAAA,OACvB,MAAAsD,GAAY,SAAQtD,EAAE0/B,CAAAA,CAAM,CACV,CAAA,EAAA,CAAA,CAAA1/B,GAAEC,EAAA,IAAA,CAAA,MAClB,cACA,KAAAD,GACe,IAAA,OACDwwD,MACVrtD,EAAO,SACRq6B,CAAA,CAAA,EAACv9B,EAEL,KAAA,CAAA,CAAA,EAAAA,EAAA,IAAA,CAAA,MAEAqD,CAEC/C,WAAM,QAAA,EACAk7C,SACFx7C,EAAAgC,EAAA,CACJqB,GAAAA,SAAatD,OAAAA,CAIhB,EAAAmsD,GAAA,IAAAtjB,IAAA,CAEArL,KAAAA,CAEO,aAAA/qB,GACAgpC,YAAAA,EAAAA,EACF5S,GACJvlC,OAAOk6B,EAAAA,SAAAA,CAAYx9B,KAElBw9B,SAGL,MAAK,QAEI,MAAA,CACLrW,QAAY,CAAA,EACZnnB,QAEFiC,IAAA,CAAA9K,GAAA,eAAA,EAAAA,GAAA,gBAAA,EAEGg1D,KAAQ1pD,CACD,GAAAivC,EAAA,EAAEj/B,GAAc8O,GAAAA,EAAAA,EAAgBsnB,EAAAA,KAAAA,CACtC,EAEI1oC,SAAKF,EAAAsS,GAAA,CACLhS,IAAMkS,GACN9Q,KAAO,IACLkV,IAAAA,EAAS,CACX,CAAA,CAAA,CAEE1f,CAAAA,CACAA,CAEA,CAAA,CAAM,CAAA,CAAA,CAAEmD,CAAAA,CAAAA,CACRwyD,CAAAA,CACAF,EAAAA,EAAAA,CAA+B,CAAA,CACjC,CAAA,CAEO,CAAA,CACAn6C,CAAAA,EAAAA,EAAAA,QAAAA,IACL7R,KAAK,KAAAX,EAAA,MAAA,CAAA,MAAA,6BACAshB,SAAAA,EACN,CAAA,EAAAthB,EAAA,MAAA,CACK,MAAA,wBAEX,SAAAywD,EAAC,CAAA,GAAAhxD,EAAA,QACG,GAAAI,EAAA,MAAA,CAAA,MAAA,kBACL,SAAA,CACDA,EAAC,QAAA,CAAA,MACC,aAAA,SACR,CAAAG,EAAA,QAAA,CAEP,KAAC,QACE,KAAA,aACF,QAAA0sD,EAAA,YAAA,IAAA,MAENjtD,SAAMhF,KAEE6F,EAAM,KAAA,CAA4BP,CAAE6uD,CAEzC5uD,EAAAA,EAAAgC,EAAA,CAAK1B,GAAM,QAAA,CAAuBP,EAAAA,IAAE0wD,EAAAA,OAAAA,CAEvChxD,MAAMhF,QACA6F,SAAMb,EAAA,MAAA,CAAiBM,CAAAA,CAC1B,CAAA,EAAOO,OAAM,QAAAwoD,EAAA,EAAA,IAAA,CAAA,CAAA/qD,EAAAuE,CAAA,IAAA,CAAA,CAAAouD,EAAA3yD,CAAA,GAAA8B,EAAA,QAAA,CAAYE,MAAAA,aACvB,OACO2wD,EAAA3yD,CAAA,EAAA0B,EAAA,OAAA,KAAA,QAAA,CAAA,EAAA,IAAA,SACA,CAAAO,EAAA,QAAA,CACLqb,KAAAA,QACA/F,kBACEq3C,QAAAA,EAA0B,gBAAK5uD,EAAA,YAAA,EACjC,SAAA,IAAA,CAEFiC,EAAAjC,CAAA,EAAAA,IAAA,WAAkBqyD,GAAC,cAAA,EAAM9vD,GAAM,MAAA,KAASb,IAAMhF,EAE/Cge,CAGK,CACEnY,EAAAA,EAAAA,CAAM,EAAA,IAAAN,EAAA,OAAA,CAENqD,cAICtD,SAEDC,EAAAjC,CAAA,CAAA,CAAA,CACEmC,CAAK,EAAA4R,EACLkD,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,EAAAvV,EACL4b,QACEqxC,GAAAA,CAAAA,CAAAA,IAAuB1uD,EAAAA,MACvBD,CAAgB,wCAGhB4uD,IAAAA,GACA,SAAI5uD,IAAkB,IAAA4yD,GAAA9wD,EAAA,QAAA,CACpBuwD,MAAAA,gBACApD,cAAAA,EACAE,SAAAA,CAAAA,EAAAA,QAAe,CAAA,KACjB,QAEF,KAAA,gBACD,QACOK,IACRoD,EAAMrwD,SAAM,IAAA,CAAOP,IAAkB,CAAS,EAzBzC+R,QA4BZ,IAAA,CAGErX,IAAiBgyD,GAEdI,GAAA,IAAA,EAIJ,CACEvsD,EAAAA,EAAMgS,GAAA,CACN,IAAAk6C,GAAamE,CAAAA,EAAAA,cAAAA,GAAAA,CAAAA,EAAAA,OAAO5wD,KAAAA,MAMlBG,IAAAA,GAAKssD,GAAAmE,CAAA,EAAA,WAAA,MAAAnE,GAAAmE,CAAA,EAAA,IAAA,GAAA,CAAA,EACL37C,IAAKhV,EAAA,OAAA,CACLqb,cACA/F,SAAUA,GAAMq7C,CAAA,CACd9D,CAAAA,EAAAA,EAAAA,OAAAA,CAEF,MAAA,WACA1sD,SAASA,GAAMwwD,CAAA,EAAA,QACb,CAAA,CAAA,CACE9D,EAAAA,GAAAA,CAAAA,IAAAA,GAAkB8D,CAAI,CAAA,EAAA,CAAA,EAAAjD,GAAA,OAAA,GAAA1tD,EAAA,QAAA,CAAA,MACxB,CACF,WAAA,SACD,cACM,MACLuS,QACEi6C,GAAgDjrC,EAE7C,SACGirC,EAAAA,EAAQmE,CACjB,GAAE,SACGrwD,OAAM,CAAOP,EAAAA,SAAqB,CACxC,CAAA,CAAY,EAAA,eAAYysD,CAAAA,CAAgB3sC,CAAAA,EAAQpgB,EAAQ,QAAA,GAAAI,EAAA,MAAA,CAAA,MA1BhD8wD,kBA8BV,SAES,CAAA3wD,EACLknB,OAAAA,CACA0pC,MAAAA,eACAtqB,SAAStmC,EAAAgC,EAAA,CACX,GAAA,QAAA,CAAEjC,CAEF,CAAA,EAAA,IAAAC,aACS0tD,CAAuB,MAAA,oBAG/B,SAAAxE,GAAA,IAAAnrD,GAAA8B,EAAA,QAAA,qBAKRJ,QAAMhF,GAAU,CACJqyD,IAAA/uD,uBACT7G,EAAA,gBAAA,EAAMoJ,GAAM8tD,KAAA,MAAA,OAAA,KAAA,EACV/zD,EAAkB,SAAA,CAAA2F,EAAA,QAAA,CACd,KAAA,QAAE,KAAA,kBACR,QAAA8sD,IAAA/uD,EAAUuC,SAAM,IAAA,CAAmBP,GAChCmpD,CAAAA,EAEG5oD,MAAM6U,EAAA,sCAAA,KAAApX,CAAA,EAAA,OAAA,SAEUoX,CAAA,CACd,CACEje,CAAAA,EAAAA,CACAA,UAAE83B,EAEJ,CACF,GAAA,QAAA,CAEA,EAEEha,aAAK7Y,GAGHi0D,GAAAA,QACA,CAIApD,EACF,gBAAA7wD,EAIEwG,CAASxG,GAAAA,QAAAA,CAAE,EAAA,aAAMA,EACjB8+C,CAAY9+C,GAAAA,QAAAA,CAAE,EAAA,YAASA,EACvBi/C,CAAej/C,GAAAA,QAAAA,CAAE,EAAA,QAAOA,EACxB+yC,CAAY/yC,GAAAA,QAAAA,CAAE,CAAA,EAAA4B,CAAQ,EAAA+uD,IAAA/uD,IAAAqwD,KAAA,MAAA,KAAA,KAAA,CAAA,EAAArwD,CAAC,CAAA,CAAA,CAAA,EACZ5B,EAAAA,OAAAA,CAAAA,MAAE,eAAA,SAAA9B,EAAA2H,EAAA,CAAA,GAAQ,cAAA,CAAA,CAAC,CAAA,EACf7F,IAAAA,EAAAA,WAAE,CAAA,MAAA,oBAAA,SAASgtD,GAAA,IAAAprD,GAAA8B,EAAA,QAAA,CAAA,MAAC,eACrB,SAEDitD,CAAAA,EAAAA,cAEJ,QACO,KAAA,eAgBV,QAAAuB,IAAAtwD,EAAMuC,SAAM,IAAA,CAAcP,GACxBiC,CAAAA,CAAU3H,EAA2B,SAAA0D,IAAA,WAAAwvD,CAAA,CACjC,EAAA,CAAE,QAAApxD,EACEmE,CAAyBP,GAChCopD,QACC,CAAa,CACX,EACEjpD,CAAAA,GAAK/D,EAELkf,YAEE6xC,CAAc,CAAA,CAChB,EAAAnvD,GACAsE,QAA+BkrD,CAAAA,EAEhCA,GACQpxD,GAAAA,OAAAA,EAAAA,EAAAA,SAAAA,CAAAA,KAAAA,SAAAA,MAAE,eAAA,QAAA9B,IAAA,CAAAwyD,GAAS,IAAA,CAAA,EAAC,MAChB,CAAC1wD,WAAAA,QAAAA,EAAI,SAAA6D,EAAAgC,EAAA,CAAA,GAAM,QAAA,CAAA,CAAC,CAAA,EAZcjE,IAuB/B,CACO,CAAA,EAAAiC,EACLknB,KAAAA,CAAY,MACd,+BAAAwlC,GAAA,EAAA,IAAAI,EAAA,gBAAAA,CAAA,GAAA,EAAA,IAAAS,GAAAf,GAAAe,CAAA,EAAA,0BAAA,EAAA,IAAAc,EAAA,iBAAAA,CAAA,GAAA,EAAA,GAAA,SAAEtuD,GAEF,IAAA,CAAAJ,EAAAkI,IAAA,CAAA,MAAAxN,EAAAsF,EAAA,QAAA,IAAAA,EAAA,GAAA,IAA8BkxD,GAAA,GAAC,OACzBxC,IACN,YAAAC,GAAA,SAAA3uD,EAAA,QAAA,KAAA2uD,GAAA,SAAAzmD,EAAA,IAAAgpD,GAAA,IAAAvC,GAAA,QAAA3uD,EAAA,QAAA,IAAAE,EAAAghC,EAAA,CAAA,SAAA,CAAAgwB,IAAA7wD,EAAA,KAAA,CAOJ,MAAA,WAAA,CAINA,EAAAA,EAAA8wD,GAAA,CACExwD,kBAMgDP,KAAAA,EAG9C,KAAM1F,GAAUyjB,OAChB,CAAA,CAAI+yC,CACJ,EAAA,WAAgBA,EAAW,EAAA,CACzB,CAAA,CAKEA,CAAAA,EAAAA,EAAAA,SAAAA,CAAgB,SAClB1D,GAAA,OAAA,GAAAttD,EAAA,IAAA,CACAyuD,SAAAA,CAAiCj0D,EAAjCi0D,IAAiCj0D,SAEnC,CACW0F,GAAAA,QACW,EAEQ,CAExBkF,WAAoB3M,CAJM,EADf,IAAGqH,EAAO,UAS5B,KAAA,SAEHK,MAAA,UAAAD,QACGotD,IAAAA,CACCptD,GACG2sD,QAAAA,UAA2B,CAAQvwD,EAChC,SAAA6D,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoC,CAAA,CAAC,EAAA8B,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CACrC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,EAAAkzD,IAAGrvD,EACpBA,GAAA,CAAA,QAAA,IACEE,GAAK,EAAA,EAAA,SACLI,EAAAA,MAAM,CAAA,MAAA,QAEJk4C,GAAAA,qBAAkC,SACpC,CAAAx4C,EAAA,SAAA,CAAA,KAAED,SAEF,MAAA,cAAA,QAAyB,IAAAuvD,GAAA,EAAA,EAAA,SAClBtvD,EAEXS,EAAA,CAAA,KAAG,IAEE,IAAAtE,EAGR,CAERkzD,GACCrvD,QAAM,CAAiC,CACrC,CAAKM,CAAM,CAAQjG,EAAG2F,EAAA,SAAA,CAAoBD,SACxCC,EAAA,KAAA,CACEE,SAAKF,EAAAgC,EAAA,CACL1B,GAAM,QAAA,CACNH,CAAgC,CAAEJ,CAE7B,CAAA,EAACW,EAAAA,OAAK,CAAA,SAAOvE,EAAAA,KAAAA,CAAAA,SAAAA,CAAAA,EAAAA,KAAAA,CAAE,SAAA6D,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAO,CAAA,CAAC,EAAA2F,EAAA,KAAA,CAAG,SAAAA,EAAAgC,EAAA,CAEjChC,GAAA,QAAA,CAAAD,CACE,CAAAA,EAAAA,EAAAA,KACEiC,CAAA3H,SAAA2F,EAAAgC,EAAA,CAAkB,GAAA,QAAA,CAChB,CAAA,CAENhC,EAAAA,EAAA,KAAA,CAAAD,WACEiC,EAAA,CAAAjC,GAAAA,QACE,CAAAA,CACE,CAAA,EAAA1F,EAAA,KAAA,CAAA,SAAuB2F,EAAAgC,EAAA,CAEzBhC,GAAAA,QAAA,CAAAD,CACE,CAAA,EAAA1F,EAAA,KAAA,CAAA,SAGO2F,EAAAgC,EAAA,CAEThC,GAAAA,QAAA,CAAAD,CACE,CAAA,EAAA1F,EAAA,KAAA,CAAA,SAA2B2F,EAAAgC,EAAA,CAE7BhC,GAAAA,QAAA,CAAAD,CACE,CAAA,EAAA1F,EAAA,KAAA,CAAA,SAIO2F,EAAA,QAAA,CAETA,SAAAH,EAAA,QAAA,CAAAE,UACEiC,EAAAA,KAAA,CAAA,SAAA,CAAAhC,EAAA,KAAA,CAA4B,SAAAA,EAAAgC,EAAA,CAE9B,GAAA,QAAA,CAAAjC,CACE,CAAA,EAAAC,EAAA,KAAA,CAGO,SAAAA,EAAA,MAAA,CAET,SAAA,GAAA,CAAAD,CACE,CAAA,CAAA,CAAA,CAAgC,EAAAF,EAAA,KAAA,CAoBlCG,SAAA,CAAAA,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAAjC,WACE,CAAAA,CACE,CAAAA,EAAAA,EAAAA,KACEC,CAAAD,SACEC,EAAAgC,MAAAA,CAAA3H,SAAA,GAAA,CAAuB,CAAA,CACrB,CAAA,CACJ,CAAA,EAAA0F,EAAAA,MACE,SAAAA,CAAAA,EAAK,KAAA,CAAC,SAAKC,EAAAgC,EAAA,CACR,GAAA,QAAA,CAEPnC,CAAA,CAAAE,EAAAA,EAAAA,KACEC,CAAAD,SACEC,EAAAgC,MAAAA,CAAA3H,SAAA,GAAA,CAA2B,CAAA,CACzB,CAAA,CACJ,CAAA,EAAA0F,EAAAA,MACE,SAAAA,CAAAA,EAAK,KAAA,CAAC,SAAKC,EAAAgC,EAAA,CACR,GAAA,QAAA,CAEPnC,CAAA,CAAAE,EAAAA,EAAAA,KACEC,CAAAD,SACEC,EAAAgC,MAAAA,CAAA3H,SAAA,GAAA,CAAyB,CAAA,CACvB,CAAA,CACJ,CAAA,EAAA0F,EAAAA,MACE,SAAAA,CAAAA,EAAK,KAAA,CAAC,SAAKC,EAAAgC,EAAA,CACR,GAAA,QAAA,CAEPnC,CAAA,CAAAE,EAAAA,EAAAA,KACEC,CAAAD,SACEC,EAAAgC,MAAAA,CAAA3H,SAAA,OAAA,CAA6B,CAAA,CAC3B,CAAA,CACJ,CAAA,EAAA0F,EAAAA,MACE,SAAAA,CAAAA,EAAK,KAAA,CAAC,SAAKC,EAAAgC,EAAA,CACR,GAAA,QAAA,CAEPnC,CAAA,CAAAE,EAAAA,EAAAA,KACEC,CAAAD,SACEC,EAAAgC,MAAAA,CAAA3H,SAAA,GAAA,CAA+B,CAAA,CAC7B,CAAA,CACJ,CAAA,CAAA,CACE,CAAA,CAAK,CAAA,CAAU,CAAA,CAAA,CACZ,CAAA,CAEP,CAAA,CAAA,CACE,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAA2B,CAE7B,MAAA02D,GAAAh4D,GAAAgH,SAAAA,CACE,KAAAJ,CAAK,EAAA,CAAM,KAAA,CACR,GAAAtF,EACF,QAAA8X,EACA,MAAA4a,EACF,OAAAjP,EACJ,MAAAmV,EACH,YAAAikB,EACC,mBAAAlI,EACH,cAETgiB,EACE,UAAAjhB,EAET,WAAAwL,EAEA,WAAA+R,CACY,EAAE3tD,EAAQsxD,EAAA/Z,GAAAlI,IAAA78B,EAAA,GACZs8C,EAAA,CAAA,CAAA1e,GAAAA,GAAA,SAAA,OACJ11C,EAAAA,GAAAA,CACA8X,EAAAA,QAAAA,EACA4a,OACAjP,EAAAA,UAAAA,CACAmV,MAAAA,aAAAA,EAAAA,QAAAA,EAAAA,SAAAA,GAAAA,GAAAA,GAAAA,CAAAA,EAAAA,QAAAA,GAAAA,OAAAA,gBAAAA,EAAAA,IAAAA,EAAAA,WAAAA,EAAAA,IAAAA,EAAAA,WAAAA,EAAAA,eAAAA,CAAAA,GACAikB,aAAAA,EACAlI,SAAAA,CAAAA,EAAAA,OAAAA,CACA0b,MAAAA,cACAD,SAAW1a,EAAAA,EAAAA,OAAAA,CACXwL,MAAAA,qBACA+R,SAAAA,CAAAA,EAAAA,GAAAA,CACE3tD,IAAAA,EAAAA,cAAAA,EAAAA,OACEsxD,SAAY/Z,EAAAA,GAClB,CAAMlH,EAAAA,GAAeD,KAAAA,EAAAA,CAAAA,MAA0B1rC,IAAAA,GAAWrE,EAAAsS,GAAA,qBAEhC4C,EAAA,OAClBxW,SAAUwW,EAAA,GACdxc,CAAAA,CAAAA,EAAQga,GAAI,IAAA1S,EAAAS,EAAA,CACV,KAAGd,QAAAA,CACJ,EAAA,IAAAK,EAAA4S,GAAA,CACH,QAAAkL,EAAA,QACF,WAAA,EAEA,CACEje,EAAA,CACES,EAAOkzB,GAAAP,CACLlG,EAAAA,EACI,OACAjP,CAUNozC,MAAAA,oBAAyBnxD,SAEzBC,CAAAA,EAAAsS,GAAA,CAAMhS,IAAM6R,EAAA,cAAAA,EAAA,OAAapS,SACtB+d,EACCje,GAAA,CAAMS,EAAAA,IAAMN,EAAAS,EAAA,CAAoBV,KAAAA,OACvB,CAAA,EACLwS,IAAKJ,EAAAA,GAAQK,CACb6qC,UAAUlrC,cAAQ0a,SAAAA,EAAAA,QACnB,WACAygC,EAEY,CAAA,CAAC/6C,CAAyBgP,CAAAA,OAAoBsL,CAAI,QAAA1a,EAG1D,WAAM,EAAA,CAAA,CAKF,CAAA,EAAAnS,KAAU8d,CAAO3L,KAASo9B,GAAU5vC,EAAA,WAAAowC,CAAG,CAAA,EAC5ClwC,EACJ2zB,OAASP,CACX,MAAM3yB,YAAM,SAAmBP,CAAAA,EAC7BC,GAAO,CAAA,KACLuS,GAAaC,CAAwB+O,CAAAA,EACrC87B,MAAUlrC,GAAQ0a,CAAI,SAExB7sB,IAACS,KAAAA,GAAI,WAAAd,EAAA,SAAA,EAAA,OAAM,OAAA,CAAA,CAAO,CACT,CAAA,CAAA,CACuCwS,CAAAA,CACpC,EAAA,CAAA4+B,EACVC,IACED,GAELn+B,MAAAA,KAAQo+B,GAAA,MAAA,EAAA,EAAC7+B,GAA4B,CAAA,CAAA,KAAAlN,EAAE,GAAAlD,EAGnC,GAAAotC,CAAiBxvC,IAAMowC,CAAAA,MAChClwC,EAAAzH,EAAA,EAAMkI,CAAAA,EAAM6wD,CAAA,EAAA93D,EAAA,EAAA,EAAAhB,OAAAA,EAAW0H,IACrBC,CAAU,QAAO8d,IAAUne,qBAAAA,GAAAA,CAC1BqD,EAAAA,CAAAA,mBAECE,eAAO,IAAAiuD,EAAA,EAAA,CAAA,EACPtqD,EAAA,UAAA5G,EAAA,OAAA,EAEG,EAAA,QAIX,WAAO8wC,GAAUpxC,KAAMtF,IAAAA,IAAO22C,OAAUrxC,OAAMtF,GAAAA,CAAAA,IAChD,CACF,EAEA,4BAAkC4F,EAAA,OAAA,EAAEgF,IAAAA,CAAMlD,EAAAA,SAAAA,EAAAA,UAAAA,EAAAA,OAAAA,CAAI,CAAS,EAAA,CAAA,CAAM,IAC/C3J,EAAO,KAAA,CACnB,SAAOg5D,EAAMD,GAAO,CACpB94D,GAAAA,EACE,SAAMwO,EAAWkqD,GAAIM,CAEjB,GAAAliB,CACA,CAAA,CACEyI,CAAAA,CACA/wC,CAAAA,EAAAA,EAAAA,KAASyqD,CAAqB,IAAArxD,EAElC,MACA,CACEgF,OAAAA,KAAAA,CACkD,CAAA,CAGtD,EACAssD,GAAa,EACXC,GAAQl5D,EAAuC,SACjD21D,GAAAtuD,EAAA,CACF,KAAK,CAEL,YAAA0zB,EACEtzB,QAAAA,EACO,KAAAuH,EAACvF,iBAAAA,EACK,KAAA25C,CAAKvM,EAAKxvC,EACf8xD,EAAAnqD,GAAA,SAAA,OAAAA,EAAA,QAAA,OAAA,CAAA8Z,EAAAswC,IAAAtwC,EAAAswC,EAAA,MAAA,EAAA,EAAA,GAGR,OAAAr+B,EAAA,OAAAs+B,GAAAz0B,CAAA,EAAAu0B,EAAA,QAAA,KAAAlvC,GAAA,OAAAgvC,GAAAhvC,EAAA,OAAAm5B,GAAA,MAAA8V,GAAA,EAAIvxD,CAAiB,MAAE0K,GAAQ,GAAA,SAAMinD,GAAA,CAAE,KAAAjyD,EAE3C,WAAAowC,CAGA,EAAA,CACA,KAAMyhB,CACN,EAAAx0C,CACE,EAAA9jB,GAAM,EAAA,GAAEm6B,CAAa6J,YAAAA,EAAS51B,UAAAA,EAAMib,QAAAA,EAAkBm5B,OAAAA,EAAK,KAAAp0C,EAC3D,iBAAAib,EAGA,KAAAm5B,EAQA,YAAAxE,EACF,mBAAAlI,EAEA,QAAA78B,EAEA,QAAA0/C,EAAoBlyD,MAAAA,CAAAA,EAAMowC,EAAW,MAAG+hB,EAAA5a,GAAAlI,IAAA78B,EAAA,IAAA,CAAA,CAAA0/C,EACtC,IAAAE,EAAM52C,GAAA,GAAAqY,GAAAP,CAAA,EAAAA,EAAA,cAAAA,EAAA,MAAEh6B,GAAAA,aAAAA,GAAAA,aAAAA,EAAAA,MAAGC,GAAAA,QAAA4zB,EAAA,KAAA,GAAAilC,EAAA,MAAA,EACP,CAAAxvC,GAAA,QAAAwvC,GAAA,kBAAA,SACF1+B,EAAAA,EAAAA,kBAEA6J,MACApQ,EAAAA,CAAAA,CADAoQ,GAAAA,EACApQ,yBAAAA,EACAxlB,EAAAA,GAAAA,CAAAA,GAAAA,CAAAA,GAAAA,GAAAA,SAAAA,OACAib,EAAAA,EAAAA,GAAAA,CAAAA,EAAAA,GACAm5B,EAAAA,CAAAA,GAAAA,EAAAA,OACAxE,EAAAA,MAAAA,CACAlI,MAAAA,YACA78B,MAAAA,EAAAA,GAAAA,EACA0/C,SAAAA,CAAAA,EAAAA,OAAAA,CACA5+B,MAAAA,oBACEtzB,SAAAA,CAAAA,GAAAA,CAAAA,GAAAA,EAAAA,EAAAA,CACEmyD,UACH5a,EAAAA,OAAAA,CACC6a,MACF52C,iCAGE42C,SAAU1+B,QACd,OACA,CAAK9Q,EAAAA,GAAkB9nB,GAAUs3D,kBAA4Bt3D,OAAQ,CACnE8nB,MAAAA,qBACF,SAAAwtB,GAAA,UAAA/yB,EAGMg1C,aAKAC,OAAW/0B,CAEXg1B,EAAAA,EAAmB7+B,SAEzB,CACE,CAAW,EAAoBA,EACvB/yB,IAAyB,QAE3B,CACE,CAAY,CAAA,EAAgCP,EAAAA,EAAC,CAAM,SAAW,CAAA,CAAA,CAAAszB,GAAAxzB,EAAA,OAAA,CAGjE,0BACOS,SAAM,CAAAN,EAAAS,EAAA,CAAoBV,KAE7BgwC,KAAqB/yB,WAAAA,WAAAA,EAAAA,CAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,EAClBk1C,GAAAryD,EAAA,MAAA,CAAA,MAAA,iBAAA,SAAA,CAAAiyD,GAAAjyD,EAAAC,EAAA,CAAA,SAAciwC,CAAAA,EAAWoU,OAAAA,CAAS,MAAA,iCAAC,SAAAnkD,EAAAgC,EAAA,CAACgb,GAAAA,QAAAA,CAAAA,CAAAA,CACpC,EAAA,GAAA,CAAA,CAAA,EAAA3iB,CAAAA,CAAA6iC,GAAAl9B,EAAA,MAAA,CAAU,wBAAA,CAAC,OAAAmyD,GAAAj1B,EAAApQ,CAAA,GAAAilC,GAAA,QAAA,uCAAAA,EAAA,OAAA,gBAAA,GAAA,CAGjB,QACK1+B,SAAAA,UACD,QAAA,IAAA++B,GAAAvyD,EAAA,MAAA,CAAMS,SAAM,CAAAgH,EAAA,SAAA,KAAA,IAAA,IAAA8qD,EAAA,KAAA,CAAA,CAAmBryD,CAAAA,EAAAA,CAAAA,GAC5BU,GAAI,SAAA,GAAA8hB,EAAA,CAAA,EAAA,aAAA1iB,EAAAC,EAAA,CACHY,SAASsxD,CAAAA,EAAAA,OAAAA,CACR,MACF3+B,8BAGJ6+B,SAAAA,KACC,CAAK5xD,EAAAA,IAAMN,EAAA,MAAA,CAAgBD,SACxB+xD,EACChyD,CAAAA,EAAAA,WAAA,CAAAC,CAAAA,CACE,CAAA,CAAA,CAAY,CAAA,CAAA,CACV,CAAA,CAAA,CAAA,CAAA,GAAA,CAAAgwC,GAAoBA,GAAA,SAAA,SAAAlwC,EAAA,OAAA,CAAA,MAChB,yBAAK,SAGZq9B,CAAAA,CAAAA,CAAAA,GACDl9B,EAAA,OAAA,CAAA,MACEuwB,+BAAyB,SACvBE,CAAAA,EACE0hC,EAAAA,CAGI,KACR,OAAE,KAGH7qD,GAEC,CAAA,EAAAvH,EAAAA,EACGuH,CAAoC,GAExC,QAIC,CAAA,CAAA,CACE,CAAA,EAAAib,GAAY,OAAAA,EAAA,IAAAjI,GAAA,CAAA,MAA6Bva,EAACua,EAAA,YAAAA,EAAA,IAAS+3C,EACnD/3C,EAAA,kBAAAA,EAAA,UAAAva,EAAAA,EAAMwiB,MAAAA,SAAiBjI,EAAC,KAAEijB,SAAAA,MAAAA,EAAAA,MAAAA,OAAAA,OAAAA,EAAAA,MAAAA,UAAAA,MAAkB5yB,EAAA2P,EAAA,MAAA,SAAAA,EAAA,KAAA,SAAA,OAAAA,EAAA,MAAA,OAAA,QAAAA,EAAA,MAAA,UAAA,OAAA,OAE/Cta,EAAA,OAAA,CAEN,MAAA,kBAEJ,SAAA,CAEA+vC,OAAAA,OAAqCuiB,IACtC,MAAA,CAAY,IAAAC,QACPjrD,GACKhH,OAAMkyD,GAA8BzyD,IACxCC,EAAAA,YAAMU,QAAK,OAAOC,QAAKzJ,GAAA,CACvB8I,KAAAgC,CAAA,IAAAwa,CAAA,EAAmBtlB,EAAA,eAKXq7D,EAAAA,OAAaE,IAAAA,EAEb/nD,EAGAC,MAAAA,mBAIJ,GAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAAD,EAAAC,CAAA,EAAA,IAAA,CAAA,EAAA,GAAA,CAAA,GAAA,CAAuB,CAAiB5K,EAAAA,EACrC,OAAA,CACC4zB,MACG4+B,uBAEG/1C,SAAK+1C,IAAAA,CAAAA,EACEC,MACP7nD,GAAQ6nD,IAAAA,EAAAA,EAAAA,MAAAA,CACR5xD,IAAK0Z,EACLoQ,MAAAA,GACAuE,UACE,IAAA3U,EAAA,YAAM,QAAEkC,OAAAA,QAAUnb,GAAAA,CAClB,MACEnK,IAAAA,CAAem7D,EACjBn7D,EAAA,OACFslB,IAAA+1C,IACA7wD,EAAAA,OAAO,IAAA2wD,EAKP,CAAA,CACD,EAEDryD,EAAA,OAAA,CAAMM,MAAM,uBAAsBP,SAAC,KAAA,CAAQ,EAE/C2yD,OACGH,GAAYF,IAAmBC,IAC9B,MAAA,CACE91C,IAAK+1C,EACL7nD,MAAO8nD,GACP7nD,OAAQ6nD,GACR5xD,IAAK0Z,EAAEijB,YACP7S,QAAQ,OACRuE,QAAU/3B,GAAM,CACd,KAAM,CAAEslB,IAAAA,CAAAA,EAAQtlB,EAAEmK,OACdmb,IAAQ+1C,IACVr7D,EAAEmK,OAAOmb,IAAM61C,EAEnB,CAAA,CACD,EAEDryD,EAAA,OAAA,CAAMM,MAAM,uBAAsBP,SAAC,IAAA,CAAS,EAEhD4yD,MAAAA,EACGJ,OAAYF,CAET71C,MAAK+1C,uBACL7nD,SAAO8nD,IAAAA,CAAAA,CACCA,EAAAA,EACR5xD,OAAO28B,IAAAA,EAAAA,EAAAA,EACP7S,CAAQ,CAAA,EAAA,CAAA,CAAAgxB,KACExkD,OAAMo7D,GAAAtyD,EAAA,OAAA,CACd,MAAA,uCAAM07C,EAAA,MAAA,EAAA,GAAA,SAAEl/B,EAAAA,MAAAA,EAAAA,MAAAA,CAAAA,IAAAA,EAAQtlB,MAChB,MAAAs7D,GACEt7D,OAAAA,GAAem7D,IAAAA,EACjB,OAAA3W,EAAA,aAAAA,EAAA,iBAAA,QACF,OAAA,MAGF17C,CAAA,kBAAY07C,EAAA,OAAAA,EAAA,QAAA,GAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAAA,EAAA,MAAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,GAAA,CAAA,GAAA,CAAuB,CAAA,EAAQ17C,EAAA,OAAA,CAAA,MAE/C4yD,uBAAO,SAAMtyD,IAAM,CAAA,CAAuB,CAAA,CAAA,CAAQ,CAAA,CAAA,CACvC,CAAA,CACT,CAMR,SACEA,GAAO,CACU,KAAAX,CAIf,EAAA,CACYg0B,KAAAA,CACH6+B,EAAAA,CACCA,EAAAA,GAEN9W,EAAuC4U,CAEjC,aAAAphB,EACD,aAAA+L,EAUF,gBAAAG,EACL,YAAAyX,CAGF,EAAAlzD,EAAY,OAAAE,EAAsBE,OAAC,CAAA,MAAQ,aAAA,SAGhD,CAAAk7C,EAAA,GAAAp7C,EAAA,OAAA,CAER,MAAA,oBACE,SAAA,CAAAG,EAAAS,EAAA,CAET,KAAA,WAEA,KAASqyD,IAAYnzD,IAAAA,EACb,CAAE1G,GAAAA,QAAAA,CACR,CAAM,CAAEi2C,EAAAA,IAAAA,GAAAA,CAAAA,CAAAA,CAAAA,CAAc+L,EAAAA,EAAAA,GAAAA,EAAAA,OAAAA,CAAcG,MAAAA,kBAAiByX,SAAAA,CAAAA,EAAAA,EAAAA,CAAgBlzD,KAAAA,QACrE,SACQW,IAAMwjD,EAEFxjD,CAAyBP,GAAA,QACxB,CAAM,CAAgB,CAAA,EAAIa,IAAGkjD,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,EAAAA,GAAAA,EAAAA,EAAAA,EAAAA,OAAAA,CAAAA,MAAE,mBAAA,SAAA,CAAA9jD,EAAAS,EAAA,CAAA,KAAS,SAAC,KAAA,IAAG,IAAEqjD,EAK/CxjD,CAAuBP,GAAA,QACtB,CAAM,CAAa,CAAA,EAAIa,IAAGkjD,EAAAA,GAAAA,EAAAA,EAAAA,GAAAA,EAAAA,EAAAA,GAAAA,CAAAA,EAAAA,EAAAA,GAAAA,EAAAA,GAAAA,EAAAA,EAAAA,IAAAA,EAAAA,GAAAA,EAAAA,EAAAA,GAAAA,CAAAA,EAAAA,EAAAA,GAAAA,GAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAE,CAAA,SAAAgL,GAAO3hD,EAAApP,EAAAg1D,EAAA,CAAA,MAACC,EAAA7lD,EAAA,IAAA8kC,GAAA,IAAA,KAAAA,EAAAl0C,CAAA,CAAA,CAAA,EAAGk1D,EAC3C9hC,EAAAA,cAA8B+1B,EAAA9lC,EAAA8lC,EAAA9lC,EAAA4xC,EAAA,CAAA,CAAA,EAGlC9jB,EAAAA,SAAoB2jB,CAAAA,EAAAA,IACnBhzD,EAAAuhB,EAAA8lC,EAAA9lC,EAAA4xC,EAAA,CAAA,CAAA,EAAM1yD,EAAM,KAAA,IAAA4yD,EAAA,UAAA,KAAA,IAAA,CAAA,EAAAD,EAAA,QAAA,EAAkBlzD,EAAAA,MAC5BC,KAACS,CAAI,OAACC,CAAK,EAAA,IAASC,CAAAA,CAAAA,EAAK,OAAAwM,EAAA,QAAO22C,GAAAA,CAAAA,MAAAA,EAAAA,KAAAA,MAAAA,EAAAA,CAAAA,CAAAA,EAAAA,GAAAA,EAAE,KAAA,MAAA+K,EAAAA,EAAA,OAAA,CAAA,EAAA,KAAA5c,CAAA,MAAQ,CAAA,MAACkhB,GAAAhwD,EAAA8vD,EAAA,QAAA,GAAAz2B,EAAK42B,EAC/ClkB,KAAAA,MAAeikB,GAAKN,EACd3jB,EAAAA,IAKPkkB,CAAI,EAAA,KAAAnhB,CAAA,CACJ,CAEV,CAAA,EAES6c,CAEP,CC5kEF,MAAMpjC,GAAQ,GAEd,SAAS2nC,IAAa,CACpB,KAAM,CAAEp6D,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAO,EAAG,aAAa,EAChC,KAAM,CAAEX,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtBm4D,EAAqBl7D,EAAAA,EAC3B,eAAem7D,EAAgB1lC,EAAW,CACxC,OAAIA,GAAa,CAACylC,EAAmBh7D,WACnCg7D,EAAmBh7D,QAAUoB,EAAMM,GAAG+qC,WACnC7qC,KAAK,CAAEC,MAAOuxB,EAAAA,CAAO,EACrBpxB,OAAAA,GAEE,MAAMg5D,EAAmBh7D,QAAQkC,KAAAA,CAC1C,CAEA,OACEwF,EAAC49C,GAAQ,CACPv6C,MAAKlH,EAAE,CAAA9B,GAAA,QAAA,CAAO,EACdA,GAAG,aACHyjD,UAAS3hD,EAAE,CAAA9B,GAAA,QAAA,CAAkC,EAC7C0jD,UAAS5hD,EAAE,CAAA9B,GAAA,QAAA,CAAuB,EAClCV,SAAAA,EACAskD,WAAYsV,CAAAA,CACb,CAEL,CCdA,MAAM3K,GAAiB,CAAC,OAAQ,SAAU,gBAAiB,SAAU,SAAS,EACxE4K,GAA+B,CAAC,SAAU,SAAS,EACnDC,GAAwB,CAC5BC,KAAM,CAAAr5D,GAAA,QAAA,EACNJ,cAAe,CAAAI,GAAA,QAAA,EACfwqC,OAAQ,CAAAxqC,GAAA,QAAA,EACRs5D,OAAQ,CAAAt5D,GAAA,QAAA,EACR8X,QAAS,CAAA9X,GAAA,QAAA,CACX,EAEMu5D,GAAmB,CACvB,EACA,GAAK,GACL,GAAK,GACL,EAAI,GAAK,GACT,GAAK,GAAK,GACV,GAAK,GAAK,GACV,GAAK,GAAK,GAAK,EACf,GAAK,GAAK,GAAK,EAAI,EAGfC,GAA0B,CAC9B,EAAG,CAAAx5D,GAAA,QAAA,EACH,KAAMktB,GAAa,GAAI,QAAQ,EAC/B,KAAMA,GAAa,EAAG,MAAM,EAC5B,MAAOA,GAAa,EAAG,MAAM,EAC7B,MAAOA,GAAa,GAAI,MAAM,EAC9B,MAAQA,GAAa,GAAI,MAAM,EAC/B,OAASA,GAAa,EAAG,KAAK,EAC9B,OAAWA,GAAa,GAAI,KAAK,CACnC,EAEA,SAASusC,IAAU,CACjB,KAAM,CAAE76D,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,CAAAA,EAAUyB,GAAAA,EAClB0rD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAS,EAAG,KAAK,EAC1B,KAAM,CAACymB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAAC06D,EAAyBC,CAA0B,EAAI36D,EAAS,EAAK,EAEtE,CAAC2sB,EAAajU,CAAM,EAAIC,GAAY6C,GAAMA,EAAI,EAAG,CAAC,EAClD,CAACo/C,EAASC,CAAU,EAAI76D,EAAS,CAAA,CAAE,EACzChB,OAAAA,EAAU,IAAM,CACdglB,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAM42C,EAAU,MAAMv6D,EAAMmwB,GAAGoqC,QAAQ/5D,KAAAA,EACvC+5D,EAAQh/C,KAAK,CAAClJ,EAAGmJ,IAAMnJ,EAAE1I,MAAM+R,cAAcF,EAAE7R,KAAK,CAAC,EACrD4wD,EAAQ7sD,QAASwrB,GAAW,CACtBA,EAAOuhC,UAAU15D,QACnBm4B,EAAOuhC,SAASl/C,KAAK,CAAClJ,EAAGmJ,IAAMnJ,EAAE1R,GAAK6a,EAAE7a,EAAE,CAE9C,CAAC,EACD3B,GAAYu7D,EACZC,EAAWD,SAAO,CAClB52C,MAAAA,GACU,OAAA,CACV3kB,CACA2kB,GAAAA,CAAkB,EAAA,CACpB2I,CAAA,CAAA,EACCnmB,EAAA,MAAA,CACL,GAAImmB,eAEJ,uBACO3rB,SAAG,KAAeiG,SAAM,CAAAT,EAAA,MAAA,CAAiBqS,MAAAA,qBAAanS,SACzDF,CAAAA,EAAA,SAAA,CAAKS,SAAMT,EAAA,MAAA,CAAoBE,MAC7BC,cAAAD,YACE,MAAA,CAAKO,MAAM,cAAaP,SACtBF,CAAAA,EAAA28C,GAAA,CAAA,CAAA,EAAAx8C,EAAA4T,GAAA,CAAKtT,GAAAA,IAAmBP,MAAAA,eAEhBgC,SAAG/B,EAAAS,EAAA,CAAIH,KAAM,OAAcP,KAAAA,IACzBW,IAAAA,EAAqBE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAM,CAAA,CAAA,CAAC,CAAA,EAAC6D,EAAE,KAAA,CAAC,SACtCA,EAAAgC,EAAA,CAEThC,GAAAA,QAAA,CAAAD,CACE,CAAA,EAAA1F,EAAA,MAAA,CAAA,MAAqB,cACnB,SACJ2F,EAAA,SAAA,CAAKM,KAAM,SAAaP,MAAAA,QAEpBG,QAAK,IAAA,CACLI,EAAM,EAAA,CACNH,EACE6zD,SAAAA,EAAAA,EAAAA,CACF,KAAA,OAAEj0D,KAAAA,IAEIW,IAAAA,EAAqBE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAY,CAAA,CAAC,CAAA,CAAA,CAAG,CAAA,CAC1C,CAAA,EAAC6D,EACL,OAAA,CAAA,SACHi0D,EAAA,OAAA,EAAAp0D,EAAAC,EAAA,CAEPE,SAAA,CAAAA,EAAA,KAAA,CAAAD,MACGk0D,eACCl0D,SACEC,EAAA,IAAA4yB,GAAA,CAAItyB,KAAM,CAAcP,GAAAA,EAEpB,MAAAsD,EAAQhJ,UAAAA,EAAIgJ,SAAAA,CAAAA,EAAO+wD,EAAAA,OAAWD,EAAAA,KAAAA,CAAS,SAAIvhC,CAAAA,EAAAA,MAAAA,CAC3C,SACE,CAAA5yB,EAAA,KAAA,CAAAD,SACEF,CAAA,CAAAE,EAAAA,GACEC,OAAA,GAAAA,EAAA,MAAA,CAAAD,SAAKsD,EAAAA,IAAAA,GAAAA,EAAAA,EAAAA,CACJ8wD,SAAU15D,CAAAA,EAAAA,OACTuF,CAAAD,MACGo0D,8BACCp0D,SACEC,EAAAA,UAAA,IAAAg2B,EAAA,OAAA,IAAAA,EAAA,OAAA,CAAA,EAAM11B,GAAAA,CAAM,CAAA,CAAA,CAC0B+zD,CAAAA,EAAOr0D,EACrC,QAAG,CAAA,MAEd,gBACE,SAEPA,EAAAs0D,GAAA,CAAOh0D,UAAAA,CAAM,CAAeP,CACb,CAAA,CAAA,CAACq0D,CAAAA,EAAqBp0D,EAAE,SAAA,CAAC,KAChC,SACL,MACL,QACEE,QAAK,IAAA,CACLI,EAAM,SAEJ0zD,CAAAA,CAA2B,EACzBphC,SACD5yB,EAAAS,EAAA,CACH,KAAA,SAAEV,KAAAA,IAEIW,IAAAA,aAAK,CAAA,CAAc,CAAA,CAAA,CAAQ,EAAArG,CAAe,CAAA,CAAA,CACzC,CAAA,EAAA45D,EACP,OAAA,GAAAj0D,EAAA,SAAA,CAER,MAAC,WACC,SACKvF,EAAAA,QACPuF,CAAQM,MAAM,gBAAUP,WACtBiC,EAAA,CAAO1B,GAAAA,SAAqBP,OAC1BC,CAAA3F,EAAA45D,EAAA,MAAA,CAAA,CAAA,CACiBx5D,CAAAA,CAAM,CAAA,CAAA,CAGtB,CAAA,EACIqmB,IAAA,UAAA9gB,EAAA,IAAA,CAAC,MAEX,WACD,SACA8gB,EAAY8C,GAAA,CAAA,CAAA,CACd,CAAA,EAAGtjB,IAAM,QAAAN,EAAA,IAAA,CAAUD,MAAAA,WAEhB,SACD+gB,EAAY9e,EAAA,CACX1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,EAAA1F,EAAA,IAAA,CAAA,MAAqC,WACpC,SAEH2F,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,CAAA,CAAA,CAAA,CAA6B,CAAA,EAAC,CAC7B,CAAAg0D,GAAA/zD,EAAAkE,GAAA,CACJ,MACI/H,EAILkH,CAAKlH,GAAAA,QAAAA,CAAE,EAAA,QAAY,IAAA,CAAC63D,EAAA,EAAA,CACpBhzD,EACEgzD,SAAAA,EAAAA,GAA2B,CAC7B,OAAAD,GAAA,OAAEh0D,WAEDw0D,GACSR,QAAAA,aACE/hC,EAENjgB,EAAO,EAAA,CAAA,CAETiiD,CAAAA,CAAgC,CAAA,CAAA,CAClC,CAAA,CACD,CAEJ,IACEQ,GAAA,EAET,MAAAC,GAAA,IAAAD,KAEA,SAAIA,GAAM,CACV,OAAA5hC,EACA,QAAA5xB,CAAwB,EAAE4xB,CAAQ5xB,KAAAA,CAAW,EAAA8Q,EAC3C,EAAAkL,CAAM,EAAElL,GAAAA,EAAG7Y,QACX,EAAAkC,GAAM,EAAEzB,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,SAAAA,EAAUyB,EAAI,CAAA,CAAAy3B,EAChB,CACN,QAAA58B,EACA,UAAAo+D,EAAQp+D,GAAAA,EAASo+D,SAAAA,EAAW/5D,MAAAA,EAAI85D,aAAAA,CAAAA,EAAU9wD,GAAAA,CAAAA,EAAOqxD,EAAAA,CAAAA,CAAAA,IACpCC,GAAA,IAAA,KAAAP,CAAA,EACPO,CAAAA,EAAcP,CAAAA,EAAAA,EAAAA,GAAAA,CAAAA,CAAAA,EACdQ,EAAAA,EAAgBD,EAChB,CAACE,EAAcC,CAAmBz7D,EAAS86D,EAAAA,CAAAA,CAAY,EACvDY,GAAqBC,CAAA,EAAA37D,EAAA,CAAA,CAAA,EAGrB47D,EAAoBC,EAAAA,OAAwB77D,GAAAA,CAAAA,EAAW,SAAA28B,EAAA,EAAA,GAAA,CAAAm/B,EAAA,SAAAn/B,EAAA,GAAA,CAAA,EAC7D,OAAOm/B,EAAAA,MAAAA,CAEP,MAAMF,QAKN,GAAA,yBACO30D,SAAM,CAAA,CAAA,CAAAU,GAAAhB,EAAA,SAAA,CAAQ3F,KAAG,6BAEV6F,QAAKc,EAASV,SAAMN,EAAAS,EAAA,CAAcN,KAAAA,IAAiBJ,IAAAA,EAC1Ca,CAAGoc,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAO,CAAA,EAAChd,EAAA,SAAA,CAAC,SAAEA,EAAA,KAAA,CAGnCA,SAAAgd,EAAAkI,GACelI,GAAAA,QAAAA,EAAiB,CAAAA,GAAAA,QAAAA,CAAd,CAAiB,CAAA,CAAY,CAAA,EAAChd,EAAA,OAAA,CAAA,SAAKH,EAAA,OAAA,CAErDG,SAAA9I,GAAA,CAAA6I,EAAAA,eACE,UACmB,IAAA,SAAA7I,EAAA,MAAA,EACbmJ,EAAAA,EAAe,IAAA,OAAA,EACXyZ,EAAWA,EAAIC,OAAW1Y,0BAAM,EAChCgC,EAAiBsQ,EAAI,OAAO,+BAAA,EAC5ByhD,EAAat7C,CAAAA,GAASu7C,EAAO,QAAA,iBAA0B,gDAAA,CAAA,EAAA,IAAAxtD,IAAAA,GAAA,OAAA,EACvDytD,EAAkBx7C,EACtB,IAAA,CAAAkc,GAAAnuB,KAAA,CAMF,GAAM0tD,EAAAA,CAAAA,GAAAA,OAKN,QAAMC,GACJn7D,UAAI+6D,EAAiB32D,CAAAA,CAAAA,EACrB41D,EACAoB,MAA8B,QAC9BC,EAAA,QAAAjkB,IAAA,CAYEvsB,QACFwwC,GAAAA,GACEF,SAAAA,EAAwB,CAAA,CACtBn7D,CAAAA,EAED,MACFs7D,EAAA77C,EAAA,OAAA,SAAA,EACH,IAAA87C,EAAA97C,EAAA,IAAA,YAAA,EACA,MAAM9jB,EAAU8jB,EAASu7C,IAAO,eAAS,EACrCO,CAAAA,GAAAA,CAAY97C,GAASnG,SAEb0J,EACVha,SAAAA,GAAAA,SACA+xD,CACAjB,GAAAA,CACA0B,IAAAA,GACAL,GACAx/D,IAAAA,IAAAA,IAAAA,KACA4/D,EACAlB,EAAAA,KAAAA,OAAAA,EAAAA,KAAAA,IAAAA,GAAAA,GAAAA,EAIGrxD,EAAUrN,KAEf4/D,IAAA,KAAAA,IAAA,EAEAv4C,EAAoB,KAGdu4C,EAAA,CAAAA,EAGFE,GAAc,MAAAp8D,EAAA,GAAA,QAAA,QAAAW,CAAA,EAAA,OAAA,CACZ,MAAIu7D,EAKF,QAAIjB,EACFiB,UAAAA,EAGF,mBAAAJ,EACEI,aAAYG,CAAA,CAAA,IAIdH,EAAAA,CAAAA,GAAY,KACdE,GAAO,MAAAp8D,EAAA,GAAA,QAAA,OAAA,CACLk8D,MAAAA,EACF,QAAAD,EACAG,UAAAA,EACEzyD,mBAAAA,EACArN,aAAAA,CAAAA,CAAAA,GAEAw/D,EACAd,SAAAA,EAAAA,IACD,CACH,MAAO,UACLkB,OAAAA,EACAE,CAAAA,CAA6C,MAC3CzyD,CAAAA,EACArN,OAAAA,EAAAA,MACA4/D,EAAAA,EACAJ,CAED,GAAA,QAAA,EAEyB,CAC5Bn4C,GAAAA,QACArc,CAFAtI,CAEU,CACD,CACCo9D,GAAAA,EACT,EAEDp9D,SAAAA,CAAAA,QAAc4Y,CACd+L,MAAAA,kBACAjC,SACE8J,EAAAA,QAAQlI,CAAAA,SAAAA,CAAAA,EAAAA,IAAAA,CAAAA,SACJhd,EAAAgC,EAAA,CAAA,GAAA3H,QAAA,CAAA,CAAuB,CAAA,EAAC2F,EAAAgd,QAAAA,CAAAA,KAAAA,OAAAA,KACxB,QAAA,aAAA3Z,EAAA,SAAyByd,IAAA,UAAC,IAChC,OACF,SAAA,EAAA,CACC,CAAA,CAAA,CACL,CAAA,CAAE/gB,EAAAA,QAEF,CAAKO,MAAM,uBAAiBP,IAAAA,EAC1B,SAAAA,CAAAA,EACE,OAAAC,EAAA,KAAA,CAAA,MAAAD,kBACE,SAAAk1D,EAAA,IAAAj/B,GAAA,CAAA,KAAmB,CAErBh2B,GAAAA,EACEE,QAAAA,EACA8U,UAAAA,EACAjd,IAAAA,CAAcsL,IAEdsd,OAAI9gB,EAAA,KAAA,CACJ6gB,SAAQ,CAAA1gB,EAAA,QAAA,CACR,KAAA,SACG,KAAA,2BAET,MAAAyxC,CAAA,CAAW,EAAAzxC,EAAA,QAAA,CAA4B+0D,KAAAA,gCAAYh1D,KAChDk1D,OACK30D,aAAM+zD,EAAiBt0D,SACxBk1D,IAAAA,UACC,SAAM,GAAE56D,IAAAA,MAAAA,CAAIg6D,EAAAA,EAAAA,MAAAA,CAASoB,MAAAA,yBAAWjB,SAAAA,CAAAA,EAAAA,QAAAA,CAAQx+B,SAAAA,CAAAA,EAAAA,QAAAA,MAEtC,mCAAAj2B,KACEC,WACEE,MAAKuxC,EACLz8B,eAAKygD,EACLl7D,SAAOF,IAAAA,SAAAA,CAET2F,EAAAA,IAAAA,EAAAgC,EAAA,CACEgT,GAAK,QAAA,CACL9U,CAAAA,CAAK,CACLnI,EAAAA,EAAAA,SAAcs8D,eAEd3zC,MAAAA,qBACAC,SAAIG,IAAA,UAENjhB,QAAA,IAAA,CAAW4xC,GAAwB1xC,EACjC,KAAA0xC,CAAA,EAAA1xC,EACE,CAAA,GAAA21D,CAAA,CAAA,GACOM,IACL91D,EAAK,KAAA81D,CAAA,EACLz7D,EAAOF,CAAAA,GAAAA,CAAAA,CAAAA,EACSo7D,EACgB,SAElCz1D,EAAAgC,EAAAA,CAAA3H,KAAA,IAAyB,IAAA2iB,EAGzB9c,CACAI,GAAM,QAAA,CACgB,CAEpB,CAAA,CACEo1D,CAAAA,CAAAA,CACAR,CAAAA,CAAAA,CAA2C,EAAA,GAAAzjB,QAClC+iB,CACTW,CAAAA,CACAH,CAAAA,EAAAA,EAAAA,MAAAA,CAA6C,MAAA,kBAC/C,SACFh1D,EAAA,MAAA,CAAA,MAAED,gBAEG,SAACW,EAAKsB,EAAA,CAAA,GAAA,QAAOgb,CAAAA,CAAAA,CAAAA,CAAE,CAAA,EAAAnd,EAAA,SAAA,CAAA,MAAA,yBAAQ,SAAC,CAAAG,EAAA,SAAA,CAAA,KAAC,SAAE,MACzB,QAAA,QACL,IAAA,CAAA80D,EAzCa,CA0CjB,GAAAD,EAAA,CAEP,IAAAJ,GAAA,EAGHz0D,QAAA,GAAKM,UAAM,EAAA,CAAiBP,CAAAA,EACrBO,WAAM,IAAA,CAAeP,MACxBC,EAAAgC,EAAA,QAAA,iBAAA,oBAAA,EAAA3H,EAAAqnB,EAAA,OAAA,CAAA,GAAA,QAAA,CAAmC,EAAA,EAAA,CAChC,EAGT7hB,SAAAG,EAAAgC,EAAA,CAAQ1B,GAAM,QAAA,CAAwBP,CACpC,CAAA,EACEG,IAAK+0D,GAAA,OAAA,GAAAj1D,EAAA,QAAA,CACLM,MAAM,gBACNH,SAASA,EAAM6B,EAAA,CACb8yD,GAAAA,SAEE,OACOL,CACLJ,EAAAA,EAAS,MAAA,CACE,CAAA,CAGf76D,CAAAA,CAAAA,CAEE,CAAA,CAAA,CAIAkoB,CAAAA,EAAAA,EAAAA,MAAOA,CAA4B,yBAChC,SACP,CAAA7hB,EAAA,MAAA,CAAA,MAAEE,kBAEF,SAAA,CAAAC,EAAA,MAAA,CAAA,SAAyBA,EAAA,IAAA,CACjB,cAEDM,GAAM,QAAA,CAAeP,CAC1B,CAAA,CAAA,CAAA,EAAAzF,GAAA,IAAA40B,GAAArvB,EAAA,MAAA,CAAA,SACSo1D,CAAAA,EAAAA,QAAAA,CAA2B,MAAAzB,GAAA,SAAAtkC,CAAA,EAAA,gBAAA,GAGnC,SAAA,CAAAlvB,EAAA,QAAA,CAEJ,KAAA,WACM,KAAA,UAEX,MAAAkvB,EAAW,eAAAl5B,EAAAA,EAAA,SAAAk5B,CAAA,EAAA,GAAkBnvB,SAC3B+gB,IAAA,SAAA,CAAKxgB,EAAM,IAAAwR,EAAA2hD,GAAAvkC,CAAA,CAAA,EAAAskC,GAAA,SAAAtkC,CAAA,EAAA,IAAA,EAAA,CAAA,CAAiBnvB,EAAAA,GAAAA,CAC1B,CAAA,CAAAA,EAAAA,EAAAA,KACE,SAAAA,UACEiC,CAAA,MAAA,gBAAA,SAA0BhC,EAAAgC,EAAA,CACzB,GAAA,QAAA,CAEJ4mD,CACC,CAAA7oD,CACE,CAAA,CAAA,CAIQ,CAAA,EAAAF,EACLE,MAEDC,CAAA,MACEE,kBAAK,SACL8U,CAAAA,GAAKhV,EAAAgC,EAAA,CAAA,GACLzH,SAAO20B,YAC6C,QAC1CpO,EAAAA,EAAsB,EACjC9gB,EAAEs0D,GACAb,CAEI,UAAAW,EAGbp0D,iBAAA,EAAA,CAAAD,CACE,CAAa,CAAA,EAAeA,EAAAA,OAC1B,SAAA,CAAAC,EAAA,QAAA,CAAA,IAAmC,qBAC9B,SAAAgd,EAAAkI,EAGXrlB,CAAW,GAAA,QAAA,EAEP+D,IAGK0wD,QAAY,CAHjB,CAGwD,CAAA,EAAEz0D,EAAA,SAAA,CAAC,GAAA,qBAI7DA,KAAA,aAAAE,SACEC,IAAA,UAAO+a,aAAImK,EAAA,OAAA,EAAoBnlB,SAC5BmlB,CAAAA,GAAQlI,EAAAA,SAAAA,CAAAA,CAAAA,EAAAA,GAAAA,IAAAA,GAAAA,EAAAA,SAAAA,CAAAA,MAAAA,EAAG,SAAA,OAAA62C,GAAA3lD,CAAA,GAAA,WAAA2lD,GAAA3lD,CAAA,EAAA,EAAA4D,EAAA+hD,GAAA3lD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,CAAA,EAACrO,EAAAmd,IAAAA,CAAAA,SAAAA,CAAAA,EAAAA,EAAAA,CAAAA,GAAG,QAAA,CAAA,EAAAhd,EAAA3F,KAAA,EAAA,EAAAyhB,GAAA,GAAA,UAAA,GAAAjc,EAAA,QAAA,CAAA,MAAQ,KAAC,SAAA,CAAAG,EAAA,QAAA,CAE1CH,KAAA,QACExF,KAAG,gBACH2a,MAAK,sBACK8L,IAAY,OACtB/oB,SAAAA,aAAqC,CAAEgI,EAAAA,IAAAA,EAEtCmlB,EAAAA,CAES3qB,GAAAA,QAAO2T,CAAAA,CAAEnO,CAGiB,CAAA,EAEnC,IAACF,EAAA,QAAA,CACK,MAAA,KAEXA,SAAA,CAAAG,EAAA,QAAA,CAAAD,KAAA,QACE1F,KAAA,gBACA2F,MAAA,OAESM,eAAMo0D,IAAA,QAAAA,IAAA,QAAA,CAAAxvC,EAAInlB,SACfC,IAAA,SAAA,CAAA,EACEE,IAAKF,EAAAgC,EAAA,CACLgT,GAAAA,QAAK,CAAA,CACLza,CAAM,CAAA,EACNigB,cAAgBk6C,CAAiB,WACD,SAElC10D,CAAAA,EAAAgC,QAAA,CAAA3H,KAAA,QAAoC,KAAA,gBAErC,MACHwF,OAAOS,eAAMo0D,IAAA,OAAI30D,SACfC,IAAA,SAAA,CAAA,EACEE,IAAKF,EAAAgC,EAAA,CACLgT,GAAAA,QAAK,CAAA,CACLza,CAAM,CAAA,CAAA,CAGH2qB,CAAAA,CAAAA,CAEmB,CAAA,CAAA,CAExB,CAAA,EAAArlB,EAAAxF,SAAA,CAAA,MAAuB,qBAAC,SACjB,CAAAwF,EACTA,OAAA,CAAA,SAAOS,CAAMN,EAAA,SAAA,CAAA,KAAID,SACf,SACO+gB,IAAA,UAAA,SACA9D,EAAAkI,EACC,CAEN7iB,WAAsB,EAGlB,CACN,GAAA,QAAA,CAFA,CAKR,CAAQ/B,EAAAA,IAAMN,EAAA4jB,GAAA,CAAoB7jB,OAChCF,GAAAE,WACE,SAAA,CAAA,CAAQG,CAAK,CAAA,EAASmC,GAAUye,EAAAA,GAAY,CAAA,aACzCoE,UAAQlI,MAAAA,MAAAA,kBAAG,SAAA,aAAAA,EAAO,CAAAA,GAAAA,QAAAA,CAAG,EAAA,QAAQ,IAAA,CAACK,EAAA,SAAA,GACzB,SACPuG,CAAO9B,GAAAA,OAAehB,EAAAA,GAAAA,QAAY,QAAAzmB,CAAA,EAAA,OAAA,EAAagjB,EAAA,SAAA,EAEjD6H,IACCllB,OACY8gB,SAAY,CAChB,CACNxN,MAAAA,CACAD,EAAY2J,OAAAA,EAAAA,MAAAA,EAAE,CAAqB,GAAA,QAAA,CAAC,EAElCK,CACA,GAAC,CACC,EACE,SAAArd,WAAei0D,CACf52C,KAAAA,SACArc,MAAAA,eAAU,QACRF,IAAO,CAAA,EACR,aACS,UACVpI,SAAAA,IAAe,CACf2kB,GAAAA,QACAjC,CAAAA,CAAK4B,CAAAA,CAAAA,CAAAA,CAAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAA0B,CAAA,CAAA,CAAC,CAAA,CACnC,CACC,SAAAs3C,GACL,CAAA,UAAAF,EAEA,iBAAA6B,CACO,EAAA,CACC,KAAA,CACS,EAAAnS,CAAC,EAAA5qD,KACMy7D,EAAU50D,CAAAA,CAAAA,EAEhC60D,EAAAD,GAAA,IAAA,KAAAP,CAAA,EAAA8B,EAAqBvB,GAAA,KAAA,MAAAP,CAAA,GAAA,KAAA,IAAA,EAAA,CAAAtiD,EAACqkD,CAChB,EAAAnkD,GAAA6C,GAAAA,EAAA,EAAA,CAAA,EAAA,OAAAhZ,GAEXs6D,EAAAD,GAAA,GAAA,EACKA,EAACpS,EACJ,CAEN,GAAA,QAET,CAEA,EAAA6Q,EAASL,EAAatyD,EAAA,CAAEoyD,GAAAA,SAAW6B,WAAAA,CAAoB,EAAAj2D,EAAAgD,GAAA,CAC/C,SAAA4xD,CAAA,CAAE37D,CAAAA,CACR,CAAA,EAAAg9D,GAAoB7B,EAEpB,CAGA,WACAv4D,CAEA,CAAcioD,CCpmBhB,SAASsS,IAAmB,CAC1B,KAAM,CAAEn9D,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EAC5B0rD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAmB,EAAG,KAAK,EACpC,KAAM,CAACymB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAE1C,CAACkuC,EAAkBC,CAAmB,EAAInuC,EAAS,CAAA,CAAE,EAC3DhB,OAAAA,EAAU,IAAM,CACdglB,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAM2mB,EAAO,MAAMH,GAAAA,EACnB2D,EAAoBxD,CAAI,EACxB3mB,EAAW,SAAS,CACtB,MAAY,CACV3kB,SAAe,CACf2kB,CAAkB,GAAA,CACpB,EACF,CAAA,CAAG,EACArd,EAAA,MAAA,CAEL,GAAA,yBACO3F,MAAG,iBAAyBiG,SAAM,KAAiB4R,SAASrS,EAAA,MAAA,CAAIE,MAAAA,qBAC9DO,SAAM,CAAAN,EAAA,SAAA,CAAoBD,SAC7BC,EAAA,MAAA,CAAAD,MAAAA,cACOO,SAAM,CAAAT,EAAA,MAAA,CAAaE,MAAAA,cACjBO,SAAM,CAAAN,EAAAw8C,GAAA,CAAA,CAAA,EAAAx8C,EAAA4T,GAAA,CAAa7T,GAAAA,IAEhBgC,MAAG,eAAIzB,SAAMN,EAAAS,EAAA,CAAcV,KAAAA,OACzBW,KAAK,IAAOC,IAAAA,EAAYxE,CAAE,GAAA,QAAA,CAAA,CAAM,CAAA,CAAC,CAAA,CAAC,CAAE,CAAA,EACrC6D,EAAA,KAAA,CACJ,SACLA,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,EAA+BC,EAAA,MAAA,CAC7B,MACJ,aAAA,CAAA,CAAKM,CAAM,CAAA,CAAgB,CAAA,EACxBN,EAAA,OAAA,CACC,SACRunC,EAAA,OAAA,EAAA1nC,EAAAC,EAAA,CAAAC,SACGwnC,CAAAA,EAAAA,KAAAA,CACCxnC,MAAAA,YACMO,SAAMinC,EAAA,IAAAO,GAAA9nC,EAAA,KAAA,CAAWD,SAClBwnC,EAAAA,GAAAA,CACCxnC,GAAAA,EACG6T,IAAAA,CAAI,MAAAk0B,EAAA,IAAA,GAAA,MAAAA,EAAA,IAAA,GACH/lC,SACEpI,CAAAA,EACI8G,EAAI9G,CAEToG,KAAAA,UAEKW,IAAAA,GAAK,CAAA,EAAUE,IAAIZ,EAAA,OAAA,CAAK,SAAEA,EAAA,IAAA,CAAA,CAAAD,CAAWiV,CAAAA,CAAY,CAAA,CAAA,CACnD,CAAA,EAETuyB,EAAA,OAAA,GAAAvnC,EAAA,SAAA,CACC,MACHunC,WACSjnC,SAAMN,EAAA,QAAA,CAAUD,MAAAA,gBACfO,SAAMN,EAAAgC,EAAA,CAAejC,GAAAA,SAC1B1F,OAAA,CAAAC,EAAAA,EAAA,MAAA,CAC0BG,CAAAA,CAAM,CAAA,CAG/B,CAAA,CAAC,CACG,CAAA,EAEVqmB,IAAA,UAAA9gB,EAAA,IAAA,CACD,MACA8gB,WACCxgB,SAAMN,EAAA4jB,GAAA,CAAU7jB,OACjBC,EAAO,CAAA,CAAO,CAAA,EAAE8gB,IAAA,QAAA9gB,EAAA,IAAA,CACf,MACD8gB,WACCxgB,SAAMN,EAAAgC,EAAA,CAAUjC,GAAAA,QACjB,CAAA,CAAA,CAAA,EAA+CC,EAAA,IAAA,CAC9C,MAEHA,WAAGM,SAAMN,EAAAgC,EAAA,CAAUjC,GAAAA,QACjB,CAAA,CAAA,CAAA,CAAuC,CAAA,CAAC,CACvC,CAAA,CAEA,CAAA,CACJ,CC7EX,MAAM2rB,GAAQ,GAEd,SAAS2qC,GAAU,CAAEhzD,MAAAA,EAAOoiC,KAAAA,EAAMprC,GAAAA,EAAI,GAAG80C,CAAM,EAAG,CAChD,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,GACExjD,GAAKlH,EACD,CACA9B,GAAI,iBAAA,CAEN,EACForC,GAAQ,YACV,EACA,KAAM,CAAE/rC,MAAAA,EAAOwB,UAAAA,EAAWvB,SAAAA,EAAU28D,OAAAA,CAAAA,EAAWn7D,GAAAA,EACzC,CAACo7D,EAAiBC,CAAkB,EAAIn9D,EAAS6B,CAAS,EAE1D+B,EAAaC,GAAYrD,CAAM,EAC/BswD,EAAe/xD,EAAAA,EACfgyD,EAAehyD,EAAAA,EACfq+D,EAAar+D,EAAAA,EAGnBC,EAAU,IAAM,CACV,CAAC6C,GAAao7D,GAAQI,kBACxBJ,EAAOI,iBAAkBH,GAAoB,CAC3CC,EAAmBD,CAAe,CACpC,CAAC,CAEL,EAAG,CAACD,CAAM,CAAC,EACXvX,YAAY70C,IAAI,mBAAmB,EAEnCxR,MAAAA,EAAc4qB,GAAoBjgB,gCAAS,EAC3C,eAAM0mD,EAAmBzmC,EAAS,EAElCuK,MAAyBA,WACvB,YAAIA,MAAcu8B,kBAAa9xD,EAC7BymD,UAAkBrlD,EAAA,GAAA,UAAkB,KAAA,KAAA,CACpCywD,MAAAA,EAAoD,CAAA,EAAeC,EAAC,QAAAD,EAAA,QAAA,OAAA,GAEtEJ,GAAAI,EAAA,SAAA,SACIJ,OAAAA,EAAoBI,QAAAA,QAAa7xD,SACnC6xD,EAAWA,QAAAA,QAAqB7zD,wBAEhC6zD,EAAO,QAAA,OAAA,gBAAA,IAGT,MAAAvgC,EAAA,MAAAwgC,EAAA,QAAA,KAAA,EACA,GAAA,CACA,MAAA7vD,CAAI,EAAEA,EAAM,GAAIqvB,GAAAA,OAAAA,CAChB,MAAmB,GACb+sC,IACA9oC,EAAAA,CAAAA,EAAW,KAAA4oC,EAAA,UACbE,MAEAF,EAAA,QAAAl8D,EAAA,CAAA,EAAA,IAEA7B,EAAAA,QAAYu5C,GAAA,CACd8F,GAAA9F,EAAAt4C,CAAA,CAGAY,CAAAA,EACEw9C,EAAAA,GAAiBp+C,EAAQA,CAAA,EAC1Bk0B,GAAA8oC,GAAAC,GAAA,EACDr8D,WAAQk8C,IAAAA,CACRyB,MAAoC0e,CACpCp9D,EAAAA,GAAAA,EACE0+C,EAAAA,KAAAA,CAAAA,EAAAA,IACI,KAAA,MAAAhjC,EAAA,SAAA,EAAA,KAAA,MAAAnJ,EAAA,SAAA,CAGNxR,CACE,CAAuD,mBACxD,IAAA,kBAAA,EACH,CACAwkD,GAAAA,EACA,MAAAxkD,CAAO,CACFqvB,CACHrvB,eACFuB,GAAA,CACF,GAAA,CAEA,MAAAwC,EAAexC,CACT,MAAA,EACF,SAAMwC,EAAO,OAAA,KAEDm4D,gCAAWn+D,IACvBgG,EAAA,gBAAA,IAEEA,MAAAA,EAAKu4D,MAAAA,EAAkB,GAAA,UAAA,KAAA,KAAAv4D,CAAA,EAAA,OAAA,EAAA,KAAA,EACzB,GAAA,CACA,MAAA/D,CACA,EAAIqvB,EAAA,MAAErvB,EAAAA,EAAAA,CAAAA,GAAAA,KAAAA,EAAAA,QAAM,MAAIqvB,GAAAA,GAAAA,QAAAA,CAAAA,IAChBlxB,EAAY,QAAA6B,EAAA,CAAA,EAAmBk8D,GAC/Bl8D,EAAMu8D,GAAAA,EAAAA,CAAgC,EACtCv8D,EAAIA,GAAkBu8D,EAAAA,MAAAA,EACpBL,EAAAA,KAAWn+D,GAAUiC,CAAAA,EAASF,MAAAA,GAIrB,MACT,CACF,MAAA,EACA,CAAO,CAEP3B,OAAAA,EAAAA,KACA,IAAAqC,EACF,OAAA,SAAA,CACF,GAAAw7D,EAAA,CAEAl+D,EAAUk+D,EAAM,KAAA,UAAA,EACVx7D,gBAAAA,KAAAA,EAAAA,CACH,GAAA,CAAAA,EAAY,MACPw7D,GAAAA,EAAAA,QAAiB,gBAAA,CACnBx7D,MAAMw7D,EAAAA,UACN79D,OACA,SAAA8C,UAA0BT,SAAK,CAC7B,MAAKA,EAAKS,EAAA,QACNA,KAAgBi/B,EAAA9gC,CAAiB,EACnCivC,eAAeptC,GACf9C,CACAq/C,CAA2B,CAE3B,GAAA,EACAr/C,IAAAA,CAEAqC,GAAA,cAAUg8D,EACVh8D,EAAA,IAAoB,CACtB,EAAA,CAAAw7D,CACF,CAAA,EACA79D,EAAAA,GAAY,CAAgC,MAC9C2K,GAAAlH,EAEF,CACEpB,GAAKW,iBACLX,CAAM,EAEV,GAAIw7D,GAAAA,YAEJ,UACG3Y,EACazhD,CAAM,GAAA,QAAA,CAAM,EAAyC,UAAAA,EAEjE2hD,CAAS3hD,GAAAA,QAAAA,CAAE,EAAA,SAAAxC,EAAuB,WAAAqwD,EAClCjM,gBAAAA,EAAS5hD,UAAAA,GAAAA,eAAEc,EAAA,SAAA,eAAA,GAAAkyC,EAAwB,cAAA,OACnCx1C,iBAAAA,GACAskD,gBAAY+L,EAAAA,CAAAA,CACZluD,CCzIN,MAAM4vB,GAAQ,GAKRsrC,GAAsB,EACtBC,GAAmBD,GAAsB,EAE/C,SAASE,GAAS,CAAEp7B,MAAOq7B,EAAWx5D,WAAAA,EAAY,GAAGwxC,CAAM,EAAG,CAC5D,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EAEX,GAAI,CAAE8rC,QAAAA,EAAS,GAAG1uC,CAAAA,EAAWqH,EAAa,CAAA,EAAKinD,GAAAA,EAC3CzV,EAAMnK,UAASA,EAAUmK,EAAMnK,SACnC,IAAIoyB,EAAWpyB,EAAQre,KAAAA,EAAO5G,MAAM,QAAQ,EAC5Cq3C,EAASniD,KAAAA,EACT+vB,EAAUoyB,EAAS,CAAC,EACpB,KAAM,CAACvkB,EAAcC,CAAe,EAAIC,GAAAA,EAClCjX,EAAQq7B,GAAa,CAAC,CAACtkB,EAAal/B,IAAI,OAAO,EAC/C0jD,EAAav7B,EAAQ,WAAa,GAElC,CAAEpiC,MAAAA,EAAOC,SAAAA,EAAU8f,cAAAA,CAAAA,EAAkBte,GAAI,CAC7CxB,SAAUw1C,GAAOx1C,UAAYrD,EAAOqD,QAAAA,CACrC,EACK,CACJD,MAAOouB,EACPnuB,SAAUouB,EACVtO,cAAeuO,CAAAA,EACb7sB,GAAAA,EACEm8D,EAAeF,EAAS50D,IAAKvJ,GAAM,IAAIA,CAAC,EAAE,EAAE+T,KAAK,GAAG,EACpD3J,EACGlH,EADKxC,EACVmiC,EACE,CAAAzhC,GAAA,SAAAC,OAAA,CAAAg9D,aAAAA,EAAgB39D,SAAAA,CAAAA,CAA4B,EAC5C,CAAAU,GAAA,SAAAC,OAAA,CAAAg9D,aAAAA,EAAgB39D,SAAAA,CAAAA,CAAe,EACjCmiC,EACE,CAAAzhC,GAAA,SAAAC,OAAA,CAAAg9D,aAAAA,CAAAA,CAAgB,EAChB,CAAAj9D,GAAA,SAAAC,OAAA,CAAAg9D,aAAAA,CAAAA,CAAgB,CAJ6B,EAKnDzQ,GAASxjD,EAAO,wBAAwB,EACxC,MAAMozD,EAAar+D,EAAAA,EAEb6mD,EAAa9qC,GAAQ,IAAM6qC,GAAAA,EAAwB,CAAA,CAAE,EAGrDuY,EAAQn/D,EAAOqG,MAAS,EAC9B,eAAe+4D,EAAc3pC,EAAW,CAUtC,MAAMjE,GAAU,MAAMlwB,EAAMM,GAAGy9D,UAAU3vB,IACtCnrC,QAAQqoC,CAAO,EACf9qC,KAAK,CACJC,MAAOuxB,GACPgsC,IAAKN,EAAS5qD,MAAM,CAAC,EACrBmrD,MAAO9pC,EAAYpvB,OAAY84D,EAAMj/D,QACrCs/D,UAAW97B,EAAQ,GAAOr9B,MAAAA,CAC3B,EACAnE,OAAAA,EACAE,KAAAA,EACH,GAAI,CAAED,MAAAA,CAAAA,EAAUqvB,GAChB,OAAIrvB,GAAOE,SACLozB,IACF4oC,EAAWn+D,QAAUiC,EAAM,CAAC,EAAEF,IAIhCE,EAAM6M,QAAS6qC,IAAS,CACtB8F,GAAW9F,GAAMt4C,EAAU,CACzB8B,cAAeqgC,GAASmjB,CAAAA,CACzB,CACH,CAAC,EAEDsY,EAAMj/D,QAAUiC,EAAMA,EAAME,OAAS,CAAC,EAAEJ,IAEnC,CACL,GAAGuvB,GACHrvB,MAAAA,CAAAA,CAEJ,CAEA,eAAeuB,GAAkB,CAC/B,GAAI,CACF,MAAM8tB,EAAU,MAAMlwB,EAAMM,GAAGy9D,UAAU3vB,IACtCnrC,QAAQqoC,CAAO,EACf9qC,KAAK,CACJC,MAAO,EACPu9D,IAAKN,EAAS5qD,MAAM,CAAC,EACrBqrD,SAAUpB,EAAWn+D,QACrBs/D,UAAW97B,CAAAA,CACZ,EACAxhC,OAAAA,EACAE,KAAAA,EACH,GAAI,CAAED,MAAAA,EAAAA,EAAUqvB,EAChB,MAAMktC,EAA0Bv8D,GAAM,CAAC,GAAGF,KAAOo8D,EAAWn+D,QAC5D,OAAIiC,IAAOE,QAAU,CAACq8D,GACpBv8D,GAAQo8C,GAAcp8C,GAAO,QAAQ,EAC9B,IAEF,EACT,MAAY,CACV,MAAO,EACT,CACF,CAEA,KAAM,CAACu9D,EAAeC,CAAgB,EAAI1+D,EAAS,SAAS,EACtD,CAACuC,EAAM8wB,CAAO,EAAIrzB,EAAAA,EAExBhB,EAAU,IAAM,EACb,SAAY,CACX,GAAI,CACF,MAAMuD,EAAO,MAAMlC,EAAMM,GAAGgqC,KAAKrnC,QAAQqoC,CAAO,EAAEnqC,MAAAA,EAClDnC,EAAQga,CAAI9W,CACZ8wB,MAAQ9wB,CAAAA,CAAI,GAAA,CAEZlD,EAAAA,CAAAA,CAAAA,CAAAA,EAAe,MACjBs/D,EAAAZ,EAAA,QAAAH,GACC,CAAAgB,EAAAC,CAAA,EAAA7+D,EAAA,SAAA,EACD2rC,CAAAA,EAAQuhB,CAAA,EAAAltD,EAAA,CAAA,CAAA,EAEN2+D,CAAAA,IAAgCf,EAAAA,EAAAA,EAAAA,EAEtC5+D,OAAAA,EAAO4/D,IAAAA,CACA3R,IACP,SAAO6R,CACP9/D,GAAAA,CACM,MAACohB,EAAe,MAAA/f,EAAA,GAAA,aAAA,KAAA,EACnB6sD,EAAYK,CAAA,EACXwR,GAAIxR,EAAA,KAAA9e,IAAAA,GAAA,KAAA,YAAA,IAAA9C,EAAA,YAAA,CAAA,CAAA,CACF,MAAMshB,CAAAA,CACNC,GAAAA,CACA6R,EAAAA,CAAAA,CAAAA,IAKOlhE,EAAG,CACVwB,SAAAA,CAAAA,KAAe,CACjB,MAAA2K,EACF,eAAG,CAAA,CAAA1J,GAAAkG,EAAA,KAAA,CACA,MAAA,sBAEL,SACEC,CAAAA,EAAAA,IAAA,CAAAC,IACEC,OAEEqD,SAAAA,CAAAA,CACAw6C,EAAAA,EAAAA,MACIlkD,CACI2G,SAAM3G,CAAA,CAAqBoG,CAAAA,CAC7B,CAAA,EAAO,GAAMA,UAAEu3D,SAAAA,EACf,UAAAv3D,EACE,CAGL,GAAA,QAAA,CACHpG,EACSwC,UAAAA,EAAE,CAA+C,GAAA,QAAA,CAAC,EAClDA,WAAAA,EAAAA,gBAAAA,EAAE,UAAA,GAAA,KAAoC2/B,GAAAmjB,EAAA,QAAA,OAAC,QAAAnjB,EAChDmiB,cAAYuZ,SACZ17D,UAAAA,EAAAA,GAAAA,CACAkiD,OAAAA,GACAO,gBAAeU,GACfX,SAASxiB,OAETigB,SAAAA,SACAqC,aACGrrC,SAAK,CACJ3R,KAAM,SACNi3D,MAAAA,QACA1tC,SAAS3qB,EAAAS,EAAA,CAETgqB,KAAS,OACTzX,KAAAA,IACU9S,IAAK/D,EAAsB4D,CAC3BW,GAAK,QAAA,CAAY,CAAOvE,CAAAA,CAAAA,CAAAA,EAAE,SAAA9B,CAAAA,CAAA,CAAAuB,GAAAw7D,EAAA,SAAA,GAAAv3D,EAAAC,EAAA,CAAA,SAAM,CAAAE,EAAAmT,GAAA,CAAC,QAAA,GAAG,QAAAvX,EAAA,UACpC,aAAAO,EAIR4D,CAEIqT,GAAAA,gBACSxX,CACTyX,QAAAA,CAAYlX,CAAAA,CAAE,EAAA,SAAA7B,IAAA,WAAA,CAAAmf,EAAA,QAAAurB,IAAAA,CAAAA,EAAqB,SAAA,EAAEppC,EAAA,UAAClC,EAAA,GAAA,KAAA,QAAAsrC,CAAA,EAAA,SAAA,EAAA,KAAA,IAAA,CACtC3iC,EAAUy1D,IACD33D,EACP43D,UAAiB,EACjB,GAMEr+D,KAIc,CAAS8uB,GAAAA,SAAkB,OAAA,CACrCnsB,QAAAA,CAASF,CAAAA,CAAC,CAAA,CAAA,CAAA,EAAA,MAAA7B,GAAA,CAAA,MAAA0qC,CAAAA,CAAAA,CAAAA,EAAAA,QAAuB,IAAA,CAAA+yB,EAAC,SAAA,CAAA,CAAA,EAGlC38C,EAAAA,GAAO,KAAA,QAAA4pB,CAAA,EAAA,OAAA,EAAA,KAAA,IAAA,CACPtsC,EAAQ4Y,CAETgnD,GAAAA,EACCP,UAAAA,EAA0B,CAC3B,EACL17D,GAAOF,EAKDuwB,CAAU,GAAG9wB,SAAM4sB,OAAAA,CAAiB,QAAAwc,CACpC3oC,CAASF,CAAAA,CAAAA,CAAC,CAAA,EAAA,MAAAjF,GAAA,CAAA,MAAAoD,CAAAA,CAAA,CAAA,EAAA,QAAA0qC,IAAAA,CAAAA,EAAqB,SAAA,CAAA,CAAA,CAAE,EAGjC5pB,SAAAA,EAAO,UAAAvb,EAAAC,EAAA,CACPpH,SAAAA,CAAAA,IAAe,CACjB,KACC4/D,cACCP,CAAAA,EAAAA,IAAAA,EAAAA,OAAiB,CACnB,SAAC/3D,EAAAgC,EAAA,CACL,GAAA,QAAA,CACF,CAAA,CAAEjC,CAAAA,CAGA,CAAA,EAAAA,EAAAA,EACGU,CAAI,SAAM,CAAAT,EAAAS,EAAA,CAAgB,KAAE,MAC7B,CAAA,EAAAV,IAAAA,SACEiC,CAAA,SAAAhC,EAAAgC,EAAA,CAAwB,GAAA,QAAA,CACnB,CAAA,CACP,CAAA,CAEF,CAAA,CACO,CAAA,EAAAhC,EAACU,GAAK,CAAA,KAAU,WACrB,QAAAX,EACE,SAAAk4D,IAAA,WAAA,CAAAx+C,EAAA,QAAoB,IAAA,CAEtB,GAFuBy+C,EAChB,SAAA,EACPC,EAAA,CAGNn4D,MAAC8C,EAAQwjD,EAAA,KAAAxe,IAAAA,GAAA,KAAA,YAAA,IAAA9C,EAAA,YAAA,CAAA,EAAA,GACFuzB,EACLl9C,EAAS88C,GAAAA,aAAAA,QAAAA,CAAAA,EAAAA,OAAAA,EAAAA,KAAAA,IAAAA,CACT91D,GAAU41D,EAAoB,KACf97D,EAETg8D,CACII,GAAAA,QAIN,CACE7+D,CAAAA,EAII0+D,EAAAA,EAAsB,OAAAtwB,IAAAA,GAAA,KAAAywB,CAAA,CAAA,CACtBl8D,CAAAA,EAAAA,MAAAA,IAASF,CAAAA,CAAAA,EAAAA,QAAAA,IAAAA,CAAAA,EAAAA,SAAAA,CAAAA,CAAAA,EAACE,GAAuBF,EACjCoqD,CAMDjoC,GAAAA,QACC5lB,CAAe,CAChB,CAE6B,MAElCgB,EAAA,GAAO,aAAA,OAAA,CACL2C,KAAAA,CAASF,CAAAA,EAAAA,KAAAA,GAAAA,CAAAA,GAAC,EAAA,EAAAE,GAAAF,EAAiC,CAC7C,GAAA,QAAA,CAEAzC,CAAAA,EAEIsb,EAAMgwB,EAAAA,OAAAA,CAAAA,CAAAA,CACR,CAAC,EACAP,MAAMlqC,GAAAA,CAAAA,CAAAA,EAAU,QAAA,IAAA,CACf69D,EAAiB,SAAI,CACrB/7D,CAAAA,CAASF,EAAC,SAAA9B,EAAAwF,EAAAC,EAAA,CAAA,SAAqB,CAAAE,EAAAS,EAAA,CAAA,KAAC,cAChC8lD,CAAAA,EAAAA,EAAAA,OAAAA,CACF,SACQrvD,EAAAA,EAAM,CACZwB,GAAAA,QAAe,CAChB,CAECw/D,CAAAA,CAAAA,CAA4B,CAAA,EAC7Br4D,EAAAC,EAAA,CACL,SAAA,CAAAE,EAAAS,EAAA,CACF,KAAA,cAAA,CAAEV,EAAAA,EAEDo4D,OAAAA,CACCp4D,SACEC,EAACS,EAAI,CAACC,GAAK,QAAA,CAAgB,CAC3B,CAAA,CAAAX,CACE,CAAA,CAAA,CAAA,EAAAC,EAAiCiC,GAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAAg9C,GAC5Bp/C,EAAAC,EAAA,CAAA,SAGTD,CAAAA,EAAAC,GAAA,CAAA,UAAAC,QACO,SAAMC,EAAAgC,EAAA,CAAc,GACzBhC,QAAA,CAAA,CACE,CAAA,EAAAH,EAAAxF,GAAA,CAAA,KAAgC,WAAA,QAC3B,CAAA,CAAAyhC,EAAA,QACP,IAAA,CAGN97B,EAGFi/C,SACAn/C,OAAAA,EACcyC,EAAU,IAAA,QAAA,GAAA,EACpBlI,EAAAw4C,CAAA,CAAA,EACU,SACX/vC,CAAAA,EAAAA,EAAQ,CACP5C,KAAK,eACLmb,IAAAA,IAAWygB,OACF37B,EAAAA,OAAM,CACb,MAAI27B,YACF+W,SAAAA,EAAa2lB,EAAO,CACtB,GAAA,QACE3lB,CAAAA,CAA6B,CAAA,CAC/B,CACAC,CAAAA,EAAAA,EAAAA,GAAgBD,EAAAA,CAAAA,CAAY,CAAA,EAC9B7yC,EAAAy4D,GAAA,CAAA,UAAE14D,aAEG,SAAMi4D,EAAA,SAAmB,CAAA,CAAI,IAAA/3D,CAClC,IAAMK,EAAM,OAAA,CAAA,SAAWP,IACrBiC,CAAA9K,GAAAmD,eAAA,EAAA,MAAwBq+D,EAAAxhE,GAAA,OAAA,CAAA,EAAA,OAAA,OAAA,EACnBwhE,GAAA,CAAAtB,EAAA,KAAAn+D,IAAAA,GAAA,YAAA,IAAAy/D,EAAA,YAAA,CAAA,IAET14D,EAACiC,KAAAA,CAAc,EAGnBjC,EAACy4D,KAAAA,EAAcl2D,SAAU,KAAA5I,EAAA,IAAAA,CAAA,MAAAy9D,EAAA,KAAA,GAAA,CAAA,GAAAC,CAAA,GAAA,MAAAD,EAAA,KAAA,GAAA,CAAA,GAAAC,CAAA,KACnBp3D,SAAAA,CAAAA,EAAAA,EAAAA,CAAI,cACN,aACmB,CACf/I,IAAAA,EACA,KAAMwhE,OAEN,YACEA,EACCtB,GAASvuB,EAKVuuB,CAMA/nD,GAAAA,SAGF,OAAA,CACF,iBAAA4nD,EAAA,CAEK,CAAM,EACXj3D,EAEEE,CACAmlC,GAAAA,QACYvzB,CAAAA,EACN,SAAA,GAAA,YAAA,MAAA,eAAAmlD,MAAAA,WAAuB,GAAA,QAEtB,sBAAC,SAAA96D,EAAAA,IAAAA,MAAAA,CAAAA,CAAAA,CACF,CAAA,CAAA,CAAA,EAAA6D,EAAa24D,GAAA,CAAA,aAAC,GAAA,SAEpBj4C,EAAQ,IAAA,CAAAonB,EAAAjgC,KAAAhI,EAAAiD,GAAA,CAAA,SACR8kC,EAAY,SAAA,EAAA,QACZC,GAAAA,CACAE,EAAAA,OAAYlgC,GAAA,CAAA,EAEZy9B,EAAQ,KAAA,EACRjjC,SAAAA,KAAU21D,EAAAA,IAAAA,CAAAA,MAAAA,EAAAA,KAAAA,GAAAA,CAAAA,GAAAA,CAAAA,GAAAA,MAAAA,EAAAA,KAAAA,GAAAA,CAAAA,GAAAA,CAAAA,EAAAA,EACA,SACV,CAAAh4D,EAAAS,EAAA,CACE,KAAA,IAGVT,IAAC24D,GAIKt2D,GAAU+0D,QAAoB,CAE5BA,EACAA,MAAAA,aAMA/nD,CAAAA,EAAAA,EAAAA,OAAgB1V,CAGlB,MAAA,eAAEoG,SAEFC,CAAAA,EAACS,OAAI,CAACC,MAAK,qBAAIE,SAAGzE,GAAAA,CAAAA,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAE,EAAA2rC,CAAA,CAAA,CAAA,CAAA,EAAA9nC,EAAgBiC,GAAA,CAAA,CAAA,EAAApC,EAAAiD,GAAA,CAAA,SAAC,CAAAklB,EAAA,QAAE1nB,IAAM,CAAa,GAC1DT,EAAA,UAAA,QAAA6kC,GAAA,CAAMpkC,MAAAA,GAAM,EACJA,CAA0BP,GAAAA,SAC/B+nC,OAAG,CACC,gBAAApD,EAAA,CAEV,CAGM,SAGL,CACEtpB,MAAAA,EAAKtJ,CAAAA,KAAAA,UAAAA,QACHslD,EAAA,KAAA,GAAA,EAAA,SAAAz9D,EAAA,MAAAW,EAAA,KAAA,MAAA,EAAsBT,EAAA,UAAA,KAAA+uC,GAAAA,EAAA,OAAAjC,EAAA,MAAAiC,EAAA,QAAA,MAAA,QAAA,EAAA,KAAA,EAAA,KAAA,GAAA,IAAAjC,EAAA,QAAA,MAAA,QAAA,EAAA,KAAA,EAAA,KAAA,GAAA,IAAAiC,EAAA,SAAAA,EAAA,WAAAjC,EAAA,SAAA,MAAAiC,EAAA,MAAA,CAAA,CAAAA,EAAA,OAAA,CAAA,CAAAjC,EAAA,MAAA,GAAA,EAGpB,MACJxqC,EAEF,CACMwqC,GAAAA,QAAW,CACT,CACN3B,GAEAlJ,EAAOA,UAAQ,KAAOr9B,CAAAA,EACxBpC,GAAAF,EAgBIy8D,CACFx9C,GAAKjf,QAAAA,CAAAA,CAAAA,EAAC,EAA8B,SAAC,CAAA6D,EAAAS,EAAA,CACvC,KAAA,UACE5G,CAAAA,EAAAA,IAAAA,EAAOksC,QACP1pC,SAAAA,EAASF,EAAAA,CAAAA,GAAAA,QAAAA,CAAAA,CAAC,CAAA,CAAA,CAAA,CAAA,EAAA0D,EAAwBiD,GAAA,CAAA,QAAC,IAAA,CACrC,IAAA+1D,EAAA,OAAA18D,EACA4D,CAEIW,GAAK,QAAA,CACX,CAAAX,EACE,GAAA1F,CAAAA,KAAA,KAAAw+D,CAAA,EAAA,CAA8BA,GAAA,MAAA18D,EAGlC0D,IACWM,QACP,CAAwBhE,CAAAA,EACtB,MAAA,CAA6C08D,IAC/CA,EAAAA,EAAA,YAAA,EAAA,KAAA,EACA,SAAU70D,KAAK60D,IAAAA,CAAc,MAAAzB,EAAA,KAAA,GAAA,CAAA,GAAAC,CAAA,GACLl7D,EAAAA,SAAC,CAAA6D,EAAAS,EAAA,CAAA,KAAApG,KAAA,CAAA,EAAA,IAAkB2F,EAAA,OAAA,CAAA,SAACA,EAAAgC,EAAA,CAC1C,GAAA,QAAA,CACF,CACA,CAAA,CAAA,CACE62D,CAAAA,EAAAA,IAAcA,GAAY76D,EAAAA,GAAmB,CAE7CqR,QAAAA,IAASpL,CAGX,SAAA,KAAA,IAAA8jB,CAAA,MAAAqvC,EAAA,KAAA,GAAA,CAAA,GAAAC,CAAA,EACF,EAAEt3D,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,KAAA,CAAO,EAAE,IACpBV,EAAA,QAAA,CAAAD,MAAAA,oBACE,SAAAC,EAAAgC,EAAA,CAAqC,GAAA,SAChC,OAAA,CAER+lB,gBAAAA,CACU,EAEL1Y,WAASpL,CAGX,EAAAjE,EAAA,IAAA,CAAA,CAAA,CAAA,CAEK,CAACU,CAAK,CAAO,CAAA,CAClB,CAAA,CAAA,CAAa,CAAA,CACX,EAAA/G,EAAA29D,CAAA,EAAA,CAAA35D,GAAA,CAAA,CAAAy5D,GAAA,QAAAp3D,EAAA,OAAA,CAAA,MAAA,eAAA,MAAA,KAAA+nB,UAAAA,CAAAA,YACwC,CAAA,OAAApkB,GAAAA,EAAA,OAAA,EAAA;AAAA;AAAA,EAAA,GAAA,GAAA2zD,CAAA,EAAA,CAAI,CAAA,CAAC,CAAA,CAAA,CACtC,CAAA,CACD,CCnfxB,MAAM5rC,GAAQ,GAEd,SAASotC,GAAK3pB,EAAO,CACnB,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/B,CAAEH,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtBd,EAAK80C,GAAO90C,IAAMuqD,GAAAA,GAAavqD,GAE/Bo8D,EAAar+D,EAAAA,EAGb2gE,EAAe3gE,EAAAA,EACrB,eAAeksB,EAAUuJ,EAAW,EAC9BA,GAAa,CAACkrC,EAAazgE,WAC7BygE,EAAazgE,QAAUoB,EAAMM,GAAGy9D,UAAUv9D,KACvCyC,QAAQtC,CAAE,EACVH,KAAK,CACJC,MAAOuxB,EAAAA,CACR,EACApxB,OAAAA,GAEL,MAAMsvB,EAAU,MAAMmvC,EAAazgE,QAAQkC,KAAAA,EAC3C,GAAI,CAAED,MAAAA,CAAAA,EAAUqvB,EAChB,OAAIrvB,GAAOE,SACLozB,IACF4oC,EAAWn+D,QAAUiC,EAAM,CAAC,EAAEF,IAIhCE,EAAM6M,QAAS6qC,GAAS,CACtB8F,GAAW9F,EAAMt4C,CAAQ,CAC3B,CAAC,GAEI,CACL,GAAGiwB,EACHrvB,MAAAA,CAAAA,CAEJ,CAEA,eAAeuB,GAAkB,CAC/B,GAAI,CACF,MAAM8tB,EAAU,MAAMlwB,EAAMM,GAAGy9D,UAAUv9D,KAAKyC,QAAQtC,CAAE,EAAEH,KAAK,CAC7DC,MAAO,EACP09D,SAAUpB,EAAWn+D,OAAAA,CACtB,EACD,GAAI,CAAEiC,MAAAA,CAAAA,EAAUqvB,EAChB,MAAMktC,EAA0Bv8D,EAAM,CAAC,GAAGF,KAAOo8D,EAAWn+D,QAC5D,OAAIiC,GAAOE,QAAU,CAACq8D,GACpBv8D,EAAQo8C,GAAcp8C,EAAO,MAAM,EAC5B,IAEF,EACT,MAAY,CACV,MAAO,EACT,CACF,CAEA,KAAM,CAAC4pB,EAAO0B,CAAQ,EAAIxsB,EAAS,CAAA,CAAE,EAE/B,CAACa,EAAM8+D,CAAO,EAAI3/D,EAAS,CAAEgK,MAAO,MAAA,CAAQ,EAElDwjD,GAAS3sD,EAAKmJ,MAAO,QAAQ,EAC7BhL,EAAU,IAAM,EACb,SAAY,CACX,GAAI,CACF,MAAM6B,EAAO,MAAMqqB,GAAQlqB,CAAE,EAC7B2+D,EAAQ9+D,CAAI,CAEd,MAAY,CAAA,CACVxB,GAAAA,CAAe,EAAA,CACjB2B,CAAA,CAAA,EAAA,KACC,CAAA8rB,EAAAD,CAAA,EAAA7sB,EAAA,EAAA,EACC,CAAC4/D,EAAAC,CAAA,EAAA7/D,EAAA,EAAA,EAEP,OAAO8sB,EAAAA,EAAAA,CACP,SAAO8yC,CAAAA,EAAAA,GAAAA,CAEP,QACEn5D,MAAAC,GAAAA,OAGIsD,UAAOnJ,EAEP4jD,CAAS3hD,GAAAA,QAAAA,CAAE,EAAA,UAAcA,EACzB4hD,CAAS5hD,GAAAA,QAAAA,CAAE,EAAA,SAAAxC,EAAwB,WAAA2qB,EACnC3qB,gBAAAA,EACAskD,UAAAA,GACAniD,eAAAA,EAAAA,SAAAA,eACAkiD,cAAS,OACTziC,mBAEAwgC,YAGAoC,EAAAA,GAAAA,CAAAA,SAAAA,kBAIQt+C,EAAA,SAAA,CACJ8qB,KAAAA,SACA3X,MAAAA,QACU9S,SAAK,CAAAF,EAAAS,EAAA,CAASH,KAAM,OAAOP,KAAAA,IAC3BW,IAAAA,EAAqBE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,EAAO6D,EAAAS,EAAA,CAAC,KAAA,eAAG,KAC3CT,GAAK,CAAA,CAACU,CAAK,CAAA,EAAoB,aAAMxJ,GAAA,CAC/BA,EAAA,WAEKA,KAAAA,CAAM,CAEjBmtB,EAAwB,SAC1B,CAAArkB,EAAA8B,GAAA,CACF,GAAA,KAAE/B,SAEFC,EAAC8B,OAAAA,CAASC,SAAG/B,EAAAgC,EAAA,CAAIjC,GAAAA,QACf,CAAAA,CACE,CAAA,CAAA,CAAA,EAAAokB,GAAuB,OAAA,GAAAtkB,EAAAC,EAAA,CAAC,SACpB,CAAAE,EAAAiC,GAAA,EAAA,EAAAkiB,EAAA,IAAAg1C,GAAAn5D,EAAA8B,GAAA,CAEPqiB,GAAAA,MAAO1pB,EAAS,EAAA,GACfsF,SACEC,EAACiC,OAAAA,CAEyBF,SAAU7H,CAAAA,EAAO,MAAAi/D,EAAA,WAAAt5D,EAAAC,EAAA,CAAGC,cAC1CC,EAAA+kB,GAAA,CAAA,CAAA,CAAA,CAAA,GAGI,CAAA,CAEwB,EAAAo0C,EAEzB,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACG,CAAA,EAIb,UACIt5D,EAAAkT,GAAA,CAAA,OAAA,GAETqrC,gBACGrrC,GACC3R,SAAM,OACNi3D,WAAAA,QACA1tC,SAAS,SACTorB,WAAW/1C,EAAA,SAAA,CACXyqB,KAAAA,SACAzX,MAAAA,QACU9S,SAAKF,EAAAS,EAAA,CAASH,KAAM,OAAOP,KAAAA,IAC3BW,IAAAA,EAAqBE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAM,CAAA,EAAC,SAAG,CAAAjC,GAAA,WAAA2F,EAAAC,EAAA,CACpC,SAAA,CAAAD,EAAAu5D,GAAA,CACTr5D,UAEA7F,QACC6F,SACEF,CAAAA,EAACu5D,GAAU,CAAA,CAAA,EAAA,IAAAp5D,EAAAgC,EAAA,CAACO,GAAAA,QAAU,CAAOxC,CAAAA,CAE3B,CAAA,EAAA1F,EAAA4H,GAAA,EAAA,CAAA,CAAA,CAAA,EAAApC,EAEQiD,GAAA,CAAA,QAETb,IAAAA,EAAc,CAGnBpC,KAAAA,CAAS,CACPM,EAC0B,SACtBjG,CAAAA,EAAAA,EAAAA,CACD,KAAA,SACF6F,KAAAA,GAEI,CAAA,EAACW,EAAK,OAAA,CAASC,SAAKX,EAAAgC,EAAA,CACzBhC,GAAAA,QAAA,CAAAD,CACE,CAAA,CAAA,CAAA,CAAA,EAAAF,EAAkBiD,GAAA,CAAC,QACd,IAAAo2D,EAAA,EAAA,EACC,SACTp2D,CAAAA,EAAAA,EAAQ,CAAC3C,KAAAA,QAA+CJ,KAAAA,GAClD,CAAA,EAACW,EAAK,OAAA,CAAQC,SAAKX,EAAAgC,EAAA,CACxBhC,GAAAA,QAAA,CAAAD,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAA4B,CAAA,CACvB,EAAA1F,CACC,EAAC8rB,GAAAnmB,EAAAkE,GAAA,CAAA,QACNhN,GAAA,CAGVivB,EAAAA,SAAAA,EAAAA,iBAEmB,EAAA,CAEZD,EAA6B,SAC/BlmB,EAAAilB,GAAA,CACF,KAAAkB,GAAA,KAAEpmB,WAEDklB,CACOkB,EAAAA,QAAAA,WAAsBjsB,EAAAA,OAClB83B,EAAAA,IAAW,EACRlxB,EAAAA,QAAU,YACnBk4D,cAAe9+D,MAIfmV,EAAgB,EAAA,CAAA,CAElB6W,CAAAA,CAA6B,CAAA,EAC/B+yC,GAAAj5D,EAAAkE,GAAA,CAAE,QACHhN,GAAA,CAGJ+hE,EAAAA,SAAAA,EAAAA,iBAEmB,EAAA,CAEZC,EAA+B,SACjCl5D,EAAAq5D,GAAA,CACF,OAAAh/D,EAAE0F,YAEDs5D,EAAiB,EAAA,CAAA,CAAA,CACRh/D,CAAAA,CAAAA,CACsC,CAAA,CAC/C,CAEJ,MACDi/D,GAAA,GAEN,SAAAD,GAAA,CAEA,OAAAx0C,EAEA,QAAA7jB,CAA2B,EAAE6jB,CAAQ7jB,KAAAA,CAAW,EAAAgc,CAC9C,EAAA9jB,GAAM,EAAED,SAIR,SAAAU,CAAM,EAAED,GAAAA,EAAOC,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EAAawB,CAAAA,EAAIkiB,CAAA,EAAAhkB,EAAA,SAAA,EAC1B,CAACkgE,EAASC,CAAU,EAAIngE,EAAW,EAAA,EACnCogE,EAAUp8C,EAAchkB,EAC9B,eAAO66B,EAAqBrG,GAE5BsG,MAEA9W,EAAA,YACE8W,SAAY,CACZ9W,GAAAA,EACCwQ,GAAY,CAAA4rC,EAAA,WACPA,EAAA,QAAA//D,EAAA,GAAA,MAAA,QAAAmrB,CAAA,EAAA,SAAA,KAAA,CACEgJ,MAAAA,EACF4rC,CAAAA,EAAAA,OAAAA,GAGWH,MAERh/D,EAAO,MAAAm/D,EAAA,QAAA,KAAA,EACZ,GAAA,CACA,KAAAhlC,EACA,MAAAl6B,CAAI,EAAEk6B,EAAMl6B,GAAAA,QACRA,EADkBqvB,EACXnvB,EAEIF,EAAK,OAAAA,CAAA,CAFD,EAIfi/D,EAAAA,CAAWD,CAAAA,GAEbplC,EAAY,EAAK,EAEjBA,EAAAA,SAAiB,CAAA,MACnB,CACA9W,EAAW,OAAA,CACb,CACEA,GAAAA,CAAkB,CACpBhlB,OAAAA,EACC,IAAA,CACLqhE,EAAA,EAAA,CAEArhE,EAAAA,CAAAA,CAAAA,EACEqhE,EAAAA,MAAiB,CACnB,MAAK,QAEL,GAAA,gCACOp5D,SAAM,CAAA,CAAA,CAAAU,GAAAhB,EAAA,SAAA,CAAQ3F,KAAG,6BAEV6F,QAAKc,EAASV,SAAMN,EAAAS,EAAA,CAAcN,KAAAA,IAAiBJ,IAAAA,EAC1Ca,CAAGoc,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAO,CAAA,EAAChd,EAAA,SAAA,CAAC,SAAEA,EAAA,KAAA,CAGnCA,SAAAA,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAAA,CACE,CAAA,CAAA,CAAA,EAAAC,EAA4B,OAAA,CAAC,SAC3BH,EAAA,KAAA,CAENG,SAAA,CAAAu5D,EAAA,IAAAI,GAAA95D,EAAA,KAAA,CAAAE,YACE8jB,GAAA,SACG01C,EACCx5D,SAAAA,CACe,CAAA,EAACoS,EAAAA,GAASwnD,CAAQhgE,QAAAA,EAAqB,OAAAkrB,CACpC,CAAA,CAAC1S,CAASwnD,EAAAA,EAAQ90C,EAAAA,CAAAA,EAAAA,GAAAA,IAAAA,WAAAA,EAAAA,GAAAA,CAAe,GAAG,KAAA,SAEvD48B,GACAvtB,GAAYpT,EAAY,EACf84C,SAAG55D,EAAA,SAAA,CAAKsV,KAAAA,SAA+CvV,MAAAA,cACrDG,QAAKw5D,EAASp5D,SAAMN,EAAAgC,EAAA,CAAc7B,GAAAA,QAASu5D,CAAa35D,CAC9D,CAAA,CAAA,CAAA,CAAA,CAAwB,CAAA,CAClB,CAAA,CAAA,CAEX,CAAA,CACC,CACC,SACJ85D,GAAA,CAET,QAAA1nD,EAEA,OAAA0S,CAAyB,EAAE1S,CAAS0S,KAAAA,CAAU,EAAAi/B,CAC5C,EAAA5qD,GAAM,EAAED,QACR,EAAAkC,GAAM,EAAEzB,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,SAAAA,EAAUyB,CAAAA,EAAI2+D,CAAA,EAAAzgE,EAAA,EAAA,EACtB,OAAOynB,EAAAA,GAASzD,CAChB,QAAO08C,CAAAA,EAEP,aACG5mD,EAAAA,OAAW,UACA4mD,EAAAA,EAAAA,CACV1mD,GAAAA,SACEtT,OACEC,CAAA3F,EAAA8X,EAAA,QAAA,EAAA,WACsCA,CAAgB,EAAAnS,EAAA,OAAA,CAAA2D,MAAAA,cAAA,CAAAC,CAA7C,CAAY,CAAA,CAAwC,CAAA,EAAC,MAEvD,MAAC,kBACJ,SAERzB,QAAM,IAAA,CACNmR,KACe,SAAA,GACb,SAAa,CACX+J,GAAAA,CACC,MAAA3jB,EAAY,GAAA,MAAA,QAAAmrB,CAAA,EAAA,SAAA,OAAA,CACP,WAAA,CAAA1S,EAAA,EAAA,CACF,CAAA,EAAqDkL,EACnDiJ,SAAanU,EACf2nD,EAAC,EAAA,CACDz8C,MAAAA,CACAy8C,EAAW,OAAK,CAClB,CACEz8C,GAAAA,IAEJA,EAAG,SAAA,GACL,SAAO,CAGLA,GAAAA,CAEC,MAAA3jB,EAAY,GAAA,MAAA,QAAAmrB,CAAA,EAAA,SAAA,OAAA,CACP,WAAA,CAAA1S,EAAA,EAAA,CACF,CAAA,EAAqDkL,EACnDiJ,SAAanU,EACf2nD,EAAC,EAAA,CACDz8C,MAAAA,CACAy8C,EAAW,OAAI,CACjB,CACEz8C,GAAAA,EACF,EACC,SACLrd,EAAA,SAAA,CACF,KAAA,SAAED,MAAAA,SAEFg6D,EAAA,GAAA,QAAA,GACE75D,SAAK4gB,IAAA,UACLxgB,SAAgBy5D,EAATA,GAGCjW,GAAAA,QAAAA,EAAS,CAAAA,GAAAA,QAAAA,CAAN,CAAS,CAAA,CAAS,CAAA,CAAC,CClYtC,MAAMkW,GAAuB,CAC3Bp8C,QAAS,CAAC,UAAW,QAAQ,EAC7BqV,MAAO,CAAC,UAAW,QAAQ,EAC3BzkB,OAAQ,CAAC,UAAW,QAAQ,EAC5BsP,OAAQ,CAAC,UAAW,QAAQ,EAC5BC,OAAQ,CAAC,SAAS,EAClBwtB,eAAgB,CAAC,SAAS,EAC1B1tB,UAAW,CAAC,UAAW,QAAQ,EAC/BvW,KAAM,CAAC,QAAQ,EACf2O,OAAQ,CAAC,QAAQ,CACnB,EAEMgkD,GAAc,CAAC,YAAa,SAAU,QAAQ,EAC9CC,GAAah6D,GAAS+5D,GAAYtrD,SAASzO,CAAI,EAE9C,SAASi6D,GAAiBlgE,EAAe,CAC9C,OAAOA,EAAc24B,OAAQt3B,GAAiB,CAC5C,KAAM,CAAE4E,KAAAA,EAAM7F,GAAAA,EAAIsI,UAAAA,CAAU,EAAIrH,EAChC,GAAI,CAAC4E,EACHxH,MAAO,GAGT,MAAK2B,KAAkB6F,CAAA,EACrBxH,OAAAA,GAAQqkB,OACR3Y,EAAA,MAAArG,GAAA,CAAA,CAAAzC,EAAAyC,CAAA,CAAA,EAEIqG,IAEJ,CACF,SAAAg2D,GAAAngE,EAAA,IACAA,GAAa,mBAAA,CACb,KAAA,CACJ,SAAAyC,EAAA,CAAA,EAEA,mBAAA29D,EAAgBD,CAAAA,EACVngE,SAAAA,EAAAA,CAAAA,GACFA,EACEyC,OAAAA,EAAa,IAAAqwB,GAAA,CACbstC,KAAAA,CACAz9D,iBAAAA,EACE3C,SAAAA,CACJ,EAAA8yB,EACQuhB,EAAAgsB,GAAA,IAAAjgE,GAAAqC,EAAA,KAAAqP,GAAAA,EAAA,KAAA1R,CAAA,CAAA,GAAA,CAAA,EAAEigE,EAAAA,GAAgB,KAAA1xB,GAAAA,EAAA,KAAA2xB,CAAA,GAAA,KAAEA,MAAAA,IAAaxtC,EACvC,eAAAuhB,EAEA,OAAA9/B,EAEE,CAAA,EAEAA,OAAAA,EAEF,SAAAgsD,GAAAC,EAAA,CAEJ,MAAAC,EAAoBD,EAAA,IAAAE,GAAA,CACtB,KAAA,CAEA,yBAAAC,EACE,yBAAAC,EACA,eAAAvsB,EACE,mBAAAC,GACEqsB,QACAC,CACAvsB,GAAAA,GAAAA,EACAC,UAAAA,UACID,EAAA,CAAA,EAEN,GAAAqsB,EAEEh4D,CAAAA,OAMJm4D,EAAA,CAAA,EACA,QAAAjzD,EAAA,EAAAA,EAAA6yD,EAAA,OAAA7yD,IAAA,CACA,MAAA8yD,EAAAD,EAAA7yD,CAAA,EACMkzD,CACN,KAAA76D,EACA,OAAAsO,EACE,UAAA7L,EACA,mBAAA4rC,EACEruC,eAAAA,EACAsO,SAAAA,GACA7L,EACA4rC,EAAAA,EAAkB,IAAA,KAAA5rC,CAAA,EAAA,mBAAA,EAAA,OAClB2rC,EAAcpuC,EAIZ86D,EAD8Br4D,EAA6B,GAAK2rC,GAAE,OAAA,GAAAC,EAAAD,GAAA,UAChDpuC,IAAA,aAAAA,IAAA,YACtB86D,EAAA,oBAMA,MACGC,EAAAA,GAAAA,GAAAA,EAAAA,IAAAA,CAAiC,IACjC/6D,CAAI,GAEL86D,EAAcD,EAAkBh9D,CAAA,EAClC,GAAA,CAAAm8D,GAAAh6D,CAAA,EACA46D,EAAA,KAAAH,CAAA,UACSO,EAET5sB,EAAepuC,QAAO6L,GAAA,CACpB+uD,MAAAA,EAAuBjlD,EAAQ,eAAA,KAAAslD,GAAAA,EAAA,KAAApvD,EAAA,EAAA,EAC1BqvD,GAQCA,EAAI,OAAA,KAAAl7D,CAAA,IACKA,OAAI,KAAA,EAAA,QAAA,GARnBg7D,EAAA,eAAA,KAAA,CACA5sB,GAAAA,EACE,WAGA,CAKA,CAAA,EAGA4sB,EAAA,mBAAA,KAAA,IAAAA,EAAA,mBAAA3sB,CAAA,EACF2sB,EAAE,oBAAA,KAAA3sB,CAAA,EACF2sB,EAAA,qBAAA,KAAA5sB,GAAA,MAAA,EACA4sB,EAAA,UAAAA,EAAA,eACAA,EAAmB3sB,WAAAA,KAAAA,CAAqB9rB,MAIxCy4C,CACAA,MAAAA,EAAAA,UAAwCrlD,CACxCqlD,GAAAA,EACAA,OAAAA,CAAAA,CAAAA,CACF,EAAC,EACCH,EAAiBzsB,CAAAA,EAAAA,CACf,GAAGviC,EACH8oB,eAAan4B,EACb,KAACs+D,EACHD,UAAAA,EACE,WAAKvsB,EAAA,CAAAA,CAAA,EAAA,CAAA,EACLF,oBAAgB5xC,CAAAA,CAAQ,EACxBwD,qBAAiB,CAAAouC,GAAA,MAAA,CACjBH,EACAE,EAAoB,KAAIG,EAAczwC,CAAA,CAAA,EAEtC2wC,YAMN2sB,EAAA,CAAA,EACA,QAAAxzD,EAAA,EAAAA,EAAAizD,EAAA,OAAAjzD,IAAA,CACA,MAAA8yD,EAAAG,EAAAjzD,CAAA,EACMyzD,CACN,KAAAp7D,EACA,QAAAiS,EACE,UAAAg8B,EACA,eAAAG,EAAQpuC,UAAAA,EAAMiS,SAAAA,GAASg8B,EAAWG,EAAAA,EAAc,IAAA,KAAA3rC,CAAA,EAAA,mBAAA,EAAA,GAAEA,EAAS2rC,GAAA,SAAA,GAAAH,GAAA,SAAA,EAAEK,IAAAA,IAAAA,aAAAA,IAAAA,UAAAA,IAAAA,qBAAAA,EAAAA,OACzDzwC,EAAA,GAAAoU,GAAA,EAAA,IAAAjS,CAAA,IAAAgnD,CAAA,GACEA,EAAuBxkD,EAAgB64D,CAAAA,EAC7C,GAAMC,EAGJN,EAAU,UACJ,KAAKP,EAAA,MAAQ,EAInBO,EAAe/oD,MAAW,IAAIjS,EAAI,EAAIgnD,GACtCgU,EAAMA,WAAqBI,KAAAA,CAAkBv9D,OAE3Cm9D,IAAAA,EAAAA,GAA6BrlD,EAAI,CACjCqlD,GAAAA,EACAA,KAAAA,EACD,KAAMP,EAAA,GACL,UAASW,CAAAA,EAAAA,MAAAA,EACP,WAAK9sB,EAAA,CAAAA,CAAA,EAAA,CAAA,KAEM,KAAAitB,CAAA,CACXrtB,CACAC,QACA,KAAAssB,CAAA,CAEJ,CACF,OAACU,CACCA,CACF,SAAAZ,GAAAxgE,EAAA,CAGFvB,EAAYyhE,GAAAlgE,GAOZA,MAAAA,EAAgBkgE,CAAAA,OAEhB,QAAAtyD,EAAA,EAAA+sB,EAAA,EAAA/sB,EAAA5N,EAAA,OAAA4N,IAAA,CACA,MAAAvM,EAAArB,EAAA4N,CAAA,EACA,CACA,GAAAxN,EACA,OAAAmU,EACA,QAAA2D,EACE,KAAAjS,EACA,UAAAyC,GAAUrH,EAAEkT,EAAM7L,EAAA,IAAA,KAAAA,CAAA,EAAA,mBAAA,EAAA,OAAEwP,EAAOjS,GAAEA,IAAI,aAAAA,IAAA,YAAEyC,EAAAA,oBACnC,MAAMukD,EAAI,GAAGvkD,GAAS,EAAG,IAAID,CAAKC,IAAUukD,CAACqU,GACzCP,EAAkBD,EAAAh9D,CAAA,EACtB,GAAImC,IAASA,CAAA,EACX86D,EAAcpmC,GAAA,EAAAt5B,UAChB4/D,GAAA,QAAA,CACA,MAAMn9D,IAAkC,UAAU,KAAAgO,GAAAA,EAAA,KAAAoG,EAAA,EAAA,EAC5C+oD,GACFE,EAAWl7D,OAAO,KAAAA,CAAA,EACpBw7D,EAAAA,OAAuB,KAAGpgE,EAAAA,QAAAA,EAC3B4/D,EAAUA,MAAoB/oD,UAI7BA,SAAmB,CAAAjS,CAAA,EACjBk7D,EAAcvmC,eAAiB1iB,CAAA,EAC/BipD,QAA2B,IAACO,CAAAA,GAE9B,KAAC,CACCxpD,IAAQ0iB,SAAe,CAAA30B,CAAA,GACvBg7D,IAAAA,EAAAA,EAAmB/sB,CAAAA,EAAUt4B,CAC7BqlD,GAAAA,EACF,KAAAF,EACD,KAAM3gE,EACL,UAAa8X,IAAkBjS,EAAI,CAAA,CACnC,EACEw7D,EAAe9mC,GAAA,EAAA6mC,CACfv7D,CACAguC,CAON,MAAAotB,EAAA,CAAA,EACAM,EAAA,CAAA,EACA,QAAA/zD,EAAA,EAAA+sB,EAAA,EAAA/sB,EAAA6zD,EAAA,OAAA7zD,IAAA,CACA,MAAAvM,EAAAogE,EAAA7zD,CAAA,EACA,CACA,GAAAxN,EACA,QAAA8X,EACA,UAAAg8B,EACE,KAAAjuC,EACA,UAAAyC,GAAUrH,EAAE6W,EAAOxP,EAAA,IAAA,KAAAA,CAAA,EAAA,mBAAA,EAAA,MAAEwrC,IAAS,oBAAAh8B,GAAAg8B,EAAA,SAAA,EAAA,CAAEjuC,MAAInC,EAAA,GAAAoU,GAAA,EAAA,IAAAjS,CAAA,IAAAgnD,CAAA,GAAEvkD,EAAAA,EAAAA,CAAAA,KAAcrH,EACpD4/D,EAAsB,UAAW,KAACv4D,EAAW44D,MAAAA,EACzCr7D,EAAS,MAAkB,IAAIiS,CAAAA,OAC3BpU,CACN,IAAMm9D,EAAAA,EAAqBI,CAAAA,EAAAA,CACvBJ,KACFA,KAAAA,EACAA,KAAAA,EACD,UAAM,CAAA5/D,EAAA,MAAA,CACL,EACEsgE,EAAehnC,GAAA,EAAA6mC,EAEfvtB,MACAE,EAAY9yC,GAAAA,EAAAA,CAEdsgE,CAGFA,OAAAA,CACF,CCpQJ,MAAMlwC,GAAQ,GACRmwC,GAAoB,IAAIhsD,gBAE9B,SAASisD,GAAS,CAAEn+D,WAAAA,EAAY,GAAGwxC,CAAM,EAAG,CAC1C,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAEQ,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtB,CAAC03C,CAAY,EAAIl1C,EAAa,CAACk+D,EAAiB,EAAI9oB,GAAAA,EACpD,CAACgpB,EAAWC,CAAY,EAAI3iE,EAAS,IAAI,EACzC6G,EAAOivC,GAAOjvC,MAAQ2yC,EAAal/B,IAAI,MAAM,GAAKooD,EACxDlV,GAA2B1qD,EAAlB+D,IAAS,UAAY,CAAA7F,GAAA,QAAA,EAAsB,CAAAA,GAAA,QAAA,CAAJ,EAAiB,WAAW,EAE5E,MAAM4hE,EAAmB7jE,EAAAA,EACnBq+D,EAAar+D,EAAAA,EAEnB,eAAe8jE,EAAcruC,EAAW,EAClCA,GAAa,CAACouC,EAAiB3jE,WACjC2jE,EAAiB3jE,QAAUoB,EAAMM,GAAGC,cACjCC,KAAK,CACJC,MAAOuxB,GACPywC,MAAO,CAAC,SAAS,CAAA,CAClB,EACA7hE,OAAAA,GAEL,MAAMsvB,EAAU,MAAMqyC,EAAiB3jE,QAAQkC,KAAAA,EAC/C,GAAI,CAAED,MAAAA,CAAAA,EAAUqvB,EAChB,OAAIrvB,GAAOE,SACTF,EAAQ4/D,GAAiB5/D,CAAK,EAE1BszB,IACF4oC,EAAWn+D,QAAUiC,EAAM,CAAC,EAAEF,IAEhCE,EAAA,QAAA,CAAA,CAEAA,QAAe,IAAEiU,CAAaupC,GAAM9F,EAAAt4C,CAAA,CAClCo+C,CAAAA,GAEJ,CACA,GAAAnuB,EACE,MAAGA,GAAAA,IAAAA,GAAAA,EAAAA,MAAAA,CAAAA,CACoC,CAE3C,MAAAwyC,EAAAhkE,EAAA,EAEMgkE,EAAwBhkE,EAAO,EACrC,iBAA+BA,EAAO,EACtCy1B,MAAkCA,WAChCuuC,EAAkBA,QAAAA,EAAsB9jE,GAAAA,cAAS,KAAA,CAC/C8jE,MAAAA,EACQ,CAAA,EACJjiE,OAAOuxB,GAGb,MAAA9B,EAAA,MAAAwyC,EAAA,QAAA,KAAA,EACA,GAAA,CACA,MAAA7hE,CAAI,EAAEA,EAAM,OAAAA,EAAIqvB,GAAAA,OAAAA,GAAAA,EAAAA,UAAAA,EAChBrvB,GAAQA,aAEN8hE,EAAe,QAAA9hE,EAAA,CAAA,EAAA,WAAA,IAEb7B,EAAAA,QAAY,CAAA,CACd,WAAAu5C,CAEA13C,IAAM6M,CAAWk1D,GAAAA,EAAYrqB,CAAAA,CAAK,CAAA,GAEjC,CACH,GAAAroB,EACAlxB,MAAQga,UAAsBu/B,EAAA,UAAA,CAC9B,CAAO,CACFroB,SACHrvB,KAAmB03C,EAAAA,CACrB,OAAA/xC,IAAA,UACFq8D,EAAA,GAAAtmE,CAAA,IAGe,GAAWA,CAAA,CACtB,CAAiC,eACnC6F,GAAA,CACA,GAAAoE,IAAOg8D,UACT,GAAA,CAEA,MAAAtyC,EAAe9tB,MAAAA,EAAkB,GAAA,cAAA,KAAA,OAClB,EACP,SAAAugE,EAAA,OACF,CAAA,EAAA,OAAMzyC,EAAAA,KAAU,EACR,GACJzvB,CACA09D,MAAAA,CAAiCv/D,EAElCgC,EAEH,MAAIw8D,EAAAv8D,EAAA,CAAA,GAAA,KAAA8hE,EAAA,QAAA,OAAE9hE,GAAAA,QAAAA,CAAAA,GAAM8hE,EAAIzyC,QAAAA,EAAAA,CAAAA,EAAAA,WAAAA,GACRlX,IAOJnY,EACF8hE,MAAAA,CACA,MAAA,EAAO,KAGX,KACE,MAAAzyC,EAAO,MAAAlwB,EAAA,GAAA,cAAA,KAAA,CACT,MAAA,EACF,MAAO,CAAA,SAAA,EACD,SAAA+8D,EAAA,OACF,CAAA,EAAA,OAAM7sC,EAAAA,KAAU,EACR,GACJzvB,CACAgiE,MAAAA,CAAiB,IAEnB,OACC7hE,GAAO,QAEVm8D,EAAI,QAAAl8D,EAAA,CAAA,EAAA,GAAEA,IACN7B,EACA,OACE+9D,MAAAA,EACA,CAEF,CAAO,QACGtiD,GAAA,IACVtU,EAAO,MAAA,CACT,MAAA,sBACF,SAAA,CAAAG,EAAA4T,GAAA,CACF,GAAA,YAEMkzC,MAAAA,EAAwB,GAAxBA,YACJ,QACE5vD,GAAA,CAAWyG,IAAqBoC,EAAAA,eACzB,EACAi8D,EAAA,IAAA,EAEH77D,EACE,SAAIxC,EAAAA,EAAY,CACdzG,GAAEmJ,QACF27D,CAAAA,CAAiB,CAAA,EACnBh8D,EAAA4T,GAAA,CACF,GAAA,yBAAE7T,MAAAA,IAEFiC,UAAA,YAAA,GAAA,QAAA9K,GAAA,CAAiByG,IAEnBqC,EAAAA,eAAK,EACAg8D,EAAA,SAAA,EAEH77D,EACE,SAAIxC,EAAAA,EAAY,CACdzG,GAAEmJ,QACF27D,CAAAA,CAAsB,CAAA,CAAA,CACxB,CAAA,EACF,CAAA97D,CAAEH,CAAAA,EAEF,OAAAC,EAAA49C,GAAA,CAAA,MAAqBzhD,EAEpB,CAEL+D,GAAK,QAET,CACW,EACF/D,GAAAA,WAAAA,UAAEA,EAAU,CAAC,GAAA,QAAA,CACf,EACMA,UAAAA,EAAE,CAAyB,GAAA,QAAA,CAAC,EAC5BA,SAAAA,EAAAA,WAAAA,EAAE,gBAAAL,EAAA,UAA0B,GAAC,cAAAgrD,EACtCntD,QAAAA,EACAskD,cAAAA,eAAAA,CAAAA,CACAniD,CClIN,MAAM0gE,GAAsB,GACtBC,GAA8B,GAC9BZ,GAAoB,IAAIhsD,gBAExB8tC,GAAwB,CAC5Bn6B,MAAO,SACPmyB,OAAQ,SACRpyB,SAAU,QACZ,EAEMm5C,GAAkCnY,GACtC,IAAMzoC,GAAAA,GAAkB6gD,UAAY,EACpC,CACE5/D,OAAQ,IAAO,GAAK,CACtB,CACF,EAEA,SAAS6/D,GAAgCt+D,EAAO,GAAI,CAClD,KAAM,CAAE5E,MAAAA,CAAAA,EAAUyB,GAAAA,EAClB,OACEtB,EAAO+D,SAASme,2BAChB2gD,GAAAA,EAGOhjE,EAAMmwB,GAAG5vB,cAAcC,KAAK,CACjCC,MAAOsiE,GACP,GAAGn+D,CAAAA,CACJ,EAEM5E,EAAMM,GAAGC,cAAcC,KAAK,CACjCC,MAAOqiE,GACP,GAAGl+D,CAAAA,CACJ,CAEL,CACO,SAASu+D,GAAwBv+D,EAAO,GAAI,CACjD,OAAOs+D,GAAgCt+D,CAAI,EAAEhE,OAAAA,CAC/C,CAEO,SAASwiE,GAAwB7iE,EAAe,CACrD,OACEJ,EAAO+D,SAASme,2BAChB2gD,GAAAA,EAEOlC,GAAoBvgE,CAAa,EAEjCwgE,GAAmBxgE,CAAa,CAE3C,CAEA,MAAM8iE,GAAyB,CAC7B,kBACA,kBACA,iBACA,qBACA,oBAAoB,EAEhBC,GAA8B,CAClCC,gBAAiB,CAAA5iE,GAAA,QAAA,EACjB6iE,gBAAiB,CAAA7iE,GAAA,QAAA,EACjB8iE,eAAgB,CAAA9iE,GAAA,QAAA,EAChB+iE,mBAAoB,CAAA/iE,GAAA,QAAA,EACpBgjE,mBAAoB,CAAAhjE,GAAA,QAAA,CACtB,EAEA,SAASijE,GAAc,CAAE3/D,WAAAA,CAAW,EAAG,CACrC,KAAM,CAAEmU,EAAAA,EAAG7Y,EAAAA,CAAAA,EAAGC,GAAAA,EACd2tD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAe,EAAG,gBAAgB,EAC3C,KAAM,CAAEX,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtB8B,EAAaC,GAAYrD,CAAM,EAC/B,CAACinB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAACw5C,CAAY,EAAIl1C,EAAa,CAACk+D,EAAiB,EAAI9oB,GAAAA,EACpDwqB,EAAiB1qB,EAAal/B,IAAI,IAAI,EACtC6pD,EAA0B3qB,EAAal/B,IAAI,cAAc,EACzD,CAACugB,EAAUC,CAAW,EAAI96B,EAAS,EAAK,EACxC,CAACokE,EAAcC,CAAe,EAAIrkE,EAAS,EAAK,EAChDm/C,EAAgBpgD,EAAAA,EAChB,CAAEqhD,aAAAA,EAAcR,gBAAAA,EAAiBE,WAAAA,EAAYI,eAAAA,CAAAA,EACjDhB,GAAU,CACRC,cAAAA,CAAAA,CACD,EACGmI,EAAW1H,IAAoB,OAAS,CAACM,EACzC,CAACpO,EAAgBwyB,CAAiB,EAAItkE,EAAS,CAAA,CAAE,EACjD,CAACukE,EAAeC,CAAgB,EAAIxkE,EAAS,CAAA,CAAE,EAErDX,EAAcN,EAAsB,EAE9B0lE,EAAwB1lE,EAAAA,EAC9B,iBAA8BA,EAAO,CAQnC,IAPFgnD,MAAkCvxB,WAChCiwC,EAAkB/jE,QAAAA,GAA+B,CAE/C+jE,aAAAA,CAAAA,gBAAgClB,CAAgC,CAAA,EAEhE7iE,EAAC,QAAA+jE,EAAA,QAAA,OAAA,GAEH,gBAAA,KAAA/jE,EAAA,SAAA,UAAA,EACA,MAAI,CAGF,KAAO,EAAA,EAGT,MAAAgkE,GAAA,MAAAhkE,EAAA,QAAA,KAAA,EACMgkE,GAAAA,GAAyBhkE,GAA8BS,KAAK,EAClE,GAAAP,IAAMA,OAAgBmgE,CAEtBngE,WAAmBQ,GAAQ,CACzBR,GAAAA,EAAuBqB,OAAAA,EAAiB,CACtCy8C,cAAWz8C,EAA+B,CAAA,CACzB,CAAA,EAEnB,MAAC0iE,GAAAlB,GAAA7iE,EAAA,EA4BDmlD,GAEAvlD,EAAIg0B,kBAAWmwC,GAAA,CAAA,EACbnkE,EAAOC,cAAAA,GACPD,EAAAA,GAAOI,QAAAA,OAAgB+jE,CAGvBtkE,cACGoc,CACC7b,WAAAA,GAAe,CAAA,EAAA,EAAA,CACuBI,CAAAA,EACtC,MAAA,IAAA,CACF,CAAC,GAELR,EAAO,cAAA,KAAA,GAAAmkE,EAAA,CAC4C,CAErD,OAAAnkE,EAAA,qBAAA,GAEAA,EAAOa,2BAAuB,KAAA,IAAA,EACvBujE,EACP,CACF,eAAAC,GAAA,CAEA,GAAA,CAEE,OAAI,MAAAxkE,EAAA,GAAA,eAAA,KAAA,CACF,MAAO,EAAmC,CAAA,CACjC,MACR,OACMxC,CAAAA,CAEP,CAAO,CAEX,MAAAinE,EAAA,IAAA,CAEA9gD,cACEA,SAAW,CACV,GAAA,CACC,MAAI+gD,EAAA,MAAAF,EAAA,EACFP,GAAuBO,EACvBP,EAAAA,SAAkBS,CAClB/gD,MAAAA,GACU,OAAA,CACVA,CAAkB,GAAA,CACpB,EAEJ,eAAAghD,GAAA,CAEA,GAAA,CACE,OAAI,MAAA3kE,EAAA,GAAA,cAAA,KAAA,CACF,MAAO,OACAxC,CAAAA,CAEP,CAAO,CAEX,MAAAonE,EAAAh7C,GAAA,kCAAA,EAEMg7C,CAAAA,EAAAA,CACJ,EAAAjlE,EAAA,EAAA,EAEI,CAACklE,GAAAA,CAA2BC,EAAAA,EAA4B,CAAA,CAAA,EAE9D,SAAOC,IAAqBC,CAC5B,OAASC,EAAAA,GAAAA,cAAAA,OAA2B,MAAA,EAAA,MAAA,IAAA,CAClC,CAAA,CAAyD,CAC3D,SAAAC,GAAA,CACAD,GAASC,EAAAA,KAA0B/mD,GAAA,CACjC8mD,EAAyB9mD,EAErBnf,CAAAA,EAAAA,MAAAA,KACAgmE,CAAAA,CAA6B,CAElB,KAAE,CAAAG,GAAAC,EAAA,EAAAzlE,EAAA,IAAA,EACnB,SAAA0lE,IAAA,CACA,OAAOF,EAAAA,GAAAA,cAAuBC,SAAAA,KAAAA,CAC9B,CACE,MAAAE,EAAgB/kE,GAAuBC,CACzC2kD,GAAA,EAAA,EAEAxhC,EAAM2hD,SAAAA,GACJngB,SAAW,CACXxhC,GAAAA,CACC,MAAA4hD,GAAYC,EAAA9f,CAAA,EACPA,IACFif,EAAMY,EAAAA,KAAAA,KAEFpxC,GAAW,KAAA,CAAA9hB,EAAAmJ,KACbmpD,KAAAA,MACG55B,GAAAA,WAAMm5B,GAAAA,SAAkB,EAAA,KAAA,MAAA7xD,EAAA,WAAAA,EAAA,SAAA,CACvB6xD,EAEEC,EACOr/D,EAAQ4lB,CACwB,CAAA,EAExC,MAAA,IAAA,CACDy5C,CAAAA,EACFK,EACa,EAAA,KAAAE,IAAA,CAAET,EAAAS,EAAA,CAEjBF,CAAAA,EAAAA,MAAAA,IAAAA,CAEIP,CAAAA,EAEDr/C,GAAcsgD,EAAA,GAGS,KAC1B,CACF,KAAAnqC,EAEA,EAAA,MAAMwqC,GAAA9qC,EAAEM,CAAAA,EAAAA,EAAKpX,EAAU4hD,SAAAA,CACvB9qC,MAAAA,CAEA9W,EAAW,OAAA,CACb,CACE3kB,GAAAA,CACA2kB,EAAkBhlB,EACpB,IAAA,CACF2mE,EAAG,EAAA,CACL,EAAA,CAAA,CAAA,EAEA3mE,EAAU,IAAM,CACd2mE,KACG,EAAA,CAEH,EAAA,CAAA7lB,CAAIA,CAAAA,EACF6lB,KAAAA,CAAAA,GAAAA,EAAsB,EAAA3lE,EAAA,EAAA,EACxB8lE,GAAA5/D,GAAA,CAAA,CACF,iBAAAuhD,EAAe,EAQf,EAAA,KAAOlC,CAEDugB,IAAAA,WAEEr+C,WAAY,aAAW03B,EAAA,SAAA,UAAA,KAAAsI,GAAA,OAAA,WAAA,CAAAE,GAAA,GACzBge,EAAA,EAAA,CAEFtmE,EAAAA,CAAAA,EAAY,qBAAkBuE,EAAA,SAAA,YAAA6jB,CAAA,CAAA,EAC5BxF,KAAwB1d,EAAS0d,MACRhjB,CAASs9C,MAElCkL,MAAAA,GAAAA,KAAAA,IAAAA,EAAAA,GAAAA,QACD,CAAAM,GAAA,SAAA7pD,GAAA,IAAA,EAEC0F,GAAWW,CAKXohE,iBAAsB,EAAA,CACxB,EAME5d,WAAwB,KAAA,IAAA,CAE5B,CACE,CAAA,EACA,MAAAvzB,GAAKuzB,EAAe9oD,EAAAA,EAElB6mE,EAAAA,IAAAA,CAAY,IAAAC,EACVte,GAAkBjnD,EAAA,uBAAAqU,IAAA,CAAA,GACnB2f,GAAA,QAAA,CACHA,GAAO,QAAA,GACLuzB,MACF,CACFtgC,IAAA,YACD5S,IAAAixD,GAAA,EACDtgB,GAAMhxB,EAAAA,EACNx1B,CAAAA,EACE,MAAI+mE,IAAQC,IAAAA,CACV,EAAA,CAAA,CAAA,EACExxC,MAAAA,GAAoB,IAAA,KACpByxC,GAAA,IAAA,KAAAC,GAAA,GAAA,GAAA,GAAA,GAAA,EAAA,IACFC,GAAA,IAAA,KACA,MAAAC,GAAgB,CAAAxiE,EAAW,cAAA,KAAA3B,GAAA,IAAA,KAAAA,EAAA,SAAA,EAAA,aAAA,IAAAikE,GAAA,aAAA,CAAA,EAC3BG,GAAmBtnE,EAAA,EACnBymD,EAAAA,IAAY,CACb0e,IACD1jE,oBAAqB,CAClB,GAAA0jE,EAECgC,kBAAqB,CAC3B,EAEA,EAAA,CAAAhC,EAAMkC,CAA6BxlE,CAAAA,EAMnC,KAAMylE,IAAuBtnE,EAAO,EAAAiB,EAAA,IAAA,EAEpChB,EAAU,SAAM,CACd,MAAIklE,EAAgB,IAAA,KACS,GAA3B1jE,EAAOs3C,SAAAA,IAAAA,IACL92C,CAAAA,GAAIkjE,yBAAAA,EAAAA,OAAAA,IACJtsB,GAAkBusB,GAAAA,QAAuB,IAAA,0BAAA,EAAA,GAC3CmC,GAAA,CACFC,GAAAD,EAAA,EACEpC,MAoBJ,CAEAllE,MAAAA,GAAsBwkE,GAAA,CAEpB,MAAM3V,CAAAA,gBACN,CAAA,EAGA,GAAI,CAKJyY,IAHIE,MAAAA,GACF,KAAA,IAE4B,OAAA,qBAAA,CAAA,EAC5BD,IAA4BC,cAAwB,MACpD3Y,EAAA,gBACF0Y,GAAAD,EAAA,EACAlsD,0CAA6BopD,EAAwB,EAErD,MAAC,CAAA,CACD,EAAA,CAAA,CAAA,EACE,MAAAhd,GAAMvkD,gBACNukE,GAAAA,GAAAA,IAAAA,IAA2BvkE,CAC3B,MAAAwkD,EAAMggB,iCAA6C7xB,EAE/C6xB,GAAAA,GAAyBC,sBAAe,EAC1CrnE,GACE,MAAA,KAAA8/C,EACAsnB,QAAAA,iBACAD,EACF,CAAA,EACAD,GAAAA,GAAAA,GAA4BC,IAAAA,EAAAA,QAAwB,cAAA7f,GAAA,OAAA,EAAA,CACpDvsC,MAAAA,GAAkBwsC,GAAA,QAAAH,CAA4B+f,EAChD,IAAA1rB,EAAA8L,GAAAC,GAAA,CAAA,MAEAxnD,QAAc,EAChBy7C,EAAA,eAAAwJ,EAAA,EAGF,KAAMkC,CACN,MAAMF,GACJM,GACA,KAAMhO,GAAA,CACJ,MAAM6N,GAAa1pD,EAAAA,sBAAuBy5D,EAC1C,OAAM7P,GAAAA,YAA6B9gC,MAAAA,CACnC,CAAA,EAIE4gC,KAIAO,GAAMH,MAAAA,EACNG,GAAIlM,eAAoB+L,EAAmB,EAEzC/L,CACAA,EAAAA,CAA6C,OAC/C,GACF,gBAAOj9C,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QACL,CAAA,EACEopD,EAAMF,OAAgBlhC,IAAAA,CACtB,MAAA4gC,EAAOM,SAAgB,cAAe31C,QAAQo1C,EAAA,EAC/CG,GAAAF,GAAA,sBAAA,EACGO,GAAAA,MAAa,KAAA7H,EAAA,QAAA,iBAAAqH,EAAA,CAAA,EACfQ,GAAAA,GAAYthC,GAAM,IAAAy5B,EAAA,QAAA,cAAAwH,GAAA,OAAA,EAAA,CAClBK,MAAAA,MAA2B1C,QAAAA,CAAqB,EAClD,IAAArJ,EAAA2L,GAAAC,GAAA,CAAA,EACF5L,IAEFA,EAAA,MAAA,EACEz1C,EAAQ,eAAA8+C,EAAA,EAGZ,KAAA,CAEA,MAAM2C,GACJL,GACA,KAAMhO,GAAA,CAEJ,MAAM6N,GAAa1pD,EAAAA,sBAAuBy5D,EAC1C,OAAM7P,GAAAA,YAA6B9gC,MAAAA,CACnC,CAAA,EAIE4gC,KAIAO,GAAMH,MAAAA,EACNG,GAAI/L,eAAoB4L,EAAmB,EAEzC5L,CACAA,EAAAA,CAA6C,OAC/C,GACF,gBAAOp9C,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QACL,CAAA,EACEqqD,GAAMnB,YAAgBlhC,GAAAA,EAAAA,IAAAA,CACwB,MAC/C8gD,GADQ5f,SAAgB,cAAe31C,QAAQo1C,EAAA,GAC/C,cAAA,cAAA,EACDmgB,IACE3f,GAAAA,MAAYthC,CACoC,EAAA,CAEpD,OAAA,GACF,gBACA7nB,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CAAA,EAEE4H,GAA0BE,IAAAA,KAE9BihE,GAAA9rD,GAAA,OAEa/X,GACV,CAEC,UAAM0jD,CACN,QAAMkgB,MACN,CACEA,CAAAA,EACF,CAAAE,EAAA,CAAA,EACF,OACArgE,EAAA,MAAA,CACEhB,GAAAA,qBACAC,MAAAA,iBAEJ,IAAA8I,GAAA,CAEA4wC,YACAmH,GAAMsgB,QAAAA,EACJ3f,EAAO/8C,UACL48D,GAAAA,QAAWv4D,CAAA,EACA,SACX,KACF,SAAC,CAAA/H,EAAA,MAAA,CACCqgE,MAAM,sBAAAzC,EAAA,gBAAA,EAAA,GAEV,SACE,CAAA59D,EAAA,SAAA,CACK,OAAA8gD,EACHrgD,QAAMpJ,GAAA,CACA0Q,EAAAA,OAAS,QAAA,WAAA,GACb4wC,EAAclgD,SAAUsP,SAAAA,CACnBtP,IAAAA,EACAA,SAAUsP,QACf25C,CAAKjpD,CAEP4Z,EAAanS,WAEb7I,GAAA,CAAYA,EAAA,OAAA,QAAA,WAAsBumE,GAAsC19D,EACtE,EAAA,CAEEI,EACE,MAAKjJ,IAAS24D,oBAAsB,GAClCrX,SAAAA,CAAAA,EAAAA,OAAgC,MAAEhuC,cAAK,SAAG+Y,CAAAA,EAAU,MAAA,CAAS,MAAC,cAChE,SAAA,CAAAvjB,EAAAw8C,GAAA,CAAA,CAAA,EAAAx8C,EAAA4T,GAAA,CACF,GAAA,UACa1c,eACP,SAAU24D,EAAAA,GACZmP,KAAAA,OACF,KAAA,IACF,IAAA7iE,GAGW,GAAA,QAAA,CACT,CAAW,CAAa4D,CAEjB,CAAA,CAACgC,CAAG,CAAA,EAAIzB,EAAAA,KAAM,CAAA,SAAcP,IAC1B,CAAA,GAACW,QAAK,CAAA,CAAY,CAAA,EAAAV,EAAIY,MAAGzE,CAAAA,MAAAA,cAAAA,SAAEmiE,GAAAt+D,EAAA,SAAA,CAAA,KAAA3F,SAAA,MAAM,gBAAA,QAAC,IAAA,CAAGmkE,EAAA,EAAA,CACrC,EAETx+D,SAAAA,EAAAS,EAAA,CAAAV,KACEC,WAAA3F,KAAA,IAA2B,IAAA8B,EAExBmE,CAAmBP,GACrBu+D,QACC,CACO,CACC,EAEJE,CAAAA,CAAiC,CAAA,CAAA,CACnC,CAAA,EAAA5f,IAAE7+C,IAEG,WAAAF,EAAA,SAAA,CAAA,MACHa,4BAAK,KACLC,SAAK,QACLC,IAAGzE,CAAAA,EAAAA,EAAAA,EAAAA,EAAE,SAAA,SAAA,CAAA,IAAA,EAAA,SAAwB,QAAA,CAAA,CAAC,EAC/B,SACK,CAAA6D,EAAAS,EAAA,CAEN,KAAA,UAAA,CACH,EACJm+C,IAAAA,EAAW99B,EAAAA,CAERxgB,GAAAA,QAAM,CACNJ,CAAAA,CAAK,CAAA,CACLC,CACE6+D,CAAAA,EAAAA,EAAAA,OAAkB,GAAIh/D,EAAA,MAAA,CACtBw4C,MAAAA,mBAAgC,SAC9BhuC,EAAK,MAAA,CAAA,MACL+Y,yBAAU,SACX1jB,EAAA,UAAA,CACH,MAAA,gBAAEE,SAEFC,CAAAA,EAACS,UAAI,CAACC,SAAK,CAAAb,EAAA,OAAA,CAAa,SAACmC,CAAAA,EAAAvB,EAAA,CAAA,KAAA,WAAgC,MAAA,oBAE5D,KAAA,GAAA,CAEFm9D,EAAAA,IAAcnjE,EAAAA,EACbuF,CAAW,GAAA,SACTA,OAAA,CAAW,EAAA49D,EAAA,MAAA,CACT,CAASt9D,EAAM,IAAAN,EAAA,QAAA,CAAeD,MAC5BF,gBAAAE,SACEF,CAAA,CAAAE,CAAAA,CACO,CAAA,EAACW,EAAK,OAAA,GAAAV,EAAA,OAAA,CAAA,MAAWM,4BAAM,SAAyBs9D,EAAA,IAAA,CAAAwC,EAAA9/C,KAAAtgB,EAAA,SAAA,CAAK,KAAE,SAC5D3F,MAAA,eAAAC,QAAA,IAAA,CAAAsJ,GACuBnJ,SAAAA,SAAAA,EAAAA,EAAAA,eAAAA,CAAM,SAAA,SAG1B,MACHuF,SAAA,CAAOM,CAAqBP,EAAmB,SAAAugB,GAAA,CAAA,CAC3C,CACLs9C,CACC,CAAA,CAAMt9D,CAAM,CAAA,EAA2BP,OACpC69D,CACC,MACE19D,sBAAK09D,EAAA,OAAA,EAAA,WAAA,QAAA,GAAA,IACLt9D,GAAM,WACS,IAAA8/D,GAAApgE,EAAA,KAAA,CACb0/D,SAAAA,EAAAA,GAA8B3/D,CAEb,aAAAqgE,CACL,CAAA,CACH,CAAA,CAAA,CACR,CAAA,CAAA,CACH,CAAA,CAES,CAAA,CAEZ,CAAA,EAAAj1B,EAEJ,OAAA,GAAAtrC,EAAA,MAAA,CAAA,MACM,kBACT,YACS,KAAA,CAC2C,MAElDI,kBAAKy/D,SAAqB3/D,EAEzB69D,EAAAA,CACC,GAAA79D,QACoB,CAAA,CAACqgE,CAAAA,EAAAA,EAA6B,OAAA,EAAAvgE,EAAA,UAAA,CAAA,SAEnD,CAAAG,EAAA,UAAA,CAAC,SACCA,EAAAgC,EAAA,CACE,GAAA,SACN,OAAA,CAGRmpC,EAAAA,EAAwB,MACvB,CAAW,CAAiBprC,CAC1B,CAAIO,EAAAA,EAAM,KAAA,CAAiBP,WACzB,IAAAoS,GAAAtS,EAAA,KAAA,CAAAxF,SAAA,CAAA2F,EAAA6jB,GAAA,CAA6B,QAAA1R,CAAA,CAE9Bg5B,EAAAA,EAAAA,IACCprC,UACEoS,EAAA,GAAApS,aACEiC,CAAA3H,CAAA,CAAAC,CAAAA,CAAA,EAAA6X,EACSg5B,EAAAA,CAAAA,CAAe1wC,CAAAA,CAAAA,CAAM,CAAA,EAG7BuF,EAAA,KAAA,CAAC,SAEJmrC,EAAA,IAAAh5B,GAAAtS,EAAA,KAAA,CAAAE,SACGorC,CAAAA,EAAAA,GAAoBh5B,CACnBpS,QAAAA,CACe,CAAA,EAACoS,EAAAA,GAAAA,CAAiB,UAC9B44B,EAAAA,GAAoB,aACR54B,CAAQ9X,CACH,CAAA,CAAA,CAEd,EAAA8X,EAEF,EAAA,CAAA,CAAA,CAAA,CAAA,CAEL,CAAA,EAACmsD,GACCG,IAAA,SAAA,qBAAA,GAAAz+D,EAAA,MAAA,CAAA,MAGPA,mBAAA,SAAAD,EACGorC,MAAAA,CACC,MAAAprC,yBACe,SAACoS,EAAAA,MAAAA,CAAiB,MAC/BnS,yBAAqB,WACRmS,UAAQ9X,CACnBib,SAAUA,MAAMpe,GAAA,CAEd,KAAA,CAEF,KAAA2rB,EAAA,EARK1Q,EAAQ9X,OAYtB,GAAAwoB,GAAA,CAGJy7C,MAAAA,GAAAA,MAAAA,KAEcQ,GAAAV,EAAA,CAAkBr+D,CACtBO,EAA8BP,UACjCC,EAAA,UAAA,CAAKM,SAAMN,EAAAgC,EAAA,CAAwBjC,GACjCF,SACEwgE,QACE,EAAM5B,GAAA,QAAA,oBAAA,CAAE57C,EACR,CAAA,EAAAg8C,GAGgBh8C,IAAMu7C,OAAAA,GAAAA,EAAAA,KAAAA,CAAAA,SAAUS,GAAA,IAAAyB,GAAAzgE,EAAA,KAAA,CAChC,SAAA,CAAAA,EAAA,MAAA,CACF,MAAA,uBAAEE,SAEF,CAAA,CAAAugE,EAAA,YAAA,IAAAtgE,EAAA6jB,GAAA,CAAA9jB,gBACE,GAAA,UAAA,GAAAzF,QAAAgmE,EAAA,OAAA,CAAA18D,gBAC6B28D,IAAAA,EAAQC,MAAAA,CAAoB,MAAA,YAGxD,SAAAxgE,EAAA4T,GAAA,CAEDirD,MAAAA,cACS,GAAA,IAAAllE,CAAA,MAAA2mE,EAAA,WAAA,EAAA,GAAUvgE,SAChB6jB,EAAMmR,GAAA,CAAO,OAAAurC,EAAA,WAAE,KAAA,IAGlBzB,SAAAA,EACE,CAAA9+D,CAEI,CAAAA,CACE,CAAKO,EAAAA,EAAMmgE,GAAA,UAEM,CAAA,CACXpgC,CAAe,CAAA,EACfrL,EAAAA,GAAS,CAAA,QAAAsrC,EACgB,SAG5BA,IAAQhE,CACFh8D,EAAM,EAAA,CAAA,CACJ,CAAA,CAAA,CACG,EAAAggE,IACF,CAAA,CAAuC,CAAA,EAnCjDtgE,EAAA,IAAA,CACR,MAAA,WACA8+D,SAAAA,EAAAA,GAAAA,CACApmE,OAAQga,EAAI,CAAA,CAAEmQ,CAAAA,CAgC2C,CAEpC,CAAA,CACWy5C,CAAAA,CACX,CAAA,CACG,CAAA,EAAAuD,IACT7/D,EAAA,MAAA,CAAA,MAAA,mBACG,SAAAA,EACH,MAENygE,CAA8B,MAAA,yBAC7BH,SAAiBtgE,EACjBye,GAAA,CAAA,aAEJze,EAA2B,CAAA,CACzBsgE,CAAAA,CAEEtB,CAAAA,EAAAA,EAAAA,MAAAA,CAAsB,GAAA,kBACxB,SAAEn/D,EACF,QAAA,CAAA,SAhCKygE,CAAAA,EAAAA,QAkCV,CAAA,KAGN,WAAA,QACM7C,EACN,SAAAvmE,GAAA,CACFwmE,EAAAxmE,EAAA,OAAA,OAAA,CAGV2oE,CACC,CAAKv/D,EAAAA,IAAMN,EAAAgC,EAAA,CAAkBjC,GAAAA,QAC3B,CAAKO,CAAAA,CAAM,CAAA,CACI,CAAA,EAAAT,EAACvE,KAAAA,CAAcukE,MAA2B,kBAAC,SACrD,CAAA7/D,EAAAgC,EAAA,CAGThC,GAAAA,QAAA,CAAK3F,EAAG,IAAA2F,EAAA,QAAA,CAAiBD,MAAAA,6BACvBA,WACE,CAAA,CAAA,CACO,CAAA,EAAA0/D,IACIhC,EAAAA,IAAAA,CAAAA,+BAEPC,SAAAA,IAAgBxmE,UAASmkB,EACzB,CAEJhhB,GAAA,QAAA,CAA4B,EACvB2F,EAAAF,EAAA,CAETD,SAAA,GAAA,CAAIS,CAAM,CAAA,EAAiBP,EACzBC,cAAA,OAAAA,EAAAi8C,GAAA,SAAA,CAAA,MAAA,gBAAA,SACAj8C,EAAA,cAAA,OAAAy7D,GAAAA,EAAA,OAAA,gBAAA,EAAA,IAAAngE,GAAA,CAAOgF,GAAAA,GAAMhF,EAAA,OAAA,UAA4ByE,OAAAA,KAE1C0/D,MAAAA,GACC,IAAA,KAAAnkE,EAAA,SAAA,EAASolE,GAAAC,GAAA,aAAA,IAAAnB,GAAA,aAAA,EAAwBz/D,KACT5D,GAAAA,IAAG,MAAA00B,GAAA8vC,GAAA,aAAA,IAAArB,GAAA,aAAA,EAAAnjE,EAA2B6D,CAAAD,GAAAA,QAAE,CAAU,EAGnE9C,MAAyBxC,CACAF,SAAM,EAAA,CAAewF,EAKnC09D,EAAAA,GAAgBniE,GAAsB,CACxC,UAAO,CACT,QAAA,MACA,CACA,CAAA,EAEA,OAAIolE,EAAAA,EAAc,CAChBlB,SAAAA,CAAAA,IAAamB,EAAAA,KAAAA,CACf,MAAA,kBAGA,YACEA,OAAAA,CAC4BxkE,SAAAA,EAAAA,CACxB,EAAA,IAAA6D,EAAA,QAAA,CAAA3F,MAAA,6BAAW,SAAAumE,CAAA,GACc,CACvBp2C,EAAAA,EAAAA,GAAU,CACX,SAAA7wB,EACP,aAAA2B,CAA4C,EAC1C6kE,EAAW,MAAA7kE,EAAA,EAAA,CAAA,CAAA,EAAAA,EACA,MAAAA,EAAA,EAAA,CAAA,CAAA,CACX,CAAA,EACDuE,EAAAC,EAAA,CACD,cACG+gC,WAAQ7gC,EAAAF,EAAA,CAAA,SAAAC,EACN2gE,KAAAA,CACC,MAAIpgE,gBAAM,SAAiBP,MACzBC,KAAA,CAAA,OAAAD,CAAO8wB,CAAAA,EAAc,IAAE,CAAA2+B,EACvBxvD,KAAAH,EAAA,KAAA,CAAA,MAAOS,wBAAM,SAA4BP,CAAAA,EACtC6gE,MAAAA,CACK,MAAA,oBAGZ5gE,SAACye,EAAAA,EAAY,CACX9kB,KAAAA,eACA2B,KAAAA,IAAAA,CACKA,CACL,CAbWA,EAAAA,EAAAA,MAAa4yC,CAgB/B,MAAA,uBAGLruC,SAAAC,EAAA,IAAA,UACGghB,kBACC,CAAA/gB,CACE,CAAIO,CAAAA,CAAM,CAAeP,CAAAA,CACX,CAAA,CAAU,CAAA,EAAE+gB,IAAWjZ,WACjC,IAAA,CAAA,MAAIvH,WAAM,SAAuBP,CAAAA,EAC/BC,EAAA,CAAA,GAAKM,QAAM,CAAA,EAAAN,EAAmBD,KAAAA,MAC3BU,KAAI,CAAA,CAAA,EAAAT,EAAA,SAAA,CAAA,KAACU,SAAK,QAAeC,IAAKq+D,EAAA,EAAA,EAAA,SAAMh/D,EAAAgC,EAAA,CAAC,GAExChC,QAAA,CAAA,CAAW,CAAA,CAAA,CACT,CAAA,CAAA,CAAG,CAAA,EAAAk0B,GAAmBl0B,EAAAi1B,GAAA,CAAA,SAClBwsB,GAAA,CAETA,GACCud,EAAA,CAIN,EAAS,SAAUj/D,EACjBC,SAAAgC,CAAA,KAAA,SAAA,MACAhC,cAEA,SAAa8gB,IAAA,UAAA,QAAS3gB,IAASA,EAAM6+D,EAAsB,MAAEj/D,CAC3D,eAAA,KAAA,EAAwB,SACjB+gB,IAAA,UAAA9gB,EAAA4jB,GAAA,CAEZ,OAAA,EAAA,CAGJsQ,EAAAA,EAAAA,EACEe,YAEG,CAAA,CACE+pC,CAAAA,CAAkB,CAAA,CAAA,CACpB,CAAA,EACFV,GAAAC,GAAAv+D,EAAAkE,GAAA,CAAA,QAAEnE,IAGAG,EAAAA,SAAKhJ,EAAA,eACLoJ,EAAM,EAAA,CACgB,EACW,SACjCoB,EAAO,MAAA,CAAA,MAAEggD,QAAgB,GAAM,yBAAA,SAAE3hD,KAGxB,SAAC+hB,CAAAA,EAAM,SAAA,CAAA,KAEd9hB,SAAA,MAAA,cAAA,QAAwB,IAAAw+D,EAAA,EAAA,EAEpB,SAAAx+D,EAAAS,EAAA,CAEX,KAAA,IAEF69D,IAAAA,EAGWj9D,CACJm9D,GAAAA,QAAkC,CACpC,CACF,CAAEz+D,CAEF,CAAKO,EAAAA,EAAM,SAAA,CAAQjG,SAAG2F,EAAA,KAAA,CAAyBkS,SAASlS,EAAAgC,EAAA,CAAIjC,WAC1D,CACEG,CAAK,CACLI,CAAM,CAAA,EACNH,EAAAA,OAAeq+D,CAAoCz+D,SAEnDC,EAACS,OAAI,CAACC,SAAKxJ,GAAA,CAAI0J,EAAAA,eAAGzE,EAAAA,KAAAA,CAAE,gBAAA8gE,GAAA5iE,gBAAAA,GAAO,eAAA8iE,GAAC,mBAAAC,EAAG,mBAAAC,EAAA,EAEjCnmE,EAAA,OACE8I,EAAA,CAAAD,GAAAA,GACE1F,gBAAA4iE,GAAA,MAAoC,gBAAAC,GAAA,MAClC,eAAAC,GAAA,MAENn9D,mBAAAo9D,EAAA,MAAAr9D,mBACEs9D,GAAA,KAAA,EAEInmE,EAAiB2pE,CAAA,EACjBrC,EAAM,EAAA,GAAA,SACJvB,CACAC,GAAAA,CACAC,MAAAA,EAAAA,GAAAA,cAAAA,OAAAA,OAAAA,CAAAA,EACAC,GAAAA,EAEI/7D,CACAw/D,GAAAA,QAAY,CACbpC,EAEHvB,QAAiC3iE,GAAAA,CACFA,EACQA,iBAEzC,SAAAyF,EAAAgC,EAAA,CACA08D,GAAAA,QACAF,CAAAA,CACA,CAAA,EAACx+D,EAAA,MAAY,CACX,MAAI,6BACF,SAAMtG,GAAuBme,IAAAA,IAC7Bxb,MAAAA,GAASF,GAAAA,CAAAA,EAAAA,OAAAA,EAAAA,MAAAA,CAAAA,SAAC0D,EAAA,QAAA,CAAA,SAAA,CAAAiS,EAAAkrD,GAAAj/D,CAAA,CAAA,EAAA8B,EAAA,SAAA,CAAgC,KAAA9B,EAAC,aAAAxD,SACjC,QACV7B,SAAcxB,CAAAA,EAAC,SAAA,CACjB,MAAA,SACC,SAAA8I,EAAAgC,EAAA,CACL,GAAA,QAAA,CAEAhC,CAAA,CAAAD,IACEiC,SAAA,CAAA,MAAA,SAAmD,SAAAhC,EAAAgC,EAAA,CAErD,GAAA,QAAA,CAAW,CAAA,CAA4BjC,EACpCg9D,EAAAA,SAAAA,CACOxiE,sBAEJyF,EAAAgC,EAAA,CAAAjC,WACE,CAAAA,CAEE,CAAQiV,CAAAA,CAAMjX,CAAAA,CAAKhG,CAAcwC,CAAAA,CAAa,EAAAwD,CAAOgC,CACnD,CAAA,CAAc,CAAA,EAAAC,EAAA,IAAQD,CACpB,SAAAC,EAAA3F,SAAA,CAAA,KAAA,SAAoB,SAEtB2F,EAAAgC,EAAA,CAAA,GAAA,QAAc,CAAA,CACZ,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,CAEtB,CAAA,CAAA,CAAc,CAAA,CACZ,CAAA,CAAA,CAAA,CAAA,CAAoB,CACb,SAAAg/C,IACF,CAAA,MAAA,CAAA,CAAA,SACJ,cAAA,sCAAA,CAAA,CACJ,SAAA8f,GAER,CAAA,aAAAV,CAEH,EAAA,CACE,KAAA,CAAa,SAAAzmE,CACX,EAAAwB,GAAA,EAAA,CAAkB,QAAA4lE,CACZ,EAAAnhC,GACN,EAAAohC,EACAD,GAAA,QAAC,CACF,GAAA1mE,EACH,QAAA6iC,EAGP,SAAA+jC,EAET,OAAAC,EAEA,UAAAC,EACE,OAAAC,EACF,YAAA7Q,EAEA,UAAAnsC,EAA6Bg8C,KAAAA,EAAgB,SAAAl7B,EAC3C,SAAAtoC,EAAQjD,KAAAA,WACR,UAAA0nE,CAAM,EAAEN,EAAYnhC,EAAmB,IAAA,KAAA2wB,CAAA,EACjCyQ,EAAiBD,GAAS5uD,CAAAA,EAC1B+gB,EAAA,IAAA,KAAA9O,CAAA,EACJ/pB,EAAAA,GAAAA,CAAAA,EAAAA,OACA6iC,EAAAA,MAAAA,CACA+jC,MAAAA,qBACAC,SAAAA,CAAAA,EAAAA,GAAAA,CACAC,QAAAA,CAAAA,CACAC,EAAAA,EAAAA,MAAAA,CACA7Q,MAAAA,uBACAnsC,QAAAA,GAAAA,CACAk9C,SAAAA,EACAp8B,SAAAA,CAAAA,CACAtoC,EACAonC,wBAAAA,CACAlX,OAAAA,GAAAA,EAAAA,CACAu0C,OAAAA,CAAAA,CACEjB,CAEJ,CACA,CAAA,EAAMmB,EAAAA,IAAAA,CACN,MAAMruC,gBACN,SAAMsuC,CAAAA,EAAAA,QAEN,SACEC,EAAA,YAAA,EAAKnhE,SAAMiD,GAAAk+D,CAAA,CAAA,CAAoB1hE,EAAAA,GAC5B8jB,IAAY09C,GAAA1hE,EAAAC,EAAA,CAACqS,SAAS6uD,CAAAA,IAAAA,IAAAA,IAAAA,EAAAA,OAAAA,CACvBhhE,MAAA,KACEM,SAAMN,EAAAgC,EAAA,IACGsuB,SAAqB4U,OAAAA,CAAUvrC,EAAAA,GAAAA,CAAAA,CAAAA,EACxC42B,WAAAA,CACEE,YACE3D,SAAAA,EAAAA,YAAAA,CAAAA,CACD,CAAA,CACH,CAEFjtB,CAAA,CAAGS,CAAAA,CAAM,CAAeP,CAAAA,CACtB,CAAA,EAAMkD,EAAAA,OAAsC,MAAElD,yBACd,OAE/BqkB,GACC,WACO,IACEs9C,GACP,CAAA,KAAMphE,CAAUP,KAAAA,EACd,MAAAqsC,EAAA,GAAAu1B,EAAA,UAAA31B,EAG+B,IAAAz5B,CAAC,EAAA5O,EAAA,OAAAC,WAD9B,CAAA,KAAMX,SAAoC,MAEpC,gBAAA0+D,EAAA,UAAA,EAAA,GAAA,SAAC,CAAApvD,GAAAy5B,EAAAhsC,EAAA,MAAA,CACF,IAAAuS,GAAAy5B,EACF,IAAAh3B,EAEV,MAAA,KAEHhV,OAAA,IAAA,CAAKM,EAAMN,EAAA,OAAA,CAAyBxH,SAAMwc,CAAA,CAAAjV,EAAAA,IACvCshE,EAAAA,OAAeK,CACd,MAAM,QAAE1sD,SAAAA,GAAAA,CAAAA,CAAAA,CAAMo3B,CAAAA,CAAAA,CAAAA,CAAOu1B,CAAAA,CAAI31B,CAAAA,CAAAA,CAAWz5B,CAAAA,CACpC,CACE,SAAAqvD,GAAah/C,EAAA,CAAA,KAAA,CAAmD,MAAAlpB,CAE5D,EAAAyB,GAAA,EAAiB6wC,OAAAA,EAAWprC,GAAKoU,cAAAA,KAAAA,CAAAA,UAAAA,CAAY,CAAA,CAAY,CAEzD,SAAAyrD,GAAOzrD,CAAAA,QAAAA,CAET,EAAA,CAAY,KAAA,CAA4B,SAAArb,CAAS,EAAAwB,GAC3C,EAEX,CAAA2lB,EAAAzD,CAAA,EAAAhkB,EAAA,SAAA,EACG,CACH,QAAA8Y,EAET,WAAAmqD,CAEA,EAAAgE,EACQ,CAAAuB,EAAAC,CAAA,EAAAzoE,EAAA,EAAA,EAAEK,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EAAM,SAAQsH,GAAA,CACtB8gE,EAAa9nE,EAAGC,CAAmB,CAEnC5B,OAAAA,EAAC,IAAA,CACHioE,GAAA,SAAA,IACSG,IAAiCH,EAAAA,SAAAA,GAAW,SAAA,CACnD,MAAMyB,EAAA,MAAAH,GAAAtB,EAAA,QAAA,EAAA,EAAE3mE,EAAAA,GAAAA,EAAAA,EAAawB,EAAI,SAAA,CACzB,GAAA,EACA,EAAA,CAAA0mE,EAAMvB,GAAA,SAAA,EAAA,CAAA,EAAEnuD,EAAAA,EAAAA,CAASmqD,SAAAA,CAAAA,EAAAA,SAAAA,CAAegE,KAAAA,SAChC,MAAOuB,uCACP,QAAO5nE,IAAAA,CAEP6nE,EAAmB,EAAA,CACjBA,EACF,SAAA,CAAA9hE,EAAAS,EAAA,CAEApI,KAAU,eACJ,MAACioE,oBACL,CAAA,EAAKuB,IAAAA,EAAW,QAAA,CAChBxkD,SAAWrd,EAAAgC,EAAS,CACnB,GAAA,SACC,OAAM+/D,CACNC,EAAAA,EAAiBD,QACjB1kD,EACC,WAAA,CACDwkD,EAAAA,EAAWvB,OAASnuD,OAGtBrS,cAAA,CAAAC,CACE,CACO,CACLO,CAAM,OACGH,EAAAA,EAAM,CACb2hE,KAAAA,cAAiB,CACnB,CAAA,CAAA,CAAA,EAAE/hE,GAEFC,EAACS,GAAI,CAAA,QAAMvJ,GAAA,CAAeoJ,EAAAA,SAAMpJ,EAAA,eAAwB8J,EACxDhB,CACE,EAAA,SAAA1F,EAAA,MAAA,CAAA,MAE+B6X,QAAQ0N,SAAQ,KAAA,SAAAlc,CAAAA,EAAA,SAAA,CAAA,cAA7C,MAAMrD,cAAM,QAAwCU,EAAC,SAAAhB,EAAAS,EAAA,CAChD,KAAA,IACA,IACTT,QAAK,CAACU,CAAK,CAAiB,EAAAV,EAAA,SAAA,CAE7B6hE,SAAAA,EACC7hE,IAACkE,UACiBlE,EAAAgC,EAAA,CACRX,GAAAA,SACJL,OAAQ,CACV,EAAAmR,EAAA,QAAA,EACApS,WAEF,CAAW,EAAAC,EAAA,OAAA,CAAiB,MAAA,cAAA,CAAID,CAC9B,CAAa,CAASO,CAAM,CAAcH,CAASa,CAAAA,EAAQjB,EAAAA,OACxDU,CAAI,SAAMqgB,IAAA,UAAA9gB,EAAA,IAAA,CAAIY,MAAK3H,WAAW,SAAA+G,EAAA4jB,GAAA,CAEjC5jB,OAAA,EAAA,CAAAD,CACE,CAAA,EAAAA,EACEiC,IAAAA,GAAAhC,EAAA,MAAA,CAAA,MAAA,oBAAA,QAAA9I,GAAA,CAAA,KAE+Bib,CAAgB,OAAA9Q,CAAA,EAAAsC,GAAAC,SAA7C,UAAA,UAAA1M,EAAA,OAAA,UAAA,MAAA8J,EAAMV,CAA8C,EAAC,SAChDN,EAAAye,GAAA,CACN,SAAA9kB,EAELqG,aAAAA,EAAAD,SACG+gB,EACC,CAAGxgB,CAAM,CAAA,CAAUP,CACV,CAAA,CAAA,CAAO,CAAA,CAAE,CAAA,CAAA,CAIhB,CAAA,CACQ,CAEJ,SAAAkiE,GAAM,CAAA,QAAA3B,EAAEj/D,SAAAA,CAER,EAAA,CAIEL,KAAAA,CAAQ,EAAAgc,CACV,EAAA9jB,GACF,EAAA,CAEa,MAAAQ,CACXC,EAAAA,GAAAA,EACA2B,CAAAA,EACAwyC,CAAQ,EAAAz0C,EAAA,SAAA,EAAA,CAAA2xC,EACTC,CAAA,EAAA5xC,EAAA,IAAA,EAAA6oE,EAEJl3B,IAAA,KAAA,OAECnrC,EAAC,IAAA,CAAA,MACJ,+BAAC,SAET,CAAAG,EAAA,SAAA,CACD,KAAA,SAEN,SAAA8gB,IAAA,WAAAohD,EAEA,QAASD,IAAAA,CAA6B3B,EAAAA,SAAAA,GAAShrD,SAAAA,CAAY,GAAA,CACnD,MAAA5b,EAAA,GAAA,cAAA,SAAA,QAAA4mE,EAAA,EAAA,EAAA,OAAA,EAAErnE,EAAAA,QAAAA,EAAGC,EAAA,SAAA,EACLoc,EAAA,CAAE5b,QAAAA,EAAc,MAAA,QACtB,CAAOonB,EACAkqB,GAAAA,GAII,GAAA,SACPhrC,OAAA,CACO,EAAAsgE,EAAA,QAAA,QAAA,CAC8B4B,CAEjC7kD,CAAAA,CACC,MAAY,CACXA,EAAI,OAAA,EACFhhB,GAAM3C,EAIN2jB,CACA/H,GAAAA,QAAS,CACPgrD,CAAAA,CACO,CAETjkE,GAAAA,CAAS2gB,EAAAA,SACPhd,EAAAgC,EAAA,CAAA,GAAA,QAAA,CAAA,CAAA,CAAA,EAAA,IAAAhC,EAAA4D,UAAwCic,KAAAA,SAAQ,SAAmCiB,IAAA,WAAAohD,EAAA,MACrF,eAAA,YACO5wD,CACP+L,EAAAA,SAAW,GACX3kB,UACA2D,GAAAA,CAAS2gB,MAAAA,EAAAA,GAAAA,cAAAA,SAAAA,QAAAA,EAAAA,EAAAA,EAAAA,QAAAA,EAAAA,EAAC,SAAA,EAAAK,EAAA,SAAA,EAAA/H,EAAuC,CAAC,QAAAgrD,EACpD,MAAA,SAAA,CACC,EACLjkE,GAAA2gB,EAEA,CAAmB,GAAA,SAErBhd,OAAA,CACO,EAAAsgE,EAAA,QAAA,QAAA,CAC8B4B,CAC7B,EAEJ7kD,MAAW,CACVA,EAAY,OAAA,EACXhhB,GAAI2gB,EAIFiuB,CACA5tB,GAAAA,QACA/H,CAAS,CAAA,CACPgrD,CACO,GAAA,CAETjkE,EAAS2gB,SAAAA,EAAAA,EAAAA,CAAAA,GAAAA,QACP,CAAA,CAAA,CAAA,EAAAhd,EAAA,OAAA1F,CAAA,MAAA,8BAAwCulB,SAAQiB,IAAA,UAAA9gB,EAAA4jB,GAAA,CAAA,OAAyD,EAAA,CAAA,EAAAonB,IAC3G,SAAAhrC,EAAAS,EAAA,CAAA,oBAEA4c,IAAAA,EAEAhhB,CAAS2gB,GAAAA,QAAAA,CAAC,EAAA,MAAwC,uBAAA,CAAA,EAAAguB,IAAC,WAAAhrC,EAAAS,EAAA,CAAA,KACrD,WACF,IAAGuc,EACHjd,CAEF,GAAA,QAAA,CAAqB,EAEjBO,MAAM,wBAAA,CAA6BP,CAE9B,CAAA,CAAA,CAAO,CAAA,CAET,CACE,MAAAoiE,GACFnlD,GAAAA,EAAAA,EC7uCT0O,GAAQ,GAEd,SAAS02C,GAAO,CAAE7sD,MAAAA,EAAO5X,WAAAA,EAAY,GAAGwxC,CAAM,EAAG,CAC/C,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/BwoE,EAAU,CAAC,CAAC9sD,EACZjf,EAASqH,EAAa,CAAA,EAAKinD,GAAAA,EAC3B,CAAElrD,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAI,CAC9BxB,SAAUw1C,GAAOx1C,UAAYrD,EAAOqD,QAAAA,CACrC,EACK,CAAED,MAAOouB,EAAcnuB,SAAUouB,CAAAA,EAAoB5sB,GAAAA,EACrDkI,EAAelH,EAAPkmE,EACV,CAAAhoE,GAAA,SAAAC,OAAA,CAAAX,SAAAA,CAAAA,CAA4B,EAC5B,CAAAU,GAAA,SAAAC,OAAA,CAAAX,SAAAA,CAAAA,CAAgC,CADF,EAElCktD,GAASxjD,EAAOg/D,EAAU,kBAAoB,eAAe,EAE7D,MAAM5L,EAAar+D,EAAAA,EAEbkqE,EAAiBlqE,EAAAA,EACvB,eAAemqE,EAAY10C,EAAW,CACpC,GAAIA,GAAa,CAACy0C,EAAehqE,QAAS,CACxC,MAAMgG,EAAO,CACXnE,MAAOuxB,GACPnW,MAAO8sD,GAAW5jE,MAAAA,EAEhB,CAAC4jE,GAAW/+C,GAAS,uBAAuB,IAC9ChlB,EAAKkkE,OAAS,IAEhBF,EAAehqE,QAAUoB,EAAMM,GAAGy9D,UAAU5yB,OAAO3qC,KAAKoE,CAAI,EAAEhE,OAAAA,CAChE,CACA,MAAMsvB,EAAU,MAAM04C,EAAehqE,QAAQkC,KAAAA,EAC7C,GAAI,CAAED,MAAAA,CAAAA,EAAUqvB,EAChB,OAAIrvB,GAAOE,SACLozB,IACF4oC,EAAWn+D,QAAUiC,EAAM,CAAC,EAAEF,IAIhCE,EAAM6M,QAAS6qC,GAAS,CACtB8F,GAAW9F,EAAMt4C,CAAQ,CAC3B,CAAC,GAEI,CACL,GAAGiwB,EACHrvB,MAAAA,CAAAA,CAEJ,CAEA,eAAeuB,GAAkB,CAC/B,GAAI,CACF,MAAM8tB,EAAU,MAAMlwB,EAAMM,GAAGy9D,UAAU5yB,OACtC3qC,KAAK,CACJC,MAAO,EACPob,MAAO8sD,EACPxK,SAAUpB,EAAWn+D,OAAAA,CACtB,EACAgC,OAAAA,EACAE,KAAAA,EACH,GAAI,CAAED,MAAAA,CAAAA,EAAUqvB,EAChB,MAAMktC,EAA0Bv8D,EAAM,CAAC,GAAGF,KAAOo8D,EAAWn+D,QAC5D,OAAIiC,GAAOE,QAAU,CAACq8D,GACpBv8D,EAAQo8C,GAAcp8C,EAAO,QAAQ,EAC9B,IAEF,EACT,MAAY,CACV,MAAO,EACT,CACF,CAEA,OACEyF,EAAC49C,GAAQ,CAEPv6C,MAAAA,EACAw6C,eACEh+C,EAAA,KAAA,CAAIS,MAAM,sBAAqBP,UAC7BC,EAAA,IAAA,CAAAD,SAAW5D,EAAPkmE,EAAU,CAAAhoE,GAAA,QAAA,EAAoB,CAAAA,GAAA,QAAA,CAAJ,CAAyB,CAAI,EAC3D2F,EAAA,MAAA,CAAAD,SAAMpG,CAAAA,CAAc,CAAC,CAAA,CACnB,EAENU,GAAG,SACHV,SAAAA,EACAmkD,UAAS3hD,EAAE,CAAA9B,GAAA,QAAA,CAAiC,EAC5C0jD,UAAS5hD,EAAE,CAAA9B,GAAA,QAAA,CAAsB,EACjC4jD,WAAYskB,EACZzmE,gBAAAA,EACAkiD,UAAS,GACTG,YAAan+C,EAAAF,IAAI,EACjByb,eAAgBte,EAAWW,SAAS2d,eAEpCwgC,cAAc,SACdqC,UACEv+C,EAACkT,GAAK,CACJ3R,OAAM,GAENupB,SAAS,OACTorB,WAAW,QACXtrB,SAAS,SACTzX,WACEhT,EAAA,SAAA,CAAQE,KAAK,SAASI,MAAM,QAAOP,SACjCC,EAACS,EAAI,CAACC,KAAK,OAAOC,KAAK,IAAIC,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAM,CAAC,CAAG,CAAA,CACpC,EACT0F,SAAA,CAEDC,EAAC8C,GAAQ,CAACmQ,KAAMovD,EAAU,MAAM1oE,CAAQ,KAAO,MAAMA,CAAQ,OAAOoG,SACjEsiE,EACCxiE,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACS,EAAI,CAACC,KAAK,UAAA,CAAY,EAAE,IACzBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAiC,CAAA,CAC7B,CAAC,CAAA,CACP,EAEFwF,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAACS,EAAI,CAACC,KAAK,UAAA,CAAY,EAAE,IACzBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6B,CAAA,CACzB,CAAC,CAAA,CACP,CAAA,CAEI,EACV2F,EAACiC,KAAa,EACdpC,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACb,IAAI04D,EAAc4J,OAAMtmE,EACtB,CAAA9B,GAAA,QAAA,CAA6C,CAC/C,EACA,GAAI,CAAC,KAAK2J,KAAK60D,CAAW,EAAG,CACvBA,GAAaz9C,MAAKjf,EAAC,CAAA9B,GAAA,QAAA,CAAkB,CAAC,EAC1C,MACF,CACIw+D,IACFA,EAAcA,EAAY76D,YAAAA,EAAc2oB,KAAAA,EAExCtX,SAASpL,KAAOo+D,EACZ,IAAIxJ,CAAW,OACf,IAAIA,CAAW,KAEvB,EAAE94D,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,KAAA,CAAO,EAAE,IACpBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqC,CAAA,CACjC,CAAC,CAAA,CACC,EACT0tB,IAAoBpuB,GACnBkG,EAACiD,GAAQ,CACP3C,QAASA,IAAM,CACbkP,SAASpL,KAAOo+D,EACZ,IAAIt6C,CAAe,OACnB,IAAIA,CAAe,IACzB,EAAEhoB,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAK,KAAA,CAAO,EAAE,IACpBV,EAAA,QAAA,CAAOM,MAAM,oBAAmBP,SAC9BC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAC,OAAA,CAAAytB,gBAAAA,CAAAA,EACwCpkB,WAAA,CAAAC,EAAnB5D,EAAA,IAAA,CAAA,CAAuB,CAAA,CAAC,CACtC,CAAA,CACF,CAAC,CAAA,CACA,CACX,CAAA,CACI,CAAA,EAzFJrG,EAAW0oE,CA2FjB,CAEL,CCnKA,SAAwBK,GAAe,CAAEC,YAAAA,CAAY,EAAG,CACtD,KAAM,CAAE1pE,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CAAES,SAAAA,CAAAA,EAAawB,GAAAA,EACf,CAAA,CAAG4W,CAAM,EAAIC,GAAY6C,GAAMA,EAAI,EAAG,CAAC,EACvC+8B,EAAUD,GAAAA,EAEVixB,EAAiBA,IAAM,CAC3BrwB,GAAAA,EACAl2C,GAAU,CACR4qB,KAAI9qB,EAAE,CAAA9B,GAAA,QAAA,CAAyB,EAC/B2M,MAAO,GAAA,CACR,EACD+K,EAAAA,CACF,EAEM8wD,EAAmBA,CAACj9B,EAAOmM,IAAc,CAC7CM,GAAwBzM,EAAOmM,CAAS,EACxChgC,EAAAA,CACF,EAEM,CAAC+wD,CAAO,EAAI72D,GAAAA,EAElB,OAAI2lC,EAAQn3C,SAAW,EACd,KAIPoF,EAAA,MAAA,CAAKS,MAAM,kBAAiBP,UAC1BF,EAAA,MAAA,CAAKS,MAAM,yBAAwBP,SAAA,CACjCC,EAACS,EAAI,CAACC,KAAK,SAAA,CAAW,EAAE,IACxBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6B,CAAA,CACzB,EACN2F,EAAA,OAAA,CAAMM,MAAM,QAAA,CAAU,EACtBN,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,eACNH,QAASyiE,EACTvgE,SAAUuvC,EAAQn3C,QAAU,EAAEsF,SAE9BC,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACnB,CAAA,CACA,CAAC,CAAA,CACN,EACL2F,EAAA,KAAA,CAAIM,MAAM,iCAAiCL,IAAK6iE,EAAQ/iE,SACrD6xC,EAAQpvC,IAAKkxC,GAAgB,CAC5B,KAAM,CAAEpxC,MAAAA,EAAOP,GAAAA,EAAIrB,KAAAA,CAAAA,EAAS8xC,GAC1BkB,EAAY9N,MACZ8N,EAAY3B,UACZp4C,CACF,EAEA,OACEkG,EAAA,KAAA,CAEES,MAAM,uBAAsBP,SAAA,CAE5BF,EAAC+T,GAAI,CACH7R,GAAAA,EACAzB,MAAM,uBACNH,QAAUjJ,GAAM,CACd46C,GAAmB4B,EAAY9N,MAAO8N,EAAY3B,SAAS,EAC3D4wB,IAAczrE,CAAC,CACjB,EAAE6I,SAAA,CAEFC,EAACS,EAAI,CAACC,KAAAA,EAAYJ,MAAM,oBAAA,CAAsB,EAC9CN,EAAA,OAAA,CAAMM,MAAM,wBAAuBP,SAAEuC,CAAAA,CAAY,CAAC,CAAA,CAC9C,EACNtC,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,eACNH,QAASA,IACP0iE,EAAiBnvB,EAAY9N,MAAO8N,EAAY3B,SAAS,EAC1DhyC,SAEDC,EAACS,EAAI,CAACC,KAAK,QAAQE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAO,CAAC,CAAG,CAAA,CAC7B,CAAC,CAAA,EAtBJ,GAAGq5C,EAAY9N,KAAK,IAAI8N,EAAY3B,SAAS,IAAI2B,EAAYvB,SAAS,EAuBzE,CAER,CAAC,CAAA,CACC,CAAC,CAAA,CACF,CAET,CC9EA,MAAM4wB,GAAc,EACdr3C,GAAQ,GACRmwC,GAAoB,IAAIhsD,gBAExB8tC,GAAwB,CAC5Bn6B,MAAO,UACPmyB,OAAQ,SACRpyB,SAAU,QACZ,EAEA,SAASy/C,GAAO,CAAErlE,WAAAA,EAAY,GAAGwxC,CAAM,EAAG,CACxC,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACL5C,EAASqH,EAAa,CAAA,EAAKinD,GAAAA,EAC3B,CAAElrD,MAAAA,EAAOC,SAAAA,EAAU8f,cAAAA,CAAAA,EAAkBte,GAAI,CAC7CxB,SAAUrD,EAAOqD,QAAAA,CAClB,EACK,CAACmnB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAACw5C,CAAY,EAAIl1C,EAAa,CAACk+D,EAAiB,EAAI9oB,GAAAA,EACpD+B,EAAgB18C,EAAAA,EAChB2xB,EAAIolB,GAAOvJ,OAASiN,EAAal/B,IAAI,GAAG,EACxCzT,EAAOvC,EACT,WACAwxC,GAAOjvC,MAAQ2yC,EAAal/B,IAAI,MAAM,EAC1C,IAAItQ,EAAKlH,EAAG,CAAA9B,GAAA,QAAA,CAAQ,EACpB,GAAI0vB,EACF,OAAQ7pB,EAAAA,CACN,IAAK,WACHmD,EAAKlH,EAAG,CAAA9B,GAAA,SAAAC,OAAA,CAAAyvB,EAAAA,CAAAA,CAAa,CAAS,EAC9B,MACF,IAAK,WACH1mB,EAAKlH,EAAG,CAAA9B,GAAA,SAAAC,OAAA,CAAAyvB,EAAAA,CAAAA,CAAa,CAAY,EACjC,MACF,IAAK,WACH1mB,EAAKlH,EAAG,CAAA9B,GAAA,SAAAC,OAAA,CAAAyvB,EAAAA,CAAAA,CAAa,CAAY,EACjC,MACF,QACE1mB,EAAKlH,EAAG,CAAA9B,GAAA,SAAAC,OAAA,CAAAyvB,EAAAA,CAAAA,CAAa,CAAC,CAAC,CAG7B88B,GAASxjD,EAAO,SAAS,EAEzB,KAAM,CAAC6wB,EAAUC,CAAW,EAAI96B,EAAS,EAAK,EACxC4pE,EAAY7qE,EAAO,CAAC,EAC1BC,EAAU,IAAM,CACd4qE,EAAU3qE,QAAU,CACtB,EAAG,CAACyxB,EAAG7pB,CAAI,CAAC,EAEZ,MAAMs4C,EAAgBpgD,EAAAA,EACtB0iC,GAAgB,IAAM,CACpB0d,EAAclgD,SAAS8iC,WAAW,EAAG,CAAC,CACxC,EAAG,CAACrR,EAAG7pB,CAAI,CAAC,EAEZ,KAAM,CAACgjE,EAAeC,CAAgB,EAAI9pE,EAAS,CAAA,CAAE,EAC/C,CAAC+pE,EAAgBC,CAAiB,EAAIhqE,EAAS,CAAA,CAAE,EACjD,CAACiqE,EAAgBC,CAAiB,EAAIlqE,EAAS,CAAA,CAAE,EACvDhB,EAAU,IAAM,CACd8qE,EAAiB,CAAA,CAAE,EACnBE,EAAkB,CAAA,CAAE,EACpBE,EAAkB,CAAA,CAAE,CACtB,EAAG,CAACx5C,CAAC,CAAC,EACN,MAAMy5C,EAAc,CAClB5mE,SAAUsmE,EACVxmE,SAAU0mE,EACVhM,SAAUkM,CAAAA,EAENG,EAAqB,CACzB7mE,SAAUumE,EACVzmE,SAAU2mE,EACVjM,SAAUmM,CAAAA,EAGN,CAACngD,EAAkBC,CAAmB,EAAIhqB,EAAS,CAAA,CAAE,EACrDk7B,EAAoB,MAAO73B,GAAa,CAC5C,GAAI,CAACA,GAAUjC,OAAQ,OACvB,MAAMipB,GAAgB,MAAMD,GAAmB/mB,EAAU0mB,CAAgB,EACrEM,IACFL,EAAoB,CAClB,GAAGD,EACH,GAAGM,EAAAA,CACJ,CAEL,EAEA,SAASggD,EAAY71C,EAAW,CAC1BA,IACFo1C,EAAU3qE,QAAU,GAGlB,GAACu1B,GAAa,CAACpU,KAKnB4D,EAAW,SAAS,EAChBwQ,GAAa,CAAC3tB,IAChBijE,EAAiBD,EAAc12D,MAAM,EAAGu2D,EAAW,CAAC,EACpDM,EAAkBD,EAAe52D,MAAM,EAAGu2D,EAAW,CAAC,EACtDQ,EAAkBD,EAAe92D,MAAM,EAAGu2D,EAAW,CAAC,IAGvD,SAAY,CACX,MAAMzsE,GAAS,CACbyzB,EAAAA,EACAC,QAASvQ,EACTtf,MAAO4oE,EAAAA,EAEL7iE,IACF5J,GAAO6D,MAAQuxB,GACfp1B,GAAO4J,KAAOA,EACVuZ,IAAenjB,GAAO0vD,OAASid,EAAU3qE,UAG/C,GAAI,CACF,MAAMsxB,EAAU,MAAMlwB,EAAMmwB,GAAGC,OAAO5vB,KAAK5D,EAAM,EACjDoC,GAAAA,EACA,GAAIwH,EAAM,CACRujE,EAAevjE,CAAA,EAAA0pB,EAAA1pB,CAAA,CAAA,EACbujE,MAAAA,GAAAA,EAAuBvjE,CAAE0pB,GAAAA,OACzBq5C,EAAMxoE,QAASmvB,GACfq5C,EAAU3qE,CAAAA,CAAAA,EAAUozB,CACpByI,SACFvK,EAAO1pB,CAAA,IAAA,CAAA,GAAA,KAAAsjE,EAAAtjE,CAAA,IAAA,CAAA,GAAA,GAGLi0B,EAAYj0B,EAAI,MACdi0B,CACFsvC,EAAOvjE,CAAA,EAAAmK,IAAA,CAAA,GAAAA,GAAA,GAAAuf,EAAA1pB,CAAA,CAAA,CAAA,EACLujE,MAAAA,GAAAA,EAAuBvjE,CAAGmK,GAAAA,OAC1B44D,EAAMxoE,QAASmvB,EAAenvB,QAAAA,GAC9BwoE,EAAU3qE,CAAAA,CAAAA,EAAU2qE,CACpB9uC,MAGNgvC,EAAOv5C,EAAA,UAAA,EAAA,EACLu5C,EAAiBv5C,EAAQhtB,YAAc,EACvCymE,EAAkBz5C,EAAQltB,UAAY,EAAE,EACxC6mE,EAAAA,QAAkB35C,EAClBq5C,EAAU3qE,EAAAA,EAEZi8B,EAAA3K,EAAA,QAAA,EACA2K,EAAAA,UAEAlX,MAAW,GACJhG,OAAK,CACZ3e,CACA2kB,GAAAA,EAAkB,CACpB,MACC+jC,EAAAhpD,EAAA,EACLH,GAAAkB,GAAA,CAEA,WAA8B,SAAA,YAAA,EAC9BlB,GAAAA,GAAAA,GAAmBkB,CACjB,MAAMggD,EAAaX,KAAAA,IAAAA,EAAAA,EAAuB5C,WAC3BuD,SAAY5hD,EAAA,IAAA,EACzBmsE,EAAMnsE,EAAWmL,EAGfghE,EAAY,QAAI,KAAA,IAAA,CAEhBtiB,CAAkC,CAAA,EACpC/oD,EACF,IAAA,CACD,IAAAsmB,EAEDtmB,OAAAA,EAAgB,SAAA,WAAA0xB,GAAA,EAAA,EACVpL,EACJm2B,EAAcx8C,EAAAA,EAEZorE,EAAAA,WAAgB,IAAA,CAClB5uB,EAAO,SAAA,QAAA,CACLn2B,EAAAA,GAAAA,EAEG,IAAG,aAAAA,CAAA,CAAA,EACR,CAAAoL,EAAA7pB,EAAAvG,CAAA,CAAA,EACAyC,GAAO,CAAA,aAAmBuiB,GAAK,CACjCm2B,WAAsB,QAAA,EAEtB14C,EACG,SAAY,SACZlF,CACC49C,EAAAA,CACAA,OAAAA,GACF,eACA,GACEj2C,gBAAQ3H,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CAAA,EACQ,MAChB4H,+CAEJ6gD,EAAAvjD,GAAA,IAAA,IAAA,CAEA,MAAMyjD,EAAAA,SAAgB,cAAA,QAAAA,CAAA,EAChBF,GACJG,GACM,sBAAA,EACEA,EAAAA,MAAa1pD,KAAS2pD,EAAc8P,QAAQhQ,iBAAaA,CAAA,CAAA,EAC/D,GAAAC,GAAME,OAA6B9gC,EAAAA,QAAsB,cAAA8gC,GAAA,OAAA,EAAA,CACzD,SAAuBjzC,UACPzU,CAAQ+F,EAExB,IACEyhD,GAAAA,KACqBtH,CAAAA,EAGrBrE,KACAA,GAAIA,MAAW8L,EACf9L,GAAIA,eAAUwJ,EAAA,EAEZxJ,KAAAA,CACF,MAAAkM,GAAAJ,EAAA,KAAAhO,IAAA,CACF,MAAOmO,GAAAnO,GAAA,sBAAA,EACL,OAAMoO,GAAAA,KAAcJ,IAASrrC,GAAMq9B,MAAS,CAC1C,CAAA,EACAoO,KACDA,GAAA,MAAA,EACDA,GAAIA,eAAa1C,EAAA,EAEf0C,CAAgD,EAAA,CAEpD,OAAA,GACF,gBACAnpD,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CAAA,EAEE4H,EAAAA,OAA0BE,IAAAA,CAE9B,MAAA8gD,EAAA,SAAA,cAAA,QAAAD,CAAA,EAEMS,GACJR,GACM,sBAAA,EAEEA,EAAAA,MAAa1pD,KAAS2pD,EAAc8P,QAAQhQ,iBAAaA,CAAA,CAAA,EAC/D,GAAAC,GAAME,OAA6B9gC,EAAAA,QAAsB,cAAA8gC,GAAA,OAAA,EAAA,CACzD,SAAuBjzC,UACPzU,CAAQ+F,EAExB,IACEyhD,GAAAA,KACqBtH,CAAAA,EAGrBlE,KACAA,GAAIA,MAAW2L,EACf3L,GAAIA,eAAUqJ,EAAA,EAEZrJ,KAAAA,CACF,MAAA+L,GAAAJ,EAAA,KAAAhO,IAAA,CACF,MAAOmO,GAAAnO,GAAA,sBAAA,EACL,OAAMoO,GAAAA,KAAcJ,IAASrrC,GAAMq9B,MAAS,CAC1C,CAAA,EACAoO,KACDA,GAAA,MAAA,EACDA,GAAIA,eAAa1C,EAAA,EAEf0C,CAAgD,EAAA,CAEpD,OAAA,GACF,gBACAnpD,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CAAA,EAEE4H,CAAAA,IAAwB5H,KAC1B,OACF8I,EAAA,MAAA,CAEA,GAAM,cAEN,uBAEI3F,SAAG,KACHiG,IAAAA,GAAM,CACN4R,EAAS,QAAAtK,IACHA,QAASA,EACb4wC,EAAAA,QAAclgD,CACdqnD,EACAW,SAAKhoD,EAAAA,MAAUsP,CACjB,MAAA,qBAAE7H,YAEF,SAAA,CAAKO,MAAMwgB,IAAA,UAAA,UAAA,GAAoB/gB,SAC7BC,EAAA,MAAA,CAAQM,MAAOwgB,cAAuC/gB,YACpD,MAAA,CAAKO,MAAM,cAAaP,SACtBC,EAAAw8C,GAAA,CAAA,CAAA,CAAA,CAAA,EAAKl8C,EAAMqyC,GAAA,CAAa5yC,IAAAA,CACZ,CACP,EACLC,EAAC2yC,MAAAA,CAAW1yC,MAAK60C,cAAgB,SACjC90C,EAAA,SAAA,CAAKM,KAAM,SAAaP,MAAAA,QAEpBG,QAAK,IAAA,CACLI,EAAM,EAAA,CACNH,EACEujE,SAAAA,IAAgB,UAClB,SAAA1jE,EAAAS,EAAA,eACgCV,KAAAA,IAE1BW,IAAAA,EAAuBE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAQ,CAAA,CAAC,CAAA,CAAA,CAAG,CAAA,CACxC,CAAA,EAAC0D,EACL,OAAA,CAAA,SACH,CAAA,CAAA,CAAAkqB,GAAA,CAAApsB,GAAAkC,EAAA,MAAA,CAEPA,IAAAA,GAAAE,MAAAA,cACWpC,cACP,UAAA,EAAA,GACEsC,SAAK0jE,CAAAA,CAAAA,CAAAA,GAAAA,EAAAA,GAAAA,CACLrjE,GAAAA,UAAOypB,EAAA,MAAcjJ,mBAAwBiJ,mBAE3C,CAAC7pB,EAAAA,GACK6B,mBAAoD,CAAGhC,EAAAA,IAAAA,EAC3DC,EAAK,CAACU,GAAAA,QAAK,CAAgB,CAAA,CAAE,CAAA,EAAArG,CAAAA,CAAA,MAAkB8B,EAK/CmG,CAAKnG,GAAAA,QAAAA,CAAE,EAAA,KAAU,WAAC,GAAA,aAAA,mBAAA4tB,CAAA,CAAA,gBAAA,EAClB7pB,CACA6B,MAAI5F,EAGJmG,CAAKnG,GAAAA,QAAAA,CAAE,EAAA,KAAU,WAAC,GAAA,aAAA,mBAAA4tB,CAAA,CAAA,gBAAA,EAClB7pB,CACA6B,MAAI5F,EAGJmG,CAAKnG,GAAAA,QAAAA,CAAE,EAAA,KAAO,WAAC,GAAA,aAAA,mBAAA4tB,CAAA,CAAA,gBAAA,CAAA,EACf7pB,KAAM,CAAA6L,EAAAmJ,KACFnJ,EAAA,OAAA7L,EAAa2lC,GAGlB5wB,GAAK,OAAIC,EAAM,EACRhV,CACN,EAAA,IAAMA,GAASA,EAAM0T,GAAA,CACrB,GAAAw4C,EAAO,GACR,SACKA,EACJpsD,KAAK,IAAKosD,IAAKrqD,CAAAA,CAAAA,CAAAA,CAAAA,MACZqqD,EAAK9pD,CAAK,SADgBpC,EAEvB,CACPA,GAACA,IAAA,aAAAL,EAAAC,EAAA,CAGP,cACCA,YAAAD,EAAA,KAAA,OAAA,kBAEIE,SACGG,CAAAA,EAAAA,EAAS,CACJI,GAAAA,QAAM,CAAiBP,EAAAA,IAAAA,EACzBC,GAAAgC,CAAA3H,GAAA,aAAA,mBAAA0vB,CAAA,CAAA,iBAAsB,SACtB/pB,EAAC4T,EAAI,CACH7R,KAAI,cAAmDhC,KAAAA,IAEjDW,IAAAA,EAA4BE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAU,CAAA,CAAA,CAAC,CAAA,EAACinE,EAAE,OAAA,EAAAvjE,EAAAC,EAAA,CAAC,SACjD,CAAAE,EAAA,KAAA,CAGVojE,MAAAA,8BACCrjE,SACEC,EAAA,IAAAmS,GAAAnS,EAAA,KAAA,CAAIM,SAAMN,EAAA6jB,GAAA,CAA6B9jB,QAAAA,EAEnCA,SAAAA,EAEIoS,UAAAA,GACAxY,aAAAA,EAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CACS,EAAAwY,EACT4R,EAAAA,CAAAA,CAAyC,CAAA,EAAE7jB,IAC5C,YAAAF,EAAA,MAAA,CAAC,MANKmS,WAST,SACHjS,EAAS0T,GAAA,CACHtT,MAAM,eAAUP,GAAAA,aAClB6T,mBAAImW,CAAA,CAAA,iBACHzpB,SAAM,CAAAN,EAAAgC,EAAA,CACND,GAAI,QAEH,CAAiBhC,EAAAA,IAAAA,EAElBC,EAAAgC,CAAA3H,KAAA,aAAA,CAA+B,CAAA,CAC1B,CAAA,CAAM,CAAA,CAAA,CAAgB,CAAA,EACvB,CAAA6F,IAAA4gB,IAAA,UAAA9gB,EAAA,IAAA,CAAC,MAEV,WACD,WAGD8gB,GAAAA,CACIxgB,OAAM,EAAA,CAAUP,CACV,CAAA,EAAC+hB,EAAAA,IAAM,CAAA,MAAE,WACf,SAEH9hB,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,EAAA,CAAA,CAAA,GAAgC,CAAAG,GAAAA,IAAA,aAAAL,EAAAC,EAAA,CAAC,SAGtC,CAAAI,IAAA,YAAAL,EAAA,KAAA,CACD,wBAGFE,SACGG,CAAAA,EAAAA,EAAS,CACJI,GAAAA,QAAM,CAAiBP,EAAAA,IAAAA,EACzBC,GAAAgC,CAAA3H,GAAA,aAAA,mBAAA0vB,CAAA,CAAA,iBAAsB,SACtB/pB,EAAC4T,EAAI,CACH7R,KAAI,cAAmDhC,KAAAA,IAEjDW,IAAAA,EAA4BE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAU,CAAA,CAAA,CAAC,CAAA,EAACmnE,EAAE,OAAA,EAAAzjE,EAAAC,EAAA,CAAC,SACjD,CAAAE,EAAA,KAAA,CAGVsjE,MAAAA,yBACCvjE,SACEC,EAAA,IAAAglC,GAAA,CAAI1kC,KAAM,CAAwBP,KAAAA,GAE9B,QAAA6xC,CAAM,EAAE58B,EAAM48B,GAAAA,GAAAA,SAAAA,CAAAA,GAAAA,KAAAA,IAAAA,CAAAA,GAAAA,KAAAA,CAAAA,EAAQ,OAAI5M,EAAAA,KAAAA,CAC1B,SAAM9Y,EAAQ0lB,GAASgyB,CAIvB,KACE,IAAAjqE,CAAA,MAAAqb,EAAA,GAAA,MAAAA,EAAA,GAAAjV,YACG6T,EAAI,CACH7R,eAIChC,IAAAA,GAEI,CAAA,EAACW,EAAK,OAAA,CAAUE,SAAIoU,EAAA,CAAK,EAC9BhV,CAAAA,CAAAA,IAAAA,EAAA,OAAA,CAAAD,MAAAA,QAAkB,SACfmsB,GACDA,EAAA,CAAA,CAAA,CAAM5rB,CAAM,CAAA,CACU,EAAA,GAEvB0U,EAAA,IAAAkX,EAAA,EAAA,CAAA,CAAA,CACG,CAAA,EAAChsB,IAfG8U,YAgBRhV,EAAA,MAAA,CAER,MAAC,WACC,SACHE,EAAS0T,GAAA,CACHtT,MAAM,eAAUP,GAAAA,aAClB6T,mBAAImW,CAAA,CAAA,iBACHzpB,SAAM,CAAAN,EAAAgC,EAAA,CACND,GAAI,QAEH,CAAiBhC,EAAAA,IAAAA,EAElBC,EAAAgC,CAAA3H,KAAA,aAAA,CAA+B,CAAA,CAC1B,CAAA,CAAM,CAAA,CAAA,CAAgB,CAAA,EACvB,CAAA6F,IAAA4gB,IAAA,UAAA9gB,EAAA,IAAA,CAAC,MAEV,WACD,WAGD8gB,GAAAA,CACIxgB,OAAM,EAAA,CAAUP,CACV,CAAA,EAAC+hB,EAAAA,IAAM,CAAA,MAAE,WACf,SAEH9hB,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,EAAA,CAAA,CAAA,GAAgC,CAAAG,GAAAA,IAAA,aAAAL,EAAAC,EAAA,CAAC,SAGtC,CAAAI,IAAA,YAAAL,EAAA,KAAA,CACD,wBAGFE,SACGG,CAAAA,EAAAA,EAAS,CACJI,GAAAA,QAAM,CAAiBP,EAAAA,IAAAA,EACzBC,GAAAgC,CAAA3H,GAAA,aAAA,mBAAA0vB,CAAA,CAAA,iBAAmB,SACnB/pB,EAAC4T,EAAI,CACH7R,KAAI,cAAmDhC,KAAAA,IAEjDW,IAAAA,EAA4BE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAU,CAAA,CAAA,CAAC,CAAA,EAAC+mE,EAAE,OAAA,EAAArjE,EAAAC,EAAA,CAAC,SACjD,CAAAE,EAAA,KAAA,CAGVkjE,MAAAA,WACCnjE,SACEC,EAAA,IAAAwO,GAAAxO,EAAA,KAAA,CAAIM,SAAMN,EAAA4T,GAAA,CAAU7T,MACjBmjE,cACCnjE,GAAAA,EACG6T,IAAIja,CAAA,MAAA6U,EAAA,EAAA,GAAA,MAAAA,EAAA,EAAA,GACHlO,SAAMN,EAAA+0B,GAAA,CACNhzB,OAAAA,CAGqB,CACpBhC,CAEM,CAAA,CAACyO,EAAAA,EAAiB,EAAA,CAAA,CAAA,CAAA,EAACtO,IACtB,YAAAF,EAAA,MAAA,CAAC,MAVAwO,WAaT,SACHtO,EAAS0T,GAAA,CACHtT,MAAM,eAAUP,GAAAA,aAClB6T,mBAAImW,CAAA,CAAA,iBACHzpB,SAAM,CAAAN,EAAAgC,EAAA,CACND,GAAI,QAEH,CAAiBhC,EAAAA,IAAAA,EAElBC,EAAAgC,CAAA3H,KAAA,aAAA,CAA4B,CAAA,CACvB,CAAA,CAAM,CAAA,CAAA,CAAgB,CAAA,EACvB,CAAA6F,IAAA4gB,IAAA,UAAA9gB,EAAA,IAAA,CAAC,MAEV,WACD,WAGD8gB,GAAAA,CACIxgB,OAAM,EAAA,CAAUP,CACV,CAAA,EAAC+hB,EAAAA,IAAM,CAAA,MAAE,WACf,SAEH9hB,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,EAAA,CAAA,CAAA,EAAA,CAA6B,CAAAG,IAAA4gB,IAAA,UAAAoT,EAAAl0B,EAAAi1B,GAAA,CAAC,SAGnCwsB,GAAA,MAOcA,CAEPiiB,EAAY,SACd1jE,EAAA,SAAA,CACF,KAAA,SAAED,MAAAA,cAGAG,QAAK,IAAAwjE,EAAA,EACLpjE,MAAM,CACNH,eAAeujE,KAAY,EACpB,SAAEhiB,EAAAA,EAAgB,CAAM,GAAA,QAAA,CAAE3hD,CAEjC,CAAA,CAAA,CAAA,EAAwBC,EAAA,IAAA,CAAC,MACnB,yBACF,SAERA,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAwBP,CAC/B,CAAA,EAAA1F,IAAA,WAAA2F,EAAA,IAAA,CAAA,MAAsB,WACrB,SAGL8gB,EAAY8C,GAAA,CACPtjB,OAAM,EAAA,CAAUP,CACV,CAAA,EAAA,CAAO,CAAA,EAAE+gB,IAAA,UAAA9gB,EAAA,IAAA,CAAC,MAGrB,WACJ,SACA8gB,EAAY8C,GAAA,CACXtjB,OAAM,EAAA,CAAUP,CACV,CAAA,EAAC+hB,EAAAA,EAAM,CAAA,SAAE,CAAA9hB,EAAA,IAAA,CACf,MAEHF,yBAAAC,SACEC,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAwBP,CAC/B,CAAA,EAAA1F,EAAAqoE,GAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAEO,CAAA,CAAA,CAES,CAAA,CAErB,CAAA,CACI,CCnjBf,MAAMh3C,GAAQ,GACRm4C,GAAmB,GAAK,GAAK,IAE7BC,GAAavnE,GAChB7C,GACQA,EAAMM,GAAG+pE,OAAO/X,MAAM9xD,OAAOI,OAAAA,EAASE,KAAAA,EAE/C,CACEuC,OAAQ8mE,EACV,CACF,EAEMrM,GAAgBj7D,GACnB7C,GACQA,EAAMM,GAAG+pE,OAAO//B,KAAK9pC,OAAOI,OAAAA,EAASE,KAAAA,EAE9C,CACEuC,OAAQ8mE,EACV,CACF,EAEA,SAASG,GAAoBtqE,EAAO,CAClC,OAAI4pB,GAAS,oBAAoB,EACxB5pB,EAAMuqE,SAASp6C,GAAGq6C,SAASzkE,MAAMwlC,SACrC/qC,KAAK,CACJsiC,MAAO,OAAA,CACR,EACAliC,OAAAA,EAEEZ,EAAMM,GAAG+pE,OAAOnnE,SACpB1C,KAAK,CACJC,MAAOuxB,EAAAA,CACR,EACApxB,OAAAA,CACL,CAEA,SAAS6pE,GAAczqE,EAAOpD,EAAQ,CACpC,OAAOoD,EAAMM,GAAGy9D,UAAUrL,KAAKlyD,KAAK5D,CAAM,EAAEgE,OAAAA,CAC9C,CAEA,SAAS8pE,GAAS,CAAEzmE,WAAAA,EAAY,GAAGwxC,CAAM,EAAG,CAC1C,KAAM,CAAEl2C,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/BvD,EAASqH,EAAa,CAAA,EAAKinD,GAAAA,EAC3B,CAAElrD,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAI,CAC9BxB,SAAUw1C,GAAOx1C,UAAYrD,EAAOqD,QAAAA,CACrC,EACK,CAAED,MAAOouB,EAAcnuB,SAAUouB,CAAAA,EAAoB5sB,GAAAA,EACrDkI,EAAKlH,EAAG,CAAA9B,GAAA,SAAAC,OAAA,CAAAX,SAAAA,CAAAA,CAAsB,CAAE,EACtCktD,GAASxjD,EAAO,sBAAsB,EAEtC,MAAMozD,EAAar+D,EAAAA,EAEbu0B,EAAsBhzB,IAAaouB,EAEnC,CAACqvC,EAAUiN,CAAW,EAAIhrE,EAAS,CAAA,CAAE,EACrC,CAAC2yD,EAAOsY,CAAQ,EAAIjrE,EAAS,CAAA,CAAE,EAC/BkrE,EAAgBnsE,EAAAA,EAEtB,eAAeosE,EAAY32C,EAAW,CACpCn1B,GAAAA,MAA0Bm1B,QAAS,CAEjC02C,GADFA,EAAI12C,QAAc02C,GAAuB7qE,CAAA,EACvC6qE,GAAAA,+BAGA,GAAIjhD,CACF,KAAI,CAEF,MAAM0gB,CAAA,EAAEzpC,MAAOypC,GAAAA,CAAAA,EAASA,GAAMwzB,QAC9B9+D,IAEE2rE,MAAAA,CAAAA,CACF,MACOntE,0BAAG,EACVwB,GAAAA,CACF,KAAA,CACF,MAAAutD,CAGA,EAAI3iC,YAAmC,EACjC2oC,GAAAhG,GAAA,SAAAmG,GAAAA,EAAA,OAAA,MAAA,EACFH,IAAM,QAAE1xD,EAAAA,EAAAA,CAGR,QAEA,CACE+pE,MAAAA,EAAAA,MAAStY,EAAK,QAAA,KAAA,EAAA,GAAA,CAChB,MAAAzxD,CAEA7B,EAAAA,EAAe,OACjB6B,GAAA,SACFszB,IACF4oC,EAAA,QAAAl8D,EAAA,CAAA,EAAA,IAEAA,EAAI,QAAA03C,GAAA,CAAE13C,GAAAA,EAAAA,CAAAA,CAAM,CAAA,GAENszB,CACF4oC,GAAAA,EACF,MAAAl8D,CAGAA,CACEw9C,CAAyB,KAC1B,CAAA0sB,EAAAC,CAAA,EAAArrE,EAAA,EAAA,EACHsrE,EAAAvsE,EAAA,EACA,CAAAwsE,EAAOC,CAAA,EAAAxrE,EAAA,IAAA,EACLyrE,EAAGl7C,CAAAA,CAAAA,EACHrvB,EAAAA,EAAAA,EACFwqE,EAAAp4C,GAAArJ,GAAA,+BAAA,EACFjrB,EAAA,IAAA,CAIMusE,GAACH,EAA4BC,SAEnCM,yBAAoC5sE,CAC9B,SAACwsE,SACDE,MAAAA,UACAE,eACN,CAAA,CAIE,EAAA,CAAAJ,CAAIA,CAAAA,EACFI,MAAAA,IAAuBjqC,EAAe,eACpCxX,EAAUsK,EAAA,EACVrK,GAAO,CAAAmhD,EAAA,WAAAD,EACC,EAAA,EACVC,EAAC,QAAAR,GAAAzqE,EAAA,CACH,IAAAkrE,CAAA,CACEA,GAGJK,YACE,MAAIp3C,EAAAA,MAAc82C,EAA4BrsE,QAAS,KAAA,EACrDosE,GAAAA,CACAC,MAAAA,CAA2D,EACzDpyD,EAAKqyD,OACNrqE,GAAA,SACHA,EAAAo8C,GAAAp8C,EAAA,QAAA,EACA0qE,EAAAA,QAAgB3sE,GAAUssE,CAC1B7sB,GAAMnuB,EAAUjwB,CAAMgrE,CACtB,CAAA,GAAgB/6C,EAAAA,UAAAA,GAChB86C,EAAmB,EAAA,EAEjBnqE,CACEw9C,GAAAA,EACF,MAAAx9C,CAAC,CAEH,CACEmqE,eAAAA,GAAAA,CACF,GAAA,CACA,MAAO96C,EAAA,MAAAlwB,EAAA,GAAA,OAAA,SAAA,KAAA,CACL,MAAGkwB,CAEL,CACF,EAAA,OAAA,EAAA,KAAA,EAEA,GAAA,CACM,MAAArvB,CACF,EAAAqvB,EAEW,OADHrvB,EACJJ,GAAOI,EAAA,QAAA,EAAAA,GAAA,QAAAA,EAAA,CAAA,EAAA,KAAAk8D,EAAA,SAAAA,EAAA,QAAAl8D,EAAA,CAAA,EAAA,GAIRD,IAEGC,EAAAA,MAAUqvB,CAChBrvB,MAAAA,EACA,CACEk8D,CACA,MAAA3P,EAAO3yC,GAAA,IACTtU,EAAAC,EAAA,CACA,SAAO,CAAA,CAAA,CAAAs3D,EAAA,QAAAv3D,EAAA,MAAA,OACA3I,wBACP,SAAO,CAAA8I,EAAAS,EAAA,CACT,KAAA,QACF,MAAA,gBAEMqmD,KAAAA,GACJ,CAAA,IACEhnD,IAAAA,CAAAA,EAAA+H,IAAA,OAESvH,KAAAA,EAA6BP,QAAAA,CAC3B,EAACW,EAAaJ,GAAMsxC,EAAA,OAAA,CAAAxwB,EAAAswC,KAAAtwC,GAAA,CAAAswC,GAAA,KAAA,CAAA,EAAgB/wD,OAAKd,EAAA+T,GAAA,CAC7CwjD,GAAAA,IAAAA,OAAmBvvD,CAAM,GACxB,SAAM,CAAAhI,EAAA,OAAA,CAAEmV,IAAAA,OAAM48B,SAAAA,CAAAA,EAAAA,OAAAA,CAAY9J,MAAAA,qBACpB5b,SAAQ0lB,GACd,CAAA,IACO,CAAC7vC,EAAI/B,EAAIrG,OAAQ,CAAaoG,MAAAA,eAC3B4gB,SAAIwQ,GAAAjF,EAAA,CAAA,CAAA,CAAMnsB,CACd,EAAAiV,CAAM1U,CAAM,CAAA,CAAA,CAAqB,CAAA,EAAA,CAAA,CAAA0rD,EAChCh3C,QAAInV,EAAA,MAAA,CAAA,MACD,YACN,SAAMS,CAAAA,EAAM,SAAA,CAAA,SAAcP,QAAsB,SAAQC,EAAAgC,EAAA,CALjBgT,GAMnC,QAAA,CAER,CAAA,CAGJ,CACA,CAAK1U,EAAAA,EAAM,IAAA8rD,GAAA,CAAWrsD,KAAAA,CACpBA,QAAAA,EACEA,WAAAA,EACE,UAAAmlE,EAAA,SAAAnpC,GACE,YAAAwB,EAELyuB,OAAAA,GACC,MAAAr4B,EACE64B,iBAAAA,GACA2Y,SAAAA,GACAD,aAAAA,GACAnpC,YAAAA,EACAwB,YAAAA,GACA5yB,MAAAA,GACAgpB,IAAAA,GACA28B,MAAAA,EAAAA,EACA9U,EACA4pB,GAAAA,IAAAA,CAAAA,GAAAA,SAAAA,GAAAA,EAAAA,CAAAA,EAAAA,QAAAA,KACAC,GAAAA,GAAAA,OAAAA,GACA9U,GAAAA,CAAAA,EAAAA,GAAAA,IACAltD,GAAAA,GAAAA,EAAAA,EAAAA,IACAkP,GAAAA,GACA7H,GAAAA,CACF,MAAI0hD,GAAAA,GAAAA,EAAAA,EACEuE,GAAoBp3B,KACtBizB,EAEJnvB,GAAMioC,OAAqB7qE,GAAS,CAAA,EAAA+1D,GAAA,CAAA,CAAA,CAAA,CACpC,CACA,OAAM/wB,EAAAA,OACN,SAAIpC,CAAAA,EAAAA,IAAAA,CACAtB,IAAAA,IAAUxpB,GAAAyyD,EAAA,KACZ,KAAMhpC,GACN,OAAMw0B,SACNnzB,IAAAA,WAKF,MAAA,cAAAynC,EAAAF,IAAAryD,GAAA,SAAA,WAAA,EAAA,GAEA,SACE,CAAAxS,iBACE,OAAAs9B,GAAA,KAAA,GAAA,CAAA,IACEp9B,uBAAqBsS,QAAMyyD,GAAiB,KAAA,GAAA,CAAA,QAAA,EAC5C/xD,CAAAA,EACA5R,SAAOxB,EAAA,UAAA,CACPib,SAAI,CAAA9a,EAAA,SAAA,UACGA,EAAA,MACL8kE,KAOAznC,EAEM,IAAAizB,GACA,MAAA5lD,GAID,OAAAC,GACN5K,cAED,CAAAA,CACE,CAAA,EAAAA,EAAAA,MACE,CAAA,MACO4zB,eAAAA,SACA28B,CAAAA,EAAAA,SAAAA,CACL5lD,SAAAA,CAAAA,EAAAA,MAAAA,CACAC,MAAAA,eACA+f,SAAQ,CAAA1qB,EAAA,OAAA,CACT,MAAA,SAEHH,SAAA4/B,EAAA,CAAKn/B,EAAM,IAAA,CAAA,CAAAiwD,IAAAvwD,EAAAF,EAAA,CAAcC,SACvBF,IAAA,CAAAE,EAAAA,CAAAA,CAAAA,IACEC,EAAAF,EAAA,CAAKQ,SAAMN,EAAAgD,GAAA,CAAcjD,SACvBC,GAAMM,OAAM,OAAA,CAAQP,CAAE0/B,CAAa,CAAA,CACjB,CAAA,EAAA1/B,CAAAA,CAAAA,IAAEC,EAAA,KAAA,CAAS,MAC1BuwD,QACD,KAAAxwD,GACe,IACXkD,OAAUstD,MACVrtD,GAAO,SACRqiE,EAAA,CAAA,CAAC,CAEL,CAAA,EACE,CAAA,CACJhoC,KACC,IAAA,CAAA,MACEj9B,eAAMklE,IAAA,CAAAF,GAAA,GAAA,YAAA,GAAA,KACNjxD,GAAMmnC,IACN76B,OAAI,MACJtd,EAAOA,SAAMtD,CAEZsD,CAAAA,EAEJmiE,IAAA3lE,EAAAC,EAAA,CACK,SACLy9B,CAAAA,EAAAA,OACD,EAAAv9B,EAAA,IAAA,OACS,SAGPqU,SAAMmnC,EAAAA,QAAAA,CACN76B,SAAI3gB,EAAAgC,EAAA,CACJqB,GAAOk6B,SAAYx9B,OAElBw9B,CAGJioC,EAAAA,GACC3lE,EAAAC,GAAA,CAAA,QACE6wD,GACS,WAAA,EAAA,CAAQ5wD,IACfC,EAAA,IAAA,CAAAD,OACE,OAAA,SAAAzF,IAAA,WAAAsJ,SAGI5D,CAAS,CAAA,EAACmS,CAASw+C,CAAkB,CAAA,CAErC,CAAA,CACQuU,CAAAA,CAAAA,CACC,CAAA,CAAA,CACH,CAAA,CAAA,CAEHC,CAAAA,CAGHA,CAAAA,EAAAA,GACDtlE,EAAA,SAAA,CAAA,KAAA,SACI,MAAA,qBACF,QACL,IAAA,CAAAglE,EAEPtyD,EAAA,CAAA,EACG,SACCA,KAAAqyD,EACR,SACFG,CAAAA,EAAAA,EAAAA,CAEG7kE,KAAK,UAAA,CACLI,EAAAA,IAAMN,EAAA,OAAA,UACGG,EAAM6B,EAAA,CACb6iE,GAAAA,QAAkB,CACpB,CAAA,SACUtyD,EAAQqyD,CAAY7kE,KAAAA,cAEzB,CAAA,CAACW,CAAK,CAAA,CAAU,CACrB,EAAA6R,EAAAxS,CACE,CAAA,CAAA,CAAA,CAAA,EAAAglE,GAAsB,CAAA,CAAA/Y,EAAA,QAAAhsD,EAAA,MAAA,CAAA,MAClB,yBACD8kE,EAAA,UAAA,EAAA,GAAA,SAACpkE,EAAKb,EAAAC,EAAA,CAAA,SAAiB,CAAAE,EAAA,MAAA,CAAA,MAE/B,CAlHOuS,MAmHL,GAEP,WAAA,EAGLwyD,UAAAA,QACC,EACoEhlE,SAEjE+kE,EACChlE,EAAA8jB,GAAA,CAAA7jB,OACEC,EAAA,CAAK0B,EAAAA,EAAO,SAAA,CAAEgJ,KAAAA,SAAW+6D,MAAAA,QAAeC,QAAAA,IAAW,CAASb,EAAA,IAAA,CAAE9kE,EAElD+hB,SAAM9hB,EAAAS,EAAA,CAAE,KAEhB,IACEP,IAAK/D,GAGH0oE,GAAAA,QAAmB,CACrB,CAEK,CAAA,CAAM,CAAA,CAAO1oE,CAAAA,EAAAA,EAAAA,IAAAA,CAAAA,SAAE6D,EAAAgC,EAAA,CAAA,GAAA,SAAA,OAAgC,CAAC,EAAA4iE,EAAA,QAAA,wBAAA,EAAA,EAAA,QAAA,MAAA,EAAA,CAAA,EAC/C,WAAA,CAGZ5kE,EAAAA,EAAA,OAAA,CAAAD,iBACE,CAAA1F,CAAA,CAAA,CAAA,CAKwB,CAAA,CAAA,CAAC,CAAA,EAAA2F,EAAA2D,IAAAA,CAAA,MAAAC,gBAHvB,SAAMtD,EAAM0B,EAAA,CAAA,GAAW,QAIjB,CAAA,CAAC,CAAA,CACF,CAAA,CAAA,CACL,CAAA,EAGN,CAAAo1D,EAAG92D,EAAMskE,EAAAH,CAAA,CAAA,EAAA,OAAAzkE,EAAeD,IACtB,MAAAsD,EAAA,eAA4BxD,EAAA,KAAA,CAAA,MAC3B,sBACJ,SAEJ,CAAAG,EAAA,IAAA,CACD,SAAAA,EAAAgC,EAAA,CAEFo1D,GAAAA,QAEJ,CACEp3D,CAAS,CAEPqD,EAAAA,EAAAA,MAAAA,CACAw6C,SAAAA,CACE,CAAIv9C,CAAAA,CAAM,CAAA,EACR,GAAAP,WACE,SAAApG,EAAA,UAAsBwC,EAExB,CAAqB,GAAA,QAAA,CACnB,EAGNxC,UAAAA,EACSwC,CAAE,GAAA,QAAA,CAAA,EAAqB,WAAA2oE,EAAAa,EAAAnB,EAChCzmB,gBAAS5hD,EAAAA,OAAAA,EAAAA,wBAAAA,EAAAA,GAAAA,IAAAA,UAAE,GAAA,YAAA6D,EAAAF,EAAA,EAAA,EAAA,eAAsB7C,EAAA,SAAA,eAAC,cAAA,SAClCghD,gBACAniD,QAAAA,EACAoiD,iBAAAA,GACAF,KAAAA,EAAS,gBAAA,OACTG,UAAAA,EAAan+C,GAAAF,CACbyb,OAAAA,GAEAwgC,SAAAA,OACAsC,WAAAA,QACAC,SAASsmB,SACTlmB,WAAAA,EAAgB,SAAA,CAChBH,cACAH,MACEv+C,QACEuB,SAAMpB,EAAAS,EAAA,CAENkqB,KAAS,OACTorB,KAAAA,IACAtrB,IAAAA,EAEUvqB,CAAcI,GAAM,QAAA,CACrB,CAAM,CAAA,CAAY,CAAA,EAAOnE,SAAAA,CAAAA,EAAAA,GAAAA,CAAAA,QAAE,IAAA,CAAA,IAAA9B,EAAA,OAAA8B,EAAO,CAAG,GAAA,QAAA,CACpC,CACT4D,WAGUI,KAAM04D,CAAA,EAAA,IACK4J,MAAMtmE,EACtB,CAAA9B,GAAA,QAAA,CAA6C,CAC/C,EACA,MACE,CAAsB8B,IAAAA,EAAC08D,EAAA,YAAA,EAAA,KAAA,EAAA,SAAA,KAAA,IAAAA,CAAA,YAAkB,EACzC,SAAA,CAAA74D,EAAAS,EAAA,CACF,KAAA,KACA,CAAA,EAAA,IAAIo4D,EAAAA,OAAa,CACfA,SAAAA,EAAAA,EAAcA,CAEdxpD,GAAAA,QAA+B,CACjC,CAAA,CACF,CAAA,CAAA,CAAA,EAAEtP,IAEGpG,GAAAkG,EAAAiD,GAAA,CAAA,QAAM,IAAA,CAAO,SAClB9C,KAAA,IAAA+nB,CAAA,WAAA,EACE,SAAA,CAAA/nB,EAAAS,EAAA,CAAA,KAAqC,KAAA,CACjC,EAAC,IAAAT,EAAA,QAAA,CAER+nB,MAAAA,6BAEY5nB,EAAM6B,EAAA,CACbqN,GAAAA,SACF,OAAA,CAAEtP,gBAAAA,CAEG,EAAe,WACpB,CAAOO,EAAMN,EAAA,IAAA,CAAA,CAAA,CAAA,CACX,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA+nB,CAAAA,CACwC,EAAApuB,CAAAgK,CAAA,CCzexD,MAAMg6C,GAAwB,CAC5Bn6B,MAAO,UACPmyB,OAAQ,UACRpyB,SAAU,QACZ,EAEA,SAASqiD,IAAU,CACjB,KAAM,CAAE3sE,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAM,EAAG,GAAG,EACrB,MAAM4C,EAAaC,GAAYrD,CAAM,EAC/B,CAAEksC,UAAAA,CAAAA,EAAc9oC,EAEtBvE,QAAgCqtC,GAAS,CAEzC,GAAMpiC,CAAAA,EAAAA,OAAaoiC,KACjB,MACA,KAAA7lC,EAAQA,GAAAA,CAAAA,EAAMymC,EAAcA,EAAAA,CAC5B,UAAMk/B,GACJr9C,cAAW6tC,GACXp8D,KAAAA,GACAC,OAAM4+D,GACNj0B,UAAQu9B,GACRt9B,WAAW0jB,GACXzjB,QAAAA,GACAC,SAAS8gC,GACT5gC,SAAU42B,GACV72B,OAAAA,EAAUm/B,EACVt6C,CAAAA,EAIF,MAHE5pB,CAAAA,GACEA,cAAmB,CAAA5J,EAAA,OAEnB4J,IAAS,QAAA,CAAA5J,EAAaA,GAAc,KAEpC4J,EAAAA,EAAmB,CACvB,GAAA5J,EACY,WAAyCA,EAAAA,EAAQqH,EAAAA,KAAU,UAAArH,CAAA,CAAA,CAAA,CAAA,EAEzE8F,OAAAA,GAAC,CAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,GAAA,EAAAlF,GAAA,CAEDkF,GAAAA,CAGI,MAAIkkB,EAAA,SAAAppB,EAAA,IAAA,EAAA,EAAA,EACIopB,EAAQ1F,SAAW7c,iBAAW,cAAA,EAAAuiB,CAAA,EACpCylD,IACAA,EAAIA,MAAS,EACXA,EAAQhnD,eAAM4+B,EAAA,EAC8B,MAC9C,CAAA,CAAA,GAEAjlD,OAAAA,GACF,gBAAAxB,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CACF,EACAkF,GACU,CAAA,IAAA,GAAA,EAAA,CAAAlF,EAAA0oD,IAAA,CACR9gD,MAAAA,EAAAA,OAAwB5H,CAAE8H,EAE9BgnE,EAAA,SAAA,cAAA,QAAA,cAAA,EAEA5pE,EACGi/B,GAAK,EAEEt9B,EAAM6hD,EAAa,IAAC,IACpBomB,EAAAA,EAAAA,IACJ5vE,IAEF,IAAA2vE,EACAhoE,IAAMkoE,EACNF,EAAMG,EAAyBF,EAAA,uBAAA,SAAA,iBAAA,cAAA,EAAA,CAAA,EAC3BD,IAAAA,IAEJA,EAAYE,EAAYD,EAAA,mBAAA,SAAA,iBAAA,cAAA,EAAA,CAAA,GAKxBD,IAEEA,EAAAA,QAGFA,EAAA,eAAApoB,EAAA,EAEEooB,EAAAA,CACAA,OAAAA,GACF,gBAAA7uE,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QAAA,CACF,EAEE2H,EAAQ,MAAA,CACRC,GAAAA,UAEJ,cAAA5H,GAAA,UAGE,QAAA,gBAAA,GAAA,CAAAA,EAAA,OAAA,QAAA,GAAA,GAAA,CAAAA,EAAA,OAAA,QAAA,QAAA,IACKA,EAAA,eAAA,0BACmB,GAOlBA,EACA2C,QAAAA,IAAO8wC,CACT,MAAAq7B,EAAA,SAAA,cAAA,QAAA,cAAA,EACFA,YACSlyB,iBAAM,cAAA,EAAA,QAAA70B,GAAA,CAEbA,EAAM+mD,UAAAA,OAAAA,QACJ5vE,IAAS2pD,CAAsB,CACjC,CAAA,CAII9gC,EAAgE,SACjEtb,CAAA,CAAA,CACH,CC5GR,SAASwiE,IAAO,CACd,KAAM,CAAEr0D,EAAAA,CAAAA,EAAG5Y,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EACrCklD,mBAAY70C,IAAI,cAAc,EAC9B7R,EAAU,IAAM,EACb,SAAY,CACX,MAAM+L,EAAO,MAAMouB,GAAGF,OAAOluB,KAAAA,EAC7B,GAAIA,EAAK3J,OAAQ,CACf,MAAMg4B,EAAKC,GAAAA,EACKtuB,EAAKwuB,UAAgB70B,EAAIm0B,WAAWO,CAAE,CAAC,EAC3Ch4B,SACVZ,EAAOqiB,WAAa,GAExB,CACF,GAAA,CACF,EAAG,CAAA,CAAE,EAGHlc,EAAAF,EAAA,CAAAC,UACI9C,EAAWW,SAASC,oBAAsB,gBACzC,CAACZ,EAAWW,SAASC,mBACpBZ,EAAWW,SAASw3C,uBACtBn4C,EAAW8oC,WAAWtrC,OACtBuF,EAAC4lE,GAAO,CAAA,CAAE,EAEV5lE,EAACq2D,GAAS,CACRhzD,MAAOyO,EAAE,CAAAzX,GAAA,QAAA,CAAQ,EACjBorC,KAAK,IACLprC,GAAG,OACH8jD,YAAa,GACbC,UAAWp+C,EAAComE,GAAiB,CAAA,CAAE,CAAA,CAChC,CAAA,CAEH,CAEN,CAEA,SAASA,IAAoB,CAC3B,KAAM,CAAEntE,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EAC/BwsE,EAAsBjuE,EAAAA,EACtB,CAACwkD,EAAWC,CAAY,EAAIxjD,EAASoF,MAAS,EACpD,OACEoB,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAAC4T,GAAI,CACH3T,IAAKomE,EACLtkE,GAAG,iBACHzB,MAAO,qCACLrD,EAAWvC,qBAAuB,YAAc,EAAE,IAChDkiD,GAAa,EAAE,GACnBz8C,QAAUjJ,GAAM,CACdA,EAAE83B,gBAAAA,EACE74B,OAAOqb,WAAW,yBAAyB,EAAEC,UAC/Cva,EAAEmJ,eAAAA,EACFw8C,EAAc/7C,GAAYA,EAAiBrC,OAAT,MAAmB,EAEzD,EAAEsB,SAEFC,EAACS,EAAI,CAACC,KAAK,eAAeC,KAAK,IAAIC,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAe,CAAC,CAAG,CAAA,CACvD,EACN2F,EAACsmE,GAAiB,CAChBxlE,MAAO87C,EACP77C,UAAWslE,EACXrlE,QAASA,IAAM67C,EAAap+C,MAAS,CAAA,CACtC,CAAC,CAAA,CACF,CAEN,CAEA,MAAM8nE,GAA8B,EACpC,SAASD,GAAkB,CAAEvlE,UAAAA,EAAWD,MAAAA,EAAOE,QAAAA,CAAQ,EAAG,CACxD,KAAM,CAAEtH,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAAA,EACtB8B,EAAaC,GAAYrD,CAAM,EAC/B,CAACinB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAE1CU,EAAwB8iE,GAAAA,EAE9B,eAAeqC,GAAqB,CAClC,MAAMnB,EAAmB,MAAMhkE,EAAsBS,KAAAA,EAC/CP,EAAgBmgE,GAAsB2D,EAAiBxjE,KAAK,EAElE,GAAIN,GAAeQ,OAAQ,CACzBR,EAAcmN,QAAS9L,GAAiB,CACtCy8C,GAAWz8C,EAAakT,OAAQ7U,EAAU,CACxC8B,cAAe,EAAA,CAChB,CACH,CAAC,EAED,MAAMuiE,EAAuBlB,GAAwB7iE,CAAa,EAElEJ,EAAOC,kBAAoBkkE,EAAqB,CAAC,EACjDnkE,EAAOI,cAAgB+jE,EAGvBtkE,EAAMM,GAAGY,QACNkb,OAAO,CACN7b,cAAe,CACbU,WAAYqjE,EAAqB,CAAC,EAAE3jE,EAAAA,CACtC,CACD,EACAikB,MAAM,IAAM,CAAC,CAAC,CACnB,CAEAzkB,OAAAA,EAAOa,qBAAuB,GAC9Bb,EAAOokE,2BAA6Bv7D,KAAK1G,IAAAA,EAClC+hE,CACT,CAEA,KAAM,CAACyI,EAAmBC,CAAoB,EAAIptE,EAAS,EAAK,EAChE,SAAS6kE,GAAsB,CAC7B,OAAOxkE,EAAMM,GAAGmxC,eAAejxC,KAAK,CAClCC,MAAO,CAAA,CACR,CACH,CAEA,SAAS6kE,EAAkB,CAAE0H,mBAAAA,EAAqB,EAAA,EAAU,GAAI,CAC9DrpD,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CAEF,GADA,MAAM6hD,EAAAA,EACF,CAACwH,EAAoB,CACvB,MAAMv7B,EAAiB,MAAM+yB,EAAAA,EAC7BuI,EAAqB,CAAC,CAACt7B,GAAgB1wC,MAAM,CAC/C,CACA4iB,EAAW,SAAS,CACtB,MAAY,CACVA,EAAW,OAAO,CACpB,CACF,GAAA,CACF,CAEA,MAAM3f,EAAUtF,EAAAA,EACVuuE,EAAe,GACrBtuE,OAAAA,EAAU,IAAM,CACVyI,IAAU,SACV7D,EAAWvC,qBACOgD,EAAQpF,SACXs9C,WAAa+wB,GAC5B3H,EAAkB,CAChB0H,mBAAoB,EAAA,CACrB,EAGH1H,EAAAA,EAEJ,EAAG,CAACl+D,EAAO7D,EAAWvC,oBAAoB,CAAC,EAGzCmF,EAACgB,GAAc,CACbZ,IAAKvC,EACL+/B,cAAc,qBACd38B,MAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAI,OAAQ,CACNC,OAAQjL,SAASkL,IAAAA,EAEnBG,eAAgB,CACdtB,QAASA,IAAM,CACbzC,EAAQpF,SAASsJ,YAAAA,CACnB,CAAA,EAEF+oB,SAAS,OACTorB,WAAW,QACXtrB,SAAS,SACTtoB,MAAM,SACNZ,mBAAmB,UAASxB,UAE5BC,EAAA,SAAA,CAAAD,SACEC,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA2B,CAAA,CACzB,CAAA,CACE,EACR2F,EAACi8C,GAAcqF,SAAQ,CAAC/mD,MAAM,gBAAewF,SAC3CC,EAAA,OAAA,CAAAD,SACG9C,EAAWhD,cAAcQ,OACxBuF,EAAAF,EAAA,CAAAC,SACG9C,EAAWhD,cACTuS,MAAM,EAAG+5D,EAA2B,EACpC/jE,IAAKlH,GACJ0E,EAACye,GAAY,CAEX9kB,SAAAA,EACA2B,aAAAA,EACAyyC,mBAAkB,EAAA,EAHbzyC,EAAa4yC,MAAQ5yC,EAAajB,EAIxC,CACF,CAAA,CACH,EACAymB,IAAY,UACd9gB,EAAA,MAAA,CAAKM,MAAM,WAAUP,SACnBC,EAAC4jB,GAAM,CAAC9B,OAAM,EAAA,CAAE,CAAA,CACb,EAELhB,IAAY,SACVjhB,EAAA,MAAA,CAAKS,MAAM,WAAUP,UACnBC,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA4C,CAAA,CAC3C,EACH2F,EAAA,IAAA,CAAAD,SACEC,EAAA,SAAA,CAAQE,KAAK,SAASC,QAAS6+D,EAAkBj/D,SAC/CC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAuB,CAAA,CACjB,CAAA,CACP,CAAC,CAAA,CACD,CAAA,CAGL,CAAA,CACgB,EACxBwF,EAAA,SAAA,CAAAE,SAAA,CACEF,EAAC+T,GAAI,CAAC7R,GAAG,YAAYzB,MAAM,eAAcP,SAAA,CACvCC,EAACS,EAAI,CAACC,KAAK,IAAA,CAAM,EAAE,IACnBV,EAAA,OAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAsB,CAAA,CAClB,CAAC,CAAA,CACH,EACNwF,EAAC+T,GAAI,CAAC7R,GAAG,iBAAiBzB,MAAM,gBAAeP,SAAA,CAC5CymE,EACCxmE,EAAAgC,EAAA,CAAA3H,GAAA,SAAAsJ,WAAA,CAAAC,EACE5D,EAAA,OAAA,CAAMM,MAAM,eAAA,CAAyB,EAACuD,EACtC7D,EAAA,OAAA,CAAA,CAA2B,CAAA,CAAC,CACvB,EAEPA,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAA,CACpB,EACF,IACH2F,EAACS,EAAI,CAACC,KAAK,aAAA,CAAe,CAAC,CAAA,CACvB,CAAC,CAAA,CACD,CAAC,CAAA,CACK,CAEpB,CAEA,MAAAkmE,GAAe7tE,GAAKotE,EAAI,ECjQlBU,GAAoB,CACxB,6CACA,qBACA,uCACA,8BACA,iCACA,yBAA2B,EAGtB,SAASC,GAAwBv0D,EAAK,CAE3C,MAAMw0D,EAAS30C,IAAI5zB,MAAM+T,CAAG,EAC5B,GAAI,CAACw0D,EAAQ,MAAO,CAAA,EACpB,KAAM,CAAEz3D,SAAAA,EAAUG,SAAAA,CAAS,EAAIs3D,EAE/B,UAAWC,KAASH,GAAmB,CACrC,KAAM,CAAA,CAAGxsE,CAAE,EAAIoV,EAASi5B,MAAMs+B,CAAK,GAAK,CAAA,EACxCtuE,GAAAA,EACA,MAAQ,CACN,SAAO4W,EACL3V,GAAAA,CACAU,CAEJ,CACF,MAAA,CAAA,CACA,CACF,SAAA4sE,GAAA10D,EAAA,CAEA,KAAA,CACE,SAAA5Y,EAAQA,GAAAA,CAAUU,EAAAA,GAAAA,CAAAA,EAAG,OAAIysE,GAAAA,EACrBntE,IAAQA,CAAQ,MAAAU,CAAA,GAEpB,IACA,CCzBF,SAAwB6sE,IAAY,CAElC,MAAM30D,EADWkN,GAAAA,EACIhQ,SAASzB,QAAQ,MAAO,EAAE,EACzCm5D,EAAeL,GAAwBv0D,CAAG,EAE1C60D,EAAYD,GAAcxtE,SAC5B,IAAIwtE,EAAaxtE,QAAQ,MAAMwtE,EAAa9sE,EAAE,GAC9C,KACE,CAACymB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAEhDyhC,OAAAA,GAAgB,IAAM,CACpBzd,EAAW,SAAS,GACnB,SAAY,CAEX,GAAI,CACF,KAAM,CAAE1jB,SAAAA,EAAUU,GAAAA,CAAAA,EAAO8sE,EACzB,GAAI9sE,EAAI,CACN,KAAM,CAAEX,MAAAA,CAAAA,EAAUyB,GAAI,CAAExB,SAAAA,CAAAA,CAAU,EAElC,GADe,MAAMD,EAAMM,GAAG4C,SAASD,QAAQtC,CAAE,EAAEQ,MAAAA,EACvC,CACV1E,OAAOkZ,SAASpL,KAAOmjE,EAAY,aACnC,MACF,CACF,CACF,MAAY,CAAC,CAGb,CACE,KAAM,CAAE1tE,MAAOouB,EAAcnuB,SAAUouB,CAAAA,EAAoB5sB,GAAAA,EACrD62B,EAAS,MAAMlK,EAAa+B,GAAGC,OAAO5vB,KAAK,CAC/C6vB,EAAGxX,EACHpY,MAAO,EACP6vB,QAAS,EAAA,CACV,EACD,GAAIgI,EAAOp1B,SAASnC,OAAQ,CAC1B,MAAM+T,EAASwjB,EAAOp1B,SAAS,CAAC,EAChCzG,OAAOkZ,SAASpL,KAAO,IAAI8jB,CAAe,MAAMvZ,EAAOnU,EAAE,YAC3D,SAAW23B,EAAOt1B,SAASjC,OAAQ,CACjC,MAAM0X,EAAU6f,EAAOt1B,SAAS,CAAC,EACjCvG,OAAOkZ,SAASpL,KAAO,IAAI8jB,CAAe,MAAM5V,EAAQ9X,EAAE,EAC5D,MAAW+sE,EAETjxE,OAAOkZ,SAASpL,KAAOmjE,EAAY,aAEnC/pD,EAAW,OAAO,CAEtB,CACF,GAAA,CACF,EAAG,CAAC+pD,CAAS,CAAC,EAGZvnE,EAAA,MAAA,CAAKS,MAAM,WAAW4R,SAAS,KAAInS,UAChC+gB,IAAY,UACXjhB,EAAAC,EAAA,CAAAC,SAAA,CACEC,EAAC4jB,GAAM,CAAC9B,OAAM,EAAA,CAAE,EAChB9hB,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAwB,CAAA,CACtB,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAA,IAAA,CAAGiT,KAAMV,EAAKlR,OAAO,SAASyZ,IAAI,WAAU/a,SACzCwS,CAAAA,CACA,CAAA,CACF,CAAC,CAAA,CACJ,EAEF1S,EAAAC,EAAA,CAAAC,UACEC,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmC,CAAA,CACjC,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAA,IAAA,CAAGiT,KAAMV,EAAKlR,OAAO,SAASyZ,IAAI,WAAU/a,SACzCwS,CAAAA,CACA,CAAA,CACF,CAAC,CAAA,CACJ,EAEJvS,EAAA,KAAA,CAAA,CAAK,EACLA,EAAA,IAAA,CAAAD,SACEC,EAAC4T,GAAI,CAAC7R,GAAG,IAAGhC,SACVC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAA,CACjB,CAAA,CACL,CAAC,CAAA,CACD,CAET,CChFA,SAASgtE,IAAQ,CACf,KAAM,CAAEpuE,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAO,EAAG,IAAI,EACvB,KAAM,CAACymB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAE1C,CAAC2sB,EAAajU,CAAM,EAAIC,GAAY6C,GAAMA,EAAI,EAAG,CAAC,EAClD,CAACsP,EAAO0B,CAAQ,EAAIxsB,EAAS,CAAA,CAAE,EACrChB,EAAU,IAAM,CACdglB,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAM8G,EAAQ,MAAMD,GAAAA,EACpBxrB,GAAYyrB,EACZ0B,EAAS1B,SAAK,CACd9G,MAAAA,GACU,OAAA,CACV3kB,CACA2kB,GAAAA,CAAkB,EAAA,CACpB2I,CAAA,CAAA,EAAA,KACC,CAAAG,EAAAD,CAAA,EAAA7sB,EAAA,EAAA,EACD2sB,EAAY7B,EAAA,KAAAjqB,GAAAA,EAAA,SAAA,EAEhB,OAAOisB,EAAAA,MAAAA,CAEP,GAAMmhD,aAEN,uBACOjtE,SAAG,KAAaiG,SAAM,CAAAT,EAAA,MAAA,CAAiBqS,MAAAA,qBAAanS,SACvDF,CAAAA,EAAA,SAAA,CAAKS,SAAMT,EAAA,MAAA,CAAoBE,MAC7BC,cAAAD,YACE,MAAA,CAAKO,MAAM,cAAaP,SACtBF,CAAAA,EAAA28C,GAAA,CAAA,CAAA,EAAAx8C,EAAA4T,GAAA,CAAKtT,GAAAA,IAAmBP,MAAAA,eAEhBgC,SAAG/B,EAAAS,EAAA,CAAIH,KAAM,OAAcP,KAAAA,GAC1B,CAAA,CAAM,CAAA,CAAA,CAAY,CAAA,EAAGC,EAAE,KAAA,CAAC,SACxBA,EAAAgC,EAAA,CAEThC,GAAAA,QAAA,CAAAD,CACE,CAAA,EAAA1F,EAAA,MAAA,CAAA,MAAmB,cACjB,SACJ2F,EAAA,SAAA,CAAKM,KAAM,SAAaP,MAAAA,QAEpBG,QAAK,IAAAgmB,EAAA,EAAA,EACL5lB,SAAMN,EAAAS,EAAA,CACNN,KAAAA,OAA6CJ,KAAAA,IAEvCW,IAAAA,EAAqBE,CAAGzE,GAAAA,QAAAA,CAAE,CAAA,CAAA,CAAU,CAAA,CAAC,CAAA,CAAA,CAAG,CAAA,CACxC,CAAA,EAAC6D,EACL,OAAA,CAAA,SACHmkB,EAAA,OAAA,EAAAtkB,EAAAC,EAAA,CAEPE,SAAA,CAAAA,EAAA,KAAA,CAAAD,MACGokB,YACCpkB,SACEC,EAAA,IAAA9F,GAAA8F,EAAA,KAAA,CAAIM,SAAMT,EAAA+T,GAAA,CAAW7T,GAAAA,MAClBokB,EAAM3hB,EAAKtI,GACV6F,YACG6T,EAAI,CAAC7R,KAAI,MAAa,CAAGhC,EAAAA,IAAAA,EACxBC,OAAK,CAACU,SAAK,CAAAxG,EAAA,MAAAA,EAAA,WAAA2F,EAAAC,EAAA,CAAU,SACrBD,CAAA,IAAAG,EAAA+kB,GAAA,iBAGI,CAAAhlB,CAAAA,CAEqB,CAAA,CAAA,CAAc,CAAA,CAAA,CAAG,CAAA,CAEvC,CAAA,CAAA,CACI,CAAA,EAAAokB,EAcH,OAAA,GAAAtkB,EAAA,SAAA,CAAC,MAEV,WACC,SACGpF,CAAAA,GACLuF,EAAA,IAAA,CAAQM,SAAMT,EAAA,QAAA,CAAUE,MACrBunE,gBACCvnE,YACEglB,GAAA,CAAA,CAAA,EAAA,IAAA/kB,EAAAgC,EAAA,CAAO1B,GAAAA,QAAM,CAAeP,CAAAA,CAE1B,CAAA,CAAA,CAAA,EAAAC,EAEQ,IAAA,CAAA,SACHA,EAAA,QAAA,CAGXA,MAAA,gBAAAD,WACEiC,EAAA,CAAO1B,GAAAA,SAAqBP,OAC1BC,CAAA3F,EAAA8pB,EAAA,MAAA,CAAA,CAAA,CACe1pB,CAAAA,CAAM,CAAA,CAAA,CAGpB,CAAA,CAAA,CACI,CAAA,EACNqmB,IAAC,UAAA9gB,EAAA,IAAA,CAAA,MAEP,WACD,SACA8gB,EAAY8C,GAAA,CAAA,CAAA,CACd,CAAA,EAAGtjB,IAAM,QAAAN,EAAA,IAAA,CAAUD,MAAAA,WAEhB,SACD+gB,EAAY9e,EAAA,CACX1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,EAAA1F,EAAA,IAAA,CAAA,MAAmC,WAClC,SAEH2F,EAAAgC,EAAA,CAAG1B,GAAAA,QAAM,CAAUP,CACjB,CAAA,CAAA,CAAA,CAAA,CAA2B,CAAA,EAAComB,GAC3BnmB,EAAAkE,GAAA,CACJ,QACIhN,GAAA,CAERivB,EAAAA,SAAAA,EAAAA,iBAEmB,EAAA,CAEZD,EAA6B,SAC/BlmB,EAAAilB,GAAA,CACF,KAAAkB,GAAA,KAAEpmB,WAEDklB,CACOkB,EAAAA,QAAAA,aACI6L,EAENjgB,EAAO,EAAA,CAAA,CAETmU,CAAAA,CAA6B,CAAA,CAAA,CAC/B,CAAA,CACD,CC3JX,MAAAqhD,GAAe,+cC2BT,CAAEC,wBAAyBC,EAAiB,EAAIv4D,GAEtD,SAASw4D,IAAQ,CACf,KAAM,CAAEzuE,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAQ,EAAG,QAAQ,EAC5B,MAAMstE,EAAiBvvE,EAAAA,EACjBwvE,EAAoBn0D,GAAM8B,MAAM5B,IAAI,aAAa,EACjD,CAACmN,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAACw5C,CAAY,EAAIE,GAAAA,EACjBp5C,EAAWk5C,EAAal/B,IAAI,UAAU,EACtCk0D,EAASh1B,EAAal/B,IAAI,QAAQ,EAClC,CAACm0D,EAAcC,CAAe,EAAI1uE,EACtCM,GAAYiuE,GAAmB5pE,YAAAA,GAAiB,EAClD,EAEM,CAACgqE,EAAeC,CAAgB,EAAI5uE,EAAS,CAAA,CAAE,EAC/C6uE,EAAW9vE,EAAAA,EACjBC,EAAU,IAAM,EACb,SAAY,CACX,GAAI,CAEF,MAAM8U,EAAO,MADD,MAAMtS,MAAM0sE,EAAgB,GACjB94D,KAAAA,EACvBw5D,EAAiB96D,CAAI,EACrB+6D,EAAS5vE,QAAU,IAAI6vE,GAAKh7D,CAAI,CAClC,MAAY,CAAA,CAEVzU,GAAAA,CAAe,EAAA,CAAA,CACjB,EAAA,MACC0vE,EAAA/5D,GAAA,CACAA,IAQL,SAAM+5D,CACJ,GAAK/5D,CAKH,MAAI4Y,EAAA,MAHO,MAAA,MAAA,WAAA5Y,CAAA,wBAAA,GAGP,KAAA,EAKIg6D,EAJM,IAAMxtE,UAAM,EACLyT,gBAAS2Y,EAAA,UAAA,EAETqhD,qBAAU,MAAA,EAAA,CAAA,EACPC,aAAAA,UAAsB,EAEtCnc,EAAAA,IAAOic,MAAOG,CAAAA,EACdC,CACN,KAAAh9C,CACA,EAAAlZ,EAAQkZ,IAAAA,IAAKpd,EAAIkE,EAEf7Z,MAAQga,CAAAA,CACRrE,GAAAA,MAAAA,IAAAA,cAAcod,CAAAA,EAAAA,EAChB,SAAA,EACF,IAEE/yB,IAAAA,EAAegwE,GAAAr6D,CAAA,GACjB,CAAAs6D,GAAA,CAAAA,EAAA,WAAA,CAAAA,EAAA,iBAEAl1D,EAAgB,MAAepF,GAAW,CAE1CgP,YAAAA,CACA,CAAI,EACFurD,MAAqDv6D,GAMnDs6D,KAAAA,CAAkD,UAAAt4D,EAElD,cAAAS,CACA83D,EAAAA,EACFC,EAAA,MAAAz6D,GAAA,CAEA,YAAAC,CAAM,CAAA,EAAayC,EAAAA,GAAAA,CAAAA,EAAc,GAAI63D,EAErC,GAAME,KAAiBz6D,CAAeC,KAAAA,CAAAA,EAAAA,CAAAA,EAAAA,MAAAA,GAAAA,CAAa,YAAAA,EACnD3V,UAAAA,EAAcmwE,WAAAA,CAAAA,CAAU,EACxBp1D,GAAMnD,iCAAkCjC,CAAW,EAC/Cw6D,SAAAA,KAAUt2D,CACZ,MACE,MAAMpW,EAEJkU,CACAC,GAAAA,QAAAA,CAEFmD,CAAAA,OAGA2H,GAAKjf,EAAAA,SAAAA,KAAAA,MAAAA,GAAAA,CAAC,YAAAkS,EAAA,UAAAgC,EAAgC,WAAAC,CAAA,CAAC,EAE3C,MAAOnU,EAEHkT,CACEhB,GAAAA,QAAAA,CACAgC,CAAAA,EAIF+K,EAAKjf,SAAAA,CAAAA,MAAAA,CAAAA,EAAC,OAAA,CAAA,CAAA,GAAA,CAAgC,EAAC2sE,EACzChB,EAAAA,EAAA,QAAA,eAAA,EAAA,EAAA,QAAA,OAAA,EAAA,EAAA,QAAA,YAAA,EAAA,EAAA,KAAA,EAAA,KACFiB,EAAA,qCAAA,KAAAD,CAAA,GAAA,CAAA,YAAA,KAAAA,CAAA,EACAzrD,EAAoByrD,EAAAZ,EAAA,SAAA,OAAAY,EAAA,CAAA,QAEpBpwE,CAAAA,GAAAA,IAAAA,KAAe,IAAA,EAAA,CAAA,EACf2kB,EAAkB0rD,EAAAD,EAAAE,GAAA,OAAAA,EAAA,CAAA,EAAAlB,EAAAE,EAAA,KAAAiB,GAAAA,EAAA,SAAAnB,CAAA,CAAA,EAAA,KACpBriD,EAAAvuB,GAAA,CACFA,EAAA,eAAG,EACLkxE,EAAAc,CAAA,CAEA,EAOA,OAAArB,GAIAxvE,EAAM2wE,IAAAA,CAGE7uE,EAAOR,GAAAuvE,CAAA,GAEP1mE,CAAAA,CAAAA,EAWFijB,EAAAA,OAAYvuB,CAChBA,GAAEmJ,QAaF+nE,MAAAA,CACF,UAAA,QAEA,EACE/vE,SAAUwH,EAAM,OAAA,CACduoE,SAAAA,EACF,SAAK,CAAAvoE,EAAA,KAAA,CACP,SAAA,CAAAG,EAAA,MAAA,KAGE6T,GAAS,IAAA,GAAQnS,MAAO,KAAEgkE,OAAW,IAAA,CAAS,EAAA1lE,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAAgC,EAAA,CAAEjC,GAC9CF,QAAA,CAAM4lB,CAAAA,CAAAA,CAAmB1lB,EAAAA,UACvB,CAAAA,UACEC,EAAA,IAAA,CAAKwc,SAAK3I,EAAAA,EAAAA,CAAMjT,GAAI,QAAA,CAAG8J,CAAM,CAAA,EAAKC,EAAAA,QAAO,OACzCm9D,EACAztE,SAAA,GAAqB,KAAA,OAEvBwF,MAAA,QAAAE,GAAAA,cACEA,IAAAA,EACE,SAAA+gB,IAAA,UAAA,YAAsB,MACrB,eACH,MACEvmB,aAAOutE,MACPpnD,WAAQ,GACRxgB,YAAK/D,EAEL9B,CACA4F,GAAK0nE,QAAAA,CACiB,EAGtB9/B,QAAAA,GAAe,CACf+L,EAAa18C,EAAA,OAAA,KAAA,CACb6wC,EACA1C,IAAAA,MAAWlpC,CAAAA,EAAAA,GAAAA,OAAAA,EAAAA,EAAAA,KAAAA,CAAAA,GAAE,wBAAA,SAAA6sE,EAAA,IAAA,CAAAC,EAAAphE,IAAA7H,EAAA,KAAA,CAAiB,SAAAA,EAAA,SAAA,CAAC,KAAA,SAC/B6Z,MAAU3iB,SACR6wE,QAAAA,IAAgB7wE,CAClBkxE,EAAAa,CAAA,CACAtoD,EAEDqoD,SAAAA,CACC,CAAI3uE,CAAG,GAEH,CAAA,EAAA0F,EAAAA,OACE,GACEG,eAAK,SACLI,EAAM0B,EAAA,CAAA,WAEJomE,CAAAA,CAAuB,CAAA,CAAA,CACzB,CAAA,EAAAtnD,IAAE/gB,SAEDpG,EAAAA,IAAAA,CAAAA,MACK,QAAA,SAEXqG,EAAAgC,EAAA,CACC,GAEJhC,QAAA,CAAA,CAAQ,CAAA,EAAcD,EAAAA,OACpB,SAAA,CAAAC,EAAA,SAAA,CAAA,SAAgD8gB,IAAA,WAAA,CAAAgnD,GAAA,CAAAoB,EAEnD,SAAA/sE,EAAA+sE,EAQE5oE,CAAaP,GACdC,SAAA,OAAA,CAEO,qBAAAkpE,CAAA,CAGX,EAMyB/sE,CACjB,GAAA,QAAA,CANN,CAMM,CAAA,EAAA,GAAA,CAAA+sE,CAAAA,EAAAA,EAAsCtlD,GAAA,CAAA,OAAC9C,IAAA,SAAA,CAAA,EAAC9gB,EAAA7D,KAAAA,CAAAA,CAAAA,EAAAA,CAAAA,IAAAA,EAAAA,IAAAA,CAAAA,SAAAA,EAAAA,IAAAA,CAAAA,KACxC,mCAAA,OAAA,SAAA,SAAU6D,EAAAgC,EAAA,CAAC,GAAA,QAAA,EACJ,CACV,CACE,CAAA,QAAS8e,CAAwB,SACxC9gB,EAAK4T,GACH6zD,CACA1nE,GAAAA,IACKkT,SAAKjT,EAAAgC,EAAA,CAAmCX,GAAAA,QAAO,CAAQtB,CACxD,CAAA,CAAA,CAAA,EAAAC,EAAgD+T,GAAA,EAAA,CAAA,CAAA,CAAA,CAC/C,CAAA,CAGP,CC5PR,MAAM2X,GAAQ,GAEd,SAAwBy9C,IAAiB,CACvC,KAAM,CAAElwE,EAAAA,CAAAA,EAAGC,GAAAA,EACL+D,EAAaC,GAAYrD,CAAM,EACrCgtD,GAAQ1qD,EAAC,CAAA9B,GAAA,QAAA,CAAiB,EAAG,KAAK,EAClC,KAAM,CAAEX,MAAAA,CAAAA,EAAUyB,GAAAA,EACZ,CAACiuE,EAAgBC,CAAiB,EAAIhwE,EAAS,CAAA,CAAE,EACjD,CAACynB,EAASzD,CAAU,EAAIhkB,EAAS,SAAS,EAC1C,CAAC2sB,EAAajU,CAAM,EAAIC,GAAY6C,GAAMA,EAAI,EAAG,CAAC,EAClD,CAACy0D,EAAwBC,CAAyB,EAAIlwE,EAAS,EAAK,EAE1EhB,OAAAA,EAAU0Z,EAAQ,CAAC9U,EAAWitC,oBAAoB,CAAC,EAEnD7xC,EAAU,IAAM,CACdglB,EAAW,SAAS,GACnB,SAAY,CACX,GAAI,CACF,MAAMmsD,EAAgB9vE,EAAMM,GAAGyvE,kBAC5BvvE,KAAK,CAAEC,MAAOuxB,EAAAA,CAAO,EACrBpxB,OAAAA,EACGovE,EAAW,CAAA,EACjB,IAAIjqE,EACJ,GAEEA,GADe,MAAM+pE,EAAchvE,KAAAA,GACpBD,MACXkF,GAAOhF,QACTivE,EAAS7zD,KAAK,GAAGpW,CAAK,QAEjBA,GAAOhF,QAChB4uE,EAAkBK,CAAQ,CAC5B,MAAY,CACVhxE,SAAe,CACf2kB,QAAAA,CACFA,EAAC,SAAA,CACCA,CAAoB,GAAA,CACtB,EACF,CAAA2I,CAAG,CAAA,EACDA,EAAAA,MAAY,CAEhB,GAAA,uBACO3rB,MAAG,iBAAuBiG,SAAM,KAAiB4R,SAASrS,EAAA,MAAA,CAAIE,MAAAA,qBAC5DO,SAAM,CAAAN,EAAA,SAAA,CAAoBD,SAC7BC,EAAA,MAAA,CAAAD,MAAAA,cACOO,SAAM,CAAAT,EAAA,MAAA,CAAaE,MAAAA,cACjBO,SAAM,CAAAN,EAAAw8C,GAAA,CAAA,CAAA,EAAAx8C,EAAA4T,GAAA,CAAa7T,GAAAA,IAEhBgC,MAAG,eAAIzB,SAAMN,EAAAS,EAAA,CAAcV,KAAAA,OACzBW,KAAK,IAAOC,IAAAA,EAAYxE,CAAE,GAAA,QAAA,CAAA,CAAM,CAAA,CAAC,CAAA,CAAC,CAAE,CAAA,EACrC6D,EAAA,KAAA,CACJ,SACLA,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,EAA6BC,EAAA,MAAA,CAC3B,MACJ,cAAKM,SAAMN,EAAA+S,GAAA,CAAahT,OACtBC,GACEoB,gBAAM,GACNi3D,SAAAA,OACA1tC,WAAS,QACTorB,SAAAA,SACAtrB,WAASzqB,EAAA,SAAA,CACTgT,KAAAA,SACU9S,MAAK,QAASI,SAAMN,EAAAS,EAAA,CAAOV,KAAAA,OAC3BW,KAAK,IAAOC,IAAAA,EAAYxE,CAAE,GAAA,QAAA,CAAA,CAAM,CAAA,CAAC,CAAA,EAAI,SACrC0D,EAAAiD,GAAA,CACT/C,YAEA+C,IAEGiP,EACF,SAAA,CAAA/R,EAAAS,EAAA,CAAEV,KAAAA,UAEIW,KAAK,GAAA,CAAA,EAAUC,EAAK,OAAA,CAAK,SAC/BX,EAAAgC,EAAA,CAAAjC,GAAAA,QACE,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAA,CAChB,CAAA,CACC,CAAA,CAAC,CACN,CAAA,CACH,CAAA,EACHF,EAAA,OAAA,CACC,SACR,CAAAupE,EAAA,OAGkEppE,EAAA,KAAA,CAC3D,MAEHA,aAAIM,SAAM8oE,EAAA,IAAAzpE,GAAA,CAAYI,KAAAA,CAElB,GAAA1F,EAAQA,OAAAA,EAAI/D,YAAAA,EAAQ0zC,iBAAAA,CAAAA,EAAaznB,EAAqB5iB,CACtD,YAAAu3C,EACEA,SAAAA,EACAsE,KAAAA,EACAl0C,UAAAA,EACAomC,YAAAA,EACAra,KAAAA,EACApM,WAAAA,EACAs0B,eAAAA,EACAouB,oBAAAA,CAAAA,EACAC,EACEtzE,EAAAA,CACW,GAAA+D,EAEbA,YAAAA,EACA68C,SAAAA,EACAsE,iBAAAA,EACAj5B,KAAAA,EAAAA,MAGM,UAAGjb,IAAAA,KAAAA,KAAAA,IAAAA,EAAAA,EAAAA,UAAAA,GAAAA,EACH8sD,QAAAA,UAAoB1xD,SACpBoC,MAASwC,EACPjE,WAAOwmE,CAAAA,EACPC,CAAY,EACZ,OACJ,UAAAp8B,EAEJA,YAAAA,EACAra,KAAAA,EACApM,WAAAA,EACAs0B,QAAAA,MAAAA,CAAAA,OACmB,eAAAouB,EAEnBA,oBAAAA,CAAAA,EAEF,OAAA3pE,EAAA,KAAA,CAEA,SACEA,EAAA+pE,GAAA,CAAAhqE,OAAAA,EAEIyO,YAAAA,EACAw7B,QAAAA,IAAAA,GACe,CACbu/B,KAAAA,EACE5pE,YAAM6O,IAAAA,KAAAA,CAAAA,CAAAA,CAAAA,CAC2B,CAClC,CAAA,CACH,EACDnU,CAAA,CAAA,CAAA,CACC,CAAA,EA1Dd2F,EAAA,IAAA,kBAEOM,SAAMwgB,IAAA,UAAA9gB,EAAA4jB,GAAA,CAAA,CAAA,EAAAznB,EAC4BA,CAAG,GAAA,QAAA,CAAA,CAAqB,CAAA,EAyD1DmtE,GAAAtpE,EAAAkE,GAAA,CACC,QAELolE,GAAAA,YAEmBpyE,EAAA,eACdqyE,EAAmB3oD,EAAAA,CACc,EAEnC,SAAA5gB,EAAAgqE,GAAA,CAAEjqE,KAAAA,EAEDiqE,KACCrqE,YAAM2pE,EAAuB3pE,YAC7BqqC,YAAas/B,EAAuBt/B,EAAAA,CAAAA,CAAAA,CACU,CAAA,CAAE,CACjD,CAAA,CAAC,CAEL,CAAA,CACI,CAAA,CACJ,CAGX,SAAA+/B,GAAA,CAEA,OAAAv7D,EAAgCA,YAAAA,EAAQw7B,QAAAA,CAAAA,EAAa7pC,CAAQ,MAAGO,EAAAyT,GAAA,IAAA,CAE9D,MAAMzT,QAAe,MAAMspC,CAAA,EAAA,KAAA,IAAA,GAAA,KACzB,OAAAigC,EAAMA,UAEGA,EAAA,IACT,MAGO,OACE,EACT,CAAAjgC,CAAA,CAAA,EACF,OAAIA,EAAAA,SAAY,CAEhB,cACU9pC,MAAK,gBAASI,QAAAA,EAAsBH,SAAAA,CAAAA,EAAAA,MAAAA,CAAiBJ,MAAAA,oCAC3DW,CAAA,GAAKJ,eAAkDP,KAAAA,EAC/CW,MAAAA,eAAAA,CAAAA,EAAYJ,IAAMN,EAAA,OAAA,CAAiB,SACzCA,EAAAgC,EAAA,CAAAjC,GAAAA,SACE1F,OAAA,CAAAC,EAAAA,GAAA0vC,EAAA,CAAApmC,YAQMsmE,QAAAA,QACEC,OAAAA,SAAS,CACD,CAAA,CACV,EACA,WAAA,CAAAxmE,EAAAA,EAAAA,IAAA,EAAA,EAAAC,EAVJ5D,EAAAgD,GAEG,CAACa,SADDb,CAAY,CAAA,EAAuB,EAAEhD,EAAA,QAAA,CAAA,CAAA,CAAA,CAWjC,CAAA,CAAC,CAAA,CAAA,CACH,CAAA,EACFA,EAAA+0B,GAAA,CACJ,OAAAvmB,EACGA,KAAAA,IAAgB7N,YAAK,GAAIy/B,SAAAA,EAAW,CAAA,CAACvjB,CAAQ,CAAA,CAAG,CAG9D,SAAAmtD,GAAA,CAEA,KAAArqE,EAA6BA,YAAAA,EAAMqqC,QAAAA,CAAAA,EAAahpC,CAAQ,KAAG,CACzD,MAAAtH,EAAQA,SAAAA,CAAAA,EAAOC,GAAAA,EAAawB,CAC5B,EAAA6hB,CAAM,EAAE/jB,GAAAA,EAAGC,CAAAA,EAAAmkB,CAAA,EAAAhkB,EAAA,SAAA,EACL,CAACynB,EAASzD,CAAuB,EAAAhkB,EAAS,EAC1C+wE,EAAiBC,GAAqBhxE,EAAS,QAAA,IAAA2wC,EAAA,QAAA,EAC/CogC,KACJE,EACIC,EAAUC,GAAAA,GAAqB,KAAA,IAAA,EAC/BC,CAEN,YAAAvzB,CAAM,EAAEA,EAAgBv3C,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,IAAAA,EAClB,CAeN,eAAAgqE,CAAM,EAAEA,EAAe,OAAIhqE,EAAAA,MAAAA,CA0B3B,GAAA,uBACOtF,MAAG,QAAuBiG,SAAM,CAAAN,EAAA,SAAA,CAAOD,KAAAA,SAClCG,MAAK,cAASI,QAAMU,EAAcb,SAASa,EAAAA,EAAAA,CAAQjB,KAAAA,IACnDW,KAAK,IAAIC,IAAAA,EAAYqc,CAAE,GAAA,QAAA,CAAA,CAAO,CAAA,CAAC,CAAA,EAAGhd,EAAA,SAAA,CAClC,SACRH,EAAA,KAAA,CAAAE,YACEiC,EAAA,CAAAjC,GAAAA,SACE1F,WAAA,CAAAsJ,EAAAA,EAAAA,IAAA,EAAA,EAAAC,EAEE5D,EAAAgD,GAEG,CAACa,SADDb,CAAY,CAAA,CAAWgnC,CAAc,CAAA,EAAChqC,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,QAAA,UAG3CuD,GACAymC,EAAA,CAAAjqC,YAEImqE,QAAAA,QACEC,OAAAA,SAAS,CACD,CAAA,CACV,CAAA,CACF,CAAC,CAAA,CACK,CAAA,EACNtqE,EAAA,OAAA,CACE,SACR,KAAMqS,SAAS,CAAA,CAAA,CAAAtS,GAAAI,EAAA,MAAA,sBAENM,SAAMN,EAAA+0B,GAAA,CAAch1B,OACvBC,EAAQwO,KAAAA,IAAuB7N,YAAK,GAAIy/B,SAAAA,EAAW,CAAA,CAAS,CAAA,EAAEpgC,EAAA+0B,GAAA,CAC3D,OAENA,EACCvmB,KAAAA,IACA7N,YAAK,GACLy/B,SAAAA,GACAvjB,aAAQ,CAAA3lB,EAAA2Q,EAAAi0B,EAAAttB,IAAA,CACRusC,EAAAA,eAAkBlzC,EAChB3Q,EAAEmJ,eAAe,CACjBxG,iBAAOu2B,EAAiB,iBACtB7N,YAAuBA,CACX1a,CACd,CAAA,EACF7H,EAAA,OAAA,CACD,SACD9I,GAAA,kBACmB,EACfA,EAAEmJ,SAAe,GACjBgd,SAAW,CACV,GAAA,CACC,MAAI3jB,EAAA,GAAA,kBAAA,QAAAiG,EAAA,EAAA,EAAA,OAAA,CACF,YAAe8pE,EAAAA,YAA0B9pE,CAAgB,CAAA,EAEzDtD,GAAC2gB,EACQA,CAAC,GAAA,QAAA,CAAA,CAAA,EAA6Bhc,EAAA,EACvCA,EAAQ,SAAA,EACRqc,EAAAA,sBACAxjB,MAAOqwC,GACG,OAAA,EACV7sB,GAAAA,EAEAhhB,CAAS2gB,GAAAA,QAAAA,CAAC,CAAA,CAAA,CAA2B,GAAA,CAAC,EACxC,SACCnd,EAAA,SAAA,CACL,SAAA,CAAAG,EAAA,MAAA,CAAED,YAEFA,SACEC,EAAA,OAAA,CAAKM,SAAM,CAAAN,EAAA0qE,GAAA,CAAK3qE,YAAAA,EACdA,eACG2qE,GAAAA,CACC1gC,EAAAA,CAAAA,CACA2gC,CACEN,CAAAA,EAAAA,IAAAA,EAAAA,QAAkBnjB,CACpB,MAAA,KACD,SACDlnD,CAAA,CAAA,CAAOM,CAAM,CAAA,CAAMiqE,CAAAA,EAAO1qE,EAAS,MAAA,CAAA,MAC/B,MACH,SACL,CAAAG,EAAA,SAAA,CAAKM,SAAM,CAAA8pE,GAAAtpD,IAAA,WAAA2pD,EAAK1qE,SACdC,EAAAgC,EAAA,CACEK,GAAAA,QACoDooE,CACnD1qE,CAED,CAAA,EAAA1F,EAAA,OAAA,CAAA,MAAwB,MAAA,CAClB,EACR2F,EAAAmT,GAAA,CAAM7S,MAAM,MAAQ,kBACnB6S,SACChR,aAAM6a,EAEN3J,CAAY2J,GAAAA,QAAAA,CAAE,EAAA,QAAwB,IAAA,CAACK,EAAA,SAAA,YACxB,CACbA,GAAAA,CACC,MAAAliB,GAAY,EAAA,MAAA,GAAA,kBAAA,QAAAwE,EAAA,EAAA,EAAA,OAAA,EACXtD,GAAI2gB,EAIF3gB,CAAS2gB,GAAAA,QAAAA,CAAC,CAAA,EAAAhc,EAAwB,EAACqc,EAAA,SAAA,EACnCrc,EAAAA,sBACAqc,MAAAA,CACAxjB,EAAOqwC,OAAAA,KACGltB,EAEVtkB,CACA2D,GAAAA,QAAS2gB,CAAAA,CAAAA,CAAC,CAAA,GAAA,CAAiC,EAAC,SAC9Chd,EAAA,SAAA,CACF,KAAG,SACL,MAAA,eAAED,aAEF,WAAA0qE,EACEvqE,SAAKF,EAAAgC,EAAA,CACL1B,GAAAA,QAAM,CACN+B,CAAmCooE,CAAAA,CAEnC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAqB,CAAA,CACf,CAAA,CAAA,CACI,CAAA,CAAA,CACV,CAAA,CACA,CC3YlB,SAAwBG,IAAsB,CAC5C,KAAM,CAAE3xE,EAAAA,CAAAA,EAAGC,GAAAA,EACL,CACJ2xE,aAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAC,gBAAAA,EACAC,eAAAA,EACAC,gBAAAA,CAAAA,EACEC,GAAAA,EACJ,OAAKH,EAEHnrE,EAAA,MAAA,CAAKS,MAAM,wBAAuBP,SAAA,CAChCC,EAACS,EAAI,CAACC,KAAK,MAAA,CAAQ,EACnBV,EAAA,IAAA,CAAGM,MAAM,uBAAsBP,SAAA5D,EAAE,CAAA9B,GAAA,QAAA,CAAwB,CAAC,CAAI,EAC9D2F,EAAA,OAAA,CAAMM,MAAM,QAAA,CAAU,EACtBT,EAAA,OAAA,CAAMS,MAAM,0BAAyBP,UACnCC,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,SACNH,QAASA,IAAM,CACb0qE,EAAAA,CACF,EACAxoE,SACE,CAAC2oE,GACDD,EAAgB,GAAKE,EAAe3yE,QAAQmC,OAC7CsF,SAEDC,EAACS,EAAI,CAACC,KAAK,eAAeE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAU,CAAC,CAAG,CAAA,CACvC,EAAE,IACT4wE,EAAe3yE,QAAQmC,OAASswE,EAAc,KAAG,IACjDE,EAAe3yE,QAAQmC,OAAQ,IAChCuF,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,SACNH,QAASA,IAAM,CACb2qE,EAAAA,CACF,EACAzoE,SAAU,CAAC2oE,GAAmBD,GAAiB,EAAEhrE,SAEjDC,EAACS,EAAI,CAACC,KAAK,gBAAgBE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAM,CAAC,CAAG,CAAA,CACpC,CAAC,CAAA,CACL,EACN2F,EAAA,SAAA,CACEE,KAAK,SACLI,MAAM,SACNH,QAASA,IAAM,CACb+qE,EAAAA,CACF,EAAEnrE,SAEFC,EAACS,EAAI,CAACC,KAAK,OAAOE,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAM,CAAC,CAAG,CAAA,CAC3B,CAAC,CAAA,CACN,EA1CsB,IA4C/B,2ZCRM,CAAEmtE,wBAAyBC,EAAiB,EAAIv4D,GAEhDwc,GAAQ,GACR0/C,GAA6B,GAC7BC,GAAa,EAEnB,IAAIC,GAAsB,CAAA,EACtBC,GAAoB,CAAA,EACpBC,GAAkB,CAAA,EACtB,SAASC,GAAoBpxE,EAAI,CAC/B,OAAOkxE,GAAkBlxE,CAAE,EAC3B,OAAOmxE,GAAgBnxE,CAAE,CAC3B,CAEA,MAAMsjD,GAAwB,CAC5Bn6B,MAAO,UACPmyB,OAAQ,SACRpyB,SAAU,QACZ,EAKMmoD,GACJ,sLAEIC,GAAmB,SAIzB,SAASC,GAAWt1E,EAAQ,CAC1B,KAAM,CAAE+D,GAAAA,CAAAA,EAAO/D,EACT,CAAEoD,MAAAA,EAAOC,SAAAA,CAAAA,EAAawB,GAAI,CAAExB,SAAUrD,EAAOqD,QAAAA,CAAU,EACvDsD,EAAaC,GAAYrD,CAAM,EAC/B,CAACg5C,EAAcC,CAAe,EAAIC,GAAAA,EAClC84B,EAAah5B,EAAal/B,IAAI,OAAO,EACrCm4D,EAAiBj5B,EAAal/B,IAAI,YAAY,EAC9C6O,EAAa5H,SAASixD,GAAcC,EAAgB,EAAE,EAC5D,IAAIxZ,EAAY9vC,EAAa,EAC7B,MAAMupD,EAAgBl5B,EAAal/B,IAAI,eAAe,EAChDq4D,EAAcjV,GAAUgV,EAAepyE,CAAQ,EACjDoyE,GAAiB,CAACC,IACpB1Z,EAAY,IAEd,MAAM2Z,EAAgB3Z,GAAa,CAAC,CAACwZ,EAE/Bp0B,EAAO9H,GAAUv1C,EAAIV,CAAQ,EAC7B,CAACuyE,EAAYC,CAAa,EAAI9yE,EAASQ,EAAO+C,SAAS86C,CAAI,CAAC,EAClEr/C,EAAU,IAAM,CACVwB,EAAO+C,SAAS86C,CAAI,GACtBy0B,EAActyE,EAAO+C,SAAS86C,CAAI,CAAC,CAEvC,EAAG,CAACA,CAAI,CAAC,EAET,MAAM00B,EAAYj4D,GAAQ,IAAM,CAC9B,KAAM,CAAEm2B,aAAAA,CAAAA,EAAiBzwC,EACnB4V,GACH66B,GAAc76B,UAAY,KAAO66B,GAAcxgB,QAAU,IACtDuiD,EACJC,GAAU,mBAAoB78D,CAAQ,GAAK68D,GAAU,SAAU78D,CAAQ,EACzE,MAAI,CAACA,GAAY48D,EACR,IAEF58D,CACT,EAAG,CAAA,CAAE,EAELpX,EAAU,IAAM,CACV,CAAC6zE,GAAc5Z,IAChB,SAAY,CACX,GAAI,CACF,MAAM9jD,EAAS,MAAM9U,EAAMM,GAAG4C,SAASD,QAAQtC,CAAE,EAAEQ,MAAAA,EACnDk9C,GAAWvpC,EAAQ7U,CAAQ,EAC3BwyE,EAAc39D,CAAM,CACtB,MAAc,CACZ9V,MAAAA,sBAAiB,EACjB0iB,SAAM,KAAAgxD,CACN/8D,CAAgB+8D,GAAAA,CAEjB,EACL,CAAA9Z,CAAA,CAAA,EACF,MAAIA,EAAUyZ,EAAA9uE,EAAA,SAAA2yC,GAAAm8B,EAAApyE,CAAA,CAAA,GAAA,iBAAAuyE,GAAA,iBAER3pD,EAAAA,IAAmBwpD,OAAAA,WACrB9uE,2CAA6CtD,QAAY4oB,QAGvDgqD,KACJp2E,KAGIq2E,EAAajtE,aAAkBtC,EAAA,aACnCvE,aAAY,EAEVuzE,EACD,SAAA,KAAAG,GAECx6B,EAAa,OAAA,OAAA,EACfiB,EAAO,OAAA,eAAA,EACLC,EAAIm5B,CAAe,EAGjBp5B,EAAAA,CAAAA,EAAa2lB,EAAOv7D,EAAO,YAAA,CAAA,EAC3B41C,KAAoB,CAAA37C,EAAeyjC,EAAA8xC,EAAA/xC,IAAA,CACnCoY,GAAAA,EAAAA,IAAgBD,SAAY,CAAAo5B,EAAA,CAC9BO,EAAA,EACF,OAEF,GAAME,YAAmBntE,oBACnBo7B,CACF,MAAI4xC,EAAAA,EAAoB5xC,CAAYsxC,EAClCO,CACA,GAAA/6B,EACF,SAAA1V,EACIu2B,IAAAA,CACF,EAAAx2B,EACM6wC,EAAAC,GAAAn7B,GAAA1V,GAAAxpB,CAAA,EAAMwpB,EAAAA,CAAAA,GAAJ1hC,SAAAA,iBAAAA,8CAAAA,CAAAA,IAAAA,CAAI0hC,EAAAA,SAAAA,IAAAA,CAAUxpB,MAAAA,EAAAA,GAAAA,sBAAAA,EAAI,OAAIupB,EAAAA,IAAAA,OAAAA,aAAAA,EAAAA,OAAAA,GAAAA,EAAAA,KAAAA,OAAAA,YAAAA,EAAAA,MAAAA,CAC9B,CAAA,EACM+wC,EAAAA,EAAMz2E,SAASiI,EAAAA,EACnB,CAAA,EAAAyuE,EAAA,KAAAC,IAAA,CAAA,CAAAA,GAAA,sBACF,CAAA,EACAl1E,WACsBqnB,oBAAsB,IAAA,CAC1CrnB,EAAA,MACEm1E,mBAAsBC,EAKzBvyC,GAAA,SAEK7iC,EACJi1E,QAASryE,iBACLqyE,6BACsB,QAAKjd,IAEzBn9C,EAAI,MAAA,mBAAO,EAAEopB,CAAAA,EAAW+wC,EAAAA,CAAKh1E,CAAAA,EAAI,MAAA,QAAA,IAAA,CACrCA,EAAAA,MAAI,mBAAA,GACNA,EAAA,QAAMq1E,iBAAsBC,CAC1Bt1E,CAAAA,EAEE6iC,EAAAA,CAGkC,MAC/B8xC,EACL,CACW,EAAA,CAAAla,EACZ2Z,CAAA,CAAA,EACDiB,OAAAA,EAAAA,IAAAA,CACEr1E,IAAAA,aAASu1E,IAAAA,CACTv1E,MAAAA,EAAWw1E,SAAAA,cAAmBV,WAAAA,EAC/BW,GACHA,EAAO,MAAA,CACM,EACb,GAAA,EACF,MAAO,IAAA,aAAA3uD,CAAA,CACL6tD,EAAAA,CAAAA,CAAW,CAAA,EAAAn0E,EACb,IAAA,CACF,MACCi6D,EAAW2Z,SACd,iBAAA,iBAAA,EAEA5zE,OAAAA,EAAgB,QAAAk1E,GAAA,CACdA,eAA6B,QAAA,EAAA,CAE3B,CAAA,EACID,IAAAA,CACFA,EAAUvuD,QAAMwuD,GAAA,CAClBA,EAAA,gBAAA,OAAA,EACC,CACH,CACF,EAAG,CAAA,CAACtB,EAEJ5zE,EAAU,MAAM,CACd,MAAMm1E,gBACNA,SAAAA,CAAAA,EAAgBpmE,GAASmmE,OAAmBvtE,EAAAw6B,GAAA,CAC1C+yC,iBAAAA,EACD,SAAAxB,GAAA1xE,EACD,SAAAV,EACE6zE,KAAAA,GAAgBpmE,SACdmmE,MAAAA,IACF,QAACb,CAAA,CACH,EAAA1sE,EAAA,MAAA,OACG,gCAEL,SACEA,EAAA4jB,GAAA,CAAKtjB,OAAM,EAAA,EAGM,CAAA,EACTiiB,EAAAA,GAAAA,CACAkY,IAA2BpgC,CAAAA,EAC3BV,CAAAA,GAAAA,EAAAA,GAAAA,CACA0a,SAAM63D,EACN5rD,SAAOkC,EAAAA,GAAa,CACpBxhB,GAAAA,EACD,SAED1K,EAAA,SAAKgK,UAAAA,CAAM,CAA+BP,CACjC,CAAA,CAAA,CAAO,CAAA,CAAE,CAIf,SAACgC,GAAIqqE,EAAAA,CAAAA,KAEX,CACqB,SAAAqB,EAAWpzE,GAAAA,EAChB,QAAA8F,EACX9F,GAAAA,CACiBV,EAAAA,EACjByyE,OACDqB,EAAAztE,EAAA4T,GAAA,CAAC,MAEL,cACE,GAAA7R,EAET,QAAA5B,EAEA,GAAAutE,CACE,CAAA,EAAA1tE,EAAM,MAAA,CAAEytE,MAAAA,eAAU1rE,SAAAA,EAAI5B,GAAAA,CAAAA,CAAAA,CAAYutE,CAClC,SAAOD,KACJ75D,EAAAA,CAAI,OAACtT,KAAM,MAAAyL,EAAA,SAAA,EAAA,KAAA,MAAAmJ,EAAA,SAAA,CAAA,CAAcnT,MAAQ5B,GAAAA,IAAAA,GAAAA,GAAAA,GAAAA,GAAAA,SAAsButE,GAAAA,CAAS,GAAArzE,EAEjE,UAAA+xE,EAAW,IAAA,SAAel6D,CAAU,EAAA,CAAgB,KAAG,CAE3D,EAAA/V,CAGA,EAAAjD,GAASy0E,EACP,CAAOjrE,EAAaC,CAAaD,EAAKlE,GAAiB,EACzDqtE,EAAAh5B,EAAA,IAAA,OAAA,EAEM+6B,EAAc/6B,EAAiB,IAAK,eAAA,EAE1Cyf,EAASub,SAAahC,EAAA,EAAA,EAAA,EAAExxE,EAAAA,EAAAA,CAAAA,EAAAA,eAAAA,QAAAA,SAAAA,GAAAA,eAAAA,QAAAA,YAAAA,UAAAA,GAAAA,SAAAA,EAAAA,EAAI+xE,CAAAA,EAAY0B,CAAA,EAAAz0E,EAAAw5C,EAAA,IAAA,MAAA,GAAAhlB,EAAA,QAAA,OAAA,IAAA,EAAKl0B,EAAUk4B,CAAAA,CAAAA,SAAAA,EAAAA,IAAAA,WAAAA,CAAAA,EAAgB,CACrE,MAAAn4B,EAAQT,SAAAA,CAAAA,EAAGC,GAAAA,CACX,SAAO25C,CACP,CAAA,EACMk5B,CACN,MAAMzZ,EACN,SAAMzkC,EAKN,cAAApU,CAGA,EAAAte,KACM8sB,EAAAtuB,IAAAouB,EAAEruB,EAAAA,GAAAA,CAAAA,EAAOC,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,CAAAA,CAAAA,EAAawB,CAAAA,EAAIkiB,CAAA,EAAAhkB,EAAA,SAAA,EAAEM,EAAUk4B,EAAAA,EAAc6lB,EAAA9H,GAAAv1C,EAAAV,CAAA,EACpDo0E,EAAA31E,EAAA,CAAA,EACJsB,EAAOouB,EAAAA,EAAAA,EACPnuB,IAAUouB,CACVtO,EAAAA,SAAAA,MAAAA,CACF,IAAIte,EACJ9C,OACA,MAAM4E,EAAaC,OAAYrD,CAC/B,GAAO+C,CAAAA,EAAUoxE,QAAe30E,OAChC,KAAOynB,CACDmtD,UAAAA,EACN,EAAMv2B,EAAO9H,QACPm+B,IAAAA,YAEAv1B,GAAgBpgD,CAAAA,EAAAA,GAEpBogD,EAAAA,EAAAA,EACF,OAAAA,EAAK,SAAA,iBAAA,SAAAsB,EAAA,CACLzhD,QAAU,EACR,CAAA,EAEEyhD,IACA,IAAM,CAAAA,EAAElE,OAAAA,EAAU4C,EAAIA,SAAclgD,oBAAAA,SAAAA,CAAAA,CACpC,CACEkzE,EAAAA,CAAAA,EAAAA,IAAAA,SAAsB51B,CAAAA,EAAAA,KACxB,CACF,gBAAAo1B,EACAxyB,gBAAAA,EAA4D,cAAAuyB,EAE5D,eAAAE,CACAnxB,EAAAA,GAAS,EACTo0B,EAAa91E,EAAA,EACX0hD,EAAgB1hD,EAAA,EAChBogD,CAAAA,GAAclgD,CAASmjC,EAAAA,EAAoB,CAAA,EAC7C0yC,GAAA/1E,EAAA,IAAA,EACEiC,MAA0B,CAE9B,GAAM,CAAA8zE,GAAA,QAAA,OAAEnD,GAAAA,CAAiBoD,UAAAA,EAAiBrD,YAAAA,GAAeE,WAAAA,CAAAA,EACvDE,GAAAA,QAEF,GAAM+C,GAAgB91E,IAAO,OAAA,CAC7B,QAAiC6yE,EAAA,QAAAF,CAAA,EAC1BsD,cAA2CC,EAAA,SAAA,EAC5CH,GAAyBlD,EAAA,QAAAF,EAAA,CAAA,KACEwD,GAAA,KAAA,MAAAA,GAAA,SAAA,EAAA,KAC/B71E,GAAY81E,GAAA,OAAA5lC,IAAA,UAAeulC,KAAY71E,MAAAA,GAAAA,UAAAA,GAAAA,SAAAA,EAAS,OAAAm2E,IAAAC,KAAA,CAAAC,IAAAF,IAAAE,GAChD,CAAA,CACA,CAAIC,EAAEC,KAAAA,EAAAA,EAAAA,GAAWL,KAAAA,EAAAA,EAAAA,EAAatC,QAAAA,IAAAA,QAAAA,EAAW,MAAIiC,EAAY71E,IAAAA,IAEzDs2E,EAAI5D,QAAAA,IAIFjzB,GAAMu2B,EAAAA,EAAAA,CACN,cAAMI,EAGN,CAAA,EACAlgE,kBAAoC+/D,KAAAA,IAAAA,GAAAA,KAChC7rE,EAAKlE,WAAM+vE,GAEfC,EAAcA,IAAAA,EAAY57C,WAAc,CAGtC,CAAA,EAGkB+7C,MAEnBG,EAAAF,EAAA,MAAAhmC,GAAAA,EAAA,QAAA,KAAAmmC,EAAA,QAAA,EAAA,EACHC,GAAA,CAAA,EAEAH,WAAelB,GAAa,CAS1B,GARFa,KAAiBb,EAAa,CAI9B,CAAA,EACAkB,EAAUznE,aAASoH,CAAAA,GAAW,KAAAo6B,IAAAA,GAAA,KAAAp6B,EAAA,WAAA,GAAAA,EAAA,cAAAugE,EAAA,IAC5Bh3B,MAAmBp+C,EAAU,WAAA,EAE5B6U,EAAA,qBAAAA,EAAA,QAAA,GACDwgE,GACS93B,KAAAA,CACN23B,UAEDI,EAAgB9mE,cAAW+uC,EAAW,GACxC83B,GAAA,KAAAxgE,CAAA,UACD,CAAAA,EAAA,oBAAAwgE,GAAA,KAAApmC,IAAAA,GAAA,KAAAp6B,EAAA,aAAAo6B,GAAA,QAAA,KAAAmmC,EAAA,QAAA,EAAA,GAAAvgE,EAAA,QAAA,KAAAugE,EAAA,QAAA,GACDC,GAAMF,KAAoBD,CAAAA,OAI1BL,MAAAA,GAAYpnE,GAASoH,KAAWo6B,IAAAA,GAAA,KAAAp6B,EAAA,WAAA,EAC9BupC,KAA6B5wC,GAAA,YAE5BA,GAAA,UAAA,CAAA,GAOC8nE,GAAAA,UAAgB9mE,MAAW+uC,EAG7B,CAEE83B,CAAAA,EAA6BA,GACpBxgE,KAAO0oC,CAAAA,EAAAA,KAAAA,CAEhB83B,MAAAA,KAA6B,QAAA,GAC/B,OAAAjjE,EAAA,QACGyC,KAAOwgC,IAAAA,GAAAA,QACRggC,KAAAA,GAEM30E,GAMN20E,GAAAA,QAAAA,SAA6BjjE,EAAA,QAAA,KAAAmjE,GAAA,EACxB,CAEL,CAAA,EACAD,EAAY,KACV,IAAAE,EAAYC,EACVjoE,SAAAA,KAAmBkoE,GAAA,CAAA,MACrBC,GAAAD,GAAA,EACAloE,OAAAA,GAAOioE,IACTD,EAAOE,IAGPE,GAAA,IAAAC,KAAA,CACF,GAAAA,GAAA,GACD,QAAAA,GAAA,QAGDR,aAAkB/5D,GAAAA,aAChB,QAAMi6D,GAAAA,QACN,UAAqBA,EAAAA,EAErB,SAEA,QAAOO,GAAAD,GAAA,UAAAF,EAAA,CAAA,EACR,CAED52E,CAAY,MAAEm2E,GAAAA,GAAAA,IAAAA,IAAAA,CAAWL,GAAAA,EAAAA,GAAaQ,QAAAA,EAAAA,QAAmB,UAAApmC,EAAA,QAAA,GACzD,cACElwC,OAAQ4Y,EAAAA,QAAM,KAAAy9D,EAAqB,WACrC,OAAAW,GAAA9mC,CAAA,EAEA,MAAIumC,EACJ,QAASM,eAAwBJ,CAAAA,EAC/B,qBACA,EAAA,EAgBWl9D,MACXyQ,CACA+sD,YAjBER,CAAAA,GAAAA,EAAwBE,IAAAA,IAAAA,CAC1B,GAAAzmC,EAAA,GACA,SAAO2mC,GAAuB,SACrBl1E,EAAAA,UACEm1E,EAAAA,QAAGr9D,GAAAA,kBACK8oC,aACL/d,EAAAA,aAAAA,OACZ0yC,MAA2B,UACpBN,EAAAA,SAAAA,EAAAA,EACPljD,CACF,GAAA/xB,EACF,UAAA00E,EAAA,QAAA,GAEA,OAAMc,GAAAA,CAA0Bb,EAC9B30E,UAAMA,EAAAA,SAAAA,OACK8X,EAGXwhD,kBAAAA,EACAic,wBAAAA,EAA0B,CACnB,KAEMjtE,CAAAA,CACf,WAAAmtE,CACA,EAAA,MAC2BzyD,EACjBhjB,SAAAA,EAAAA,IACN01E,GAAU,MACVje,EAAUgd,GAAAA,CAAAA,EAAAA,GACVlsD,EAAazQ,CACbA,QAAWA,EAAAA,YACK8oC,SAAAA,CAAAA,CACU,EAE1B+yB,EACFgC,CAAA,CAAA,MAEEptD,IACAgtD,GAAAA,CAAmC,IAMvCl3E,OAAAA,SAAY,CAAEu3E,MAAAA,EAAAA,IAAAA,GAAAA,IAAAA,EAAAA,GAAAA,SAAAA,QAAAA,CAAAA,EAAAA,QAAAA,CAAad,QAAAA,CAAAA,CAAuB,EAC3Ce,EAAAC,GAAA,IAAAz2E,EAAA,GAAA,SAAA,QAAAW,CAAA,EAAA,QAAA,MAAA,EAAA,CAAE41E,QAAAA,CAAAA,CAAanB,EAAmBe,GAAAA,CAAAA,CAAAA,EAAAA,SAAAA,CAAAA,EAAwB,IAAAd,EAAA9xE,EAAA,SAAAy6C,CAAA,EACnE,GAAA,EAAAnG,IAAA,CAAAu+B,GAEMM,IAAiBN,EAAAA,MAAAA,EAAAA,EAAgB/3B,GAAMg3B,EAAAp1E,CAAA,EAC3CjB,MAAQomD,gBAAuB,CAC/BzhC,WAAW2M,GAAS,GAAA,CAChBqmD,CAAAA,CAEJ,MAAMC,CACFA,EAAAA,OAAgB,EAElB,MACG1nC,CAEH,GAAA,CACAolC,MAAAA,GAAYgC,MAAAA,EACP,CAQLhC,UAAaY,EAAA,EAAEv0E,GAAK8zE,GAAA,QAAA,CAEtB,GAAAn4E,GAEC,WAAY+4E,CACX,EAEIwB,KAAAA,CACD,YAAAN,GACH,kBAAAnB,EAGIyB,wBAAAA,EAAS,EAEbC,EAAA,EAEMj/B,GAAct0C,WAAwB,CAAA6xE,EAAA,CAAA,EAAAe,GAAA,OAAAjnC,IAAAA,GAAA,MAAA,EACxCsjC,IAAajvE,EAAwB2xE,GAAA,OAAA,GAAA6B,GAAA,OACrCl/B,GAAcu+B,GAAAA,GAAY,KAC5Bp3E,EAAcg4E,GAAA,CAAA,EAEdrzD,EAAI,SAAA,EACF6uD,EAAAA,QAAmByE,CACnB54B,UAAWm0B,EAAYvyE,SAAQ,UAE/B,UAAU6qC,EAASxa,SAAY,SAC7BxwB,EAAuB,MACxBo3E,GAAAhC,GAAA,QAAA,MACSz0E,IACVzB,MAAe,CAAA,EAEfs1E,EAAAiC,EAAA,EACF1E,GAAAlxE,CAAA,EAAA41E,GACFY,GAAA9B,EAAAp1E,CAAA,CAEA,MAAI,CACF0jB,SAAgB,CAChB,CAAM,GAAA,EAAEwxD,EAAc74E,QAAAA,KAAAA,IAAAA,EACtBm4E,IAAAA,CAAsB,aAAKn4E,EAAAA,CAAAA,CAASk2E,EACpC7zE,EAAA+3E,GAAM,CAAA/1E,EAAAX,CAAA,CAAA,EAAArB,EAAE43E,IAAAA,CAAAA,GAAAA,CAAanB,KAAmBe,CAAwB,YAAAI,CAGhE,EAAAO,EAAMC,EAINzC,EAAMK,CAAAA,CAEN,MAAIA,CAGFyC,CAAgC,EAAA,CAAA9F,EAClCD,CAAA,CAAA,EAEA1tD,KAAAA,CAAAA,GAAW0zD,EAAS,EAAA13E,EAAA,EAAA,EACpB60E,EAAAA,IAAAA,CAAwB,IAAA8C,EACtBC,gBAAyB34E,CAAS24E,MAClCr7B,GAAAA,WACFs7B,EAAA,SAAAl1E,GAAAk1E,EAAA,SAAA,KAIAH,GAAMH,GAEJO,EAAAA,GAAAA,EAAsB,MACxB,IAAA,CAEAnD,cAAYiC,CAAAA,CACZ1E,CAKAsF,EAAAA,CAAAA,CAAAA,EAAoC/1C,GAC1B,IAAA,CACVpiC,GAAAA,CAAAA,SAAe,OACf2kB,MAAAA,EAAkBmuD,GAAAnxE,CAAA,EAAA,GACpB+2E,EACF54B,EAAG,QAAA,UAAA44B,UAEHF,EAAkB54E,QAAe0D,CAEjC,MAAOq1E,GAAM,CACX93E,UAAa82E,EAAS,SAAA,UACxB,UAAA73B,EAAA,SAAA,SAAA,EAGQ43B,EAAc/1E,GAAU,UAAA6zE,EAAA,QAAA,UAAAmD,GAAA,UAElCh5E,EAAgB,QAAA,UAAAi5E,CACd,MAAI10E,EAAA,SAAA,IACF47C,EAAM,QAAA,UAAA,GAAEy3B,EAAgBO,QAAAA,IACxBxC,EAAAA,CAAAA,CAAAA,CAAAA,EAAuB31E,MACb,CAAC4E,EAAA,kBAAA,IAGZ,SAAC+tE,CAEJ,GAAOuG,CACPl5E,KAAU,CACJ24E,YAAAA,CACF,EAAMh1E,GAAe,EAEnBk1E,GAAAA,WAAkB54E,CACZ44E,gCAGR,aADiB,MAAI,OAAA,KAAA,KAAA,GACrB,OAAAM,GAAA,CACO,WAAA,EACT,CAAA,EACE71E,GAAcq1E,CAChB,WAAA,EAAA,CACG,CAELl2C,MAAgB,CAAA,CACd,GAAA,CACApiC,EAAAA,CAAAA,EAAQomD,gBAAkBliD,CAAAA,EAC1BvE,EAAM+4E,IACN14E,IAAQomD,CACR0sB,GAAM4F,CAAAA,EACJ14E,EAAAA,iBAAwB,EAAA6yE,GACtBlxE,CAAAA,EAAAA,GACA+2E,CAAAA,EACFK,GAAC,MAAA,CACDj5B,EACF,CAAA,CAAA,EACE,MAAA0zB,EAAMmF,EAAmB,SAAA35B,CAAA,GAAAz6C,EAAA,SAAA5C,CAAA,EACvB42E,MAAyB34E,IAAAA,CAAS24E,GAClCr7B,CAAAA,WAAkCA,KACpC,CACA,QAAAzjC,CAIAzZ,EAAAA,cACiBw1E,cAAc51E,KAAAA,EAAAA,OAAAA,GAC7B+4E,UAAAA,EAAAA,YACAC,GAAAA,UAAAA,KAAAA,CAAAA,EAAAA,CAAAA,CACA10E,CAAAA,EACD80E,GAAAv9D,GAAA,IAAA,CACDqkC,GAAAA,CAAAA,QAAsB5C,GACxB,IAAA3uB,EAAWrqB,GAASnC,CAAW,EAC7B/B,OAAAA,EAAAA,OAAc,KAAUuuB,EACtB5sB,EAAAA,MAAAA,EAAAA,EAAAA,EAAAA,KAEFm+C,CAAkC,EACpC,CAAA0zB,CAAA,CAAA,EAGAgC,GAAAA,IAAwBwD,GAAA,GAAAC,EAAA,MAAAD,EAAA,IAAAv1E,EAG1B9D,CACE,GAAI4E,YAEJ,CACE,EAAA,mBAAI,EACF,MAAA20E,GAAMz9D,GAAA,IAAA,CAAA,GAAA,CAAA+3D,EAAE79D,OAAAA,MACR,IAAAkE,CACA7Z,EAAAA,EACA,GAAA6Z,EACA,OAAA,IAAMs/D,MAAAA,YAA4B,EAAA,CAAA3F,CAAE4F,CAAAA,EAAiBC,GAAC59D,GAAA,IAAA,CAEtD,GAAAy9D,GAAmB,OACjB9B,KAAYn2E,CAAA,EAAA,CAAAi4E,GACbj4E,CAAA,CAAA,MACMzC,EAAG,EAAAmC,EAAAqyB,EAAA,EACVhzB,MAAe,IACjBkE,EAAA,OAAAzC,GACF,CAAAyC,EAAG,OAAAzC,EAAA,CAAA,EACD8C,GAAWgtC,EAAiB,KAAArB,GAAAA,EAAA,UAAA,EAEhCvwC,GAAgBuE,EAAA,OAAAgsC,GAAAA,EAAA,QAAA,EACd,CAAAopC,GAAaC,EAAA,EAAA54E,EAAA,EAAA,EAEXmyE,GAAAA,GAAmB,IAAA,CACnB3xE,GAAAA,CAAAA,EAAOowC,SAAmB+nC,GAAA,OAAA,KAC1BzG,KAAAA,CACAD,IAAAA,CACAmG,EAAAA,EAAAA,QAAwB,sBAAA,EAC1B,OAAAjnE,EAAA,EAAA,OAAA,IACF,EAAG,GAAE,CAAA,EAELpO,aAAmBa,CACnB,SAAM00E,KAAAA,CAEJ,EAAA,CACgB,QAAIzF,CAAAA,EACpB,gBAAY91E,GACI+b,CAAAA,CAAAA,SAAQmP,cAAAA,sBAAAA,GACHqF,EAAAA,SAAKzvB,EAAA,SAAAA,EAAA,QAAAA,EAAA,SAE5B,OAAMw6E,EACJ,CAAA,EACAt1E,GAAI6qB,YAAkBilD,IAAAA,CACtB,SAASzxE,MAGPwsB,EAAAA,CACF,OAAA,GACA,gBAAOA,GAAAA,EAAAA,SAAAA,EAAAA,SAAAA,EAAAA,QAAAA,EAAAA,QAAAA,CACT,EACA4/B,YAEgD1qD,MAAAA,EAAAA,SAAAA,cAAAA,QAAAA,6BAAAA,EACxC+1E,GAAAC,GAAA,sBAAA,EACIC,EAAA,MAAA,KAAA55B,EAAA,QAAA,iBAAAkzB,EAAA,CAAA,EAEN,GAAAyG,GAAAD,GAAA,IAAA15B,EAAA,QAAA,cAAA05B,GAAA,OAAA,EAAA,CACJ,MAAAG,EACFD,EAAA,QAAAD,CAAA,EAEA,IAAMP,EAAez9D,EAAck+D,EAAA,CAAA,EAC5BnG,IACLoG,EAAM,MAAA,EAAE//D,EAAAA,eAAAA,EAAAA,EACR,KAAKA,CACL,MAAO6f,EAAgB9iB,EAAAA,KAAAA,GAAAA,CACrB48D,MAAAA,GAAWlM,EAAA,sBAAA,EACT+R,OAAAA,QAA2B,IAAMQ,GAAA,MAAA,CACrC,CAAA,EACAC,IACEZ,EAAcj4E,MAAS,EAErB64E,EAAgB,eAAa9mD,EAAK,EAGtC,CACF,EAAG,CAEH,UACA,gBAAkB9uB,GAAAA,EAASg2B,SAAQgW,EAAMA,SAAU1xC,EAAA,QAAAA,EAAA,QAEnD,CAAA,EACAkF,GAAMq2E,IAAAA,KAEJ,MAAKxE,EAAc31E,SAAW05E,cAAY,QAAO,6BAAA,EAC3CE,GAAAC,GAAA,sBAAA,EAAE3nE,EAAAA,MAAAA,KAAAA,EAAAA,QAAAA,iBAAAA,EAAAA,CAAAA,EAAI,GAAIyjE,GAAc31E,GAAQ4mB,IAAAA,EAAsB,QAAA,cAAAgzD,GAAA,OAAA,EAAA,CAC5D,MAAO1nE,EAAmB4nE,EAAA,QAAAD,CAAA,EACxBH,IAAAA,EAAWI,EAAAC,EAAA,CAAA,EAEfj2E,IAGIiT,EAASpL,MAAOmoE,EAElBsG,EAAA,eAAA/0B,EAAA,EAAA,KAAA,SAGY2U,EAAAA,KAAAA,GAAAA,CACVxzD,MAAAA,GAAwBkhE,EAAA,sBAAA,EACtB,OAAM1uB,GAAal7C,YAAuB,MAAA,CAC1C,CAAA,EACFo8E,IACA3zE,EAAQ,MAAA,EAEZ2zE,EAAA,eAAA70B,EAAA,EAKItuC,CACF,EACA,CACExQ,OAAQ,GACRC,mBAAwB5H,EAAE8H,SAAW9H,EAAE+H,SAAW/H,EAAEgI,QAAUhI,EAAEwH,QAAAA,CAEpE,EAEAtC,GACE,IACA,IAAM,CACJ,MAAM+1E,EAAe/7E,SAAS2pD,cAAc8P,QAC1C,6BACF,EACA,GAAAsiB,EAAMD,CACN,WAA6BnlE,mBAG7BrU,IAAYi6E,GAAA,QAAA,YAAA,IAAA,YAAEP,GAAAA,KAAAA,CAAAA,GAAAA,KACd,CAKE,EAAA,CACA,OAAIE,GACJ,gBAAgBp7E,GAAAA,EAAA,SAAAA,EAAA,SAAAA,EAAA,QAAAA,EAAA,QACdo7E,CAAAA,EACAA,KAAAA,CAAAA,KAA0B30B,EAAAA,EAAAA,EAAqB,EACjDi1B,EAAAx6E,EAAAk6D,EAAA,eAAA,QAAA,EACFugB,GAAOtzE,GAAA,CAAArI,EAAA2Q,GAAAi0B,EAAAttB,IAAA,CAELtX,EAAA,eAAMs7E,EACJt7E,EAAA,gBAAMq7E,EACNz/B,EAAOy/B,CACT,MAAC1qE,GAAA,EACD,cAAI2qE,EAAAA,EACFA,CAAAA,CACAA,EAAAA,CAAAA,CAAAA,CAAAA,EACFM,GAAAvzE,GAAA,CAAArI,EAAAsX,KAAA,CACFi9D,GAAAj9D,GAAA,EAAA,CACF,EACA,CAAA,CAAA,EAAAnW,EACU,IAAA,CACRyG,IAAAA,EAEJ,OAAAitE,GAAAzZ,IAEAl2D,aAEQ,IAAA,CACJ,MAAM+1E,GAAAA,EAAwBpyB,SAAAA,cAC5B,wBAAAgsB,CACF,IAAA,EACMmG,IACAE,kBAAiBtlE,EACPxU,CAOd,EAAA,GAAM+5E,GAEFK,IAAAA,CACFA,aAAW3zD,CAAAA,CACX2zD,CAA+C,EAAA,CACjD3G,EAAAzZ,CAAA,CAAA,EAAA,MACFygB,GAAOxzE,GAAA,CAAAiP,EAAA3G,KAAA,CAEL,KAAA,CACE,GAAA4yB,EACA,SAAAs1C,EACF,SAAAje,EACA,WAAA6d,GACE6C,OAAAA,EACAA,QAAAA,GACF,aAAAv3B,GACF,OAAA20B,GAEF,MAAAP,CAAA,EACExwE,EACAC,GAAAA,MAMJ1C,OAAAA,OAEE,CACE,IAAM+1E,GAAAA,EAAwBpyB,KAG9B,MAAIoyB,GAAAA,EAAc,WAAA,EAAA,IAAAxC,GAAA,aAAA,EAAA,IAAAhc,EAAA,SAAA,EAAA,IAAAqf,GAAA,OAAA,EAAA,GAChB,UACAA,GAAIL,EAAWA,EAAQM,CACrBN,SAAQ9vD,CAAAA,EAAQ8vD,GAAQ9vD,CAC1B,UAAA,GACF,SAAA4+B,IAAA,CAEF,eAAA,IAAA,CACU,sBAAA,IAAA,CACR3iD,MAEJ,CAAA,CAEOo0E,CAAAA,CAMDN,uBAIAvyE,SAAe,EACf2uB,SAAgBhvB,EAAA+0B,GAAA,CAClB+d,SAAAA,EACSjrC,SAAAA,gBACexN,GACvB,KAAA,IAGL,gBAAA,GAEMy4E,eAAAA,CACJrH,CAAAA,CAA6B,CAC1B,EAAA3qD,IAAA,WAAA,CAAArH,EAAA5Z,EAAA,MAAA,CAEK,MAAM,qBACV8e,SAAAA,CAAAA,EAAAA,IAAAA,YACiB2zC,EAAW,YAE5B,EAGA,CAAI9jD,EAAAA,EAAQoF,GAAA,CACVpF,MAAsBmvC,mBAAqB8pB,EAAA,YAAA,SAC7C,MAAA,SACI,SAAAznE,EAAAgC,EAAA,CACR,GAAA,QACA,CAAO,CACLzI,CAAAA,CAAAA,CAAkB,CACpB,EAAA,CAAA0uB,GAAApoB,EAAA,MAAA,CACEksE,MAAAA,qBAEEgH,SAAAA,CAAexzE,EAAAA,IAAAA,CAEX,SAAAS,EAAAgC,EAAA,CACAy4B,GAAAA,SACJs1C,OAAAA,CACAje,SAAAA,CAAAA,EAEA6B,WAAAA,CACAvnC,EAAAA,EAAAA,IAAAA,CAAAA,CAAAA,CAAAA,CACA6uB,CACA20B,CAAAA,CACAP,EAAAA,EAAAA,SAAAA,CACE7gE,KAAAA,kBACWisB,IAAapgC,kBACTy3D,IAAAA,GAGjB,SAAA,YAEgBmc,CACJ8B,GAAAA,CAE2C,MAAAnmD,GAAA,MAAA9B,EAAA,GAAA,OAAA,KAAA,GAGnDhoB,EAAA,IACEE,KAACi1B,WACC51B,QAAW,GACAoiD,MAAAA,CACT7J,CAAAA,EACEu7B,GAAAA,GAAAA,SAAsB,OAAM,CAC1BlB,MAAAA,GAAoBroD,GAAA,SAAA,CAAA,EACrB,SAAA,KAAA7B,EAAA,IAAAA,CAAA,MAAAuoB,GAAA,EAAA,GAAA,MAAAA,GAAA,EAAA,EACF,KACH,OAAA,IAAA,MAAA,YAAA,CAEAp+B,OAAUhb,GAAA,CAAE6I,EAEXg1B,SAAM,EACL0F,MAAAA,EAEA24C,CACK,GAAA,SACLC,OAAe,CACfjsD,EAAAA,EAAgBksD,CACjB,CAGD,CAAW,CAAoBvzE,CAC7BA,GAAAA,CACE,EAAA,SAGO,CAAAC,EAAAS,EAAA,CAETT,KAAC4T,UAAI,CACH7R,EACE0lE,IAAAA,EAAAA,EAAAA,CAIFnnE,GAAAA,QAAM,CAAQP,CAAAA,CAEd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAoB,CAAA,EAChBF,EAAC0zE,GAAA,CAAA,SAhIvBzhB,GAAAie,EAoIgB,GAAKzvE,EAAM,IAAA3G,CAAA,MAAA8gC,CAAA,GAAA,MAAAA,CAAA,GAAA,QAAoB16B,IAC7BC,CAAAyrE,GACEzpE,CAAA,CAAA,EAAA,SAAA1H,CAAAA,KAAA,GAAAy1E,EAAA/vE,EAAAi1B,GAAA,CAAA,UAAAt7B,GAAAA,SACkD8nD,IAAA,CAAA,eAAA,IAAA,CAAA,sBAAI,IAAA,CAAC+xB,GAAA/xB,EAAA,CAEhD,CAAA,CACN,CAAA,CACH,EACO,WACK3gC,GAAAA,CACV3gB,SAAAA,EACEkd,SAAAA,EACA,cAAa,GACX,KAAAs2C,GAAIoc,EAAA,IAAA,IACF,gBAAMnmD,GAA4C,aAC7CsiD,GAAW35D,kBACRugE,EAAA,CAAA,CACG,CAAA,EAAA9yE,EAAA+0B,GACT56B,CAAO,SAAAsgC,EAET,SAAA9gC,EACE,cAAA,GACA0V,KAAAA,GAAAA,EAAgB0Y,IAAAA,IAEG,gBACd,GACL,aAAA8qD,GAA4B,kBAC9BC,GAAA,eACO57E,CAAAA,CAAGy4E,EACVtyD,CAAAA,EAAAA,GAAAA,GAAoB,GAAAxd,EAAA,MAAA,CACpBub,MAAAA,eAAKjf,SAAAA,CAAAA,EAAAA,EAAAA,CAAAA,KAAAA,WAAC,IAAAA,EAAA,CAAAjF,GAAAA,QAAY,CAAC,CACnBwB,CAAAA,EAAAA,IAAAA,EAAAA,OAAcxB,CAAC,MACjB+jD,GAAA,SACC9pB,GAAA8pB,EAAA,CAAA,CAAA,CACL,CAAA,CAAA,EAAEl7C,GAAAA,CAEG,CAAA,EAAM4vE,IAAcvjD,IACzBpqB,OAAA,GAAAhC,EAAAyzE,GAAA,CAAA,SAAA95E,EAAA,QAAAyyB,GAEQ,gBACDunC,EAAA,MAAA0b,EAIf,UAEDkE,GACC9F,QAAAA,EAAUiG,QAAAA,GACV3xE,iBACe,IAAApI,CAAA,MAAA8gC,CAAA,GAAA,MAAAA,CAAA,GACbgxC,QAAAA,IAAAA,GAA4BhxC,CAAA,CAAA,CAC9B,CAAA,EAUS3Z,IACLzhB,WAAW2zE,IAAA,CAAA,CAAA9G,GAAA,cAAA,CAAAyH,IAAA3zE,EAAA,MAAA,CAAA,MACXsV,iBACEsiC,SAAAA,EAAAA,GAAe,CACbu7B,OAAAA,EAAAA,cAA4B,CAC1BK,CAAAA,CAAsB,CAAA,EACvB1yD,IACF,SAAAkyD,IAAA,CAAA,CAAA9G,GAAA,cAAA,CAAAyH,IAAA9zE,EAAA,MAAA,CAAA,MACH,eAAA,SAAEE,CAAAA,IAEDg1B,CAAM,GACL0F,QAAAA,CAAAA,EACA9gC,EAAAA,KAAAA,CAAAA,CAAAA,EAAAA,EAAAA,SAAAA,CAAAA,KACAy5E,SAAa,MACbzyE,QAAiC,QACjC0yE,IAAAA,CACAt4B,EAAAA,kBAAc83B,EAC2B,SAC1C7yE,EAAAgC,EAAA,CACK,GAERhC,QAAO,CACLy6B,CAAAA,CAAAA,CACA9gC,CAAAA,CAAAA,CACa,CACoB,EAAA8gC,CACjC44C,CAAe,EAAA,CAAAh5E,EAAAV,EACfohD,EAAc83B,EAAAA,EAAAA,EAAAA,GAAAA,GAAAA,EAAAA,CAAAA,EAAAA,EACKC,GAAAA,IAAAA,CAAAA,GAAAA,eACnBc,QAAkBjE,YAAAA,QAAAA,CAAAA,MACnBkE,EAEF9D,WAAY90B,QAAe,EAAA,WAC1B,aAAA,MAAA,CAAA,EAAA,GAAA44B,GAAW,IAAA,OAAc9zE,GACtBU,KAAIozE,EAAA,GAAA,CAAM,CAAc13E,OAAAA,GAAAA,KAAAA,EAAAA,cAAAA,QAAAA,CAAAA,EAAAA,CAAAA,CAAAA,CAAAA,EAAE23E,GAAA3/D,GAAA,IAAA,CAAA,GAAA,CAAA+f,GAAS,MAAA,CAAA,EAAA,MAAA8jB,EAAC,CAAA,EAAA,SAAG+7B,GAAEvlE,EAC1C,CAAAwpC,EAAA,KAAM30C,EAAO43C,EAAAA,EAAAA,EAAal7C,SACGyO,EACtB,QAAA,QAAAulE,EAAA,CAEL,CASM,OAAAn3E,EAGf+yE,MAAAA,EAAcvjD,EAAAA,QAAS3xB,EAAS,EAE7Bd,EAAAA,IAAAA,GAAAA,GAAAA,EAAAA,CAAAA,CAAAA,CAAAA,EAAAA,CAAAA,GACAyyB,EAAAA,GAAAA,CAAAA,CAAAA,EAAAA,SACA4nD,GAAAA,EAAiBrgB,CAAAA,GAAAA,EACjB0b,GAAAA,OACA4E,GAAAA,EACoC7I,CACxB,GACVrpE,SAA4D,OAC5D5B,CACF,OAAA+zE,CAAA,CACD,CAMC,EAA2Bn0E,CAClB,MAAC+hB,GAAQoqD,WAAWjxB,EAAAA,EAAAA,EAAgB,OAAIzpB,GAAA,EAGpD1Q,CAIQxgB,GAAAA,SAAoBP,OAAAA,CACvB1F,MAAAA,EAAA,CAEA,CACO,CACC,CAEJR,CAAOowC,MAAAA,GACT91B,GAAA,IAAA,CAAA,MAAA6d,EAAEjyB,CAAAA,EAEFo0E,GAAAv3E,EAAA,MAAA,EAAAzC,EAAA,EAAA,QAAuB0N,EAAA,EAAAA,EAAAssE,GAAA,OAAAtsE,IAAA,CAAA,MAChB2G,EAAA2lE,GAAAtsE,CAAA,EAAA,GACNA,EAAA,EAAA,CACN,MAAA6qE,EAAAyB,GAAAtsE,EAAA,CAAA,EAzME4yB,CA+MT9gC,UAAAA,GAWEy6E,WAAAA,EAEA,OAAAzgB,GACF,KACA,IACE,GAAA+e,GAAO/G,WAAsBkI,GAAUthE,CACzC,MAAA8hE,GAAA,KAAA,MAAA1xE,EAAA,EACF,GAAA,SAAA0xE,EAAA,GAAAA,GAAAzG,GAAA,CACOjC,MAAAA,EAAiB3nE,KAAKnK,MAAOywC,EAAAA,SAAc76B,EAC3C,GAAA6kE,GAAA,SAAAA,CAAA,EAAA,CAEHR,KAAAA,CACC5/C,SAAAA,GACO,GAAAqgD,EACZ,IAEanoD,GAAS,CAAA,GADFioD,GAAAC,GACE1G,IACXxhD,GAAgB2nD,GACzB/hD,EAAA,KAAAhyB,EAAA,KAAA,CACF,MAAA,CACe7F,mBAAqB,KAAA,IAAA,GAAAq6E,EAAA,CACpC,EACY53E,MAAAA,eAA0B,WAAA,EAAA,IAAA+yE,EAAA,aAAA,EAAA,IAAAhc,GAAA,SAAA,EAAA,YAGjBugB,GAAQM,EAAA,CAC7B,EAAa,YAAI/iC,EAAA,IAAA8iC,EAAA,EAAA,CAAA,CACR,CAAAl6E,CAAA,CAAA,CAAA65E,EAAa,KAAAnB,GAAAvkE,EAAA3G,CAAA,CAAA,CAAA,CAGnB,OAACmqB,CAAA,EACJ,CAAAp1B,EAAOzC,GAAA44E,GAAA/H,EAAAD,CAAA,CAAA,EACL1yE,OAAAA,EAAMo8E,IAAAA,CACN,IAAA91D,EAAA6S,WAAA1f,IAAAA,CAAAA,GAAAA,CAAAA,EAAAA,QAAAA,OAAAA,MAAO4iE,GAAAzG,EAAA,QAAA,cAAA,sEAAA,EAAA5zE,IAAAq6E,GAAA,MAAA,CAAA,EAAA,GAAAp6E,EAAA,MAAA,IAAAm6E,aAAAA,CAAAA,CAAAA,EAAAA,CAAAA,CAAAA,CAAAA,EAGNz0E,EAAA20E,GAAA,SAAA,CAAA,MAACtG,GACJ,SAAAxuE,EAAA,MAAA,CACF,SAAA,KAEA,IAAM+0E,EACJ,oCAAeh4E,EAAA,OAAA,EAAA,gBAAA,EAAA,IAAAg2E,EAAA,UAAA,UAAA,CAAA/kD,EAAA,QAAA,WAAA,EAAA,IAAAgnD,EAAA,aAAAA,CAAA,GAAA,EAAA,IAAA7J,EAAA,oBAAA,EAAA,GACf,MAAMmJ,EAAiBv3E,CAEvB,4BAAoBu3E,MAA4BlJ,EAAA,QAAA,OAAA,EAAA,EAC9C,EAAA,OAGA,eAAW/zE,GAAA,CACT07E,EAAmBuB,UAAAA,WAEnBvB,EAAM,QAAA,KAAEjwE,EAAWgtE,SAAYhc,CAAAA,EAAAA,SAAAA,CAAAA,MAAQt5D,GAAAA,IAAAA,UAAAA,UAAAA,EAAAA,GAAG,WAAImU,GAAAA,CAE9C3U,EAAI64E,kBACF,EACA,SAAIoC,EAAST,MAAAA,CACX,MAAA,4BAEA,SAAIC,CAAAA,EAAAA,KAAYQ,CACd,SAAM,CAAAV,GAAAp0E,EAAA,SAAA,CAAA,KAAE+vE,SAAAA,MAAcwE,kBAAO,QAAI7B,IAAAA,CACjC,cACA,EAEA,aAAoB,CAClB1gD,KAAAA,eACE,KAEEtwB,KAAO,IACLvF,EAEFmE,CAEGP,GAAAA,QAEsB,CAE7B,CACK,CAWL,CAAA,CAEJ,EAAA,CAAAiyE,IAAA9F,GAAAprD,IAAA,UAAAjhB,EAAAC,EAAA,CACF,SAAA,CAAAD,EAAA,OAAA,CACF,MAAA,eACF,SAAA,CAAAG,EAAA4S,GAAA,CAEYmgE,QAAAA,EAAavkE,QAC3B,SAAA7U,EAEOq4B,WAAAA,SACY+gD,EAGrB16E,CAAU,EAAM,IAAAwH,EAAA,OAAA,gCAEOvH,CAAAA,IAAS,IAAA0H,EAAAgD,GAAA,CACtB0xE,SAAgBzG,EAAAA,UAGlByG,cAAmC,CAClC,CAAA,CACP,CAAan7E,EAAkB,CAC1B,EAAA,IAAAyG,EAAA,SAAA,eAG+BquE,MAAAA,0CAClCn3E,GAAA,CACWA,EAAA,eAAA,EACJshD,EAAAA,gBAAAA,EACEy1B,EAAA,QAAA,eACIxzE,CASTuwE,SAAAA,sBAEyF,CAErFvsE,CAENs2E,EAGMnC,MAAAA,EAGJ,CACF,GAAA,QAAA,CAEA,EAEEngE,SAAavb,EAAMuJ,EAAA,CAEVwpC,KAAAA,KAAAA,OAAAA,aAAAA,UAAAA,CACT,CAAA,CAAElqC,CAAAA,CAOF,CAAKO,EAAMT,EAAAC,EAAA,CAA2BC,SACpCF,CAAAA,EAAAmC,EAAA,CAAAjC,GAAAA,YAEI,CACEG,EAAAA,IAAKL,EAAA,SAAA,CACLS,KAAM,eACGH,kCACPyxC,QAAQojC,GAAK,CACf99E,EAAA,eAAA,EAAE6I,EAAAA,gBAEG,EAACW,EAAK,QAAA,SAAA,CAAeC,IAAK,EAAKC,SAAGzE,QAAAA,CAAAA,CAAAA,EAAE,OAAA,CAAA0yE,GAAA,QAAAqE,GAAA,MAAM/2E,EAAI,CAGrD61E,GAAAA,SACAjyE,OACEF,CAAMS,EAAMuuE,GAAA,MAAA,CACD,CACa18D,EACpBxY,SACA41C,CAAAA,EAAU9uC,EAAA,CACVw0E,KAAAA,UAAK,CACN,EAAEpG,GACHhvE,OAAA,CAAAkM,EAAAlE,GAAAqtE,IAAAA,EAAA,UAAAhgE,GAAAA,EAAA,YAAAnJ,EAAA,SAAA,IAAAlE,EAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAAkoE,GAAA/vE,EAAAsS,GAAA,CAAMhS,IAAAA,EAAM,QAAA,cAAAyvE,EAAA,QAAA,OAAehwE,IAAAA,EAAC,oBAEb,WACDmsE,SAAWvpE,GAAAA,EAAAA,EACd,QAAA,EAAA,CAAA,EAAAksE,GAAA,OAAA,GAAAhvE,EAAAC,EAAA,CAAO,SACd,CAAA,IAAAE,EAAA,OAAA,CACG,MAAA,gBACD,SACRmxB,GAAA09C,GAAA,MAAA,CAAA,CACE3uE,CAAAA,CAAK,CACLI,CAAAA,CAAM,CAAA,CACNH,CACEjJ,CAAAA,CAAAA,CACAA,CAAAA,EAAAA,EAAE83B,MAAAA,CACFi/C,MAAAA,cAAqC,SACnC1qD,CAAAA,EAAAA,SAAU,CAAA,KACVC,SAAO,MACR,4BAAA,MACH,CACAngB,QAAKlH,IAAAA,OAAAA,GAAAA,MAAAA,EAAAA,QAAE,IAAA,CAAA2xE,EAAA,IAAA,EAAAj7B,EAAiB,OAAA,OAAA,EAACA,EAAA,OAAA,YAAA,EAAC9yC,SAEzBU,MAAI,EAAAqyC,EACG2/B,CAAgB,CAAwB,EAC9C,MACKt2E,EAGX4D,CACY1F,GAAA,QAAA,CACV,EACO,SACC2F,EAAAS,EAAA,CACNN,KAAAA,UAEEjJ,KAAEmJ,GACFnJ,CAAAA,CACAshD,CAAAA,EAAAA,IAAAA,WAAsBpd,CAAS,KAC7B5wB,SAAK,MACL+Y,uBAAU,QACX,IAAA,CACH1pB,EAAA,mBACArB,GAASq2E,EAAUp0E,CAAUy4E,EACxB/2E,SAAAA,EAAAA,EAAAA,CAAAA,KAAE,UAAA,KAAA9B,IAAA,IAAAC,EAAcG,CAA+B,GAAA,QAAA,CAAC,CAEhD,CAAA,CAAM,CAAA,EAAUoF,EACpBgvE,GAAAA,CAQU,MAELt8D,MAEmBgP,OAEnB3gB,CACgC,OAN3BmvE,EAON,OAIH,EAEE,WAAMzvE,EAAM,SAAA,CAAA,KAAeP,SACM,MAC1B,gBAAA,SAEVC,EAAAS,EAAA,CACM,KAAA,OAEZ,IAAAtE,EAEQ,IACT6D,QAAA,CACO,EAEL0B,KAAO,IAAA,CACL0a,CAAoC,CACtC,EACAjc,SAASA,CAAAA,EAAM2C,GAAA,CACbgrE,SAAAA,IAAgB,UAChBj7B,QAAAA,KACAA,EAAAA,kBACAA,EACAC,SAAAA,CAAAA,EAAgBD,EAAAA,CAClB,KAAA,SAAA,CACAxvC,EAAAA,EAAKlH,OAAAA,CAAAA,SAAAA,EAAAA,EAAAA,CAAE,GAAA,QAAA,CAAA9B,CAAA,CAA0B,CAAA,CAAA,CAAC,EAAAwF,EAAAiD,GAAA,CAAC/C,6BAE7BW,QAAK,IAAA,CAAUC,EAAKk0E,IAAA,OAAA,KAAA,MAAA,EAAKhiC,EAAA,OAAA,OAAA,EAEhC0+B,EACCvxE,OAAA,YAAA,EACO60E,IAAA,OACLv0E,EAAM,OAAA,MAAA,EAEJzG,EAAOowC,IAAAA,OAAAA,MAAAA,EAET6I,EAAAD,CAAA,CAAE9yC,EAEIW,SAAK,CAAAV,EAAAS,EAAA,CAAUE,KAAK,CAAIC,GAAGzE,UAAAA,KAAAA,SAAAA,EAAE04E,GAAA,EAAA,CAAA,CAAA,EAAAx6E,EAAA,OAAA,CAAS,SAAA8B,EAAA04E,IAAA,OAAI,CAGnD9hE,GAAAA,QAAK,GAKJ,GAAA,QAAA,CAJM,CAMS,CAASzS,CAAAA,CAAM,CAAA,EAAeP,EAAAA,GACxCU,CAAI,QAAM,IAAA,CAAUtE,MAAAA,KAAAA,EAAAA,QAAAA,iBAAAA,sEAAAA,CAAAA,EAAAA,QAAAA,IAAAA,CAAEg5E,GAAA,MAAA,CAAA,CAAA,CAAA,EAAM,SAAC,CAAAn1E,EAAAS,EAAA,CAAEE,KAAK,UAAA,CAAM,EAAA,IAAAX,EAAA,OAAA,CACrC,SAAAA,EAAAgC,EAAA,CACTjC,GAAA,QAEQ,EACe,GAEpBlG,CAAAA,EAAAA,EAAAA,GAAOowC,CAAAA,CAAAA,EAAAA,EAAAA,GAAAA,CACT,UAAA,QAAElqC,SAAAC,EAEFA,EAAK,CAACU,GAAAA,QAAK,CAAW,CACtB,CAAA,EAAAX,EAAAA,GACEiC,CAAA,SAAA,CAAA4vE,IAAAG,GAAA,QAAqB,IAAA,CAChB,MAAA3K,EAAAH,GAAAiF,EAAA,GAAA,EAETrsE,EACE0C,SAAU,KAAA6kE,EAER0G,MAAAA,EAEAj7B,YAEEA,CAA0B,CAC5B,CACiC,EAEjCC,SAAAA,CAAAA,EAAAA,EAAgBD,CAClB,KAAA,UAAA,CAAE9yC,EAAAA,EAAAA,QAEDU,CACCC,MACE,oBAAA,SACMvE,EAAAy1E,GAEJiD,CAGN70E,GAAA,SAAAD,QACsB5D,EAAAA,GAAAA,UAAAA,EAAAA,CAAAA,CAChB,EAA2BA,CAC3B,GAAA,QAAA,CADA,CACqB,CAAA,CAAC,CAAA,CAAA,EACrB0D,EAAAiD,GAAA,CACC,SACTA,CAAAA,GAAQge,IAAA,WAAA,CAAAorD,GAAA,UAAA,CAAA6B,EAAA,QACP5tE,QAASA,EAEP,cAAgB2M,CAKhBsoE,KAAAA,MACED,CAAAA,EAAAA,EAAAA,OAAa,CACf,SAACh5E,EACD4D,CAEIW,GAAK,QAAA,CACX,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwC,CAAA,EAACV,EACpC4T,GAAA,CAAA,MAET5T,0BACW,GAACuC,EAAU,SAAOxC,IAC3BiC,CAAA,KAAA,IAAA,KAA0B,KAChB,IACZnC,GAGI,GAAMunE,QACN,CACE/3D,CAAgB+3D,CAAAA,CAEhBhsD,CAAAA,CAAAA,CAAKjf,CAAAA,CAAAA,CAAAA,CAAAA,CAAC,CAAA,EAAA6D,EAAA4qE,GAAA,CAAA,CAAA,EAAAhuE,EAAA,QAAAsvE,EAAArsE,EAAA,KAAA,CAAA,MAAA,iCAAkBihB,IAAA,UAAA,UAAA,EAAA,GAAA,SAAA,CAAA8zD,GAAC1gD,GAAA,GAAAl0B,EAAA,KAAA,CAAA,MAAA,6BAC3B,SACFH,EAAA,SAAA,CAAA,KAAEE,SAEG,MAACW,wBAAK,SACXV,IAAA,UAAA,QAAOM,IAAM6wE,GAAA9qD,GAAAA,EAAAqF,EAAA,EAAA,OACEvvB,eAAAA,KAAAA,EACT,sBAAA23E,GAAA,KAAA,GAAA,EAAA,SAAAx5E,CAAAA,EAAAA,MAAA,CAAA,MAAA,mBAEA,SAACsC,EAAA,MAAAzC,GAAAA,GAAA,CAAA,EAAA,IAAAqU,GAAAxO,EAAAsS,GAAA,CAAA,IAAE9D,EAAA,QAAA,YAACrS,EAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CAAAA,EAAAA,IACJ0D,EAAA,MAAA,CAAA,MAAA,KAAA,SAA2B,CAAAG,EAAAgC,EAAA,CAAA,GAAC,QAAA,CAAA,EAC1B,IAAAhC,EAAA,OAAA,CACA,MACVH,MACEwC,SACE6xB,GAACjM,GACDnH,GAAAA,EAAAA,MAEkBxoB,CAAAA,CAEpB6H,CAASiuE,CAAAA,CAAAA,CAEJ,CAAA,CAAM,CAAA,CAAA,CACX,CAAA,EAAAvuE,EAAAC,EAAA3D,CAAAA,SAAAA,CAAAA,IAAAA,WAAAA,EAAAA,KAAAA,CAAAA,MAAAA,wCAAO,SAAA6D,EAAA3F,KAAA,CAAA,SAA6B2F,EAAA+0B,GAAA,CAAA,SAAC,GAAA,KAAQ,GAAA,CAAA,CACpC,CAAA,CAER,CAAA,EAAAjU,IAAO,SAAAjhB,EAAA,IAAA,CAAA,MAA0BkC,WAAIqqE,SAAUrsE,CAAAA,IACjDU,CAAI,GAACC,QAAK,CAAA,EAAAV,EAAIW,KAAK,EAAA,EAAAX,EAAA,KAAA,CAAA,CAAA,EAAAA,EAAA,SAAA,CAAA,KAAKY,SAAGzE,QAAAA,IAAAA,CAAAA,EAAE,kBAAA,EAAA,SAAO6D,EAAAgC,EAAA,CAAA,GAAC,QAAA,CAAA,CAAG,CAAA,CAAC,CACrC,CAAA,CAAA,CACH,CAAA,CAAA,CACH,CAAA,CAIL,CAAA,CAE0C,CAKtC,SAAAyxE,GAAU,CAAA,QAAArnD,EACR,SAAAzyB,EACO,gBAAAq6E,EACC,MAAA3E,EACgB,UAAA4E,EACkB,QAAAoB,EACjC,WAAAC,CAAkB,EAAA,CAAM,KAAA,CACe,EAAAt4D,CAE9C,EAAA9jB,GAAKoH,EAAM,CAAAuyC,EAAkB9yC,CAEjByM,EAAMrS,GAAkBqI,EACzB+yE,EAELhjE,GAAoBC,EAAAA,OAAAA,CAAAA,EAAAA,IAAAA,CAAAA,KAAAA,CAGvB,aAAAyoC,EAEH,QAAK36C,CAAM,EAAA6pC,EACTiC,EAAAopC,GAAA,QAAAv6B,EAAA,OAAA75B,EAA0BgrB,EAC1BpsC,EAAAw1E,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,EACoCthD,EAC7B9H,EAAA,OAAAmpD,EAAAnpD,CAAA,EAAAqpD,EACHrpD,EAAA,SAAAspD,EAAAh5E,EACA0vB,EAAA,IAAA2D,GAAAA,EAAA,OAAA,EAAA,OAAA,CAAAhkB,EAAAlE,EAAAqtE,IAAAA,EAAA,UAAAhgE,GAAAA,EAAA,KAAAnJ,EAAA,EAAA,IAAAlE,CAAA,EAAA,MAAA,EAAA,CAAA,EAAC8tE,EAEZxhE,GAAA,IAGHtU,GAAAC,OAAAA,CAAAshB,EAAA+oB,IAAApqC,EACG+gB,GAAAA,OACCmzD,CAAI3zE,EAAM,CAAA2zE,EAAuCl0E,GAC/C,MAAA,CAAA,EAAA,IAAA8iB,EAAA9iB,IACSs1E,GAAoBM,GAAAtK,IAIhCvqD,CAAAA,GAAY40D,IACX,GAAShG,GAAAtjD,EAAA,CAAA,CAAA,EAAA,KAAUvJ,EACjB7gB,IAAA,MAAA4zE,EACAtK,GACAl/C,KACA,EAAA,EAAAymD,EACOtzE,GAAA,CAAArI,EAAA2Q,EAAAi0B,EAAAttB,IAAA,CAAAtX,EAAA,iBAEH2C,EAAAA,gBAAOowC,EAAAA,EACT,CAAA,MAAElqC,EAAAA,EAEF,cAAAyO,EAAA,EAAA,CAAA,CAAuB,EAAA,CAAA,CAAA,EAChBqnE,EAEZz9E,EAAA,EAAA0iC,GAEJ,IAAA,CAAA,SACEY,EAAAxkC,EAAA,CACsBA,EAAA,OAAA,QAAA,WAAAA,EAAA,OAAA,UAEjC,CAEA,OAAA2+E,EAASpC,SAAY,iBAAA,SAAA/3C,EAAA,CACnBtP,QAAAA,EAAAA,CACAzyB,EACAq6E,IAAAA,CACA3E,EAAAA,SAAAA,oBAAAA,SAAAA,CAAAA,CACA4E,CACAoB,EAAAA,CAAAA,CAAAA,EACAC,KAAAA,CAAAA,EAAAA,CAAAA,EAAAA,EAAAA,GAAAA,CAAAA,EACFj9E,EAAG,IAAA,CACD,IAAMsmB,EAAE1lB,MAAAA,CAAAA,GAAAA,CAAAA,IAAGC,EAAAA,WAAA,IAAA48E,EAAA,EAAA,EAAA,GAAA,GAILP,IAAAA,aAAYnpD,CAAY,CAC5B,EAAA,CAAAwpD,EAAOxpD,CAAQw3C,CAAAA,EACb,MAAAmS,EAAMlzD,EAAA,MAAA,UAAEo4B,EAAAA,IAAAA,UAAAA,OAAc7uB,EAAAA,EAAAA,CAAAA,IAAQypD,EAC9B,MAAA,UACA,KAAAG,EAAa5pC,GAAiBhgB,EAAAA,OAChC,SAAI4pD,EAAA9+E,GAAA,CACN,KAAA,CACMw+E,KAAAA,CACN,EAAMD,EAAAA,OAGNnK,GAAiBl/C,EACT2D,CAAAA,EAAAA,EAAMA,EAAE5d,CAIhB,EAAMwjE,OACJ,MAAOvpD,CACL,mBAAoBwjD,CAAAA,EAExB,wBAEA,+BAAWP,EAAA,EACX,SAAIgG,CAAS,CAAAxyD,GAAAhjB,EAAA,UAAA,CACXgjB,MAAO,kBACT,SACEA,SAAO,CAAA7iB,EAAA,OAAA,CACT,MAAYg0E,UACV,SAAMiC,EAAavG,IAAAA,GAAAA,EAAiBtjD,GAAU,oBAEhD,MAAA,GAAArgB,EAAA,WAAA,KAAAA,EAAA,QAAA,GACM6pE,SAAAA,GAAatK,GAEnB,QACEp0E,CAAEmJ,EAAAA,EAAAA,OAAe,CACf2uB,MAAAA,iBACF8jB,SAAAA,CAAAA,EAAgB,IAAA,UACH9yC,EAAAgC,EAAA,aAEZ,OAAA,CACE,EAAAoqB,EAAA,YAEqBA,EAAA,MAAA,CAC1B0O,EACE,YAGIz5B,EAAO60E,EAAAA,OAAQj7C,CACnB,MAAA7O,EAAA,MACAypD,CAAWv9E,CAAkD,CAClD,CACV,CACD,CAAA,EAAO,CAAAm9E,GAAMC,EAAA,GAAA71E,EAAAC,EAAA,CACX+1E,SAAWv9E,CAAAA,IAASmjC,IAAAA,IAAAA,EAAAA,OAAoB,CAC1C,SAAAz7B,EAAAgC,EAAA,CACG,GAAA,SAGEm0E,OAAAA,CACG,EAAMhlD,GAAAukD,CAAA,EACV/2D,cAAAA,CACJ,EACUnlB,WAAW,CACrB,EAAAwG,EAAA,OAAA,QAC+B,CAC7B41E,CAEJ,CACA,EAEA,GACY,CACHC,CAAAA,CAAAA,CACLv1E,EAAAA,EAAMG,EAAA,CACNoiB,KAAMmzD,eACN3V,MACE2V,yBAEM,CAAA,EAAA,CAAA,CAAMV,GAAAt1E,EAAA4T,GAAA,CAAEiP,MAAAA,yBAAWxhB,EAAAA,GAEnBiqE,QAAAA,EAAoBl/C,QAEtB3tB,MAAAA,EAGJ,CACF,GAAA,QAAA,CACqB4wE,EACmBtvE,SAEtC8iB,GACA,CAASviB,CAAAA,CAAM,CAAA,EAAkB9H,GAAQqqB,EAAAA,KAAAA,CAAK9iB,WAC5C,IAAAgwB,GAAAlwB,EAAA,KAAA,CAAMS,SAAM,CAAAT,EAAA,MAAA,sBAIN0S,SAAOC,EACPnP,SAAU0I,CAAAA,EAAEuV,GAAW,UACbvV,EAAG8gB,GAHR9gB,SAAAA,EAOXlM,cAAA,GAAMS,KAAM,IAAgBP,gBAC1B,GAAAA,aACEiC,EAAA3H,eAAA,EAAA,CAAA,EAAAC,CAAAA,EAAAA,SAAA,QAAAy1B,EAAA,aAAA,GAAAlwB,EAAA,MAAA,CAAA,MACSusB,eAAQ3xB,SAKR02B,CAAAA,EAAAA,EAAc/E,CAAe,KAAA,WAAAzoB,IAAAA,EAD1BN,CAEA,GAAA,QAAA,CAAC,CAIZ,CAEDoyE,QAAaC,OAAAA,OAEV3lD,EAAA,aAEDhwB,YACEgwB,EAAA,YAAA,CAAA,CAAA,CAAA11B,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA01B,EAAA,iBAMuB2lD,EAAAA,GAAa,CAAA,SAAA/7E,EAAC+7E,QALf3lD,EAAA,QAAA,MAAApsB,EAAAA,MAAA,YAIhBgyE,EAAA5lD,EAAA,OAAA,QAAAslD,EAAaK,WAEP,CAAA,GAAC/7E,EAAA,IAAAA,CAAA,MAAAo2B,EAAA,EAAA,GAAA,MAAAA,EAAA,EAAA,GAAA,QAIZ,IAAA,CACI07C,GAAA17C,EAAA,EAAA,CAEV,CAAA,CAEE,CAACrvB,CAAAA,CAAK,EAAeJ,EAAAA,EAAAA,CAAAA,CAAM,CAAA,CAAyB,CAElD,CAAA,CACG,CACSyB,MAAAA,GACK5B,IAAAA,GACf6c,GAAAA,GAAAA,GAAAA,GAAE,IAAAy0D,GAAA,IAAA,IAAA,SAAA/B,GAA4BlhE,EAAA,CAAA,MAAC4nE,EAAA3E,GAAA,IAAAjjE,EAAA,EAAA,EAAA,GAAA4nE,EACrC,OAAAA,EAAA,KAGF,CAAA,YAAA/iD,EAIH,QAAA6J,EAEI,iBAAA3a,EAQE,KAAAjb,EAAW,KAAAo0C,CAAyB,EAAAltC,EAC3B/T,KACOJ,EAAAA,CAAAA,EAAAA,EACZV,GAAAA,OAAAA,GAAAA,EAAAA,GACAy5E,GAAa,SAAA,QAAA,GAAAiD,GAAAC,EACR56B,IAAAn5B,GAAA,QAAAjb,GAAA,SAAA,QAAA,EAAAivE,GACU3G,GAAfyD,EAAemD,EAAAC,EAAAH,GACDzD,GAAAA,OAAAA,GACde,IAAAA,EAAc,GAAAhE,CAAA,EAAAA,CAGd,CAAW,MAAA76C,GAAch1B,GAAAA,EACtBU,EC3xDrB,SAAwBi2E,IAAc,CACpC,MAAMpgF,EAASsuD,GAAAA,EACT,CAAEvqD,GAAAA,EAAIV,SAAAA,CAAAA,EAAarD,EACzB,OAAO0J,EAAC+0B,GAAM,CAAC16B,GAAAA,EAAQV,SAAAA,CAAAA,CAAqB,CAC9C,CCRA,MAAAg9E,GAAe,gECAfC,GAAe,sECAfnwC,GAAe,6DCAfowC,GAAe,uECAfC,GAAe,uECAfC,GAAe,oxJCiBT,CACJvP,wBAAyBC,GACzBz4D,eAAgBC,GAChB+I,0BAA2BC,GAC3B++D,yCAA0CC,EAC5C,EAAI/nE,GACEgoE,GAAUjoE,GACZA,GAAQjB,QAAQ,eAAgB,EAAE,EAAEA,QAAQ,MAAO,EAAE,EACrD,KACE/R,GACF,GAAGk7E,2BAAe3qE,MAAM,EAAG,EAAE,EAAEwB,QAAQ,KAAM,GAAG,CAAC,WAKrD,SAASopE,IAAU,CACjB,KAAM,CAAEn+E,EAAAA,CAAAA,EAAGC,GAAAA,EACX2tD,OAAAA,GAAS,KAAM,CAAC,IAAK,UAAU,CAAC,EAE9BhnD,EAAA,OAAA,CAAMxF,GAAG,UAAS0F,UAChBF,EAAA,MAAA,CAAKS,MAAM,iBAAgBP,UACzBF,EAAA,MAAA,CAAKS,MAAM,eAAcP,UACvBF,EAAA,KAAA,CAAAE,UACEC,EAAA,MAAA,CACEwc,IAAK3I,GACLjT,IAAI,GACJ8J,MAAM,MACNC,OAAO,MACPjJ,MAAO,CACL+a,YAAa,MACbilC,eAAgB,GAAA,CAClB,CACD,EACD1hD,EAAA,MAAA,CAAKwc,IAAKu6D,GAAUn2E,IAAI,SAAS8J,MAAM,KAAA,CAAO,CAAC,CAAA,CAC7C,EACJ1K,EAAA,IAAA,CAAGM,MAAM,OAAMP,SACbC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6D,CAAA,CAC5D,EACH2F,EAAA,IAAA,CAAAD,SACEC,EAAC4T,GAAI,CACH7R,GACE0lE,GACI,mBAAmBA,EAAgB,YACnC,SAENnnE,MAAM,SAAQP,SAEG5D,EAAhBsrE,GAAmB,CAAAptE,GAAA,QAAA,EAAY,CAAAA,GAAA,QAAA,CAAJ,CAA2B,CACnD,CAAA,CACL,EACFotE,IAAoBwP,IACnBj3E,EAAA,IAAA,CAAAD,SACEC,EAAA,IAAA,CAAGiT,KAAMgkE,GAAmC32E,MAAM,gBAAeP,SAC/DC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAqB,CAAA,CACpB,CAAA,CACF,EAEJ,CAACotE,IACAznE,EAAA,IAAA,CAAGM,MAAM,gBAAeP,SACtBC,EAAA,QAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAsJ,WAAA,CAAAC,EAEE5D,EAAA,KAAA,CAAA,CAAK,CAAA,CAAC,CAED,CAAA,CACF,CAAA,CACN,CACJ,CAAA,CACE,GACHk3E,IAAWj7E,KACX+D,EAAA,IAAA,CAAGM,MAAM,mBAAkBP,SACzBF,EAAA,QAAA,CAAAE,SAAA,CACGm3E,GAAQ,IAAEj7E,EAAU,CAAA,CAChB,CAAA,CACN,EAEL+D,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,SAAAsJ,WAAA,CAAAC,EACE5D,EAAA,IAAA,CAAGiT,KAAK,oCAAoC5R,OAAO,QAAA,CAEhD,EAACwC,EAEJ7D,EAAA,IAAA,CACEiT,KAAK,mCACL5R,OAAO,SACPlB,QAAUjJ,GAAM,CACdA,EAAEmJ,eAAAA,EACFxG,EAAO+iB,YAAc,yBACvB,CAAA,CAGC,EAACtY,EAEJtE,EAAA,IAAA,CAAGiT,KAAMgF,GAAoB5W,OAAO,QAAA,CAEjC,CAAA,CAAC,CAEC,CAAA,CACN,EACHrB,EAAA,MAAA,CAAAD,SACEC,EAAC+T,GAAY,CAAA,CAAE,CAAA,CACZ,CAAC,CAAA,CACH,EACL/T,EAAA,MAAA,CAAK3F,GAAG,gBAAe0F,SACrBF,EAAA,MAAA,CAAKS,MAAM,WAAUP,UACnBF,EAAA,UAAA,CAAAE,UACEC,EAAA,MAAA,CACEwc,IAAKm6D,GACL/1E,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAA+B,EACpCqwB,QAAQ,MAAA,CACT,EACD1qB,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA6B,CAAA,CAC3B,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAGO,CAAA,CACN,CAAC,CAAA,CACG,EACTwF,EAAA,UAAA,CAAAE,UACEC,EAAA,MAAA,CACEwc,IAAKs6D,GACLl2E,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAsC,EAC3CqwB,QAAQ,MAAA,CACT,EACD1qB,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoC,CAAA,CAClC,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAEO,CAAA,CACN,CAAC,CAAA,CACG,EACTwF,EAAA,UAAA,CAAAE,UACEC,EAAA,MAAA,CACEwc,IAAKo6D,GACLh2E,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAqC,EAC1CqwB,QAAQ,MAAA,CACT,EACD1qB,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAmC,CAAA,CACjC,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAGO,CAAA,CACN,CAAC,CAAA,CACG,EACTwF,EAAA,UAAA,CAAAE,UACEC,EAAA,MAAA,CACEwc,IAAKiqB,GACL7lC,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAA+B,EACpCqwB,QAAQ,MAAA,CACT,EACD1qB,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoC,CAAA,CAClC,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAGO,CAAA,CACN,CAAC,CAAA,CACG,EACTwF,EAAA,UAAA,CAAAE,UACEC,EAAA,MAAA,CACEwc,IAAKq6D,GACLj2E,IAAGzE,EAAE,CAAA9B,GAAA,QAAA,CAAuE,EAC5EqwB,QAAQ,MAAA,CACT,EACD1qB,EAAA,KAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAAoC,CAAA,CAClC,EACJ2F,EAAA,IAAA,CAAAD,SACEC,EAAAgC,EAAA,CAAA3H,GAAA,QAAA,CAA+D,CAAA,CAC9D,CAAC,CAAA,CACG,CAAC,CAAA,CACP,CAAA,CACF,CAAC,CAAA,CACF,CAEV,CCvMA,MAAMg9E,GAAclhF,OAAOilB,MACtBjlB,OAAOmhF,gBAAenhF,OAAOmhF,cAAgBD,IAElDlhF,OAAOilB,MAAQ,SAAU9D,EAAS,CAIhCA,aAAA,OAAAA,GAAA,UACAA,EAAWA,EAAA,SAGX,OAAAA,GAAA,WACAA,EAAWA,KAAAA,UAAYA,CAAU,GAEjC,MAAA+yB,EAAAktC,GAAA,CAEA,KAAMltC,EACJpjB,UAAM3P,QACN/U,QAAS,MACTi1E,SAAS,SACT/sD,SAAU,IACVQ,OAAQ,CACR+6B,EAAAA,EACEr9C,EACF,QAAC,IAAA,CACDxI,EAAO,UAAQ,EAEf,CAAA,EACFkqC,EAAE,UAAA,GCiDJl0C,OAAOshF,WAAa59E,EACpB1D,OAAOuhF,iBAAmB,IAAM,CAC9B,MAAMtzE,EAAO,CACX,WACA,WACA,WACA,gBACA,cAAc,EAEVuzE,EAAS,CAAA,EACfvzE,EAAKgD,QAASrJ,GAAQ,CACpB45E,EAAO55E,CAAG,EAAI0a,OAAOrU,KAAKvK,EAAOkE,CAAG,CAAC,EAAEtD,MACzC,CAAC,EACD/B,KAAAA,CAEA,SAAAkE,CAAM,EAAEA,EAAa/C,EAAAA,CAAAA,EACrB,0BACkB+C,cAAU,yBAAAmB,CAAA,8BAAAA,CAAA,IAAA,GAI1B65E,EAAY,KAAA75E,CAAA,CAEZ,EAEFrF,YAAQqkB,IAAK,CACf,GAAA,CAAA,OAAA,SAAA,OAKA86D,KAAAA,CAEI,SAAAj7E,EACA,cAAAk7E,EAAQl7E,cAAAA,CAAAA,EAAUk7E,EAAAA,IAAe79E,EAAAA,EAAc,KAAIJ,CACnD,SAAAF,CACA,EAAAwB,GAAM,EAAA,UAAExB,KAAAA,EAAAA,IAAawB,CAAAA,OAAI,SAAA,MACzB,GAAA,CACE,QAAY+lD,SAAU,cAAA,yBAAAnjD,CAAA,8BAAAA,CAAA,IAAA,EAClBg6E,EAAA99E,EAAA,KAAAwhE,GAAA19D,IAAA6xC,GAAA6rB,EAAA,QAAA,GAAA9hE,CAAA,CAAA,EACF,GAAA,CAAAq+E,GAAc5hF,CAAAA,EAAS2I,CAGvB,OAAMg5E,EAAAA,SAAAA,CAAsB99E,EAG5B,OAAK+9E,EAAUD,aAAAA,CAAAA,EACb,UAAOl+E,OAAmB,CAC1B,MAAOA,IAAuBuyD,CAAA,EAE5B,MADiB0rB,EAAe,GAAAG,EAAA,QAAA,IAC1BA,GACN,OAAMvgC,EAAO9H,cAAUqoC,CAAS59E,EAChC,KACE,CACA,CAAA69E,GACF,CAEFA,MAAAA,CAAAA,CACF,CACW,EACf,GAAA,GAAA,GAAA,EACA,WAAIA,IAAW,CACbx/E,UAAQkD,KAAKu8E,GACf,WAAA,IAAA,OAGJ,QAAAA,GAAAz3E,CAAA,CAAA,EAKAlH,GAAWkH,CAAM,EAAA,CAAA,IAAA,SACIy3E,GAAOz3E,CAAA,GAAA,SACxBlH,GAAAA,CAAW,EAAA,SAAM,EAEb2+E,GAAMz3E,CAAI,IAAA,CAEVy3E,EAAAA,CAAAA,CAEAA,EAAAA,GAAAA,GAAc,IAChB,CAAA,OACE,SAAA,GACN,MAAAC,EAAA,CAAA,YAAA,YAAA,SAAA,UAAA,aAAA,cAAA,cAAA,OAAA,EACKC,EAAA,IAAA,CAEN,OAAM,SAAA,EACLliF,EAWMkiF,EAAgB/iF,GAAA+iF,EAVhBD,GAUgB,EACpBjiF,EAAO+qD,IAAW,CACpB,OAAA,SAAA,GACAo3B,EAAkB,CAClB,EACAF,UAAkBG,GAAM,CACtBpiF,OAAO+qD,iBAAW7qD,EAAAkiF,EAAA,CAClBD,QAAAA,GACF,QAAA,EACAF,CAAAA,CACEjiF,CAAAA,EAA0C,OACxCylC,iBAAS,OAAAy8C,EAAA,CAAA,QACTG,EAAS,CAAA,EAEb,SAAC,gBAAA,iBAAA,aAAAthF,GAAA,CACDf,CAAOwC,EAAAA,6BACLijC,EAAS,CAGXxlC,EAAAA,CAGI,QAAOqiF,EACLJ,CAAAA,CAAQ,GAAA,EACV,MAEFK,GAAA,mBAAA,KAAA,UAAA,SAAA,EACE98C,IACF,SACF,iBAAA,mBAAA,IAAA,CAYC,GAAA,SAAA,kBAAA,UAAA,CAKC88C,GADU,SAAwBtiE,uBAAmB,uBAAA,EAAA,OAAA,EAC9C,OACThgB,MAASuC,EAAAA,GAAAA,mBACP,IAAIvC,EAGF,GAAA4jB,GAIA,GAFA8iB,EAAI67C,SAAAA,cAAmB,uDAAA,EAEjB3+D,EAAAA,CACF8iB,MAAAA,EAAAA,EAAAA,QACA9iB,EAAOA,IAAA,QAAA8iB,EAAA,QAAA,oBAAAA,EAAA,QAAA,mBAETA,EAAQ1mC,WACN,GAEF,WAAW,IAAA,CACT0mC,UAAcA,CACd,EAAA,EAAA,CAIAA,MACAtjC,CACEsjC,MAAAA,EAAgB5M,OAAAA,WAAAA,8BAAAA,EAAAA,QAAAA,OAAAA,QAEpB,GAFoBA,EACb,SAAA,cAAA,oCAAA+M,CAAA,IAAA,EACPH,EAAA,CACF,MAAO5M,EAAA4M,EAAA,QAAA,UAEe3mC,EAAAA,QAAOqb,YAK3BsrB,EAAQ1mC,QAAS2I,GACf,GAEF,WAAW,IAAA,CACT+9B,EAAM5M,SACN,EAAA,EAAA,CACA4M,CACAtjC,CACEsjC,CAAgB5M,CAAAA,EAEpB,CACF,MACFlW,EAAAvG,GAAA,MAAA,IAAA,OAAA,EACF,GAACuG,EAAA,CACH,SAAA,gBAAA,UAAA,IAAA,MAAAA,CAAA,EAAA,EAEA,SAAA,cAAA,2BAAA,EAAA,aAAA,UAAAA,GAAA,YAAA,EACE,MAAMA,EAAczE,SAAU,cAAO,mCAAA,EAEjCyE,IAEF5jB,EAAS6jB,KAAAA,cACT7jB,UACiB4jB,IAAA,QAAAI,EACdoqC,QAAAA,kBAAiC,QAAY,gBAM/B,SAAA,iBAAA,iCAAA,EACfpqC,QAAYpF,GAAO,CACnBoF,EAAAA,KAAAA,EAIF,CAAA,CAEA,CAGAC,MAAAA,EAAWjT,GAASkT,MAAM,IAAA,UAAA,EACxBA,GACF,SAAC,gBAAA,MAAA,YAAA,cAAA,GAAAs+D,CAAA,IAAA,CAEH,CACAr9E,GAAIq9E,EAAUvvC,GAAA,CACZjzC,SAAS6jB,OAAsBY,CAAAA,IAAYwuB,EAAA,CAC7C,GAAA5D,EAAA,KAAA,GAAA,IAAA,6BAAA,CACF,MAAAozC,EAAA,SAAA,eAAA,KAAA,EAEUh/E,IACRg/E,EAAW,QAACx0E,kBAAqBilC,aAAuB,OAAA/uC,EAAA,GAGpD,CACAkrC,EAAIozC,KAAM,GAAA,IAAA,sBACH3C,SAAQr4E,KACf,UAAA,OAAA,QAAAtD,CAAA,CAIF,CACE,CAAA,EACAu+E,MAAAA,GAAuB,IAAA,IAAc,OACvC,gBAAA,IAAA,IAAA,OACF,YAAA,CACD,MAAA9jE,EAAA,CAMG,EAEA,IAAAA,EAAI+jE,CASF,CACAC,EAemD,SACrD,KAAA,UAAA,OAAA,iBAAAvlE,GAAA,MAAA,IAAA,sBAAA,GAAA,EAAA,EAEJ,SAAAwlE,IAAA,CAEA,KAAA,CAAAjgF,EAAAkgF,CAAA,EAAA7/E,EAAA,EAAA,EAGEjD,CAAAA,GAAwBmkB,EAAAA,EACtB,SAAA,EAGJ,YAAA,MAAA,UAAA,EAEA,YAAS0+D,MAAM,mBAAA,EACb,YAAOjgF,MAAAA,cAAyB,EAChC,YAAO8nB,MAASzD,sBAChB0hC,GAAAA,EACAA,EAAAA,KACAA,MAAAA,EAAkBtrC,GAAA,MAAc,IAAA,aAAA,EAChCsrC,sBAAkB,OAAoB,SAAA,OAAA,MAAA,cAAA,GAAA,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,EACtC9qC,GAAAA,EAAU,CAEV5b,OAAU,QAAM,aAAA,GAAA,SAAA,MAAA,OAAA,SAAA,UAAA,GAAA,EACd,KAAMgW,CACN,UAAa8qE,EAITpoE,cAAMyC,EACR9a,UAAAA,CAAY,EAAEqY,GAAAA,CAAAA,GAAAA,CAAAA,EAAM0G,EAAA2hE,GAAA/qE,CAAA,GAAAgrE,EAEpBljF,uBAEWkN,cACFgM,GAGT,SAAM,CACJgB,EAAWipE,SAAAA,EACXxoE,KAAAA,CACAuoE,aAAAA,CAAAA,EACE3Q,MAAAA,GAAAA,CACJ,YAAAr6D,EACA,UAAM5B,EAEL,cAAY+G,EACX6J,KAAAA,EACA,cAAM5Q,GAAA,MAAA,CAAA,EAA4B,GAAIwkC,EAAMsoC,CAC1ClrE,MAAAA,EAAAA,GAAAA,CACAgC,SAAWipE,EACXxoE,YAAAA,CAAe0C,CACfzC,EACAC,yBAAevE,CAAAA,GAAYhO,CAAAA,EAAAA,GAAAA,EAAAA,CAAAA,EAAAA,GAAAA,EAAAA,EAAAA,EAAAA,CAAAA,CAAAA,CAAAA,EAC5B+6E,GAAA,EAED,OAAIvoC,6BAAa,GACfioC,IAAeO,EAAWp8D,EAAE1jB,SAAU0U,CAAAA,MAAyBgP,EAAC,OAAA,EAMhEm8D,YAAAA,IAAW,UAAA,CACXrjF,GAAAA,CAEA+iF,KAAAA,CACA77D,OAAAA,6BAAoB,GAAA,MACtBq8D,EAAO,oBAAA,OAAA,SAAA,OAAA,MAAA,iBAAA,GAAA,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,EACLr8D,IAAAA,EAaF,GAZAq8D,IACA36B,EAAAA,GAAgB26B,CAAU,EACzBvnE,IACLW,GAAOX,EAAA,KAAA,EAAA,EACLhc,OAAOwjF,QAAAA,aAAAA,GAAAA,SAA+B,MAAA,OAAA,SAAA,UAAA,GAAA,IAKlCD,IACFvnE,EAAUynE,GAAWF,GAErBvnE,EAAIA,CACFW,GAAAA,EAAoBX,OAAa9X,EACjClE,KAAAA,CAKF,OAAAmgE,CAAA,EACFn7D,GAAA,CACI,QAAAgX,CACFA,CAAAA,EACF,CACIA,SAAAA,CACFW,EAAAA,EACA0mE,GAAM,EAAAn8D,EAAEi5C,SAAAA,YAAe,CAAEnkD,GAAAA,CAAS0nE,GAAA,GAAAC,GAAAngF,CAAA,GAC5BogF,GAAAzjB,CAAA,EAAE38D,GAAAA,EAAAA,CAAAA,GAER6/E,MAAW,QAAA,WAAA,CAAAO,GAAAzjB,CAAA,EAAA0jB,GAAA1jB,EAAA38D,CAAA,CAAA,CAAA,CAEV,MAAY,CACX,QAAA,CACEu/E,EAAIW,EAAAA,EAEFE,EAAAA,SAAgBzjB,EAChB0jB,YAAAA,cAAqBrgF,CAAQ,CAE7B,GAAA,CAGC,MACH0jB,EACOnmB,SAAG,EAAA,YACZ,IAAA,UAAA,CAEEmmB,CACA0hC,GAAAA,cAAY70C,IAAI,UAAU,EAAAuJ,GAC5B,cAAA,IAAA,cAAA,EAAAA,GACF,cAAG,IAAA,cAAA,CAAA,EAAA,CAAA,CACL,EACE4J,IAAAA,EAAAA,GAAoB,EAEtB,OADE0hC,EAAAA,gBAAgB1vC,EAAU,SAAAhX,EAC5BqmB,GAAA,CAAArP,EAAArW,CAAA,CAAA,EACF,YAAA,KAAAqW,EAAA,QAAA,EAGM4qE,EAAAA,KAAkB,EAExBxmE,IAAMwmE,UACHj6E,EAAA4jB,GAAA,CAEDvU,gBACJxV,CAAAA,EAOIgG,EAAAC,EAAiBuP,CACnB,SAAOrP,CAAAA,EAACknE,GAAW,CACrB,WAAAluE,CAEA,CAAA,OAA2B,CACzB,WAAAA,CAAc,CAAA,EAACqB,EAAG6/E,GAAA,CAAe,SAAAl6E,EAAAm6E,GAAA,CACnC,KAAA,oBAEA,QACEr6E,EAAAA,GAAA,CAAA,CAAA,CAAA,CAAAC,CACgB,CAAA,EAAC/G,GAAAA,EAAAA,GAAAA,CAAAA,CAAAA,EAAAA,GAAAA,EAAAA,GAAAA,CAAAA,CAAAA,EAAAA,EAAAA,GAAAA,EAAAA,EAAAA,GAAAA,EAAAA,GAAAA,CAAAA,CAAAA,EAAAA,EAAAA,GAAAA,CAAyB,WAAAA,CACxB,CAAA,EAACA,GAAAA,EAAAA,GAAAA,CAAAA,CAAAA,EAAAA,EAAAA,GAAAA,CAAyB,QACzCkhF,EAAM,CAAA,EAAAn6E,EAAAA,GACC,EAAA,CAAA,CAAA,CAAA,CAAM,CAA2C,SAAIq6E,GAAA,CAAA,WAAAphF,CAM3C,EAAA,CAACA,UAEL,YAAU0lB,IAAAA,oBAAAA,EAExB1lB,EAAAgH,EAAAmmE,GAAA,CAAA,CAAA,EAAAnmE,EAAAo3E,GAAA,EAAA,CAEN,CAEA,MAAAiD,GAActhF,GAAA,CAAA,CAAEC,WAAAA,CAAW,IAAG,CAC5B,MAAIA,EAAYymB,GAAA,EACds/B,EAAgB5qC,GAAA,IAAoB,CACtC,KAAA,CACA,SAAA1E,CACF,EAAAJ,EAEA,MAAMgrE,CAAAA,+BAAsB,KAAA5qE,CAAA,CAAEzW,EAAAA,CAAAA,CAAAA,CAAAA,EAAW,OAAM6G,EAAAq6E,GAAA,CAC7C,YAA6B7qE,EAC7B,SAAMirE,CAAAA,EAAAA,IACJ,KAAM,IAAE7qE,QAAAA,EAAAA,GAAAA,CAAaJ,WAAAA,CACrB,CAAA,CAAoD,CACnD,EAACA,EAAAA,GAAS,CAEb,sBACoBirE,EAAAA,GAAAA,CAAAA,CAAAA,CAAmBjrE,CAAStP,EAAAA,EAAAA,GAC3Co6E,CAAM10C,KAAK,WAAI75B,QAAS5L,EAACo6E,GAAI,CAAA,CAAA,CAAA,CAAA,EAACphF,MAEe,CAEtC,CAAA,CACC,CAAA,EAEM,SAAC0b,IAAWkP,CAAM,OAAA/pB,EAAI,cAAA,IAAA,CAAkB,SAAEkG,GAChDw6E,CAAS,WAAAvhF,CACF,EAAA,CAGf,MACKqW,EAAAoQ,GAAA,EAEX+6D,EAAApiF,EAAAqiF,IAAA,EAKD,OAHSA,GAAkB,OACXnwC,mBAAgBj7B,EAAA,QAAA,GAAAi9D,GAAA,SAAAj9D,EAAA,QAAA,EAChC,CAAAA,EAAA,SAAAi9D,EAAA,CAAA,EAC2BtzE,EAAAA,UAAAA,EAAAA,QAAAA,GAAAA,GAEzBwhF,EAAiB/6D,QAAY,KAIvBi7D,EAAAA,IACJ,SACEpO,WAA8Bj9D,EAGlC,SAAIA,CAASI,KAAoB3P,EAAA,CAC7B46E,SAAAA,CAAAA,EAAaP,GAAA,CACX,KAACK,iBAEP,QAAOx6E,EAAAs9D,GAAA,CAAA,CAAA,CACLkd,CAAAA,EAAAA,EAAAA,GAAAA,CACF,KAAA,YACA9hF,QAAcsH,EAAA87D,GAAA,CAAA,CAAA,CAAA,SAEZzsD,KAAAA,aACD,QAAArP,EAAAq2D,GAAA,CAAA,CAAA,CAED,CAAA,IACG6jB,GAAAA,CAAO7qE,KAAUmrE,KAAuCz6E,QACtD/G,EAAAA,GACC6G,CAAAA,CAAAC,CAAA,CAAAC,EAAAA,EAAAA,GACGo6E,CAAM10C,KAAK,KAAiB75B,QAAS5L,EAACs9D,GAAAA,CAAAA,CAAAA,CAAe,CAAI,EAC1Dt9D,EAACm6E,GAAK,CAAC10C,KAAK,KAAY75B,SAAS5L,CAAAA,EAAC87D,GAAAA,CAClC97D,MAACm6E,GAAM10C,QAAKzlC,EAAAqnE,GAAA,CAAA,CAAA,CAAA,CAAaz7D,EAAAA,EAAS5L,GAACq2D,CACnCr2D,KAACm6E,MAAM10C,QAAKzlC,EAAA84D,GAAA,CAAA,CAAA,CAAA,CAAKltD,CAAAA,CAAqB,CAAI,EAC1C5L,EAACm6E,GAAK,CAAC10C,KAAK,MAAK75B,QAAS5L,EAACqzD,GAAY,CAAA,CAAA,CAAA,CAAI,EAC3CxzD,EAAAA,GAACs6E,CAAM10C,KAAK,MAAI1lC,QAAAA,EACdC,GAAM,CAAA,CAAA,CAAA,CAAA,EAACsgB,EAAAA,GAAK,CAAA,KAAC1U,MAAmB,QAC/BuuE,EAAAA,GAAK,CAAA,CAAA,CAAA,CAAA,EAAC10C,EAAAA,GAAK,CAAA,KAAM75B,WAAkB,QAAG5L,EAAA2pD,GAAA,CAAA,CAAA,CAAA,CAClC,EACP3pD,EAACm6E,GAAK,CAAC10C,KAAK,uBAAM75B,QAAS5L,EAACo2D,GAAAA,CAAAA,CAAAA,CAAkB,CAAI,CAAA,CAC5C,CAAA,EAAC3wB,EAAAA,GAAK,CAAA,KAAM75B,yBAA4B,QAC7CuuE,EAAAA,GAAK,CAAA,CAAA,CAAA,CAAA,EAAC10C,EAAAA,GAAK,CAAA,KAAM75B,oBAAqB,QACtCuuE,EAAAA,GAAK,CAAA,CAAA,CAAA,CAAA,EAAC10C,EAAK00C,GAAA,CAAA,KAAWvuE,gBAAqB,SAC3CuuE,CAAAA,EAAKA,GAAA,CAAC10C,MAAK,GAAuB75B,QAAS5L,EAACmoD,GAAAA,CAAAA,CAAAA,CAAc,CAAI,EAACnoD,EAAAm6E,GAAA,CAGpEn6E,KAACm6E,IAAM10C,QAAKzlC,EAAAoiE,GAAA,CAAyBx2D,MAAS5L,EAAU,CACxDA,CAAM,CAACylC,CAAAA,CAAK,CAAA,EAAoB75B,EAAAA,GAAU+4C,CAAqB,KAC/D9kD,uBAAO4lC,QAAKzlC,EAAAokE,GAAA,CAAA,CAAA,CAAA,CAAA,EAAerkE,EAAAA,GACzBC,CAAM,KAACsgB,qBAAK,QAAC1U,EAAS5L,GAACoiE,CAAAA,CAAM,CAAE,CAAA,CAAE,CAC3B,CAAA,CAAM,CC9kBpBuY,GAAAA,EACAC,GAAAA,EAMAh3B,GACE5jD,EAAC66E,GAAY,CAAC7mE,KAAAA,GAAWjU,SACvBC,EAAC86E,GAAU,CAAA/6E,SACTC,EAAC+6E,GAAkB,CAAAh7E,SACjBC,EAACi5E,GAAG,CAAA,CAAE,CAAA,CACY,CAAA,CACV,CAAC,CACD,EACd7iF,SAASyoB,eAAe,KAAK,CAC/B,EAGArlB,WAAW,IAAM,CACf,GAAI,CAEFif,OAAOrU,KAAK42E,YAAY,EAAE5zE,QAASrJ,GAAQ,CACrCA,EAAIm0B,WAAW,SAAS,GAC1B8oD,aAAaC,WAAWl9E,CAAG,CAE/B,CAAC,EACD0a,OAAOrU,KAAK82E,cAAc,EAAE9zE,QAASrJ,GAAQ,CACvCA,EAAIm0B,WAAW,SAAS,GAC1BgpD,eAAeD,WAAWl9E,CAAG,CAEjC,CAAC,EAGDi9E,aAAaC,WAAW,yBAAyB,CACnD,MAAY,CAAC,CACf,EAAG,GAAI,EAGP,GAAI,kBAAmB7kE,WAAa,OAAO+kE,OAAW,IAAa,CAEjE,MAAMC,EAAoB,CAAC,OAAO,EAClC,IAAIC,EAAe,GACnB,MAAMC,EAAgB,IAChBC,EAAgB,GAAK,GAAK,IAChC,eAAeC,GAAc,CAC3B,GAAIrlF,OAAO+qD,SACT,GAAI,CACF,MAAM98C,EAAO,MAAM+2E,OAAO/2E,KAAAA,EAC1B,UAAWrG,KAAOqG,EAAM,CACtB,GAAIg3E,EAAkBzsE,SAAS5Q,CAAG,EAAG,SACrC,MAAM09E,EAAQ,MAAMN,OAAOt4D,KAAK9kB,CAAG,EAC7B29E,EAAQ,MAAMD,EAAMr3E,KAAAA,EAC1B,GAAIs3E,EAAMjhF,OAASkhF,GAAmB,CACpCjjF,MAAAA,EAAagjF,EAAA,MAAkB39E,EAAiB,EAChD,UAAM69E,KAAaF,EACnB,MAAAD,UAAwBG,CACM,CAC9B,CAEJP,EAAA,EACAA,MAAAA,CACF,CACF,WAAAG,EAAAH,EAAAE,EAAAD,CAAA,CAEA9hF,CACF,WAAAgiF,EAAAF,CAAA,CACA9hF,CACF,OAAA,UAAA,IAAA,CAEArD,wBAAyB,OAAA,OAAA,CACvBC","x_google_ignoreList":[0,1,6,7,33,34,35,36,37,38,39,40,41,42,43,44,45,46,50]} |