- Created type definitions for `auth`, `layout`, and `page` components to ensure type safety and consistency. - Implemented checks for entry validity and prop types using utility types. - Added a `package.json` file to specify module type for TypeScript compatibility.
116 lines
268 KiB
JavaScript
116 lines
268 KiB
JavaScript
/*
|
|
* 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["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["app/auth/page"],{
|
|
|
|
/***/ "(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22C%3A%5C%5CUsers%5C%5CRaymondVerhoef%5C%5CGitea%5C%5Clearning-platform%5C%5Capp%5C%5Cfrontend%5C%5Csrc%5C%5Capp%5C%5Cauth%5C%5Cpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!":
|
|
/*!*******************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22C%3A%5C%5CUsers%5C%5CRaymondVerhoef%5C%5CGitea%5C%5Clearning-platform%5C%5Capp%5C%5Cfrontend%5C%5Csrc%5C%5Capp%5C%5Cauth%5C%5Cpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false! ***!
|
|
\*******************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
|
|
|
|
eval(__webpack_require__.ts("Promise.resolve(/*! import() eager */).then(__webpack_require__.bind(__webpack_require__, /*! ./src/app/auth/page.tsx */ \"(app-pages-browser)/./src/app/auth/page.tsx\"));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYnVpbGQvd2VicGFjay9sb2FkZXJzL25leHQtZmxpZ2h0LWNsaWVudC1lbnRyeS1sb2FkZXIuanM/bW9kdWxlcz0lN0IlMjJyZXF1ZXN0JTIyJTNBJTIyQyUzQSU1QyU1Q1VzZXJzJTVDJTVDUmF5bW9uZFZlcmhvZWYlNUMlNUNHaXRlYSU1QyU1Q2xlYXJuaW5nLXBsYXRmb3JtJTVDJTVDYXBwJTVDJTVDZnJvbnRlbmQlNUMlNUNzcmMlNUMlNUNhcHAlNUMlNUNhdXRoJTVDJTVDcGFnZS50c3glMjIlMkMlMjJpZHMlMjIlM0ElNUIlNUQlN0Qmc2VydmVyPWZhbHNlISIsIm1hcHBpbmdzIjoiQUFBQSx3S0FBaUkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLz8xZGFmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCgvKiB3ZWJwYWNrTW9kZTogXCJlYWdlclwiICovIFwiQzpcXFxcVXNlcnNcXFxcUmF5bW9uZFZlcmhvZWZcXFxcR2l0ZWFcXFxcbGVhcm5pbmctcGxhdGZvcm1cXFxcYXBwXFxcXGZyb250ZW5kXFxcXHNyY1xcXFxhcHBcXFxcYXV0aFxcXFxwYWdlLnRzeFwiKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22C%3A%5C%5CUsers%5C%5CRaymondVerhoef%5C%5CGitea%5C%5Clearning-platform%5C%5Capp%5C%5Cfrontend%5C%5Csrc%5C%5Capp%5C%5Cauth%5C%5Cpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./node_modules/next/dist/api/navigation.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/next/dist/api/navigation.js ***!
|
|
\**************************************************/
|
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
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(var __WEBPACK_IMPORT_KEY__ in _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = function(key) { return _client_components_navigation__WEBPACK_IMPORTED_MODULE_0__[key]; }.bind(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYXBpL25hdmlnYXRpb24uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQWdEOztBQUVoRCIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2FwaS9uYXZpZ2F0aW9uLmpzP2NkMWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4uL2NsaWVudC9jb21wb25lbnRzL25hdmlnYXRpb25cIjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmF2aWdhdGlvbi5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/api/navigation.js\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./src/app/auth/page.tsx":
|
|
/*!*******************************!*\
|
|
!*** ./src/app/auth/page.tsx ***!
|
|
\*******************************/
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ AuthPage; }\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_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _lib_pocketbase__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/pocketbase */ \"(app-pages-browser)/./src/lib/pocketbase.ts\");\n/* harmony import */ var _lib_auth__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/auth */ \"(app-pages-browser)/./src/lib/auth.ts\");\n/* harmony import */ var _components_ui_Button__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/ui/Button */ \"(app-pages-browser)/./src/components/ui/Button.tsx\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nfunction AuthPage() {\n _s();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter)();\n const [email, setEmail] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n const [password, setPassword] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n async function handleSubmit(e) {\n e.preventDefault();\n if (!email || !password) return;\n setLoading(true);\n setError(null);\n try {\n await _lib_pocketbase__WEBPACK_IMPORTED_MODULE_3__.pb.collection(\"users\").authWithPassword(email, password);\n (0,_lib_auth__WEBPACK_IMPORTED_MODULE_4__.syncAuthCookies)();\n const user = _lib_pocketbase__WEBPACK_IMPORTED_MODULE_3__.pb.authStore.model;\n if ((user === null || user === void 0 ? void 0 : user.role) === \"admin\") {\n router.push(\"/admin\");\n } else {\n router.push(\"/app\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Login failed. Check your credentials.\");\n } finally{\n setLoading(false);\n }\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n style: {\n minHeight: \"100dvh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"var(--s-5)\",\n background: \"var(--bg)\"\n },\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n width: \"100%\",\n maxWidth: \"400px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--s-6)\"\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n textAlign: \"center\"\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n width: \"64px\",\n height: \"64px\",\n borderRadius: \"50%\",\n background: \"var(--bg-dark)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--paper)\",\n fontSize: \"var(--t-h3)\",\n fontWeight: 700,\n marginBottom: \"var(--s-4)\"\n },\n children: \"L\"\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 63,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n style: {\n margin: \"0 0 var(--s-2)\",\n fontSize: \"var(--t-h3)\",\n fontWeight: 700,\n color: \"var(--fg)\"\n },\n children: \"Learning Platform\"\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 80,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n style: {\n margin: 0,\n fontSize: \"var(--t-body)\",\n color: \"var(--fg-muted)\"\n },\n children: \"Sign in to continue\"\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 90,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 62,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"form\", {\n onSubmit: (e)=>void handleSubmit(e),\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--s-4)\"\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--s-2)\"\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"email\",\n style: {\n fontSize: \"var(--t-small)\",\n fontWeight: 600,\n color: \"var(--fg)\"\n },\n children: \"Email\"\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 101,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"email\",\n type: \"email\",\n value: email,\n onChange: (e)=>setEmail(e.target.value),\n required: true,\n autoComplete: \"email\",\n placeholder: \"you@company.com\",\n style: {\n width: \"100%\",\n borderRadius: \"var(--r-sm)\",\n border: \"1.5px solid var(--cream)\",\n padding: \"var(--s-3) var(--s-4)\",\n fontSize: \"var(--t-body)\",\n fontFamily: \"var(--font-sans)\",\n color: \"var(--fg)\",\n background: \"var(--bg)\",\n outline: \"none\",\n minHeight: \"44px\",\n boxSizing: \"border-box\"\n }\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 111,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 100,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--s-2)\"\n },\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"password\",\n style: {\n fontSize: \"var(--t-small)\",\n fontWeight: 600,\n color: \"var(--fg)\"\n },\n children: \"Password\"\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 136,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"password\",\n type: \"password\",\n value: password,\n onChange: (e)=>setPassword(e.target.value),\n required: true,\n autoComplete: \"current-password\",\n placeholder: \"••••••••\",\n style: {\n width: \"100%\",\n borderRadius: \"var(--r-sm)\",\n border: \"1.5px solid var(--cream)\",\n padding: \"var(--s-3) var(--s-4)\",\n fontSize: \"var(--t-body)\",\n fontFamily: \"var(--font-sans)\",\n color: \"var(--fg)\",\n background: \"var(--bg)\",\n outline: \"none\",\n minHeight: \"44px\",\n boxSizing: \"border-box\"\n }\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 146,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 135,\n columnNumber: 11\n }, this),\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n style: {\n background: \"#f8d7da\",\n color: \"#c0392b\",\n borderRadius: \"var(--r-sm)\",\n padding: \"var(--s-3) var(--s-4)\",\n fontSize: \"var(--t-small)\"\n },\n children: error\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 171,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_ui_Button__WEBPACK_IMPORTED_MODULE_5__.Button, {\n type: \"submit\",\n variant: \"primary\",\n size: \"lg\",\n loading: loading,\n style: {\n width: \"100%\"\n },\n children: \"Sign in\"\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 184,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 96,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 52,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\app\\\\auth\\\\page.tsx\",\n lineNumber: 41,\n columnNumber: 5\n }, this);\n}\n_s(AuthPage, \"8x07TSJCxfQf2kG6VFpAD3lIG1w=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_2__.useRouter\n ];\n});\n_c = AuthPage;\nvar _c;\n$RefreshReg$(_c, \"AuthPage\");\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvYXV0aC9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ3VDO0FBQ0k7QUFDTjtBQUNPO0FBQ0c7QUFHaEMsU0FBU007O0lBQ3RCLE1BQU1DLFNBQVNMLDBEQUFTQTtJQUN4QixNQUFNLENBQUNNLE9BQU9DLFNBQVMsR0FBR1IsK0NBQVFBLENBQUM7SUFDbkMsTUFBTSxDQUFDUyxVQUFVQyxZQUFZLEdBQUdWLCtDQUFRQSxDQUFDO0lBQ3pDLE1BQU0sQ0FBQ1csU0FBU0MsV0FBVyxHQUFHWiwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUNhLE9BQU9DLFNBQVMsR0FBR2QsK0NBQVFBLENBQWdCO0lBRWxELGVBQWVlLGFBQWFDLENBQW1DO1FBQzdEQSxFQUFFQyxjQUFjO1FBQ2hCLElBQUksQ0FBQ1YsU0FBUyxDQUFDRSxVQUFVO1FBRXpCRyxXQUFXO1FBQ1hFLFNBQVM7UUFFVCxJQUFJO1lBQ0YsTUFBTVosK0NBQUVBLENBQUNnQixVQUFVLENBQUMsU0FBU0MsZ0JBQWdCLENBQUNaLE9BQU9FO1lBQ3JETiwwREFBZUE7WUFFZixNQUFNaUIsT0FBT2xCLCtDQUFFQSxDQUFDbUIsU0FBUyxDQUFDQyxLQUFLO1lBQy9CLElBQUlGLENBQUFBLGlCQUFBQSwyQkFBQUEsS0FBTUcsSUFBSSxNQUFLLFNBQVM7Z0JBQzFCakIsT0FBT2tCLElBQUksQ0FBQztZQUNkLE9BQU87Z0JBQ0xsQixPQUFPa0IsSUFBSSxDQUFDO1lBQ2Q7UUFDRixFQUFFLE9BQU9DLEtBQUs7WUFDWlgsU0FBU1csZUFBZUMsUUFBUUQsSUFBSUUsT0FBTyxHQUFHO1FBQ2hELFNBQVU7WUFDUmYsV0FBVztRQUNiO0lBQ0Y7SUFFQSxxQkFDRSw4REFBQ2dCO1FBQ0NDLE9BQU87WUFDTEMsV0FBVztZQUNYQyxTQUFTO1lBQ1RDLGVBQWU7WUFDZkMsWUFBWTtZQUNaQyxnQkFBZ0I7WUFDaEJDLFNBQVM7WUFDVEMsWUFBWTtRQUNkO2tC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akM7O1FBQ1BKLHNEQUFTQTs7O0tBREZJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL3NyYy9hcHAvYXV0aC9wYWdlLnRzeD9lYzJlIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50J1xuaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VSb3V0ZXIgfSBmcm9tICduZXh0L25hdmlnYXRpb24nXG5pbXBvcnQgeyBwYiB9IGZyb20gJ0AvbGliL3BvY2tldGJhc2UnXG5pbXBvcnQgeyBzeW5jQXV0aENvb2tpZXMgfSBmcm9tICdAL2xpYi9hdXRoJ1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnQC9jb21wb25lbnRzL3VpL0J1dHRvbidcbmltcG9ydCB0eXBlIHsgUEJVc2VyIH0gZnJvbSAnQC90eXBlcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXV0aFBhZ2UoKSB7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXG4gIGNvbnN0IFtlbWFpbCwgc2V0RW1haWxdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3VibWl0KGU6IFJlYWN0LkZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaWYgKCFlbWFpbCB8fCAhcGFzc3dvcmQpIHJldHVyblxuXG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldEVycm9yKG51bGwpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcGIuY29sbGVjdGlvbigndXNlcnMnKS5hdXRoV2l0aFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZClcbiAgICAgIHN5bmNBdXRoQ29va2llcygpXG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYi5hdXRoU3RvcmUubW9kZWwgYXMgUEJVc2VyIHwgbnVsbFxuICAgICAgaWYgKHVzZXI/LnJvbGUgPT09ICdhZG1pbicpIHtcbiAgICAgICAgcm91dGVyLnB1c2goJy9hZG1pbicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3V0ZXIucHVzaCgnL2FwcCcpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0xvZ2luIGZhaWxlZC4gQ2hlY2sgeW91ciBjcmVkZW50aWFscy4nKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW5cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIG1pbkhlaWdodDogJzEwMGR2aCcsXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgIHBhZGRpbmc6ICd2YXIoLS1zLTUpJyxcbiAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWJnKScsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgIG1heFdpZHRoOiAnNDAwcHgnLFxuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICBnYXA6ICd2YXIoLS1zLTYpJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgey8qIExvZ28gLyBicmFuZCAqL31cbiAgICAgICAgPGRpdiBzdHlsZT17eyB0ZXh0QWxpZ246ICdjZW50ZXInIH19PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIHdpZHRoOiAnNjRweCcsXG4gICAgICAgICAgICAgIGhlaWdodDogJzY0cHgnLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tYmctZGFyayknLFxuICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLXBhcGVyKScsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiAndmFyKC0tdC1oMyknLFxuICAgICAgICAgICAgICBmb250V2VpZ2h0OiA3MDAsXG4gICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogJ3ZhcigtLXMtNCknLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBMXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGgxXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBtYXJnaW46ICcwIDAgdmFyKC0tcy0yKScsXG4gICAgICAgICAgICAgIGZvbnRTaXplOiAndmFyKC0tdC1oMyknLFxuICAgICAgICAgICAgICBmb250V2VpZ2h0OiA3MDAsXG4gICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZmcpJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgTGVhcm5pbmcgUGxhdGZvcm1cbiAgICAgICAgICA8L2gxPlxuICAgICAgICAgIDxwIHN0eWxlPXt7IG1hcmdpbjogMCwgZm9udFNpemU6ICd2YXIoLS10LWJvZHkpJywgY29sb3I6ICd2YXIoLS1mZy1tdXRlZCknIH19PlxuICAgICAgICAgICAgU2lnbiBpbiB0byBjb250aW51ZVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgIDxmb3JtXG4gICAgICAgICAgb25TdWJtaXQ9eyhlKSA9PiB2b2lkIGhhbmRsZVN1Ym1pdChlKX1cbiAgICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zLTQpJyB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zLTIpJyB9fT5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBodG1sRm9yPVwiZW1haWxcIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAndmFyKC0tdC1zbWFsbCknLFxuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEVtYWlsXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwiZW1haWxcIlxuICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICB2YWx1ZT17ZW1haWx9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0RW1haWwoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJlbWFpbFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwieW91QGNvbXBhbnkuY29tXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJ3ZhcigtLXItc20pJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICcxLjVweCBzb2xpZCB2YXIoLS1jcmVhbSknLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICd2YXIoLS1zLTMpIHZhcigtLXMtNCknLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAndmFyKC0tdC1ib2R5KScsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogJ3ZhcigtLWZvbnQtc2FucyknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZmcpJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tYmcpJyxcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgbWluSGVpZ2h0OiAnNDRweCcsXG4gICAgICAgICAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBnYXA6ICd2YXIoLS1zLTIpJyB9fT5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBodG1sRm9yPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAndmFyKC0tdC1zbWFsbCknLFxuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFBhc3N3b3JkXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGlkPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICB2YWx1ZT17cGFzc3dvcmR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0UGFzc3dvcmQoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJjdXJyZW50LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLigKLigKLigKLigKLigKLigKLigKLigKJcIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAndmFyKC0tci1zbSknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzEuNXB4IHNvbGlkIHZhcigtLWNyZWFtKScsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJ3ZhcigtLXMtMykgdmFyKC0tcy00KScsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6ICd2YXIoLS10LWJvZHkpJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiAndmFyKC0tZm9udC1zYW5zKScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1mZyknLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1iZyknLFxuICAgICAgICAgICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6ICc0NHB4JyxcbiAgICAgICAgICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZjhkN2RhJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJyNjMDM5MmInLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJ3ZhcigtLXItc20pJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAndmFyKC0tcy0zKSB2YXIoLS1zLTQpJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJ3ZhcigtLXQtc21hbGwpJyxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Vycm9yfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiIHZhcmlhbnQ9XCJwcmltYXJ5XCIgc2l6ZT1cImxnXCIgbG9hZGluZz17bG9hZGluZ30gc3R5bGU9e3sgd2lkdGg6ICcxMDAlJyB9fT5cbiAgICAgICAgICAgIFNpZ24gaW5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApXG59XG4iXSwibmFtZXMiOlsiUmVhY3QiLCJ1c2VTdGF0ZSIsInVzZVJvdXRlciIsInBiIiwic3luY0F1dGhDb29raWVzIiwiQnV0dG9uIiwiQXV0aFBhZ2UiLCJyb3V0ZXIiLCJlbWFpbCIsInNldEVtYWlsIiwicGFzc3dvcmQiLCJzZXRQYXNzd29yZCIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImhhbmRsZVN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImNvbGxlY3Rpb24iLCJhdXRoV2l0aFBhc3N3b3JkIiwidXNlciIsImF1dGhTdG9yZSIsIm1vZGVsIiwicm9sZSIsInB1c2giLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJtYWluIiwic3R5bGUiLCJtaW5IZWlnaHQiLCJkaXNwbGF5IiwiZmxleERpcmVjdGlvbiIsImFsaWduSXRlbXMiLCJqdXN0aWZ5Q29udGVudCIsInBhZGRpbmciLCJiYWNrZ3JvdW5kIiwiZGl2Iiwid2lkdGgiLCJtYXhXaWR0aCIsImdhcCIsInRleHRBbGlnbiIsImhlaWdodCIsImJvcmRlclJhZGl1cyIsImNvbG9yIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwibWFyZ2luQm90dG9tIiwiaDEiLCJtYXJnaW4iLCJwIiwiZm9ybSIsIm9uU3VibWl0IiwibGFiZWwiLCJodG1sRm9yIiwiaW5wdXQiLCJpZCIsInR5cGUiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwidGFyZ2V0IiwicmVxdWlyZWQiLCJhdXRvQ29tcGxldGUiLCJwbGFjZWhvbGRlciIsImJvcmRlciIsImZvbnRGYW1pbHkiLCJvdXRsaW5lIiwiYm94U2l6aW5nIiwidmFyaWFudCIsInNpemUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/auth/page.tsx\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./src/components/ui/Button.tsx":
|
|
/*!**************************************!*\
|
|
!*** ./src/components/ui/Button.tsx ***!
|
|
\**************************************/
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Button: function() { return /* binding */ Button; }\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/* __next_internal_client_entry_do_not_use__ Button auto */ \n\nconst variantStyles = {\n primary: {\n background: \"var(--accent)\",\n color: \"var(--paper)\",\n border: \"none\"\n },\n secondary: {\n background: \"var(--bg-warm)\",\n color: \"var(--fg)\",\n border: \"1.5px solid var(--cream)\"\n },\n danger: {\n background: \"#c0392b\",\n color: \"var(--paper)\",\n border: \"none\"\n },\n ghost: {\n background: \"transparent\",\n color: \"var(--fg)\",\n border: \"1.5px solid var(--cream)\"\n }\n};\nconst sizeStyles = {\n sm: {\n fontSize: \"var(--t-small)\",\n padding: \"var(--s-2) var(--s-3)\",\n minHeight: \"36px\",\n borderRadius: \"var(--r-sm)\"\n },\n md: {\n fontSize: \"var(--t-body)\",\n padding: \"var(--s-2) var(--s-5)\",\n minHeight: \"44px\",\n borderRadius: \"var(--r-md)\"\n },\n lg: {\n fontSize: \"var(--t-lead)\",\n padding: \"var(--s-3) var(--s-6)\",\n minHeight: \"52px\",\n borderRadius: \"var(--r-lg)\"\n }\n};\nfunction Button(param) {\n let { variant = \"primary\", size = \"md\", loading = false, disabled, children, style, ...rest } = param;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n disabled: disabled !== null && disabled !== void 0 ? disabled : loading,\n style: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"var(--s-2)\",\n fontFamily: \"var(--font-sans)\",\n fontWeight: 500,\n cursor: (disabled !== null && disabled !== void 0 ? disabled : loading) ? \"not-allowed\" : \"pointer\",\n opacity: (disabled !== null && disabled !== void 0 ? disabled : loading) ? 0.6 : 1,\n transition: \"opacity 150ms, transform 100ms\",\n ...variantStyles[variant],\n ...sizeStyles[size],\n ...style\n },\n ...rest,\n children: loading ? /*#__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)(Spinner, {}, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\components\\\\ui\\\\Button.tsx\",\n lineNumber: 88,\n columnNumber: 11\n }, this),\n children\n ]\n }, void 0, true) : children\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\components\\\\ui\\\\Button.tsx\",\n lineNumber: 68,\n columnNumber: 5\n }, this);\n}\n_c = Button;\nfunction Spinner() {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n style: {\n width: \"16px\",\n height: \"16px\",\n border: \"2px solid currentColor\",\n borderTopColor: \"transparent\",\n borderRadius: \"50%\",\n display: \"inline-block\",\n animation: \"spin 0.7s linear infinite\"\n }\n }, void 0, false, {\n fileName: \"C:\\\\Users\\\\RaymondVerhoef\\\\Gitea\\\\learning-platform\\\\app\\\\frontend\\\\src\\\\components\\\\ui\\\\Button.tsx\",\n lineNumber: 100,\n columnNumber: 5\n }, this);\n}\n_c1 = Spinner;\nvar _c, _c1;\n$RefreshReg$(_c, \"Button\");\n$RefreshReg$(_c1, \"Spinner\");\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3VpL0J1dHRvbi50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFDeUI7QUFZekIsTUFBTUMsZ0JBQTREO0lBQ2hFQyxTQUFTO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxRQUFRO0lBQ1Y7SUFDQUMsV0FBVztRQUNUSCxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsUUFBUTtJQUNWO0lBQ0FFLFFBQVE7UUFDTkosWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLFFBQVE7SUFDVjtJQUNBRyxPQUFPO1FBQ0xMLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxRQUFRO0lBQ1Y7QUFDRjtBQUVBLE1BQU1JLGFBQXNEO0lBQzFEQyxJQUFJO1FBQ0ZDLFVBQVU7UUFDVkMsU0FBUztRQUNUQyxXQUFXO1FBQ1hDLGNBQWM7SUFDaEI7SUFDQUMsSUFBSTtRQUNGSixVQUFVO1FBQ1ZDLFNBQVM7UUFDVEMsV0FBVztRQUNYQyxjQUFjO0lBQ2hCO0lBQ0FFLElBQUk7UUFDRkwsVUFBVTtRQUNWQyxTQUFTO1FBQ1RDLFdBQVc7UUFDWEMsY0FBYztJQUNoQjtBQUNGO0FBRU8sU0FBU0csT0FBTyxLQVFUO1FBUlMsRUFDckJDLFVBQVUsU0FBUyxFQUNuQkMsT0FBTyxJQUFJLEVBQ1hDLFVBQVUsS0FBSyxFQUNmQyxRQUFRLEVBQ1JDLFFBQVEsRUFDUkMsS0FBSyxFQUNMLEdBQUdDLE1BQ1MsR0FSUztJQVNyQixxQkFDRSw4REFBQ0M7UUFDQ0osVUFBVUEscUJBQUFBLHNCQUFBQSxXQUFZRDtRQUN0QkcsT0FBTztZQUNMRyxTQUFTO1lBQ1RDLFlBQVk7WUFDWkMsZ0JBQWdCO1lBQ2hCQyxLQUFLO1lBQ0xDLFlBQVk7WUFDWkMsWUFBWTtZQUNaQyxRQUFRWCxDQUFBQSxxQkFBQUEsc0JBQUFBLFdBQVlELE9BQU0sSUFBSSxnQkFBZ0I7WUFDOUNhLFNBQVNaLENBQUFBLHFCQUFBQSxzQkFBQUEsV0FBWUQsT0FBTSxJQUFJLE1BQU07WUFDckNjLFlBQVk7WUFDWixHQUFHakMsYUFBYSxDQUFDaUIsUUFBUTtZQUN6QixHQUFHVCxVQUFVLENBQUNVLEtBQUs7WUFDbkIsR0FBR0ksS0FBSztRQUNWO1FBQ0MsR0FBR0MsSUFBSTtrQkFFUEosd0JBQ0M7OzhCQUNFLDhEQUFDZTs7Ozs7Z0JBQ0FiOzsyQkFHSEE7Ozs7OztBQUlSO0tBdENnQkw7QUF3Q2hCLFNBQVNrQjtJQUNQLHFCQUNFLDhEQUFDQztRQUNDYixPQUFPO1lBQ0xjLE9BQU87WUFDUEMsUUFBUTtZQUNSakMsUUFBUTtZQUNSa0MsZ0JBQWdCO1lBQ2hCekIsY0FBYztZQUNkWSxTQUFTO1lBQ1RjLFdBQVc7UUFDYjs7Ozs7O0FBR047TUFkU0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL2NvbXBvbmVudHMvdWkvQnV0dG9uLnRzeD8wMTNhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50J1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG50eXBlIEJ1dHRvblZhcmlhbnQgPSAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JyB8ICdkYW5nZXInIHwgJ2dob3N0J1xudHlwZSBCdXR0b25TaXplID0gJ3NtJyB8ICdtZCcgfCAnbGcnXG5cbmludGVyZmFjZSBCdXR0b25Qcm9wcyBleHRlbmRzIFJlYWN0LkJ1dHRvbkhUTUxBdHRyaWJ1dGVzPEhUTUxCdXR0b25FbGVtZW50PiB7XG4gIHZhcmlhbnQ/OiBCdXR0b25WYXJpYW50XG4gIHNpemU/OiBCdXR0b25TaXplXG4gIGxvYWRpbmc/OiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGVcbn1cblxuY29uc3QgdmFyaWFudFN0eWxlczogUmVjb3JkPEJ1dHRvblZhcmlhbnQsIFJlYWN0LkNTU1Byb3BlcnRpZXM+ID0ge1xuICBwcmltYXJ5OiB7XG4gICAgYmFja2dyb3VuZDogJ3ZhcigtLWFjY2VudCknLFxuICAgIGNvbG9yOiAndmFyKC0tcGFwZXIpJyxcbiAgICBib3JkZXI6ICdub25lJyxcbiAgfSxcbiAgc2Vjb25kYXJ5OiB7XG4gICAgYmFja2dyb3VuZDogJ3ZhcigtLWJnLXdhcm0pJyxcbiAgICBjb2xvcjogJ3ZhcigtLWZnKScsXG4gICAgYm9yZGVyOiAnMS41cHggc29saWQgdmFyKC0tY3JlYW0pJyxcbiAgfSxcbiAgZGFuZ2VyOiB7XG4gICAgYmFja2dyb3VuZDogJyNjMDM5MmInLFxuICAgIGNvbG9yOiAndmFyKC0tcGFwZXIpJyxcbiAgICBib3JkZXI6ICdub25lJyxcbiAgfSxcbiAgZ2hvc3Q6IHtcbiAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgIGNvbG9yOiAndmFyKC0tZmcpJyxcbiAgICBib3JkZXI6ICcxLjVweCBzb2xpZCB2YXIoLS1jcmVhbSknLFxuICB9LFxufVxuXG5jb25zdCBzaXplU3R5bGVzOiBSZWNvcmQ8QnV0dG9uU2l6ZSwgUmVhY3QuQ1NTUHJvcGVydGllcz4gPSB7XG4gIHNtOiB7XG4gICAgZm9udFNpemU6ICd2YXIoLS10LXNtYWxsKScsXG4gICAgcGFkZGluZzogJ3ZhcigtLXMtMikgdmFyKC0tcy0zKScsXG4gICAgbWluSGVpZ2h0OiAnMzZweCcsXG4gICAgYm9yZGVyUmFkaXVzOiAndmFyKC0tci1zbSknLFxuICB9LFxuICBtZDoge1xuICAgIGZvbnRTaXplOiAndmFyKC0tdC1ib2R5KScsXG4gICAgcGFkZGluZzogJ3ZhcigtLXMtMikgdmFyKC0tcy01KScsXG4gICAgbWluSGVpZ2h0OiAnNDRweCcsXG4gICAgYm9yZGVyUmFkaXVzOiAndmFyKC0tci1tZCknLFxuICB9LFxuICBsZzoge1xuICAgIGZvbnRTaXplOiAndmFyKC0tdC1sZWFkKScsXG4gICAgcGFkZGluZzogJ3ZhcigtLXMtMykgdmFyKC0tcy02KScsXG4gICAgbWluSGVpZ2h0OiAnNTJweCcsXG4gICAgYm9yZGVyUmFkaXVzOiAndmFyKC0tci1sZyknLFxuICB9LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gQnV0dG9uKHtcbiAgdmFyaWFudCA9ICdwcmltYXJ5JyxcbiAgc2l6ZSA9ICdtZCcsXG4gIGxvYWRpbmcgPSBmYWxzZSxcbiAgZGlzYWJsZWQsXG4gIGNoaWxkcmVuLFxuICBzdHlsZSxcbiAgLi4ucmVzdFxufTogQnV0dG9uUHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgPz8gbG9hZGluZ31cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgIGdhcDogJ3ZhcigtLXMtMiknLFxuICAgICAgICBmb250RmFtaWx5OiAndmFyKC0tZm9udC1zYW5zKScsXG4gICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/PyBsb2FkaW5nID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJyxcbiAgICAgICAgb3BhY2l0eTogZGlzYWJsZWQgPz8gbG9hZGluZyA/IDAuNiA6IDEsXG4gICAgICAgIHRyYW5zaXRpb246ICdvcGFjaXR5IDE1MG1zLCB0cmFuc2Zvcm0gMTAwbXMnLFxuICAgICAgICAuLi52YXJpYW50U3R5bGVzW3ZhcmlhbnRdLFxuICAgICAgICAuLi5zaXplU3R5bGVzW3NpemVdLFxuICAgICAgICAuLi5zdHlsZSxcbiAgICAgIH19XG4gICAgICB7Li4ucmVzdH1cbiAgICA+XG4gICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgPD5cbiAgICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC8+XG4gICAgICApIDogKFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKX1cbiAgICA8L2J1dHRvbj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTcGlubmVyKCkge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBzdHlsZT17e1xuICAgICAgICB3aWR0aDogJzE2cHgnLFxuICAgICAgICBoZWlnaHQ6ICcxNnB4JyxcbiAgICAgICAgYm9yZGVyOiAnMnB4IHNvbGlkIGN1cnJlbnRDb2xvcicsXG4gICAgICAgIGJvcmRlclRvcENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgYW5pbWF0aW9uOiAnc3BpbiAwLjdzIGxpbmVhciBpbmZpbml0ZScsXG4gICAgICB9fVxuICAgIC8+XG4gIClcbn1cbiJdLCJuYW1lcyI6WyJSZWFjdCIsInZhcmlhbnRTdHlsZXMiLCJwcmltYXJ5IiwiYmFja2dyb3VuZCIsImNvbG9yIiwiYm9yZGVyIiwic2Vjb25kYXJ5IiwiZGFuZ2VyIiwiZ2hvc3QiLCJzaXplU3R5bGVzIiwic20iLCJmb250U2l6ZSIsInBhZGRpbmciLCJtaW5IZWlnaHQiLCJib3JkZXJSYWRpdXMiLCJtZCIsImxnIiwiQnV0dG9uIiwidmFyaWFudCIsInNpemUiLCJsb2FkaW5nIiwiZGlzYWJsZWQiLCJjaGlsZHJlbiIsInN0eWxlIiwicmVzdCIsImJ1dHRvbiIsImRpc3BsYXkiLCJhbGlnbkl0ZW1zIiwianVzdGlmeUNvbnRlbnQiLCJnYXAiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImN1cnNvciIsIm9wYWNpdHkiLCJ0cmFuc2l0aW9uIiwiU3Bpbm5lciIsInNwYW4iLCJ3aWR0aCIsImhlaWdodCIsImJvcmRlclRvcENvbG9yIiwiYW5pbWF0aW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/ui/Button.tsx\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./src/lib/auth.ts":
|
|
/*!*************************!*\
|
|
!*** ./src/lib/auth.ts ***!
|
|
\*************************/
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ clearAuthCookies: function() { return /* binding */ clearAuthCookies; },\n/* harmony export */ getAuthUser: function() { return /* binding */ getAuthUser; },\n/* harmony export */ logout: function() { return /* binding */ logout; },\n/* harmony export */ syncAuthCookies: function() { return /* binding */ syncAuthCookies; }\n/* harmony export */ });\n/* harmony import */ var _pocketbase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pocketbase */ \"(app-pages-browser)/./src/lib/pocketbase.ts\");\n/* __next_internal_client_entry_do_not_use__ getAuthUser,syncAuthCookies,clearAuthCookies,logout auto */ \nconst COOKIE_TOKEN = \"pb_token\";\nconst COOKIE_ROLE = \"pb_role\";\nconst COOKIE_MAX_AGE = 60 * 60 * 24 * 14 // 14 days\n;\nfunction getAuthUser() {\n if (!_pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.isValid) return null;\n return _pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.model;\n}\nfunction syncAuthCookies() {\n if (_pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.isValid && _pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.token) {\n const user = _pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.model;\n var _user_role;\n const role = (_user_role = user === null || user === void 0 ? void 0 : user.role) !== null && _user_role !== void 0 ? _user_role : \"\";\n document.cookie = \"\".concat(COOKIE_TOKEN, \"=\").concat(_pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.token, \"; path=/; max-age=\").concat(COOKIE_MAX_AGE, \"; SameSite=Lax\");\n document.cookie = \"\".concat(COOKIE_ROLE, \"=\").concat(role, \"; path=/; max-age=\").concat(COOKIE_MAX_AGE, \"; SameSite=Lax\");\n } else {\n clearAuthCookies();\n }\n}\nfunction clearAuthCookies() {\n document.cookie = \"\".concat(COOKIE_TOKEN, \"=; path=/; max-age=0\");\n document.cookie = \"\".concat(COOKIE_ROLE, \"=; path=/; max-age=0\");\n}\nfunction logout() {\n _pocketbase__WEBPACK_IMPORTED_MODULE_0__.pb.authStore.clear();\n clearAuthCookies();\n window.location.href = \"/auth\";\n}\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvYXV0aC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozt5R0FDaUM7QUFHakMsTUFBTUMsZUFBZTtBQUNyQixNQUFNQyxjQUFjO0FBQ3BCLE1BQU1DLGlCQUFpQixLQUFLLEtBQUssS0FBSyxHQUFHLFVBQVU7O0FBRTVDLFNBQVNDO0lBQ2QsSUFBSSxDQUFDSiwyQ0FBRUEsQ0FBQ0ssU0FBUyxDQUFDQyxPQUFPLEVBQUUsT0FBTztJQUNsQyxPQUFPTiwyQ0FBRUEsQ0FBQ0ssU0FBUyxDQUFDRSxLQUFLO0FBQzNCO0FBRU8sU0FBU0M7SUFDZCxJQUFJUiwyQ0FBRUEsQ0FBQ0ssU0FBUyxDQUFDQyxPQUFPLElBQUlOLDJDQUFFQSxDQUFDSyxTQUFTLENBQUNJLEtBQUssRUFBRTtRQUM5QyxNQUFNQyxPQUFPViwyQ0FBRUEsQ0FBQ0ssU0FBUyxDQUFDRSxLQUFLO1lBQ2xCRztRQUFiLE1BQU1DLE9BQU9ELENBQUFBLGFBQUFBLGlCQUFBQSwyQkFBQUEsS0FBTUMsSUFBSSxjQUFWRCx3QkFBQUEsYUFBYztRQUMzQkUsU0FBU0MsTUFBTSxHQUFHLEdBQW1CYixPQUFoQkMsY0FBYSxLQUEwQ0UsT0FBdkNILDJDQUFFQSxDQUFDSyxTQUFTLENBQUNJLEtBQUssRUFBQyxzQkFBbUMsT0FBZk4sZ0JBQWU7UUFDM0ZTLFNBQVNDLE1BQU0sR0FBRyxHQUFrQkYsT0FBZlQsYUFBWSxLQUE0QkMsT0FBekJRLE1BQUssc0JBQW1DLE9BQWZSLGdCQUFlO0lBQzlFLE9BQU87UUFDTFc7SUFDRjtBQUNGO0FBRU8sU0FBU0E7SUFDZEYsU0FBU0MsTUFBTSxHQUFHLEdBQWdCLE9BQWJaLGNBQWE7SUFDbENXLFNBQVNDLE1BQU0sR0FBRyxHQUFlLE9BQVpYLGFBQVk7QUFDbkM7QUFFTyxTQUFTYTtJQUNkZiwyQ0FBRUEsQ0FBQ0ssU0FBUyxDQUFDVyxLQUFLO0lBQ2xCRjtJQUNBRyxPQUFPQyxRQUFRLENBQUNDLElBQUksR0FBRztBQUN6QiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9zcmMvbGliL2F1dGgudHM/NjY5MiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCdcbmltcG9ydCB7IHBiIH0gZnJvbSAnLi9wb2NrZXRiYXNlJ1xuaW1wb3J0IHR5cGUgeyBQQlVzZXIgfSBmcm9tICdAL3R5cGVzJ1xuXG5jb25zdCBDT09LSUVfVE9LRU4gPSAncGJfdG9rZW4nXG5jb25zdCBDT09LSUVfUk9MRSA9ICdwYl9yb2xlJ1xuY29uc3QgQ09PS0lFX01BWF9BR0UgPSA2MCAqIDYwICogMjQgKiAxNCAvLyAxNCBkYXlzXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoVXNlcigpOiBQQlVzZXIgfCBudWxsIHtcbiAgaWYgKCFwYi5hdXRoU3RvcmUuaXNWYWxpZCkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHBiLmF1dGhTdG9yZS5tb2RlbCBhcyBQQlVzZXIgfCBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQXV0aENvb2tpZXMoKTogdm9pZCB7XG4gIGlmIChwYi5hdXRoU3RvcmUuaXNWYWxpZCAmJiBwYi5hdXRoU3RvcmUudG9rZW4pIHtcbiAgICBjb25zdCB1c2VyID0gcGIuYXV0aFN0b3JlLm1vZGVsIGFzIFBCVXNlciB8IG51bGxcbiAgICBjb25zdCByb2xlID0gdXNlcj8ucm9sZSA/PyAnJ1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke0NPT0tJRV9UT0tFTn09JHtwYi5hdXRoU3RvcmUudG9rZW59OyBwYXRoPS87IG1heC1hZ2U9JHtDT09LSUVfTUFYX0FHRX07IFNhbWVTaXRlPUxheGBcbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtDT09LSUVfUk9MRX09JHtyb2xlfTsgcGF0aD0vOyBtYXgtYWdlPSR7Q09PS0lFX01BWF9BR0V9OyBTYW1lU2l0ZT1MYXhgXG4gIH0gZWxzZSB7XG4gICAgY2xlYXJBdXRoQ29va2llcygpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQXV0aENvb2tpZXMoKTogdm9pZCB7XG4gIGRvY3VtZW50LmNvb2tpZSA9IGAke0NPT0tJRV9UT0tFTn09OyBwYXRoPS87IG1heC1hZ2U9MGBcbiAgZG9jdW1lbnQuY29va2llID0gYCR7Q09PS0lFX1JPTEV9PTsgcGF0aD0vOyBtYXgtYWdlPTBgXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dvdXQoKTogdm9pZCB7XG4gIHBiLmF1dGhTdG9yZS5jbGVhcigpXG4gIGNsZWFyQXV0aENvb2tpZXMoKVxuICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvYXV0aCdcbn1cbiJdLCJuYW1lcyI6WyJwYiIsIkNPT0tJRV9UT0tFTiIsIkNPT0tJRV9ST0xFIiwiQ09PS0lFX01BWF9BR0UiLCJnZXRBdXRoVXNlciIsImF1dGhTdG9yZSIsImlzVmFsaWQiLCJtb2RlbCIsInN5bmNBdXRoQ29va2llcyIsInRva2VuIiwidXNlciIsInJvbGUiLCJkb2N1bWVudCIsImNvb2tpZSIsImNsZWFyQXV0aENvb2tpZXMiLCJsb2dvdXQiLCJjbGVhciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/auth.ts\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./src/lib/pocketbase.ts":
|
|
/*!*******************************!*\
|
|
!*** ./src/lib/pocketbase.ts ***!
|
|
\*******************************/
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ pb: function() { return /* binding */ pb; }\n/* harmony export */ });\n/* harmony import */ var pocketbase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pocketbase */ \"(app-pages-browser)/./node_modules/pocketbase/dist/pocketbase.es.mjs\");\n/* __next_internal_client_entry_do_not_use__ pb auto */ \nvar _process_env_NEXT_PUBLIC_POCKETBASE_URL;\nconst pb = new pocketbase__WEBPACK_IMPORTED_MODULE_0__[\"default\"]((_process_env_NEXT_PUBLIC_POCKETBASE_URL = \"http://localhost:8090\") !== null && _process_env_NEXT_PUBLIC_POCKETBASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_POCKETBASE_URL : \"http://localhost:8090\");\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvcG9ja2V0YmFzZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozt3REFDbUM7SUFFRkM7QUFBMUIsTUFBTUMsS0FBSyxJQUFJRixrREFBVUEsQ0FBQ0MsQ0FBQUEsMENBQUFBLHVCQUFzQyxjQUF0Q0EscURBQUFBLDBDQUEwQyx5QkFBd0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL2xpYi9wb2NrZXRiYXNlLnRzP2U2NTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnXG5pbXBvcnQgUG9ja2V0QmFzZSBmcm9tICdwb2NrZXRiYXNlJ1xuXG5leHBvcnQgY29uc3QgcGIgPSBuZXcgUG9ja2V0QmFzZShwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19QT0NLRVRCQVNFX1VSTCA/PyAnaHR0cDovL2xvY2FsaG9zdDo4MDkwJylcbiJdLCJuYW1lcyI6WyJQb2NrZXRCYXNlIiwicHJvY2VzcyIsInBiIiwiZW52IiwiTkVYVF9QVUJMSUNfUE9DS0VUQkFTRV9VUkwiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/pocketbase.ts\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js":
|
|
/*!****************************************************************************************!*\
|
|
!*** ./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js ***!
|
|
\****************************************************************************************/
|
|
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("/**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nif (true) {\n (function() {\n'use strict';\n\nvar React = __webpack_require__(/*! next/dist/compiled/react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider'); // TODO: Delete with enableRenderableContext\n\nvar REACT_CONSUMER_TYPE = Symbol.for('react.consumer');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar REACT_CACHE_TYPE = Symbol.for('react.cache');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\nvar enableRenderableContext = false;\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false;\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n}\n\nvar REACT_CLIENT_REFERENCE$2 = Symbol.for('react.client.reference'); // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n if (typeof type === 'function') {\n if (type.$$typeof === REACT_CLIENT_REFERENCE$2) {\n // TODO: Create a convention for naming client references with debug info.\n return null;\n }\n\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n case REACT_CACHE_TYPE:\n {\n return 'Cache';\n }\n\n }\n\n if (typeof type === 'object') {\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n switch (type.$$typeof) {\n case REACT_PROVIDER_TYPE:\n {\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n }\n\n case REACT_CONTEXT_TYPE:\n var context = type;\n\n {\n return getContextName(context) + '.Consumer';\n }\n\n case REACT_CONSUMER_TYPE:\n {\n return null;\n }\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n }\n }\n\n return null;\n}\n\n// $FlowFixMe[method-unbinding]\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar assign = Object.assign;\n\n/*\n * The `'' + value` pattern (used in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe[incompatible-return] only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; // $FlowFixMe[incompatible-return]\n\n return type;\n }\n} // $FlowFixMe[incompatible-return] only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar REACT_CLIENT_REFERENCE$1 = Symbol.for('react.client.reference');\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || enableRenderableContext || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_CLIENT_REFERENCE$1 || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe[cannot-write] Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe[cannot-write] Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n/**\n * Leverages native browser/VM stack frames to get proper details (e.g.\n * filename, line + col number) for a single component in a component stack. We\n * do this by:\n * (1) throwing and catching an error in the function - this will be our\n * control error.\n * (2) calling the component which will eventually throw an error that we'll\n * catch - this will be our sample error.\n * (3) diffing the control and sample error stacks to find the stack frame\n * which represents our component.\n */\n\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if (!fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe[incompatible-type] It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n /**\n * Finding a common stack frame between sample and control errors can be\n * tricky given the different types and levels of stack trace truncation from\n * different JS VMs. So instead we'll attempt to control what that common\n * frame should be through this object method:\n * Having both the sample and control errors be in the function under the\n * `DescribeNativeComponentFrameRoot` property, + setting the `name` and\n * `displayName` properties of the function ensures that a stack\n * frame exists that has the method name `DescribeNativeComponentFrameRoot` in\n * it for both control and sample stacks.\n */\n\n\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n var control;\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe[prop-missing]\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n } // $FlowFixMe[prop-missing] found when upgrading Flow\n\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n } // TODO(luna): This will currently only throw if the function component\n // tries to access React/ReactDOM/props. We should probably make this throw\n // in simple components too\n\n\n var maybePromise = fn(); // If the function component returns a promise, it's likely an async\n // component, which we don't yet support. Attach a noop catch handler to\n // silence the error.\n // TODO: Implement component stacks for async client components?\n\n if (maybePromise && typeof maybePromise.catch === 'function') {\n maybePromise.catch(function () {});\n }\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n return [sample.stack, control.stack];\n }\n }\n\n return [null, null];\n }\n }; // $FlowFixMe[prop-missing]\n\n RunInRootFrame.DetermineComponentFrameRoot.displayName = 'DetermineComponentFrameRoot';\n var namePropDescriptor = Object.getOwnPropertyDescriptor(RunInRootFrame.DetermineComponentFrameRoot, 'name'); // Before ES6, the `name` property was not configurable.\n\n if (namePropDescriptor && namePropDescriptor.configurable) {\n // V8 utilizes a function's `name` property when generating a stack trace.\n Object.defineProperty(RunInRootFrame.DetermineComponentFrameRoot, // Configurable properties can be updated even if its writable descriptor\n // is set to `false`.\n // $FlowFixMe[cannot-write]\n 'name', {\n value: 'DetermineComponentFrameRoot'\n });\n }\n\n try {\n var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n\n if (sampleStack && controlStack) {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sampleStack.split('\\n');\n var controlLines = controlStack.split('\\n');\n var s = 0;\n var c = 0;\n\n while (s < sampleLines.length && !sampleLines[s].includes('DetermineComponentFrameRoot')) {\n s++;\n }\n\n while (c < controlLines.length && !controlLines[c].includes('DetermineComponentFrameRoot')) {\n c++;\n } // We couldn't find our intentionally injected common root frame, attempt\n // to find another common root frame by search from the bottom of the\n // control stack...\n\n\n if (s === sampleLines.length || c === controlLines.length) {\n s = sampleLines.length - 1;\n c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n if (true) {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\nvar REACT_CLIENT_REFERENCE = Symbol.for('react.client.reference');\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nfunction ReactElement(type, key, _ref, self, source, owner, props) {\n var ref;\n\n {\n ref = _ref;\n }\n\n var element;\n\n {\n // In prod, `ref` is a regular property. It will be removed in a\n // future release.\n element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n }\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // debugInfo contains Server Component debug information.\n\n Object.defineProperty(element, '_debugInfo', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: null\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n}\nvar didWarnAboutKeySpread = {};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV$1(type, config, maybeKey, isStaticChildren, source, self) {\n {\n if (!isValidElementType(type)) {\n // This is an invalid element type.\n //\n // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n } else {\n // This is a valid element type.\n // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing\n // errors. We don't want exception behavior to differ between dev and\n // prod. (Rendering will throw with a helpful message and as soon as the\n // type is fixed, the key warnings will appear.)\n var children = config.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n } // Warn about key spread regardless of whether the type is valid.\n\n\n if (hasOwnProperty.call(config, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n {\n ref = config.ref;\n }\n\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && // Skip over reserved prop names\n propName !== 'key' && (propName !== 'ref')) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n var element = ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n }\n\n return element;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner.current) {\n var name = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object' || !node) {\n return;\n }\n\n if (node.$$typeof === REACT_CLIENT_REFERENCE) ; else if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nvar ownerHasKeyUseWarning = {};\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement(null);\n }\n}\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = getComponentNameFromType(parentType);\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n // TODO: Move this to render phase instead of at element creation.\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement(null);\n }\n }\n}\n\nvar jsxDEV = jsxDEV$1 ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsxDEV = jsxDEV;\n })();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsSUFBSSxJQUFxQztBQUN6QztBQUNBOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxzR0FBMEI7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxlQUFlO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVIsa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDRCQUE0QjtBQUM1QjtBQUNBLHFDQUFxQzs7QUFFckMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBLHFFQUFxRTs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0dBQWtHOztBQUVsRztBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLGVBQWU7QUFDMUIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QUFXLGNBQWM7QUFDekI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpQkFBaUI7QUFDckM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQjtBQUNoQixjQUFjO0FBQ2QsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcz85NDQ4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZShcIm5leHQvZGlzdC9jb21waWxlZC9yZWFjdFwiKTtcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTsgLy8gVE9ETzogRGVsZXRlIHdpdGggZW5hYmxlUmVuZGVyYWJsZUNvbnRleHRcblxudmFyIFJFQUNUX0NPTlNVTUVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb25zdW1lcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG52YXIgZW5hYmxlUmVuZGVyYWJsZUNvbnRleHQgPSBmYWxzZTtcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbnZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFJDIgPSBTeW1ib2wuZm9yKCdyZWFjdC5jbGllbnQucmVmZXJlbmNlJyk7IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMikge1xuICAgICAgLy8gVE9ETzogQ3JlYXRlIGEgY29udmVudGlvbiBmb3IgbmFtaW5nIGNsaWVudCByZWZlcmVuY2VzIHdpdGggZGVidWcgaW5mby5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuICdDYWNoZSc7XG4gICAgICB9XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcblxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyAkRmxvd0ZpeE1lW21ldGhvZC11bmJpbmRpbmddXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl0gb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnOyAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG5cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxID0gU3ltYm9sLmZvcigncmVhY3QuY2xpZW50LnJlZmVyZW5jZScpO1xuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgZW5hYmxlUmVuZGVyYWJsZUNvbnRleHQgIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lW2Nhbm5vdC13cml0ZV0gRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cbi8qKlxuICogTGV2ZXJhZ2VzIG5hdGl2ZSBicm93c2VyL1ZNIHN0YWNrIGZyYW1lcyB0byBnZXQgcHJvcGVyIGRldGFpbHMgKGUuZy5cbiAqIGZpbGVuYW1lLCBsaW5lICsgY29sIG51bWJlcikgZm9yIGEgc2luZ2xlIGNvbXBvbmVudCBpbiBhIGNvbXBvbmVudCBzdGFjay4gV2VcbiAqIGRvIHRoaXMgYnk6XG4gKiAgICgxKSB0aHJvd2luZyBhbmQgY2F0Y2hpbmcgYW4gZXJyb3IgaW4gdGhlIGZ1bmN0aW9uIC0gdGhpcyB3aWxsIGJlIG91clxuICogICAgICAgY29udHJvbCBlcnJvci5cbiAqICAgKDIpIGNhbGxpbmcgdGhlIGNvbXBvbmVudCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgdGhyb3cgYW4gZXJyb3IgdGhhdCB3ZSdsbFxuICogICAgICAgY2F0Y2ggLSB0aGlzIHdpbGwgYmUgb3VyIHNhbXBsZSBlcnJvci5cbiAqICAgKDMpIGRpZmZpbmcgdGhlIGNvbnRyb2wgYW5kIHNhbXBsZSBlcnJvciBzdGFja3MgdG8gZmluZCB0aGUgc3RhY2sgZnJhbWVcbiAqICAgICAgIHdoaWNoIHJlcHJlc2VudHMgb3VyIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmRpbmcgYSBjb21tb24gc3RhY2sgZnJhbWUgYmV0d2VlbiBzYW1wbGUgYW5kIGNvbnRyb2wgZXJyb3JzIGNhbiBiZVxuICAgKiB0cmlja3kgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcyBhbmQgbGV2ZWxzIG9mIHN0YWNrIHRyYWNlIHRydW5jYXRpb24gZnJvbVxuICAgKiBkaWZmZXJlbnQgSlMgVk1zLiBTbyBpbnN0ZWFkIHdlJ2xsIGF0dGVtcHQgdG8gY29udHJvbCB3aGF0IHRoYXQgY29tbW9uXG4gICAqIGZyYW1lIHNob3VsZCBiZSB0aHJvdWdoIHRoaXMgb2JqZWN0IG1ldGhvZDpcbiAgICogSGF2aW5nIGJvdGggdGhlIHNhbXBsZSBhbmQgY29udHJvbCBlcnJvcnMgYmUgaW4gdGhlIGZ1bmN0aW9uIHVuZGVyIHRoZVxuICAgKiBgRGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZVJvb3RgIHByb3BlcnR5LCArIHNldHRpbmcgdGhlIGBuYW1lYCBhbmRcbiAgICogYGRpc3BsYXlOYW1lYCBwcm9wZXJ0aWVzIG9mIHRoZSBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYSBzdGFja1xuICAgKiBmcmFtZSBleGlzdHMgdGhhdCBoYXMgdGhlIG1ldGhvZCBuYW1lIGBEZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lUm9vdGAgaW5cbiAgICogaXQgZm9yIGJvdGggY29udHJvbCBhbmQgc2FtcGxlIHN0YWNrcy5cbiAgICovXG5cblxuICB2YXIgUnVuSW5Sb290RnJhbWUgPSB7XG4gICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY29udHJvbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgfTsgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG5cblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddIGZvdW5kIHdoZW4gdXBncmFkaW5nIEZsb3dcblxuXG4gICAgICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgICAgfSAvLyBUT0RPKGx1bmEpOiBUaGlzIHdpbGwgY3VycmVudGx5IG9ubHkgdGhyb3cgaWYgdGhlIGZ1bmN0aW9uIGNvbXBvbmVudFxuICAgICAgICAgIC8vIHRyaWVzIHRvIGFjY2VzcyBSZWFjdC9SZWFjdERPTS9wcm9wcy4gV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyB0aHJvd1xuICAgICAgICAgIC8vIGluIHNpbXBsZSBjb21wb25lbnRzIHRvb1xuXG5cbiAgICAgICAgICB2YXIgbWF5YmVQcm9taXNlID0gZm4oKTsgLy8gSWYgdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCByZXR1cm5zIGEgcHJvbWlzZSwgaXQncyBsaWtlbHkgYW4gYXN5bmNcbiAgICAgICAgICAvLyBjb21wb25lbnQsIHdoaWNoIHdlIGRvbid0IHlldCBzdXBwb3J0LiBBdHRhY2ggYSBub29wIGNhdGNoIGhhbmRsZXIgdG9cbiAgICAgICAgICAvLyBzaWxlbmNlIHRoZSBlcnJvci5cbiAgICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgY29tcG9uZW50IHN0YWNrcyBmb3IgYXN5bmMgY2xpZW50IGNvbXBvbmVudHM/XG5cbiAgICAgICAgICBpZiAobWF5YmVQcm9taXNlICYmIHR5cGVvZiBtYXliZVByb21pc2UuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG1heWJlUHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIFtzYW1wbGUuc3RhY2ssIGNvbnRyb2wuc3RhY2tdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgfVxuICB9OyAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cblxuICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QuZGlzcGxheU5hbWUgPSAnRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290JztcbiAgdmFyIG5hbWVQcm9wRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LCAnbmFtZScpOyAvLyBCZWZvcmUgRVM2LCB0aGUgYG5hbWVgIHByb3BlcnR5IHdhcyBub3QgY29uZmlndXJhYmxlLlxuXG4gIGlmIChuYW1lUHJvcERlc2NyaXB0b3IgJiYgbmFtZVByb3BEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgIC8vIFY4IHV0aWxpemVzIGEgZnVuY3Rpb24ncyBgbmFtZWAgcHJvcGVydHkgd2hlbiBnZW5lcmF0aW5nIGEgc3RhY2sgdHJhY2UuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCwgLy8gQ29uZmlndXJhYmxlIHByb3BlcnRpZXMgY2FuIGJlIHVwZGF0ZWQgZXZlbiBpZiBpdHMgd3JpdGFibGUgZGVzY3JpcHRvclxuICAgIC8vIGlzIHNldCB0byBgZmFsc2VgLlxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuICAgICduYW1lJywge1xuICAgICAgdmFsdWU6ICdEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QnXG4gICAgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIHZhciBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QoKSxcbiAgICAgICAgc2FtcGxlU3RhY2sgPSBfUnVuSW5Sb290RnJhbWUkRGV0ZXJbMF0sXG4gICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcblxuICAgIGlmIChzYW1wbGVTdGFjayAmJiBjb250cm9sU3RhY2spIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sU3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSAwO1xuICAgICAgdmFyIGMgPSAwO1xuXG4gICAgICB3aGlsZSAocyA8IHNhbXBsZUxpbmVzLmxlbmd0aCAmJiAhc2FtcGxlTGluZXNbc10uaW5jbHVkZXMoJ0RldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCcpKSB7XG4gICAgICAgIHMrKztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGMgPCBjb250cm9sTGluZXMubGVuZ3RoICYmICFjb250cm9sTGluZXNbY10uaW5jbHVkZXMoJ0RldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCcpKSB7XG4gICAgICAgIGMrKztcbiAgICAgIH0gLy8gV2UgY291bGRuJ3QgZmluZCBvdXIgaW50ZW50aW9uYWxseSBpbmplY3RlZCBjb21tb24gcm9vdCBmcmFtZSwgYXR0ZW1wdFxuICAgICAgLy8gdG8gZmluZCBhbm90aGVyIGNvbW1vbiByb290IGZyYW1lIGJ5IHNlYXJjaCBmcm9tIHRoZSBib3R0b20gb2YgdGhlXG4gICAgICAvLyBjb250cm9sIHN0YWNrLi4uXG5cblxuICAgICAgaWYgKHMgPT09IHNhbXBsZUxpbmVzLmxlbmd0aCB8fCBjID09PSBjb250cm9sTGluZXMubGVuZ3RoKSB7XG4gICAgICAgIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgICBjLS07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QuY2xpZW50LnJlZmVyZW5jZScpO1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xudmFyIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB7XG4gICAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxuZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgX3JlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIHJlZjtcblxuICB7XG4gICAgcmVmID0gX3JlZjtcbiAgfVxuXG4gIHZhciBlbGVtZW50O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kLCBgcmVmYCBpcyBhIHJlZ3VsYXIgcHJvcGVydHkuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhXG4gICAgLy8gZnV0dXJlIHJlbGVhc2UuXG4gICAgZWxlbWVudCA9IHtcbiAgICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBrZXk6IGtleSxcbiAgICAgIHJlZjogcmVmLFxuICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICAgIF9vd25lcjogb3duZXJcbiAgICB9O1xuICB9XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBkZWJ1Z0luZm8gY29udGFpbnMgU2VydmVyIENvbXBvbmVudCBkZWJ1ZyBpbmZvcm1hdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX2RlYnVnSW5mbycsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG51bGxcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBkaWRXYXJuQWJvdXRLZXlTcHJlYWQgPSB7fTtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmZjcy9wdWxsLzEwN1xuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuXG5mdW5jdGlvbiBqc3hERVYkMSh0eXBlLCBjb25maWcsIG1heWJlS2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGludmFsaWQgZWxlbWVudCB0eXBlLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCdSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYSB2YWxpZCBlbGVtZW50IHR5cGUuXG4gICAgICAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9ycy4gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZFxuICAgICAgLy8gcHJvZC4gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlXG4gICAgICAvLyB0eXBlIGlzIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcbiAgICAgIHZhciBjaGlsZHJlbiA9IGNvbmZpZy5jaGlsZHJlbjtcblxuICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW5baV0sIHR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuICcgKyAnWW91IGFyZSBsaWtlbHkgZXhwbGljaXRseSBjYWxsaW5nIFJlYWN0LmpzeHMgb3IgUmVhY3QuanN4REVWLiAnICsgJ1VzZSB0aGUgQmFiZWwgdHJhbnNmb3JtIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuLCB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gV2FybiBhYm91dCBrZXkgc3ByZWFkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdHlwZSBpcyB2YWxpZC5cblxuXG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gayAhPT0gJ2tleSc7XG4gICAgICB9KTtcbiAgICAgIHZhciBiZWZvcmVFeGFtcGxlID0ga2V5cy5sZW5ndGggPiAwID8gJ3trZXk6IHNvbWVLZXksICcgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3trZXk6IHNvbWVLZXl9JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY29tcG9uZW50TmFtZSArIGJlZm9yZUV4YW1wbGVdKSB7XG4gICAgICAgIHZhciBhZnRlckV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAneycgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3t9JztcblxuICAgICAgICBlcnJvcignQSBwcm9wcyBvYmplY3QgY29udGFpbmluZyBhIFwia2V5XCIgcHJvcCBpcyBiZWluZyBzcHJlYWQgaW50byBKU1g6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMgey4uLnByb3BzfSAvPlxcbicgKyAnUmVhY3Qga2V5cyBtdXN0IGJlIHBhc3NlZCBkaXJlY3RseSB0byBKU1ggd2l0aG91dCB1c2luZyBzcHJlYWQ6XFxuJyArICcgIGxldCBwcm9wcyA9ICVzO1xcbicgKyAnICA8JXMga2V5PXtzb21lS2V5fSB7Li4ucHJvcHN9IC8+JywgYmVmb3JlRXhhbXBsZSwgY29tcG9uZW50TmFtZSwgYWZ0ZXJFeGFtcGxlLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY29tcG9uZW50TmFtZSArIGJlZm9yZUV4YW1wbGVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHZhciBrZXkgPSBudWxsO1xuICAgIHZhciByZWYgPSBudWxsOyAvLyBDdXJyZW50bHksIGtleSBjYW4gYmUgc3ByZWFkIGluIGFzIGEgcHJvcC4gVGhpcyBjYXVzZXMgYSBwb3RlbnRpYWxcbiAgICAvLyBpc3N1ZSBpZiBrZXkgaXMgYWxzbyBleHBsaWNpdGx5IGRlY2xhcmVkIChpZS4gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz5cbiAgICAvLyBvciA8ZGl2IGtleT1cIkhpXCIgey4uLnByb3BzfSAvPiApLiBXZSB3YW50IHRvIGRlcHJlY2F0ZSBrZXkgc3ByZWFkLFxuICAgIC8vIGJ1dCBhcyBhbiBpbnRlcm1lZGlhcnkgc3RlcCwgd2Ugd2lsbCB1c2UganN4REVWIGZvciBldmVyeXRoaW5nIGV4Y2VwdFxuICAgIC8vIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+LCBiZWNhdXNlIHdlIGFyZW4ndCBjdXJyZW50bHkgYWJsZSB0byB0ZWxsIGlmXG4gICAgLy8ga2V5IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdG8gYmUgdW5kZWZpbmVkIG9yIG5vdC5cblxuICAgIGlmIChtYXliZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWF5YmVLZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIG1heWJlS2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgfVxuXG4gICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnLCBzZWxmKTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmIC8vIFNraXAgb3ZlciByZXNlcnZlZCBwcm9wIG5hbWVzXG4gICAgICBwcm9wTmFtZSAhPT0gJ2tleScgJiYgKHByb3BOYW1lICE9PSAncmVmJykpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xuXG4gICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHtcbiAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8ICFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UpIDsgZWxzZSBpZiAoaXNBcnJheShub2RlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAge1xuICAgIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHZhciBwYXJlbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHBhcmVudFR5cGUpO1xuXG4gICAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcmVuZGVyIHBoYXNlIGluc3RlYWQgb2YgYXQgZWxlbWVudCBjcmVhdGlvbi5cbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIganN4REVWID0ganN4REVWJDEgO1xuXG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuanN4REVWID0ganN4REVWO1xuICB9KSgpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js":
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/next/dist/compiled/react/jsx-dev-runtime.js ***!
|
|
\******************************************************************/
|
|
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("\n\nif (false) {} else {\n module.exports = __webpack_require__(/*! ./cjs/react-jsx-dev-runtime.development.js */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvanN4LWRldi1ydW50aW1lLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQyxDQUFDO0FBQ0YsRUFBRSw4TEFBc0U7QUFDeEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jb21waWxlZC9yZWFjdC9qc3gtZGV2LXJ1bnRpbWUuanM/OTU0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\n"));
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(app-pages-browser)/./node_modules/pocketbase/dist/pocketbase.es.mjs":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/pocketbase/dist/pocketbase.es.mjs ***!
|
|
\********************************************************/
|
|
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AdminService: function() { return /* binding */ AdminService; },\n/* harmony export */ AsyncAuthStore: function() { return /* binding */ AsyncAuthStore; },\n/* harmony export */ BaseAuthStore: function() { return /* binding */ BaseAuthStore; },\n/* harmony export */ ClientResponseError: function() { return /* binding */ ClientResponseError; },\n/* harmony export */ CollectionService: function() { return /* binding */ CollectionService; },\n/* harmony export */ CrudService: function() { return /* binding */ CrudService; },\n/* harmony export */ HealthService: function() { return /* binding */ HealthService; },\n/* harmony export */ LocalAuthStore: function() { return /* binding */ LocalAuthStore; },\n/* harmony export */ LogService: function() { return /* binding */ LogService; },\n/* harmony export */ RealtimeService: function() { return /* binding */ RealtimeService; },\n/* harmony export */ RecordService: function() { return /* binding */ RecordService; },\n/* harmony export */ cookieParse: function() { return /* binding */ cookieParse; },\n/* harmony export */ cookieSerialize: function() { return /* binding */ cookieSerialize; },\n/* harmony export */ \"default\": function() { return /* binding */ Client; },\n/* harmony export */ getTokenPayload: function() { return /* binding */ getTokenPayload; },\n/* harmony export */ isTokenExpired: function() { return /* binding */ isTokenExpired; },\n/* harmony export */ normalizeUnknownQueryParams: function() { return /* binding */ normalizeUnknownQueryParams; }\n/* harmony export */ });\nclass ClientResponseError extends Error{constructor(e){super(\"ClientResponseError\"),this.url=\"\",this.status=0,this.response={},this.isAbort=!1,this.originalError=null,Object.setPrototypeOf(this,ClientResponseError.prototype),null!==e&&\"object\"==typeof e&&(this.url=\"string\"==typeof e.url?e.url:\"\",this.status=\"number\"==typeof e.status?e.status:0,this.isAbort=!!e.isAbort,this.originalError=e.originalError,null!==e.response&&\"object\"==typeof e.response?this.response=e.response:null!==e.data&&\"object\"==typeof e.data?this.response=e.data:this.response={}),this.originalError||e instanceof ClientResponseError||(this.originalError=e),\"undefined\"!=typeof DOMException&&e instanceof DOMException&&(this.isAbort=!0),this.name=\"ClientResponseError \"+this.status,this.message=this.response?.message,this.message||(this.isAbort?this.message=\"The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.\":this.originalError?.cause?.message?.includes(\"ECONNREFUSED ::1\")?this.message=\"Failed to connect to the PocketBase server. Try changing the SDK URL from localhost to 127.0.0.1 (https://github.com/pocketbase/js-sdk/issues/21).\":this.message=\"Something went wrong while processing your request.\")}get data(){return this.response}toJSON(){return{...this}}}const e=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;function cookieParse(e,t){const s={};if(\"string\"!=typeof e)return s;const i=Object.assign({},t||{}).decode||defaultDecode;let n=0;for(;n<e.length;){const t=e.indexOf(\"=\",n);if(-1===t)break;let r=e.indexOf(\";\",n);if(-1===r)r=e.length;else if(r<t){n=e.lastIndexOf(\";\",t-1)+1;continue}const o=e.slice(n,t).trim();if(void 0===s[o]){let n=e.slice(t+1,r).trim();34===n.charCodeAt(0)&&(n=n.slice(1,-1));try{s[o]=i(n)}catch(e){s[o]=n}}n=r+1}return s}function cookieSerialize(t,s,i){const n=Object.assign({},i||{}),r=n.encode||defaultEncode;if(!e.test(t))throw new TypeError(\"argument name is invalid\");const o=r(s);if(o&&!e.test(o))throw new TypeError(\"argument val is invalid\");let a=t+\"=\"+o;if(null!=n.maxAge){const e=n.maxAge-0;if(isNaN(e)||!isFinite(e))throw new TypeError(\"option maxAge is invalid\");a+=\"; Max-Age=\"+Math.floor(e)}if(n.domain){if(!e.test(n.domain))throw new TypeError(\"option domain is invalid\");a+=\"; Domain=\"+n.domain}if(n.path){if(!e.test(n.path))throw new TypeError(\"option path is invalid\");a+=\"; Path=\"+n.path}if(n.expires){if(!function isDate(e){return\"[object Date]\"===Object.prototype.toString.call(e)||e instanceof Date}(n.expires)||isNaN(n.expires.valueOf()))throw new TypeError(\"option expires is invalid\");a+=\"; Expires=\"+n.expires.toUTCString()}if(n.httpOnly&&(a+=\"; HttpOnly\"),n.secure&&(a+=\"; Secure\"),n.priority){switch(\"string\"==typeof n.priority?n.priority.toLowerCase():n.priority){case\"low\":a+=\"; Priority=Low\";break;case\"medium\":a+=\"; Priority=Medium\";break;case\"high\":a+=\"; Priority=High\";break;default:throw new TypeError(\"option priority is invalid\")}}if(n.sameSite){switch(\"string\"==typeof n.sameSite?n.sameSite.toLowerCase():n.sameSite){case!0:a+=\"; SameSite=Strict\";break;case\"lax\":a+=\"; SameSite=Lax\";break;case\"strict\":a+=\"; SameSite=Strict\";break;case\"none\":a+=\"; SameSite=None\";break;default:throw new TypeError(\"option sameSite is invalid\")}}return a}function defaultDecode(e){return-1!==e.indexOf(\"%\")?decodeURIComponent(e):e}function defaultEncode(e){return encodeURIComponent(e)}const t=\"undefined\"!=typeof navigator&&\"ReactNative\"===navigator.product||\"undefined\"!=typeof global&&global.HermesInternal;let s;function getTokenPayload(e){if(e)try{const t=decodeURIComponent(s(e.split(\".\")[1]).split(\"\").map((function(e){return\"%\"+(\"00\"+e.charCodeAt(0).toString(16)).slice(-2)})).join(\"\"));return JSON.parse(t)||{}}catch(e){}return{}}function isTokenExpired(e,t=0){let s=getTokenPayload(e);return!(Object.keys(s).length>0&&(!s.exp||s.exp-t>Date.now()/1e3))}s=\"function\"!=typeof atob||t?e=>{let t=String(e).replace(/=+$/,\"\");if(t.length%4==1)throw new Error(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var s,i,n=0,r=0,o=\"\";i=t.charAt(r++);~i&&(s=n%4?64*s+i:i,n++%4)?o+=String.fromCharCode(255&s>>(-2*n&6)):0)i=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(i);return o}:atob;const i=\"pb_auth\";class BaseAuthStore{constructor(){this.baseToken=\"\",this.baseModel=null,this._onChangeCallbacks=[]}get token(){return this.baseToken}get model(){return this.baseModel}get isValid(){return!isTokenExpired(this.token)}get isAdmin(){return\"admin\"===getTokenPayload(this.token).type}get isAuthRecord(){return\"authRecord\"===getTokenPayload(this.token).type}save(e,t){this.baseToken=e||\"\",this.baseModel=t||null,this.triggerChange()}clear(){this.baseToken=\"\",this.baseModel=null,this.triggerChange()}loadFromCookie(e,t=i){const s=cookieParse(e||\"\")[t]||\"\";let n={};try{n=JSON.parse(s),(null===typeof n||\"object\"!=typeof n||Array.isArray(n))&&(n={})}catch(e){}this.save(n.token||\"\",n.model||null)}exportToCookie(e,t=i){const s={secure:!0,sameSite:!0,httpOnly:!0,path:\"/\"},n=getTokenPayload(this.token);s.expires=n?.exp?new Date(1e3*n.exp):new Date(\"1970-01-01\"),e=Object.assign({},s,e);const r={token:this.token,model:this.model?JSON.parse(JSON.stringify(this.model)):null};let o=cookieSerialize(t,JSON.stringify(r),e);const a=\"undefined\"!=typeof Blob?new Blob([o]).size:o.length;if(r.model&&a>4096){r.model={id:r?.model?.id,email:r?.model?.email};const s=[\"collectionId\",\"username\",\"verified\"];for(const e in this.model)s.includes(e)&&(r.model[e]=this.model[e]);o=cookieSerialize(t,JSON.stringify(r),e)}return o}onChange(e,t=!1){return this._onChangeCallbacks.push(e),t&&e(this.token,this.model),()=>{for(let t=this._onChangeCallbacks.length-1;t>=0;t--)if(this._onChangeCallbacks[t]==e)return delete this._onChangeCallbacks[t],void this._onChangeCallbacks.splice(t,1)}}triggerChange(){for(const e of this._onChangeCallbacks)e&&e(this.token,this.model)}}class LocalAuthStore extends BaseAuthStore{constructor(e=\"pocketbase_auth\"){super(),this.storageFallback={},this.storageKey=e,this._bindStorageEvent()}get token(){return(this._storageGet(this.storageKey)||{}).token||\"\"}get model(){return(this._storageGet(this.storageKey)||{}).model||null}save(e,t){this._storageSet(this.storageKey,{token:e,model:t}),super.save(e,t)}clear(){this._storageRemove(this.storageKey),super.clear()}_storageGet(e){if(\"undefined\"!=typeof window&&window?.localStorage){const t=window.localStorage.getItem(e)||\"\";try{return JSON.parse(t)}catch(e){return t}}return this.storageFallback[e]}_storageSet(e,t){if(\"undefined\"!=typeof window&&window?.localStorage){let s=t;\"string\"!=typeof t&&(s=JSON.stringify(t)),window.localStorage.setItem(e,s)}else this.storageFallback[e]=t}_storageRemove(e){\"undefined\"!=typeof window&&window?.localStorage&&window.localStorage?.removeItem(e),delete this.storageFallback[e]}_bindStorageEvent(){\"undefined\"!=typeof window&&window?.localStorage&&window.addEventListener&&window.addEventListener(\"storage\",(e=>{if(e.key!=this.storageKey)return;const t=this._storageGet(this.storageKey)||{};super.save(t.token||\"\",t.model||null)}))}}class BaseService{constructor(e){this.client=e}}class SettingsService extends BaseService{async getAll(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/settings\",e)}async update(e,t){return t=Object.assign({method:\"PATCH\",body:e},t),this.client.send(\"/api/settings\",t)}async testS3(e=\"storage\",t){return t=Object.assign({method:\"POST\",body:{filesystem:e}},t),this.client.send(\"/api/settings/test/s3\",t).then((()=>!0))}async testEmail(e,t,s){return s=Object.assign({method:\"POST\",body:{email:e,template:t}},s),this.client.send(\"/api/settings/test/email\",s).then((()=>!0))}async generateAppleClientSecret(e,t,s,i,n,r){return r=Object.assign({method:\"POST\",body:{clientId:e,teamId:t,keyId:s,privateKey:i,duration:n}},r),this.client.send(\"/api/settings/apple/generate-client-secret\",r)}}class CrudService extends BaseService{decode(e){return e}async getFullList(e,t){if(\"number\"==typeof e)return this._getFullList(e,t);let s=500;return(t=Object.assign({},e,t)).batch&&(s=t.batch,delete t.batch),this._getFullList(s,t)}async getList(e=1,t=30,s){return(s=Object.assign({method:\"GET\"},s)).query=Object.assign({page:e,perPage:t},s.query),this.client.send(this.baseCrudPath,s).then((e=>(e.items=e.items?.map((e=>this.decode(e)))||[],e)))}async getFirstListItem(e,t){return(t=Object.assign({requestKey:\"one_by_filter_\"+this.baseCrudPath+\"_\"+e},t)).query=Object.assign({filter:e,skipTotal:1},t.query),this.getList(1,1,t).then((e=>{if(!e?.items?.length)throw new ClientResponseError({status:404,response:{code:404,message:\"The requested resource wasn't found.\",data:{}}});return e.items[0]}))}async getOne(e,t){if(!e)throw new ClientResponseError({url:this.client.buildUrl(this.baseCrudPath+\"/\"),status:404,response:{code:404,message:\"Missing required record id.\",data:{}}});return t=Object.assign({method:\"GET\"},t),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e),t).then((e=>this.decode(e)))}async create(e,t){return t=Object.assign({method:\"POST\",body:e},t),this.client.send(this.baseCrudPath,t).then((e=>this.decode(e)))}async update(e,t,s){return s=Object.assign({method:\"PATCH\",body:t},s),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e),s).then((e=>this.decode(e)))}async delete(e,t){return t=Object.assign({method:\"DELETE\"},t),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e),t).then((()=>!0))}_getFullList(e=500,t){(t=t||{}).query=Object.assign({skipTotal:1},t.query);let s=[],request=async i=>this.getList(i,e||500,t).then((e=>{const t=e.items;return s=s.concat(t),t.length==e.perPage?request(i+1):s}));return request(1)}}function normalizeLegacyOptionsArgs(e,t,s,i){const n=void 0!==i;return n||void 0!==s?n?(console.warn(e),t.body=Object.assign({},t.body,s),t.query=Object.assign({},t.query,i),t):Object.assign(t,s):t}function resetAutoRefresh(e){e._resetAutoRefresh?.()}class AdminService extends CrudService{get baseCrudPath(){return\"/api/admins\"}async update(e,t,s){return super.update(e,t,s).then((e=>(this.client.authStore.model?.id===e.id&&void 0===this.client.authStore.model?.collectionId&&this.client.authStore.save(this.client.authStore.token,e),e)))}async delete(e,t){return super.delete(e,t).then((t=>(t&&this.client.authStore.model?.id===e&&void 0===this.client.authStore.model?.collectionId&&this.client.authStore.clear(),t)))}authResponse(e){const t=this.decode(e?.admin||{});return e?.token&&e?.admin&&this.client.authStore.save(e.token,t),Object.assign({},e,{token:e?.token||\"\",admin:t})}async authWithPassword(e,t,s,i){let n={method:\"POST\",body:{identity:e,password:t}};n=normalizeLegacyOptionsArgs(\"This form of authWithPassword(email, pass, body?, query?) is deprecated. Consider replacing it with authWithPassword(email, pass, options?).\",n,s,i);const r=n.autoRefreshThreshold;delete n.autoRefreshThreshold,n.autoRefresh||resetAutoRefresh(this.client);let o=await this.client.send(this.baseCrudPath+\"/auth-with-password\",n);return o=this.authResponse(o),r&&function registerAutoRefresh(e,t,s,i){resetAutoRefresh(e);const n=e.beforeSend,r=e.authStore.model,o=e.authStore.onChange(((t,s)=>{(!t||s?.id!=r?.id||(s?.collectionId||r?.collectionId)&&s?.collectionId!=r?.collectionId)&&resetAutoRefresh(e)}));e._resetAutoRefresh=function(){o(),e.beforeSend=n,delete e._resetAutoRefresh},e.beforeSend=async(r,o)=>{const a=e.authStore.token;if(o.query?.autoRefresh)return n?n(r,o):{url:r,sendOptions:o};let c=e.authStore.isValid;if(c&&isTokenExpired(e.authStore.token,t))try{await s()}catch(e){c=!1}c||await i();const l=o.headers||{};for(let t in l)if(\"authorization\"==t.toLowerCase()&&a==l[t]&&e.authStore.token){l[t]=e.authStore.token;break}return o.headers=l,n?n(r,o):{url:r,sendOptions:o}}}(this.client,r,(()=>this.authRefresh({autoRefresh:!0})),(()=>this.authWithPassword(e,t,Object.assign({autoRefresh:!0},n)))),o}async authRefresh(e,t){let s={method:\"POST\"};return s=normalizeLegacyOptionsArgs(\"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",s,e,t),this.client.send(this.baseCrudPath+\"/auth-refresh\",s).then(this.authResponse.bind(this))}async requestPasswordReset(e,t,s){let i={method:\"POST\",body:{email:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",i,t,s),this.client.send(this.baseCrudPath+\"/request-password-reset\",i).then((()=>!0))}async confirmPasswordReset(e,t,s,i,n){let r={method:\"POST\",body:{token:e,password:t,passwordConfirm:s}};return r=normalizeLegacyOptionsArgs(\"This form of confirmPasswordReset(resetToken, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(resetToken, password, passwordConfirm, options?).\",r,i,n),this.client.send(this.baseCrudPath+\"/confirm-password-reset\",r).then((()=>!0))}}const n=[\"requestKey\",\"$cancelKey\",\"$autoCancel\",\"fetch\",\"headers\",\"body\",\"query\",\"params\",\"cache\",\"credentials\",\"headers\",\"integrity\",\"keepalive\",\"method\",\"mode\",\"redirect\",\"referrer\",\"referrerPolicy\",\"signal\",\"window\"];function normalizeUnknownQueryParams(e){if(e){e.query=e.query||{};for(let t in e)n.includes(t)||(e.query[t]=e[t],delete e[t])}}class RealtimeService extends BaseService{constructor(){super(...arguments),this.clientId=\"\",this.eventSource=null,this.subscriptions={},this.lastSentSubscriptions=[],this.maxConnectTimeout=15e3,this.reconnectAttempts=0,this.maxReconnectAttempts=1/0,this.predefinedReconnectIntervals=[200,300,500,1e3,1200,1500,2e3],this.pendingConnects=[]}get isConnected(){return!!this.eventSource&&!!this.clientId&&!this.pendingConnects.length}async subscribe(e,t,s){if(!e)throw new Error(\"topic must be set.\");let i=e;if(s){normalizeUnknownQueryParams(s=Object.assign({},s));const e=\"options=\"+encodeURIComponent(JSON.stringify({query:s.query,headers:s.headers}));i+=(i.includes(\"?\")?\"&\":\"?\")+e}const listener=function(e){const s=e;let i;try{i=JSON.parse(s?.data)}catch{}t(i||{})};return this.subscriptions[i]||(this.subscriptions[i]=[]),this.subscriptions[i].push(listener),this.isConnected?1===this.subscriptions[i].length?await this.submitSubscriptions():this.eventSource?.addEventListener(i,listener):await this.connect(),async()=>this.unsubscribeByTopicAndListener(e,listener)}async unsubscribe(e){let t=!1;if(e){const s=this.getSubscriptionsByTopic(e);for(let e in s)if(this.hasSubscriptionListeners(e)){for(let t of this.subscriptions[e])this.eventSource?.removeEventListener(e,t);delete this.subscriptions[e],t||(t=!0)}}else this.subscriptions={};this.hasSubscriptionListeners()?t&&await this.submitSubscriptions():this.disconnect()}async unsubscribeByPrefix(e){let t=!1;for(let s in this.subscriptions)if((s+\"?\").startsWith(e)){t=!0;for(let e of this.subscriptions[s])this.eventSource?.removeEventListener(s,e);delete this.subscriptions[s]}t&&(this.hasSubscriptionListeners()?await this.submitSubscriptions():this.disconnect())}async unsubscribeByTopicAndListener(e,t){let s=!1;const i=this.getSubscriptionsByTopic(e);for(let e in i){if(!Array.isArray(this.subscriptions[e])||!this.subscriptions[e].length)continue;let i=!1;for(let s=this.subscriptions[e].length-1;s>=0;s--)this.subscriptions[e][s]===t&&(i=!0,delete this.subscriptions[e][s],this.subscriptions[e].splice(s,1),this.eventSource?.removeEventListener(e,t));i&&(this.subscriptions[e].length||delete this.subscriptions[e],s||this.hasSubscriptionListeners(e)||(s=!0))}this.hasSubscriptionListeners()?s&&await this.submitSubscriptions():this.disconnect()}hasSubscriptionListeners(e){if(this.subscriptions=this.subscriptions||{},e)return!!this.subscriptions[e]?.length;for(let e in this.subscriptions)if(this.subscriptions[e]?.length)return!0;return!1}async submitSubscriptions(){if(this.clientId)return this.addAllSubscriptionListeners(),this.lastSentSubscriptions=this.getNonEmptySubscriptionKeys(),this.client.send(\"/api/realtime\",{method:\"POST\",body:{clientId:this.clientId,subscriptions:this.lastSentSubscriptions},requestKey:this.getSubscriptionsCancelKey()}).catch((e=>{if(!e?.isAbort)throw e}))}getSubscriptionsCancelKey(){return\"realtime_\"+this.clientId}getSubscriptionsByTopic(e){const t={};e=e.includes(\"?\")?e:e+\"?\";for(let s in this.subscriptions)(s+\"?\").startsWith(e)&&(t[s]=this.subscriptions[s]);return t}getNonEmptySubscriptionKeys(){const e=[];for(let t in this.subscriptions)this.subscriptions[t].length&&e.push(t);return e}addAllSubscriptionListeners(){if(this.eventSource){this.removeAllSubscriptionListeners();for(let e in this.subscriptions)for(let t of this.subscriptions[e])this.eventSource.addEventListener(e,t)}}removeAllSubscriptionListeners(){if(this.eventSource)for(let e in this.subscriptions)for(let t of this.subscriptions[e])this.eventSource.removeEventListener(e,t)}async connect(){if(!(this.reconnectAttempts>0))return new Promise(((e,t)=>{this.pendingConnects.push({resolve:e,reject:t}),this.pendingConnects.length>1||this.initConnect()}))}initConnect(){this.disconnect(!0),clearTimeout(this.connectTimeoutId),this.connectTimeoutId=setTimeout((()=>{this.connectErrorHandler(new Error(\"EventSource connect took too long.\"))}),this.maxConnectTimeout),this.eventSource=new EventSource(this.client.buildUrl(\"/api/realtime\")),this.eventSource.onerror=e=>{this.connectErrorHandler(new Error(\"Failed to establish realtime connection.\"))},this.eventSource.addEventListener(\"PB_CONNECT\",(e=>{const t=e;this.clientId=t?.lastEventId,this.submitSubscriptions().then((async()=>{let e=3;for(;this.hasUnsentSubscriptions()&&e>0;)e--,await this.submitSubscriptions()})).then((()=>{for(let e of this.pendingConnects)e.resolve();this.pendingConnects=[],this.reconnectAttempts=0,clearTimeout(this.reconnectTimeoutId),clearTimeout(this.connectTimeoutId);const t=this.getSubscriptionsByTopic(\"PB_CONNECT\");for(let s in t)for(let i of t[s])i(e)})).catch((e=>{this.clientId=\"\",this.connectErrorHandler(e)}))}))}hasUnsentSubscriptions(){const e=this.getNonEmptySubscriptionKeys();if(e.length!=this.lastSentSubscriptions.length)return!0;for(const t of e)if(!this.lastSentSubscriptions.includes(t))return!0;return!1}connectErrorHandler(e){if(clearTimeout(this.connectTimeoutId),clearTimeout(this.reconnectTimeoutId),!this.clientId&&!this.reconnectAttempts||this.reconnectAttempts>this.maxReconnectAttempts){for(let t of this.pendingConnects)t.reject(new ClientResponseError(e));return this.pendingConnects=[],void this.disconnect()}this.disconnect(!0);const t=this.predefinedReconnectIntervals[this.reconnectAttempts]||this.predefinedReconnectIntervals[this.predefinedReconnectIntervals.length-1];this.reconnectAttempts++,this.reconnectTimeoutId=setTimeout((()=>{this.initConnect()}),t)}disconnect(e=!1){if(clearTimeout(this.connectTimeoutId),clearTimeout(this.reconnectTimeoutId),this.removeAllSubscriptionListeners(),this.client.cancelRequest(this.getSubscriptionsCancelKey()),this.eventSource?.close(),this.eventSource=null,this.clientId=\"\",!e){this.reconnectAttempts=0;for(let e of this.pendingConnects)e.resolve();this.pendingConnects=[]}}}class RecordService extends CrudService{constructor(e,t){super(e),this.collectionIdOrName=t}get baseCrudPath(){return this.baseCollectionPath+\"/records\"}get baseCollectionPath(){return\"/api/collections/\"+encodeURIComponent(this.collectionIdOrName)}async subscribe(e,t,s){if(!e)throw new Error(\"Missing topic.\");if(!t)throw new Error(\"Missing subscription callback.\");return this.client.realtime.subscribe(this.collectionIdOrName+\"/\"+e,t,s)}async unsubscribe(e){return e?this.client.realtime.unsubscribe(this.collectionIdOrName+\"/\"+e):this.client.realtime.unsubscribeByPrefix(this.collectionIdOrName)}async getFullList(e,t){if(\"number\"==typeof e)return super.getFullList(e,t);const s=Object.assign({},e,t);return super.getFullList(s)}async getList(e=1,t=30,s){return super.getList(e,t,s)}async getFirstListItem(e,t){return super.getFirstListItem(e,t)}async getOne(e,t){return super.getOne(e,t)}async create(e,t){return super.create(e,t)}async update(e,t,s){return super.update(e,t,s).then((e=>(this.client.authStore.model?.id!==e?.id||this.client.authStore.model?.collectionId!==this.collectionIdOrName&&this.client.authStore.model?.collectionName!==this.collectionIdOrName||this.client.authStore.save(this.client.authStore.token,e),e)))}async delete(e,t){return super.delete(e,t).then((t=>(!t||this.client.authStore.model?.id!==e||this.client.authStore.model?.collectionId!==this.collectionIdOrName&&this.client.authStore.model?.collectionName!==this.collectionIdOrName||this.client.authStore.clear(),t)))}authResponse(e){const t=this.decode(e?.record||{});return this.client.authStore.save(e?.token,t),Object.assign({},e,{token:e?.token||\"\",record:t})}async listAuthMethods(e){return e=Object.assign({method:\"GET\"},e),this.client.send(this.baseCollectionPath+\"/auth-methods\",e).then((e=>Object.assign({},e,{usernamePassword:!!e?.usernamePassword,emailPassword:!!e?.emailPassword,authProviders:Array.isArray(e?.authProviders)?e?.authProviders:[]})))}async authWithPassword(e,t,s,i){let n={method:\"POST\",body:{identity:e,password:t}};return n=normalizeLegacyOptionsArgs(\"This form of authWithPassword(usernameOrEmail, pass, body?, query?) is deprecated. Consider replacing it with authWithPassword(usernameOrEmail, pass, options?).\",n,s,i),this.client.send(this.baseCollectionPath+\"/auth-with-password\",n).then((e=>this.authResponse(e)))}async authWithOAuth2Code(e,t,s,i,n,r,o){let a={method:\"POST\",body:{provider:e,code:t,codeVerifier:s,redirectUrl:i,createData:n}};return a=normalizeLegacyOptionsArgs(\"This form of authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createData?, body?, query?) is deprecated. Consider replacing it with authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createData?, options?).\",a,r,o),this.client.send(this.baseCollectionPath+\"/auth-with-oauth2\",a).then((e=>this.authResponse(e)))}authWithOAuth2(...e){if(e.length>1||\"string\"==typeof e?.[0])return console.warn(\"PocketBase: This form of authWithOAuth2() is deprecated and may get removed in the future. Please replace with authWithOAuth2Code() OR use the authWithOAuth2() realtime form as shown in https://pocketbase.io/docs/authentication/#oauth2-integration.\"),this.authWithOAuth2Code(e?.[0]||\"\",e?.[1]||\"\",e?.[2]||\"\",e?.[3]||\"\",e?.[4]||{},e?.[5]||{},e?.[6]||{});const t=e?.[0]||{};let s=null;t.urlCallback||(s=openBrowserPopup(void 0));const i=new RealtimeService(this.client);function cleanup(){s?.close(),i.unsubscribe()}const n={},r=t.requestKey;return r&&(n.requestKey=r),this.listAuthMethods(n).then((e=>{const n=e.authProviders.find((e=>e.name===t.provider));if(!n)throw new ClientResponseError(new Error(`Missing or invalid provider \"${t.provider}\".`));const o=this.client.buildUrl(\"/api/oauth2-redirect\"),a=r?this.client.cancelControllers?.[r]:void 0;return a&&(a.signal.onabort=()=>{cleanup()}),new Promise((async(e,r)=>{try{await i.subscribe(\"@oauth2\",(async s=>{const c=i.clientId;try{if(!s.state||c!==s.state)throw new Error(\"State parameters don't match.\");if(s.error||!s.code)throw new Error(\"OAuth2 redirect error or missing code: \"+s.error);const i=Object.assign({},t);delete i.provider,delete i.scopes,delete i.createData,delete i.urlCallback,a?.signal?.onabort&&(a.signal.onabort=null);const r=await this.authWithOAuth2Code(n.name,s.code,n.codeVerifier,o,t.createData,i);e(r)}catch(e){r(new ClientResponseError(e))}cleanup()}));const c={state:i.clientId};t.scopes?.length&&(c.scope=t.scopes.join(\" \"));const l=this._replaceQueryParams(n.authUrl+o,c);let h=t.urlCallback||function(e){s?s.location.href=e:s=openBrowserPopup(e)};await h(l)}catch(e){cleanup(),r(new ClientResponseError(e))}}))})).catch((e=>{throw cleanup(),e}))}async authRefresh(e,t){let s={method:\"POST\"};return s=normalizeLegacyOptionsArgs(\"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",s,e,t),this.client.send(this.baseCollectionPath+\"/auth-refresh\",s).then((e=>this.authResponse(e)))}async requestPasswordReset(e,t,s){let i={method:\"POST\",body:{email:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/request-password-reset\",i).then((()=>!0))}async confirmPasswordReset(e,t,s,i,n){let r={method:\"POST\",body:{token:e,password:t,passwordConfirm:s}};return r=normalizeLegacyOptionsArgs(\"This form of confirmPasswordReset(token, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(token, password, passwordConfirm, options?).\",r,i,n),this.client.send(this.baseCollectionPath+\"/confirm-password-reset\",r).then((()=>!0))}async requestVerification(e,t,s){let i={method:\"POST\",body:{email:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestVerification(email, body?, query?) is deprecated. Consider replacing it with requestVerification(email, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/request-verification\",i).then((()=>!0))}async confirmVerification(e,t,s){let i={method:\"POST\",body:{token:e}};return i=normalizeLegacyOptionsArgs(\"This form of confirmVerification(token, body?, query?) is deprecated. Consider replacing it with confirmVerification(token, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/confirm-verification\",i).then((()=>{const t=getTokenPayload(e),s=this.client.authStore.model;return s&&!s.verified&&s.id===t.id&&s.collectionId===t.collectionId&&(s.verified=!0,this.client.authStore.save(this.client.authStore.token,s)),!0}))}async requestEmailChange(e,t,s){let i={method:\"POST\",body:{newEmail:e}};return i=normalizeLegacyOptionsArgs(\"This form of requestEmailChange(newEmail, body?, query?) is deprecated. Consider replacing it with requestEmailChange(newEmail, options?).\",i,t,s),this.client.send(this.baseCollectionPath+\"/request-email-change\",i).then((()=>!0))}async confirmEmailChange(e,t,s,i){let n={method:\"POST\",body:{token:e,password:t}};return n=normalizeLegacyOptionsArgs(\"This form of confirmEmailChange(token, password, body?, query?) is deprecated. Consider replacing it with confirmEmailChange(token, password, options?).\",n,s,i),this.client.send(this.baseCollectionPath+\"/confirm-email-change\",n).then((()=>{const t=getTokenPayload(e),s=this.client.authStore.model;return s&&s.id===t.id&&s.collectionId===t.collectionId&&this.client.authStore.clear(),!0}))}async listExternalAuths(e,t){return t=Object.assign({method:\"GET\"},t),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e)+\"/external-auths\",t)}async unlinkExternalAuth(e,t,s){return s=Object.assign({method:\"DELETE\"},s),this.client.send(this.baseCrudPath+\"/\"+encodeURIComponent(e)+\"/external-auths/\"+encodeURIComponent(t),s).then((()=>!0))}_replaceQueryParams(e,t={}){let s=e,i=\"\";e.indexOf(\"?\")>=0&&(s=e.substring(0,e.indexOf(\"?\")),i=e.substring(e.indexOf(\"?\")+1));const n={},r=i.split(\"&\");for(const e of r){if(\"\"==e)continue;const t=e.split(\"=\");n[decodeURIComponent(t[0].replace(/\\+/g,\" \"))]=decodeURIComponent((t[1]||\"\").replace(/\\+/g,\" \"))}for(let e in t)t.hasOwnProperty(e)&&(null==t[e]?delete n[e]:n[e]=t[e]);i=\"\";for(let e in n)n.hasOwnProperty(e)&&(\"\"!=i&&(i+=\"&\"),i+=encodeURIComponent(e.replace(/%20/g,\"+\"))+\"=\"+encodeURIComponent(n[e].replace(/%20/g,\"+\")));return\"\"!=i?s+\"?\"+i:s}}function openBrowserPopup(e){if(\"undefined\"==typeof window||!window?.open)throw new ClientResponseError(new Error(\"Not in a browser context - please pass a custom urlCallback function.\"));let t=1024,s=768,i=window.innerWidth,n=window.innerHeight;t=t>i?i:t,s=s>n?n:s;let r=i/2-t/2,o=n/2-s/2;return window.open(e,\"popup_window\",\"width=\"+t+\",height=\"+s+\",top=\"+o+\",left=\"+r+\",resizable,menubar=no\")}class CollectionService extends CrudService{get baseCrudPath(){return\"/api/collections\"}async import(e,t=!1,s){return s=Object.assign({method:\"PUT\",body:{collections:e,deleteMissing:t}},s),this.client.send(this.baseCrudPath+\"/import\",s).then((()=>!0))}}class LogService extends BaseService{async getList(e=1,t=30,s){return(s=Object.assign({method:\"GET\"},s)).query=Object.assign({page:e,perPage:t},s.query),this.client.send(\"/api/logs\",s)}async getOne(e,t){if(!e)throw new ClientResponseError({url:this.client.buildUrl(\"/api/logs/\"),status:404,response:{code:404,message:\"Missing required log id.\",data:{}}});return t=Object.assign({method:\"GET\"},t),this.client.send(\"/api/logs/\"+encodeURIComponent(e),t)}async getStats(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/logs/stats\",e)}}class HealthService extends BaseService{async check(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/health\",e)}}class FileService extends BaseService{getUrl(e,t,s={}){if(!t||!e?.id||!e?.collectionId&&!e?.collectionName)return\"\";const i=[];i.push(\"api\"),i.push(\"files\"),i.push(encodeURIComponent(e.collectionId||e.collectionName)),i.push(encodeURIComponent(e.id)),i.push(encodeURIComponent(t));let n=this.client.buildUrl(i.join(\"/\"));if(Object.keys(s).length){!1===s.download&&delete s.download;const e=new URLSearchParams(s);n+=(n.includes(\"?\")?\"&\":\"?\")+e}return n}async getToken(e){return e=Object.assign({method:\"POST\"},e),this.client.send(\"/api/files/token\",e).then((e=>e?.token||\"\"))}}class BackupService extends BaseService{async getFullList(e){return e=Object.assign({method:\"GET\"},e),this.client.send(\"/api/backups\",e)}async create(e,t){return t=Object.assign({method:\"POST\",body:{name:e}},t),this.client.send(\"/api/backups\",t).then((()=>!0))}async upload(e,t){return t=Object.assign({method:\"POST\",body:e},t),this.client.send(\"/api/backups/upload\",t).then((()=>!0))}async delete(e,t){return t=Object.assign({method:\"DELETE\"},t),this.client.send(`/api/backups/${encodeURIComponent(e)}`,t).then((()=>!0))}async restore(e,t){return t=Object.assign({method:\"POST\"},t),this.client.send(`/api/backups/${encodeURIComponent(e)}/restore`,t).then((()=>!0))}getDownloadUrl(e,t){return this.client.buildUrl(`/api/backups/${encodeURIComponent(t)}?token=${encodeURIComponent(e)}`)}}class Client{constructor(e=\"/\",t,s=\"en-US\"){this.cancelControllers={},this.recordServices={},this.enableAutoCancellation=!0,this.baseUrl=e,this.lang=s,this.authStore=t||new LocalAuthStore,this.admins=new AdminService(this),this.collections=new CollectionService(this),this.files=new FileService(this),this.logs=new LogService(this),this.settings=new SettingsService(this),this.realtime=new RealtimeService(this),this.health=new HealthService(this),this.backups=new BackupService(this)}collection(e){return this.recordServices[e]||(this.recordServices[e]=new RecordService(this,e)),this.recordServices[e]}autoCancellation(e){return this.enableAutoCancellation=!!e,this}cancelRequest(e){return this.cancelControllers[e]&&(this.cancelControllers[e].abort(),delete this.cancelControllers[e]),this}cancelAllRequests(){for(let e in this.cancelControllers)this.cancelControllers[e].abort();return this.cancelControllers={},this}filter(e,t){if(!t)return e;for(let s in t){let i=t[s];switch(typeof i){case\"boolean\":case\"number\":i=\"\"+i;break;case\"string\":i=\"'\"+i.replace(/'/g,\"\\\\'\")+\"'\";break;default:i=null===i?\"null\":i instanceof Date?\"'\"+i.toISOString().replace(\"T\",\" \")+\"'\":\"'\"+JSON.stringify(i).replace(/'/g,\"\\\\'\")+\"'\"}e=e.replaceAll(\"{:\"+s+\"}\",i)}return e}getFileUrl(e,t,s={}){return this.files.getUrl(e,t,s)}buildUrl(e){let t=this.baseUrl;return\"undefined\"==typeof window||!window.location||t.startsWith(\"https://\")||t.startsWith(\"http://\")||(t=window.location.origin?.endsWith(\"/\")?window.location.origin.substring(0,window.location.origin.length-1):window.location.origin||\"\",this.baseUrl.startsWith(\"/\")||(t+=window.location.pathname||\"/\",t+=t.endsWith(\"/\")?\"\":\"/\"),t+=this.baseUrl),e&&(t+=t.endsWith(\"/\")?\"\":\"/\",t+=e.startsWith(\"/\")?e.substring(1):e),t}async send(e,t){t=this.initSendOptions(e,t);let s=this.buildUrl(e);if(this.beforeSend){const e=Object.assign({},await this.beforeSend(s,t));void 0!==e.url||void 0!==e.options?(s=e.url||s,t=e.options||t):Object.keys(e).length&&(t=e,console?.warn&&console.warn(\"Deprecated format of beforeSend return: please use `return { url, options }`, instead of `return options`.\"))}if(void 0!==t.query){const e=this.serializeQueryParams(t.query);e&&(s+=(s.includes(\"?\")?\"&\":\"?\")+e),delete t.query}\"application/json\"==this.getHeader(t.headers,\"Content-Type\")&&t.body&&\"string\"!=typeof t.body&&(t.body=JSON.stringify(t.body));return(t.fetch||fetch)(s,t).then((async e=>{let t={};try{t=await e.json()}catch(e){}if(this.afterSend&&(t=await this.afterSend(e,t)),e.status>=400)throw new ClientResponseError({url:e.url,status:e.status,data:t});return t})).catch((e=>{throw new ClientResponseError(e)}))}initSendOptions(e,t){if((t=Object.assign({method:\"GET\"},t)).body=this.convertToFormDataIfNeeded(t.body),normalizeUnknownQueryParams(t),t.query=Object.assign({},t.params,t.query),void 0===t.requestKey&&(!1===t.$autoCancel||!1===t.query.$autoCancel?t.requestKey=null:(t.$cancelKey||t.query.$cancelKey)&&(t.requestKey=t.$cancelKey||t.query.$cancelKey)),delete t.$autoCancel,delete t.query.$autoCancel,delete t.$cancelKey,delete t.query.$cancelKey,null!==this.getHeader(t.headers,\"Content-Type\")||this.isFormData(t.body)||(t.headers=Object.assign({},t.headers,{\"Content-Type\":\"application/json\"})),null===this.getHeader(t.headers,\"Accept-Language\")&&(t.headers=Object.assign({},t.headers,{\"Accept-Language\":this.lang})),this.authStore.token&&null===this.getHeader(t.headers,\"Authorization\")&&(t.headers=Object.assign({},t.headers,{Authorization:this.authStore.token})),this.enableAutoCancellation&&null!==t.requestKey){const s=t.requestKey||(t.method||\"GET\")+e;delete t.requestKey,this.cancelRequest(s);const i=new AbortController;this.cancelControllers[s]=i,t.signal=i.signal}return t}convertToFormDataIfNeeded(e){if(\"undefined\"==typeof FormData||void 0===e||\"object\"!=typeof e||null===e||this.isFormData(e)||!this.hasBlobField(e))return e;const t=new FormData;for(const s in e){const i=e[s];if(\"object\"!=typeof i||this.hasBlobField({data:i})){const e=Array.isArray(i)?i:[i];for(let i of e)t.append(s,i)}else{let e={};e[s]=i,t.append(\"@jsonPayload\",JSON.stringify(e))}}return t}hasBlobField(e){for(const t in e){const s=Array.isArray(e[t])?e[t]:[e[t]];for(const e of s)if(\"undefined\"!=typeof Blob&&e instanceof Blob||\"undefined\"!=typeof File&&e instanceof File)return!0}return!1}getHeader(e,t){e=e||{},t=t.toLowerCase();for(let s in e)if(s.toLowerCase()==t)return e[s];return null}isFormData(e){return e&&(\"FormData\"===e.constructor.name||\"undefined\"!=typeof FormData&&e instanceof FormData)}serializeQueryParams(e){const t=[];for(const s in e){if(null===e[s])continue;const i=e[s],n=encodeURIComponent(s);if(Array.isArray(i))for(const e of i)t.push(n+\"=\"+encodeURIComponent(e));else i instanceof Date?t.push(n+\"=\"+encodeURIComponent(i.toISOString())):null!==typeof i&&\"object\"==typeof i?t.push(n+\"=\"+encodeURIComponent(JSON.stringify(i))):t.push(n+\"=\"+encodeURIComponent(i))}return t.join(\"&\")}}class AsyncAuthStore extends BaseAuthStore{constructor(e){super(),this.queue=[],this.saveFunc=e.save,this.clearFunc=e.clear,this._enqueue((()=>this._loadInitial(e.initial)))}save(e,t){super.save(e,t);let s=\"\";try{s=JSON.stringify({token:e,model:t})}catch(e){console.warn(\"AsyncAuthStore: failed to stringify the new state\")}this._enqueue((()=>this.saveFunc(s)))}clear(){super.clear(),this.clearFunc?this._enqueue((()=>this.clearFunc())):this._enqueue((()=>this.saveFunc(\"\")))}async _loadInitial(e){try{if(e=await e){let t;\"string\"==typeof e?t=JSON.parse(e)||{}:\"object\"==typeof e&&(t=e),this.save(t.token||\"\",t.model||null)}}catch(e){}}_enqueue(e){this.queue.push(e),1==this.queue.length&&this._dequeue()}_dequeue(){this.queue.length&&this.queue[0]().finally((()=>{this.queue.shift(),this.queue.length&&this._dequeue()}))}}\n//# sourceMappingURL=pocketbase.es.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9wb2NrZXRiYXNlL2Rpc3QvcG9ja2V0YmFzZS5lcy5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3Q0FBd0MsZUFBZSx1RUFBdUUsNGFBQTRhLGtyQkFBa3JCLFdBQVcscUJBQXFCLFNBQVMsT0FBTyxVQUFVLGdEQUFnRCwwQkFBMEIsV0FBVywrQkFBK0Isd0JBQXdCLE1BQU0sd0JBQXdCLFFBQVEsS0FBSyxXQUFXLEVBQUUseUJBQXlCLGdCQUFnQixrQkFBa0IsS0FBSyxxQkFBcUIsYUFBYSxrQkFBa0IsU0FBUyxTQUFTLDRCQUE0QixrQkFBa0IsNEJBQTRCLHdDQUF3QyxJQUFJLFVBQVUsU0FBUyxRQUFRLE1BQU0sU0FBUyxnQ0FBZ0Msd0JBQXdCLE1BQU0sNEJBQTRCLDhEQUE4RCxhQUFhLGdFQUFnRSxjQUFjLG1CQUFtQixtQkFBbUIsMEVBQTBFLE1BQU0sd0JBQXdCLGFBQWEscUVBQXFFLE1BQU0sa0JBQWtCLFdBQVcsaUVBQWlFLE1BQU0sY0FBYyxjQUFjLHVCQUF1Qiw2RUFBNkUseUZBQXlGLE1BQU0sa0NBQWtDLHNCQUFzQiw0QkFBNEIscUJBQXFCLHdFQUF3RSxnQkFBZ0IsY0FBYyxNQUFNLG1CQUFtQixpQkFBaUIsTUFBTSxpQkFBaUIsZUFBZSxNQUFNLDJEQUEyRCxlQUFlLHdFQUF3RSxhQUFhLGlCQUFpQixNQUFNLGdCQUFnQixjQUFjLE1BQU0sbUJBQW1CLGlCQUFpQixNQUFNLGlCQUFpQixlQUFlLE1BQU0sMkRBQTJELFNBQVMsMEJBQTBCLGtEQUFrRCwwQkFBMEIsNkJBQTZCLDRIQUE0SCxNQUFNLDRCQUE0QixTQUFTLHlFQUF5RSx3REFBd0QsYUFBYSx5QkFBeUIsVUFBVSxTQUFTLCtCQUErQix5QkFBeUIsbUVBQW1FLGlDQUFpQyxrQ0FBa0Msc0dBQXNHLHlCQUF5QixnQkFBZ0Isc0pBQXNKLFNBQVMsTUFBTSxrQkFBa0Isb0JBQW9CLGNBQWMsaUVB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QUEwQywwQ0FBMEMsNEJBQTRCLDhDQUE4QyxTQUFTLDZCQUE2Qiw4SEFBOEgscUJBQXFCLGtCQUFrQixhQUFhLDBDQUEwQyxPQUFPLEdBQUcsK0JBQStCLDZCQUE2QixLQUFLLFNBQVMsbURBQW1ELFNBQVMsZ0JBQWdCLGtCQUFrQix3Q0FBd0Msc0hBQXNILFNBQVMsZUFBZSxPQUFPLG1CQUFtQixpREFBaUQsWUFBWSxjQUFjLGlHQUFpRyx3QkFBd0IsV0FBVyxrQkFBa0Isd0JBQXdCLHFDQUFxQyx5RUFBeUUscU1BQXFNLG9CQUFvQiwyQ0FBMkMsZUFBZSxvSEFBb0gsVUFBVSxnQkFBZ0IsU0FBUyxJQUFJLGtCQUFrQixnQkFBZ0IsRUFBRSxTQUFTLGtFQUFrRSxzQ0FBc0MsUUFBUSwwR0FBMEcsc0JBQXNCLElBQUksY0FBYyxNQUFNLHNDQUFzQyxpRUFBaUUsV0FBVyxZQUFZLHlEQUF5RCxXQUFXLGlEQUFpRCxzREFBc0QsSUFBdVI7QUFDM3dtQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcG9ja2V0YmFzZS9kaXN0L3BvY2tldGJhc2UuZXMubWpzPzA0ZmYiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgQ2xpZW50UmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKFwiQ2xpZW50UmVzcG9uc2VFcnJvclwiKSx0aGlzLnVybD1cIlwiLHRoaXMuc3RhdHVzPTAsdGhpcy5yZXNwb25zZT17fSx0aGlzLmlzQWJvcnQ9ITEsdGhpcy5vcmlnaW5hbEVycm9yPW51bGwsT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsQ2xpZW50UmVzcG9uc2VFcnJvci5wcm90b3R5cGUpLG51bGwhPT1lJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmKHRoaXMudXJsPVwic3RyaW5nXCI9PXR5cGVvZiBlLnVybD9lLnVybDpcIlwiLHRoaXMuc3RhdHVzPVwibnVtYmVyXCI9PXR5cGVvZiBlLnN0YXR1cz9lLnN0YXR1czowLHRoaXMuaXNBYm9ydD0hIWUuaXNBYm9ydCx0aGlzLm9yaWdpbmFsRXJyb3I9ZS5vcmlnaW5hbEVycm9yLG51bGwhPT1lLnJlc3BvbnNlJiZcIm9iamVjdFwiPT10eXBlb2YgZS5yZXNwb25zZT90aGlzLnJlc3BvbnNlPWUucmVzcG9uc2U6bnVsbCE9PWUuZGF0YSYmXCJvYmplY3RcIj09dHlwZW9mIGUuZGF0YT90aGlzLnJlc3BvbnNlPWUuZGF0YTp0aGlzLnJlc3BvbnNlPXt9KSx0aGlzLm9yaWdpbmFsRXJyb3J8fGUgaW5zdGFuY2VvZiBDbGllbnRSZXNwb25zZUVycm9yfHwodGhpcy5vcmlnaW5hbEVycm9yPWUpLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBET01FeGNlcHRpb24mJmUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJih0aGlzLmlzQWJvcnQ9ITApLHRoaXMubmFtZT1cIkNsaWVudFJlc3BvbnNlRXJyb3IgXCIrdGhpcy5zdGF0dXMsdGhpcy5tZXNzYWdlPXRoaXMucmVzcG9uc2U/Lm1lc3NhZ2UsdGhpcy5tZXNzYWdlfHwodGhpcy5pc0Fib3J0P3RoaXMubWVzc2FnZT1cIlRoZSByZXF1ZXN0IHdhcyBhdXRvY2FuY2VsbGVkLiBZb3UgY2FuIGZpbmQgbW9yZSBpbmZvIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9wb2NrZXRiYXNlL2pzLXNkayNhdXRvLWNhbmNlbGxhdGlvbi5cIjp0aGlzLm9yaWdpbmFsRXJyb3I/LmNhdXNlPy5tZXNzYWdlPy5pbmNsdWRlcyhcIkVDT05OUkVGVVNFRCA6OjFcIik/dGhpcy5tZXNzYWdlPVwiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIFBvY2tldEJhc2Ugc2VydmVyLiBUcnkgY2hhbmdpbmcgdGhlIFNESyBVUkwgZnJvbSBsb2NhbGhvc3QgdG8gMTI3LjAuMC4xIChodHRwczovL2dpdGh1Yi5jb20vcG9ja2V0YmFzZS9qcy1zZGsvaXNzdWVzLzIxKS5cIjp0aGlzLm1lc3NhZ2U9XCJTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBwcm9jZXNzaW5nIHlvdXIgcmVxdWVzdC5cIil9Z2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5yZXNwb25zZX10b0pTT04oKXtyZXR1cm57Li4udGhpc319fWNvbnN0IGU9L15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87ZnVuY3Rpb24gY29va2llUGFyc2UoZSx0KXtjb25zdCBzPXt9O2lmKFwic3RyaW5nXCIhPXR5cGVvZiBlKXJldHVybiBzO2NvbnN0IGk9T2JqZWN0LmFzc2lnbih7fSx0fHx7fSkuZGVjb2RlfHxkZWZhdWx0RGVjb2RlO2xldCBuPTA7Zm9yKDtuPGUubGVuZ3RoOyl7Y29uc3QgdD1lLmluZGV4T2YoXCI9XCIsbik7aWYoLTE9PT10KWJyZWFrO2xldCByPWUuaW5kZXhPZihcIjtcIixuKTtpZigtMT09PXIpcj1lLmxlbmd0aDtlbHNlIGlmKHI8dCl7bj1lLmxhc3RJbmRleE9mKFwiO1wiLHQtMSkrMTtjb250aW51ZX1jb25zdCBvPWUuc2xpY2Uobix0KS50cmltKCk7aWYodm9pZCAwPT09c1tvXSl7bGV0IG49ZS5zbGljZSh0KzEscikudHJpbSgpOzM0PT09bi5jaGFyQ29kZUF0KDApJiYobj1uLnNsaWNlKDEsLTEpKTt0cnl7c1tvXT1pKG4pfWNhdGNoKGUpe3Nbb109bn19bj1yKzF9cmV0dXJuIHN9ZnVuY3Rpb24gY29va2llU2VyaWFsaXplKHQscyxpKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30saXx8e30pLHI9bi5lbmNvZGV8fGRlZmF1bHRFbmNvZGU7aWYoIWUudGVzdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkXCIpO2NvbnN0IG89cihzKTtpZihvJiYhZS50ZXN0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJhcmd1bWVudCB2YWwgaXMgaW52YWxpZFwiKTtsZXQgYT10K1wiPVwiK287aWYobnVsbCE9bi5tYXhBZ2Upe2NvbnN0IGU9bi5tYXhBZ2UtMDtpZihpc05hTihlKXx8IWlzRmluaXRlKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gbWF4QWdlIGlzIGludmFsaWRcIik7YSs9XCI7IE1heC1BZ2U9XCIrTWF0aC5mbG9vcihlKX1pZihuLmRvbWFpbil7aWYoIWUudGVzdChuLmRvbWFpbikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBkb21haW4gaXMgaW52YWxpZFwiKTthKz1cIjsgRG9tYWluPVwiK24uZG9tYWlufWlmKG4ucGF0aCl7aWYoIWUudGVzdChuLnBhdGgpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJvcHRpb24gcGF0aCBpcyBpbnZhbGlkXCIpO2ErPVwiOyBQYXRoPVwiK24ucGF0aH1pZihuLmV4cGlyZXMpe2lmKCFmdW5jdGlvbiBpc0RhdGUoZSl7cmV0dXJuXCJbb2JqZWN0IERhdGVdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl8fGUgaW5zdGFuY2VvZiBEYXRlfShuLmV4cGlyZXMpfHxpc05hTihuLmV4cGlyZXMudmFsdWVPZigpKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZFwiKTthKz1cIjsgRXhwaXJlcz1cIituLmV4cGlyZXMudG9VVENTdHJpbmcoKX1pZihuLmh0dHBPbmx5JiYoYSs9XCI7IEh0dHBPbmx5XCIpLG4uc2VjdXJlJiYoYSs9XCI7IFNlY3VyZVwiKSxuLnByaW9yaXR5KXtzd2l0Y2goXCJzdHJpbmdcIj09dHlwZW9mIG4ucHJpb3JpdHk/bi5wcmlvcml0eS50b0xvd2VyQ2FzZSgpOm4ucHJpb3JpdHkpe2Nhc2VcImxvd1wiOmErPVwiOyBQcmlvcml0eT1Mb3dcIjticmVhaztjYXNlXCJtZWRpdW1cIjphKz1cIjsgUHJpb3JpdHk9TWVkaXVtXCI7YnJlYWs7Y2FzZVwiaGlnaFwiOmErPVwiOyBQcmlvcml0eT1IaWdoXCI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWRcIil9fWlmKG4uc2FtZVNpdGUpe3N3aXRjaChcInN0cmluZ1wiPT10eXBlb2Ygbi5zYW1lU2l0ZT9uLnNhbWVTaXRlLnRvTG93ZXJDYXNlKCk6bi5zYW1lU2l0ZSl7Y2FzZSEwOmErPVwiOyBTYW1lU2l0ZT1TdHJpY3RcIjticmVhaztjYXNlXCJsYXhcIjphKz1cIjsgU2FtZVNpdGU9TGF4XCI7YnJlYWs7Y2FzZVwic3RyaWN0XCI6YSs9XCI7IFNhbWVTaXRlPVN0cmljdFwiO2JyZWFrO2Nhc2VcIm5vbmVcIjphKz1cIjsgU2FtZVNpdGU9Tm9uZVwiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcihcIm9wdGlvbiBzYW1lU2l0ZSBpcyBpbnZhbGlkXCIpfX1yZXR1cm4gYX1mdW5jdGlvbiBkZWZhdWx0RGVjb2RlKGUpe3JldHVybi0xIT09ZS5pbmRleE9mKFwiJVwiKT9kZWNvZGVVUklDb21wb25lbnQoZSk6ZX1mdW5jdGlvbiBkZWZhdWx0RW5jb2RlKGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSl9Y29uc3QgdD1cInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdHx8XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLkhlcm1lc0ludGVybmFsO2xldCBzO2Z1bmN0aW9uIGdldFRva2VuUGF5bG9hZChlKXtpZihlKXRyeXtjb25zdCB0PWRlY29kZVVSSUNvbXBvbmVudChzKGUuc3BsaXQoXCIuXCIpWzFdKS5zcGxpdChcIlwiKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVyblwiJVwiKyhcIjAwXCIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkpLmpvaW4oXCJcIikpO3JldHVybiBKU09OLnBhcnNlKHQpfHx7fX1jYXRjaChlKXt9cmV0dXJue319ZnVuY3Rpb24gaXNUb2tlbkV4cGlyZWQoZSx0PTApe2xldCBzPWdldFRva2VuUGF5bG9hZChlKTtyZXR1cm4hKE9iamVjdC5rZXlzKHMpLmxlbmd0aD4wJiYoIXMuZXhwfHxzLmV4cC10PkRhdGUubm93KCkvMWUzKSl9cz1cImZ1bmN0aW9uXCIhPXR5cGVvZiBhdG9ifHx0P2U9PntsZXQgdD1TdHJpbmcoZSkucmVwbGFjZSgvPSskLyxcIlwiKTtpZih0Lmxlbmd0aCU0PT0xKXRocm93IG5ldyBFcnJvcihcIidhdG9iJyBmYWlsZWQ6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuXCIpO2Zvcih2YXIgcyxpLG49MCxyPTAsbz1cIlwiO2k9dC5jaGFyQXQocisrKTt+aSYmKHM9biU0PzY0KnMraTppLG4rKyU0KT9vKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZzPj4oLTIqbiY2KSk6MClpPVwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGkpO3JldHVybiBvfTphdG9iO2NvbnN0IGk9XCJwYl9hdXRoXCI7Y2xhc3MgQmFzZUF1dGhTdG9yZXtjb25zdHJ1Y3Rvcigpe3RoaXMuYmFzZVRva2VuPVwiXCIsdGhpcy5iYXNlTW9kZWw9bnVsbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrcz1bXX1nZXQgdG9rZW4oKXtyZXR1cm4gdGhpcy5iYXNlVG9rZW59Z2V0IG1vZGVsKCl7cmV0dXJuIHRoaXMuYmFzZU1vZGVsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIWlzVG9rZW5FeHBpcmVkKHRoaXMudG9rZW4pfWdldCBpc0FkbWluKCl7cmV0dXJuXCJhZG1pblwiPT09Z2V0VG9rZW5QYXlsb2FkKHRoaXMudG9rZW4pLnR5cGV9Z2V0IGlzQXV0aFJlY29yZCgpe3JldHVyblwiYXV0aFJlY29yZFwiPT09Z2V0VG9rZW5QYXlsb2FkKHRoaXMudG9rZW4pLnR5cGV9c2F2ZShlLHQpe3RoaXMuYmFzZVRva2VuPWV8fFwiXCIsdGhpcy5iYXNlTW9kZWw9dHx8bnVsbCx0aGlzLnRyaWdnZXJDaGFuZ2UoKX1jbGVhcigpe3RoaXMuYmFzZVRva2VuPVwiXCIsdGhpcy5iYXNlTW9kZWw9bnVsbCx0aGlzLnRyaWdnZXJDaGFuZ2UoKX1sb2FkRnJvbUNvb2tpZShlLHQ9aSl7Y29uc3Qgcz1jb29raWVQYXJzZShlfHxcIlwiKVt0XXx8XCJcIjtsZXQgbj17fTt0cnl7bj1KU09OLnBhcnNlKHMpLChudWxsPT09dHlwZW9mIG58fFwib2JqZWN0XCIhPXR5cGVvZiBufHxBcnJheS5pc0FycmF5KG4pKSYmKG49e30pfWNhdGNoKGUpe310aGlzLnNhdmUobi50b2tlbnx8XCJcIixuLm1vZGVsfHxudWxsKX1leHBvcnRUb0Nvb2tpZShlLHQ9aSl7Y29uc3Qgcz17c2VjdXJlOiEwLHNhbWVTaXRlOiEwLGh0dHBPbmx5OiEwLHBhdGg6XCIvXCJ9LG49Z2V0VG9rZW5QYXlsb2FkKHRoaXMudG9rZW4pO3MuZXhwaXJlcz1uPy5leHA/bmV3IERhdGUoMWUzKm4uZXhwKTpuZXcgRGF0ZShcIjE5NzAtMDEtMDFcIiksZT1PYmplY3QuYXNzaWduKHt9LHMsZSk7Y29uc3Qgcj17dG9rZW46dGhpcy50b2tlbixtb2RlbDp0aGlzLm1vZGVsP0pTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbCkpOm51bGx9O2xldCBvPWNvb2tpZVNlcmlhbGl6ZSh0LEpTT04uc3RyaW5naWZ5KHIpLGUpO2NvbnN0IGE9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIEJsb2I/bmV3IEJsb2IoW29dKS5zaXplOm8ubGVuZ3RoO2lmKHIubW9kZWwmJmE+NDA5Nil7ci5tb2RlbD17aWQ6cj8ubW9kZWw/LmlkLGVtYWlsOnI/Lm1vZGVsPy5lbWFpbH07Y29uc3Qgcz1bXCJjb2xsZWN0aW9uSWRcIixcInVzZXJuYW1lXCIsXCJ2ZXJpZmllZFwiXTtmb3IoY29uc3QgZSBpbiB0aGlzLm1vZGVsKXMuaW5jbHVkZXMoZSkmJihyLm1vZGVsW2VdPXRoaXMubW9kZWxbZV0pO289Y29va2llU2VyaWFsaXplKHQsSlNPTi5zdHJpbmdpZnkociksZSl9cmV0dXJuIG99b25DaGFuZ2UoZSx0PSExKXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFja3MucHVzaChlKSx0JiZlKHRoaXMudG9rZW4sdGhpcy5tb2RlbCksKCk9Pntmb3IobGV0IHQ9dGhpcy5fb25DaGFuZ2VDYWxsYmFja3MubGVuZ3RoLTE7dD49MDt0LS0paWYodGhpcy5fb25DaGFuZ2VDYWxsYmFja3NbdF09PWUpcmV0dXJuIGRlbGV0ZSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrc1t0XSx2b2lkIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2tzLnNwbGljZSh0LDEpfX10cmlnZ2VyQ2hhbmdlKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fb25DaGFuZ2VDYWxsYmFja3MpZSYmZSh0aGlzLnRva2VuLHRoaXMubW9kZWwpfX1jbGFzcyBMb2NhbEF1dGhTdG9yZSBleHRlbmRzIEJhc2VBdXRoU3RvcmV7Y29uc3RydWN0b3IoZT1cInBvY2tldGJhc2VfYXV0aFwiKXtzdXBlcigpLHRoaXMuc3RvcmFnZUZhbGxiYWNrPXt9LHRoaXMuc3RvcmFnZUtleT1lLHRoaXMuX2JpbmRTdG9yYWdlRXZlbnQoKX1nZXQgdG9rZW4oKXtyZXR1cm4odGhpcy5fc3RvcmFnZUdldCh0aGlzLnN0b3JhZ2VLZXkpfHx7fSkudG9rZW58fFwiXCJ9Z2V0IG1vZGVsKCl7cmV0dXJuKHRoaXMuX3N0b3JhZ2VHZXQodGhpcy5zdG9yYWdlS2V5KXx8e30pLm1vZGVsfHxudWxsfXNhdmUoZSx0KXt0aGlzLl9zdG9yYWdlU2V0KHRoaXMuc3RvcmFnZUtleSx7dG9rZW46ZSxtb2RlbDp0fSksc3VwZXIuc2F2ZShlLHQpfWNsZWFyKCl7dGhpcy5fc3RvcmFnZVJlbW92ZSh0aGlzLnN0b3JhZ2VLZXkpLHN1cGVyLmNsZWFyKCl9X3N0b3JhZ2VHZXQoZSl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Py5sb2NhbFN0b3JhZ2Upe2NvbnN0IHQ9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpfHxcIlwiO3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaChlKXtyZXR1cm4gdH19cmV0dXJuIHRoaXMuc3RvcmFnZUZhbGxiYWNrW2VdfV9zdG9yYWdlU2V0KGUsdCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Py5sb2NhbFN0b3JhZ2Upe2xldCBzPXQ7XCJzdHJpbmdcIiE9dHlwZW9mIHQmJihzPUpTT04uc3RyaW5naWZ5KHQpKSx3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSxzKX1lbHNlIHRoaXMuc3RvcmFnZUZhbGxiYWNrW2VdPXR9X3N0b3JhZ2VSZW1vdmUoZSl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Py5sb2NhbFN0b3JhZ2UmJndpbmRvdy5sb2NhbFN0b3JhZ2U/LnJlbW92ZUl0ZW0oZSksZGVsZXRlIHRoaXMuc3RvcmFnZUZhbGxiYWNrW2VdfV9iaW5kU3RvcmFnZUV2ZW50KCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Py5sb2NhbFN0b3JhZ2UmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInN0b3JhZ2VcIiwoZT0+e2lmKGUua2V5IT10aGlzLnN0b3JhZ2VLZXkpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fc3RvcmFnZUdldCh0aGlzLnN0b3JhZ2VLZXkpfHx7fTtzdXBlci5zYXZlKHQudG9rZW58fFwiXCIsdC5tb2RlbHx8bnVsbCl9KSl9fWNsYXNzIEJhc2VTZXJ2aWNle2NvbnN0cnVjdG9yKGUpe3RoaXMuY2xpZW50PWV9fWNsYXNzIFNldHRpbmdzU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNle2FzeW5jIGdldEFsbChlKXtyZXR1cm4gZT1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0sZSksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvc2V0dGluZ3NcIixlKX1hc3luYyB1cGRhdGUoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQQVRDSFwiLGJvZHk6ZX0sdCksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvc2V0dGluZ3NcIix0KX1hc3luYyB0ZXN0UzMoZT1cInN0b3JhZ2VcIix0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCIsYm9keTp7ZmlsZXN5c3RlbTplfX0sdCksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvc2V0dGluZ3MvdGVzdC9zM1wiLHQpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIHRlc3RFbWFpbChlLHQscyl7cmV0dXJuIHM9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiUE9TVFwiLGJvZHk6e2VtYWlsOmUsdGVtcGxhdGU6dH19LHMpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL3NldHRpbmdzL3Rlc3QvZW1haWxcIixzKS50aGVuKCgoKT0+ITApKX1hc3luYyBnZW5lcmF0ZUFwcGxlQ2xpZW50U2VjcmV0KGUsdCxzLGksbixyKXtyZXR1cm4gcj1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCIsYm9keTp7Y2xpZW50SWQ6ZSx0ZWFtSWQ6dCxrZXlJZDpzLHByaXZhdGVLZXk6aSxkdXJhdGlvbjpufX0sciksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvc2V0dGluZ3MvYXBwbGUvZ2VuZXJhdGUtY2xpZW50LXNlY3JldFwiLHIpfX1jbGFzcyBDcnVkU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNle2RlY29kZShlKXtyZXR1cm4gZX1hc3luYyBnZXRGdWxsTGlzdChlLHQpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXJldHVybiB0aGlzLl9nZXRGdWxsTGlzdChlLHQpO2xldCBzPTUwMDtyZXR1cm4odD1PYmplY3QuYXNzaWduKHt9LGUsdCkpLmJhdGNoJiYocz10LmJhdGNoLGRlbGV0ZSB0LmJhdGNoKSx0aGlzLl9nZXRGdWxsTGlzdChzLHQpfWFzeW5jIGdldExpc3QoZT0xLHQ9MzAscyl7cmV0dXJuKHM9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LHMpKS5xdWVyeT1PYmplY3QuYXNzaWduKHtwYWdlOmUscGVyUGFnZTp0fSxzLnF1ZXJ5KSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNydWRQYXRoLHMpLnRoZW4oKGU9PihlLml0ZW1zPWUuaXRlbXM/Lm1hcCgoZT0+dGhpcy5kZWNvZGUoZSkpKXx8W10sZSkpKX1hc3luYyBnZXRGaXJzdExpc3RJdGVtKGUsdCl7cmV0dXJuKHQ9T2JqZWN0LmFzc2lnbih7cmVxdWVzdEtleTpcIm9uZV9ieV9maWx0ZXJfXCIrdGhpcy5iYXNlQ3J1ZFBhdGgrXCJfXCIrZX0sdCkpLnF1ZXJ5PU9iamVjdC5hc3NpZ24oe2ZpbHRlcjplLHNraXBUb3RhbDoxfSx0LnF1ZXJ5KSx0aGlzLmdldExpc3QoMSwxLHQpLnRoZW4oKGU9PntpZighZT8uaXRlbXM/Lmxlbmd0aCl0aHJvdyBuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcih7c3RhdHVzOjQwNCxyZXNwb25zZTp7Y29kZTo0MDQsbWVzc2FnZTpcIlRoZSByZXF1ZXN0ZWQgcmVzb3VyY2Ugd2Fzbid0IGZvdW5kLlwiLGRhdGE6e319fSk7cmV0dXJuIGUuaXRlbXNbMF19KSl9YXN5bmMgZ2V0T25lKGUsdCl7aWYoIWUpdGhyb3cgbmV3IENsaWVudFJlc3BvbnNlRXJyb3Ioe3VybDp0aGlzLmNsaWVudC5idWlsZFVybCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9cIiksc3RhdHVzOjQwNCxyZXNwb25zZTp7Y29kZTo0MDQsbWVzc2FnZTpcIk1pc3NpbmcgcmVxdWlyZWQgcmVjb3JkIGlkLlwiLGRhdGE6e319fSk7cmV0dXJuIHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LHQpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvXCIrZW5jb2RlVVJJQ29tcG9uZW50KGUpLHQpLnRoZW4oKGU9PnRoaXMuZGVjb2RlKGUpKSl9YXN5bmMgY3JlYXRlKGUsdCl7cmV0dXJuIHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiUE9TVFwiLGJvZHk6ZX0sdCksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCx0KS50aGVuKChlPT50aGlzLmRlY29kZShlKSkpfWFzeW5jIHVwZGF0ZShlLHQscyl7cmV0dXJuIHM9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiUEFUQ0hcIixib2R5OnR9LHMpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvXCIrZW5jb2RlVVJJQ29tcG9uZW50KGUpLHMpLnRoZW4oKGU9PnRoaXMuZGVjb2RlKGUpKSl9YXN5bmMgZGVsZXRlKGUsdCl7cmV0dXJuIHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiREVMRVRFXCJ9LHQpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvXCIrZW5jb2RlVVJJQ29tcG9uZW50KGUpLHQpLnRoZW4oKCgpPT4hMCkpfV9nZXRGdWxsTGlzdChlPTUwMCx0KXsodD10fHx7fSkucXVlcnk9T2JqZWN0LmFzc2lnbih7c2tpcFRvdGFsOjF9LHQucXVlcnkpO2xldCBzPVtdLHJlcXVlc3Q9YXN5bmMgaT0+dGhpcy5nZXRMaXN0KGksZXx8NTAwLHQpLnRoZW4oKGU9Pntjb25zdCB0PWUuaXRlbXM7cmV0dXJuIHM9cy5jb25jYXQodCksdC5sZW5ndGg9PWUucGVyUGFnZT9yZXF1ZXN0KGkrMSk6c30pKTtyZXR1cm4gcmVxdWVzdCgxKX19ZnVuY3Rpb24gbm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoZSx0LHMsaSl7Y29uc3Qgbj12b2lkIDAhPT1pO3JldHVybiBufHx2b2lkIDAhPT1zP24/KGNvbnNvbGUud2FybihlKSx0LmJvZHk9T2JqZWN0LmFzc2lnbih7fSx0LmJvZHkscyksdC5xdWVyeT1PYmplY3QuYXNzaWduKHt9LHQucXVlcnksaSksdCk6T2JqZWN0LmFzc2lnbih0LHMpOnR9ZnVuY3Rpb24gcmVzZXRBdXRvUmVmcmVzaChlKXtlLl9yZXNldEF1dG9SZWZyZXNoPy4oKX1jbGFzcyBBZG1pblNlcnZpY2UgZXh0ZW5kcyBDcnVkU2VydmljZXtnZXQgYmFzZUNydWRQYXRoKCl7cmV0dXJuXCIvYXBpL2FkbWluc1wifWFzeW5jIHVwZGF0ZShlLHQscyl7cmV0dXJuIHN1cGVyLnVwZGF0ZShlLHQscykudGhlbigoZT0+KHRoaXMuY2xpZW50LmF1dGhTdG9yZS5tb2RlbD8uaWQ9PT1lLmlkJiZ2b2lkIDA9PT10aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmNvbGxlY3Rpb25JZCYmdGhpcy5jbGllbnQuYXV0aFN0b3JlLnNhdmUodGhpcy5jbGllbnQuYXV0aFN0b3JlLnRva2VuLGUpLGUpKSl9YXN5bmMgZGVsZXRlKGUsdCl7cmV0dXJuIHN1cGVyLmRlbGV0ZShlLHQpLnRoZW4oKHQ9Pih0JiZ0aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmlkPT09ZSYmdm9pZCAwPT09dGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5jb2xsZWN0aW9uSWQmJnRoaXMuY2xpZW50LmF1dGhTdG9yZS5jbGVhcigpLHQpKSl9YXV0aFJlc3BvbnNlKGUpe2NvbnN0IHQ9dGhpcy5kZWNvZGUoZT8uYWRtaW58fHt9KTtyZXR1cm4gZT8udG9rZW4mJmU/LmFkbWluJiZ0aGlzLmNsaWVudC5hdXRoU3RvcmUuc2F2ZShlLnRva2VuLHQpLE9iamVjdC5hc3NpZ24oe30sZSx7dG9rZW46ZT8udG9rZW58fFwiXCIsYWRtaW46dH0pfWFzeW5jIGF1dGhXaXRoUGFzc3dvcmQoZSx0LHMsaSl7bGV0IG49e21ldGhvZDpcIlBPU1RcIixib2R5OntpZGVudGl0eTplLHBhc3N3b3JkOnR9fTtuPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIGF1dGhXaXRoUGFzc3dvcmQoZW1haWwsIHBhc3MsIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGF1dGhXaXRoUGFzc3dvcmQoZW1haWwsIHBhc3MsIG9wdGlvbnM/KS5cIixuLHMsaSk7Y29uc3Qgcj1uLmF1dG9SZWZyZXNoVGhyZXNob2xkO2RlbGV0ZSBuLmF1dG9SZWZyZXNoVGhyZXNob2xkLG4uYXV0b1JlZnJlc2h8fHJlc2V0QXV0b1JlZnJlc2godGhpcy5jbGllbnQpO2xldCBvPWF3YWl0IHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvYXV0aC13aXRoLXBhc3N3b3JkXCIsbik7cmV0dXJuIG89dGhpcy5hdXRoUmVzcG9uc2UobyksciYmZnVuY3Rpb24gcmVnaXN0ZXJBdXRvUmVmcmVzaChlLHQscyxpKXtyZXNldEF1dG9SZWZyZXNoKGUpO2NvbnN0IG49ZS5iZWZvcmVTZW5kLHI9ZS5hdXRoU3RvcmUubW9kZWwsbz1lLmF1dGhTdG9yZS5vbkNoYW5nZSgoKHQscyk9PnsoIXR8fHM/LmlkIT1yPy5pZHx8KHM/LmNvbGxlY3Rpb25JZHx8cj8uY29sbGVjdGlvbklkKSYmcz8uY29sbGVjdGlvbklkIT1yPy5jb2xsZWN0aW9uSWQpJiZyZXNldEF1dG9SZWZyZXNoKGUpfSkpO2UuX3Jlc2V0QXV0b1JlZnJlc2g9ZnVuY3Rpb24oKXtvKCksZS5iZWZvcmVTZW5kPW4sZGVsZXRlIGUuX3Jlc2V0QXV0b1JlZnJlc2h9LGUuYmVmb3JlU2VuZD1hc3luYyhyLG8pPT57Y29uc3QgYT1lLmF1dGhTdG9yZS50b2tlbjtpZihvLnF1ZXJ5Py5hdXRvUmVmcmVzaClyZXR1cm4gbj9uKHIsbyk6e3VybDpyLHNlbmRPcHRpb25zOm99O2xldCBjPWUuYXV0aFN0b3JlLmlzVmFsaWQ7aWYoYyYmaXNUb2tlbkV4cGlyZWQoZS5hdXRoU3RvcmUudG9rZW4sdCkpdHJ5e2F3YWl0IHMoKX1jYXRjaChlKXtjPSExfWN8fGF3YWl0IGkoKTtjb25zdCBsPW8uaGVhZGVyc3x8e307Zm9yKGxldCB0IGluIGwpaWYoXCJhdXRob3JpemF0aW9uXCI9PXQudG9Mb3dlckNhc2UoKSYmYT09bFt0XSYmZS5hdXRoU3RvcmUudG9rZW4pe2xbdF09ZS5hdXRoU3RvcmUudG9rZW47YnJlYWt9cmV0dXJuIG8uaGVhZGVycz1sLG4/bihyLG8pOnt1cmw6cixzZW5kT3B0aW9uczpvfX19KHRoaXMuY2xpZW50LHIsKCgpPT50aGlzLmF1dGhSZWZyZXNoKHthdXRvUmVmcmVzaDohMH0pKSwoKCk9PnRoaXMuYXV0aFdpdGhQYXNzd29yZChlLHQsT2JqZWN0LmFzc2lnbih7YXV0b1JlZnJlc2g6ITB9LG4pKSkpLG99YXN5bmMgYXV0aFJlZnJlc2goZSx0KXtsZXQgcz17bWV0aG9kOlwiUE9TVFwifTtyZXR1cm4gcz1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBhdXRoUmVmcmVzaChib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCBhdXRoUmVmcmVzaChvcHRpb25zPykuXCIscyxlLHQpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvYXV0aC1yZWZyZXNoXCIscykudGhlbih0aGlzLmF1dGhSZXNwb25zZS5iaW5kKHRoaXMpKX1hc3luYyByZXF1ZXN0UGFzc3dvcmRSZXNldChlLHQscyl7bGV0IGk9e21ldGhvZDpcIlBPU1RcIixib2R5OntlbWFpbDplfX07cmV0dXJuIGk9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgcmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCBvcHRpb25zPykuXCIsaSx0LHMpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvcmVxdWVzdC1wYXNzd29yZC1yZXNldFwiLGkpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIGNvbmZpcm1QYXNzd29yZFJlc2V0KGUsdCxzLGksbil7bGV0IHI9e21ldGhvZDpcIlBPU1RcIixib2R5Ont0b2tlbjplLHBhc3N3b3JkOnQscGFzc3dvcmRDb25maXJtOnN9fTtyZXR1cm4gcj1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBjb25maXJtUGFzc3dvcmRSZXNldChyZXNldFRva2VuLCBwYXNzd29yZCwgcGFzc3dvcmRDb25maXJtLCBib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCBjb25maXJtUGFzc3dvcmRSZXNldChyZXNldFRva2VuLCBwYXNzd29yZCwgcGFzc3dvcmRDb25maXJtLCBvcHRpb25zPykuXCIscixpLG4pLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ3J1ZFBhdGgrXCIvY29uZmlybS1wYXNzd29yZC1yZXNldFwiLHIpLnRoZW4oKCgpPT4hMCkpfX1jb25zdCBuPVtcInJlcXVlc3RLZXlcIixcIiRjYW5jZWxLZXlcIixcIiRhdXRvQ2FuY2VsXCIsXCJmZXRjaFwiLFwiaGVhZGVyc1wiLFwiYm9keVwiLFwicXVlcnlcIixcInBhcmFtc1wiLFwiY2FjaGVcIixcImNyZWRlbnRpYWxzXCIsXCJoZWFkZXJzXCIsXCJpbnRlZ3JpdHlcIixcImtlZXBhbGl2ZVwiLFwibWV0aG9kXCIsXCJtb2RlXCIsXCJyZWRpcmVjdFwiLFwicmVmZXJyZXJcIixcInJlZmVycmVyUG9saWN5XCIsXCJzaWduYWxcIixcIndpbmRvd1wiXTtmdW5jdGlvbiBub3JtYWxpemVVbmtub3duUXVlcnlQYXJhbXMoZSl7aWYoZSl7ZS5xdWVyeT1lLnF1ZXJ5fHx7fTtmb3IobGV0IHQgaW4gZSluLmluY2x1ZGVzKHQpfHwoZS5xdWVyeVt0XT1lW3RdLGRlbGV0ZSBlW3RdKX19Y2xhc3MgUmVhbHRpbWVTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2V7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY2xpZW50SWQ9XCJcIix0aGlzLmV2ZW50U291cmNlPW51bGwsdGhpcy5zdWJzY3JpcHRpb25zPXt9LHRoaXMubGFzdFNlbnRTdWJzY3JpcHRpb25zPVtdLHRoaXMubWF4Q29ubmVjdFRpbWVvdXQ9MTVlMyx0aGlzLnJlY29ubmVjdEF0dGVtcHRzPTAsdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cz0xLzAsdGhpcy5wcmVkZWZpbmVkUmVjb25uZWN0SW50ZXJ2YWxzPVsyMDAsMzAwLDUwMCwxZTMsMTIwMCwxNTAwLDJlM10sdGhpcy5wZW5kaW5nQ29ubmVjdHM9W119Z2V0IGlzQ29ubmVjdGVkKCl7cmV0dXJuISF0aGlzLmV2ZW50U291cmNlJiYhIXRoaXMuY2xpZW50SWQmJiF0aGlzLnBlbmRpbmdDb25uZWN0cy5sZW5ndGh9YXN5bmMgc3Vic2NyaWJlKGUsdCxzKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoXCJ0b3BpYyBtdXN0IGJlIHNldC5cIik7bGV0IGk9ZTtpZihzKXtub3JtYWxpemVVbmtub3duUXVlcnlQYXJhbXMocz1PYmplY3QuYXNzaWduKHt9LHMpKTtjb25zdCBlPVwib3B0aW9ucz1cIitlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe3F1ZXJ5OnMucXVlcnksaGVhZGVyczpzLmhlYWRlcnN9KSk7aSs9KGkuaW5jbHVkZXMoXCI/XCIpP1wiJlwiOlwiP1wiKStlfWNvbnN0IGxpc3RlbmVyPWZ1bmN0aW9uKGUpe2NvbnN0IHM9ZTtsZXQgaTt0cnl7aT1KU09OLnBhcnNlKHM/LmRhdGEpfWNhdGNoe310KGl8fHt9KX07cmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uc1tpXXx8KHRoaXMuc3Vic2NyaXB0aW9uc1tpXT1bXSksdGhpcy5zdWJzY3JpcHRpb25zW2ldLnB1c2gobGlzdGVuZXIpLHRoaXMuaXNDb25uZWN0ZWQ/MT09PXRoaXMuc3Vic2NyaXB0aW9uc1tpXS5sZW5ndGg/YXdhaXQgdGhpcy5zdWJtaXRTdWJzY3JpcHRpb25zKCk6dGhpcy5ldmVudFNvdXJjZT8uYWRkRXZlbnRMaXN0ZW5lcihpLGxpc3RlbmVyKTphd2FpdCB0aGlzLmNvbm5lY3QoKSxhc3luYygpPT50aGlzLnVuc3Vic2NyaWJlQnlUb3BpY0FuZExpc3RlbmVyKGUsbGlzdGVuZXIpfWFzeW5jIHVuc3Vic2NyaWJlKGUpe2xldCB0PSExO2lmKGUpe2NvbnN0IHM9dGhpcy5nZXRTdWJzY3JpcHRpb25zQnlUb3BpYyhlKTtmb3IobGV0IGUgaW4gcylpZih0aGlzLmhhc1N1YnNjcmlwdGlvbkxpc3RlbmVycyhlKSl7Zm9yKGxldCB0IG9mIHRoaXMuc3Vic2NyaXB0aW9uc1tlXSl0aGlzLmV2ZW50U291cmNlPy5yZW1vdmVFdmVudExpc3RlbmVyKGUsdCk7ZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tlXSx0fHwodD0hMCl9fWVsc2UgdGhpcy5zdWJzY3JpcHRpb25zPXt9O3RoaXMuaGFzU3Vic2NyaXB0aW9uTGlzdGVuZXJzKCk/dCYmYXdhaXQgdGhpcy5zdWJtaXRTdWJzY3JpcHRpb25zKCk6dGhpcy5kaXNjb25uZWN0KCl9YXN5bmMgdW5zdWJzY3JpYmVCeVByZWZpeChlKXtsZXQgdD0hMTtmb3IobGV0IHMgaW4gdGhpcy5zdWJzY3JpcHRpb25zKWlmKChzK1wiP1wiKS5zdGFydHNXaXRoKGUpKXt0PSEwO2ZvcihsZXQgZSBvZiB0aGlzLnN1YnNjcmlwdGlvbnNbc10pdGhpcy5ldmVudFNvdXJjZT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGUpO2RlbGV0ZSB0aGlzLnN1YnNjcmlwdGlvbnNbc119dCYmKHRoaXMuaGFzU3Vic2NyaXB0aW9uTGlzdGVuZXJzKCk/YXdhaXQgdGhpcy5zdWJtaXRTdWJzY3JpcHRpb25zKCk6dGhpcy5kaXNjb25uZWN0KCkpfWFzeW5jIHVuc3Vic2NyaWJlQnlUb3BpY0FuZExpc3RlbmVyKGUsdCl7bGV0IHM9ITE7Y29uc3QgaT10aGlzLmdldFN1YnNjcmlwdGlvbnNCeVRvcGljKGUpO2ZvcihsZXQgZSBpbiBpKXtpZighQXJyYXkuaXNBcnJheSh0aGlzLnN1YnNjcmlwdGlvbnNbZV0pfHwhdGhpcy5zdWJzY3JpcHRpb25zW2VdLmxlbmd0aCljb250aW51ZTtsZXQgaT0hMTtmb3IobGV0IHM9dGhpcy5zdWJzY3JpcHRpb25zW2VdLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMuc3Vic2NyaXB0aW9uc1tlXVtzXT09PXQmJihpPSEwLGRlbGV0ZSB0aGlzLnN1YnNjcmlwdGlvbnNbZV1bc10sdGhpcy5zdWJzY3JpcHRpb25zW2VdLnNwbGljZShzLDEpLHRoaXMuZXZlbnRTb3VyY2U/LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KSk7aSYmKHRoaXMuc3Vic2NyaXB0aW9uc1tlXS5sZW5ndGh8fGRlbGV0ZSB0aGlzLnN1YnNjcmlwdGlvbnNbZV0sc3x8dGhpcy5oYXNTdWJzY3JpcHRpb25MaXN0ZW5lcnMoZSl8fChzPSEwKSl9dGhpcy5oYXNTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKT9zJiZhd2FpdCB0aGlzLnN1Ym1pdFN1YnNjcmlwdGlvbnMoKTp0aGlzLmRpc2Nvbm5lY3QoKX1oYXNTdWJzY3JpcHRpb25MaXN0ZW5lcnMoZSl7aWYodGhpcy5zdWJzY3JpcHRpb25zPXRoaXMuc3Vic2NyaXB0aW9uc3x8e30sZSlyZXR1cm4hIXRoaXMuc3Vic2NyaXB0aW9uc1tlXT8ubGVuZ3RoO2ZvcihsZXQgZSBpbiB0aGlzLnN1YnNjcmlwdGlvbnMpaWYodGhpcy5zdWJzY3JpcHRpb25zW2VdPy5sZW5ndGgpcmV0dXJuITA7cmV0dXJuITF9YXN5bmMgc3VibWl0U3Vic2NyaXB0aW9ucygpe2lmKHRoaXMuY2xpZW50SWQpcmV0dXJuIHRoaXMuYWRkQWxsU3Vic2NyaXB0aW9uTGlzdGVuZXJzKCksdGhpcy5sYXN0U2VudFN1YnNjcmlwdGlvbnM9dGhpcy5nZXROb25FbXB0eVN1YnNjcmlwdGlvbktleXMoKSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9yZWFsdGltZVwiLHttZXRob2Q6XCJQT1NUXCIsYm9keTp7Y2xpZW50SWQ6dGhpcy5jbGllbnRJZCxzdWJzY3JpcHRpb25zOnRoaXMubGFzdFNlbnRTdWJzY3JpcHRpb25zfSxyZXF1ZXN0S2V5OnRoaXMuZ2V0U3Vic2NyaXB0aW9uc0NhbmNlbEtleSgpfSkuY2F0Y2goKGU9PntpZighZT8uaXNBYm9ydCl0aHJvdyBlfSkpfWdldFN1YnNjcmlwdGlvbnNDYW5jZWxLZXkoKXtyZXR1cm5cInJlYWx0aW1lX1wiK3RoaXMuY2xpZW50SWR9Z2V0U3Vic2NyaXB0aW9uc0J5VG9waWMoZSl7Y29uc3QgdD17fTtlPWUuaW5jbHVkZXMoXCI/XCIpP2U6ZStcIj9cIjtmb3IobGV0IHMgaW4gdGhpcy5zdWJzY3JpcHRpb25zKShzK1wiP1wiKS5zdGFydHNXaXRoKGUpJiYodFtzXT10aGlzLnN1YnNjcmlwdGlvbnNbc10pO3JldHVybiB0fWdldE5vbkVtcHR5U3Vic2NyaXB0aW9uS2V5cygpe2NvbnN0IGU9W107Zm9yKGxldCB0IGluIHRoaXMuc3Vic2NyaXB0aW9ucyl0aGlzLnN1YnNjcmlwdGlvbnNbdF0ubGVuZ3RoJiZlLnB1c2godCk7cmV0dXJuIGV9YWRkQWxsU3Vic2NyaXB0aW9uTGlzdGVuZXJzKCl7aWYodGhpcy5ldmVudFNvdXJjZSl7dGhpcy5yZW1vdmVBbGxTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKTtmb3IobGV0IGUgaW4gdGhpcy5zdWJzY3JpcHRpb25zKWZvcihsZXQgdCBvZiB0aGlzLnN1YnNjcmlwdGlvbnNbZV0pdGhpcy5ldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKGUsdCl9fXJlbW92ZUFsbFN1YnNjcmlwdGlvbkxpc3RlbmVycygpe2lmKHRoaXMuZXZlbnRTb3VyY2UpZm9yKGxldCBlIGluIHRoaXMuc3Vic2NyaXB0aW9ucylmb3IobGV0IHQgb2YgdGhpcy5zdWJzY3JpcHRpb25zW2VdKXRoaXMuZXZlbnRTb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfWFzeW5jIGNvbm5lY3QoKXtpZighKHRoaXMucmVjb25uZWN0QXR0ZW1wdHM+MCkpcmV0dXJuIG5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMucGVuZGluZ0Nvbm5lY3RzLnB1c2goe3Jlc29sdmU6ZSxyZWplY3Q6dH0pLHRoaXMucGVuZGluZ0Nvbm5lY3RzLmxlbmd0aD4xfHx0aGlzLmluaXRDb25uZWN0KCl9KSl9aW5pdENvbm5lY3QoKXt0aGlzLmRpc2Nvbm5lY3QoITApLGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lb3V0SWQpLHRoaXMuY29ubmVjdFRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuY29ubmVjdEVycm9ySGFuZGxlcihuZXcgRXJyb3IoXCJFdmVudFNvdXJjZSBjb25uZWN0IHRvb2sgdG9vIGxvbmcuXCIpKX0pLHRoaXMubWF4Q29ubmVjdFRpbWVvdXQpLHRoaXMuZXZlbnRTb3VyY2U9bmV3IEV2ZW50U291cmNlKHRoaXMuY2xpZW50LmJ1aWxkVXJsKFwiL2FwaS9yZWFsdGltZVwiKSksdGhpcy5ldmVudFNvdXJjZS5vbmVycm9yPWU9Pnt0aGlzLmNvbm5lY3RFcnJvckhhbmRsZXIobmV3IEVycm9yKFwiRmFpbGVkIHRvIGVzdGFibGlzaCByZWFsdGltZSBjb25uZWN0aW9uLlwiKSl9LHRoaXMuZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcIlBCX0NPTk5FQ1RcIiwoZT0+e2NvbnN0IHQ9ZTt0aGlzLmNsaWVudElkPXQ/Lmxhc3RFdmVudElkLHRoaXMuc3VibWl0U3Vic2NyaXB0aW9ucygpLnRoZW4oKGFzeW5jKCk9PntsZXQgZT0zO2Zvcig7dGhpcy5oYXNVbnNlbnRTdWJzY3JpcHRpb25zKCkmJmU+MDspZS0tLGF3YWl0IHRoaXMuc3VibWl0U3Vic2NyaXB0aW9ucygpfSkpLnRoZW4oKCgpPT57Zm9yKGxldCBlIG9mIHRoaXMucGVuZGluZ0Nvbm5lY3RzKWUucmVzb2x2ZSgpO3RoaXMucGVuZGluZ0Nvbm5lY3RzPVtdLHRoaXMucmVjb25uZWN0QXR0ZW1wdHM9MCxjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lb3V0SWQpLGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lb3V0SWQpO2NvbnN0IHQ9dGhpcy5nZXRTdWJzY3JpcHRpb25zQnlUb3BpYyhcIlBCX0NPTk5FQ1RcIik7Zm9yKGxldCBzIGluIHQpZm9yKGxldCBpIG9mIHRbc10paShlKX0pKS5jYXRjaCgoZT0+e3RoaXMuY2xpZW50SWQ9XCJcIix0aGlzLmNvbm5lY3RFcnJvckhhbmRsZXIoZSl9KSl9KSl9aGFzVW5zZW50U3Vic2NyaXB0aW9ucygpe2NvbnN0IGU9dGhpcy5nZXROb25FbXB0eVN1YnNjcmlwdGlvbktleXMoKTtpZihlLmxlbmd0aCE9dGhpcy5sYXN0U2VudFN1YnNjcmlwdGlvbnMubGVuZ3RoKXJldHVybiEwO2Zvcihjb25zdCB0IG9mIGUpaWYoIXRoaXMubGFzdFNlbnRTdWJzY3JpcHRpb25zLmluY2x1ZGVzKHQpKXJldHVybiEwO3JldHVybiExfWNvbm5lY3RFcnJvckhhbmRsZXIoZSl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVvdXRJZCksY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZW91dElkKSwhdGhpcy5jbGllbnRJZCYmIXRoaXMucmVjb25uZWN0QXR0ZW1wdHN8fHRoaXMucmVjb25uZWN0QXR0ZW1wdHM+dGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cyl7Zm9yKGxldCB0IG9mIHRoaXMucGVuZGluZ0Nvbm5lY3RzKXQucmVqZWN0KG5ldyBDbGllbnRSZXNwb25zZUVycm9yKGUpKTtyZXR1cm4gdGhpcy5wZW5kaW5nQ29ubmVjdHM9W10sdm9pZCB0aGlzLmRpc2Nvbm5lY3QoKX10aGlzLmRpc2Nvbm5lY3QoITApO2NvbnN0IHQ9dGhpcy5wcmVkZWZpbmVkUmVjb25uZWN0SW50ZXJ2YWxzW3RoaXMucmVjb25uZWN0QXR0ZW1wdHNdfHx0aGlzLnByZWRlZmluZWRSZWNvbm5lY3RJbnRlcnZhbHNbdGhpcy5wcmVkZWZpbmVkUmVjb25uZWN0SW50ZXJ2YWxzLmxlbmd0aC0xXTt0aGlzLnJlY29ubmVjdEF0dGVtcHRzKyssdGhpcy5yZWNvbm5lY3RUaW1lb3V0SWQ9c2V0VGltZW91dCgoKCk9Pnt0aGlzLmluaXRDb25uZWN0KCl9KSx0KX1kaXNjb25uZWN0KGU9ITEpe2lmKGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lb3V0SWQpLGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVvdXRJZCksdGhpcy5yZW1vdmVBbGxTdWJzY3JpcHRpb25MaXN0ZW5lcnMoKSx0aGlzLmNsaWVudC5jYW5jZWxSZXF1ZXN0KHRoaXMuZ2V0U3Vic2NyaXB0aW9uc0NhbmNlbEtleSgpKSx0aGlzLmV2ZW50U291cmNlPy5jbG9zZSgpLHRoaXMuZXZlbnRTb3VyY2U9bnVsbCx0aGlzLmNsaWVudElkPVwiXCIsIWUpe3RoaXMucmVjb25uZWN0QXR0ZW1wdHM9MDtmb3IobGV0IGUgb2YgdGhpcy5wZW5kaW5nQ29ubmVjdHMpZS5yZXNvbHZlKCk7dGhpcy5wZW5kaW5nQ29ubmVjdHM9W119fX1jbGFzcyBSZWNvcmRTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2V7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlKSx0aGlzLmNvbGxlY3Rpb25JZE9yTmFtZT10fWdldCBiYXNlQ3J1ZFBhdGgoKXtyZXR1cm4gdGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvcmVjb3Jkc1wifWdldCBiYXNlQ29sbGVjdGlvblBhdGgoKXtyZXR1cm5cIi9hcGkvY29sbGVjdGlvbnMvXCIrZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY29sbGVjdGlvbklkT3JOYW1lKX1hc3luYyBzdWJzY3JpYmUoZSx0LHMpe2lmKCFlKXRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdG9waWMuXCIpO2lmKCF0KXRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgc3Vic2NyaXB0aW9uIGNhbGxiYWNrLlwiKTtyZXR1cm4gdGhpcy5jbGllbnQucmVhbHRpbWUuc3Vic2NyaWJlKHRoaXMuY29sbGVjdGlvbklkT3JOYW1lK1wiL1wiK2UsdCxzKX1hc3luYyB1bnN1YnNjcmliZShlKXtyZXR1cm4gZT90aGlzLmNsaWVudC5yZWFsdGltZS51bnN1YnNjcmliZSh0aGlzLmNvbGxlY3Rpb25JZE9yTmFtZStcIi9cIitlKTp0aGlzLmNsaWVudC5yZWFsdGltZS51bnN1YnNjcmliZUJ5UHJlZml4KHRoaXMuY29sbGVjdGlvbklkT3JOYW1lKX1hc3luYyBnZXRGdWxsTGlzdChlLHQpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXJldHVybiBzdXBlci5nZXRGdWxsTGlzdChlLHQpO2NvbnN0IHM9T2JqZWN0LmFzc2lnbih7fSxlLHQpO3JldHVybiBzdXBlci5nZXRGdWxsTGlzdChzKX1hc3luYyBnZXRMaXN0KGU9MSx0PTMwLHMpe3JldHVybiBzdXBlci5nZXRMaXN0KGUsdCxzKX1hc3luYyBnZXRGaXJzdExpc3RJdGVtKGUsdCl7cmV0dXJuIHN1cGVyLmdldEZpcnN0TGlzdEl0ZW0oZSx0KX1hc3luYyBnZXRPbmUoZSx0KXtyZXR1cm4gc3VwZXIuZ2V0T25lKGUsdCl9YXN5bmMgY3JlYXRlKGUsdCl7cmV0dXJuIHN1cGVyLmNyZWF0ZShlLHQpfWFzeW5jIHVwZGF0ZShlLHQscyl7cmV0dXJuIHN1cGVyLnVwZGF0ZShlLHQscykudGhlbigoZT0+KHRoaXMuY2xpZW50LmF1dGhTdG9yZS5tb2RlbD8uaWQhPT1lPy5pZHx8dGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5jb2xsZWN0aW9uSWQhPT10aGlzLmNvbGxlY3Rpb25JZE9yTmFtZSYmdGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5jb2xsZWN0aW9uTmFtZSE9PXRoaXMuY29sbGVjdGlvbklkT3JOYW1lfHx0aGlzLmNsaWVudC5hdXRoU3RvcmUuc2F2ZSh0aGlzLmNsaWVudC5hdXRoU3RvcmUudG9rZW4sZSksZSkpKX1hc3luYyBkZWxldGUoZSx0KXtyZXR1cm4gc3VwZXIuZGVsZXRlKGUsdCkudGhlbigodD0+KCF0fHx0aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw/LmlkIT09ZXx8dGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5jb2xsZWN0aW9uSWQhPT10aGlzLmNvbGxlY3Rpb25JZE9yTmFtZSYmdGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsPy5jb2xsZWN0aW9uTmFtZSE9PXRoaXMuY29sbGVjdGlvbklkT3JOYW1lfHx0aGlzLmNsaWVudC5hdXRoU3RvcmUuY2xlYXIoKSx0KSkpfWF1dGhSZXNwb25zZShlKXtjb25zdCB0PXRoaXMuZGVjb2RlKGU/LnJlY29yZHx8e30pO3JldHVybiB0aGlzLmNsaWVudC5hdXRoU3RvcmUuc2F2ZShlPy50b2tlbix0KSxPYmplY3QuYXNzaWduKHt9LGUse3Rva2VuOmU/LnRva2VufHxcIlwiLHJlY29yZDp0fSl9YXN5bmMgbGlzdEF1dGhNZXRob2RzKGUpe3JldHVybiBlPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSxlKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL2F1dGgtbWV0aG9kc1wiLGUpLnRoZW4oKGU9Pk9iamVjdC5hc3NpZ24oe30sZSx7dXNlcm5hbWVQYXNzd29yZDohIWU/LnVzZXJuYW1lUGFzc3dvcmQsZW1haWxQYXNzd29yZDohIWU/LmVtYWlsUGFzc3dvcmQsYXV0aFByb3ZpZGVyczpBcnJheS5pc0FycmF5KGU/LmF1dGhQcm92aWRlcnMpP2U/LmF1dGhQcm92aWRlcnM6W119KSkpfWFzeW5jIGF1dGhXaXRoUGFzc3dvcmQoZSx0LHMsaSl7bGV0IG49e21ldGhvZDpcIlBPU1RcIixib2R5OntpZGVudGl0eTplLHBhc3N3b3JkOnR9fTtyZXR1cm4gbj1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBhdXRoV2l0aFBhc3N3b3JkKHVzZXJuYW1lT3JFbWFpbCwgcGFzcywgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggYXV0aFdpdGhQYXNzd29yZCh1c2VybmFtZU9yRW1haWwsIHBhc3MsIG9wdGlvbnM/KS5cIixuLHMsaSksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9hdXRoLXdpdGgtcGFzc3dvcmRcIixuKS50aGVuKChlPT50aGlzLmF1dGhSZXNwb25zZShlKSkpfWFzeW5jIGF1dGhXaXRoT0F1dGgyQ29kZShlLHQscyxpLG4scixvKXtsZXQgYT17bWV0aG9kOlwiUE9TVFwiLGJvZHk6e3Byb3ZpZGVyOmUsY29kZTp0LGNvZGVWZXJpZmllcjpzLHJlZGlyZWN0VXJsOmksY3JlYXRlRGF0YTpufX07cmV0dXJuIGE9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgYXV0aFdpdGhPQXV0aDJDb2RlKHByb3ZpZGVyLCBjb2RlLCBjb2RlVmVyaWZpZXIsIHJlZGlyZWN0VXJsLCBjcmVhdGVEYXRhPywgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggYXV0aFdpdGhPQXV0aDJDb2RlKHByb3ZpZGVyLCBjb2RlLCBjb2RlVmVyaWZpZXIsIHJlZGlyZWN0VXJsLCBjcmVhdGVEYXRhPywgb3B0aW9ucz8pLlwiLGEscixvKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL2F1dGgtd2l0aC1vYXV0aDJcIixhKS50aGVuKChlPT50aGlzLmF1dGhSZXNwb25zZShlKSkpfWF1dGhXaXRoT0F1dGgyKC4uLmUpe2lmKGUubGVuZ3RoPjF8fFwic3RyaW5nXCI9PXR5cGVvZiBlPy5bMF0pcmV0dXJuIGNvbnNvbGUud2FybihcIlBvY2tldEJhc2U6IFRoaXMgZm9ybSBvZiBhdXRoV2l0aE9BdXRoMigpIGlzIGRlcHJlY2F0ZWQgYW5kIG1heSBnZXQgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBQbGVhc2UgcmVwbGFjZSB3aXRoIGF1dGhXaXRoT0F1dGgyQ29kZSgpIE9SIHVzZSB0aGUgYXV0aFdpdGhPQXV0aDIoKSByZWFsdGltZSBmb3JtIGFzIHNob3duIGluIGh0dHBzOi8vcG9ja2V0YmFzZS5pby9kb2NzL2F1dGhlbnRpY2F0aW9uLyNvYXV0aDItaW50ZWdyYXRpb24uXCIpLHRoaXMuYXV0aFdpdGhPQXV0aDJDb2RlKGU/LlswXXx8XCJcIixlPy5bMV18fFwiXCIsZT8uWzJdfHxcIlwiLGU/LlszXXx8XCJcIixlPy5bNF18fHt9LGU/Lls1XXx8e30sZT8uWzZdfHx7fSk7Y29uc3QgdD1lPy5bMF18fHt9O2xldCBzPW51bGw7dC51cmxDYWxsYmFja3x8KHM9b3BlbkJyb3dzZXJQb3B1cCh2b2lkIDApKTtjb25zdCBpPW5ldyBSZWFsdGltZVNlcnZpY2UodGhpcy5jbGllbnQpO2Z1bmN0aW9uIGNsZWFudXAoKXtzPy5jbG9zZSgpLGkudW5zdWJzY3JpYmUoKX1jb25zdCBuPXt9LHI9dC5yZXF1ZXN0S2V5O3JldHVybiByJiYobi5yZXF1ZXN0S2V5PXIpLHRoaXMubGlzdEF1dGhNZXRob2RzKG4pLnRoZW4oKGU9Pntjb25zdCBuPWUuYXV0aFByb3ZpZGVycy5maW5kKChlPT5lLm5hbWU9PT10LnByb3ZpZGVyKSk7aWYoIW4pdGhyb3cgbmV3IENsaWVudFJlc3BvbnNlRXJyb3IobmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgcHJvdmlkZXIgXCIke3QucHJvdmlkZXJ9XCIuYCkpO2NvbnN0IG89dGhpcy5jbGllbnQuYnVpbGRVcmwoXCIvYXBpL29hdXRoMi1yZWRpcmVjdFwiKSxhPXI/dGhpcy5jbGllbnQuY2FuY2VsQ29udHJvbGxlcnM/LltyXTp2b2lkIDA7cmV0dXJuIGEmJihhLnNpZ25hbC5vbmFib3J0PSgpPT57Y2xlYW51cCgpfSksbmV3IFByb21pc2UoKGFzeW5jKGUscik9Pnt0cnl7YXdhaXQgaS5zdWJzY3JpYmUoXCJAb2F1dGgyXCIsKGFzeW5jIHM9Pntjb25zdCBjPWkuY2xpZW50SWQ7dHJ5e2lmKCFzLnN0YXRlfHxjIT09cy5zdGF0ZSl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0ZSBwYXJhbWV0ZXJzIGRvbid0IG1hdGNoLlwiKTtpZihzLmVycm9yfHwhcy5jb2RlKXRocm93IG5ldyBFcnJvcihcIk9BdXRoMiByZWRpcmVjdCBlcnJvciBvciBtaXNzaW5nIGNvZGU6IFwiK3MuZXJyb3IpO2NvbnN0IGk9T2JqZWN0LmFzc2lnbih7fSx0KTtkZWxldGUgaS5wcm92aWRlcixkZWxldGUgaS5zY29wZXMsZGVsZXRlIGkuY3JlYXRlRGF0YSxkZWxldGUgaS51cmxDYWxsYmFjayxhPy5zaWduYWw/Lm9uYWJvcnQmJihhLnNpZ25hbC5vbmFib3J0PW51bGwpO2NvbnN0IHI9YXdhaXQgdGhpcy5hdXRoV2l0aE9BdXRoMkNvZGUobi5uYW1lLHMuY29kZSxuLmNvZGVWZXJpZmllcixvLHQuY3JlYXRlRGF0YSxpKTtlKHIpfWNhdGNoKGUpe3IobmV3IENsaWVudFJlc3BvbnNlRXJyb3IoZSkpfWNsZWFudXAoKX0pKTtjb25zdCBjPXtzdGF0ZTppLmNsaWVudElkfTt0LnNjb3Blcz8ubGVuZ3RoJiYoYy5zY29wZT10LnNjb3Blcy5qb2luKFwiIFwiKSk7Y29uc3QgbD10aGlzLl9yZXBsYWNlUXVlcnlQYXJhbXMobi5hdXRoVXJsK28sYyk7bGV0IGg9dC51cmxDYWxsYmFja3x8ZnVuY3Rpb24oZSl7cz9zLmxvY2F0aW9uLmhyZWY9ZTpzPW9wZW5Ccm93c2VyUG9wdXAoZSl9O2F3YWl0IGgobCl9Y2F0Y2goZSl7Y2xlYW51cCgpLHIobmV3IENsaWVudFJlc3BvbnNlRXJyb3IoZSkpfX0pKX0pKS5jYXRjaCgoZT0+e3Rocm93IGNsZWFudXAoKSxlfSkpfWFzeW5jIGF1dGhSZWZyZXNoKGUsdCl7bGV0IHM9e21ldGhvZDpcIlBPU1RcIn07cmV0dXJuIHM9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgYXV0aFJlZnJlc2goYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggYXV0aFJlZnJlc2gob3B0aW9ucz8pLlwiLHMsZSx0KSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL2F1dGgtcmVmcmVzaFwiLHMpLnRoZW4oKGU9PnRoaXMuYXV0aFJlc3BvbnNlKGUpKSl9YXN5bmMgcmVxdWVzdFBhc3N3b3JkUmVzZXQoZSx0LHMpe2xldCBpPXttZXRob2Q6XCJQT1NUXCIsYm9keTp7ZW1haWw6ZX19O3JldHVybiBpPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCBib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCByZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgb3B0aW9ucz8pLlwiLGksdCxzKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNvbGxlY3Rpb25QYXRoK1wiL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXRcIixpKS50aGVuKCgoKT0+ITApKX1hc3luYyBjb25maXJtUGFzc3dvcmRSZXNldChlLHQscyxpLG4pe2xldCByPXttZXRob2Q6XCJQT1NUXCIsYm9keTp7dG9rZW46ZSxwYXNzd29yZDp0LHBhc3N3b3JkQ29uZmlybTpzfX07cmV0dXJuIHI9bm9ybWFsaXplTGVnYWN5T3B0aW9uc0FyZ3MoXCJUaGlzIGZvcm0gb2YgY29uZmlybVBhc3N3b3JkUmVzZXQodG9rZW4sIHBhc3N3b3JkLCBwYXNzd29yZENvbmZpcm0sIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGNvbmZpcm1QYXNzd29yZFJlc2V0KHRva2VuLCBwYXNzd29yZCwgcGFzc3dvcmRDb25maXJtLCBvcHRpb25zPykuXCIscixpLG4pLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvY29uZmlybS1wYXNzd29yZC1yZXNldFwiLHIpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIHJlcXVlc3RWZXJpZmljYXRpb24oZSx0LHMpe2xldCBpPXttZXRob2Q6XCJQT1NUXCIsYm9keTp7ZW1haWw6ZX19O3JldHVybiBpPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIHJlcXVlc3RWZXJpZmljYXRpb24oZW1haWwsIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIHJlcXVlc3RWZXJpZmljYXRpb24oZW1haWwsIG9wdGlvbnM/KS5cIixpLHQscyksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9yZXF1ZXN0LXZlcmlmaWNhdGlvblwiLGkpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIGNvbmZpcm1WZXJpZmljYXRpb24oZSx0LHMpe2xldCBpPXttZXRob2Q6XCJQT1NUXCIsYm9keTp7dG9rZW46ZX19O3JldHVybiBpPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIGNvbmZpcm1WZXJpZmljYXRpb24odG9rZW4sIGJvZHk/LCBxdWVyeT8pIGlzIGRlcHJlY2F0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyBpdCB3aXRoIGNvbmZpcm1WZXJpZmljYXRpb24odG9rZW4sIG9wdGlvbnM/KS5cIixpLHQscyksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDb2xsZWN0aW9uUGF0aCtcIi9jb25maXJtLXZlcmlmaWNhdGlvblwiLGkpLnRoZW4oKCgpPT57Y29uc3QgdD1nZXRUb2tlblBheWxvYWQoZSkscz10aGlzLmNsaWVudC5hdXRoU3RvcmUubW9kZWw7cmV0dXJuIHMmJiFzLnZlcmlmaWVkJiZzLmlkPT09dC5pZCYmcy5jb2xsZWN0aW9uSWQ9PT10LmNvbGxlY3Rpb25JZCYmKHMudmVyaWZpZWQ9ITAsdGhpcy5jbGllbnQuYXV0aFN0b3JlLnNhdmUodGhpcy5jbGllbnQuYXV0aFN0b3JlLnRva2VuLHMpKSwhMH0pKX1hc3luYyByZXF1ZXN0RW1haWxDaGFuZ2UoZSx0LHMpe2xldCBpPXttZXRob2Q6XCJQT1NUXCIsYm9keTp7bmV3RW1haWw6ZX19O3JldHVybiBpPW5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnNBcmdzKFwiVGhpcyBmb3JtIG9mIHJlcXVlc3RFbWFpbENoYW5nZShuZXdFbWFpbCwgYm9keT8sIHF1ZXJ5PykgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggcmVxdWVzdEVtYWlsQ2hhbmdlKG5ld0VtYWlsLCBvcHRpb25zPykuXCIsaSx0LHMpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvcmVxdWVzdC1lbWFpbC1jaGFuZ2VcIixpKS50aGVuKCgoKT0+ITApKX1hc3luYyBjb25maXJtRW1haWxDaGFuZ2UoZSx0LHMsaSl7bGV0IG49e21ldGhvZDpcIlBPU1RcIixib2R5Ont0b2tlbjplLHBhc3N3b3JkOnR9fTtyZXR1cm4gbj1ub3JtYWxpemVMZWdhY3lPcHRpb25zQXJncyhcIlRoaXMgZm9ybSBvZiBjb25maXJtRW1haWxDaGFuZ2UodG9rZW4sIHBhc3N3b3JkLCBib2R5PywgcXVlcnk/KSBpcyBkZXByZWNhdGVkLiBDb25zaWRlciByZXBsYWNpbmcgaXQgd2l0aCBjb25maXJtRW1haWxDaGFuZ2UodG9rZW4sIHBhc3N3b3JkLCBvcHRpb25zPykuXCIsbixzLGkpLHRoaXMuY2xpZW50LnNlbmQodGhpcy5iYXNlQ29sbGVjdGlvblBhdGgrXCIvY29uZmlybS1lbWFpbC1jaGFuZ2VcIixuKS50aGVuKCgoKT0+e2NvbnN0IHQ9Z2V0VG9rZW5QYXlsb2FkKGUpLHM9dGhpcy5jbGllbnQuYXV0aFN0b3JlLm1vZGVsO3JldHVybiBzJiZzLmlkPT09dC5pZCYmcy5jb2xsZWN0aW9uSWQ9PT10LmNvbGxlY3Rpb25JZCYmdGhpcy5jbGllbnQuYXV0aFN0b3JlLmNsZWFyKCksITB9KSl9YXN5bmMgbGlzdEV4dGVybmFsQXV0aHMoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0sdCksdGhpcy5jbGllbnQuc2VuZCh0aGlzLmJhc2VDcnVkUGF0aCtcIi9cIitlbmNvZGVVUklDb21wb25lbnQoZSkrXCIvZXh0ZXJuYWwtYXV0aHNcIix0KX1hc3luYyB1bmxpbmtFeHRlcm5hbEF1dGgoZSx0LHMpe3JldHVybiBzPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkRFTEVURVwifSxzKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNydWRQYXRoK1wiL1wiK2VuY29kZVVSSUNvbXBvbmVudChlKStcIi9leHRlcm5hbC1hdXRocy9cIitlbmNvZGVVUklDb21wb25lbnQodCkscykudGhlbigoKCk9PiEwKSl9X3JlcGxhY2VRdWVyeVBhcmFtcyhlLHQ9e30pe2xldCBzPWUsaT1cIlwiO2UuaW5kZXhPZihcIj9cIik+PTAmJihzPWUuc3Vic3RyaW5nKDAsZS5pbmRleE9mKFwiP1wiKSksaT1lLnN1YnN0cmluZyhlLmluZGV4T2YoXCI/XCIpKzEpKTtjb25zdCBuPXt9LHI9aS5zcGxpdChcIiZcIik7Zm9yKGNvbnN0IGUgb2Ygcil7aWYoXCJcIj09ZSljb250aW51ZTtjb25zdCB0PWUuc3BsaXQoXCI9XCIpO25bZGVjb2RlVVJJQ29tcG9uZW50KHRbMF0ucmVwbGFjZSgvXFwrL2csXCIgXCIpKV09ZGVjb2RlVVJJQ29tcG9uZW50KCh0WzFdfHxcIlwiKS5yZXBsYWNlKC9cXCsvZyxcIiBcIikpfWZvcihsZXQgZSBpbiB0KXQuaGFzT3duUHJvcGVydHkoZSkmJihudWxsPT10W2VdP2RlbGV0ZSBuW2VdOm5bZV09dFtlXSk7aT1cIlwiO2ZvcihsZXQgZSBpbiBuKW4uaGFzT3duUHJvcGVydHkoZSkmJihcIlwiIT1pJiYoaSs9XCImXCIpLGkrPWVuY29kZVVSSUNvbXBvbmVudChlLnJlcGxhY2UoLyUyMC9nLFwiK1wiKSkrXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KG5bZV0ucmVwbGFjZSgvJTIwL2csXCIrXCIpKSk7cmV0dXJuXCJcIiE9aT9zK1wiP1wiK2k6c319ZnVuY3Rpb24gb3BlbkJyb3dzZXJQb3B1cChlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2Ygd2luZG93fHwhd2luZG93Py5vcGVuKXRocm93IG5ldyBDbGllbnRSZXNwb25zZUVycm9yKG5ldyBFcnJvcihcIk5vdCBpbiBhIGJyb3dzZXIgY29udGV4dCAtIHBsZWFzZSBwYXNzIGEgY3VzdG9tIHVybENhbGxiYWNrIGZ1bmN0aW9uLlwiKSk7bGV0IHQ9MTAyNCxzPTc2OCxpPXdpbmRvdy5pbm5lcldpZHRoLG49d2luZG93LmlubmVySGVpZ2h0O3Q9dD5pP2k6dCxzPXM+bj9uOnM7bGV0IHI9aS8yLXQvMixvPW4vMi1zLzI7cmV0dXJuIHdpbmRvdy5vcGVuKGUsXCJwb3B1cF93aW5kb3dcIixcIndpZHRoPVwiK3QrXCIsaGVpZ2h0PVwiK3MrXCIsdG9wPVwiK28rXCIsbGVmdD1cIityK1wiLHJlc2l6YWJsZSxtZW51YmFyPW5vXCIpfWNsYXNzIENvbGxlY3Rpb25TZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2V7Z2V0IGJhc2VDcnVkUGF0aCgpe3JldHVyblwiL2FwaS9jb2xsZWN0aW9uc1wifWFzeW5jIGltcG9ydChlLHQ9ITEscyl7cmV0dXJuIHM9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiUFVUXCIsYm9keTp7Y29sbGVjdGlvbnM6ZSxkZWxldGVNaXNzaW5nOnR9fSxzKSx0aGlzLmNsaWVudC5zZW5kKHRoaXMuYmFzZUNydWRQYXRoK1wiL2ltcG9ydFwiLHMpLnRoZW4oKCgpPT4hMCkpfX1jbGFzcyBMb2dTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2V7YXN5bmMgZ2V0TGlzdChlPTEsdD0zMCxzKXtyZXR1cm4ocz1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0scykpLnF1ZXJ5PU9iamVjdC5hc3NpZ24oe3BhZ2U6ZSxwZXJQYWdlOnR9LHMucXVlcnkpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2xvZ3NcIixzKX1hc3luYyBnZXRPbmUoZSx0KXtpZighZSl0aHJvdyBuZXcgQ2xpZW50UmVzcG9uc2VFcnJvcih7dXJsOnRoaXMuY2xpZW50LmJ1aWxkVXJsKFwiL2FwaS9sb2dzL1wiKSxzdGF0dXM6NDA0LHJlc3BvbnNlOntjb2RlOjQwNCxtZXNzYWdlOlwiTWlzc2luZyByZXF1aXJlZCBsb2cgaWQuXCIsZGF0YTp7fX19KTtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJHRVRcIn0sdCksdGhpcy5jbGllbnQuc2VuZChcIi9hcGkvbG9ncy9cIitlbmNvZGVVUklDb21wb25lbnQoZSksdCl9YXN5bmMgZ2V0U3RhdHMoZSl7cmV0dXJuIGU9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LGUpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2xvZ3Mvc3RhdHNcIixlKX19Y2xhc3MgSGVhbHRoU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNle2FzeW5jIGNoZWNrKGUpe3JldHVybiBlPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSxlKSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9oZWFsdGhcIixlKX19Y2xhc3MgRmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZXtnZXRVcmwoZSx0LHM9e30pe2lmKCF0fHwhZT8uaWR8fCFlPy5jb2xsZWN0aW9uSWQmJiFlPy5jb2xsZWN0aW9uTmFtZSlyZXR1cm5cIlwiO2NvbnN0IGk9W107aS5wdXNoKFwiYXBpXCIpLGkucHVzaChcImZpbGVzXCIpLGkucHVzaChlbmNvZGVVUklDb21wb25lbnQoZS5jb2xsZWN0aW9uSWR8fGUuY29sbGVjdGlvbk5hbWUpKSxpLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGUuaWQpKSxpLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHQpKTtsZXQgbj10aGlzLmNsaWVudC5idWlsZFVybChpLmpvaW4oXCIvXCIpKTtpZihPYmplY3Qua2V5cyhzKS5sZW5ndGgpeyExPT09cy5kb3dubG9hZCYmZGVsZXRlIHMuZG93bmxvYWQ7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zKHMpO24rPShuLmluY2x1ZGVzKFwiP1wiKT9cIiZcIjpcIj9cIikrZX1yZXR1cm4gbn1hc3luYyBnZXRUb2tlbihlKXtyZXR1cm4gZT1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCJ9LGUpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2ZpbGVzL3Rva2VuXCIsZSkudGhlbigoZT0+ZT8udG9rZW58fFwiXCIpKX19Y2xhc3MgQmFja3VwU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNle2FzeW5jIGdldEZ1bGxMaXN0KGUpe3JldHVybiBlPU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkdFVFwifSxlKSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9iYWNrdXBzXCIsZSl9YXN5bmMgY3JlYXRlKGUsdCl7cmV0dXJuIHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiUE9TVFwiLGJvZHk6e25hbWU6ZX19LHQpLHRoaXMuY2xpZW50LnNlbmQoXCIvYXBpL2JhY2t1cHNcIix0KS50aGVuKCgoKT0+ITApKX1hc3luYyB1cGxvYWQoZSx0KXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHttZXRob2Q6XCJQT1NUXCIsYm9keTplfSx0KSx0aGlzLmNsaWVudC5zZW5kKFwiL2FwaS9iYWNrdXBzL3VwbG9hZFwiLHQpLnRoZW4oKCgpPT4hMCkpfWFzeW5jIGRlbGV0ZShlLHQpe3JldHVybiB0PU9iamVjdC5hc3NpZ24oe21ldGhvZDpcIkRFTEVURVwifSx0KSx0aGlzLmNsaWVudC5zZW5kKGAvYXBpL2JhY2t1cHMvJHtlbmNvZGVVUklDb21wb25lbnQoZSl9YCx0KS50aGVuKCgoKT0+ITApKX1hc3luYyByZXN0b3JlKGUsdCl7cmV0dXJuIHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiUE9TVFwifSx0KSx0aGlzLmNsaWVudC5zZW5kKGAvYXBpL2JhY2t1cHMvJHtlbmNvZGVVUklDb21wb25lbnQoZSl9L3Jlc3RvcmVgLHQpLnRoZW4oKCgpPT4hMCkpfWdldERvd25sb2FkVXJsKGUsdCl7cmV0dXJuIHRoaXMuY2xpZW50LmJ1aWxkVXJsKGAvYXBpL2JhY2t1cHMvJHtlbmNvZGVVUklDb21wb25lbnQodCl9P3Rva2VuPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWApfX1jbGFzcyBDbGllbnR7Y29uc3RydWN0b3IoZT1cIi9cIix0LHM9XCJlbi1VU1wiKXt0aGlzLmNhbmNlbENvbnRyb2xsZXJzPXt9LHRoaXMucmVjb3JkU2VydmljZXM9e30sdGhpcy5lbmFibGVBdXRvQ2FuY2VsbGF0aW9uPSEwLHRoaXMuYmFzZVVybD1lLHRoaXMubGFuZz1zLHRoaXMuYXV0aFN0b3JlPXR8fG5ldyBMb2NhbEF1dGhTdG9yZSx0aGlzLmFkbWlucz1uZXcgQWRtaW5TZXJ2aWNlKHRoaXMpLHRoaXMuY29sbGVjdGlvbnM9bmV3IENvbGxlY3Rpb25TZXJ2aWNlKHRoaXMpLHRoaXMuZmlsZXM9bmV3IEZpbGVTZXJ2aWNlKHRoaXMpLHRoaXMubG9ncz1uZXcgTG9nU2VydmljZSh0aGlzKSx0aGlzLnNldHRpbmdzPW5ldyBTZXR0aW5nc1NlcnZpY2UodGhpcyksdGhpcy5yZWFsdGltZT1uZXcgUmVhbHRpbWVTZXJ2aWNlKHRoaXMpLHRoaXMuaGVhbHRoPW5ldyBIZWFsdGhTZXJ2aWNlKHRoaXMpLHRoaXMuYmFja3Vwcz1uZXcgQmFja3VwU2VydmljZSh0aGlzKX1jb2xsZWN0aW9uKGUpe3JldHVybiB0aGlzLnJlY29yZFNlcnZpY2VzW2VdfHwodGhpcy5yZWNvcmRTZXJ2aWNlc1tlXT1uZXcgUmVjb3JkU2VydmljZSh0aGlzLGUpKSx0aGlzLnJlY29yZFNlcnZpY2VzW2VdfWF1dG9DYW5jZWxsYXRpb24oZSl7cmV0dXJuIHRoaXMuZW5hYmxlQXV0b0NhbmNlbGxhdGlvbj0hIWUsdGhpc31jYW5jZWxSZXF1ZXN0KGUpe3JldHVybiB0aGlzLmNhbmNlbENvbnRyb2xsZXJzW2VdJiYodGhpcy5jYW5jZWxDb250cm9sbGVyc1tlXS5hYm9ydCgpLGRlbGV0ZSB0aGlzLmNhbmNlbENvbnRyb2xsZXJzW2VdKSx0aGlzfWNhbmNlbEFsbFJlcXVlc3RzKCl7Zm9yKGxldCBlIGluIHRoaXMuY2FuY2VsQ29udHJvbGxlcnMpdGhpcy5jYW5jZWxDb250cm9sbGVyc1tlXS5hYm9ydCgpO3JldHVybiB0aGlzLmNhbmNlbENvbnRyb2xsZXJzPXt9LHRoaXN9ZmlsdGVyKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKGxldCBzIGluIHQpe2xldCBpPXRbc107c3dpdGNoKHR5cGVvZiBpKXtjYXNlXCJib29sZWFuXCI6Y2FzZVwibnVtYmVyXCI6aT1cIlwiK2k7YnJlYWs7Y2FzZVwic3RyaW5nXCI6aT1cIidcIitpLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpK1wiJ1wiO2JyZWFrO2RlZmF1bHQ6aT1udWxsPT09aT9cIm51bGxcIjppIGluc3RhbmNlb2YgRGF0ZT9cIidcIitpLnRvSVNPU3RyaW5nKCkucmVwbGFjZShcIlRcIixcIiBcIikrXCInXCI6XCInXCIrSlNPTi5zdHJpbmdpZnkoaSkucmVwbGFjZSgvJy9nLFwiXFxcXCdcIikrXCInXCJ9ZT1lLnJlcGxhY2VBbGwoXCJ7OlwiK3MrXCJ9XCIsaSl9cmV0dXJuIGV9Z2V0RmlsZVVybChlLHQscz17fSl7cmV0dXJuIHRoaXMuZmlsZXMuZ2V0VXJsKGUsdCxzKX1idWlsZFVybChlKXtsZXQgdD10aGlzLmJhc2VVcmw7cmV0dXJuXCJ1bmRlZmluZWRcIj09dHlwZW9mIHdpbmRvd3x8IXdpbmRvdy5sb2NhdGlvbnx8dC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIil8fHQuc3RhcnRzV2l0aChcImh0dHA6Ly9cIil8fCh0PXdpbmRvdy5sb2NhdGlvbi5vcmlnaW4/LmVuZHNXaXRoKFwiL1wiKT93aW5kb3cubG9jYXRpb24ub3JpZ2luLnN1YnN0cmluZygwLHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4ubGVuZ3RoLTEpOndpbmRvdy5sb2NhdGlvbi5vcmlnaW58fFwiXCIsdGhpcy5iYXNlVXJsLnN0YXJ0c1dpdGgoXCIvXCIpfHwodCs9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfHxcIi9cIix0Kz10LmVuZHNXaXRoKFwiL1wiKT9cIlwiOlwiL1wiKSx0Kz10aGlzLmJhc2VVcmwpLGUmJih0Kz10LmVuZHNXaXRoKFwiL1wiKT9cIlwiOlwiL1wiLHQrPWUuc3RhcnRzV2l0aChcIi9cIik/ZS5zdWJzdHJpbmcoMSk6ZSksdH1hc3luYyBzZW5kKGUsdCl7dD10aGlzLmluaXRTZW5kT3B0aW9ucyhlLHQpO2xldCBzPXRoaXMuYnVpbGRVcmwoZSk7aWYodGhpcy5iZWZvcmVTZW5kKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe30sYXdhaXQgdGhpcy5iZWZvcmVTZW5kKHMsdCkpO3ZvaWQgMCE9PWUudXJsfHx2b2lkIDAhPT1lLm9wdGlvbnM/KHM9ZS51cmx8fHMsdD1lLm9wdGlvbnN8fHQpOk9iamVjdC5rZXlzKGUpLmxlbmd0aCYmKHQ9ZSxjb25zb2xlPy53YXJuJiZjb25zb2xlLndhcm4oXCJEZXByZWNhdGVkIGZvcm1hdCBvZiBiZWZvcmVTZW5kIHJldHVybjogcGxlYXNlIHVzZSBgcmV0dXJuIHsgdXJsLCBvcHRpb25zIH1gLCBpbnN0ZWFkIG9mIGByZXR1cm4gb3B0aW9uc2AuXCIpKX1pZih2b2lkIDAhPT10LnF1ZXJ5KXtjb25zdCBlPXRoaXMuc2VyaWFsaXplUXVlcnlQYXJhbXModC5xdWVyeSk7ZSYmKHMrPShzLmluY2x1ZGVzKFwiP1wiKT9cIiZcIjpcIj9cIikrZSksZGVsZXRlIHQucXVlcnl9XCJhcHBsaWNhdGlvbi9qc29uXCI9PXRoaXMuZ2V0SGVhZGVyKHQuaGVhZGVycyxcIkNvbnRlbnQtVHlwZVwiKSYmdC5ib2R5JiZcInN0cmluZ1wiIT10eXBlb2YgdC5ib2R5JiYodC5ib2R5PUpTT04uc3RyaW5naWZ5KHQuYm9keSkpO3JldHVybih0LmZldGNofHxmZXRjaCkocyx0KS50aGVuKChhc3luYyBlPT57bGV0IHQ9e307dHJ5e3Q9YXdhaXQgZS5qc29uKCl9Y2F0Y2goZSl7fWlmKHRoaXMuYWZ0ZXJTZW5kJiYodD1hd2FpdCB0aGlzLmFmdGVyU2VuZChlLHQpKSxlLnN0YXR1cz49NDAwKXRocm93IG5ldyBDbGllbnRSZXNwb25zZUVycm9yKHt1cmw6ZS51cmwsc3RhdHVzOmUuc3RhdHVzLGRhdGE6dH0pO3JldHVybiB0fSkpLmNhdGNoKChlPT57dGhyb3cgbmV3IENsaWVudFJlc3BvbnNlRXJyb3IoZSl9KSl9aW5pdFNlbmRPcHRpb25zKGUsdCl7aWYoKHQ9T2JqZWN0LmFzc2lnbih7bWV0aG9kOlwiR0VUXCJ9LHQpKS5ib2R5PXRoaXMuY29udmVydFRvRm9ybURhdGFJZk5lZWRlZCh0LmJvZHkpLG5vcm1hbGl6ZVVua25vd25RdWVyeVBhcmFtcyh0KSx0LnF1ZXJ5PU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbXMsdC5xdWVyeSksdm9pZCAwPT09dC5yZXF1ZXN0S2V5JiYoITE9PT10LiRhdXRvQ2FuY2VsfHwhMT09PXQucXVlcnkuJGF1dG9DYW5jZWw/dC5yZXF1ZXN0S2V5PW51bGw6KHQuJGNhbmNlbEtleXx8dC5xdWVyeS4kY2FuY2VsS2V5KSYmKHQucmVxdWVzdEtleT10LiRjYW5jZWxLZXl8fHQucXVlcnkuJGNhbmNlbEtleSkpLGRlbGV0ZSB0LiRhdXRvQ2FuY2VsLGRlbGV0ZSB0LnF1ZXJ5LiRhdXRvQ2FuY2VsLGRlbGV0ZSB0LiRjYW5jZWxLZXksZGVsZXRlIHQucXVlcnkuJGNhbmNlbEtleSxudWxsIT09dGhpcy5nZXRIZWFkZXIodC5oZWFkZXJzLFwiQ29udGVudC1UeXBlXCIpfHx0aGlzLmlzRm9ybURhdGEodC5ib2R5KXx8KHQuaGVhZGVycz1PYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycyx7XCJDb250ZW50LVR5cGVcIjpcImFwcGxpY2F0aW9uL2pzb25cIn0pKSxudWxsPT09dGhpcy5nZXRIZWFkZXIodC5oZWFkZXJzLFwiQWNjZXB0LUxhbmd1YWdlXCIpJiYodC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzLHtcIkFjY2VwdC1MYW5ndWFnZVwiOnRoaXMubGFuZ30pKSx0aGlzLmF1dGhTdG9yZS50b2tlbiYmbnVsbD09PXRoaXMuZ2V0SGVhZGVyKHQuaGVhZGVycyxcIkF1dGhvcml6YXRpb25cIikmJih0LmhlYWRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMse0F1dGhvcml6YXRpb246dGhpcy5hdXRoU3RvcmUudG9rZW59KSksdGhpcy5lbmFibGVBdXRvQ2FuY2VsbGF0aW9uJiZudWxsIT09dC5yZXF1ZXN0S2V5KXtjb25zdCBzPXQucmVxdWVzdEtleXx8KHQubWV0aG9kfHxcIkdFVFwiKStlO2RlbGV0ZSB0LnJlcXVlc3RLZXksdGhpcy5jYW5jZWxSZXF1ZXN0KHMpO2NvbnN0IGk9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLmNhbmNlbENvbnRyb2xsZXJzW3NdPWksdC5zaWduYWw9aS5zaWduYWx9cmV0dXJuIHR9Y29udmVydFRvRm9ybURhdGFJZk5lZWRlZChlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgRm9ybURhdGF8fHZvaWQgMD09PWV8fFwib2JqZWN0XCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8dGhpcy5pc0Zvcm1EYXRhKGUpfHwhdGhpcy5oYXNCbG9iRmllbGQoZSkpcmV0dXJuIGU7Y29uc3QgdD1uZXcgRm9ybURhdGE7Zm9yKGNvbnN0IHMgaW4gZSl7Y29uc3QgaT1lW3NdO2lmKFwib2JqZWN0XCIhPXR5cGVvZiBpfHx0aGlzLmhhc0Jsb2JGaWVsZCh7ZGF0YTppfSkpe2NvbnN0IGU9QXJyYXkuaXNBcnJheShpKT9pOltpXTtmb3IobGV0IGkgb2YgZSl0LmFwcGVuZChzLGkpfWVsc2V7bGV0IGU9e307ZVtzXT1pLHQuYXBwZW5kKFwiQGpzb25QYXlsb2FkXCIsSlNPTi5zdHJpbmdpZnkoZSkpfX1yZXR1cm4gdH1oYXNCbG9iRmllbGQoZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgcz1BcnJheS5pc0FycmF5KGVbdF0pP2VbdF06W2VbdF1dO2Zvcihjb25zdCBlIG9mIHMpaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIEJsb2ImJmUgaW5zdGFuY2VvZiBCbG9ifHxcInVuZGVmaW5lZFwiIT10eXBlb2YgRmlsZSYmZSBpbnN0YW5jZW9mIEZpbGUpcmV0dXJuITB9cmV0dXJuITF9Z2V0SGVhZGVyKGUsdCl7ZT1lfHx7fSx0PXQudG9Mb3dlckNhc2UoKTtmb3IobGV0IHMgaW4gZSlpZihzLnRvTG93ZXJDYXNlKCk9PXQpcmV0dXJuIGVbc107cmV0dXJuIG51bGx9aXNGb3JtRGF0YShlKXtyZXR1cm4gZSYmKFwiRm9ybURhdGFcIj09PWUuY29uc3RydWN0b3IubmFtZXx8XCJ1bmRlZmluZWRcIiE9dHlwZW9mIEZvcm1EYXRhJiZlIGluc3RhbmNlb2YgRm9ybURhdGEpfXNlcmlhbGl6ZVF1ZXJ5UGFyYW1zKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHMgaW4gZSl7aWYobnVsbD09PWVbc10pY29udGludWU7Y29uc3QgaT1lW3NdLG49ZW5jb2RlVVJJQ29tcG9uZW50KHMpO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGNvbnN0IGUgb2YgaSl0LnB1c2gobitcIj1cIitlbmNvZGVVUklDb21wb25lbnQoZSkpO2Vsc2UgaSBpbnN0YW5jZW9mIERhdGU/dC5wdXNoKG4rXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGkudG9JU09TdHJpbmcoKSkpOm51bGwhPT10eXBlb2YgaSYmXCJvYmplY3RcIj09dHlwZW9mIGk/dC5wdXNoKG4rXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGkpKSk6dC5wdXNoKG4rXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGkpKX1yZXR1cm4gdC5qb2luKFwiJlwiKX19Y2xhc3MgQXN5bmNBdXRoU3RvcmUgZXh0ZW5kcyBCYXNlQXV0aFN0b3Jle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5xdWV1ZT1bXSx0aGlzLnNhdmVGdW5jPWUuc2F2ZSx0aGlzLmNsZWFyRnVuYz1lLmNsZWFyLHRoaXMuX2VucXVldWUoKCgpPT50aGlzLl9sb2FkSW5pdGlhbChlLmluaXRpYWwpKSl9c2F2ZShlLHQpe3N1cGVyLnNhdmUoZSx0KTtsZXQgcz1cIlwiO3RyeXtzPUpTT04uc3RyaW5naWZ5KHt0b2tlbjplLG1vZGVsOnR9KX1jYXRjaChlKXtjb25zb2xlLndhcm4oXCJBc3luY0F1dGhTdG9yZTogZmFpbGVkIHRvIHN0cmluZ2lmeSB0aGUgbmV3IHN0YXRlXCIpfXRoaXMuX2VucXVldWUoKCgpPT50aGlzLnNhdmVGdW5jKHMpKSl9Y2xlYXIoKXtzdXBlci5jbGVhcigpLHRoaXMuY2xlYXJGdW5jP3RoaXMuX2VucXVldWUoKCgpPT50aGlzLmNsZWFyRnVuYygpKSk6dGhpcy5fZW5xdWV1ZSgoKCk9PnRoaXMuc2F2ZUZ1bmMoXCJcIikpKX1hc3luYyBfbG9hZEluaXRpYWwoZSl7dHJ5e2lmKGU9YXdhaXQgZSl7bGV0IHQ7XCJzdHJpbmdcIj09dHlwZW9mIGU/dD1KU09OLnBhcnNlKGUpfHx7fTpcIm9iamVjdFwiPT10eXBlb2YgZSYmKHQ9ZSksdGhpcy5zYXZlKHQudG9rZW58fFwiXCIsdC5tb2RlbHx8bnVsbCl9fWNhdGNoKGUpe319X2VucXVldWUoZSl7dGhpcy5xdWV1ZS5wdXNoKGUpLDE9PXRoaXMucXVldWUubGVuZ3RoJiZ0aGlzLl9kZXF1ZXVlKCl9X2RlcXVldWUoKXt0aGlzLnF1ZXVlLmxlbmd0aCYmdGhpcy5xdWV1ZVswXSgpLmZpbmFsbHkoKCgpPT57dGhpcy5xdWV1ZS5zaGlmdCgpLHRoaXMucXVldWUubGVuZ3RoJiZ0aGlzLl9kZXF1ZXVlKCl9KSl9fWV4cG9ydHtBZG1pblNlcnZpY2UsQXN5bmNBdXRoU3RvcmUsQmFzZUF1dGhTdG9yZSxDbGllbnRSZXNwb25zZUVycm9yLENvbGxlY3Rpb25TZXJ2aWNlLENydWRTZXJ2aWNlLEhlYWx0aFNlcnZpY2UsTG9jYWxBdXRoU3RvcmUsTG9nU2VydmljZSxSZWFsdGltZVNlcnZpY2UsUmVjb3JkU2VydmljZSxjb29raWVQYXJzZSxjb29raWVTZXJpYWxpemUsQ2xpZW50IGFzIGRlZmF1bHQsZ2V0VG9rZW5QYXlsb2FkLGlzVG9rZW5FeHBpcmVkLG5vcm1hbGl6ZVVua25vd25RdWVyeVBhcmFtc307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2NrZXRiYXNlLmVzLm1qcy5tYXBcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/pocketbase/dist/pocketbase.es.mjs\n"));
|
|
|
|
/***/ })
|
|
|
|
},
|
|
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
|
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
|
/******/ __webpack_require__.O(0, ["main-app"], function() { return __webpack_exec__("(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22C%3A%5C%5CUsers%5C%5CRaymondVerhoef%5C%5CGitea%5C%5Clearning-platform%5C%5Capp%5C%5Cfrontend%5C%5Csrc%5C%5Capp%5C%5Cauth%5C%5Cpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"); });
|
|
/******/ var __webpack_exports__ = __webpack_require__.O();
|
|
/******/ _N_E = __webpack_exports__;
|
|
/******/ }
|
|
]); |