"use strict"; /* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ self["webpackHotUpdate_N_E"]("app/flashcards/page",{ /***/ "(app-pages-browser)/./app/flashcards/page.tsx": /*!*********************************!*\ !*** ./app/flashcards/page.tsx ***! \*********************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FlashcardsPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/client/app-dir/link.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _components_ProtectedRoute__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/components/ProtectedRoute */ \"(app-pages-browser)/./components/ProtectedRoute.tsx\");\n/* harmony import */ var _lib_services_flashcards__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/services/flashcards */ \"(app-pages-browser)/./lib/services/flashcards.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nfunction FlashcardsContent() {\n _s();\n const [activeTab, setActiveTab] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('my-cards');\n const [selectedSet, setSelectedSet] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [searchTerm, setSearchTerm] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)('');\n // Real data from API\n const [cardSets, setCardSets] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [flashcards, setFlashcards] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // Load data from API\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"FlashcardsContent.useEffect\": ()=>{\n loadCardSets();\n loadFlashcards();\n }\n }[\"FlashcardsContent.useEffect\"], []);\n const loadCardSets = async ()=>{\n try {\n const result = await _lib_services_flashcards__WEBPACK_IMPORTED_MODULE_4__.flashcardsService.getCardSets();\n if (result.success && result.data) {\n setCardSets(result.data.sets);\n } else {\n setError(result.error || 'Failed to load card sets');\n }\n } catch (err) {\n setError('Failed to load card sets');\n }\n };\n const loadFlashcards = async ()=>{\n try {\n setLoading(true);\n const result = await _lib_services_flashcards__WEBPACK_IMPORTED_MODULE_4__.flashcardsService.getFlashcards(selectedSet || undefined);\n if (result.success && result.data) {\n setFlashcards(result.data.flashcards);\n } else {\n setError(result.error || 'Failed to load flashcards');\n }\n } catch (err) {\n setError('Failed to load flashcards');\n } finally{\n setLoading(false);\n }\n };\n // Reload flashcards when selectedSet changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"FlashcardsContent.useEffect\": ()=>{\n loadFlashcards();\n }\n }[\"FlashcardsContent.useEffect\"], [\n selectedSet\n ]);\n // Filter data\n const filteredSets = cardSets.filter((set)=>set.name.toLowerCase().includes(searchTerm.toLowerCase()) || set.description.toLowerCase().includes(searchTerm.toLowerCase()));\n const filteredCards = flashcards.filter((card)=>{\n if (searchTerm) {\n var _card_word, _card_translation;\n return ((_card_word = card.word) === null || _card_word === void 0 ? void 0 : _card_word.toLowerCase().includes(searchTerm.toLowerCase())) || ((_card_translation = card.translation) === null || _card_translation === void 0 ? void 0 : _card_translation.toLowerCase().includes(searchTerm.toLowerCase()));\n }\n return true;\n });\n // Add loading and error states\n if (loading) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-h-screen bg-gray-50 flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-lg\",\n children: \"載入中...\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 77,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 76,\n columnNumber: 7\n }, this);\n }\n if (error) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-h-screen bg-gray-50 flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-red-600\",\n children: error\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 85,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 84,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-h-screen bg-gray-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"bg-white border-b border-gray-200\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center py-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-3xl font-bold text-gray-900\",\n children: \"詞卡管理\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 97,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-sm text-gray-500\",\n children: \"管理你的詞卡集合\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 98,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 96,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center space-x-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_2___default()), {\n href: \"/generate\",\n className: \"bg-primary text-white px-4 py-2 rounded-lg hover:bg-primary/90 transition-colors\",\n children: \"AI 生成詞卡\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 101,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 100,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 95,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex space-x-8\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setActiveTab('my-cards'),\n className: \"pb-4 px-1 border-b-2 font-medium text-sm \".concat(activeTab === 'my-cards' ? 'border-primary text-primary' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'),\n children: [\n \"我的卡組 (\",\n filteredSets.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 112,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setActiveTab('all-cards'),\n className: \"pb-4 px-1 border-b-2 font-medium text-sm \".concat(activeTab === 'all-cards' ? 'border-primary text-primary' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'),\n children: [\n \"所有詞卡 (\",\n filteredCards.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 122,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 111,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 94,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 93,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-6\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"text\",\n value: searchTerm,\n onChange: (e)=>setSearchTerm(e.target.value),\n placeholder: \"搜尋詞卡或卡組...\",\n className: \"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 141,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"h-5 w-5 text-gray-400\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 150,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 149,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 148,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 140,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 139,\n columnNumber: 9\n }, this),\n activeTab === 'my-cards' && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center mb-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"text-lg font-semibold\",\n children: [\n \"共 \",\n filteredSets.length,\n \" 個卡組\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 160,\n columnNumber: 15\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 159,\n columnNumber: 13\n }, this),\n filteredSets.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center py-12\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-gray-500 mb-4\",\n children: \"還沒有詞卡集合\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 165,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_2___default()), {\n href: \"/generate\",\n className: \"bg-primary text-white px-4 py-2 rounded-lg hover:bg-primary/90 transition-colors\",\n children: \"創建第一個卡組\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 166,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 164,\n columnNumber: 15\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\",\n children: filteredSets.map((set)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border rounded-lg hover:shadow-lg transition-shadow cursor-pointer\",\n onClick: ()=>{\n setSelectedSet(set.id);\n setActiveTab('all-cards');\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"\".concat(set.color, \" text-white p-4 rounded-t-lg\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h4\", {\n className: \"font-semibold text-lg\",\n children: set.name\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 185,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm opacity-90\",\n children: set.description\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 186,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 184,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"p-4 bg-white rounded-b-lg\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center text-sm text-gray-600\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n set.cardCount,\n \" 張詞卡\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 190,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"進度: \",\n set.progress,\n \"%\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 191,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 189,\n columnNumber: 23\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 188,\n columnNumber: 21\n }, this)\n ]\n }, set.id, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 176,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 174,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 158,\n columnNumber: 11\n }, this),\n activeTab === 'all-cards' && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center mb-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h3\", {\n className: \"text-lg font-semibold\",\n children: [\n \"共 \",\n filteredCards.length,\n \" 個詞卡\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 205,\n columnNumber: 15\n }, this),\n selectedSet && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>setSelectedSet(null),\n className: \"text-sm text-gray-600 hover:text-gray-900\",\n children: \"顯示所有詞卡\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 207,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 204,\n columnNumber: 13\n }, this),\n filteredCards.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center py-12\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-gray-500 mb-4\",\n children: \"沒有找到詞卡\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 218,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)((next_link__WEBPACK_IMPORTED_MODULE_2___default()), {\n href: \"/generate\",\n className: \"bg-primary text-white px-4 py-2 rounded-lg hover:bg-primary/90 transition-colors\",\n children: \"創建新詞卡\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 219,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 217,\n columnNumber: 15\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: filteredCards.map((card)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"bg-white border rounded-lg p-4 hover:shadow-md transition-shadow\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center space-x-4\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center space-x-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h4\", {\n className: \"font-semibold text-lg\",\n children: card.word || '未設定'\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 235,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-gray-500\",\n children: card.partOfSpeech\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 236,\n columnNumber: 31\n }, this),\n card.pronunciation && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-sm text-blue-600\",\n children: card.pronunciation\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 238,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 234,\n columnNumber: 29\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-gray-700 mt-1\",\n children: card.translation || '未設定'\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 241,\n columnNumber: 29\n }, this),\n card.example && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-gray-600 mt-2 italic\",\n children: [\n \"例句: \",\n card.example\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 243,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center space-x-4 mt-2 text-xs text-gray-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"卡組: \",\n card.cardSet.name\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 246,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"熟練度: \",\n card.masteryLevel,\n \"/5\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 247,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"複習: \",\n card.timesReviewed,\n \" 次\"\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 248,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: [\n \"下次複習: \",\n new Date(card.nextReviewDate).toLocaleDateString()\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 249,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 245,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 233,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 232,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 231,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center space-x-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>{\n // TODO: 實作編輯功能\n console.log('編輯詞卡:', card.id);\n },\n className: \"text-blue-600 hover:text-blue-800 text-sm\",\n children: \"編輯\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 255,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n onClick: ()=>{\n // TODO: 實作刪除功能\n console.log('刪除詞卡:', card.id);\n },\n className: \"text-red-600 hover:text-red-800 text-sm\",\n children: \"刪除\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 264,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 254,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 230,\n columnNumber: 21\n }, this)\n }, card.id, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 229,\n columnNumber: 19\n }, this))\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 227,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 203,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 137,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 91,\n columnNumber: 5\n }, this);\n}\n_s(FlashcardsContent, \"/h0XTBCjF/h7J+BTgylG0fxwk9w=\");\n_c = FlashcardsContent;\nfunction FlashcardsPage() {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ProtectedRoute__WEBPACK_IMPORTED_MODULE_3__.ProtectedRoute, {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(FlashcardsContent, {}, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 289,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/app/flashcards/page.tsx\",\n lineNumber: 288,\n columnNumber: 5\n }, this);\n}\n_c1 = FlashcardsPage;\nvar _c, _c1;\n$RefreshReg$(_c, \"FlashcardsContent\");\n$RefreshReg$(_c1, \"FlashcardsPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9mbGFzaGNhcmRzL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFFMkM7QUFDZjtBQUNnQztBQUMrQjtBQUUzRixTQUFTSzs7SUFDUCxNQUFNLENBQUNDLFdBQVdDLGFBQWEsR0FBR1AsK0NBQVFBLENBQUM7SUFDM0MsTUFBTSxDQUFDUSxhQUFhQyxlQUFlLEdBQUdULCtDQUFRQSxDQUFnQjtJQUM5RCxNQUFNLENBQUNVLFlBQVlDLGNBQWMsR0FBR1gsK0NBQVFBLENBQUM7SUFFN0MscUJBQXFCO0lBQ3JCLE1BQU0sQ0FBQ1ksVUFBVUMsWUFBWSxHQUFHYiwrQ0FBUUEsQ0FBWSxFQUFFO0lBQ3RELE1BQU0sQ0FBQ2MsWUFBWUMsY0FBYyxHQUFHZiwrQ0FBUUEsQ0FBYyxFQUFFO0lBQzVELE1BQU0sQ0FBQ2dCLFNBQVNDLFdBQVcsR0FBR2pCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQ2tCLE9BQU9DLFNBQVMsR0FBR25CLCtDQUFRQSxDQUFnQjtJQUVsRCxxQkFBcUI7SUFDckJDLGdEQUFTQTt1Q0FBQztZQUNSbUI7WUFDQUM7UUFDRjtzQ0FBRyxFQUFFO0lBRUwsTUFBTUQsZUFBZTtRQUNuQixJQUFJO1lBQ0YsTUFBTUUsU0FBUyxNQUFNbEIsdUVBQWlCQSxDQUFDbUIsV0FBVztZQUNsRCxJQUFJRCxPQUFPRSxPQUFPLElBQUlGLE9BQU9HLElBQUksRUFBRTtnQkFDakNaLFlBQVlTLE9BQU9HLElBQUksQ0FBQ0MsSUFBSTtZQUM5QixPQUFPO2dCQUNMUCxTQUFTRyxPQUFPSixLQUFLLElBQUk7WUFDM0I7UUFDRixFQUFFLE9BQU9TLEtBQUs7WUFDWlIsU0FBUztRQUNYO0lBQ0Y7SUFFQSxNQUFNRSxpQkFBaUI7UUFDckIsSUFBSTtZQUNGSixXQUFXO1lBQ1gsTUFBTUssU0FBUyxNQUFNbEIsdUVBQWlCQSxDQUFDd0IsYUFBYSxDQUFDcEIsZUFBZXFCO1lBQ3BFLElBQUlQLE9BQU9FLE9BQU8s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Z0ZBQUs7Z0ZBQU1oQyxLQUFLdUMsWUFBWTtnRkFBQzs7Ozs7OztzRkFDOUIsOERBQUNQOztnRkFBSztnRkFBS2hDLEtBQUt3QyxhQUFhO2dGQUFDOzs7Ozs7O3NGQUM5Qiw4REFBQ1I7O2dGQUFLO2dGQUFPLElBQUlTLEtBQUt6QyxLQUFLMEMsY0FBYyxFQUFFQyxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzhEQUtyRSw4REFBQ3hDO29EQUFJQyxXQUFVOztzRUFDYiw4REFBQ0k7NERBQ0NDLFNBQVM7Z0VBQ1AsZUFBZTtnRUFDZm1DLFFBQVFDLEdBQUcsQ0FBQyxTQUFTN0MsS0FBSzZCLEVBQUU7NERBQzlCOzREQUNBekIsV0FBVTtzRUFDWDs7Ozs7O3NFQUdELDhEQUFDSTs0REFDQ0MsU0FBUztnRUFDUCxlQUFlO2dFQUNmbUMsUUFBUUMsR0FBRyxDQUFDLFNBQVM3QyxLQUFLNkIsRUFBRTs0REFDOUI7NERBQ0F6QixXQUFVO3NFQUNYOzs7Ozs7Ozs7Ozs7Ozs7Ozs7dUNBekNHSixLQUFLNkIsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEbkM7R0FwUlM5RDtLQUFBQTtBQXNSTSxTQUFTK0U7SUFDdEIscUJBQ0UsOERBQUNqRixzRUFBY0E7a0JBQ2IsNEVBQUNFOzs7Ozs7Ozs7O0FBR1A7TUFOd0IrRSIsInNvdXJjZXMiOlsiL1VzZXJzL2pldHRjaGVuZzEwMTgvY29kZS9kcmFtYWxpbmctdm9jYWItbGVhcm5pbmcvZnJvbnRlbmQvYXBwL2ZsYXNoY2FyZHMvcGFnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnXG5cbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBMaW5rIGZyb20gJ25leHQvbGluaydcbmltcG9ydCB7IFByb3RlY3RlZFJvdXRlIH0gZnJvbSAnQC9jb21wb25lbnRzL1Byb3RlY3RlZFJvdXRlJ1xuaW1wb3J0IHsgZmxhc2hjYXJkc1NlcnZpY2UsIHR5cGUgQ2FyZFNldCwgdHlwZSBGbGFzaGNhcmQgfSBmcm9tICdAL2xpYi9zZXJ2aWNlcy9mbGFzaGNhcmRzJ1xuXG5mdW5jdGlvbiBGbGFzaGNhcmRzQ29udGVudCgpIHtcbiAgY29uc3QgW2FjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiXSA9IHVzZVN0YXRlKCdteS1jYXJkcycpXG4gIGNvbnN0IFtzZWxlY3RlZFNldCwgc2V0U2VsZWN0ZWRTZXRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3NlYXJjaFRlcm0sIHNldFNlYXJjaFRlcm1dID0gdXNlU3RhdGUoJycpXG5cbiAgLy8gUmVhbCBkYXRhIGZyb20gQVBJXG4gIGNvbnN0IFtjYXJkU2V0cywgc2V0Q2FyZFNldHNdID0gdXNlU3RhdGU8Q2FyZFNldFtdPihbXSlcbiAgY29uc3QgW2ZsYXNoY2FyZHMsIHNldEZsYXNoY2FyZHNdID0gdXNlU3RhdGU8Rmxhc2hjYXJkW10+KFtdKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgLy8gTG9hZCBkYXRhIGZyb20gQVBJXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZENhcmRTZXRzKClcbiAgICBsb2FkRmxhc2hjYXJkcygpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGxvYWRDYXJkU2V0cyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmxhc2hjYXJkc1NlcnZpY2UuZ2V0Q2FyZFNldHMoKVxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5kYXRhKSB7XG4gICAgICAgIHNldENhcmRTZXRzKHJlc3VsdC5kYXRhLnNldHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIGNhcmQgc2V0cycpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXRFcnJvcignRmFpbGVkIHRvIGxvYWQgY2FyZCBzZXRzJylcbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2FkRmxhc2hjYXJkcyA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmxhc2hjYXJkc1NlcnZpY2UuZ2V0Rmxhc2hjYXJkcyhzZWxlY3RlZFNldCB8fCB1bmRlZmluZWQpXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmRhdGEpIHtcbiAgICAgICAgc2V0Rmxhc2hjYXJkcyhyZXN1bHQuZGF0YS5mbGFzaGNhcmRzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RXJyb3IocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBmbGFzaGNhcmRzJylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNldEVycm9yKCdGYWlsZWQgdG8gbG9hZCBmbGFzaGNhcmRzJylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBSZWxvYWQgZmxhc2hjYXJkcyB3aGVuIHNlbGVjdGVkU2V0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkRmxhc2hjYXJkcygpXG4gIH0sIFtzZWxlY3RlZFNldF0pXG5cbiAgLy8gRmlsdGVyIGRhdGFcbiAgY29uc3QgZmlsdGVyZWRTZXRzID0gY2FyZFNldHMuZmlsdGVyKHNldCA9PlxuICAgIHNldC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSB8fFxuICAgIHNldC5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKSlcbiAgKVxuXG4gIGNvbnN0IGZpbHRlcmVkQ2FyZHMgPSBmbGFzaGNhcmRzLmZpbHRlcihjYXJkID0+IHtcbiAgICBpZiAoc2VhcmNoVGVybSkge1xuICAgICAgcmV0dXJuIGNhcmQud29yZD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAgICAgICAgY2FyZC50cmFuc2xhdGlvbj8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtLnRvTG93ZXJDYXNlKCkpXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH0pXG5cbiAgLy8gQWRkIGxvYWRpbmcgYW5kIGVycm9yIHN0YXRlc1xuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ncmF5LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1sZ1wiPui8ieWFpeS4rS4uLjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWdyYXktNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXJlZC02MDBcIj57ZXJyb3J9PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWdyYXktNTBcIj5cbiAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXdoaXRlIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LTd4bCBteC1hdXRvIHB4LTQgc206cHgtNiBsZzpweC04XCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcHktNlwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwXCI+6Kme5Y2h566h55CGPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj7nrqHnkIbkvaDnmoToqZ7ljaHpm4blkIg8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC00XCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9nZW5lcmF0ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXdoaXRlIHB4LTQgcHktMiByb3VuZGVkLWxnIGhvdmVyOmJnLXByaW1hcnkvOTAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQUkg55Sf5oiQ6Kme5Y2hXG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFRhYnMgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtOFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRBY3RpdmVUYWIoJ215LWNhcmRzJyl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17YHBiLTQgcHgtMSBib3JkZXItYi0yIGZvbnQtbWVkaXVtIHRleHQtc20gJHtcbiAgICAgICAgICAgICAgICBhY3RpdmVUYWIgPT09ICdteS1jYXJkcydcbiAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSdcbiAgICAgICAgICAgICAgICAgIDogJ2JvcmRlci10cmFuc3BhcmVudCB0ZXh0LWdyYXktNTAwIGhvdmVyOnRleHQtZ3JheS03MDAgaG92ZXI6Ym9yZGVyLWdyYXktMzAwJ1xuICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAg5oiR55qE5Y2h57WEICh7ZmlsdGVyZWRTZXRzLmxlbmd0aH0pXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0QWN0aXZlVGFiKCdhbGwtY2FyZHMnKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcGItNCBweC0xIGJvcmRlci1iLTIgZm9udC1tZWRpdW0gdGV4dC1zbSAke1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRhYiA9PT0gJ2FsbC1jYXJkcydcbiAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSdcbiAgICAgICAgICAgICAgICAgIDogJ2JvcmRlci10cmFuc3BhcmVudCB0ZXh0LWdyYXktNTAwIGhvdmVyOnRleHQtZ3JheS03MDAgaG92ZXI6Ym9yZGVyLWdyYXktMzAwJ1xuICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAg5omA5pyJ6Kme5Y2hICh7ZmlsdGVyZWRDYXJkcy5sZW5ndGh9KVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBDb250ZW50ICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXgtdy03eGwgbXgtYXV0byBweC00IHNtOnB4LTYgbGc6cHgtOCBweS04XCI+XG4gICAgICAgIHsvKiBTZWFyY2ggKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2hUZXJtfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFRlcm0oZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIuaQnOWwi+ipnuWNoeaIluWNoee1hC4uLlwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBwbC0xMCBwci00IHB5LTIgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCByb3VuZGVkLWxnIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLXByaW1hcnkgZm9jdXM6Ym9yZGVyLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgcGwtMyBmbGV4IGl0ZW1zLWNlbnRlciBwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3NOYW1lPVwiaC01IHctNSB0ZXh0LWdyYXktNDAwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlTGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZVdpZHRoPXsyfSBkPVwiTTIxIDIxbC02LTZtMi01YTcgNyAwIDExLTE0IDAgNyA3IDAgMDExNCAwelwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBDYXJkIFNldHMgVGFiICovfVxuICAgICAgICB7YWN0aXZlVGFiID09PSAnbXktY2FyZHMnICYmIChcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgbWItNFwiPlxuICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LXNlbWlib2xkXCI+5YWxIHtmaWx0ZXJlZFNldHMubGVuZ3RofSDlgIvljaHntYQ8L2gzPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHtmaWx0ZXJlZFNldHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTEyXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTUwMCBtYi00XCI+6YKE5rKS5pyJ6Kme5Y2h6ZuG5ZCIPC9wPlxuICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICBocmVmPVwiL2dlbmVyYXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXByaW1hcnkgdGV4dC13aGl0ZSBweC00IHB5LTIgcm91bmRlZC1sZyBob3ZlcjpiZy1wcmltYXJ5LzkwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDlibXlu7rnrKzkuIDlgIvljaHntYRcbiAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0xIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zIGdhcC00XCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkU2V0cy5tYXAoc2V0ID0+IChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtzZXQuaWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlciByb3VuZGVkLWxnIGhvdmVyOnNoYWRvdy1sZyB0cmFuc2l0aW9uLXNoYWRvdyBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFNldChzZXQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlVGFiKCdhbGwtY2FyZHMnKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7c2V0LmNvbG9yfSB0ZXh0LXdoaXRlIHAtNCByb3VuZGVkLXQtbGdgfT5cbiAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWxnXCI+e3NldC5uYW1lfTwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSBvcGFjaXR5LTkwXCI+e3NldC5kZXNjcmlwdGlvbn08L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNCBiZy13aGl0ZSByb3VuZGVkLWItbGdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPntzZXQuY2FyZENvdW50fSDlvLXoqZ7ljaE8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj7pgLLluqY6IHtzZXQucHJvZ3Jlc3N9JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBBbGwgQ2FyZHMgVGFiICovfVxuICAgICAgICB7YWN0aXZlVGFiID09PSAnYWxsLWNhcmRzJyAmJiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIG1iLTRcIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZFwiPuWFsSB7ZmlsdGVyZWRDYXJkcy5sZW5ndGh9IOWAi+ipnuWNoTwvaDM+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZFNldCAmJiAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRTZXQobnVsbCl9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDAgaG92ZXI6dGV4dC1ncmF5LTkwMFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAg6aGv56S65omA5pyJ6Kme5Y2hXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAge2ZpbHRlcmVkQ2FyZHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTEyXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTUwMCBtYi00XCI+5rKS5pyJ5om+5Yiw6Kme5Y2hPC9wPlxuICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICBocmVmPVwiL2dlbmVyYXRlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXByaW1hcnkgdGV4dC13aGl0ZSBweC00IHB5LTIgcm91bmRlZC1sZyBob3ZlcjpiZy1wcmltYXJ5LzkwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICDlibXlu7rmlrDoqZ7ljaFcbiAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRDYXJkcy5tYXAoY2FyZCA9PiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGtleT17Y2FyZC5pZH0gY2xhc3NOYW1lPVwiYmctd2hpdGUgYm9yZGVyIHJvdW5kZWQtbGcgcC00IGhvdmVyOnNoYWRvdy1tZCB0cmFuc2l0aW9uLXNoYWRvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3NOYW1lPVwiZm9udC1zZW1pYm9sZCB0ZXh0LWxnXCI+e2NhcmQud29yZCB8fCAn5pyq6Kit5a6aJ308L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+e2NhcmQucGFydE9mU3BlZWNofTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjYXJkLnByb251bmNpYXRpb24gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtYmx1ZS02MDBcIj57Y2FyZC5wcm9udW5jaWF0aW9ufTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTcwMCBtdC0xXCI+e2NhcmQudHJhbnNsYXRpb24gfHwgJ+acquioreWumid9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjYXJkLmV4YW1wbGUgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG10LTIgaXRhbGljXCI+5L6L5Y+lOiB7Y2FyZC5leGFtcGxlfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC00IG10LTIgdGV4dC14cyB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj7ljaHntYQ6IHtjYXJkLmNhcmRTZXQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj7nhp/nt7TluqY6IHtjYXJkLm1hc3RlcnlMZXZlbH0vNTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPuikh+e/kjoge2NhcmQudGltZXNSZXZpZXdlZH0g5qyhPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+5LiL5qyh6KSH57+SOiB7bmV3IERhdGUoY2FyZC5uZXh0UmV2aWV3RGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiDlr6bkvZznt6jovK/lip/og71cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn57eo6Lyv6Kme5Y2hOicsIGNhcmQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYmx1ZS02MDAgaG92ZXI6dGV4dC1ibHVlLTgwMCB0ZXh0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAg57eo6LyvXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IOWvpuS9nOWIqumZpOWKn+iDvVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfliKrpmaToqZ7ljaE6JywgY2FyZC5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1yZWQtNjAwIGhvdmVyOnRleHQtcmVkLTgwMCB0ZXh0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAg5Yiq6ZmkXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRmxhc2hjYXJkc1BhZ2UoKSB7XG4gIHJldHVybiAoXG4gICAgPFByb3RlY3RlZFJvdXRlPlxuICAgICAgPEZsYXNoY2FyZHNDb250ZW50IC8+XG4gICAgPC9Qcm90ZWN0ZWRSb3V0ZT5cbiAgKVxufSJdLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIkxpbmsiLCJQcm90ZWN0ZWRSb3V0ZSIsImZsYXNoY2FyZHNTZXJ2aWNlIiwiRmxhc2hjYXJkc0NvbnRlbnQiLCJhY3RpdmVUYWIiLCJzZXRBY3RpdmVUYWIiLCJzZWxlY3RlZFNldCIsInNldFNlbGVjdGVkU2V0Iiwic2VhcmNoVGVybSIsInNldFNlYXJjaFRlcm0iLCJjYXJkU2V0cyIsInNldENhcmRTZXRzIiwiZmxhc2hjYXJkcyIsInNldEZsYXNoY2FyZHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJsb2FkQ2FyZFNldHMiLCJsb2FkRmxhc2hjYXJkcyIsInJlc3VsdCIsImdldENhcmRTZXRzIiwic3VjY2VzcyIsImRhdGEiLCJzZXRzIiwiZXJyIiwiZ2V0Rmxhc2hjYXJkcyIsInVuZGVmaW5lZCIsImZpbHRlcmVkU2V0cyIsImZpbHRlciIsInNldCIsIm5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiZGVzY3JpcHRpb24iLCJmaWx0ZXJlZENhcmRzIiwiY2FyZCIsIndvcmQiLCJ0cmFuc2xhdGlvbiIsImRpdiIsImNsYXNzTmFtZSIsImgxIiwicCIsImhyZWYiLCJidXR0b24iLCJvbkNsaWNrIiwibGVuZ3RoIiwiaW5wdXQiLCJ0eXBlIiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJwbGFjZWhvbGRlciIsInN2ZyIsImZpbGwiLCJzdHJva2UiLCJ2aWV3Qm94IiwicGF0aCIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsInN0cm9rZVdpZHRoIiwiZCIsImgzIiwibWFwIiwiaWQiLCJjb2xvciIsImg0Iiwic3BhbiIsImNhcmRDb3VudCIsInByb2dyZXNzIiwicGFydE9mU3BlZWNoIiwicHJvbnVuY2lhdGlvbiIsImV4YW1wbGUiLCJjYXJkU2V0IiwibWFzdGVyeUxldmVsIiwidGltZXNSZXZpZXdlZCIsIkRhdGUiLCJuZXh0UmV2aWV3RGF0ZSIsInRvTG9jYWxlRGF0ZVN0cmluZyIsImNvbnNvbGUiLCJsb2ciLCJGbGFzaGNhcmRzUGFnZSJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/flashcards/page.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./components/ProtectedRoute.tsx": /*!***************************************!*\ !*** ./components/ProtectedRoute.tsx ***! \***************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProtectedRoute: () => (/* binding */ ProtectedRoute),\n/* harmony export */ withAuth: () => (/* binding */ withAuth)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var _contexts_AuthContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/contexts/AuthContext */ \"(app-pages-browser)/./contexts/AuthContext.tsx\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);\n/* __next_internal_client_entry_do_not_use__ ProtectedRoute,withAuth auto */ \nvar _s = $RefreshSig$();\n\n\n\nconst ProtectedRoute = (param)=>{\n let { children, redirectTo = '/login', fallback } = param;\n _s();\n const { isAuthenticated, isLoading, checkAuth } = (0,_contexts_AuthContext__WEBPACK_IMPORTED_MODULE_1__.useAuth)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)();\n (0,react__WEBPACK_IMPORTED_MODULE_3__.useEffect)({\n \"ProtectedRoute.useEffect\": ()=>{\n const verifyAuth = {\n \"ProtectedRoute.useEffect.verifyAuth\": async ()=>{\n if (!isLoading) {\n if (!isAuthenticated) {\n router.push(redirectTo);\n return;\n }\n // 額外檢查 token 有效性\n const isValid = await checkAuth();\n if (!isValid) {\n router.push(redirectTo);\n }\n }\n }\n }[\"ProtectedRoute.useEffect.verifyAuth\"];\n verifyAuth();\n }\n }[\"ProtectedRoute.useEffect\"], [\n isAuthenticated,\n isLoading,\n router,\n redirectTo,\n checkAuth\n ]);\n // Loading 狀態\n if (isLoading) {\n return fallback || /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 flex items-center justify-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"bg-white rounded-2xl shadow-xl p-8\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center space-x-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 47,\n columnNumber: 15\n }, undefined),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-gray-600\",\n children: \"驗證中...\"\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 48,\n columnNumber: 15\n }, undefined)\n ]\n }, void 0, true, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 46,\n columnNumber: 13\n }, undefined)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 45,\n columnNumber: 11\n }, undefined)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 44,\n columnNumber: 9\n }, undefined);\n }\n // 未認證\n if (!isAuthenticated) {\n return null // 這時會觸發重定向\n ;\n }\n // 已認證,渲染子組件\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: children\n }, void 0, false);\n};\n_s(ProtectedRoute, \"x+SBrU9DYGXoe4fLF0sYh1M3I4M=\", false, function() {\n return [\n _contexts_AuthContext__WEBPACK_IMPORTED_MODULE_1__.useAuth,\n next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter\n ];\n});\n_c = ProtectedRoute;\n// 便利的 HOC 版本\nfunction withAuth(Component) {\n let redirectTo = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : '/login';\n const AuthenticatedComponent = (props)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(ProtectedRoute, {\n redirectTo: redirectTo,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(Component, {\n ...props\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 69,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/components/ProtectedRoute.tsx\",\n lineNumber: 68,\n columnNumber: 5\n }, this);\n AuthenticatedComponent.displayName = \"withAuth(\".concat(Component.displayName || Component.name, \")\");\n return AuthenticatedComponent;\n}\nvar _c;\n$RefreshReg$(_c, \"ProtectedRoute\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvUHJvdGVjdGVkUm91dGUudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUVnRDtBQUNMO0FBQ1Y7QUFRMUIsTUFBTUcsaUJBQWdEO1FBQUMsRUFDNURDLFFBQVEsRUFDUkMsYUFBYSxRQUFRLEVBQ3JCQyxRQUFRLEVBQ1Q7O0lBQ0MsTUFBTSxFQUFFQyxlQUFlLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFLEdBQUdULDhEQUFPQTtJQUN6RCxNQUFNVSxTQUFTVCwwREFBU0E7SUFFeEJDLGdEQUFTQTtvQ0FBQztZQUNSLE1BQU1TO3VEQUFhO29CQUNqQixJQUFJLENBQUNILFdBQVc7d0JBQ2QsSUFBSSxDQUFDRCxpQkFBaUI7NEJBQ3BCRyxPQUFPRSxJQUFJLENBQUNQOzRCQUNaO3dCQUNGO3dCQUVBLGlCQUFpQjt3QkFDakIsTUFBTVEsVUFBVSxNQUFNSjt3QkFDdEIsSUFBSSxDQUFDSSxTQUFTOzRCQUNaSCxPQUFPRSxJQUFJLENBQUNQO3dCQUNkO29CQUNGO2dCQUNGOztZQUVBTTtRQUNGO21DQUFHO1FBQUNKO1FBQWlCQztRQUFXRTtRQUFRTDtRQUFZSTtLQUFVO0lBRTlELGFBQWE7SUFDYixJQUFJRCxXQUFXO1FBQ2IsT0FDRUYsMEJBQ0UsOERBQUNRO1lBQUlDLFdBQVU7c0JBQ2IsNEVBQUNEO2dCQUFJQyxXQUFVOzBCQUNiLDRFQUFDRDtvQkFBSUMsV0FBVTs7c0NBQ2IsOERBQUNEOzRCQUFJQyxXQUFVOzs7Ozs7c0NBQ2YsOERBQUNDOzRCQUFFRCxXQUFVO3NDQUFnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQU16QztJQUVBLE1BQU07SUFDTixJQUFJLENBQUNSLGlCQUFpQjtRQUNwQixPQUFPLEtBQUssV0FBVzs7SUFDekI7SUFFQSxZQUFZO0lBQ1oscUJBQU87a0JBQUdIOztBQUNaLEVBQUM7R0FsRFlEOztRQUt1Q0gsMERBQU9BO1FBQzFDQyxzREFBU0E7OztLQU5iRTtBQW9EYixhQUFhO0FBQ04sU0FBU2MsU0FBMkJDLFNBQWlDO1FBQUViLGFBQUFBLGlFQUFhO0lBQ3pGLE1BQU1jLHlCQUF5QixDQUFDQyxzQkFDOUIsOERBQUNqQjtZQUFlRSxZQUFZQTtzQkFDMUIsNEVBQUNhO2dCQUFXLEdBQUdFLEtBQUs7Ozs7Ozs7Ozs7O0lBSXhCRCx1QkFBdUJFLFdBQVcsR0FBRyxZQUFvRCxPQUF4Q0gsVUFBVUcsV0FBVyxJQUFJSCxVQUFVSSxJQUFJLEVBQUM7SUFFekYsT0FBT0g7QUFDVCIsInNvdXJjZXMiOlsiL1VzZXJzL2pldHRjaGVuZzEwMTgvY29kZS9kcmFtYWxpbmctdm9jYWItbGVhcm5pbmcvZnJvbnRlbmQvY29tcG9uZW50cy9Qcm90ZWN0ZWRSb3V0ZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnXHJcblxyXG5pbXBvcnQgeyB1c2VBdXRoIH0gZnJvbSAnQC9jb250ZXh0cy9BdXRoQ29udGV4dCdcclxuaW1wb3J0IHsgdXNlUm91dGVyIH0gZnJvbSAnbmV4dC9uYXZpZ2F0aW9uJ1xyXG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcclxuXHJcbmludGVyZmFjZSBQcm90ZWN0ZWRSb3V0ZVByb3BzIHtcclxuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXHJcbiAgcmVkaXJlY3RUbz86IHN0cmluZ1xyXG4gIGZhbGxiYWNrPzogUmVhY3QuUmVhY3ROb2RlXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBQcm90ZWN0ZWRSb3V0ZTogUmVhY3QuRkM8UHJvdGVjdGVkUm91dGVQcm9wcz4gPSAoe1xyXG4gIGNoaWxkcmVuLFxyXG4gIHJlZGlyZWN0VG8gPSAnL2xvZ2luJyxcclxuICBmYWxsYmFja1xyXG59KSA9PiB7XHJcbiAgY29uc3QgeyBpc0F1dGhlbnRpY2F0ZWQsIGlzTG9hZGluZywgY2hlY2tBdXRoIH0gPSB1c2VBdXRoKClcclxuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKVxyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgdmVyaWZ5QXV0aCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKCFpc0xvYWRpbmcpIHtcclxuICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICAgICAgcm91dGVyLnB1c2gocmVkaXJlY3RUbylcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g6aGN5aSW5qqi5p+lIHRva2VuIOacieaViOaAp1xyXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCBjaGVja0F1dGgoKVxyXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xyXG4gICAgICAgICAgcm91dGVyLnB1c2gocmVkaXJlY3RUbylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2ZXJpZnlBdXRoKClcclxuICB9LCBbaXNBdXRoZW50aWNhdGVkLCBpc0xvYWRpbmcsIHJvdXRlciwgcmVkaXJlY3RUbywgY2hlY2tBdXRoXSlcclxuXHJcbiAgLy8gTG9hZGluZyDni4DmhYtcclxuICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBmYWxsYmFjayB8fCAoXHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctZ3JhZGllbnQtdG8tYnIgZnJvbS1ibHVlLTUwIHRvLWluZGlnby0xMDAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmctd2hpdGUgcm91bmRlZC0yeGwgc2hhZG93LXhsIHAtOFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtNFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYW5pbWF0ZS1zcGluIHJvdW5kZWQtZnVsbCBoLTggdy04IGJvcmRlci1iLTIgYm9yZGVyLXByaW1hcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktNjAwXCI+6amX6K2J5LitLi4uPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICAvLyDmnKroqo3orYlcclxuICBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgcmV0dXJuIG51bGwgLy8g6YCZ5pmC5pyD6Ke455m86YeN5a6a5ZCRXHJcbiAgfVxyXG5cclxuICAvLyDlt7Loqo3orYnvvIzmuLLmn5PlrZDntYTku7ZcclxuICByZXR1cm4gPD57Y2hpbGRyZW59PC8+XHJcbn1cclxuXHJcbi8vIOS+v+WIqeeahCBIT0Mg54mI5pysXHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoQXV0aDxUIGV4dGVuZHMgb2JqZWN0PihDb21wb25lbnQ6IFJlYWN0LkNvbXBvbmVudFR5cGU8VD4sIHJlZGlyZWN0VG8gPSAnL2xvZ2luJykge1xyXG4gIGNvbnN0IEF1dGhlbnRpY2F0ZWRDb21wb25lbnQgPSAocHJvcHM6IFQpID0+IChcclxuICAgIDxQcm90ZWN0ZWRSb3V0ZSByZWRpcmVjdFRvPXtyZWRpcmVjdFRvfT5cclxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XHJcbiAgICA8L1Byb3RlY3RlZFJvdXRlPlxyXG4gIClcclxuXHJcbiAgQXV0aGVudGljYXRlZENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IGB3aXRoQXV0aCgke0NvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZX0pYFxyXG5cclxuICByZXR1cm4gQXV0aGVudGljYXRlZENvbXBvbmVudFxyXG59Il0sIm5hbWVzIjpbInVzZUF1dGgiLCJ1c2VSb3V0ZXIiLCJ1c2VFZmZlY3QiLCJQcm90ZWN0ZWRSb3V0ZSIsImNoaWxkcmVuIiwicmVkaXJlY3RUbyIsImZhbGxiYWNrIiwiaXNBdXRoZW50aWNhdGVkIiwiaXNMb2FkaW5nIiwiY2hlY2tBdXRoIiwicm91dGVyIiwidmVyaWZ5QXV0aCIsInB1c2giLCJpc1ZhbGlkIiwiZGl2IiwiY2xhc3NOYW1lIiwicCIsIndpdGhBdXRoIiwiQ29tcG9uZW50IiwiQXV0aGVudGljYXRlZENvbXBvbmVudCIsInByb3BzIiwiZGlzcGxheU5hbWUiLCJuYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/ProtectedRoute.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./contexts/AuthContext.tsx": /*!**********************************!*\ !*** ./contexts/AuthContext.tsx ***! \**********************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AuthProvider: () => (/* binding */ AuthProvider),\n/* harmony export */ useAuth: () => (/* binding */ useAuth)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/lib/services/auth */ \"(app-pages-browser)/./lib/services/auth.ts\");\n/* __next_internal_client_entry_do_not_use__ useAuth,AuthProvider auto */ \nvar _s = $RefreshSig$(), _s1 = $RefreshSig$();\n\n\nconst AuthContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)(undefined);\nconst useAuth = ()=>{\n _s();\n const context = (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(AuthContext);\n if (context === undefined) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n return context;\n};\n_s(useAuth, \"b9L3QQ+jgeyIrH0NfHrJ8nn7VMU=\");\nconst AuthProvider = (param)=>{\n let { children } = param;\n _s1();\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({\n user: null,\n token: null,\n isAuthenticated: false,\n isLoading: true\n });\n // 初始化時檢查認證狀態\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n \"AuthProvider.useEffect\": ()=>{\n const initAuth = {\n \"AuthProvider.useEffect.initAuth\": async ()=>{\n const token = _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.getToken();\n const user = _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.getUser();\n if (token && user) {\n // 驗證 token 是否仍然有效\n const isValid = await _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.checkAuthStatus();\n if (isValid) {\n setState({\n user,\n token,\n isAuthenticated: true,\n isLoading: false\n });\n } else {\n // Token 無效,清除本地存儲\n _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.logout();\n setState({\n user: null,\n token: null,\n isAuthenticated: false,\n isLoading: false\n });\n }\n } else {\n setState({\n user: null,\n token: null,\n isAuthenticated: false,\n isLoading: false\n });\n }\n }\n }[\"AuthProvider.useEffect.initAuth\"];\n initAuth();\n }\n }[\"AuthProvider.useEffect\"], []);\n const login = async (email, password)=>{\n try {\n const response = await _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.login({\n email,\n password\n });\n if (response.success && response.data) {\n setState({\n user: response.data.user,\n token: response.data.token,\n isAuthenticated: true,\n isLoading: false\n });\n return {\n success: true\n };\n } else {\n return {\n success: false,\n error: response.error || '登入失敗'\n };\n }\n } catch (error) {\n return {\n success: false,\n error: '網路錯誤,請稍後再試'\n };\n }\n };\n const register = async (username, email, password)=>{\n try {\n const response = await _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.register({\n username,\n email,\n password\n });\n if (response.success && response.data) {\n setState({\n user: response.data.user,\n token: response.data.token,\n isAuthenticated: true,\n isLoading: false\n });\n return {\n success: true\n };\n } else {\n return {\n success: false,\n error: response.error || '註冊失敗'\n };\n }\n } catch (error) {\n return {\n success: false,\n error: '網路錯誤,請稍後再試'\n };\n }\n };\n const logout = ()=>{\n _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.logout();\n setState({\n user: null,\n token: null,\n isAuthenticated: false,\n isLoading: false\n });\n };\n const checkAuth = async ()=>{\n if (!state.token) return false;\n const isValid = await _lib_services_auth__WEBPACK_IMPORTED_MODULE_2__.authService.checkAuthStatus();\n if (!isValid) {\n logout();\n return false;\n }\n return true;\n };\n const contextValue = {\n ...state,\n login,\n register,\n logout,\n checkAuth\n };\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(AuthContext.Provider, {\n value: contextValue,\n children: children\n }, void 0, false, {\n fileName: \"/Users/jettcheng1018/code/dramaling-vocab-learning/frontend/contexts/AuthContext.tsx\",\n lineNumber: 151,\n columnNumber: 5\n }, undefined);\n};\n_s1(AuthProvider, \"STD6XmSLej9PRMYjA5U8weIzddw=\");\n_c = AuthProvider;\nvar _c;\n$RefreshReg$(_c, \"AuthProvider\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbnRleHRzL0F1dGhDb250ZXh0LnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUV3RjtBQUNqQztBQWdCdkQsTUFBTU0sNEJBQWNMLG9EQUFhQSxDQUE4Qk07QUFFeEQsTUFBTUMsVUFBVTs7SUFDckIsTUFBTUMsVUFBVVAsaURBQVVBLENBQUNJO0lBQzNCLElBQUlHLFlBQVlGLFdBQVc7UUFDekIsTUFBTSxJQUFJRyxNQUFNO0lBQ2xCO0lBQ0EsT0FBT0Q7QUFDVCxFQUFDO0dBTllEO0FBWU4sTUFBTUcsZUFBNEM7UUFBQyxFQUFFQyxRQUFRLEVBQUU7O0lBQ3BFLE1BQU0sQ0FBQ0MsT0FBT0MsU0FBUyxHQUFHViwrQ0FBUUEsQ0FBWTtRQUM1Q1csTUFBTTtRQUNOQyxPQUFPO1FBQ1BDLGlCQUFpQjtRQUNqQkMsV0FBVztJQUNiO0lBRUEsYUFBYTtJQUNiZixnREFBU0E7a0NBQUM7WUFDUixNQUFNZ0I7bURBQVc7b0JBQ2YsTUFBTUgsUUFBUVgsMkRBQVdBLENBQUNlLFFBQVE7b0JBQ2xDLE1BQU1MLE9BQU9WLDJEQUFXQSxDQUFDZ0IsT0FBTztvQkFFaEMsSUFBSUwsU0FBU0QsTUFBTTt3QkFDakIsa0JBQWtCO3dCQUNsQixNQUFNTyxVQUFVLE1BQU1qQiwyREFBV0EsQ0FBQ2tCLGVBQWU7d0JBQ2pELElBQUlELFNBQVM7NEJBQ1hSLFNBQVM7Z0NBQ1BDO2dDQUNBQztnQ0FDQUMsaUJBQWlCO2dDQUNqQkMsV0FBVzs0QkFDYjt3QkFDRixPQUFPOzRCQUNMLGtCQUFrQjs0QkFDbEJiLDJEQUFXQSxDQUFDbUIsTUFBTTs0QkFDbEJWLFNBQVM7Z0NBQ1BDLE1BQU07Z0NBQ05DLE9BQU87Z0NBQ1BDLGlCQUFpQjtnQ0FDakJDLFdBQVc7NEJBQ2I7d0JBQ0Y7b0JBQ0YsT0FBTzt3QkFDTEosU0FBUzs0QkFDUEMsTUFBTTs0QkFDTkMsT0FBTzs0QkFDUEMsaUJBQWlCOzRCQUNqQkMsV0FBVzt3QkFDYjtvQkFDRjtnQkFDRjs7WUFFQUM7UUFDRjtpQ0FBRyxFQUFFO0lBRUwsTUFBTU0sUUFBUSxPQUFPQyxPQUFlQztRQUNsQyxJQUFJO1lBQ0YsTUFBTUMsV0FBVyxNQUFNdkIsMkRBQVdBLENBQUNvQixLQUFLLENBQUM7Z0JBQUVDO2dCQUFPQztZQUFTO1lBRTNELElBQUlDLFNBQVNDLE9BQU8sSUFBSUQsU0FBU0UsSUFBSSxFQUFFO2dCQUNyQ2hCLFNBQVM7b0JBQ1BDLE1BQU1hLFNBQVNFLElBQUksQ0FBQ2YsSUFBSTtvQkFDeEJDLE9BQU9ZLFNBQVNFLElBQUksQ0FBQ2QsS0FBSztvQkFDMUJDLGlCQUFpQjtvQkFDakJDLFdBQVc7Z0JBQ2I7Z0JBQ0EsT0FBTztvQkFBRVcsU0FBUztnQkFBSztZQUN6QixPQUFPO2dCQUNMLE9BQU87b0JBQUVBLFNBQVM7b0JBQU9FLE9BQU9ILFNBQVNHLEtBQUssSUFBSTtnQkFBTztZQUMzRDtRQUNGLEVBQUUsT0FBT0EsT0FBTztZQUNkLE9BQU87Z0JBQUVGLFNBQVM7Z0JBQU9FLE9BQU87WUFBYTtRQUMvQztJQUNGO0lBRUEsTUFBTUMsV0FBVyxPQUFPQyxVQUFrQlAsT0FBZUM7UUFDdkQsSUFBSTtZQUNGLE1BQU1DLFdBQVcsTUFBTXZCLDJEQUFXQSxDQUFDMkIsUUFBUSxDQUFDO2dCQUFFQztnQkFBVVA7Z0JBQU9DO1lBQVM7WUFFeEUsSUFBSUMsU0FBU0MsT0FBTyxJQUFJRCxTQUFTRSxJQUFJLEVBQUU7Z0JBQ3JDaEIsU0FBUztvQkFDUEMsTUFBTWEsU0FBU0UsSUFBSSxDQUFDZixJQUFJO29CQUN4QkMsT0FBT1ksU0FBU0UsSUFBSSxDQUFDZCxLQUFLO29CQUMxQkMsaUJBQWlCO29CQUNqQkMsV0FBVztnQkFDYjtnQkFDQSxPQUFPO29CQUFFVyxTQUFTO2dCQUFLO1lBQ3pCLE9BQU87Z0JBQ0wsT0FBTztvQkFBRUEsU0FBUztvQkFBT0UsT0FBT0gsU0FBU0csS0FBSyxJQUFJO2dCQUFPO1lBQzNEO1FBQ0YsRUFBRSxPQUFPQSxPQUFPO1lBQ2QsT0FBTztnQkFBRUYsU0FBUztnQkFBT0UsT0FBTztZQUFhO1FBQy9DO0lBQ0Y7SUFFQSxNQUFNUCxTQUFTO1FBQ2JuQiwyREFBV0EsQ0FBQ21CLE1BQU07UUFDbEJWLFNBQVM7WUFDUEMsTUFBTTtZQUNOQyxPQUFPO1lBQ1BDLGlCQUFpQjtZQUNqQkMsV0FBVztRQUNiO0lBQ0Y7SUFFQSxNQUFNZ0IsWUFBWTtRQUNoQixJQUFJLENBQUNyQixNQUFNRyxLQUFLLEVBQUUsT0FBTztRQUV6QixNQUFNTSxVQUFVLE1BQU1qQiwyREFBV0EsQ0FBQ2tCLGVBQWU7UUFDakQsSUFBSSxDQUFDRCxTQUFTO1lBQ1pFO1lBQ0EsT0FBTztRQUNUO1FBQ0EsT0FBTztJQUNUO0lBRUEsTUFBTVcsZUFBZ0M7UUFDcEMsR0FBR3RCLEtBQUs7UUFDUlk7UUFDQU87UUFDQVI7UUFDQVU7SUFDRjtJQUVBLHFCQUNFLDhEQUFDNUIsWUFBWThCLFFBQVE7UUFBQ0MsT0FBT0Y7a0JBQzFCdkI7Ozs7OztBQUdQLEVBQUM7SUF6SFlEO0tBQUFBIiwic291cmNlcyI6WyIvVXNlcnMvamV0dGNoZW5nMTAxOC9jb2RlL2RyYW1hbGluZy12b2NhYi1sZWFybmluZy9mcm9udGVuZC9jb250ZXh0cy9BdXRoQ29udGV4dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnXHJcblxyXG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnXHJcbmltcG9ydCB7IGF1dGhTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnQC9saWIvc2VydmljZXMvYXV0aCdcclxuXHJcbmludGVyZmFjZSBBdXRoU3RhdGUge1xyXG4gIHVzZXI6IFVzZXIgfCBudWxsXHJcbiAgdG9rZW46IHN0cmluZyB8IG51bGxcclxuICBpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW5cclxuICBpc0xvYWRpbmc6IGJvb2xlYW5cclxufVxyXG5cclxuaW50ZXJmYWNlIEF1dGhDb250ZXh0VHlwZSBleHRlbmRzIEF1dGhTdGF0ZSB7XHJcbiAgbG9naW46IChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT5cclxuICByZWdpc3RlcjogKHVzZXJuYW1lOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpID0+IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9PlxyXG4gIGxvZ291dDogKCkgPT4gdm9pZFxyXG4gIGNoZWNrQXV0aDogKCkgPT4gUHJvbWlzZTxib29sZWFuPlxyXG59XHJcblxyXG5jb25zdCBBdXRoQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8QXV0aENvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXHJcblxyXG5leHBvcnQgY29uc3QgdXNlQXV0aCA9ICgpID0+IHtcclxuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChBdXRoQ29udGV4dClcclxuICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGggbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoUHJvdmlkZXInKVxyXG4gIH1cclxuICByZXR1cm4gY29udGV4dFxyXG59XHJcblxyXG5pbnRlcmZhY2UgQXV0aFByb3ZpZGVyUHJvcHMge1xyXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEF1dGhQcm92aWRlcjogUmVhY3QuRkM8QXV0aFByb3ZpZGVyUHJvcHM+ID0gKHsgY2hpbGRyZW4gfSkgPT4ge1xyXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGU8QXV0aFN0YXRlPih7XHJcbiAgICB1c2VyOiBudWxsLFxyXG4gICAgdG9rZW46IG51bGwsXHJcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxyXG4gICAgaXNMb2FkaW5nOiB0cnVlLFxyXG4gIH0pXHJcblxyXG4gIC8vIOWIneWni+WMluaZguaqouafpeiqjeitieeLgOaFi1xyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBpbml0QXV0aCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgdG9rZW4gPSBhdXRoU2VydmljZS5nZXRUb2tlbigpXHJcbiAgICAgIGNvbnN0IHVzZXIgPSBhdXRoU2VydmljZS5nZXRVc2VyKClcclxuXHJcbiAgICAgIGlmICh0b2tlbiAmJiB1c2VyKSB7XHJcbiAgICAgICAgLy8g6amX6K2JIHRva2VuIOaYr+WQpuS7jeeEtuacieaViFxyXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBhd2FpdCBhdXRoU2VydmljZS5jaGVja0F1dGhTdGF0dXMoKVxyXG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIHVzZXIsXHJcbiAgICAgICAgICAgIHRva2VuLFxyXG4gICAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBUb2tlbiDnhKHmlYjvvIzmuIXpmaTmnKzlnLDlrZjlhLJcclxuICAgICAgICAgIGF1dGhTZXJ2aWNlLmxvZ291dCgpXHJcbiAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIHVzZXI6IG51bGwsXHJcbiAgICAgICAgICAgIHRva2VuOiBudWxsLFxyXG4gICAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0U3RhdGUoe1xyXG4gICAgICAgICAgdXNlcjogbnVsbCxcclxuICAgICAgICAgIHRva2VuOiBudWxsLFxyXG4gICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcclxuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRBdXRoKClcclxuICB9LCBbXSlcclxuXHJcbiAgY29uc3QgbG9naW4gPSBhc3luYyAoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoU2VydmljZS5sb2dpbih7IGVtYWlsLCBwYXNzd29yZCB9KVxyXG5cclxuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgIHNldFN0YXRlKHtcclxuICAgICAgICAgIHVzZXI6IHJlc3BvbnNlLmRhdGEudXNlcixcclxuICAgICAgICAgIHRva2VuOiByZXNwb25zZS5kYXRhLnRva2VuLFxyXG4gICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiB0cnVlLFxyXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogcmVzcG9uc2UuZXJyb3IgfHwgJ+eZu+WFpeWkseaVlycgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICfntrLot6/pjK/oqqTvvIzoq4vnqI3lvozlho3oqaYnIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlZ2lzdGVyID0gYXN5bmMgKHVzZXJuYW1lOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXV0aFNlcnZpY2UucmVnaXN0ZXIoeyB1c2VybmFtZSwgZW1haWwsIHBhc3N3b3JkIH0pXHJcblxyXG4gICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgc2V0U3RhdGUoe1xyXG4gICAgICAgICAgdXNlcjogcmVzcG9uc2UuZGF0YS51c2VyLFxyXG4gICAgICAgICAgdG9rZW46IHJlc3BvbnNlLmRhdGEudG9rZW4sXHJcbiAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXHJcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiByZXNwb25zZS5lcnJvciB8fCAn6Ki75YaK5aSx5pWXJyB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ+e2sui3r+mMr+iqpO+8jOiri+eojeW+jOWGjeippicgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbG9nb3V0ID0gKCkgPT4ge1xyXG4gICAgYXV0aFNlcnZpY2UubG9nb3V0KClcclxuICAgIHNldFN0YXRlKHtcclxuICAgICAgdXNlcjogbnVsbCxcclxuICAgICAgdG9rZW46IG51bGwsXHJcbiAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXHJcbiAgICAgIGlzTG9hZGluZzogZmFsc2UsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2hlY2tBdXRoID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgaWYgKCFzdGF0ZS50b2tlbikgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgY29uc3QgaXNWYWxpZCA9IGF3YWl0IGF1dGhTZXJ2aWNlLmNoZWNrQXV0aFN0YXR1cygpXHJcbiAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgbG9nb3V0KClcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY29udGV4dFZhbHVlOiBBdXRoQ29udGV4dFR5cGUgPSB7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIGxvZ2luLFxyXG4gICAgcmVnaXN0ZXIsXHJcbiAgICBsb2dvdXQsXHJcbiAgICBjaGVja0F1dGgsXHJcbiAgfVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPEF1dGhDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0VmFsdWV9PlxyXG4gICAgICB7Y2hpbGRyZW59XHJcbiAgICA8L0F1dGhDb250ZXh0LlByb3ZpZGVyPlxyXG4gIClcclxufSJdLCJuYW1lcyI6WyJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJ1c2VDb250ZXh0IiwidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJhdXRoU2VydmljZSIsIkF1dGhDb250ZXh0IiwidW5kZWZpbmVkIiwidXNlQXV0aCIsImNvbnRleHQiLCJFcnJvciIsIkF1dGhQcm92aWRlciIsImNoaWxkcmVuIiwic3RhdGUiLCJzZXRTdGF0ZSIsInVzZXIiLCJ0b2tlbiIsImlzQXV0aGVudGljYXRlZCIsImlzTG9hZGluZyIsImluaXRBdXRoIiwiZ2V0VG9rZW4iLCJnZXRVc2VyIiwiaXNWYWxpZCIsImNoZWNrQXV0aFN0YXR1cyIsImxvZ291dCIsImxvZ2luIiwiZW1haWwiLCJwYXNzd29yZCIsInJlc3BvbnNlIiwic3VjY2VzcyIsImRhdGEiLCJlcnJvciIsInJlZ2lzdGVyIiwidXNlcm5hbWUiLCJjaGVja0F1dGgiLCJjb250ZXh0VmFsdWUiLCJQcm92aWRlciIsInZhbHVlIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./contexts/AuthContext.tsx\n")); /***/ }), /***/ "(app-pages-browser)/./lib/services/auth.ts": /*!******************************!*\ !*** ./lib/services/auth.ts ***! \******************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ authService: () => (/* binding */ authService)\n/* harmony export */ });\n// Auth service for handling authentication API calls\nconst API_BASE_URL = 'http://localhost:5000';\nclass AuthService {\n async makeRequest(endpoint) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n const url = \"\".concat(API_BASE_URL, \"/api/auth\").concat(endpoint);\n console.log('Making request to:', url);\n console.log('Request body:', options.body);\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers\n },\n ...options\n });\n if (!response.ok) {\n const errorData = await response.json().catch(()=>({\n error: 'Network error'\n }));\n console.log('API Error Response:', errorData);\n // 處理驗證錯誤 (400 Bad Request)\n if (response.status === 400 && errorData.errors) {\n const validationErrors = Object.entries(errorData.errors).map((param)=>{\n let [field, messages] = param;\n return \"\".concat(field, \": \").concat(Array.isArray(messages) ? messages.join(', ') : messages);\n }).join('\\n');\n throw new Error(validationErrors);\n }\n throw new Error(errorData.error || errorData.title || \"HTTP \".concat(response.status));\n }\n return response.json();\n }\n async login(data) {\n try {\n var _response_data;\n const response = await this.makeRequest('/login', {\n method: 'POST',\n body: JSON.stringify(data)\n });\n if (response.success && ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : _response_data.token)) {\n // Store token in localStorage\n localStorage.setItem('auth_token', response.data.token);\n localStorage.setItem('user_data', JSON.stringify(response.data.user));\n }\n return response;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Login failed'\n };\n }\n }\n async register(data) {\n try {\n var _response_data;\n console.log('AuthService.register called with:', {\n username: data.username,\n email: data.email,\n password: data.password ? '[hidden]' : 'empty'\n });\n const response = await this.makeRequest('/register', {\n method: 'POST',\n body: JSON.stringify(data)\n });\n if (response.success && ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : _response_data.token)) {\n // Store token in localStorage\n localStorage.setItem('auth_token', response.data.token);\n localStorage.setItem('user_data', JSON.stringify(response.data.user));\n }\n return response;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Registration failed'\n };\n }\n }\n async logout() {\n localStorage.removeItem('auth_token');\n localStorage.removeItem('user_data');\n }\n getToken() {\n if (false) {}\n return localStorage.getItem('auth_token');\n }\n getUser() {\n if (false) {}\n const userData = localStorage.getItem('user_data');\n return userData ? JSON.parse(userData) : null;\n }\n isAuthenticated() {\n return this.getToken() !== null;\n }\n async checkAuthStatus() {\n const token = this.getToken();\n if (!token) return false;\n try {\n await this.makeRequest('/status', {\n headers: {\n 'Authorization': \"Bearer \".concat(token)\n }\n });\n return true;\n } catch (e) {\n // Token is invalid, clear it\n this.logout();\n return false;\n }\n }\n}\nconst authService = new AuthService();\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2xpYi9zZXJ2aWNlcy9hdXRoLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxxREFBcUQ7QUErQnJELE1BQU1BLGVBQWU7QUFFckIsTUFBTUM7SUFDSixNQUFjQyxZQUNaQyxRQUFnQixFQUVKO1lBRFpDLFVBQUFBLGlFQUF1QixDQUFDO1FBRXhCLE1BQU1DLE1BQU0sR0FBMkJGLE9BQXhCSCxjQUFhLGFBQW9CLE9BQVRHO1FBRXZDRyxRQUFRQyxHQUFHLENBQUMsc0JBQXNCRjtRQUNsQ0MsUUFBUUMsR0FBRyxDQUFDLGlCQUFpQkgsUUFBUUksSUFBSTtRQUV6QyxNQUFNQyxXQUFXLE1BQU1DLE1BQU1MLEtBQUs7WUFDaENNLFNBQVM7Z0JBQ1AsZ0JBQWdCO2dCQUNoQixHQUFHUCxRQUFRTyxPQUFPO1lBQ3BCO1lBQ0EsR0FBR1AsT0FBTztRQUNaO1FBRUEsSUFBSSxDQUFDSyxTQUFTRyxFQUFFLEVBQUU7WUFDaEIsTUFBTUMsWUFBWSxNQUFNSixTQUFTSyxJQUFJLEdBQUdDLEtBQUssQ0FBQyxJQUFPO29CQUFFQyxPQUFPO2dCQUFnQjtZQUM5RVYsUUFBUUMsR0FBRyxDQUFDLHVCQUF1Qk07WUFFbkMsMkJBQTJCO1lBQzNCLElBQUlKLFNBQVNRLE1BQU0sS0FBSyxPQUFPSixVQUFVSyxNQUFNLEVBQUU7Z0JBQy9DLE1BQU1DLG1CQUFtQkMsT0FBT0MsT0FBTyxDQUFDUixVQUFVSyxNQUFNLEVBQ3JESSxHQUFHLENBQUM7d0JBQUMsQ0FBQ0MsT0FBT0MsU0FBd0I7MkJBQUssR0FBYUMsT0FBVkYsT0FBTSxNQUE2RCxPQUF6REUsTUFBTUMsT0FBTyxDQUFDRixZQUFZQSxTQUFTRyxJQUFJLENBQUMsUUFBUUg7bUJBQ3ZHRyxJQUFJLENBQUM7Z0JBQ1IsTUFBTSxJQUFJQyxNQUFNVDtZQUNsQjtZQUVBLE1BQU0sSUFBSVMsTUFBTWYsVUFBVUcsS0FBSyxJQUFJSCxVQUFVZ0IsS0FBSyxJQUFJLFFBQXdCLE9BQWhCcEIsU0FBU1EsTUFBTTtRQUMvRTtRQUVBLE9BQU9SLFNBQVNLLElBQUk7SUFDdEI7SUFFQSxNQUFNZ0IsTUFBTUMsSUFBa0IsRUFBeUI7UUFDckQsSUFBSTtnQkFNc0J0QjtZQUx4QixNQUFNQSxXQUFXLE1BQU0sSUFBSSxDQUFDUCxXQUFXLENBQWUsVUFBVTtnQkFDOUQ4QixRQUFRO2dCQUNSeEIsTUFBTXlCLEtBQUtDLFNBQVMsQ0FBQ0g7WUFDdkI7WUFFQSxJQUFJdEIsU0FBUzBCLE9BQU8sTUFBSTFCLGlCQUFBQSxTQUFTc0IsSUFBSSxjQUFidEIscUNBQUFBLGVBQWUyQixLQUFLLEdBQUU7Z0JBQzVDLDhCQUE4QjtnQkFDOUJDLGFBQWFDLE9BQU8sQ0FBQyxjQUFjN0IsU0FBU3NCLElBQUksQ0FBQ0ssS0FBSztnQkFDdERDLGFBQWFDLE9BQU8sQ0FBQyxhQUFhTCxLQUFLQyxTQUFTLENBQUN6QixTQUFTc0IsSUFBSSxDQUFDUSxJQUFJO1lBQ3JFO1lBRUEsT0FBTzlCO1FBQ1QsRUFBRSxPQUFPTyxPQUFPO1lBQ2QsT0FBTztnQkFDTG1CLFNBQVM7Z0JBQ1RuQixPQUFPQSxpQkFBaUJZLFFBQVFaLE1BQU13QixPQUFPLEdBQUc7WUFDbEQ7UUFDRjtJQUNGO0lBRUEsTUFBTUMsU0FBU1YsSUFBcUIsRUFBeUI7UUFDM0QsSUFBSTtnQkFZc0J0QjtZQVh4QkgsUUFBUUMsR0FBRyxDQUFDLHFDQUFxQztnQkFDL0NtQyxVQUFVWCxLQUFLVyxRQUFRO2dCQUN2QkMsT0FBT1osS0FBS1ksS0FBSztnQkFDakJDLFVBQVViLEtBQUthLFFBQVEsR0FBRyxhQUFhO1lBQ3pDO1lBRUEsTUFBTW5DLFdBQVcsTUFBTSxJQUFJLENBQUNQLFdBQVcsQ0FBZSxhQUFhO2dCQUNqRThCLFFBQVE7Z0JBQ1J4QixNQUFNeUIsS0FBS0MsU0FBUyxDQUFDSDtZQUN2QjtZQUVBLElBQUl0QixTQUFTMEIsT0FBTyxNQUFJMUIsaUJBQUFBLFNBQVNzQixJQUFJLGNBQWJ0QixxQ0FBQUEsZUFBZTJCLEtBQUssR0FBRTtnQkFDNUMsOEJBQThCO2dCQUM5QkMsYUFBYUMsT0FBTyxDQUFDLGNBQWM3QixTQUFTc0IsSUFBSSxDQUFDSyxLQUFLO2dCQUN0REMsYUFBYUMsT0FBTyxDQUFDLGFBQWFMLEtBQUtDLFNBQVMsQ0FBQ3pCLFNBQVNzQixJQUFJLENBQUNRLElBQUk7WUFDckU7WUFFQSxPQUFPOUI7UUFDVCxFQUFFLE9BQU9PLE9BQU87WUFDZCxPQUFPO2dCQUNMbUIsU0FBUztnQkFDVG5CLE9BQU9BLGlCQUFpQlksUUFBUVosTUFBTXdCLE9BQU8sR0FBRztZQUNsRDtRQUNGO0lBQ0Y7SUFFQSxNQUFNSyxTQUF3QjtRQUM1QlIsYUFBYVMsVUFBVSxDQUFDO1FBQ3hCVCxhQUFhUyxVQUFVLENBQUM7SUFDMUI7SUFFQUMsV0FBMEI7UUFDeEIsSUFBSSxLQUE2QixFQUFFLEVBQVk7UUFDL0MsT0FBT1YsYUFBYVcsT0FBTyxDQUFDO0lBQzlCO0lBRUFDLFVBQXVCO1FBQ3JCLElBQUksS0FBNkIsRUFBRSxFQUFZO1FBQy9DLE1BQU1DLFdBQVdiLGFBQWFXLE9BQU8sQ0FBQztRQUN0QyxPQUFPRSxXQUFXakIsS0FBS2tCLEtBQUssQ0FBQ0QsWUFBWTtJQUMzQztJQUVBRSxrQkFBMkI7UUFDekIsT0FBTyxJQUFJLENBQUNMLFFBQVEsT0FBTztJQUM3QjtJQUVBLE1BQU1NLGtCQUFvQztRQUN4QyxNQUFNakIsUUFBUSxJQUFJLENBQUNXLFFBQVE7UUFDM0IsSUFBSSxDQUFDWCxPQUFPLE9BQU87UUFFbkIsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDbEMsV0FBVyxDQUFDLFdBQVc7Z0JBQ2hDUyxTQUFTO29CQUNQLGlCQUFpQixVQUFnQixPQUFOeUI7Z0JBQzdCO1lBQ0Y7WUFDQSxPQUFPO1FBQ1QsRUFBRSxVQUFNO1lBQ04sNkJBQTZCO1lBQzdCLElBQUksQ0FBQ1MsTUFBTTtZQUNYLE9BQU87UUFDVDtJQUNGO0FBQ0Y7QUFFTyxNQUFNUyxjQUFjLElBQUlyRCxjQUFjIiwic291cmNlcyI6WyIvVXNlcnMvamV0dGNoZW5nMTAxOC9jb2RlL2RyYW1hbGluZy12b2NhYi1sZWFybmluZy9mcm9udGVuZC9saWIvc2VydmljZXMvYXV0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBdXRoIHNlcnZpY2UgZm9yIGhhbmRsaW5nIGF1dGhlbnRpY2F0aW9uIEFQSSBjYWxsc1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb2dpblJlcXVlc3Qge1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgcGFzc3dvcmQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclJlcXVlc3Qge1xyXG4gIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgZW1haWw6IHN0cmluZztcclxuICBwYXNzd29yZDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdXNlcm5hbWU6IHN0cmluZztcclxuICBlbWFpbDogc3RyaW5nO1xyXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xyXG4gIGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcclxuICBzdWJzY3JpcHRpb25UeXBlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFJlc3BvbnNlIHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIGRhdGE/OiB7XHJcbiAgICB0b2tlbjogc3RyaW5nO1xyXG4gICAgdXNlcjogVXNlcjtcclxuICB9O1xyXG4gIGVycm9yPzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBBUElfQkFTRV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo1MDAwJztcclxuXHJcbmNsYXNzIEF1dGhTZXJ2aWNlIHtcclxuICBwcml2YXRlIGFzeW5jIG1ha2VSZXF1ZXN0PFQ+KFxyXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcclxuICAgIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge31cclxuICApOiBQcm9taXNlPFQ+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL2F1dGgke2VuZHBvaW50fWA7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ01ha2luZyByZXF1ZXN0IHRvOicsIHVybClcclxuICAgIGNvbnNvbGUubG9nKCdSZXF1ZXN0IGJvZHk6Jywgb3B0aW9ucy5ib2R5KVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcclxuICAgICAgfSxcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnTmV0d29yayBlcnJvcicgfSkpO1xyXG4gICAgICBjb25zb2xlLmxvZygnQVBJIEVycm9yIFJlc3BvbnNlOicsIGVycm9yRGF0YSlcclxuXHJcbiAgICAgIC8vIOiZleeQhumpl+itiemMr+iqpCAoNDAwIEJhZCBSZXF1ZXN0KVxyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDAgJiYgZXJyb3JEYXRhLmVycm9ycykge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBPYmplY3QuZW50cmllcyhlcnJvckRhdGEuZXJyb3JzKVxyXG4gICAgICAgICAgLm1hcCgoW2ZpZWxkLCBtZXNzYWdlc106IFtzdHJpbmcsIGFueV0pID0+IGAke2ZpZWxkfTogJHtBcnJheS5pc0FycmF5KG1lc3NhZ2VzKSA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiBtZXNzYWdlc31gKVxyXG4gICAgICAgICAgLmpvaW4oJ1xcbicpO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcih2YWxpZGF0aW9uRXJyb3JzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yRGF0YS5lcnJvciB8fCBlcnJvckRhdGEudGl0bGUgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvZ2luKGRhdGE6IExvZ2luUmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3Q8QXV0aFJlc3BvbnNlPignL2xvZ2luJywge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGE/LnRva2VuKSB7XHJcbiAgICAgICAgLy8gU3RvcmUgdG9rZW4gaW4gbG9jYWxTdG9yYWdlXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2F1dGhfdG9rZW4nLCByZXNwb25zZS5kYXRhLnRva2VuKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlcl9kYXRhJywgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YS51c2VyKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0xvZ2luIGZhaWxlZCcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWdpc3RlcihkYXRhOiBSZWdpc3RlclJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc29sZS5sb2coJ0F1dGhTZXJ2aWNlLnJlZ2lzdGVyIGNhbGxlZCB3aXRoOicsIHtcclxuICAgICAgICB1c2VybmFtZTogZGF0YS51c2VybmFtZSxcclxuICAgICAgICBlbWFpbDogZGF0YS5lbWFpbCxcclxuICAgICAgICBwYXNzd29yZDogZGF0YS5wYXNzd29yZCA/ICdbaGlkZGVuXScgOiAnZW1wdHknXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJlcXVlc3Q8QXV0aFJlc3BvbnNlPignL3JlZ2lzdGVyJywge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGE/LnRva2VuKSB7XHJcbiAgICAgICAgLy8gU3RvcmUgdG9rZW4gaW4gbG9jYWxTdG9yYWdlXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2F1dGhfdG9rZW4nLCByZXNwb25zZS5kYXRhLnRva2VuKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlcl9kYXRhJywgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YS51c2VyKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1JlZ2lzdHJhdGlvbiBmYWlsZWQnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2F1dGhfdG9rZW4nKTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd1c2VyX2RhdGEnKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXV0aF90b2tlbicpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlcigpOiBVc2VyIHwgbnVsbCB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgdXNlckRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcl9kYXRhJyk7XHJcbiAgICByZXR1cm4gdXNlckRhdGEgPyBKU09OLnBhcnNlKHVzZXJEYXRhKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUb2tlbigpICE9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2hlY2tBdXRoU3RhdHVzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XHJcbiAgICBpZiAoIXRva2VuKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5tYWtlUmVxdWVzdCgnL3N0YXR1cycsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBUb2tlbiBpcyBpbnZhbGlkLCBjbGVhciBpdFxyXG4gICAgICB0aGlzLmxvZ291dCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYXV0aFNlcnZpY2UgPSBuZXcgQXV0aFNlcnZpY2UoKTsiXSwibmFtZXMiOlsiQVBJX0JBU0VfVVJMIiwiQXV0aFNlcnZpY2UiLCJtYWtlUmVxdWVzdCIsImVuZHBvaW50Iiwib3B0aW9ucyIsInVybCIsImNvbnNvbGUiLCJsb2ciLCJib2R5IiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsImVycm9yRGF0YSIsImpzb24iLCJjYXRjaCIsImVycm9yIiwic3RhdHVzIiwiZXJyb3JzIiwidmFsaWRhdGlvbkVycm9ycyIsIk9iamVjdCIsImVudHJpZXMiLCJtYXAiLCJmaWVsZCIsIm1lc3NhZ2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsIkVycm9yIiwidGl0bGUiLCJsb2dpbiIsImRhdGEiLCJtZXRob2QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3VjY2VzcyIsInRva2VuIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInVzZXIiLCJtZXNzYWdlIiwicmVnaXN0ZXIiLCJ1c2VybmFtZSIsImVtYWlsIiwicGFzc3dvcmQiLCJsb2dvdXQiLCJyZW1vdmVJdGVtIiwiZ2V0VG9rZW4iLCJnZXRJdGVtIiwiZ2V0VXNlciIsInVzZXJEYXRhIiwicGFyc2UiLCJpc0F1dGhlbnRpY2F0ZWQiLCJjaGVja0F1dGhTdGF0dXMiLCJhdXRoU2VydmljZSJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./lib/services/auth.ts\n")); /***/ }), /***/ "(app-pages-browser)/./lib/services/flashcards.ts": /*!************************************!*\ !*** ./lib/services/flashcards.ts ***! \************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ flashcardsService: () => (/* binding */ flashcardsService)\n/* harmony export */ });\n// Flashcards API service for handling flashcard operations\nconst API_BASE_URL = 'http://localhost:5000';\nclass FlashcardsService {\n getAuthToken() {\n if (false) {}\n return localStorage.getItem('auth_token');\n }\n async makeRequest(endpoint) {\n let options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n const token = this.getAuthToken();\n const url = \"\".concat(API_BASE_URL, \"/api\").concat(endpoint);\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n ...token && {\n 'Authorization': \"Bearer \".concat(token)\n },\n ...options.headers\n },\n ...options\n });\n if (!response.ok) {\n const errorData = await response.json().catch(()=>({\n error: 'Network error'\n }));\n throw new Error(errorData.error || errorData.details || \"HTTP \".concat(response.status));\n }\n return response.json();\n }\n // CardSets methods\n async getCardSets() {\n try {\n return await this.makeRequest('/cardsets');\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to fetch card sets'\n };\n }\n }\n async createCardSet(data) {\n try {\n return await this.makeRequest('/cardsets', {\n method: 'POST',\n body: JSON.stringify(data)\n });\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create card set'\n };\n }\n }\n async deleteCardSet(id) {\n try {\n return await this.makeRequest(\"/cardsets/\".concat(id), {\n method: 'DELETE'\n });\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete card set'\n };\n }\n }\n // Flashcards methods\n async getFlashcards(cardSetId) {\n try {\n const query = cardSetId ? \"?cardSetId=\".concat(cardSetId) : '';\n return await this.makeRequest(\"/flashcards\".concat(query));\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to fetch flashcards'\n };\n }\n }\n async createFlashcard(data) {\n try {\n return await this.makeRequest('/flashcards', {\n method: 'POST',\n body: JSON.stringify(data)\n });\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create flashcard'\n };\n }\n }\n async updateFlashcard(id, data) {\n try {\n return await this.makeRequest(\"/flashcards/\".concat(id), {\n method: 'PUT',\n body: JSON.stringify(data)\n });\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update flashcard'\n };\n }\n }\n async deleteFlashcard(id) {\n try {\n return await this.makeRequest(\"/flashcards/\".concat(id), {\n method: 'DELETE'\n });\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete flashcard'\n };\n }\n }\n async toggleFavorite(id) {\n try {\n return await this.makeRequest(\"/flashcards/\".concat(id, \"/favorite\"), {\n method: 'POST'\n });\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to toggle favorite'\n };\n }\n }\n}\nconst flashcardsService = new FlashcardsService();\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2xpYi9zZXJ2aWNlcy9mbGFzaGNhcmRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyREFBMkQ7QUF5RDNELE1BQU1BLGVBQWU7QUFFckIsTUFBTUM7SUFDSUMsZUFBOEI7UUFDcEMsSUFBSSxLQUE2QixFQUFFLEVBQVk7UUFDL0MsT0FBT0MsYUFBYUMsT0FBTyxDQUFDO0lBQzlCO0lBRUEsTUFBY0MsWUFDWkMsUUFBZ0IsRUFFSjtZQURaQyxVQUFBQSxpRUFBdUIsQ0FBQztRQUV4QixNQUFNQyxRQUFRLElBQUksQ0FBQ04sWUFBWTtRQUMvQixNQUFNTyxNQUFNLEdBQXNCSCxPQUFuQk4sY0FBYSxRQUFlLE9BQVRNO1FBRWxDLE1BQU1JLFdBQVcsTUFBTUMsTUFBTUYsS0FBSztZQUNoQ0csU0FBUztnQkFDUCxnQkFBZ0I7Z0JBQ2hCLEdBQUlKLFNBQVM7b0JBQUUsaUJBQWlCLFVBQWdCLE9BQU5BO2dCQUFRLENBQUM7Z0JBQ25ELEdBQUdELFFBQVFLLE9BQU87WUFDcEI7WUFDQSxHQUFHTCxPQUFPO1FBQ1o7UUFFQSxJQUFJLENBQUNHLFNBQVNHLEVBQUUsRUFBRTtZQUNoQixNQUFNQyxZQUFZLE1BQU1KLFNBQVNLLElBQUksR0FBR0MsS0FBSyxDQUFDLElBQU87b0JBQUVDLE9BQU87Z0JBQWdCO1lBQzlFLE1BQU0sSUFBSUMsTUFBTUosVUFBVUcsS0FBSyxJQUFJSCxVQUFVSyxPQUFPLElBQUksUUFBd0IsT0FBaEJULFNBQVNVLE1BQU07UUFDakY7UUFFQSxPQUFPVixTQUFTSyxJQUFJO0lBQ3RCO0lBRUEsbUJBQW1CO0lBQ25CLE1BQU1NLGNBQXlEO1FBQzdELElBQUk7WUFDRixPQUFPLE1BQU0sSUFBSSxDQUFDaEIsV0FBVyxDQUFtQztRQUNsRSxFQUFFLE9BQU9ZLE9BQU87WUFDZCxPQUFPO2dCQUNMSyxTQUFTO2dCQUNUTCxPQUFPQSxpQkFBaUJDLFFBQVFELE1BQU1NLE9BQU8sR0FBRztZQUNsRDtRQUNGO0lBQ0Y7SUFFQSxNQUFNQyxjQUFjQyxJQUEwQixFQUFpQztRQUM3RSxJQUFJO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQ3BCLFdBQVcsQ0FBdUIsYUFBYTtnQkFDL0RxQixRQUFRO2dCQUNSQyxNQUFNQyxLQUFLQyxTQUFTLENBQUNKO1lBQ3ZCO1FBQ0YsRUFBRSxPQUFPUixPQUFPO1lBQ2QsT0FBTztnQkFDTEssU0FBUztnQkFDVEwsT0FBT0EsaUJBQWlCQyxRQUFRRCxNQUFNTSxPQUFPLEdBQUc7WUFDbEQ7UUFDRjtJQUNGO0lBRUEsTUFBTU8sY0FBY0MsRUFBVSxFQUE4QjtRQUMxRCxJQUFJO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQzFCLFdBQVcsQ0FBb0IsYUFBZ0IsT0FBSDBCLEtBQU07Z0JBQ2xFTCxRQUFRO1lBQ1Y7UUFDRixFQUFFLE9BQU9ULE9BQU87WUFDZCxPQUFPO2dCQUNMSyxTQUFTO2dCQUNUTCxPQUFPQSxpQkFBaUJDLFFBQVFELE1BQU1NLE9BQU8sR0FBRztZQUNsRDtRQUNGO0lBQ0Y7SUFFQSxxQkFBcUI7SUFDckIsTUFBTVMsY0FBY0MsU0FBa0IsRUFBc0Y7UUFDMUgsSUFBSTtZQUNGLE1BQU1DLFFBQVFELFlBQVksY0FBd0IsT0FBVkEsYUFBYztZQUN0RCxPQUFPLE1BQU0sSUFBSSxDQUFDNUIsV0FBVyxDQUE0RSxjQUFvQixPQUFONkI7UUFDekgsRUFBRSxPQUFPakIsT0FBTztZQUNkLE9BQU87Z0JBQ0xLLFNBQVM7Z0JBQ1RMLE9BQU9BLGlCQUFpQkMsUUFBUUQsTUFBTU0sT0FBTyxHQUFHO1lBQ2xEO1FBQ0Y7SUFDRjtJQUVBLE1BQU1ZLGdCQUFnQlYsSUFBNEIsRUFBbUM7UUFDbkYsSUFBSTtZQUNGLE9BQU8sTUFBTSxJQUFJLENBQUNwQixXQUFXLENBQXlCLGVBQWU7Z0JBQ25FcUIsUUFBUTtnQkFDUkMsTUFBTUMsS0FBS0MsU0FBUyxDQUFDSjtZQUN2QjtRQUNGLEVBQUUsT0FBT1IsT0FBTztZQUNkLE9BQU87Z0JBQ0xLLFNBQVM7Z0JBQ1RMLE9BQU9BLGlCQUFpQkMsUUFBUUQsTUFBTU0sT0FBTyxHQUFHO1lBQ2xEO1FBQ0Y7SUFDRjtJQUVBLE1BQU1hLGdCQUFnQkwsRUFBVSxFQUFFTixJQUFxQyxFQUFtQztRQUN4RyxJQUFJO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQ3BCLFdBQVcsQ0FBeUIsZUFBa0IsT0FBSDBCLEtBQU07Z0JBQ3pFTCxRQUFRO2dCQUNSQyxNQUFNQyxLQUFLQyxTQUFTLENBQUNKO1lBQ3ZCO1FBQ0YsRUFBRSxPQUFPUixPQUFPO1lBQ2QsT0FBTztnQkFDTEssU0FBUztnQkFDVEwsT0FBT0EsaUJBQWlCQyxRQUFRRCxNQUFNTSxPQUFPLEdBQUc7WUFDbEQ7UUFDRjtJQUNGO0lBRUEsTUFBTWMsZ0JBQWdCTixFQUFVLEVBQThCO1FBQzVELElBQUk7WUFDRixPQUFPLE1BQU0sSUFBSSxDQUFDMUIsV0FBVyxDQUFvQixlQUFrQixPQUFIMEIsS0FBTTtnQkFDcEVMLFFBQVE7WUFDVjtRQUNGLEVBQUUsT0FBT1QsT0FBTztZQUNkLE9BQU87Z0JBQ0xLLFNBQVM7Z0JBQ1RMLE9BQU9BLGlCQUFpQkMsUUFBUUQsTUFBTU0sT0FBTyxHQUFHO1lBQ2xEO1FBQ0Y7SUFDRjtJQUVBLE1BQU1lLGVBQWVQLEVBQVUsRUFBbUM7UUFDaEUsSUFBSTtZQUNGLE9BQU8sTUFBTSxJQUFJLENBQUMxQixXQUFXLENBQXlCLGVBQWtCLE9BQUgwQixJQUFHLGNBQVk7Z0JBQ2xGTCxRQUFRO1lBQ1Y7UUFDRixFQUFFLE9BQU9ULE9BQU87WUFDZCxPQUFPO2dCQUNMSyxTQUFTO2dCQUNUTCxPQUFPQSxpQkFBaUJDLFFBQVFELE1BQU1NLE9BQU8sR0FBRztZQUNsRDtRQUNGO0lBQ0Y7QUFDRjtBQUVPLE1BQU1nQixvQkFBb0IsSUFBSXRDLG9CQUFvQiIsInNvdXJjZXMiOlsiL1VzZXJzL2pldHRjaGVuZzEwMTgvY29kZS9kcmFtYWxpbmctdm9jYWItbGVhcm5pbmcvZnJvbnRlbmQvbGliL3NlcnZpY2VzL2ZsYXNoY2FyZHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gRmxhc2hjYXJkcyBBUEkgc2VydmljZSBmb3IgaGFuZGxpbmcgZmxhc2hjYXJkIG9wZXJhdGlvbnNcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FyZFNldCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBjb2xvcjogc3RyaW5nO1xyXG4gIGNhcmRDb3VudDogbnVtYmVyO1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xyXG4gIHByb2dyZXNzOiBudW1iZXI7XHJcbiAgbGFzdFN0dWRpZWQ6IHN0cmluZztcclxuICB0YWdzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGbGFzaGNhcmQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgd29yZDogc3RyaW5nO1xyXG4gIHRyYW5zbGF0aW9uOiBzdHJpbmc7XHJcbiAgZGVmaW5pdGlvbjogc3RyaW5nO1xyXG4gIHBhcnRPZlNwZWVjaDogc3RyaW5nO1xyXG4gIHByb251bmNpYXRpb246IHN0cmluZztcclxuICBleGFtcGxlOiBzdHJpbmc7XHJcbiAgZXhhbXBsZVRyYW5zbGF0aW9uPzogc3RyaW5nO1xyXG4gIG1hc3RlcnlMZXZlbDogbnVtYmVyO1xyXG4gIHRpbWVzUmV2aWV3ZWQ6IG51bWJlcjtcclxuICBpc0Zhdm9yaXRlOiBib29sZWFuO1xyXG4gIG5leHRSZXZpZXdEYXRlOiBzdHJpbmc7XHJcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XHJcbiAgY2FyZFNldDoge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgY29sb3I6IHN0cmluZztcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNhcmRTZXRSZXF1ZXN0IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBpc1B1YmxpYz86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRmxhc2hjYXJkUmVxdWVzdCB7XHJcbiAgY2FyZFNldElkOiBzdHJpbmc7XHJcbiAgZW5nbGlzaDogc3RyaW5nO1xyXG4gIGNoaW5lc2U6IHN0cmluZztcclxuICBwcm9udW5jaWF0aW9uOiBzdHJpbmc7XHJcbiAgcGFydE9mU3BlZWNoOiBzdHJpbmc7XHJcbiAgZXhhbXBsZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFwaVJlc3BvbnNlPFQ+IHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIGRhdGE/OiBUO1xyXG4gIGVycm9yPzogc3RyaW5nO1xyXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IEFQSV9CQVNFX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjUwMDAnO1xyXG5cclxuY2xhc3MgRmxhc2hjYXJkc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgZ2V0QXV0aFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXV0aF90b2tlbicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBtYWtlUmVxdWVzdDxUPihcclxuICAgIGVuZHBvaW50OiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XHJcbiAgKTogUHJvbWlzZTxUPiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0QXV0aFRva2VuKCk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FwaSR7ZW5kcG9pbnR9YDtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAuLi4odG9rZW4gJiYgeyAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0pLFxyXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcclxuICAgICAgfSxcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IGVycm9yOiAnTmV0d29yayBlcnJvcicgfSkpO1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JEYXRhLmVycm9yIHx8IGVycm9yRGF0YS5kZXRhaWxzIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICAvLyBDYXJkU2V0cyBtZXRob2RzXHJcbiAgYXN5bmMgZ2V0Q2FyZFNldHMoKTogUHJvbWlzZTxBcGlSZXNwb25zZTx7IHNldHM6IENhcmRTZXRbXSB9Pj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZVJlcXVlc3Q8QXBpUmVzcG9uc2U8eyBzZXRzOiBDYXJkU2V0W10gfT4+KCcvY2FyZHNldHMnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBmZXRjaCBjYXJkIHNldHMnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlQ2FyZFNldChkYXRhOiBDcmVhdGVDYXJkU2V0UmVxdWVzdCk6IFByb21pc2U8QXBpUmVzcG9uc2U8Q2FyZFNldD4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0PEFwaVJlc3BvbnNlPENhcmRTZXQ+PignL2NhcmRzZXRzJywge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBjcmVhdGUgY2FyZCBzZXQnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlQ2FyZFNldChpZDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTx2b2lkPj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZVJlcXVlc3Q8QXBpUmVzcG9uc2U8dm9pZD4+KGAvY2FyZHNldHMvJHtpZH1gLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gZGVsZXRlIGNhcmQgc2V0JyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEZsYXNoY2FyZHMgbWV0aG9kc1xyXG4gIGFzeW5jIGdldEZsYXNoY2FyZHMoY2FyZFNldElkPzogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTx7IGZsYXNoY2FyZHM6IEZsYXNoY2FyZFtdOyB0b3RhbDogbnVtYmVyOyBoYXNNb3JlOiBib29sZWFuIH0+PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IGNhcmRTZXRJZCA/IGA/Y2FyZFNldElkPSR7Y2FyZFNldElkfWAgOiAnJztcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZVJlcXVlc3Q8QXBpUmVzcG9uc2U8eyBmbGFzaGNhcmRzOiBGbGFzaGNhcmRbXTsgdG90YWw6IG51bWJlcjsgaGFzTW9yZTogYm9vbGVhbiB9Pj4oYC9mbGFzaGNhcmRzJHtxdWVyeX1gKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBmZXRjaCBmbGFzaGNhcmRzJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZUZsYXNoY2FyZChkYXRhOiBDcmVhdGVGbGFzaGNhcmRSZXF1ZXN0KTogUHJvbWlzZTxBcGlSZXNwb25zZTxGbGFzaGNhcmQ+PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdDxBcGlSZXNwb25zZTxGbGFzaGNhcmQ+PignL2ZsYXNoY2FyZHMnLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGNyZWF0ZSBmbGFzaGNhcmQnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlRmxhc2hjYXJkKGlkOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8Q3JlYXRlRmxhc2hjYXJkUmVxdWVzdD4pOiBQcm9taXNlPEFwaVJlc3BvbnNlPEZsYXNoY2FyZD4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0PEFwaVJlc3BvbnNlPEZsYXNoY2FyZD4+KGAvZmxhc2hjYXJkcy8ke2lkfWAsIHtcclxuICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byB1cGRhdGUgZmxhc2hjYXJkJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGRlbGV0ZUZsYXNoY2FyZChpZDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTx2b2lkPj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZVJlcXVlc3Q8QXBpUmVzcG9uc2U8dm9pZD4+KGAvZmxhc2hjYXJkcy8ke2lkfWAsIHtcclxuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBkZWxldGUgZmxhc2hjYXJkJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHRvZ2dsZUZhdm9yaXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPEZsYXNoY2FyZD4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0PEFwaVJlc3BvbnNlPEZsYXNoY2FyZD4+KGAvZmxhc2hjYXJkcy8ke2lkfS9mYXZvcml0ZWAsIHtcclxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gdG9nZ2xlIGZhdm9yaXRlJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBmbGFzaGNhcmRzU2VydmljZSA9IG5ldyBGbGFzaGNhcmRzU2VydmljZSgpOyJdLCJuYW1lcyI6WyJBUElfQkFTRV9VUkwiLCJGbGFzaGNhcmRzU2VydmljZSIsImdldEF1dGhUb2tlbiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJtYWtlUmVxdWVzdCIsImVuZHBvaW50Iiwib3B0aW9ucyIsInRva2VuIiwidXJsIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsImVycm9yRGF0YSIsImpzb24iLCJjYXRjaCIsImVycm9yIiwiRXJyb3IiLCJkZXRhaWxzIiwic3RhdHVzIiwiZ2V0Q2FyZFNldHMiLCJzdWNjZXNzIiwibWVzc2FnZSIsImNyZWF0ZUNhcmRTZXQiLCJkYXRhIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZWxldGVDYXJkU2V0IiwiaWQiLCJnZXRGbGFzaGNhcmRzIiwiY2FyZFNldElkIiwicXVlcnkiLCJjcmVhdGVGbGFzaGNhcmQiLCJ1cGRhdGVGbGFzaGNhcmQiLCJkZWxldGVGbGFzaGNhcmQiLCJ0b2dnbGVGYXZvcml0ZSIsImZsYXNoY2FyZHNTZXJ2aWNlIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./lib/services/flashcards.ts\n")); /***/ }), /***/ "(app-pages-browser)/./node_modules/next/dist/api/navigation.js": /*!**************************************************!*\ !*** ./node_modules/next/dist/api/navigation.js ***! \**************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../client/components/navigation */ \"(app-pages-browser)/./node_modules/next/dist/client/components/navigation.js\");\n/* harmony import */ var _client_components_navigation__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_client_components_navigation__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n//# sourceMappingURL=navigation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYXBpL25hdmlnYXRpb24uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQWdEOztBQUVoRCIsInNvdXJjZXMiOlsiL1VzZXJzL2pldHRjaGVuZzEwMTgvY29kZS9kcmFtYWxpbmctdm9jYWItbGVhcm5pbmcvZnJvbnRlbmQvbm9kZV9tb2R1bGVzL25leHQvZGlzdC9hcGkvbmF2aWdhdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuLi9jbGllbnQvY29tcG9uZW50cy9uYXZpZ2F0aW9uJztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmF2aWdhdGlvbi5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/api/navigation.js\n")); /***/ }) });