Files
shadow-gunbuilder-ai-proto/.next/static/webpack/app/gunbuilder/page.7f1da3c97852a23d.hot-update.js
T
2025-12-03 06:11:06 -05:00

22 lines
137 KiB
JavaScript

"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/gunbuilder/page",{
/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx":
/*!*********************************!*\
!*** ./app/gunbuilder/page.tsx ***!
\*********************************/
/***/ (function(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\": function() { return /* binding */ GunbuilderPage; }\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/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Category groups for the main grid\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (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 const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n const [shareStatus, setShareStatus] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__.PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n const handleShare = async ()=>{\n if (selectedParts.length === 0) {\n setShareStatus(\"Add a few parts before sharing your build.\");\n return;\n }\n const lines = [];\n lines.push(\"Shadow Standard — The Armory Build\");\n lines.push(\"\");\n lines.push(\"Total: $\".concat(totalPrice.toFixed(2)));\n lines.push(\"\");\n summaryCategoryOrder.forEach((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n if (part) {\n lines.push(\"\".concat(cat.name, \": \").concat(part.brand, \" — \").concat(part.name, \" ($\").concat(part.price.toFixed(2), \")\"));\n } else {\n lines.push(\"\".concat(cat.name, \": [Not selected]\"));\n }\n });\n const text = lines.join(\"\\n\");\n try {\n await navigator.clipboard.writeText(text);\n setShareStatus(\"Build summary copied to clipboard.\");\n } catch (e) {\n setShareStatus(\"Could not access clipboard. You can copy from the build summary page.\");\n }\n };\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 272,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 275,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 271,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 280,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 269,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\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)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 289,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 293,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 292,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 288,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0 text-right\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 304,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 305,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 303,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 287,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mb-4 text-xs text-zinc-500\",\n children: \"Work top-down through the major sections. Each row shows your current pick for that part type, with price and a direct buy link—or a quick way to choose a part if you haven't picked one yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 318,\n columnNumber: 13\n }, this),\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 326,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 331,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__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)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 352,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 356,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 351,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 350,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto rounded-md border border-zinc-800 bg-zinc-950/80\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-xs md:text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 bg-zinc-900/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-left font-semibold text-zinc-400\",\n children: \"Component / Part Type\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 367,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-left font-semibold text-zinc-400\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 370,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-right font-semibold text-zinc-400\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 373,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-right font-semibold text-zinc-400\",\n children: \"Sale Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 376,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-left font-semibold text-zinc-400\",\n children: \"Caliber\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 379,\n columnNumber: 31\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"px-3 py-2 text-right font-semibold text-zinc-400\",\n children: \"Buy / Choose\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 382,\n columnNumber: 31\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 366,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 365,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: groupCategories.map((category)=>{\n var _partsByCategory_category_id;\n const categoryParts = (_partsByCategory_category_id = partsByCategory[category.id]) !== null && _partsByCategory_category_id !== void 0 ? _partsByCategory_category_id : [];\n const selectedPartId = build[category.id];\n const selectedPart = categoryParts.find((p)=>p.id === selectedPartId);\n const hasParts = categoryParts.length > 0;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-t border-zinc-900 hover:bg-zinc-900/60 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"font-medium text-zinc-100\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 404,\n columnNumber: 37\n }, this),\n selectedPart ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] text-zinc-500 line-clamp-1\",\n children: selectedPart.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 408,\n columnNumber: 39\n }, this) : hasParts ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] text-zinc-600\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 412,\n columnNumber: 39\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] text-zinc-600\",\n children: \"No parts available yet\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 416,\n columnNumber: 39\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 403,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-zinc-300\",\n children: selectedPart ? selectedPart.brand : \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 423,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-right text-amber-300\",\n children: selectedPart ? \"$\".concat(selectedPart.price.toFixed(2)) : \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 428,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-right text-zinc-400\",\n children: selectedPart ? \"—\" : \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 435,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top text-zinc-400\",\n children: \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 441,\n columnNumber: 35\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"px-3 py-2 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: selectedPart && selectedPart.url ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"hidden md:inline-flex rounded-md border border-zinc-700 bg-zinc-900/70 px-2.5 py-1 text-[0.7rem] font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors\",\n children: \"Change Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 451,\n columnNumber: 43\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"a\", {\n href: selectedPart.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n className: \"inline-flex rounded-md bg-amber-400 px-2.5 py-1 text-[0.7rem] font-semibold text-black hover:bg-amber-300 transition-colors\",\n children: \"Buy\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 457,\n columnNumber: 43\n }, this)\n ]\n }, void 0, true) : hasParts ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex rounded-md border border-zinc-700 bg-zinc-900/70 px-2.5 py-1 text-[0.7rem] font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-600 transition-colors\",\n onClick: ()=>{\n // If you want to pre-select something later, you can handle here.\n },\n children: \"Choose a Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 467,\n columnNumber: 41\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-[0.7rem] text-zinc-600\",\n children: \"—\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 41\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 448,\n columnNumber: 37\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 35\n }, this)\n ]\n }, category.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 398,\n columnNumber: 33\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 387,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 364,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 363,\n columnNumber: 23\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 349,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 338,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 317,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 498,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 504,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 522,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 528,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 527,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 533,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 526,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 538,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 521,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 509,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 502,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 550,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 560,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 border-t border-zinc-800 pt-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center justify-between gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: \"Share\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 581,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleShare,\n className: \"rounded-md px-3 py-1.5 text-[0.7rem] font-semibold transition-colors \".concat(selectedParts.length === 0 ? \"bg-zinc-900/80 text-zinc-600 cursor-not-allowed\" : \"bg-zinc-900/80 text-zinc-200 border border-zinc-700 hover:bg-zinc-800\"),\n disabled: selectedParts.length === 0,\n children: \"Copy Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 584,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 580,\n columnNumber: 17\n }, this),\n shareStatus && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-[0.7rem] text-zinc-500\",\n children: shareStatus\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 598,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 579,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown in detail and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 604,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 549,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 497,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 315,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 613,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 617,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 618,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 622,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 626,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 616,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 612,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 635,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 639,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 640,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 641,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 642,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 643,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 638,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 634,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 285,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 268,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Qg1BTsr8Q/5MlWQnETs2mEW1cb4=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFWTtJQWM5RFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFJMUMsTUFBTUksY0FBYztBQUVwQixvQ0FBb0M7QUFDcEMsTUFBTUMsa0JBS0E7SUFDSjtRQUNFQyxJQUFJO1FBQ0pDLE9BQU87UUFDUEMsYUFDRTtRQUNGQyxhQUFhO1lBQ1g7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7SUFDQTtRQUNFSCxJQUFJO1FBQ0pDLE9BQU87UUFDUEMsYUFDRTtRQUNGQyxhQUFhO1lBQ1g7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1NBQ0Q7SUFDSDtDQVFEO0FBRWMsU0FBU0M7O0lBQ3RCLE1BQU1DLGVBQWVmLGdFQUFlQTtJQUNwQyxNQUFNZ0IsU0FBU2YsMERBQVNBO0lBQ3hCLE1BQU0sQ0FBQ2dCLE9BQU9DLFNBQVMsR0FBR3JCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDc0IsU0FBU0MsV0FBVyxHQUFHdkIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDd0IsT0FBT0MsU0FBUyxHQUFHekIsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQzBCLE9BQU9DLFNBQVMsR0FBRzNCLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksSUFBNkIsRUFBRTtZQUNqQyxNQUFNNEIsU0FBU0MsYUFBYUMsT0FBTyxDQUFDbkI7WUFDcEMsSUFBSWlCLFFBQVE7Z0JBQ1YsSUFBSTtvQkFDRixPQUFPRyxLQUFLQyxLQUFLLENBQUNKO2dCQUNwQixFQUFFLFVBQU07b0JBQ04sT0FBTyxDQUFDO2dCQUNWO1lB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Q0FDakIsOERBQUNRO2dDQUFHUixXQUFVOzBDQUFtRTs7Ozs7OzBDQUdqRiw4REFBQ3dCO2dDQUFHeEIsV0FBVTs7a0RBQ1osOERBQUN5QjtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUlKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUlKLDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQVFSLDhEQUFDcEI7d0JBQVFMLFdBQVU7OzBDQUNqQiw4REFBQ1E7Z0NBQUdSLFdBQVU7MENBQW1FOzs7Ozs7MENBR2pGLDhEQUFDd0I7Z0NBQUd4QixXQUFVOztrREFDWiw4REFBQ3lCO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNaEI7R0F6akJ3Qm5IOztRQUNEZCw0REFBZUE7UUFDckJDLHNEQUFTQTs7O0tBRkZhIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4PzA1NDAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVNlYXJjaFBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5pbXBvcnQgeyBQQVJUX1JPTEVfVE9fQ0FURUdPUlkgfSBmcm9tIFwiQC9kYXRhL3BhcnRSb2xlTWFwcGluZ3NcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBudW1iZXI7IC8vIGJhY2tlbmQgbnVtZXJpYyBpZFxuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjsgLy8gY2F0ZWdvcnlJZCAtPiBwYXJ0SWRcblxuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuLy8gQ2F0ZWdvcnkgZ3JvdXBzIGZvciB0aGUgbWFpbiBncmlkXG5jb25zdCBDQVRFR09SWV9HUk9VUFM6IHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNhdGVnb3J5SWRzOiBDYXRlZ29yeUlkW107XG59W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV2ZXJ5dGhpbmcgZnJvbSB0aGUgc2VyaWFsaXplZCBsb3dlciB0byBzbWFsbCBwYXJ0cywgZmlyZSBjb250cm9sLCBhbmQgY29yZSBjb250cm9scy5cIixcbiAgICBjYXRlZ29yeUlkczogW1xuICAgICAgXCJsb3dlclwiLFxuICAgICAgXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgICBcImxvd2VyUGFydHNcIixcbiAgICAgIFwidHJpZ2dlclwiLFxuICAgICAgXCJncmlwXCIsXG4gICAgICBcInNhZmV0eVwiLFxuICAgICAgXCJidWZmZXJcIixcbiAgICAgIFwic3RvY2tcIixcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJVcHBlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCYXJyZWwsIHVwcGVyLCBnYXMgc3lzdGVtLCBhbmQgdGhlIHBhcnRzIHRoYXQga2VlcCB0aGUgcmlmbGUgY3ljbGluZy5cIixcbiAgICBjYXRlZ29yeUlkczogW1xuICAgICAgXCJ1cHBlclwiLFxuICAgICAgXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgICBcImJjZ1wiLFxuICAgICAgXCJiYXJyZWxcIixcbiAgICAgIFwiZ2FzQmxvY2tcIixcbiAgICAgIFwiZ2FzVHViZVwiLFxuICAgICAgXCJtdXp6bGVEZXZpY2VcIixcbiAgICAgIFwic3VwcHJlc3NvclwiLFxuICAgICAgXCJoYW5kZ3VhcmRcIixcbiAgICAgIFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICAgIFwic2lnaHRzXCIsXG4gICAgICBcIm9wdGljXCIsXG4gICAgXSxcbiAgfSxcbiAgLy8gT3B0aW9uYWw6IGZ1dHVyZSBncm91cCBmb3IgYWNjZXNzb3JpZXMvZnVybml0dXJlIGlmIG5lZWRlZFxuICAvLyB7XG4gIC8vICAgaWQ6IFwiYWNjZXNzb3JpZXMtZ3JvdXBcIixcbiAgLy8gICBsYWJlbDogXCJBY2Nlc3NvcmllcyAmIEZ1cm5pdHVyZVwiLFxuICAvLyAgIGRlc2NyaXB0aW9uOiBcIk9wdGljcywgbGlnaHRzLCBzbGluZ3MsIGFuZCBvdGhlciBzdXBwb3J0aW5nIGdlYXIuXCIsXG4gIC8vICAgY2F0ZWdvcnlJZHM6IFtcIm9wdGljXCIsIFwic2lnaHRzXCIsIC4uLl0gYXMgQ2F0ZWdvcnlJZFtdLFxuICAvLyB9LFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR3VuYnVpbGRlclBhZ2UoKSB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHVzZVNlYXJjaFBhcmFtcygpO1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICBpZiAoc3RvcmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RvcmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfSk7XG4gIGNvbnN0IFtzaGFyZVN0YXR1cywgc2V0U2hhcmVTdGF0dXNdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQcm9kdWN0cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgIGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXI/cGxhdGZvcm09QVItMTVgLFxuICAgICAgICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhXG4gICAgICAgICAgLm1hcCgocCk6IFBhcnQgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBQQVJUX1JPTEVfVE9fQ0FURUdPUllbcC5wYXJ0Um9sZV07XG4gICAgICAgICAgICBpZiAoIWNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgcGFydHMgd2UgZG9uJ3Qga25vdyBob3cgdG8gbWFwIHlldFxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IFN0cmluZyhwLmlkKSwgLy8gQUxXQVlTIHN0cmluZ1xuICAgICAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgICAgIGJyYW5kOiBwLmJyYW5kLFxuICAgICAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1cmw6IHAuYnV5VXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChwKTogcCBpcyBQYXJ0ID0+IHAgIT09IG51bGwpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hQcm9kdWN0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW10pO1xuXG4gIC8vIEhhbmRsZSBVUkwgcXVlcnkgcGFyYW1ldGVyIGZvciBwYXJ0IHNlbGVjdGlvbiAoP3NlbGVjdD11cHBlcjoxNjUpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0UGFyYW0gPSBzZWFyY2hQYXJhbXMuZ2V0KFwic2VsZWN0XCIpO1xuICAgIGlmIChzZWxlY3RQYXJhbSkge1xuICAgICAgY29uc3QgW2NhdGVnb3J5SWQsIHBhcnRJZF0gPSBzZWxlY3RQYXJhbS5zcGxpdChcIjpcIik7XG4gICAgICBpZiAoY2F0ZWdvcnlJZCAmJiBwYXJ0SWQgJiYgQ0FURUdPUklFUy5zb21lKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSkge1xuICAgICAgICBzZXRCdWlsZCgocHJldikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgW2NhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodXBkYXRlZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVyLnJlcGxhY2UoXCIvZ3VuYnVpbGRlclwiLCB7IHNjcm9sbDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2VhcmNoUGFyYW1zLCByb3V0ZXJdKTtcblxuICAvLyBQZXJzaXN0IGJ1aWxkIHN0YXRlIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgY29uc3QgcGFydHNCeUNhdGVnb3J5OiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgUGFydFtdPiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwZWQgPSB7fSBhcyBSZWNvcmQ8Q2F0ZWdvcnlJZCwgUGFydFtdPjtcbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIENBVEVHT1JJRVMpIHtcbiAgICAgIGdyb3VwZWRbY2F0ZWdvcnkuaWRdID0gcGFydHMuZmlsdGVyKFxuICAgICAgICAocCkgPT4gcC5jYXRlZ29yeUlkID09PSBjYXRlZ29yeS5pZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBncm91cGVkO1xuICB9LCBbcGFydHNdKTtcblxuICBjb25zdCBzZWxlY3RlZFBhcnRzOiBQYXJ0W10gPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYnVpbGQpXG4gICAgICAubWFwKChbY2F0ZWdvcnlJZCwgcGFydElkXSkgPT5cbiAgICAgICAgcGFydHMuZmluZCgocCkgPT4gcC5pZCA9PT0gcGFydElkICYmIHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgICApXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBhcnRbXTtcbiAgfSwgW2J1aWxkLCBwYXJ0c10pO1xuXG4gIGNvbnN0IHRvdGFsUHJpY2UgPSB1c2VNZW1vKFxuICAgICgpID0+IHNlbGVjdGVkUGFydHMucmVkdWNlKChzdW0sIHApID0+IHN1bSArIHAucHJpY2UsIDApLFxuICAgIFtzZWxlY3RlZFBhcnRzXSxcbiAgKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3RQYXJ0ID0gKGNhdGVnb3J5SWQ6IENhdGVnb3J5SWQsIHBhcnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0QnVpbGQoKHByZXYpID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8vIFVzZSBncm91cCBvcmRlcmluZyBmb3IgdGhlIHN1bW1hcnkgYXMgd2VsbFxuICBjb25zdCBzdW1tYXJ5Q2F0ZWdvcnlPcmRlcjogQ2F0ZWdvcnlJZFtdID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQ0FURUdPUllfR1JPVVBTLmZsYXRNYXAoKGdyb3VwKSA9PiBncm91cC5jYXRlZ29yeUlkcykuZmlsdGVyKFxuICAgICAgICAoaWQpID0+IENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpLFxuICAgICAgKSxcbiAgICBbXSxcbiAgKTtcblxuICBjb25zdCBoYW5kbGVTaGFyZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldFNoYXJlU3RhdHVzKFwiQWRkIGEgZmV3IHBhcnRzIGJlZm9yZSBzaGFyaW5nIHlvdXIgYnVpbGQuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxpbmVzLnB1c2goXCJTaGFkb3cgU3RhbmRhcmQg4oCUIFRoZSBBcm1vcnkgQnVpbGRcIik7XG4gICAgbGluZXMucHVzaChcIlwiKTtcbiAgICBsaW5lcy5wdXNoKGBUb3RhbDogJCR7dG90YWxQcmljZS50b0ZpeGVkKDIpfWApO1xuICAgIGxpbmVzLnB1c2goXCJcIik7XG5cbiAgICBzdW1tYXJ5Q2F0ZWdvcnlPcmRlci5mb3JFYWNoKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgaWYgKCFjYXQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRQYXJ0SWQgPSBidWlsZFtjYXQuaWRdO1xuICAgICAgY29uc3QgcGFydCA9IHBhcnRzLmZpbmQoXG4gICAgICAgIChwKSA9PiBwLmlkID09PSBzZWxlY3RlZFBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdC5pZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChwYXJ0KSB7XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYCR7Y2F0Lm5hbWV9OiAke3BhcnQuYnJhbmR9IOKAlCAke3BhcnQubmFtZX0gKCQke3BhcnQucHJpY2UudG9GaXhlZChcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX0pYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7Y2F0Lm5hbWV9OiBbTm90IHNlbGVjdGVkXWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdGV4dCA9IGxpbmVzLmpvaW4oXCJcXG5cIik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCk7XG4gICAgICBzZXRTaGFyZVN0YXR1cyhcIkJ1aWxkIHN1bW1hcnkgY29waWVkIHRvIGNsaXBib2FyZC5cIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzZXRTaGFyZVN0YXR1cyhcbiAgICAgICAgXCJDb3VsZCBub3QgYWNjZXNzIGNsaXBib2FyZC4gWW91IGNhbiBjb3B5IGZyb20gdGhlIGJ1aWxkIHN1bW1hcnkgcGFnZS5cIixcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItYW1iZXItNTAwLzIwIGJnLWFtYmVyLTUwMC81XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBmbGV4IG1heC13LTZ4bCBmbGV4LWNvbCBnYXAtMSBweC00IHB5LTIgdGV4dC1bMC43NXJlbV0gdGV4dC1hbWJlci0xMDAgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJvdW5kZWQtc20gYmctYW1iZXItNTAwLzIwIHB4LTIgcHktMC41IHRleHQtWzAuNjVyZW1dIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE4ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgIEVhcmx5IEFjY2VzcyBCZXRhXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gdGV4dC1hbWJlci0xMDAvOTAgbWQ6aW5saW5lXCI+XG4gICAgICAgICAgICAgIFlvdSZhcG9zO3JlIHVzaW5nIGFuIGVhcmx5LWFjY2VzcyBwcm90b3R5cGUgb2YgVGhlIEFybW9yeS4gRGF0YSxcbiAgICAgICAgICAgICAgcHJpY2luZywgYW5kIGF2YWlsYWJsZSBwYXJ0cyBhcmUgc3RpbGwgZXZvbHZpbmcuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0xMDAvOTAgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICBFYXJseS1hY2Nlc3MgcHJvdG90eXBlLiBEYXRhIGFuZCBwcmljaW5nIG1heSBjaGFuZ2UuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgVGhlIEFybW9yeTogPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5FYXJseSBBY2Nlc3M8L3NwYW4+XG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgRXhwbG9yZSBjb21wb25lbnRzIGZyb20gdHJ1c3RlZCBicmFuZHMsIGNob29zZSBvbmUgcGFydCBwZXJcbiAgICAgICAgICAgICAgY2F0ZWdvcnksIHRyYWNrIGxpdmUgcHJpY2VzLCBhbmQgd2F0Y2ggeW91ciB0b3RhbCBidWlsZCBjb3N0XG4gICAgICAgICAgICAgIHVwZGF0ZSBhcyB5b3UgZ28uIFRoaXMgZWFybHktYWNjZXNzIGJ1aWxkZXIga2VlcHMgeW91ciBzZXR1cCBzYXZlZFxuICAgICAgICAgICAgICBsb2NhbGx5IHNvIHlvdSBjYW4gY29tZSBiYWNrIGFuZCByZWZpbmUgaXQgYW55dGltZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMyBtZDptdC0wIHRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwXCI+Q3VycmVudCBidWlsZCB0b3RhbDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgICR7dG90YWxQcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGh9IC8ge0NBVEVHT1JJRVMubGVuZ3RofSBjYXRlZ29yaWVzIGZpbGxlZFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBMYXlvdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBsZzpncmlkLWNvbHMtWzNmciwxLjI1ZnJdXCI+XG4gICAgICAgICAgey8qIENhdGVnb3JpZXMvcGFydHMgKi99XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm1iLTQgdGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIFdvcmsgdG9wLWRvd24gdGhyb3VnaCB0aGUgbWFqb3Igc2VjdGlvbnMuIEVhY2ggcm93IHNob3dzIHlvdXJcbiAgICAgICAgICAgICAgY3VycmVudCBwaWNrIGZvciB0aGF0IHBhcnQgdHlwZSwgd2l0aCBwcmljZSBhbmQgYSBkaXJlY3QgYnV5XG4gICAgICAgICAgICAgIGxpbmvigJRvciBhIHF1aWNrIHdheSB0byBjaG9vc2UgYSBwYXJ0IGlmIHlvdSBoYXZlbiZhcG9zO3QgcGlja2VkXG4gICAgICAgICAgICAgIG9uZSB5ZXQuXG4gICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgIHtsb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgTG9hZGluZyBwYXJ0cyBmcm9tIGJhY2tlbmTigKZcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtlcnJvciAmJiAhbG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwXCI+XG4gICAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nIGFuZCBDT1JTIGlzXG4gICAgICAgICAgICAgICAgY29uZmlndXJlZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02XCI+XG4gICAgICAgICAgICAgICAge0NBVEVHT1JZX0dST1VQUy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBncm91cENhdGVnb3JpZXMgPSBDQVRFR09SSUVTLmZpbHRlcigoYykgPT5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuY2F0ZWdvcnlJZHMuaW5jbHVkZXMoYy5pZCBhcyBDYXRlZ29yeUlkKSxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChncm91cENhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17Z3JvdXAuaWR9IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1iYXNlbGluZSBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDAgbXQtMSBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvdmVyZmxvdy14LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwibWluLXctZnVsbCB0ZXh0LXhzIG1kOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy04MDAgYmctemluYy05MDAvNjBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC0zIHB5LTIgdGV4dC1sZWZ0IGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgLyBQYXJ0IFR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtMyBweS0yIHRleHQtbGVmdCBmb250LXNlbWlib2xkIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtMyBweS0yIHRleHQtcmlnaHQgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LXJpZ2h0IGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWxlIFByaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB4LTMgcHktMiB0ZXh0LWxlZnQgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtMyBweS0yIHRleHQtcmlnaHQgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1eSAvIENob29zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yeVBhcnRzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHNCeUNhdGVnb3J5W2NhdGVnb3J5LmlkXSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFydElkID0gYnVpbGRbY2F0ZWdvcnkuaWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYXJ0ID0gY2F0ZWdvcnlQYXJ0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUGFydHMgPSBjYXRlZ29yeVBhcnRzLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2F0ZWdvcnkuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLXQgYm9yZGVyLXppbmMtOTAwIGhvdmVyOmJnLXppbmMtOTAwLzYwIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBDb21wb25lbnQgLyBQYXJ0IFR5cGUgKi99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTMgcHktMiBhbGlnbi10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZm9udC1tZWRpdW0gdGV4dC16aW5jLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDAgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOiBoYXNQYXJ0cyA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHRleHQtemluYy02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBwYXJ0IHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHRleHQtemluYy02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIEJyYW5kICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC0zIHB5LTIgYWxpZ24tdG9wIHRleHQtemluYy0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZWxlY3RlZFBhcnQgPyBzZWxlY3RlZFBhcnQuYnJhbmQgOiBcIuKAlFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LyogUHJpY2UgKi99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB4LTMgcHktMiBhbGlnbi10b3AgdGV4dC1yaWdodCB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGAkJHtzZWxlY3RlZFBhcnQucHJpY2UudG9GaXhlZCgyKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCLigJRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIFNhbGUgUHJpY2UgKHBsYWNlaG9sZGVyIHVudGlsIHdlIHdpcmUgdGhyb3VnaCBzYWxlL29yaWdpbmFsKSAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHgtMyBweS0yIGFsaWduLXRvcCB0ZXh0LXJpZ2h0IHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBUT0RPOiB3aXJlIGluIHNhbGUvb3JpZ2luYWwgcHJpY2VzIGZyb20gYmFja2VuZCAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzZWxlY3RlZFBhcnQgPyBcIuKAlFwiIDogXCLigJRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey8qIENhbGliZXIgKHBsYWNlaG9sZGVyIGZvciBub3cpICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC0zIHB5LTIgYWxpZ24tdG9wIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBUT0RPOiB3aXJlIGluIGNhbGliZXIgZnJvbSBQcm9kdWN0U3VtbWFyeUR0byB3aGVuIGF2YWlsYWJsZSAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LyogQnV5IC8gQ2hvb3NlICovfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC0zIHB5LTIgYWxpZ24tdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlbGVjdGVkUGFydCAmJiBzZWxlY3RlZFBhcnQudXJsID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6aW5saW5lLWZsZXggcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHB4LTIuNSBweS0xIHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgUGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17c2VsZWN0ZWRQYXJ0LnVybH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IHJvdW5kZWQtbWQgYmctYW1iZXItNDAwIHB4LTIuNSBweS0xIHRleHQtWzAuN3JlbV0gZm9udC1zZW1pYm9sZCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogaGFzUGFydHMgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgcHgtMi41IHB5LTEgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMjAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHlvdSB3YW50IHRvIHByZS1zZWxlY3Qgc29tZXRoaW5nIGxhdGVyLCB5b3UgY2FuIGhhbmRsZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9vc2UgYSBQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgICB7LyogQnVpbGQgU3VtbWFyeSArIFNoYXJlICovfVxuICAgICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE2ZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAgQ3VycmVudCBCdWlsZFxuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHBhcnQgZnJvbSBlYWNoIGNhdGVnb3J5IHRvIHN0YXJ0IHlvdXIgYnVpbGQuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7c3VtbWFyeUNhdGVnb3J5T3JkZXIubWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdC5pZF07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtjYXQuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhdC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0ID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBOb3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDVEEgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgYm9yZGVyLXQgYm9yZGVyLXppbmMtODAwIHB0LTMgc3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BibG9jayB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWFtYmVyLTQwMC82MCBiZy1hbWJlci00MDAvMTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1hbWJlci0yMDAgaG92ZXI6YmctYW1iZXItNDAwLzE1IHRleHQtY2VudGVyIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWQgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDbGVhciBCdWlsZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICB7LyogU2hhcmUgc2VjdGlvbiAqL31cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0zIGJvcmRlci10IGJvcmRlci16aW5jLTgwMCBwdC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgU2hhcmVcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNoYXJlfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQtWzAuN3JlbV0gZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy05MDAvODAgdGV4dC16aW5jLTYwMCBjdXJzb3Itbm90LWFsbG93ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLXppbmMtOTAwLzgwIHRleHQtemluYy0yMDAgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBob3ZlcjpiZy16aW5jLTgwMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIENvcHkgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3NoYXJlU3RhdHVzICYmIChcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC1bMC43cmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIHtzaGFyZVN0YXR1c31cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFZpZXcgeW91ciBidWlsZCBicmVha2Rvd24gaW4gZGV0YWlsIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVycy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hc2lkZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFdoYXQncyBOZXcgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3MgTmV3IGluIEVhcmx5IEFjY2Vzc1xuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBMaXZlIHBhcnRzIGFuZCBwcmljaW5nIHB1bGxlZCBmcm9tIG11bHRpcGxlIG1lcmNoYW50cy48L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgR3JvdXBlZCBsYXlvdXQgZm9yIGxvd2VyIGFuZCB1cHBlciByZWNlaXZlciBwYXJ0cyBzbyB5b3UgY2FuIHNlZVxuICAgICAgICAgICAgICBhdCBhIGdsYW5jZSB3aGljaCBzZWN0aW9ucyBvZiB5b3VyIGJ1aWxkIGFyZSBzdGlsbCBtaXNzaW5nLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIFJ1bm5pbmcgYnVpbGQgdG90YWwgdGhhdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFkZCBvclxuICAgICAgICAgICAgICBzd2FwIGNvbXBvbmVudHMuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgTG9jYWwgYnVpbGQgcGVyc2lzdGVuY2Ugc28geW91ciBzZWxlY3Rpb25zIHN0aWNrIGFyb3VuZCBiZXR3ZWVuXG4gICAgICAgICAgICAgIHZpc2l0cyBvbiB0aGlzIGRldmljZS5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBSb2FkbWFwICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIG9uIG91ciByb2FkbWFwXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIFBsYXRmb3JtIGZpbHRlcnMgKEFSLTE1LCBBUi05LCBBUi0xMCk8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBNb3JlIHBhcnQgY2F0ZWdvcmllcyBhbmQgZnVybml0dXJlPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgUmljaGVyIHByaWNpbmcvc3RvY2sgc3luYzwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFNtYXJ0ZXIgY29tcGF0aWJpbGl0eSBjaGVja3MgYmV0d2VlbiBjb21wb25lbnRzPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgQVI5L0FSMTAgc3VwcG9ydCBhbmQgbW9yZTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJMaW5rIiwidXNlU2VhcmNoUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJTVE9SQUdFX0tFWSIsIkNBVEVHT1JZX0dST1VQUyIsImlkIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsImNhdGVnb3J5SWRzIiwiR3VuYnVpbGRlclBhZ2UiLCJzZWFyY2hQYXJhbXMiLCJyb3V0ZXIiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJzaGFyZVN0YXR1cyIsInNldFNoYXJlU3RhdHVzIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoUHJvZHVjdHMiLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwiY2F0ZWdvcnlJZCIsInBhcnRSb2xlIiwiU3RyaW5nIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsInVybCIsImJ1eVVybCIsIm5vdGVzIiwiZmlsdGVyIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2VsZWN0UGFyYW0iLCJnZXQiLCJwYXJ0SWQiLCJzcGxpdCIsInNvbWUiLCJjIiwicHJldiIsInVwZGF0ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNjcm9sbCIsInBhcnRzQnlDYXRlZ29yeSIsImdyb3VwZWQiLCJjYXRlZ29yeSIsInNlbGVjdGVkUGFydHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsIkJvb2xlYW4iLCJ0b3RhbFByaWNlIiwicmVkdWNlIiwic3VtIiwiaGFuZGxlU2VsZWN0UGFydCIsInN1bW1hcnlDYXRlZ29yeU9yZGVyIiwiZmxhdE1hcCIsImdyb3VwIiwiaGFuZGxlU2hhcmUiLCJsZW5ndGgiLCJsaW5lcyIsInB1c2giLCJ0b0ZpeGVkIiwiZm9yRWFjaCIsImNhdCIsInNlbGVjdGVkUGFydElkIiwicGFydCIsInRleHQiLCJqb2luIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsInNwYW4iLCJoZWFkZXIiLCJoMSIsInNlY3Rpb24iLCJncm91cENhdGVnb3JpZXMiLCJpbmNsdWRlcyIsImgyIiwidGFibGUiLCJ0aGVhZCIsInRyIiwidGgiLCJ0Ym9keSIsImNhdGVnb3J5UGFydHMiLCJzZWxlY3RlZFBhcnQiLCJoYXNQYXJ0cyIsInRkIiwiaHJlZiIsImEiLCJ0YXJnZXQiLCJyZWwiLCJvbkNsaWNrIiwiYXNpZGUiLCJ1bCIsImxpIiwiYnV0dG9uIiwidHlwZSIsInJlbW92ZUl0ZW0iLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n"));
/***/ })
});