{"version":3,"file":"index.cjs","sources":["../app/components/hooks/useToolDock.ts","../app/components/windows/DraggableWindow.tsx","../node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../node_modules/next/dist/shared/lib/loadable-context.shared-runtime.js","../node_modules/next/dist/shared/lib/loadable.shared-runtime.js","../node_modules/next/dist/shared/lib/dynamic.js","../node_modules/next/dynamic.js","../app/components/windows/WindowLayer.tsx","../app/components/tools/registry.ts","../app/components/ToolsDock.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type ToolId =\n  | \"calculator\"\n  | \"periodic\"\n  | \"ruler\"\n  | \"protractor\"\n  | \"equation\"\n  | \"todo\"\n  | \"magnifier\"\n  | \"tts\"\n  | \"geogebra\"\n  | \"dictionary\"\n  | \"browser\"\n  | \"context7\"\n  | \"askai\"\n  | \"setsquare\"\n  | \"annotator\"; // extend as tools grow\n\nexport type ToolDockState = {\n  activeTool: ToolId | null;\n  isOpen: boolean;\n};\n\nexport function useToolDock(initialTool: ToolId | null = null) {\n  const [state, setState] = useState<ToolDockState>({\n    activeTool: initialTool,\n    isOpen: initialTool != null,\n  });\n\n  const openTool = useCallback((tool: ToolId) => {\n    setState({ activeTool: tool, isOpen: true });\n  }, []);\n\n  const close = useCallback(() => {\n    setState((s) => ({ ...s, isOpen: false }));\n  }, []);\n\n  const toggleTool = useCallback((tool: ToolId) => {\n    setState((s) => {\n      const isSame = s.activeTool === tool;\n      if (isSame) {\n        return { ...s, isOpen: !s.isOpen };\n      }\n      return { activeTool: tool, isOpen: true };\n    });\n  }, []);\n\n  return useMemo(\n    () => ({ state, openTool, close, toggleTool }),\n    [state, openTool, close, toggleTool]\n  );\n}\n","\"use client\";\n\nimport { Rnd } from \"react-rnd\";\nimport type { RndResizeCallback } from \"react-rnd\";\nimport { useCallback } from \"react\";\nimport { useWindowStore } from \"./windowStore\";\nimport type { WindowRecord } from \"./windowTypes\";\n\nexport default function DraggableWindow({\n  win,\n  children,\n}: {\n  win: WindowRecord;\n  children: React.ReactNode;\n}) {\n  const updateBounds = useWindowStore((s) => s.updateBounds);\n  const closeWindow = useWindowStore((s) => s.closeWindow);\n  const focusWindow = useWindowStore((s) => s.focusWindow);\n\n  const onDragStop = useCallback(\n    (_e: unknown, d: { x: number; y: number }) => {\n      updateBounds(win.id, { x: d.x, y: d.y });\n    },\n    [win.id, updateBounds]\n  );\n  const onResizeStop = useCallback<RndResizeCallback>(\n    (_e, _dir, ref, _delta, position) => {\n      updateBounds(win.id, {\n        width: parseInt((ref as HTMLDivElement).style.width, 10),\n        height: parseInt((ref as HTMLDivElement).style.height, 10),\n        x: position.x,\n        y: position.y,\n      });\n    },\n    [win.id, updateBounds]\n  );\n\n  const isResizable = win.isResizable !== false;\n  const isFrameless = win.isFrameless === true;\n  const contentStyle: React.CSSProperties | undefined = isFrameless\n    ? {\n        transform: `rotate(${\n          win.rotationDeg ?? 0\n        }deg) translateZ(0)` as unknown as string,\n        transformOrigin: \"center\",\n      }\n    : undefined;\n\n  return (\n    <Rnd\n      style={{ zIndex: win.zIndex }}\n      size={{ width: win.bounds.width, height: win.bounds.height }}\n      position={{ x: win.bounds.x, y: win.bounds.y }}\n      minWidth={win.minWidth}\n      minHeight={win.minHeight}\n      bounds=\"window\"\n      cancel=\".no-drag\"\n      enableResizing={\n        isResizable\n          ? {\n              top: true,\n              right: true,\n              bottom: true,\n              left: true,\n              topLeft: true,\n              topRight: true,\n              bottomLeft: true,\n              bottomRight: true,\n            }\n          : false\n      }\n      disableDragging={false}\n      onDragStart={() => focusWindow(win.id)}\n      onDragStop={onDragStop}\n      onResizeStart={() => focusWindow(win.id)}\n      onResizeStop={onResizeStop}\n    >\n      {isFrameless ? (\n        <div className=\"relative h-full w-full group\" style={contentStyle}>\n          {children}\n          <button\n            type=\"button\"\n            className=\"no-drag absolute top-1 right-1 h-7 w-7 rounded-md bg-white/70 dark:bg-black/40 border border-[--color-border] shadow flex items-center justify-center text-foreground hover:bg-white/90 dark:hover:bg-black/60 transition-opacity opacity-0 group-hover:opacity-100 focus:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[--color-border] z-20 pointer-events-auto\"\n            aria-label=\"Close\"\n            title=\"Close\"\n            onClick={() => closeWindow(win.id)}\n          >\n            <svg\n              width=\"14\"\n              height=\"14\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              aria-hidden=\"true\"\n            >\n              <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n              <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n            </svg>\n          </button>\n        </div>\n      ) : (\n        <div className=\"rounded-lg border border-[--color-border] bg-background shadow-xl h-full w-full flex flex-col overflow-hidden\">\n          <div className=\"h-10 px-3 flex items-center justify-between border-b border-[--color-border] cursor-move select-none\">\n            <div className=\"font-medium text-sm\">{win.title}</div>\n            <button\n              className=\"h-8 px-3 rounded-md bg-[--surface] hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[--color-border]\"\n              onClick={() => closeWindow(win.id)}\n              aria-label=\"Close window\"\n            >\n              Close\n            </button>\n          </div>\n          <div className=\"flex-1 p-3 overflow-auto\">{children}</div>\n        </div>\n      )}\n    </Rnd>\n  );\n}\n","\"use strict\";\n\nfunction _interop_require_default(obj) {\n    return obj && obj.__esModule ? obj : { default: obj };\n}\nexports._ = _interop_require_default;\n","'use client';\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"LoadableContext\", {\n    enumerable: true,\n    get: function() {\n        return LoadableContext;\n    }\n});\nconst _interop_require_default = require(\"@swc/helpers/_/_interop_require_default\");\nconst _react = /*#__PURE__*/ _interop_require_default._(require(\"react\"));\nconst LoadableContext = _react.default.createContext(null);\nif (process.env.NODE_ENV !== 'production') {\n    LoadableContext.displayName = 'LoadableContext';\n}\n\n//# sourceMappingURL=loadable-context.shared-runtime.js.map","// TODO: Remove use of `any` type.\n/**\n@copyright (c) 2017-present James Kyle <me@thejameskyle.com>\n MIT License\n Permission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n The above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE\n*/ // https://github.com/jamiebuilds/react-loadable/blob/v5.5.0/src/index.js\n// Modified to be compatible with webpack 4 / Next.js\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nObject.defineProperty(exports, \"default\", {\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n});\nconst _interop_require_default = require(\"@swc/helpers/_/_interop_require_default\");\nconst _react = /*#__PURE__*/ _interop_require_default._(require(\"react\"));\nconst _loadablecontextsharedruntime = require(\"./loadable-context.shared-runtime\");\nfunction resolve(obj) {\n    return obj && obj.default ? obj.default : obj;\n}\nconst ALL_INITIALIZERS = [];\nconst READY_INITIALIZERS = [];\nlet initialized = false;\nfunction load(loader) {\n    let promise = loader();\n    let state = {\n        loading: true,\n        loaded: null,\n        error: null\n    };\n    state.promise = promise.then((loaded)=>{\n        state.loading = false;\n        state.loaded = loaded;\n        return loaded;\n    }).catch((err)=>{\n        state.loading = false;\n        state.error = err;\n        throw err;\n    });\n    return state;\n}\nfunction createLoadableComponent(loadFn, options) {\n    let opts = Object.assign({\n        loader: null,\n        loading: null,\n        delay: 200,\n        timeout: null,\n        webpack: null,\n        modules: null\n    }, options);\n    /** @type LoadableSubscription */ let subscription = null;\n    function init() {\n        if (!subscription) {\n            // eslint-disable-next-line @typescript-eslint/no-use-before-define\n            const sub = new LoadableSubscription(loadFn, opts);\n            subscription = {\n                getCurrentValue: sub.getCurrentValue.bind(sub),\n                subscribe: sub.subscribe.bind(sub),\n                retry: sub.retry.bind(sub),\n                promise: sub.promise.bind(sub)\n            };\n        }\n        return subscription.promise();\n    }\n    // Server only\n    if (typeof window === 'undefined') {\n        ALL_INITIALIZERS.push(init);\n    }\n    // Client only\n    if (!initialized && typeof window !== 'undefined') {\n        // require.resolveWeak check is needed for environments that don't have it available like Jest\n        const moduleIds = opts.webpack && typeof require.resolveWeak === 'function' ? opts.webpack() : opts.modules;\n        if (moduleIds) {\n            READY_INITIALIZERS.push((ids)=>{\n                for (const moduleId of moduleIds){\n                    if (ids.includes(moduleId)) {\n                        return init();\n                    }\n                }\n            });\n        }\n    }\n    function useLoadableModule() {\n        init();\n        const context = _react.default.useContext(_loadablecontextsharedruntime.LoadableContext);\n        if (context && Array.isArray(opts.modules)) {\n            opts.modules.forEach((moduleName)=>{\n                context(moduleName);\n            });\n        }\n    }\n    function LoadableComponent(props, ref) {\n        useLoadableModule();\n        const state = _react.default.useSyncExternalStore(subscription.subscribe, subscription.getCurrentValue, subscription.getCurrentValue);\n        _react.default.useImperativeHandle(ref, ()=>({\n                retry: subscription.retry\n            }), []);\n        return _react.default.useMemo(()=>{\n            if (state.loading || state.error) {\n                return /*#__PURE__*/ _react.default.createElement(opts.loading, {\n                    isLoading: state.loading,\n                    pastDelay: state.pastDelay,\n                    timedOut: state.timedOut,\n                    error: state.error,\n                    retry: subscription.retry\n                });\n            } else if (state.loaded) {\n                return /*#__PURE__*/ _react.default.createElement(resolve(state.loaded), props);\n            } else {\n                return null;\n            }\n        }, [\n            props,\n            state\n        ]);\n    }\n    LoadableComponent.preload = ()=>init();\n    LoadableComponent.displayName = 'LoadableComponent';\n    return /*#__PURE__*/ _react.default.forwardRef(LoadableComponent);\n}\nclass LoadableSubscription {\n    promise() {\n        return this._res.promise;\n    }\n    retry() {\n        this._clearTimeouts();\n        this._res = this._loadFn(this._opts.loader);\n        this._state = {\n            pastDelay: false,\n            timedOut: false\n        };\n        const { _res: res, _opts: opts } = this;\n        if (res.loading) {\n            if (typeof opts.delay === 'number') {\n                if (opts.delay === 0) {\n                    this._state.pastDelay = true;\n                } else {\n                    this._delay = setTimeout(()=>{\n                        this._update({\n                            pastDelay: true\n                        });\n                    }, opts.delay);\n                }\n            }\n            if (typeof opts.timeout === 'number') {\n                this._timeout = setTimeout(()=>{\n                    this._update({\n                        timedOut: true\n                    });\n                }, opts.timeout);\n            }\n        }\n        this._res.promise.then(()=>{\n            this._update({});\n            this._clearTimeouts();\n        }).catch((_err)=>{\n            this._update({});\n            this._clearTimeouts();\n        });\n        this._update({});\n    }\n    _update(partial) {\n        this._state = {\n            ...this._state,\n            error: this._res.error,\n            loaded: this._res.loaded,\n            loading: this._res.loading,\n            ...partial\n        };\n        this._callbacks.forEach((callback)=>callback());\n    }\n    _clearTimeouts() {\n        clearTimeout(this._delay);\n        clearTimeout(this._timeout);\n    }\n    getCurrentValue() {\n        return this._state;\n    }\n    subscribe(callback) {\n        this._callbacks.add(callback);\n        return ()=>{\n            this._callbacks.delete(callback);\n        };\n    }\n    constructor(loadFn, opts){\n        this._loadFn = loadFn;\n        this._opts = opts;\n        this._callbacks = new Set();\n        this._delay = null;\n        this._timeout = null;\n        this.retry();\n    }\n}\nfunction Loadable(opts) {\n    return createLoadableComponent(load, opts);\n}\nfunction flushInitializers(initializers, ids) {\n    let promises = [];\n    while(initializers.length){\n        let init = initializers.pop();\n        promises.push(init(ids));\n    }\n    return Promise.all(promises).then(()=>{\n        if (initializers.length) {\n            return flushInitializers(initializers, ids);\n        }\n    });\n}\nLoadable.preloadAll = ()=>{\n    return new Promise((resolveInitializers, reject)=>{\n        flushInitializers(ALL_INITIALIZERS).then(resolveInitializers, reject);\n    });\n};\nLoadable.preloadReady = (ids)=>{\n    if (ids === void 0) ids = [];\n    return new Promise((resolvePreload)=>{\n        const res = ()=>{\n            initialized = true;\n            return resolvePreload();\n        };\n        // We always will resolve, errors should be handled within loading UIs.\n        flushInitializers(READY_INITIALIZERS, ids).then(res, res);\n    });\n};\nif (typeof window !== 'undefined') {\n    window.__NEXT_PRELOADREADY = Loadable.preloadReady;\n}\nconst _default = Loadable;\n\n//# sourceMappingURL=loadable.shared-runtime.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n0 && (module.exports = {\n    default: null,\n    noSSR: null\n});\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    /**\n * This function lets you dynamically import a component.\n * It uses [React.lazy()](https://react.dev/reference/react/lazy) with [Suspense](https://react.dev/reference/react/Suspense) under the hood.\n *\n * Read more: [Next.js Docs: `next/dynamic`](https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading#nextdynamic)\n */ default: function() {\n        return dynamic;\n    },\n    noSSR: function() {\n        return noSSR;\n    }\n});\nconst _interop_require_default = require(\"@swc/helpers/_/_interop_require_default\");\nconst _jsxruntime = require(\"react/jsx-runtime\");\nconst _react = /*#__PURE__*/ _interop_require_default._(require(\"react\"));\nconst _loadablesharedruntime = /*#__PURE__*/ _interop_require_default._(require(\"./loadable.shared-runtime\"));\nconst isServerSide = typeof window === 'undefined';\n// Normalize loader to return the module as form { default: Component } for `React.lazy`.\n// Also for backward compatible since next/dynamic allows to resolve a component directly with loader\n// Client component reference proxy need to be converted to a module.\nfunction convertModule(mod) {\n    return {\n        default: (mod == null ? void 0 : mod.default) || mod\n    };\n}\nfunction noSSR(LoadableInitializer, loadableOptions) {\n    // Removing webpack and modules means react-loadable won't try preloading\n    delete loadableOptions.webpack;\n    delete loadableOptions.modules;\n    // This check is necessary to prevent react-loadable from initializing on the server\n    if (!isServerSide) {\n        return LoadableInitializer(loadableOptions);\n    }\n    const Loading = loadableOptions.loading;\n    // This will only be rendered on the server side\n    return ()=>/*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, {\n            error: null,\n            isLoading: true,\n            pastDelay: false,\n            timedOut: false\n        });\n}\nfunction dynamic(dynamicOptions, options) {\n    let loadableFn = _loadablesharedruntime.default;\n    let loadableOptions = {\n        // A loading component is not required, so we default it\n        loading: (param)=>{\n            let { error, isLoading, pastDelay } = param;\n            if (!pastDelay) return null;\n            if (process.env.NODE_ENV !== 'production') {\n                if (isLoading) {\n                    return null;\n                }\n                if (error) {\n                    return /*#__PURE__*/ (0, _jsxruntime.jsxs)(\"p\", {\n                        children: [\n                            error.message,\n                            /*#__PURE__*/ (0, _jsxruntime.jsx)(\"br\", {}),\n                            error.stack\n                        ]\n                    });\n                }\n            }\n            return null;\n        }\n    };\n    // Support for direct import(), eg: dynamic(import('../hello-world'))\n    // Note that this is only kept for the edge case where someone is passing in a promise as first argument\n    // The react-loadable babel plugin will turn dynamic(import('../hello-world')) into dynamic(() => import('../hello-world'))\n    // To make sure we don't execute the import without rendering first\n    if (dynamicOptions instanceof Promise) {\n        loadableOptions.loader = ()=>dynamicOptions;\n    // Support for having import as a function, eg: dynamic(() => import('../hello-world'))\n    } else if (typeof dynamicOptions === 'function') {\n        loadableOptions.loader = dynamicOptions;\n    // Support for having first argument being options, eg: dynamic({loader: import('../hello-world')})\n    } else if (typeof dynamicOptions === 'object') {\n        loadableOptions = {\n            ...loadableOptions,\n            ...dynamicOptions\n        };\n    }\n    // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () => <p>Loading something</p>})\n    loadableOptions = {\n        ...loadableOptions,\n        ...options\n    };\n    const loaderFn = loadableOptions.loader;\n    const loader = ()=>loaderFn != null ? loaderFn().then(convertModule) : Promise.resolve(convertModule(()=>null));\n    // coming from build/babel/plugins/react-loadable-plugin.js\n    if (loadableOptions.loadableGenerated) {\n        loadableOptions = {\n            ...loadableOptions,\n            ...loadableOptions.loadableGenerated\n        };\n        delete loadableOptions.loadableGenerated;\n    }\n    // support for disabling server side rendering, eg: dynamic(() => import('../hello-world'), {ssr: false}).\n    if (typeof loadableOptions.ssr === 'boolean' && !loadableOptions.ssr) {\n        delete loadableOptions.webpack;\n        delete loadableOptions.modules;\n        return noSSR(loadableFn, loadableOptions);\n    }\n    return loadableFn({\n        ...loadableOptions,\n        loader: loader\n    });\n}\n\nif ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {\n  Object.defineProperty(exports.default, '__esModule', { value: true });\n  Object.assign(exports.default, exports);\n  module.exports = exports.default;\n}\n\n//# sourceMappingURL=dynamic.js.map","module.exports = require('./dist/shared/lib/dynamic')\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useWindowStore } from \"./windowStore\";\nimport DraggableWindow from \"./DraggableWindow\";\nimport type { WindowRecord } from \"./windowTypes\";\nimport dynamic from \"next/dynamic\";\n\nconst Calculator = dynamic(() => import(\"../calculator/Calculator\"), {\n  ssr: false,\n});\nconst PeriodicTable = dynamic(() => import(\"../periodic/PeriodicTable\"), {\n  ssr: false,\n});\nconst Ruler = dynamic(() => import(\"../ruler/Ruler\"), { ssr: false });\nconst Protractor = dynamic(() => import(\"../protractor/Protractor\"), {\n  ssr: false,\n});\nconst EquationEditor = dynamic(() => import(\"../equation/EquationEditor\"), {\n  ssr: false,\n});\nconst Todo = dynamic(() => import(\"../todo/Todo\"), { ssr: false });\nconst Magnifier = dynamic(() => import(\"../magnifier/Magnifier\"), {\n  ssr: false,\n});\nconst TTSReader = dynamic(() => import(\"../tts/TTSReader\"), {\n  ssr: false,\n});\nconst GeoGebra = dynamic(() => import(\"../geogebra/GeoGebra\"), {\n  ssr: false,\n});\nconst Dictionary = dynamic(() => import(\"../dictionary/Dictionary\"), {\n  ssr: false,\n});\nconst Context7 = dynamic(() => import(\"../context7/Context7\"), {\n  ssr: false,\n});\nconst Browser = dynamic(() => import(\"../browser/Browser\"), {\n  ssr: false,\n});\nconst AskAI = dynamic(() => import(\"../askai/AskAI\"), {\n  ssr: false,\n});\nconst SetSquare = dynamic(() => import(\"../setsquare/SetSquare\"), {\n  ssr: false,\n});\nconst Annotator = dynamic(() => import(\"../annotator/Annotator\"), {\n  ssr: false,\n});\n\nfunction WindowContent({ win }: { win: WindowRecord }) {\n  switch (win.type) {\n    case \"calculator\":\n      return <Calculator />;\n    case \"periodic\":\n      return <PeriodicTable />;\n    case \"ruler\":\n      return <Ruler windowId={win.id} />;\n    case \"protractor\":\n      return <Protractor windowId={win.id} />;\n    case \"equation\":\n      return <EquationEditor />;\n    case \"todo\":\n      return <Todo />;\n    case \"magnifier\":\n      return <Magnifier windowId={win.id} />;\n    case \"tts\":\n      return <TTSReader />;\n    case \"geogebra\":\n      return <GeoGebra />;\n    case \"dictionary\":\n      return <Dictionary />;\n    case \"browser\":\n      return <Browser />;\n    case \"context7\":\n      return <Context7 />;\n    case \"askai\":\n      return <AskAI />;\n    case \"setsquare\":\n      return <SetSquare windowId={win.id} />;\n    case \"annotator\":\n      return <Annotator />;\n    default:\n      return null;\n  }\n}\n\nexport default function WindowLayer() {\n  const windows = useWindowStore((s) => s.windows);\n  const order = useWindowStore((s) => s.order);\n  const orderedWindows = useMemo(\n    () => order.map((id) => windows[id]).filter(Boolean) as WindowRecord[],\n    [order, windows]\n  );\n\n  return (\n    <div className=\"fixed inset-0 z-30 pointer-events-none\">\n      {orderedWindows.map((win) => (\n        <div key={win.id} className=\"pointer-events-auto\">\n          <DraggableWindow win={win}>\n            <WindowContent win={win} />\n          </DraggableWindow>\n        </div>\n      ))}\n    </div>\n  );\n}\n","import type { CreateWindowParams, ToolType } from \"../windows/windowTypes\";\nimport type { ToolId } from \"../hooks/useToolDock\";\n\nexport type ToolRegistryEntry = {\n  id: ToolId;\n  label: string;\n  window: Omit<CreateWindowParams, \"type\" | \"title\"> & {\n    title: string;\n    type?: ToolType; // injected automatically when used\n  };\n};\n\nexport const defaultToolRegistry: Record<ToolId, ToolRegistryEntry> = {\n  setsquare: {\n    id: \"setsquare\",\n    label: \"Set Square\",\n    window: {\n      title: \"Set Square\",\n      initialBounds: { width: 380, height: 380, x: 180, y: 140 },\n      minWidth: 280,\n      minHeight: 280,\n      isFrameless: true,\n      isResizable: true,\n      rotationDeg: 0,\n    },\n  },\n  tts: {\n    id: \"tts\",\n    label: \"Read Aloud\",\n    window: {\n      title: \"Read Aloud\",\n      initialBounds: { width: 420, height: 340, x: 180, y: 180 },\n      minWidth: 420,\n      minHeight: 340,\n    },\n  },\n  todo: {\n    id: \"todo\",\n    label: \"Todo\",\n    window: {\n      title: \"Todo List\",\n      initialBounds: { width: 320, height: 360, x: 160, y: 160 },\n      minWidth: 320,\n      minHeight: 360,\n    },\n  },\n  calculator: {\n    id: \"calculator\",\n    label: \"Calculator\",\n    window: {\n      title: \"Calculator\",\n      initialBounds: { width: 300, height: 420 },\n      minWidth: 300,\n      minHeight: 440,\n    },\n  },\n  periodic: {\n    id: \"periodic\",\n    label: \"Periodic Table\",\n    window: {\n      title: \"Periodic Table\",\n      initialBounds: { width: 920, height: 600 },\n      minWidth: 890,\n      minHeight: 620,\n    },\n  },\n  ruler: {\n    id: \"ruler\",\n    label: \"Ruler\",\n    window: {\n      title: \"Ruler\",\n      initialBounds: { width: 800, height: 90, x: 100, y: 100 },\n      minWidth: 200,\n      minHeight: 90,\n      isFrameless: true,\n      isResizable: false,\n      rotationDeg: 0,\n    },\n  },\n  protractor: {\n    id: \"protractor\",\n    label: \"Protractor\",\n    window: {\n      title: \"Protractor\",\n      initialBounds: { width: 640, height: 340, x: 120, y: 120 },\n      minWidth: 320,\n      minHeight: 220,\n      isFrameless: true,\n      isResizable: true,\n      rotationDeg: 0,\n    },\n  },\n  equation: {\n    id: \"equation\",\n    label: \"Equation\",\n    window: {\n      title: \"Equation Editor\",\n      initialBounds: { width: 775, height: 505, x: 140, y: 140 },\n      minWidth: 775,\n      minHeight: 505,\n    },\n  },\n  magnifier: {\n    id: \"magnifier\",\n    label: \"Magnifier\",\n    window: {\n      title: \"Text Magnifier\",\n      initialBounds: { width: 220, height: 220, x: 200, y: 200 },\n      minWidth: 220,\n      minHeight: 220,\n      isFrameless: true,\n      isResizable: false,\n    },\n  },\n  geogebra: {\n    id: \"geogebra\",\n    label: \"GeoGebra\",\n    window: {\n      title: \"GeoGebra\",\n      initialBounds: { width: 920, height: 640, x: 160, y: 120 },\n      minWidth: 720,\n      minHeight: 520,\n    },\n  },\n  dictionary: {\n    id: \"dictionary\",\n    label: \"Dictionary\",\n    window: {\n      title: \"Dictionary\",\n      initialBounds: { width: 520, height: 520, x: 200, y: 160 },\n      minWidth: 420,\n      minHeight: 420,\n    },\n  },\n  browser: {\n    id: \"browser\",\n    label: \"Browser\",\n    window: {\n      title: \"Browser\",\n      initialBounds: { width: 1024, height: 700, x: 140, y: 120 },\n      minWidth: 720,\n      minHeight: 520,\n    },\n  },\n  context7: {\n    id: \"context7\",\n    label: \"Context7\",\n    window: {\n      title: \"Context7\",\n      initialBounds: { width: 960, height: 640, x: 160, y: 120 },\n      minWidth: 720,\n      minHeight: 520,\n    },\n  },\n  askai: {\n    id: \"askai\",\n    label: \"Ask AI\",\n    window: {\n      title: \"Ask AI\",\n      initialBounds: { width: 600, height: 420, x: 180, y: 140 },\n      minWidth: 520,\n      minHeight: 360,\n    },\n  },\n  annotator: {\n    id: \"annotator\",\n    label: \"Annotator\",\n    window: {\n      title: \"Annotator\",\n      initialBounds: { width: 380, height: 620, x: 160, y: 120 },\n      minWidth: 360,\n      minHeight: 500,\n    },\n  },\n};\n\nexport const defaultToolOrder: ToolId[] = [\n  \"setsquare\",\n  \"tts\",\n  \"todo\",\n  \"calculator\",\n  \"periodic\",\n  \"ruler\",\n  \"protractor\",\n  \"equation\",\n  \"magnifier\",\n  \"geogebra\",\n  \"dictionary\",\n  \"browser\",\n  \"context7\",\n  \"askai\",\n  \"annotator\",\n];\n\nexport type ToolOverride = {\n  label?: string;\n  window?: Partial<CreateWindowParams>;\n};\n\nexport type ToolsDockThemeOptions = {\n  initial?: \"light\" | \"dark\" | \"system\";\n  persist?: boolean;\n  showToggle?: boolean;\n};\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useToolDock, type ToolId } from \"./hooks/useToolDock\";\nimport { useWindowStore } from \"./windows/windowStore\";\nimport WindowLayer from \"./windows/WindowLayer\";\nimport {\n  defaultToolOrder,\n  defaultToolRegistry,\n  type ToolOverride,\n  type ToolsDockThemeOptions,\n} from \"./tools/registry\";\n\nexport type ToolsDockProps = {\n  tools?: ToolId[]; // which tools to show, in order\n  overrides?: Partial<Record<ToolId, ToolOverride>>; // per-tool label/window overrides\n  theme?: ToolsDockThemeOptions; // initial + persistence options\n};\n\nexport default function ToolsDock(props: ToolsDockProps = {}) {\n  const dock = useToolDock();\n  const createWindow = useWindowStore((s) => s.createWindow);\n  const getByType = useWindowStore((s) => s.getByType);\n\n  const tools: ToolId[] =\n    props.tools && props.tools.length > 0 ? props.tools : defaultToolOrder;\n  const overrides = props.overrides || {};\n  const showThemeToggle = props.theme?.showToggle !== false;\n\n  const handleToolClick = (tool: ToolId) => {\n    dock.toggleTool(tool);\n  };\n\n  // Theme initialization and toggling\n  useEffect(() => {\n    const root = document.documentElement;\n    const opts = props.theme || {};\n    const persist = opts.persist !== false; // default true\n    const saved = (() => {\n      if (!persist) return null;\n      try {\n        return localStorage.getItem(\"theme\");\n      } catch {\n        return null;\n      }\n    })();\n    const systemPrefersDark =\n      typeof window !== \"undefined\" &&\n      window.matchMedia &&\n      window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n    const desired =\n      (saved as \"light\" | \"dark\" | null) ||\n      (opts.initial === \"system\" || !opts.initial\n        ? systemPrefersDark\n          ? \"dark\"\n          : \"light\"\n        : opts.initial);\n    if (desired) {\n      root.setAttribute(\"data-theme\", desired);\n    }\n  }, [props.theme]);\n\n  const toggleTheme = () => {\n    const root = document.documentElement;\n    const next = root.getAttribute(\"data-theme\") === \"dark\" ? \"light\" : \"dark\";\n    root.setAttribute(\"data-theme\", next);\n    const persist = props.theme?.persist !== false;\n    if (persist) {\n      try {\n        localStorage.setItem(\"theme\", next);\n      } catch {}\n    }\n  };\n\n  // Compute embed flag after hooks to avoid conditional hook calls\n  const isEmbedMagnifier =\n    typeof window !== \"undefined\" &&\n    new URLSearchParams(window.location.search).get(\"embedMagnifier\") === \"1\";\n  if (isEmbedMagnifier) {\n    return null;\n  }\n\n  return (\n    <div\n      aria-label=\"Tools dock\"\n      className=\"fixed inset-x-0 bottom-0 z-40 flex items-center justify-center pointer-events-none\"\n    >\n      <div className=\"pointer-events-auto mb-4 rounded-full border border-border bg-background/80 backdrop-blur px-2 py-1 shadow-lg flex gap-1 items-center\">\n        {showThemeToggle && (\n          <button\n            className=\"h-9 px-3 rounded-full bg-surface hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n            onClick={toggleTheme}\n            aria-label=\"Toggle theme\"\n          >\n            Theme\n          </button>\n        )}\n        {tools.map((toolId) => {\n          const def = defaultToolRegistry[toolId];\n          if (!def) return null;\n          const override = overrides[toolId];\n          const label = override?.label ?? def.label;\n          const ariaPressed =\n            dock.state.isOpen && dock.state.activeTool === toolId;\n          return (\n            <button\n              key={toolId}\n              className=\"h-10 px-4 rounded-full bg-surface hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent\"\n              onClick={() => {\n                handleToolClick(toolId);\n                const existing = getByType(toolId);\n                if (!existing) {\n                  const baseWin = def.window;\n                  const windowParams = {\n                    type: toolId,\n                    ...baseWin,\n                    ...override?.window,\n                  } as import(\"./windows/windowTypes\").CreateWindowParams;\n                  createWindow(windowParams);\n                }\n              }}\n              aria-pressed={ariaPressed}\n              aria-label={`Toggle ${label.toLowerCase()}`}\n            >\n              {label}\n            </button>\n          );\n        })}\n      </div>\n      <WindowLayer />\n    </div>\n  );\n}\n"],"names":["useToolDock","initialTool","state","setState","useState","openTool","useCallback","tool","close","s","toggleTool","useMemo","DraggableWindow","win","children","updateBounds","useWindowStore","closeWindow","focusWindow","onDragStop","_e","d","onResizeStop","_dir","ref","_delta","position","isResizable","isFrameless","contentStyle","jsx","Rnd","jsxs","_interop_require_default","obj","_interop_require_default_1","exports","LoadableContext","require$$0","require$$1","_default","_react","_loadablecontextsharedruntime","require$$2","resolve","ALL_INITIALIZERS","READY_INITIALIZERS","initialized","load","loader","promise","loaded","err","createLoadableComponent","loadFn","options","opts","subscription","init","sub","LoadableSubscription","moduleIds","require","ids","moduleId","useLoadableModule","context","moduleName","LoadableComponent","props","res","_err","partial","callback","Loadable","flushInitializers","initializers","promises","resolveInitializers","reject","resolvePreload","_export","target","all","name","dynamic","noSSR","_jsxruntime","_loadablesharedruntime","require$$3","isServerSide","convertModule","mod","LoadableInitializer","loadableOptions","Loading","dynamicOptions","loadableFn","param","error","isLoading","pastDelay","loaderFn","module","Calculator","PeriodicTable","Ruler","Protractor","EquationEditor","Todo","Magnifier","TTSReader","GeoGebra","Dictionary","Context7","Browser","AskAI","SetSquare","Annotator","WindowContent","WindowLayer","windows","order","orderedWindows","id","defaultToolRegistry","defaultToolOrder","ToolsDock","dock","createWindow","getByType","tools","overrides","showThemeToggle","handleToolClick","useEffect","root","persist","saved","systemPrefersDark","desired","toggleTheme","next","toolId","def","override","label","ariaPressed","baseWin","windowParams"],"mappings":"uMA0BO,SAASA,EAAYC,EAA6B,KAAM,CAC7D,KAAM,CAACC,EAAOC,CAAQ,EAAIC,WAAwB,CAChD,WAAYH,EACZ,OAAQA,GAAe,IAAA,CACxB,EAEKI,EAAWC,cAAaC,GAAiB,CAC7CJ,EAAS,CAAE,WAAYI,EAAM,OAAQ,GAAM,CAC7C,EAAG,CAAA,CAAE,EAECC,EAAQF,EAAAA,YAAY,IAAM,CAC9BH,EAAUM,IAAO,CAAE,GAAGA,EAAG,OAAQ,IAAQ,CAC3C,EAAG,CAAA,CAAE,EAECC,EAAaJ,cAAaC,GAAiB,CAC/CJ,EAAUM,GACOA,EAAE,aAAeF,EAEvB,CAAE,GAAGE,EAAG,OAAQ,CAACA,EAAE,MAAA,EAErB,CAAE,WAAYF,EAAM,OAAQ,EAAA,CACpC,CACH,EAAG,CAAA,CAAE,EAEL,OAAOI,EAAAA,QACL,KAAO,CAAE,MAAAT,EAAO,SAAAG,EAAU,MAAAG,EAAO,WAAAE,CAAA,GACjC,CAACR,EAAOG,EAAUG,EAAOE,CAAU,CAAA,CAEvC,CC9CA,SAAwBE,EAAgB,CACtC,IAAAC,EACA,SAAAC,CACF,EAGG,CACD,MAAMC,EAAeC,EAAAA,eAAgBP,GAAMA,EAAE,YAAY,EACnDQ,EAAcD,EAAAA,eAAgBP,GAAMA,EAAE,WAAW,EACjDS,EAAcF,EAAAA,eAAgBP,GAAMA,EAAE,WAAW,EAEjDU,EAAab,EAAAA,YACjB,CAACc,EAAaC,IAAgC,CAC5CN,EAAaF,EAAI,GAAI,CAAE,EAAGQ,EAAE,EAAG,EAAGA,EAAE,EAAG,CACzC,EACA,CAACR,EAAI,GAAIE,CAAY,CAAA,EAEjBO,EAAehB,EAAAA,YACnB,CAACc,EAAIG,EAAMC,EAAKC,EAAQC,IAAa,CACnCX,EAAaF,EAAI,GAAI,CACnB,MAAO,SAAUW,EAAuB,MAAM,MAAO,EAAE,EACvD,OAAQ,SAAUA,EAAuB,MAAM,OAAQ,EAAE,EACzD,EAAGE,EAAS,EACZ,EAAGA,EAAS,CAAA,CACb,CACH,EACA,CAACb,EAAI,GAAIE,CAAY,CAAA,EAGjBY,EAAcd,EAAI,cAAgB,GAClCe,EAAcf,EAAI,cAAgB,GAClCgB,EAAgDD,EAClD,CACE,UAAW,UACTf,EAAI,aAAe,CACrB,qBACA,gBAAiB,QAAA,EAEnB,OAEJ,OACEiB,EAAAA,IAACC,EAAAA,IAAA,CACC,MAAO,CAAE,OAAQlB,EAAI,MAAA,EACrB,KAAM,CAAE,MAAOA,EAAI,OAAO,MAAO,OAAQA,EAAI,OAAO,MAAA,EACpD,SAAU,CAAE,EAAGA,EAAI,OAAO,EAAG,EAAGA,EAAI,OAAO,CAAA,EAC3C,SAAUA,EAAI,SACd,UAAWA,EAAI,UACf,OAAO,SACP,OAAO,WACP,eACEc,EACI,CACE,IAAK,GACL,MAAO,GACP,OAAQ,GACR,KAAM,GACN,QAAS,GACT,SAAU,GACV,WAAY,GACZ,YAAa,EAAA,EAEf,GAEN,gBAAiB,GACjB,YAAa,IAAMT,EAAYL,EAAI,EAAE,EACrC,WAAAM,EACA,cAAe,IAAMD,EAAYL,EAAI,EAAE,EACvC,aAAAS,EAEC,WACCU,EAAAA,KAAC,MAAA,CAAI,UAAU,+BAA+B,MAAOH,EAClD,SAAA,CAAAf,EACDgB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,qYACV,aAAW,QACX,MAAM,QACN,QAAS,IAAMb,EAAYJ,EAAI,EAAE,EAEjC,SAAAmB,EAAAA,KAAC,MAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,cAAY,OAEZ,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAA,CAAK,EACpCA,EAAAA,IAAC,QAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAA,CAAK,CAAA,CAAA,CAAA,CACtC,CAAA,CACF,CAAA,CACF,EAEAE,EAAAA,KAAC,MAAA,CAAI,UAAU,gHACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,SAAAjB,EAAI,MAAM,EAChDiB,EAAAA,IAAC,SAAA,CACC,UAAU,0IACV,QAAS,IAAMb,EAAYJ,EAAI,EAAE,EACjC,aAAW,eACZ,SAAA,OAAA,CAAA,CAED,EACF,EACAiB,EAAAA,IAAC,MAAA,CAAI,UAAU,2BAA4B,SAAAhB,CAAA,CAAS,CAAA,CAAA,CACtD,CAAA,CAAA,CAIR,8JCtHA,SAASmB,EAAyBC,EAAK,CACnC,OAAOA,GAAOA,EAAI,WAAaA,EAAM,CAAE,QAASA,CAAG,CACvD,CACAC,OAAAA,EAAA,EAAYF,4RCLZ,aAEA,OAAO,eAAcG,EAAU,aAAc,CACzC,MAAO,EACX,CAAC,EACD,OAAO,eAAeA,EAAS,kBAAmB,CAC9C,WAAY,GACZ,IAAK,UAAW,CACZ,OAAOC,CACf,CACA,CAAC,EAGD,MAAMA,EAF2BC,EAAA,EACqB,EAAEC,CAAgB,EACzC,QAAQ,cAAc,IAAI,EACrD,QAAQ,IAAI,WAAa,eACzBF,EAAgB,YAAc,0ECQlC,OAAO,eAAcD,EAAU,aAAc,CACzC,MAAO,EACX,CAAC,EACD,OAAO,eAAeA,EAAS,UAAW,CACtC,WAAY,GACZ,IAAK,UAAW,CACZ,OAAOI,CACf,CACA,CAAC,EAED,MAAMC,EAD2BH,EAAA,EACqB,EAAEC,CAAgB,EAClEG,EAAgCC,EAAA,EACtC,SAASC,EAAQV,EAAK,CAClB,OAAOA,GAAOA,EAAI,QAAUA,EAAI,QAAUA,CAC9C,CACA,MAAMW,EAAmB,CAAA,EACnBC,EAAqB,CAAA,EAC3B,IAAIC,EAAc,GAClB,SAASC,EAAKC,EAAQ,CAClB,IAAIC,EAAUD,EAAM,EAChB/C,EAAQ,CACR,QAAS,GACT,OAAQ,KACR,MAAO,MAEX,OAAAA,EAAM,QAAUgD,EAAQ,KAAMC,IAC1BjD,EAAM,QAAU,GAChBA,EAAM,OAASiD,EACRA,EACV,EAAE,MAAOC,GAAM,CACZ,MAAAlD,EAAM,QAAU,GAChBA,EAAM,MAAQkD,EACRA,CACd,CAAK,EACMlD,CACX,CACA,SAASmD,EAAwBC,EAAQC,EAAS,CAC9C,IAAIC,EAAO,OAAO,OAAO,CACrB,OAAQ,KACR,QAAS,KACT,MAAO,IACP,QAAS,KACT,QAAS,KACT,QAAS,MACVD,CAAO,EAC4BE,EAAe,KACrD,SAASC,GAAO,CACZ,GAAI,CAACD,EAAc,CAEf,MAAME,EAAM,IAAIC,EAAqBN,EAAQE,CAAI,EACjDC,EAAe,CACX,gBAAiBE,EAAI,gBAAgB,KAAKA,CAAG,EAC7C,UAAWA,EAAI,UAAU,KAAKA,CAAG,EACjC,MAAOA,EAAI,MAAM,KAAKA,CAAG,EACzB,QAASA,EAAI,QAAQ,KAAKA,CAAG,EAE7C,CACQ,OAAOF,EAAa,QAAO,CACnC,CAMI,GAJI,OAAO,OAAW,KAClBZ,EAAiB,KAAKa,CAAI,EAG1B,CAACX,GAAe,OAAO,OAAW,IAAa,CAE/C,MAAMc,EAAYL,EAAK,SAAW,OAAOM,EAAQ,aAAgB,WAAaN,EAAK,QAAO,EAAKA,EAAK,QAChGK,GACAf,EAAmB,KAAMiB,GAAM,CAC3B,UAAWC,KAAYH,EACnB,GAAIE,EAAI,SAASC,CAAQ,EACrB,OAAON,EAAI,CAGnC,CAAa,CAEb,CACI,SAASO,GAAoB,CACzBP,EAAI,EACJ,MAAMQ,EAAUzB,EAAO,QAAQ,WAAWC,EAA8B,eAAe,EACnFwB,GAAW,MAAM,QAAQV,EAAK,OAAO,GACrCA,EAAK,QAAQ,QAASW,GAAa,CAC/BD,EAAQC,CAAU,CAClC,CAAa,CAEb,CACI,SAASC,EAAkBC,EAAO7C,EAAK,CACnCyC,EAAiB,EACjB,MAAM/D,EAAQuC,EAAO,QAAQ,qBAAqBgB,EAAa,UAAWA,EAAa,gBAAiBA,EAAa,eAAe,EACpI,OAAAhB,EAAO,QAAQ,oBAAoBjB,EAAK,KAAK,CACrC,MAAOiC,EAAa,QACpB,CAAA,CAAE,EACHhB,EAAO,QAAQ,QAAQ,IACtBvC,EAAM,SAAWA,EAAM,MACFuC,EAAO,QAAQ,cAAce,EAAK,QAAS,CAC5D,UAAWtD,EAAM,QACjB,UAAWA,EAAM,UACjB,SAAUA,EAAM,SAChB,MAAOA,EAAM,MACb,MAAOuD,EAAa,KACxC,CAAiB,EACMvD,EAAM,OACQuC,EAAO,QAAQ,cAAcG,EAAQ1C,EAAM,MAAM,EAAGmE,CAAK,EAEvE,KAEZ,CACCA,EACAnE,CACZ,CAAS,CACT,CACI,OAAAkE,EAAkB,QAAU,IAAIV,EAAI,EACpCU,EAAkB,YAAc,oBACX3B,EAAO,QAAQ,WAAW2B,CAAiB,CACpE,CACA,MAAMR,CAAqB,CACvB,SAAU,CACN,OAAO,KAAK,KAAK,OACzB,CACI,OAAQ,CACJ,KAAK,eAAc,EACnB,KAAK,KAAO,KAAK,QAAQ,KAAK,MAAM,MAAM,EAC1C,KAAK,OAAS,CACV,UAAW,GACX,SAAU,IAEd,KAAM,CAAE,KAAMU,EAAK,MAAOd,CAAI,EAAK,KAC/Bc,EAAI,UACA,OAAOd,EAAK,OAAU,WAClBA,EAAK,QAAU,EACf,KAAK,OAAO,UAAY,GAExB,KAAK,OAAS,WAAW,IAAI,CACzB,KAAK,QAAQ,CACT,UAAW,EACvC,CAAyB,CACzB,EAAuBA,EAAK,KAAK,GAGjB,OAAOA,EAAK,SAAY,WACxB,KAAK,SAAW,WAAW,IAAI,CAC3B,KAAK,QAAQ,CACT,SAAU,EAClC,CAAqB,CACrB,EAAmBA,EAAK,OAAO,IAGvB,KAAK,KAAK,QAAQ,KAAK,IAAI,CACvB,KAAK,QAAQ,EAAE,EACf,KAAK,eAAc,CAC/B,CAAS,EAAE,MAAOe,GAAO,CACb,KAAK,QAAQ,EAAE,EACf,KAAK,eAAc,CAC/B,CAAS,EACD,KAAK,QAAQ,EAAE,CACvB,CACI,QAAQC,EAAS,CACb,KAAK,OAAS,CACV,GAAG,KAAK,OACR,MAAO,KAAK,KAAK,MACjB,OAAQ,KAAK,KAAK,OAClB,QAAS,KAAK,KAAK,QACnB,GAAGA,GAEP,KAAK,WAAW,QAASC,GAAWA,EAAQ,CAAE,CACtD,CACI,gBAAiB,CACb,aAAa,KAAK,MAAM,EACxB,aAAa,KAAK,QAAQ,CAClC,CACI,iBAAkB,CACd,OAAO,KAAK,MACpB,CACI,UAAUA,EAAU,CAChB,YAAK,WAAW,IAAIA,CAAQ,EACrB,IAAI,CACP,KAAK,WAAW,OAAOA,CAAQ,CAC3C,CACA,CACI,YAAYnB,EAAQE,EAAK,CACrB,KAAK,QAAUF,EACf,KAAK,MAAQE,EACb,KAAK,WAAa,IAAI,IACtB,KAAK,OAAS,KACd,KAAK,SAAW,KAChB,KAAK,MAAK,CAClB,CACA,CACA,SAASkB,EAASlB,EAAM,CACpB,OAAOH,EAAwBL,EAAMQ,CAAI,CAC7C,CACA,SAASmB,EAAkBC,EAAcb,EAAK,CAC1C,IAAIc,EAAW,CAAA,EACf,KAAMD,EAAa,QAAO,CACtB,IAAIlB,EAAOkB,EAAa,IAAG,EAC3BC,EAAS,KAAKnB,EAAKK,CAAG,CAAC,CAC/B,CACI,OAAO,QAAQ,IAAIc,CAAQ,EAAE,KAAK,IAAI,CAClC,GAAID,EAAa,OACb,OAAOD,EAAkBC,EAAcb,CAAG,CAEtD,CAAK,CACL,CACAW,EAAS,WAAa,IACX,IAAI,QAAQ,CAACI,EAAqBC,IAAS,CAC9CJ,EAAkB9B,CAAgB,EAAE,KAAKiC,EAAqBC,CAAM,CAC5E,CAAK,EAELL,EAAS,aAAgBX,IACjBA,IAAQ,SAAQA,EAAM,CAAA,GACnB,IAAI,QAASiB,GAAiB,CACjC,MAAMV,EAAM,KACRvB,EAAc,GACPiC,EAAc,GAGzBL,EAAkB7B,EAAoBiB,CAAG,EAAE,KAAKO,EAAKA,CAAG,CAChE,CAAK,GAED,OAAO,OAAW,MAClB,OAAO,oBAAsBI,EAAS,cAE1C,MAAMlC,EAAWkC,2DCpPjB,OAAO,eAActC,EAAU,aAAc,CACzC,MAAO,EACX,CAAC,EAKD,SAAS6C,EAAQC,EAAQC,EAAK,CAC1B,QAAQC,KAAQD,EAAI,OAAO,eAAeD,EAAQE,EAAM,CACpD,WAAY,GACZ,IAAKD,EAAIC,CAAI,CACrB,CAAK,CACL,CACAH,EAAQ7C,EAAS,CAMb,QAAS,UAAW,CAChB,OAAOiD,CACf,EACI,MAAO,UAAW,CACd,OAAOC,CACf,CACA,CAAC,EACD,MAAMrD,EAA2BK,EAAA,EAC3BiD,EAAchD,EAEdiD,EAAuCvD,EAAyB,EAAEwD,EAAA,CAAoC,EACtGC,EAAe,OAAO,OAAW,IAIvC,SAASC,EAAcC,EAAK,CACxB,MAAO,CACH,QAAiCA,GAAI,SAAYA,EAEzD,CACA,SAASN,EAAMO,EAAqBC,EAAiB,CAKjD,GAHA,OAAOA,EAAgB,QACvB,OAAOA,EAAgB,QAEnB,CAACJ,EACD,OAAOG,EAAoBC,CAAe,EAE9C,MAAMC,EAAUD,EAAgB,QAEhC,MAAO,OAAsBP,EAAY,KAAKQ,EAAS,CAC/C,MAAO,KACP,UAAW,GACX,UAAW,GACX,SAAU,EACtB,CAAS,CACT,CACA,SAASV,EAAQW,EAAgBzC,EAAS,CACtC,IAAI0C,EAAaT,EAAuB,QACpCM,EAAkB,CAElB,QAAUI,GAAQ,CACd,GAAI,CAAE,MAAAC,EAAO,UAAAC,EAAW,UAAAC,CAAS,EAAKH,EACtC,GAAI,CAACG,EAAW,OAAO,KACvB,GAAI,QAAQ,IAAI,WAAa,aAAc,CACvC,GAAID,EACA,OAAO,KAEX,GAAID,EACA,SAAyBZ,EAAY,MAAM,IAAK,CAC5C,SAAU,CACNY,EAAM,WACYZ,EAAY,KAAK,KAAM,EAAE,EAC3CY,EAAM,KAClC,CACA,CAAqB,CAErB,CACY,OAAO,IACnB,GAMQH,aAA0B,QAC1BF,EAAgB,OAAS,IAAIE,EAEtB,OAAOA,GAAmB,WACjCF,EAAgB,OAASE,EAElB,OAAOA,GAAmB,WACjCF,EAAkB,CACd,GAAGA,EACH,GAAGE,IAIXF,EAAkB,CACd,GAAGA,EACH,GAAGvC,GAEP,MAAM+C,EAAWR,EAAgB,OAC3B7C,EAAS,IAAIqD,GAAY,KAAOA,EAAQ,EAAG,KAAKX,CAAa,EAAI,QAAQ,QAAQA,EAAc,IAAI,IAAI,CAAC,EAU9G,OARIG,EAAgB,oBAChBA,EAAkB,CACd,GAAGA,EACH,GAAGA,EAAgB,mBAEvB,OAAOA,EAAgB,mBAGvB,OAAOA,EAAgB,KAAQ,WAAa,CAACA,EAAgB,KAC7D,OAAOA,EAAgB,QACvB,OAAOA,EAAgB,QAChBR,EAAMW,EAAYH,CAAe,GAErCG,EAAW,CACd,GAAGH,EACH,OAAQ7C,CAChB,CAAK,CACL,EAEK,OAAOb,EAAQ,SAAY,YAAe,OAAOA,EAAQ,SAAY,UAAYA,EAAQ,UAAY,OAAU,OAAOA,EAAQ,QAAQ,WAAe,MACxJ,OAAO,eAAeA,EAAQ,QAAS,aAAc,CAAE,MAAO,GAAM,EACpE,OAAO,OAAOA,EAAQ,QAASA,CAAO,EACtCmE,EAAA,QAAiBnE,EAAQ,uEC/H3BiD,EAAiB/C,EAAA,4BCQXkE,EAAanB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,2BAA0B,GAAG,CACnE,IAAK,EACP,CAAC,EACKoB,EAAgBpB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,8BAA2B,GAAG,CACvE,IAAK,EACP,CAAC,EACKqB,EAAQrB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,sBAAgB,CAAA,EAAG,CAAE,IAAK,GAAO,EAC9DsB,EAAatB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,2BAA0B,GAAG,CACnE,IAAK,EACP,CAAC,EACKuB,EAAiBvB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,+BAA4B,GAAG,CACzE,IAAK,EACP,CAAC,EACKwB,GAAOxB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,qBAAc,CAAA,EAAG,CAAE,IAAK,GAAO,EAC3DyB,GAAYzB,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAwB,GAAG,CAChE,IAAK,EACP,CAAC,EACK0B,GAAY1B,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAkB,GAAG,CAC1D,IAAK,EACP,CAAC,EACK2B,GAAW3B,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,yBAAsB,GAAG,CAC7D,IAAK,EACP,CAAC,EACK4B,GAAa5B,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,2BAA0B,GAAG,CACnE,IAAK,EACP,CAAC,EACK6B,GAAW7B,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,yBAAsB,GAAG,CAC7D,IAAK,EACP,CAAC,EACK8B,GAAU9B,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,wBAAoB,GAAG,CAC1D,IAAK,EACP,CAAC,EACK+B,GAAQ/B,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,sBAAgB,GAAG,CACpD,IAAK,EACP,CAAC,EACKgC,GAAYhC,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAwB,GAAG,CAChE,IAAK,EACP,CAAC,EACKiC,GAAYjC,EAAQ,IAAM,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAwB,GAAG,CAChE,IAAK,EACP,CAAC,EAED,SAASkC,GAAc,CAAE,IAAA1G,GAA8B,CACrD,OAAQA,EAAI,KAAA,CACV,IAAK,aACH,aAAQ2F,EAAA,EAAW,EACrB,IAAK,WACH,aAAQC,EAAA,EAAc,EACxB,IAAK,QACH,OAAO3E,EAAAA,IAAC4E,EAAA,CAAM,SAAU7F,EAAI,EAAA,CAAI,EAClC,IAAK,aACH,OAAOiB,EAAAA,IAAC6E,EAAA,CAAW,SAAU9F,EAAI,EAAA,CAAI,EACvC,IAAK,WACH,aAAQ+F,EAAA,EAAe,EACzB,IAAK,OACH,aAAQC,GAAA,EAAK,EACf,IAAK,YACH,OAAO/E,EAAAA,IAACgF,GAAA,CAAU,SAAUjG,EAAI,EAAA,CAAI,EACtC,IAAK,MACH,aAAQkG,GAAA,EAAU,EACpB,IAAK,WACH,aAAQC,GAAA,EAAS,EACnB,IAAK,aACH,aAAQC,GAAA,EAAW,EACrB,IAAK,UACH,aAAQE,GAAA,EAAQ,EAClB,IAAK,WACH,aAAQD,GAAA,EAAS,EACnB,IAAK,QACH,aAAQE,GAAA,EAAM,EAChB,IAAK,YACH,OAAOtF,EAAAA,IAACuF,GAAA,CAAU,SAAUxG,EAAI,EAAA,CAAI,EACtC,IAAK,YACH,aAAQyG,GAAA,EAAU,EACpB,QACE,OAAO,IAAA,CAEb,CAEA,SAAwBE,IAAc,CACpC,MAAMC,EAAUzG,EAAAA,eAAgBP,GAAMA,EAAE,OAAO,EACzCiH,EAAQ1G,EAAAA,eAAgBP,GAAMA,EAAE,KAAK,EACrCkH,EAAiBhH,EAAAA,QACrB,IAAM+G,EAAM,IAAKE,GAAOH,EAAQG,CAAE,CAAC,EAAE,OAAO,OAAO,EACnD,CAACF,EAAOD,CAAO,CAAA,EAGjB,OACE3F,EAAAA,IAAC,OAAI,UAAU,yCACZ,WAAe,IAAKjB,GACnBiB,EAAAA,IAAC,MAAA,CAAiB,UAAU,sBAC1B,SAAAA,EAAAA,IAAClB,EAAA,CAAgB,IAAAC,EACf,SAAAiB,EAAAA,IAACyF,GAAA,CAAc,IAAA1G,CAAA,CAAU,EAC3B,CAAA,EAHQA,EAAI,EAId,CACD,CAAA,CACH,CAEJ,CC9FO,MAAMgH,GAAyD,CACpE,UAAW,CACT,GAAI,YACJ,MAAO,aACP,OAAQ,CACN,MAAO,aACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,IACX,YAAa,GACb,YAAa,GACb,YAAa,CAAA,CACf,EAEF,IAAK,CACH,GAAI,MACJ,MAAO,aACP,OAAQ,CACN,MAAO,aACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,KAAM,CACJ,GAAI,OACJ,MAAO,OACP,OAAQ,CACN,MAAO,YACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,WAAY,CACV,GAAI,aACJ,MAAO,aACP,OAAQ,CACN,MAAO,aACP,cAAe,CAAE,MAAO,IAAK,OAAQ,GAAA,EACrC,SAAU,IACV,UAAW,GAAA,CACb,EAEF,SAAU,CACR,GAAI,WACJ,MAAO,iBACP,OAAQ,CACN,MAAO,iBACP,cAAe,CAAE,MAAO,IAAK,OAAQ,GAAA,EACrC,SAAU,IACV,UAAW,GAAA,CACb,EAEF,MAAO,CACL,GAAI,QACJ,MAAO,QACP,OAAQ,CACN,MAAO,QACP,cAAe,CAAE,MAAO,IAAK,OAAQ,GAAI,EAAG,IAAK,EAAG,GAAA,EACpD,SAAU,IACV,UAAW,GACX,YAAa,GACb,YAAa,GACb,YAAa,CAAA,CACf,EAEF,WAAY,CACV,GAAI,aACJ,MAAO,aACP,OAAQ,CACN,MAAO,aACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,IACX,YAAa,GACb,YAAa,GACb,YAAa,CAAA,CACf,EAEF,SAAU,CACR,GAAI,WACJ,MAAO,WACP,OAAQ,CACN,MAAO,kBACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,UAAW,CACT,GAAI,YACJ,MAAO,YACP,OAAQ,CACN,MAAO,iBACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,IACX,YAAa,GACb,YAAa,EAAA,CACf,EAEF,SAAU,CACR,GAAI,WACJ,MAAO,WACP,OAAQ,CACN,MAAO,WACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,WAAY,CACV,GAAI,aACJ,MAAO,aACP,OAAQ,CACN,MAAO,aACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,QAAS,CACP,GAAI,UACJ,MAAO,UACP,OAAQ,CACN,MAAO,UACP,cAAe,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACtD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,SAAU,CACR,GAAI,WACJ,MAAO,WACP,OAAQ,CACN,MAAO,WACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,MAAO,CACL,GAAI,QACJ,MAAO,SACP,OAAQ,CACN,MAAO,SACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,EAEF,UAAW,CACT,GAAI,YACJ,MAAO,YACP,OAAQ,CACN,MAAO,YACP,cAAe,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,GAAA,EACrD,SAAU,IACV,UAAW,GAAA,CACb,CAEJ,EAEaC,GAA6B,CACxC,YACA,MACA,OACA,aACA,WACA,QACA,aACA,WACA,YACA,WACA,aACA,UACA,WACA,QACA,WACF,EC7KA,SAAwBC,GAAU1D,EAAwB,GAAI,CAC5D,MAAM2D,EAAOhI,EAAA,EACPiI,EAAejH,EAAAA,eAAgBP,GAAMA,EAAE,YAAY,EACnDyH,EAAYlH,EAAAA,eAAgBP,GAAMA,EAAE,SAAS,EAE7C0H,EACJ9D,EAAM,OAASA,EAAM,MAAM,OAAS,EAAIA,EAAM,MAAQyD,GAClDM,EAAY/D,EAAM,WAAa,CAAA,EAC/BgE,EAAkBhE,EAAM,OAAO,aAAe,GAE9CiE,EAAmB/H,GAAiB,CACxCyH,EAAK,WAAWzH,CAAI,CACtB,EAGAgI,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAO,SAAS,gBAChBhF,EAAOa,EAAM,OAAS,CAAA,EACtBoE,EAAUjF,EAAK,UAAY,GAC3BkF,GAAS,IAAM,CACnB,GAAI,CAACD,EAAS,OAAO,KACrB,GAAI,CACF,OAAO,aAAa,QAAQ,OAAO,CACrC,MAAQ,CACN,OAAO,IACT,CACF,GAAA,EACME,EACJ,OAAO,OAAW,KAClB,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,QAC9CC,EACHF,IACAlF,EAAK,UAAY,UAAY,CAACA,EAAK,QAChCmF,EACE,OACA,QACFnF,EAAK,SACPoF,GACFJ,EAAK,aAAa,aAAcI,CAAO,CAE3C,EAAG,CAACvE,EAAM,KAAK,CAAC,EAEhB,MAAMwE,EAAc,IAAM,CACxB,MAAML,EAAO,SAAS,gBAChBM,EAAON,EAAK,aAAa,YAAY,IAAM,OAAS,QAAU,OAGpE,GAFAA,EAAK,aAAa,aAAcM,CAAI,EACpBzE,EAAM,OAAO,UAAY,GAEvC,GAAI,CACF,aAAa,QAAQ,QAASyE,CAAI,CACpC,MAAQ,CAAC,CAEb,EAMA,OAFE,OAAO,OAAW,KAClB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,gBAAgB,IAAM,IAE/D,KAIP9G,EAAAA,KAAC,MAAA,CACC,aAAW,aACX,UAAU,qFAEV,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,wIACZ,SAAA,CAAAqG,GACCvG,EAAAA,IAAC,SAAA,CACC,UAAU,8HACV,QAAS+G,EACT,aAAW,eACZ,SAAA,OAAA,CAAA,EAIFV,EAAM,IAAKY,GAAW,CACrB,MAAMC,EAAMnB,GAAoBkB,CAAM,EACtC,GAAI,CAACC,EAAK,OAAO,KACjB,MAAMC,EAAWb,EAAUW,CAAM,EAC3BG,EAAQD,GAAU,OAASD,EAAI,MAC/BG,EACJnB,EAAK,MAAM,QAAUA,EAAK,MAAM,aAAee,EACjD,OACEjH,EAAAA,IAAC,SAAA,CAEC,UAAU,+HACV,QAAS,IAAM,CAGb,GAFAwG,EAAgBS,CAAM,EAElB,CADab,EAAUa,CAAM,EAClB,CACb,MAAMK,EAAUJ,EAAI,OACdK,EAAe,CACnB,KAAMN,EACN,GAAGK,EACH,GAAGH,GAAU,MAAA,EAEfhB,EAAaoB,CAAY,CAC3B,CACF,EACA,eAAcF,EACd,aAAY,UAAUD,EAAM,YAAA,CAAa,GAExC,SAAAA,CAAA,EAlBIH,CAAA,CAqBX,CAAC,CAAA,EACH,QACCvB,GAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAGnB","x_google_ignoreList":[2,3,4,5,6]}