NeahNew/.next/server/app/api/users/route.js
2025-05-03 14:17:46 +02:00

243 lines
99 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/).
*/
(() => {
var exports = {};
exports.id = "app/api/users/route";
exports.ids = ["app/api/users/route"];
exports.modules = {
/***/ "(rsc)/./app/api/auth/[...nextauth]/route.ts":
/*!*********************************************!*\
!*** ./app/api/auth/[...nextauth]/route.ts ***!
\*********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GET: () => (/* binding */ handler),\n/* harmony export */ POST: () => (/* binding */ handler),\n/* harmony export */ authOptions: () => (/* binding */ authOptions)\n/* harmony export */ });\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next-auth */ \"(rsc)/./node_modules/next-auth/index.js\");\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_auth__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_auth_providers_keycloak__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next-auth/providers/keycloak */ \"(rsc)/./node_modules/next-auth/providers/keycloak.js\");\n/* harmony import */ var jwt_decode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jwt-decode */ \"(rsc)/./node_modules/jwt-decode/build/esm/index.js\");\n\n\n\nfunction getRequiredEnvVar(name) {\n const value = process.env[name];\n if (!value) {\n throw new Error(`Missing required environment variable: ${name}`);\n }\n return value;\n}\nasync function refreshAccessToken(token) {\n try {\n const response = await fetch(`${process.env.KEYCLOAK_ISSUER}/protocol/openid-connect/token`, {\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n },\n body: new URLSearchParams({\n client_id: process.env.KEYCLOAK_CLIENT_ID,\n client_secret: process.env.KEYCLOAK_CLIENT_SECRET,\n grant_type: \"refresh_token\",\n refresh_token: token.refreshToken\n }),\n method: \"POST\"\n });\n const refreshedTokens = await response.json();\n if (!response.ok) {\n throw refreshedTokens;\n }\n return {\n ...token,\n accessToken: refreshedTokens.access_token,\n refreshToken: refreshedTokens.refresh_token ?? token.refreshToken,\n accessTokenExpires: Date.now() + refreshedTokens.expires_in * 1000\n };\n } catch (error) {\n console.error(\"Error refreshing access token:\", error);\n return {\n ...token,\n error: \"RefreshAccessTokenError\"\n };\n }\n}\nconst authOptions = {\n providers: [\n (0,next_auth_providers_keycloak__WEBPACK_IMPORTED_MODULE_1__[\"default\"])({\n clientId: getRequiredEnvVar(\"KEYCLOAK_CLIENT_ID\"),\n clientSecret: getRequiredEnvVar(\"KEYCLOAK_CLIENT_SECRET\"),\n issuer: getRequiredEnvVar(\"KEYCLOAK_ISSUER\"),\n authorization: {\n params: {\n scope: \"openid profile email roles\"\n }\n },\n profile (profile) {\n console.log('Keycloak profile callback:', {\n rawProfile: profile,\n rawRoles: profile.roles,\n realmAccess: profile.realm_access,\n groups: profile.groups\n });\n // Get roles from realm_access\n const roles = profile.realm_access?.roles || [];\n console.log('Profile callback raw roles:', roles);\n // Clean up roles by removing ROLE_ prefix and converting to lowercase\n const cleanRoles = roles.map((role)=>role.replace(/^ROLE_/, '').toLowerCase());\n console.log('Profile callback cleaned roles:', cleanRoles);\n return {\n id: profile.sub,\n name: profile.name ?? profile.preferred_username,\n email: profile.email,\n first_name: profile.given_name ?? '',\n last_name: profile.family_name ?? '',\n username: profile.preferred_username ?? profile.email?.split('@')[0] ?? '',\n role: cleanRoles\n };\n }\n })\n ],\n session: {\n strategy: \"jwt\",\n maxAge: 30 * 24 * 60 * 60\n },\n callbacks: {\n async jwt ({ token, account, profile }) {\n if (account && profile) {\n const keycloakProfile = profile;\n const roles = keycloakProfile.realm_access?.roles || [];\n const cleanRoles = roles.map((role)=>role.replace(/^ROLE_/, '').toLowerCase());\n token.accessToken = account.access_token ?? '';\n token.refreshToken = account.refresh_token ?? '';\n token.accessTokenExpires = account.expires_at ?? 0;\n token.sub = keycloakProfile.sub;\n token.role = cleanRoles;\n token.username = keycloakProfile.preferred_username ?? '';\n token.first_name = keycloakProfile.given_name ?? '';\n token.last_name = keycloakProfile.family_name ?? '';\n } else if (token.accessToken) {\n try {\n const decoded = (0,jwt_decode__WEBPACK_IMPORTED_MODULE_2__.jwtDecode)(token.accessToken);\n if (decoded.realm_access?.roles) {\n const roles = decoded.realm_access.roles;\n const cleanRoles = roles.map((role)=>role.replace(/^ROLE_/, '').toLowerCase());\n token.role = cleanRoles;\n }\n } catch (error) {\n console.error('Error decoding token:', error);\n }\n }\n if (Date.now() < token.accessTokenExpires * 1000) {\n return token;\n }\n return refreshAccessToken(token);\n },\n async session ({ session, token }) {\n if (token.error) {\n throw new Error(token.error);\n }\n const userRoles = Array.isArray(token.role) ? token.role : [];\n session.user = {\n id: token.sub ?? '',\n email: token.email ?? null,\n name: token.name ?? null,\n image: null,\n username: token.username ?? '',\n first_name: token.first_name ?? '',\n last_name: token.last_name ?? '',\n role: userRoles,\n nextcloudInitialized: false\n };\n session.accessToken = token.accessToken;\n return session;\n }\n },\n pages: {\n signIn: '/signin',\n error: '/signin'\n },\n debug: \"development\" === 'development'\n};\nconst handler = next_auth__WEBPACK_IMPORTED_MODULE_0___default()(authOptions);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL2F1dGgvWy4uLm5leHRhdXRoXS9yb3V0ZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQXNEO0FBQ007QUFDckI7QUFxRHZDLFNBQVNHLGtCQUFrQkMsSUFBWTtJQUNyQyxNQUFNQyxRQUFRQyxRQUFRQyxHQUFHLENBQUNILEtBQUs7SUFDL0IsSUFBSSxDQUFDQyxPQUFPO1FBQ1YsTUFBTSxJQUFJRyxNQUFNLENBQUMsdUNBQXVDLEVBQUVKLE1BQU07SUFDbEU7SUFDQSxPQUFPQztBQUNUO0FBRUEsZUFBZUksbUJBQW1CQyxLQUFVO0lBQzFDLElBQUk7UUFDRixNQUFNQyxXQUFXLE1BQU1DLE1BQU0sR0FBR04sUUFBUUMsR0FBRyxDQUFDTSxlQUFlLENBQUMsOEJBQThCLENBQUMsRUFBRTtZQUMzRkMsU0FBUztnQkFBRSxnQkFBZ0I7WUFBb0M7WUFDL0RDLE1BQU0sSUFBSUMsZ0JBQWdCO2dCQUN4QkMsV0FBV1gsUUFBUUMsR0FBRyxDQUFDVyxrQkFBa0I7Z0JBQ3pDQyxlQUFlYixRQUFRQyxHQUFHLENBQUNhLHNCQUFzQjtnQkFDakRDLFlBQVk7Z0JBQ1pDLGVBQWVaLE1BQU1hLFlBQVk7WUFDbkM7WUFDQUMsUUFBUTtRQUNWO1FBRUEsTUFBTUMsa0JBQWtCLE1BQU1kLFNBQVNlLElBQUk7UUFFM0MsSUFBSSxDQUFDZixTQUFTZ0IsRUFBRSxFQUFFO1lBQ2hCLE1BQU1GO1FBQ1I7UUFFQSxPQUFPO1lBQ0wsR0FBR2YsS0FBSztZQUNSa0IsYUFBYUgsZ0JBQWdCSSxZQUFZO1lBQ3pDTixjQUFjRSxnQkFBZ0JILGFBQWEsSUFBSVosTUFBTWEsWUFBWTtZQUNqRU8sb0JBQW9CQyxLQUFLQyxHQUFHLEtBQUtQLGdCQUFnQlEsVUFBVSxHQUFHO1FBQ2hFO0lBQ0YsRUFBRSxPQUFPQyxPQUFPO1FBQ2RDLFFBQVFELEtBQUssQ0FBQyxrQ0FBa0NBO1FBQ2hELE9BQU87WUFDTCxHQUFHeEIsS0FBSztZQUNSd0IsT0FBTztRQUNUO0lBQ0Y7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O1lBRUEsSUFBSUgsS0FBS0MsR0FBRyxLQUFLLE1BQU9GLGtCQUFrQixHQUFjLE1BQU07Z0JBQzVELE9BQU9wQjtZQUNUO1lBRUEsT0FBT0QsbUJBQW1CQztRQUM1QjtRQUNBLE1BQU15RCxTQUFRLEVBQUVBLE9BQU8sRUFBRXpELEtBQUssRUFBRTtZQUM5QixJQUFJQSxNQUFNd0IsS0FBSyxFQUFFO2dCQUNmLE1BQU0sSUFBSTFCLE1BQU1FLE1BQU13QixLQUFLO1lBQzdCO1lBRUEsTUFBTTBDLFlBQVlDLE1BQU1DLE9BQU8sQ0FBQ3BFLE1BQU00QyxJQUFJLElBQUk1QyxNQUFNNEMsSUFBSSxHQUFHLEVBQUU7WUFDN0RhLFFBQVFZLElBQUksR0FBRztnQkFDYnRCLElBQUkvQyxNQUFNZ0QsR0FBRyxJQUFJO2dCQUNqQkUsT0FBT2xELE1BQU1rRCxLQUFLLElBQUk7Z0JBQ3RCeEQsTUFBTU0sTUFBTU4sSUFBSSxJQUFJO2dCQUNwQjRFLE9BQU87Z0JBQ1BmLFVBQVV2RCxNQUFNdUQsUUFBUSxJQUFJO2dCQUM1QkosWUFBWW5ELE1BQU1tRCxVQUFVLElBQUk7Z0JBQ2hDRSxXQUFXckQsTUFBTXFELFNBQVMsSUFBSTtnQkFDOUJULE1BQU1zQjtnQkFDTkssc0JBQXNCO1lBQ3hCO1lBQ0FkLFFBQVF2QyxXQUFXLEdBQUdsQixNQUFNa0IsV0FBVztZQUV2QyxPQUFPdUM7UUFDVDtJQUNGO0lBQ0FlLE9BQU87UUFDTEMsUUFBUTtRQUNSakQsT0FBTztJQUNUO0lBQ0FrRCxPQUFPOUUsa0JBQXlCO0FBQ2xDLEVBQUU7QUFFRixNQUFNK0UsVUFBVXJGLGdEQUFRQSxDQUFDb0M7QUFDa0IiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvYXBwL2FwaS9hdXRoL1suLi5uZXh0YXV0aF0vcm91dGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE5leHRBdXRoLCB7IE5leHRBdXRoT3B0aW9ucyB9IGZyb20gXCJuZXh0LWF1dGhcIjtcbmltcG9ydCBLZXljbG9ha1Byb3ZpZGVyIGZyb20gXCJuZXh0LWF1dGgvcHJvdmlkZXJzL2tleWNsb2FrXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuXG5pbnRlcmZhY2UgS2V5Y2xvYWtQcm9maWxlIHtcbiAgc3ViOiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICByb2xlcz86IHN0cmluZ1tdO1xuICBwcmVmZXJyZWRfdXNlcm5hbWU/OiBzdHJpbmc7XG4gIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gIGZhbWlseV9uYW1lPzogc3RyaW5nO1xuICByZWFsbV9hY2Nlc3M/OiB7XG4gICAgcm9sZXM6IHN0cmluZ1tdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRGVjb2RlZFRva2VuIHtcbiAgcmVhbG1fYWNjZXNzPzoge1xuICAgIHJvbGVzOiBzdHJpbmdbXTtcbiAgfTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5kZWNsYXJlIG1vZHVsZSBcIm5leHQtYXV0aFwiIHtcbiAgaW50ZXJmYWNlIFNlc3Npb24ge1xuICAgIHVzZXI6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGltYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgICBmaXJzdF9uYW1lOiBzdHJpbmc7XG4gICAgICBsYXN0X25hbWU6IHN0cmluZztcbiAgICAgIHJvbGU6IHN0cmluZ1tdO1xuICAgICAgbmV4dGNsb3VkSW5pdGlhbGl6ZWQ/OiBib29sZWFuO1xuICAgIH07XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSldUIHtcbiAgICBzdWI/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gICAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICAgIGFjY2Vzc1Rva2VuRXhwaXJlcz86IG51bWJlcjtcbiAgICByb2xlPzogc3RyaW5nW107XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgZmlyc3RfbmFtZT86IHN0cmluZztcbiAgICBsYXN0X25hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlcXVpcmVkRW52VmFyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGlmICghdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICR7bmFtZX1gKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBY2Nlc3NUb2tlbih0b2tlbjogSldUKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtwcm9jZXNzLmVudi5LRVlDTE9BS19JU1NVRVJ9L3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuYCwge1xuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiIH0sXG4gICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgY2xpZW50X2lkOiBwcm9jZXNzLmVudi5LRVlDTE9BS19DTElFTlRfSUQhLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiBwcm9jZXNzLmVudi5LRVlDTE9BS19DTElFTlRfU0VDUkVUISxcbiAgICAgICAgZ3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2VuLnJlZnJlc2hUb2tlbixcbiAgICAgIH0pLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlZnJlc2hlZFRva2VucyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IHJlZnJlc2hlZFRva2VucztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udG9rZW4sXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkVG9rZW5zLmFjY2Vzc190b2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkVG9rZW5zLnJlZnJlc2hfdG9rZW4gPz8gdG9rZW4ucmVmcmVzaFRva2VuLFxuICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzOiBEYXRlLm5vdygpICsgcmVmcmVzaGVkVG9rZW5zLmV4cGlyZXNfaW4gKiAxMDAwLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlZnJlc2hpbmcgYWNjZXNzIHRva2VuOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRva2VuLFxuICAgICAgZXJyb3I6IFwiUmVmcmVzaEFjY2Vzc1Rva2VuRXJyb3JcIixcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhdXRoT3B0aW9uczogTmV4dEF1dGhPcHRpb25zID0ge1xuICBwcm92aWRlcnM6IFtcbiAgICBLZXljbG9ha1Byb3ZpZGVyKHtcbiAgICAgIGNsaWVudElkOiBnZXRSZXF1aXJlZEVudlZhcihcIktFWUNMT0FLX0NMSUVOVF9JRFwiKSxcbiAgICAgIGNsaWVudFNlY3JldDogZ2V0UmVxdWlyZWRFbnZWYXIoXCJLRVlDTE9BS19DTElFTlRfU0VDUkVUXCIpLFxuICAgICAgaXNzdWVyOiBnZXRSZXF1aXJlZEVudlZhcihcIktFWUNMT0FLX0lTU1VFUlwiKSxcbiAgICAgIGF1dGhvcml6YXRpb246IHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc2NvcGU6IFwib3BlbmlkIHByb2ZpbGUgZW1haWwgcm9sZXNcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvZmlsZShwcm9maWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdLZXljbG9hayBwcm9maWxlIGNhbGxiYWNrOicsIHtcbiAgICAgICAgICByYXdQcm9maWxlOiBwcm9maWxlLFxuICAgICAgICAgIHJhd1JvbGVzOiBwcm9maWxlLnJvbGVzLFxuICAgICAgICAgIHJlYWxtQWNjZXNzOiBwcm9maWxlLnJlYWxtX2FjY2VzcyxcbiAgICAgICAgICBncm91cHM6IHByb2ZpbGUuZ3JvdXBzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdldCByb2xlcyBmcm9tIHJlYWxtX2FjY2Vzc1xuICAgICAgICBjb25zdCByb2xlcyA9IHByb2ZpbGUucmVhbG1fYWNjZXNzPy5yb2xlcyB8fCBbXTtcbiAgICAgICAgY29uc29sZS5sb2coJ1Byb2ZpbGUgY2FsbGJhY2sgcmF3IHJvbGVzOicsIHJvbGVzKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCByb2xlcyBieSByZW1vdmluZyBST0xFXyBwcmVmaXggYW5kIGNvbnZlcnRpbmcgdG8gbG93ZXJjYXNlXG4gICAgICAgIGNvbnN0IGNsZWFuUm9sZXMgPSByb2xlcy5tYXAoKHJvbGU6IHN0cmluZykgPT4gXG4gICAgICAgICAgcm9sZS5yZXBsYWNlKC9eUk9MRV8vLCAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9maWxlIGNhbGxiYWNrIGNsZWFuZWQgcm9sZXM6JywgY2xlYW5Sb2xlcyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogcHJvZmlsZS5zdWIsXG4gICAgICAgICAgbmFtZTogcHJvZmlsZS5uYW1lID8/IHByb2ZpbGUucHJlZmVycmVkX3VzZXJuYW1lLFxuICAgICAgICAgIGVtYWlsOiBwcm9maWxlLmVtYWlsLFxuICAgICAgICAgIGZpcnN0X25hbWU6IHByb2ZpbGUuZ2l2ZW5fbmFtZSA/PyAnJyxcbiAgICAgICAgICBsYXN0X25hbWU6IHByb2ZpbGUuZmFtaWx5X25hbWUgPz8gJycsXG4gICAgICAgICAgdXNlcm5hbWU6IHByb2ZpbGUucHJlZmVycmVkX3VzZXJuYW1lID8/IHByb2ZpbGUuZW1haWw/LnNwbGl0KCdAJylbMF0gPz8gJycsXG4gICAgICAgICAgcm9sZTogY2xlYW5Sb2xlcyxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KSxcbiAgXSxcbiAgc2Vzc2lvbjoge1xuICAgIHN0cmF0ZWd5OiBcImp3dFwiLFxuICAgIG1heEFnZTogMzAgKiAyNCAqIDYwICogNjAsIC8vIDMwIGRheXNcbiAgfSxcbiAgY2FsbGJhY2tzOiB7XG4gICAgYXN5bmMgand0KHsgdG9rZW4sIGFjY291bnQsIHByb2ZpbGUgfSkge1xuICAgICAgaWYgKGFjY291bnQgJiYgcHJvZmlsZSkge1xuICAgICAgICBjb25zdCBrZXljbG9ha1Byb2ZpbGUgPSBwcm9maWxlIGFzIEtleWNsb2FrUHJvZmlsZTtcbiAgICAgICAgY29uc3Qgcm9sZXMgPSBrZXljbG9ha1Byb2ZpbGUucmVhbG1fYWNjZXNzPy5yb2xlcyB8fCBbXTtcbiAgICAgICAgY29uc3QgY2xlYW5Sb2xlcyA9IHJvbGVzLm1hcCgocm9sZTogc3RyaW5nKSA9PiBcbiAgICAgICAgICByb2xlLnJlcGxhY2UoL15ST0xFXy8sICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdG9rZW4uYWNjZXNzVG9rZW4gPSBhY2NvdW50LmFjY2Vzc190b2tlbiA/PyAnJztcbiAgICAgICAgdG9rZW4ucmVmcmVzaFRva2VuID0gYWNjb3VudC5yZWZyZXNoX3Rva2VuID8/ICcnO1xuICAgICAgICB0b2tlbi5hY2Nlc3NUb2tlbkV4cGlyZXMgPSBhY2NvdW50LmV4cGlyZXNfYXQgPz8gMDtcbiAgICAgICAgdG9rZW4uc3ViID0ga2V5Y2xvYWtQcm9maWxlLnN1YjtcbiAgICAgICAgdG9rZW4ucm9sZSA9IGNsZWFuUm9sZXM7XG4gICAgICAgIHRva2VuLnVzZXJuYW1lID0ga2V5Y2xvYWtQcm9maWxlLnByZWZlcnJlZF91c2VybmFtZSA/PyAnJztcbiAgICAgICAgdG9rZW4uZmlyc3RfbmFtZSA9IGtleWNsb2FrUHJvZmlsZS5naXZlbl9uYW1lID8/ICcnO1xuICAgICAgICB0b2tlbi5sYXN0X25hbWUgPSBrZXljbG9ha1Byb2ZpbGUuZmFtaWx5X25hbWUgPz8gJyc7XG4gICAgICB9IGVsc2UgaWYgKHRva2VuLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGp3dERlY29kZTxEZWNvZGVkVG9rZW4+KHRva2VuLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICBpZiAoZGVjb2RlZC5yZWFsbV9hY2Nlc3M/LnJvbGVzKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IGRlY29kZWQucmVhbG1fYWNjZXNzLnJvbGVzO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Sb2xlcyA9IHJvbGVzLm1hcCgocm9sZTogc3RyaW5nKSA9PiBcbiAgICAgICAgICAgICAgcm9sZS5yZXBsYWNlKC9eUk9MRV8vLCAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRva2VuLnJvbGUgPSBjbGVhblJvbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWNvZGluZyB0b2tlbjonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKERhdGUubm93KCkgPCAodG9rZW4uYWNjZXNzVG9rZW5FeHBpcmVzIGFzIG51bWJlcikgKiAxMDAwKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZnJlc2hBY2Nlc3NUb2tlbih0b2tlbik7XG4gICAgfSxcbiAgICBhc3luYyBzZXNzaW9uKHsgc2Vzc2lvbiwgdG9rZW4gfSkge1xuICAgICAgaWYgKHRva2VuLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0b2tlbi5lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJSb2xlcyA9IEFycmF5LmlzQXJyYXkodG9rZW4ucm9sZSkgPyB0b2tlbi5yb2xlIDogW107XG4gICAgICBzZXNzaW9uLnVzZXIgPSB7XG4gICAgICAgIGlkOiB0b2tlbi5zdWIgPz8gJycsXG4gICAgICAgIGVtYWlsOiB0b2tlbi5lbWFpbCA/PyBudWxsLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lID8/IG51bGwsXG4gICAgICAgIGltYWdlOiBudWxsLFxuICAgICAgICB1c2VybmFtZTogdG9rZW4udXNlcm5hbWUgPz8gJycsXG4gICAgICAgIGZpcnN0X25hbWU6IHRva2VuLmZpcnN0X25hbWUgPz8gJycsXG4gICAgICAgIGxhc3RfbmFtZTogdG9rZW4ubGFzdF9uYW1lID8/ICcnLFxuICAgICAgICByb2xlOiB1c2VyUm9sZXMsXG4gICAgICAgIG5leHRjbG91ZEluaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBzZXNzaW9uLmFjY2Vzc1Rva2VuID0gdG9rZW4uYWNjZXNzVG9rZW47XG5cbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgfSxcbiAgcGFnZXM6IHtcbiAgICBzaWduSW46ICcvc2lnbmluJyxcbiAgICBlcnJvcjogJy9zaWduaW4nLFxuICB9LFxuICBkZWJ1ZzogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG59O1xuXG5jb25zdCBoYW5kbGVyID0gTmV4dEF1dGgoYXV0aE9wdGlvbnMpO1xuZXhwb3J0IHsgaGFuZGxlciBhcyBHRVQsIGhhbmRsZXIgYXMgUE9TVCB9O1xuXG5pbnRlcmZhY2UgSldUIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuRXhwaXJlczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUHJvZmlsZSB7XG4gIHN1Yj86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJvbGVzPzogc3RyaW5nW107XG59XG5cbiJdLCJuYW1lcyI6WyJOZXh0QXV0aCIsIktleWNsb2FrUHJvdmlkZXIiLCJqd3REZWNvZGUiLCJnZXRSZXF1aXJlZEVudlZhciIsIm5hbWUiLCJ2YWx1ZSIsInByb2Nlc3MiLCJlbnYiLCJFcnJvciIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsInRva2VuIiwicmVzcG9uc2UiLCJmZXRjaCIsIktFWUNMT0FLX0lTU1VFUiIsImhlYWRlcnMiLCJib2R5IiwiVVJMU2VhcmNoUGFyYW1zIiwiY2xpZW50X2lkIiwiS0VZQ0xPQUtfQ0xJRU5UX0lEIiwiY2xpZW50X3NlY3JldCIsIktFWUNMT0FLX0NMSUVOVF9TRUNSRVQiLCJncmFudF90eXBlIiwicmVmcmVzaF90b2tlbiIsInJlZnJlc2hUb2tlbiIsIm1ldGhvZCIsInJlZnJlc2hlZFRva2VucyIsImpzb24iLCJvayIsImFjY2Vzc1Rva2VuIiwiYWNjZXNzX3Rva2VuIiwiYWNjZXNzVG9rZW5FeHBpcmVzIiwiRGF0ZSIsIm5vdyIsImV4cGlyZXNfaW4iLCJlcnJvciIsImNvbnNvbGUiLCJhdXRoT3B0aW9ucyIsInByb3ZpZGVycyIsImNsaWVudElkIiwiY2xpZW50U2VjcmV0IiwiaXNzdWVyIiwiYXV0aG9yaXphdGlvbiIsInBhcmFtcyIsInNjb3BlIiwicHJvZmlsZSIsImxvZyIsInJhd1Byb2ZpbGUiLCJyYXdSb2xlcyIsInJvbGVzIiwicmVhbG1BY2Nlc3MiLCJyZWFsbV9hY2Nlc3MiLCJncm91cHMiLCJjbGVhblJvbGVzIiwibWFwIiwicm9sZSIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsImlkIiwic3ViIiwicHJlZmVycmVkX3VzZXJuYW1lIiwiZW1haWwiLCJmaXJzdF9uYW1lIiwiZ2l2ZW5fbmFtZSIsImxhc3RfbmFtZSIsImZhbWlseV9uYW1lIiwidXNlcm5hbWUiLCJzcGxpdCIsInNlc3Npb24iLCJzdHJhdGVneSIsIm1heEFnZSIsImNhbGxiYWNrcyIsImp3dCIsImFjY291bnQiLCJrZXljbG9ha1Byb2ZpbGUiLCJleHBpcmVzX2F0IiwiZGVjb2RlZCIsInVzZXJSb2xlcyIsIkFycmF5IiwiaXNBcnJheSIsInVzZXIiLCJpbWFnZSIsIm5leHRjbG91ZEluaXRpYWxpemVkIiwicGFnZXMiLCJzaWduSW4iLCJkZWJ1ZyIsImhhbmRsZXIiLCJHRVQiLCJQT1NUIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./app/api/auth/[...nextauth]/route.ts\n");
/***/ }),
/***/ "(rsc)/./app/api/users/route.ts":
/*!********************************!*\
!*** ./app/api/users/route.ts ***!
\********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DELETE: () => (/* binding */ DELETE),\n/* harmony export */ GET: () => (/* binding */ GET),\n/* harmony export */ POST: () => (/* binding */ POST)\n/* harmony export */ });\n/* harmony import */ var next_auth_next__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next-auth/next */ \"(rsc)/./node_modules/next-auth/next/index.js\");\n/* harmony import */ var _app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/app/api/auth/[...nextauth]/route */ \"(rsc)/./app/api/auth/[...nextauth]/route.ts\");\n/* harmony import */ var next_server__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n\n\n\nasync function GET() {\n const session = await (0,next_auth_next__WEBPACK_IMPORTED_MODULE_0__.getServerSession)(_app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_1__.authOptions);\n if (!session) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Non autorisé\"\n }, {\n status: 401\n });\n }\n console.log(\"Session:\", {\n accessToken: session.accessToken?.substring(0, 20) + \"...\",\n user: session.user\n });\n try {\n // Get client credentials token\n const tokenResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: process.env.KEYCLOAK_CLIENT_ID,\n client_secret: process.env.KEYCLOAK_CLIENT_SECRET\n })\n });\n const tokenData = await tokenResponse.json();\n console.log(\"Token response:\", {\n ok: tokenResponse.ok,\n status: tokenResponse.status,\n data: tokenData.access_token ? \"Token received\" : tokenData\n });\n if (!tokenResponse.ok) {\n console.error(\"Failed to get token:\", tokenData);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json([\n getCurrentUser(session)\n ]);\n }\n // Get users list with brief=false to get full user details\n const usersResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users?briefRepresentation=false`, {\n headers: {\n Authorization: `Bearer ${tokenData.access_token}`,\n 'Content-Type': 'application/json'\n }\n });\n if (!usersResponse.ok) {\n console.error(\"Failed to fetch users:\", await usersResponse.text());\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json([\n getCurrentUser(session)\n ]);\n }\n const users = await usersResponse.json();\n console.log(\"Raw users data:\", users.map((u)=>({\n id: u.id,\n username: u.username,\n realm: u.realm,\n serviceAccountClientId: u.serviceAccountClientId\n })));\n // Filter out service accounts and users from other realms\n const filteredUsers = users.filter((user)=>!user.serviceAccountClientId && // Remove service accounts\n (!user.realm || user.realm === process.env.KEYCLOAK_REALM // Only users from our realm\n ));\n console.log(\"Filtered users count:\", filteredUsers.length);\n // Fetch roles for each user\n const usersWithRoles = await Promise.all(filteredUsers.map(async (user)=>{\n try {\n const rolesResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${user.id}/role-mappings/realm`, {\n headers: {\n Authorization: `Bearer ${tokenData.access_token}`,\n 'Content-Type': 'application/json'\n }\n });\n let roles = [];\n if (rolesResponse.ok) {\n const rolesData = await rolesResponse.json();\n roles = rolesData.filter((role)=>!role.name.startsWith('default-roles-') && ![\n 'offline_access',\n 'uma_authorization'\n ].includes(role.name)).map((role)=>role.name);\n console.log(`Roles for user ${user.username}:`, roles);\n }\n return {\n id: user.id,\n username: user.username,\n firstName: user.firstName || '',\n lastName: user.lastName || '',\n email: user.email,\n createdTimestamp: user.createdTimestamp,\n enabled: user.enabled,\n roles: roles\n };\n } catch (error) {\n console.error(`Error fetching roles for user ${user.id}:`, error);\n return {\n id: user.id,\n username: user.username,\n firstName: user.firstName || '',\n lastName: user.lastName || '',\n email: user.email,\n createdTimestamp: user.createdTimestamp,\n enabled: user.enabled,\n roles: []\n };\n }\n }));\n console.log(\"Final users data:\", usersWithRoles.map((u)=>({\n username: u.username,\n roles: u.roles\n })));\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json(usersWithRoles);\n } catch (error) {\n console.error(\"Error:\", error);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json([\n getCurrentUser(session)\n ]);\n }\n}\n// Helper function to get current user data\nfunction getCurrentUser(session) {\n return {\n id: session.user.id,\n username: session.user.username,\n firstName: session.user.first_name,\n lastName: session.user.last_name,\n email: session.user.email,\n createdTimestamp: Date.now(),\n roles: session.user.role || []\n };\n}\nasync function getAdminToken() {\n try {\n const tokenResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: process.env.KEYCLOAK_CLIENT_ID,\n client_secret: process.env.KEYCLOAK_CLIENT_SECRET\n })\n });\n const data = await tokenResponse.json();\n if (!tokenResponse.ok || !data.access_token) {\n console.error('Token Error:', data);\n return null;\n }\n return data.access_token;\n } catch (error) {\n console.error('Token Error:', error);\n return null;\n }\n}\n// Validate username according to Keycloak requirements\nfunction validateUsername(username) {\n // Keycloak username requirements:\n // - Only alphanumeric characters, dots (.), hyphens (-), and underscores (_)\n // - Must start with a letter or number\n // - Must be between 3 and 255 characters\n const usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9._-]{2,254}$/;\n if (!usernameRegex.test(username)) {\n return {\n isValid: false,\n error: \"Le nom d'utilisateur doit commencer par une lettre ou un chiffre, ne contenir que des lettres, chiffres, points, tirets et underscores, et faire entre 3 et 255 caractères\"\n };\n }\n return {\n isValid: true\n };\n}\n// Helper function to create user in Leantime\nasync function createLeantimeUser(userData) {\n try {\n const response = await fetch('https://agilite.slm-lab.net/api/jsonrpc', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': process.env.LEANTIME_TOKEN || ''\n },\n body: JSON.stringify({\n method: 'leantime.rpc.Users.Users.addUser',\n jsonrpc: '2.0',\n id: 1,\n params: {\n values: {\n '0': 0,\n '1': userData.lastName,\n '2': userData.firstName,\n '3': '20',\n '4': '',\n '5': 'a',\n '6': userData.email,\n '7': 0,\n '8': 0,\n '9': null,\n '10': '',\n '11': '',\n '12': '',\n '13': new Date().toISOString(),\n lastname: userData.lastName,\n firstname: userData.firstName,\n role: '20',\n profileId: '',\n status: 'a',\n username: userData.email,\n password: userData.password,\n twoFAEnabled: 0,\n clientId: 0,\n clientName: null,\n jobTitle: '',\n jobLevel: '',\n department: '',\n modified: new Date().toISOString(),\n createdOn: new Date().toISOString(),\n source: 'keycloak',\n notifications: 1,\n settings: '{}'\n }\n }\n })\n });\n const data = await response.json();\n console.log('Leantime response:', data);\n if (!response.ok || !data.result) {\n console.error('Leantime user creation failed:', data);\n return {\n success: false,\n error: data.error?.message || 'Failed to create user in Leantime'\n };\n }\n return {\n success: true\n };\n } catch (error) {\n console.error('Error creating Leantime user:', error);\n return {\n success: false,\n error: 'Error creating user in Leantime'\n };\n }\n}\nasync function POST(req) {\n const session = await (0,next_auth_next__WEBPACK_IMPORTED_MODULE_0__.getServerSession)(_app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_1__.authOptions);\n if (!session) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Non autorisé\"\n }, {\n status: 401\n });\n }\n try {\n const data = await req.json();\n console.log(\"Creating user:\", data);\n // Validate username\n const usernameValidation = validateUsername(data.username);\n if (!usernameValidation.isValid) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: usernameValidation.error\n }, {\n status: 400\n });\n }\n const token = await getAdminToken();\n if (!token) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur d'authentification\"\n }, {\n status: 401\n });\n }\n // First, get all available roles from Keycloak\n const rolesResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/roles`, {\n headers: {\n Authorization: `Bearer ${token}`\n }\n });\n if (!rolesResponse.ok) {\n const errorData = await rolesResponse.json();\n console.error(\"Failed to fetch roles:\", errorData);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur lors de la récupération des rôles\"\n }, {\n status: rolesResponse.status\n });\n }\n const availableRoles = await rolesResponse.json();\n console.log(\"Available roles:\", availableRoles);\n // Verify that the requested roles exist\n const requestedRoles = data.roles || [];\n const validRoles = requestedRoles.filter((roleName)=>availableRoles.some((r)=>r.name === roleName));\n if (validRoles.length === 0) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Aucun rôle valide n'a été spécifié\"\n }, {\n status: 400\n });\n }\n // Create the user in Keycloak\n const createResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n username: data.username,\n enabled: true,\n emailVerified: true,\n firstName: data.firstName,\n lastName: data.lastName,\n email: data.email,\n credentials: [\n {\n type: \"password\",\n value: data.password,\n temporary: false\n }\n ]\n })\n });\n console.log(\"Keycloak create response:\", {\n status: createResponse.status,\n ok: createResponse.ok\n });\n if (!createResponse.ok) {\n const errorData = await createResponse.json();\n console.error(\"Keycloak error:\", errorData);\n if (errorData.errorMessage?.includes(\"User exists with same username\")) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Un utilisateur existe déjà avec ce nom d'utilisateur\"\n }, {\n status: 400\n });\n } else if (errorData.errorMessage?.includes(\"User exists with same email\")) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Un utilisateur existe déjà avec cet email\"\n }, {\n status: 400\n });\n }\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur création utilisateur\",\n details: errorData\n }, {\n status: 400\n });\n }\n // Get the created user\n const userResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users?username=${data.username}`, {\n headers: {\n Authorization: `Bearer ${token}`\n }\n });\n const users = await userResponse.json();\n const user = users[0];\n if (!user) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Utilisateur créé mais impossible de le récupérer\"\n }, {\n status: 500\n });\n }\n // Add roles to the user\n const roleObjects = validRoles.map((roleName)=>availableRoles.find((r)=>r.name === roleName));\n const roleResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${user.id}/role-mappings/realm`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(roleObjects)\n });\n if (!roleResponse.ok) {\n const errorData = await roleResponse.json();\n console.error(\"Failed to add roles:\", errorData);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur lors de l'ajout des rôles\",\n details: errorData\n }, {\n status: 500\n });\n }\n // Create user in Leantime\n const leantimeResult = await createLeantimeUser({\n username: data.username,\n firstName: data.firstName,\n lastName: data.lastName,\n email: data.email,\n password: data.password\n });\n if (!leantimeResult.success) {\n console.error(\"Leantime user creation failed:\", leantimeResult.error);\n // We don't return an error here since Keycloak user was created successfully\n // We just log the error and continue\n }\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n success: true,\n user: {\n ...user,\n roles: validRoles\n }\n });\n } catch (error) {\n console.error(\"Error creating user:\", error);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur serveur\",\n details: error\n }, {\n status: 500\n });\n }\n}\n// Helper function to delete user from Leantime\nasync function deleteLeantimeUser(email) {\n try {\n const response = await fetch('https://agilite.slm-lab.net/api/jsonrpc', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': process.env.LEANTIME_TOKEN || ''\n },\n body: JSON.stringify({\n method: 'leantime.rpc.Users.Users.deleteUser',\n jsonrpc: '2.0',\n id: 1,\n params: {\n email: email\n }\n })\n });\n const data = await response.json();\n console.log('Leantime delete response:', data);\n if (!response.ok || !data.result) {\n console.error('Leantime user deletion failed:', data);\n return {\n success: false,\n error: data.error?.message || 'Failed to delete user in Leantime'\n };\n }\n return {\n success: true\n };\n } catch (error) {\n console.error('Error deleting Leantime user:', error);\n return {\n success: false,\n error: 'Error deleting user in Leantime'\n };\n }\n}\nasync function DELETE(req) {\n const session = await (0,next_auth_next__WEBPACK_IMPORTED_MODULE_0__.getServerSession)(_app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_1__.authOptions);\n if (!session) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Non autorisé\"\n }, {\n status: 401\n });\n }\n try {\n const { searchParams } = new URL(req.url);\n const userId = searchParams.get('id');\n const email = searchParams.get('email');\n if (!userId || !email) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"ID utilisateur et email requis\"\n }, {\n status: 400\n });\n }\n const token = await getAdminToken();\n if (!token) {\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur d'authentification\"\n }, {\n status: 401\n });\n }\n // Delete user from Keycloak\n const deleteResponse = await fetch(`${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/users/${userId}`, {\n method: \"DELETE\",\n headers: {\n Authorization: `Bearer ${token}`\n }\n });\n if (!deleteResponse.ok) {\n const errorData = await deleteResponse.json();\n console.error(\"Keycloak delete error:\", errorData);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur lors de la suppression de l'utilisateur\",\n details: errorData\n }, {\n status: deleteResponse.status\n });\n }\n // Delete user from Leantime\n const leantimeResult = await deleteLeantimeUser(email);\n if (!leantimeResult.success) {\n console.error(\"Leantime user deletion failed:\", leantimeResult.error);\n // We don't return an error here since Keycloak user was deleted successfully\n // We just log the error and continue\n }\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n success: true\n });\n } catch (error) {\n console.error(\"Error deleting user:\", error);\n return next_server__WEBPACK_IMPORTED_MODULE_2__.NextResponse.json({\n error: \"Erreur serveur\",\n details: error\n }, {\n status: 500\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzNDRyxRQUFRRixLQUFLLENBQUMsMEJBQTBCZ0c7WUFDeEMsT0FBT3BHLHFEQUFZQSxDQUFDRyxJQUFJLENBQ3RCO2dCQUFFQyxPQUFPO2dCQUFrRDhHLFNBQVNkO1lBQVUsR0FDOUU7Z0JBQUUvRixRQUFRMEgsZUFBZTFILE1BQU07WUFBQztRQUVwQztRQUVBLDRCQUE0QjtRQUM1QixNQUFNa0gsaUJBQWlCLE1BQU1DLG1CQUFtQmhFO1FBRWhELElBQUksQ0FBQytELGVBQWV6QixPQUFPLEVBQUU7WUFDM0J4RixRQUFRRixLQUFLLENBQUMsa0NBQWtDbUgsZUFBZW5ILEtBQUs7UUFDcEUsNkVBQTZFO1FBQzdFLHFDQUFxQztRQUN2QztRQUVBLE9BQU9KLHFEQUFZQSxDQUFDRyxJQUFJLENBQUM7WUFBRTJGLFNBQVM7UUFBSztJQUUzQyxFQUFFLE9BQU8xRixPQUFPO1FBQ2RFLFFBQVFGLEtBQUssQ0FBQyx3QkFBd0JBO1FBQ3RDLE9BQU9KLHFEQUFZQSxDQUFDRyxJQUFJLENBQ3RCO1lBQUVDLE9BQU87WUFBa0I4RyxTQUFTOUc7UUFBTSxHQUMxQztZQUFFQyxRQUFRO1FBQUk7SUFFbEI7QUFDRiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9hcHAvYXBpL3VzZXJzL3JvdXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNlcnZlclNlc3Npb24gfSBmcm9tIFwibmV4dC1hdXRoL25leHRcIjtcbmltcG9ydCB7IGF1dGhPcHRpb25zIH0gZnJvbSBcIkAvYXBwL2FwaS9hdXRoL1suLi5uZXh0YXV0aF0vcm91dGVcIjtcbmltcG9ydCB7IE5leHRSZXNwb25zZSB9IGZyb20gXCJuZXh0L3NlcnZlclwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gR0VUKCkge1xuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U2VydmVyU2Vzc2lvbihhdXRoT3B0aW9ucyk7XG5cbiAgaWYgKCFzZXNzaW9uKSB7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgZXJyb3I6IFwiTm9uIGF1dG9yaXPDqVwiIH0sIHsgc3RhdHVzOiA0MDEgfSk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhcIlNlc3Npb246XCIsIHtcbiAgICBhY2Nlc3NUb2tlbjogc2Vzc2lvbi5hY2Nlc3NUb2tlbj8uc3Vic3RyaW5nKDAsIDIwKSArIFwiLi4uXCIsXG4gICAgdXNlcjogc2Vzc2lvbi51c2VyLFxuICB9KTtcblxuICB0cnkge1xuICAgIC8vIEdldCBjbGllbnQgY3JlZGVudGlhbHMgdG9rZW5cbiAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBgJHtwcm9jZXNzLmVudi5LRVlDTE9BS19CQVNFX1VSTH0vcmVhbG1zLyR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfUkVBTE19L3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuYCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgIGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICAgIGNsaWVudF9pZDogcHJvY2Vzcy5lbnYuS0VZQ0xPQUtfQ0xJRU5UX0lEISxcbiAgICAgICAgICBjbGllbnRfc2VjcmV0OiBwcm9jZXNzLmVudi5LRVlDTE9BS19DTElFTlRfU0VDUkVUISxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHRva2VuRGF0YSA9IGF3YWl0IHRva2VuUmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnNvbGUubG9nKFwiVG9rZW4gcmVzcG9uc2U6XCIsIHtcbiAgICAgIG9rOiB0b2tlblJlc3BvbnNlLm9rLFxuICAgICAgc3RhdHVzOiB0b2tlblJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIGRhdGE6IHRva2VuRGF0YS5hY2Nlc3NfdG9rZW4gPyBcIlRva2VuIHJlY2VpdmVkXCIgOiB0b2tlbkRhdGEsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRva2VuUmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZ2V0IHRva2VuOlwiLCB0b2tlbkRhdGEpO1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFtnZXRDdXJyZW50VXNlcihzZXNzaW9uKV0pO1xuICAgIH1cblxuICAgIC8vIEdldCB1c2VycyBsaXN0IHdpdGggYnJpZWY9ZmFsc2UgdG8gZ2V0IGZ1bGwgdXNlciBkZXRhaWxzXG4gICAgY29uc3QgdXNlcnNSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfQkFTRV9VUkx9L2FkbWluL3JlYWxtcy8ke3Byb2Nlc3MuZW52LktFWUNMT0FLX1JFQUxNfS91c2Vycz9icmllZlJlcHJlc2VudGF0aW9uPWZhbHNlYCxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbkRhdGEuYWNjZXNzX3Rva2VufWAsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKCF1c2Vyc1Jlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHVzZXJzOlwiLCBhd2FpdCB1c2Vyc1Jlc3BvbnNlLnRleHQoKSk7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oW2dldEN1cnJlbnRVc2VyKHNlc3Npb24pXSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcnMgPSBhd2FpdCB1c2Vyc1Jlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zb2xlLmxvZyhcIlJhdyB1c2VycyBkYXRhOlwiLCB1c2Vycy5tYXAoKHU6IGFueSkgPT4gKHtcbiAgICAgIGlkOiB1LmlkLFxuICAgICAgdXNlcm5hbWU6IHUudXNlcm5hbWUsXG4gICAgICByZWFsbTogdS5yZWFsbSxcbiAgICAgIHNlcnZpY2VBY2NvdW50Q2xpZW50SWQ6IHUuc2VydmljZUFjY291bnRDbGllbnRJZCxcbiAgICB9KSkpO1xuXG4gICAgLy8gRmlsdGVyIG91dCBzZXJ2aWNlIGFjY291bnRzIGFuZCB1c2VycyBmcm9tIG90aGVyIHJlYWxtc1xuICAgIGNvbnN0IGZpbHRlcmVkVXNlcnMgPSB1c2Vycy5maWx0ZXIoKHVzZXI6IGFueSkgPT4gXG4gICAgICAhdXNlci5zZXJ2aWNlQWNjb3VudENsaWVudElkICYmIC8vIFJlbW92ZSBzZXJ2aWNlIGFjY291bnRzXG4gICAgICAoIXVzZXIucmVhbG0gfHwgdXNlci5yZWFsbSA9PT0gcHJvY2Vzcy5lbnYuS0VZQ0xPQUtfUkVBTE0pIC8vIE9ubHkgdXNlcnMgZnJvbSBvdXIgcmVhbG1cbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coXCJGaWx0ZXJlZCB1c2VycyBjb3VudDpcIiwgZmlsdGVyZWRVc2Vycy5sZW5ndGgpO1xuXG4gICAgLy8gRmV0Y2ggcm9sZXMgZm9yIGVhY2ggdXNlclxuICAgIGNvbnN0IHVzZXJzV2l0aFJvbGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsdGVyZWRVc2Vycy5tYXAoYXN5bmMgKHVzZXI6IGFueSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgcm9sZXNSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgIGAke3Byb2Nlc3MuZW52LktFWUNMT0FLX0JBU0VfVVJMfS9hZG1pbi9yZWFsbXMvJHtwcm9jZXNzLmVudi5LRVlDTE9BS19SRUFMTX0vdXNlcnMvJHt1c2VyLmlkfS9yb2xlLW1hcHBpbmdzL3JlYWxtYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbkRhdGEuYWNjZXNzX3Rva2VufWAsXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgcm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzUmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBjb25zdCByb2xlc0RhdGEgPSBhd2FpdCByb2xlc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICByb2xlcyA9IHJvbGVzRGF0YVxuICAgICAgICAgICAgLmZpbHRlcigocm9sZTogYW55KSA9PiBcbiAgICAgICAgICAgICAgIXJvbGUubmFtZS5zdGFydHNXaXRoKCdkZWZhdWx0LXJvbGVzLScpICYmIFxuICAgICAgICAgICAgICAhWydvZmZsaW5lX2FjY2VzcycsICd1bWFfYXV0aG9yaXphdGlvbiddLmluY2x1ZGVzKHJvbGUubmFtZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5tYXAoKHJvbGU6IGFueSkgPT4gcm9sZS5uYW1lKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgUm9sZXMgZm9yIHVzZXIgJHt1c2VyLnVzZXJuYW1lfTpgLCByb2xlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiB1c2VyLmlkLFxuICAgICAgICAgIHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lLFxuICAgICAgICAgIGZpcnN0TmFtZTogdXNlci5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgbGFzdE5hbWU6IHVzZXIubGFzdE5hbWUgfHwgJycsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgY3JlYXRlZFRpbWVzdGFtcDogdXNlci5jcmVhdGVkVGltZXN0YW1wLFxuICAgICAgICAgIGVuYWJsZWQ6IHVzZXIuZW5hYmxlZCxcbiAgICAgICAgICByb2xlczogcm9sZXMsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBmZXRjaGluZyByb2xlcyBmb3IgdXNlciAke3VzZXIuaWR9OmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdXNlci5pZCxcbiAgICAgICAgICB1c2VybmFtZTogdXNlci51c2VybmFtZSxcbiAgICAgICAgICBmaXJzdE5hbWU6IHVzZXIuZmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICAgIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lIHx8ICcnLFxuICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICAgIGNyZWF0ZWRUaW1lc3RhbXA6IHVzZXIuY3JlYXRlZFRpbWVzdGFtcCxcbiAgICAgICAgICBlbmFibGVkOiB1c2VyLmVuYWJsZWQsXG4gICAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pKTtcblxuICAgIGNvbnNvbGUubG9nKFwiRmluYWwgdXNlcnMgZGF0YTpcIiwgdXNlcnNXaXRoUm9sZXMubWFwKHUgPT4gKHtcbiAgICAgIHVzZXJuYW1lOiB1LnVzZXJuYW1lLFxuICAgICAgcm9sZXM6IHUucm9sZXMsXG4gICAgfSkpKTtcblxuICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih1c2Vyc1dpdGhSb2xlcyk7XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oW2dldEN1cnJlbnRVc2VyKHNlc3Npb24pXSk7XG4gIH1cbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBjdXJyZW50IHVzZXIgZGF0YVxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoc2Vzc2lvbjogYW55KSB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHNlc3Npb24udXNlci5pZCxcbiAgICB1c2VybmFtZTogc2Vzc2lvbi51c2VyLnVzZXJuYW1lLFxuICAgIGZpcnN0TmFtZTogc2Vzc2lvbi51c2VyLmZpcnN0X25hbWUsXG4gICAgbGFzdE5hbWU6IHNlc3Npb24udXNlci5sYXN0X25hbWUsXG4gICAgZW1haWw6IHNlc3Npb24udXNlci5lbWFpbCxcbiAgICBjcmVhdGVkVGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIHJvbGVzOiBzZXNzaW9uLnVzZXIucm9sZSB8fCBbXSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWRtaW5Ub2tlbigpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBgJHtwcm9jZXNzLmVudi5LRVlDTE9BS19CQVNFX1VSTH0vcmVhbG1zLyR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfUkVBTE19L3Byb3RvY29sL29wZW5pZC1jb25uZWN0L3Rva2VuYCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgIGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnLFxuICAgICAgICAgIGNsaWVudF9pZDogcHJvY2Vzcy5lbnYuS0VZQ0xPQUtfQ0xJRU5UX0lEISxcbiAgICAgICAgICBjbGllbnRfc2VjcmV0OiBwcm9jZXNzLmVudi5LRVlDTE9BS19DTElFTlRfU0VDUkVUISxcbiAgICAgICAgfSksXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0b2tlblJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmICghdG9rZW5SZXNwb25zZS5vayB8fCAhZGF0YS5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Rva2VuIEVycm9yOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEuYWNjZXNzX3Rva2VuO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1Rva2VuIEVycm9yOicsIGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBWYWxpZGF0ZSB1c2VybmFtZSBhY2NvcmRpbmcgdG8gS2V5Y2xvYWsgcmVxdWlyZW1lbnRzXG5mdW5jdGlvbiB2YWxpZGF0ZVVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAvLyBLZXljbG9hayB1c2VybmFtZSByZXF1aXJlbWVudHM6XG4gIC8vIC0gT25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZG90cyAoLiksIGh5cGhlbnMgKC0pLCBhbmQgdW5kZXJzY29yZXMgKF8pXG4gIC8vIC0gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIG9yIG51bWJlclxuICAvLyAtIE11c3QgYmUgYmV0d2VlbiAzIGFuZCAyNTUgY2hhcmFjdGVyc1xuICBjb25zdCB1c2VybmFtZVJlZ2V4ID0gL15bYS16QS1aMC05XVthLXpBLVowLTkuXy1dezIsMjU0fSQvO1xuICBcbiAgaWYgKCF1c2VybmFtZVJlZ2V4LnRlc3QodXNlcm5hbWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgZXJyb3I6IFwiTGUgbm9tIGQndXRpbGlzYXRldXIgZG9pdCBjb21tZW5jZXIgcGFyIHVuZSBsZXR0cmUgb3UgdW4gY2hpZmZyZSwgbmUgY29udGVuaXIgcXVlIGRlcyBsZXR0cmVzLCBjaGlmZnJlcywgcG9pbnRzLCB0aXJldHMgZXQgdW5kZXJzY29yZXMsIGV0IGZhaXJlIGVudHJlIDMgZXQgMjU1IGNhcmFjdMOocmVzXCJcbiAgICB9O1xuICB9XG4gIFxuICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgdXNlciBpbiBMZWFudGltZVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGVhbnRpbWVVc2VyKHVzZXJEYXRhOiB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIGZpcnN0TmFtZTogc3RyaW5nO1xuICBsYXN0TmFtZTogc3RyaW5nO1xuICBlbWFpbDogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xufSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBlcnJvcj86IHN0cmluZyB9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hZ2lsaXRlLnNsbS1sYWIubmV0L2FwaS9qc29ucnBjJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICdYLUFQSS1LZXknOiBwcm9jZXNzLmVudi5MRUFOVElNRV9UT0tFTiB8fCAnJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1ldGhvZDogJ2xlYW50aW1lLnJwYy5Vc2Vycy5Vc2Vycy5hZGRVc2VyJyxcbiAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgIGlkOiAxLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICB2YWx1ZXM6IHtcbiAgICAgICAgICAgICcwJzogMCwgLy8gVGhpcyB3aWxsIGJlIHNldCBieSBMZWFudGltZVxuICAgICAgICAgICAgJzEnOiB1c2VyRGF0YS5sYXN0TmFtZSxcbiAgICAgICAgICAgICcyJzogdXNlckRhdGEuZmlyc3ROYW1lLFxuICAgICAgICAgICAgJzMnOiAnMjAnLCAvLyBEZWZhdWx0IHJvbGVcbiAgICAgICAgICAgICc0JzogJycsIC8vIHByb2ZpbGVJZFxuICAgICAgICAgICAgJzUnOiAnYScsIC8vIHN0YXR1c1xuICAgICAgICAgICAgJzYnOiB1c2VyRGF0YS5lbWFpbCxcbiAgICAgICAgICAgICc3JzogMCwgLy8gdHdvRkFFbmFibGVkXG4gICAgICAgICAgICAnOCc6IDAsIC8vIGNsaWVudElkXG4gICAgICAgICAgICAnOSc6IG51bGwsIC8vIGNsaWVudE5hbWVcbiAgICAgICAgICAgICcxMCc6ICcnLCAvLyBqb2JUaXRsZVxuICAgICAgICAgICAgJzExJzogJycsIC8vIGpvYkxldmVsXG4gICAgICAgICAgICAnMTInOiAnJywgLy8gZGVwYXJ0bWVudFxuICAgICAgICAgICAgJzEzJzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLCAvLyBtb2RpZmllZFxuICAgICAgICAgICAgbGFzdG5hbWU6IHVzZXJEYXRhLmxhc3ROYW1lLFxuICAgICAgICAgICAgZmlyc3RuYW1lOiB1c2VyRGF0YS5maXJzdE5hbWUsXG4gICAgICAgICAgICByb2xlOiAnMjAnLCAvLyBEZWZhdWx0IHJvbGVcbiAgICAgICAgICAgIHByb2ZpbGVJZDogJycsXG4gICAgICAgICAgICBzdGF0dXM6ICdhJyxcbiAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VyRGF0YS5lbWFpbCxcbiAgICAgICAgICAgIHBhc3N3b3JkOiB1c2VyRGF0YS5wYXNzd29yZCxcbiAgICAgICAgICAgIHR3b0ZBRW5hYmxlZDogMCxcbiAgICAgICAgICAgIGNsaWVudElkOiAwLFxuICAgICAgICAgICAgY2xpZW50TmFtZTogbnVsbCxcbiAgICAgICAgICAgIGpvYlRpdGxlOiAnJyxcbiAgICAgICAgICAgIGpvYkxldmVsOiAnJyxcbiAgICAgICAgICAgIGRlcGFydG1lbnQ6ICcnLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGNyZWF0ZWRPbjogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgc291cmNlOiAna2V5Y2xvYWsnLFxuICAgICAgICAgICAgbm90aWZpY2F0aW9uczogMSxcbiAgICAgICAgICAgIHNldHRpbmdzOiAne30nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjb25zb2xlLmxvZygnTGVhbnRpbWUgcmVzcG9uc2U6JywgZGF0YSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLnJlc3VsdCkge1xuICAgICAgY29uc29sZS5lcnJvcignTGVhbnRpbWUgdXNlciBjcmVhdGlvbiBmYWlsZWQ6JywgZGF0YSk7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgc3VjY2VzczogZmFsc2UsIFxuICAgICAgICBlcnJvcjogZGF0YS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGluIExlYW50aW1lJyBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIExlYW50aW1lIHVzZXI6JywgZXJyb3IpO1xuICAgIHJldHVybiB7IFxuICAgICAgc3VjY2VzczogZmFsc2UsIFxuICAgICAgZXJyb3I6ICdFcnJvciBjcmVhdGluZyB1c2VyIGluIExlYW50aW1lJyBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcTogUmVxdWVzdCkge1xuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U2VydmVyU2Vzc2lvbihhdXRoT3B0aW9ucyk7XG5cbiAgaWYgKCFzZXNzaW9uKSB7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgZXJyb3I6IFwiTm9uIGF1dG9yaXPDqVwiIH0sIHsgc3RhdHVzOiA0MDEgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXEuanNvbigpO1xuICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgdXNlcjpcIiwgZGF0YSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB1c2VybmFtZVxuICAgIGNvbnN0IHVzZXJuYW1lVmFsaWRhdGlvbiA9IHZhbGlkYXRlVXNlcm5hbWUoZGF0YS51c2VybmFtZSk7XG4gICAgaWYgKCF1c2VybmFtZVZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgICB7IGVycm9yOiB1c2VybmFtZVZhbGlkYXRpb24uZXJyb3IgfSxcbiAgICAgICAgeyBzdGF0dXM6IDQwMCB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0QWRtaW5Ub2tlbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcIkVycmV1ciBkJ2F1dGhlbnRpZmljYXRpb25cIiB9LCB7IHN0YXR1czogNDAxIH0pO1xuICAgIH1cblxuICAgIC8vIEZpcnN0LCBnZXQgYWxsIGF2YWlsYWJsZSByb2xlcyBmcm9tIEtleWNsb2FrXG4gICAgY29uc3Qgcm9sZXNSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfQkFTRV9VUkx9L2FkbWluL3JlYWxtcy8ke3Byb2Nlc3MuZW52LktFWUNMT0FLX1JFQUxNfS9yb2xlc2AsXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKCFyb2xlc1Jlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCByb2xlc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggcm9sZXM6XCIsIGVycm9yRGF0YSk7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCJFcnJldXIgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgcsO0bGVzXCIgfSwgeyBzdGF0dXM6IHJvbGVzUmVzcG9uc2Uuc3RhdHVzIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGF2YWlsYWJsZVJvbGVzID0gYXdhaXQgcm9sZXNSZXNwb25zZS5qc29uKCk7XG4gICAgY29uc29sZS5sb2coXCJBdmFpbGFibGUgcm9sZXM6XCIsIGF2YWlsYWJsZVJvbGVzKTtcblxuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0ZWQgcm9sZXMgZXhpc3RcbiAgICBjb25zdCByZXF1ZXN0ZWRSb2xlcyA9IGRhdGEucm9sZXMgfHwgW107XG4gICAgY29uc3QgdmFsaWRSb2xlcyA9IHJlcXVlc3RlZFJvbGVzLmZpbHRlcigocm9sZU5hbWU6IHN0cmluZykgPT4gXG4gICAgICBhdmFpbGFibGVSb2xlcy5zb21lKChyOiBhbnkpID0+IHIubmFtZSA9PT0gcm9sZU5hbWUpXG4gICAgKTtcblxuICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgICB7IGVycm9yOiBcIkF1Y3VuIHLDtGxlIHZhbGlkZSBuJ2Egw6l0w6kgc3DDqWNpZmnDqVwiIH0sXG4gICAgICAgIHsgc3RhdHVzOiA0MDAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIHVzZXIgaW4gS2V5Y2xvYWtcbiAgICBjb25zdCBjcmVhdGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfQkFTRV9VUkx9L2FkbWluL3JlYWxtcy8ke3Byb2Nlc3MuZW52LktFWUNMT0FLX1JFQUxNfS91c2Vyc2AsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHVzZXJuYW1lOiBkYXRhLnVzZXJuYW1lLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZW1haWxWZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGRhdGEuZmlyc3ROYW1lLFxuICAgICAgICAgIGxhc3ROYW1lOiBkYXRhLmxhc3ROYW1lLFxuICAgICAgICAgIGVtYWlsOiBkYXRhLmVtYWlsLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwicGFzc3dvcmRcIixcbiAgICAgICAgICAgICAgdmFsdWU6IGRhdGEucGFzc3dvcmQsXG4gICAgICAgICAgICAgIHRlbXBvcmFyeTogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZyhcIktleWNsb2FrIGNyZWF0ZSByZXNwb25zZTpcIiwge1xuICAgICAgc3RhdHVzOiBjcmVhdGVSZXNwb25zZS5zdGF0dXMsXG4gICAgICBvazogY3JlYXRlUmVzcG9uc2Uub2tcbiAgICB9KTtcblxuICAgIGlmICghY3JlYXRlUmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGF3YWl0IGNyZWF0ZVJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJLZXljbG9hayBlcnJvcjpcIiwgZXJyb3JEYXRhKTtcbiAgICAgIFxuICAgICAgaWYgKGVycm9yRGF0YS5lcnJvck1lc3NhZ2U/LmluY2x1ZGVzKFwiVXNlciBleGlzdHMgd2l0aCBzYW1lIHVzZXJuYW1lXCIpKSB7XG4gICAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbihcbiAgICAgICAgICB7IGVycm9yOiBcIlVuIHV0aWxpc2F0ZXVyIGV4aXN0ZSBkw6lqw6AgYXZlYyBjZSBub20gZCd1dGlsaXNhdGV1clwiIH0sXG4gICAgICAgICAgeyBzdGF0dXM6IDQwMCB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yRGF0YS5lcnJvck1lc3NhZ2U/LmluY2x1ZGVzKFwiVXNlciBleGlzdHMgd2l0aCBzYW1lIGVtYWlsXCIpKSB7XG4gICAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbihcbiAgICAgICAgICB7IGVycm9yOiBcIlVuIHV0aWxpc2F0ZXVyIGV4aXN0ZSBkw6lqw6AgYXZlYyBjZXQgZW1haWxcIiB9LFxuICAgICAgICAgIHsgc3RhdHVzOiA0MDAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgICB7IGVycm9yOiBcIkVycmV1ciBjcsOpYXRpb24gdXRpbGlzYXRldXJcIiwgZGV0YWlsczogZXJyb3JEYXRhIH0sXG4gICAgICAgIHsgc3RhdHVzOiA0MDAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGNyZWF0ZWQgdXNlclxuICAgIGNvbnN0IHVzZXJSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfQkFTRV9VUkx9L2FkbWluL3JlYWxtcy8ke3Byb2Nlc3MuZW52LktFWUNMT0FLX1JFQUxNfS91c2Vycz91c2VybmFtZT0ke2RhdGEudXNlcm5hbWV9YCxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCB1c2VycyA9IGF3YWl0IHVzZXJSZXNwb25zZS5qc29uKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJzWzBdO1xuXG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oXG4gICAgICAgIHsgZXJyb3I6IFwiVXRpbGlzYXRldXIgY3LDqcOpIG1haXMgaW1wb3NzaWJsZSBkZSBsZSByw6ljdXDDqXJlclwiIH0sXG4gICAgICAgIHsgc3RhdHVzOiA1MDAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcm9sZXMgdG8gdGhlIHVzZXJcbiAgICBjb25zdCByb2xlT2JqZWN0cyA9IHZhbGlkUm9sZXMubWFwKChyb2xlTmFtZTogc3RyaW5nKSA9PiBcbiAgICAgIGF2YWlsYWJsZVJvbGVzLmZpbmQoKHI6IGFueSkgPT4gci5uYW1lID09PSByb2xlTmFtZSlcbiAgICApO1xuXG4gICAgY29uc3Qgcm9sZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBgJHtwcm9jZXNzLmVudi5LRVlDTE9BS19CQVNFX1VSTH0vYWRtaW4vcmVhbG1zLyR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfUkVBTE19L3VzZXJzLyR7dXNlci5pZH0vcm9sZS1tYXBwaW5ncy9yZWFsbWAsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocm9sZU9iamVjdHMpLFxuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoIXJvbGVSZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JEYXRhID0gYXdhaXQgcm9sZVJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gYWRkIHJvbGVzOlwiLCBlcnJvckRhdGEpO1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgICB7IGVycm9yOiBcIkVycmV1ciBsb3JzIGRlIGwnYWpvdXQgZGVzIHLDtGxlc1wiLCBkZXRhaWxzOiBlcnJvckRhdGEgfSxcbiAgICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB1c2VyIGluIExlYW50aW1lXG4gICAgY29uc3QgbGVhbnRpbWVSZXN1bHQgPSBhd2FpdCBjcmVhdGVMZWFudGltZVVzZXIoe1xuICAgICAgdXNlcm5hbWU6IGRhdGEudXNlcm5hbWUsXG4gICAgICBmaXJzdE5hbWU6IGRhdGEuZmlyc3ROYW1lLFxuICAgICAgbGFzdE5hbWU6IGRhdGEubGFzdE5hbWUsXG4gICAgICBlbWFpbDogZGF0YS5lbWFpbCxcbiAgICAgIHBhc3N3b3JkOiBkYXRhLnBhc3N3b3JkLFxuICAgIH0pO1xuXG4gICAgaWYgKCFsZWFudGltZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTGVhbnRpbWUgdXNlciBjcmVhdGlvbiBmYWlsZWQ6XCIsIGxlYW50aW1lUmVzdWx0LmVycm9yKTtcbiAgICAgIC8vIFdlIGRvbid0IHJldHVybiBhbiBlcnJvciBoZXJlIHNpbmNlIEtleWNsb2FrIHVzZXIgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAvLyBXZSBqdXN0IGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICB1c2VyOiB7XG4gICAgICAgIC4uLnVzZXIsXG4gICAgICAgIHJvbGVzOiB2YWxpZFJvbGVzLFxuICAgICAgfSxcbiAgICB9KTtcblxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyB1c2VyOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgeyBlcnJvcjogXCJFcnJldXIgc2VydmV1clwiLCBkZXRhaWxzOiBlcnJvciB9LFxuICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgKTtcbiAgfVxufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIHVzZXIgZnJvbSBMZWFudGltZVxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGVhbnRpbWVVc2VyKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYWdpbGl0ZS5zbG0tbGFiLm5ldC9hcGkvanNvbnJwYycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1BUEktS2V5JzogcHJvY2Vzcy5lbnYuTEVBTlRJTUVfVE9LRU4gfHwgJycsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZXRob2Q6ICdsZWFudGltZS5ycGMuVXNlcnMuVXNlcnMuZGVsZXRlVXNlcicsXG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgICAgICBpZDogMSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnNvbGUubG9nKCdMZWFudGltZSBkZWxldGUgcmVzcG9uc2U6JywgZGF0YSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFkYXRhLnJlc3VsdCkge1xuICAgICAgY29uc29sZS5lcnJvcignTGVhbnRpbWUgdXNlciBkZWxldGlvbiBmYWlsZWQ6JywgZGF0YSk7XG4gICAgICByZXR1cm4geyBcbiAgICAgICAgc3VjY2VzczogZmFsc2UsIFxuICAgICAgICBlcnJvcjogZGF0YS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGRlbGV0ZSB1c2VyIGluIExlYW50aW1lJyBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIExlYW50aW1lIHVzZXI6JywgZXJyb3IpO1xuICAgIHJldHVybiB7IFxuICAgICAgc3VjY2VzczogZmFsc2UsIFxuICAgICAgZXJyb3I6ICdFcnJvciBkZWxldGluZyB1c2VyIGluIExlYW50aW1lJyBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBERUxFVEUocmVxOiBSZXF1ZXN0KSB7XG4gIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBnZXRTZXJ2ZXJTZXNzaW9uKGF1dGhPcHRpb25zKTtcblxuICBpZiAoIXNlc3Npb24pIHtcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCJOb24gYXV0b3Jpc8OpXCIgfSwgeyBzdGF0dXM6IDQwMSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBzZWFyY2hQYXJhbXMgfSA9IG5ldyBVUkwocmVxLnVybCk7XG4gICAgY29uc3QgdXNlcklkID0gc2VhcmNoUGFyYW1zLmdldCgnaWQnKTtcbiAgICBjb25zdCBlbWFpbCA9IHNlYXJjaFBhcmFtcy5nZXQoJ2VtYWlsJyk7XG5cbiAgICBpZiAoIXVzZXJJZCB8fCAhZW1haWwpIHtcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbihcbiAgICAgICAgeyBlcnJvcjogXCJJRCB1dGlsaXNhdGV1ciBldCBlbWFpbCByZXF1aXNcIiB9LFxuICAgICAgICB7IHN0YXR1czogNDAwIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBZG1pblRva2VuKCk7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgZXJyb3I6IFwiRXJyZXVyIGQnYXV0aGVudGlmaWNhdGlvblwiIH0sIHsgc3RhdHVzOiA0MDEgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIHVzZXIgZnJvbSBLZXljbG9ha1xuICAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBgJHtwcm9jZXNzLmVudi5LRVlDTE9BS19CQVNFX1VSTH0vYWRtaW4vcmVhbG1zLyR7cHJvY2Vzcy5lbnYuS0VZQ0xPQUtfUkVBTE19L3VzZXJzLyR7dXNlcklkfWAsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoIWRlbGV0ZVJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBlcnJvckRhdGEgPSBhd2FpdCBkZWxldGVSZXNwb25zZS5qc29uKCk7XG4gICAgICBjb25zb2xlLmVycm9yKFwiS2V5Y2xvYWsgZGVsZXRlIGVycm9yOlwiLCBlcnJvckRhdGEpO1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgICB7IGVycm9yOiBcIkVycmV1ciBsb3JzIGRlIGxhIHN1cHByZXNzaW9uIGRlIGwndXRpbGlzYXRldXJcIiwgZGV0YWlsczogZXJyb3JEYXRhIH0sXG4gICAgICAgIHsgc3RhdHVzOiBkZWxldGVSZXNwb25zZS5zdGF0dXMgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdXNlciBmcm9tIExlYW50aW1lXG4gICAgY29uc3QgbGVhbnRpbWVSZXN1bHQgPSBhd2FpdCBkZWxldGVMZWFudGltZVVzZXIoZW1haWwpO1xuXG4gICAgaWYgKCFsZWFudGltZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTGVhbnRpbWUgdXNlciBkZWxldGlvbiBmYWlsZWQ6XCIsIGxlYW50aW1lUmVzdWx0LmVycm9yKTtcbiAgICAgIC8vIFdlIGRvbid0IHJldHVybiBhbiBlcnJvciBoZXJlIHNpbmNlIEtleWNsb2FrIHVzZXIgd2FzIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAvLyBXZSBqdXN0IGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgc3VjY2VzczogdHJ1ZSB9KTtcblxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkZWxldGluZyB1c2VyOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFxuICAgICAgeyBlcnJvcjogXCJFcnJldXIgc2VydmV1clwiLCBkZXRhaWxzOiBlcnJvciB9LFxuICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImdldFNlcnZlclNlc3Npb24iLCJhdXRoT3B0aW9ucyIsIk5leHRSZXNwb25zZSIsIkdFVCIsInNlc3Npb24iLCJqc29uIiwiZXJyb3IiLCJzdGF0dXMiLCJjb25zb2xlIiwibG9nIiwiYWNjZXNzVG9rZW4iLCJzdWJzdHJpbmciLCJ1c2VyIiwidG9rZW5SZXNwb25zZSIsImZldGNoIiwicHJvY2VzcyIsImVudiIsIktFWUNMT0FLX0JBU0VfVVJMIiwiS0VZQ0xPQUtfUkVBTE0iLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIlVSTFNlYXJjaFBhcmFtcyIsImdyYW50X3R5cGUiLCJjbGllbnRfaWQiLCJLRVlDTE9BS19DTElFTlRfSUQiLCJjbGllbnRfc2VjcmV0IiwiS0VZQ0xPQUtfQ0xJRU5UX1NFQ1JFVCIsInRva2VuRGF0YSIsIm9rIiwiZGF0YSIsImFjY2Vzc190b2tlbiIsImdldEN1cnJlbnRVc2VyIiwidXNlcnNSZXNwb25zZSIsIkF1dGhvcml6YXRpb24iLCJ0ZXh0IiwidXNlcnMiLCJtYXAiLCJ1IiwiaWQiLCJ1c2VybmFtZSIsInJlYWxtIiwic2VydmljZUFjY291bnRDbGllbnRJZCIsImZpbHRlcmVkVXNlcnMiLCJmaWx0ZXIiLCJsZW5ndGgiLCJ1c2Vyc1dpdGhSb2xlcyIsIlByb21pc2UiLCJhbGwiLCJyb2xlc1Jlc3BvbnNlIiwicm9sZXMiLCJyb2xlc0RhdGEiLCJyb2xlIiwibmFtZSIsInN0YXJ0c1dpdGgiLCJpbmNsdWRlcyIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJjcmVhdGVkVGltZXN0YW1wIiwiZW5hYmxlZCIsImZpcnN0X25hbWUiLCJsYXN0X25hbWUiLCJEYXRlIiwibm93IiwiZ2V0QWRtaW5Ub2tlbiIsInZhbGlkYXRlVXNlcm5hbWUiLCJ1c2VybmFtZVJlZ2V4IiwidGVzdCIsImlzVmFsaWQiLCJjcmVhdGVMZWFudGltZVVzZXIiLCJ1c2VyRGF0YSIsInJlc3BvbnNlIiwiTEVBTlRJTUVfVE9LRU4iLCJKU09OIiwic3RyaW5naWZ5IiwianNvbnJwYyIsInBhcmFtcyIsInZhbHVlcyIsInRvSVNPU3RyaW5nIiwibGFzdG5hbWUiLCJmaXJzdG5hbWUiLCJwcm9maWxlSWQiLCJwYXNzd29yZCIsInR3b0ZBRW5hYmxlZCIsImNsaWVudElkIiwiY2xpZW50TmFtZSIsImpvYlRpdGxlIiwiam9iTGV2ZWwiLCJkZXBhcnRtZW50IiwibW9kaWZpZWQiLCJjcmVhdGVkT24iLCJzb3VyY2UiLCJub3RpZmljYXRpb25zIiwic2V0dGluZ3MiLCJyZXN1bHQiLCJzdWNjZXNzIiwibWVzc2FnZSIsIlBPU1QiLCJyZXEiLCJ1c2VybmFtZVZhbGlkYXRpb24iLCJ0b2tlbiIsImVycm9yRGF0YSIsImF2YWlsYWJsZVJvbGVzIiwicmVxdWVzdGVkUm9sZXMiLCJ2YWxpZFJvbGVzIiwicm9sZU5hbWUiLCJzb21lIiwiciIsImNyZWF0ZVJlc3BvbnNlIiwiZW1haWxWZXJpZmllZCIsImNyZWRlbnRpYWxzIiwidHlwZSIsInZhbHVlIiwidGVtcG9yYXJ5IiwiZXJyb3JNZXNzYWdlIiwiZGV0YWlscyIsInVzZXJSZXNwb25zZSIsInJvbGVPYmplY3RzIiwiZmluZCIsInJvbGVSZXNwb25zZSIsImxlYW50aW1lUmVzdWx0IiwiZGVsZXRlTGVhbnRpbWVVc2VyIiwiREVMRVRFIiwic2VhcmNoUGFyYW1zIiwiVVJMIiwidXJsIiwidXNlcklkIiwiZ2V0IiwiZGVsZXRlUmVzcG9uc2UiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./app/api/users/route.ts\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fusers%2Froute&page=%2Fapi%2Fusers%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fusers%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fusers%2Froute&page=%2Fapi%2Fusers%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fusers%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ patchFetch: () => (/* binding */ patchFetch),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ serverHooks: () => (/* binding */ serverHooks),\n/* harmony export */ workAsyncStorage: () => (/* binding */ workAsyncStorage),\n/* harmony export */ workUnitAsyncStorage: () => (/* binding */ workUnitAsyncStorage)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/route-modules/app-route/module.compiled */ \"(rsc)/./node_modules/next/dist/server/route-modules/app-route/module.compiled.js\");\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/route-kind */ \"(rsc)/./node_modules/next/dist/server/route-kind.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/server/lib/patch-fetch */ \"(rsc)/./node_modules/next/dist/server/lib/patch-fetch.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _home_alma_nextgen_Neah_mail_app_api_users_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/api/users/route.ts */ \"(rsc)/./app/api/users/route.ts\");\n\n\n\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppRouteRouteModule({\n definition: {\n kind: next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_ROUTE,\n page: \"/api/users/route\",\n pathname: \"/api/users\",\n filename: \"route\",\n bundlePath: \"app/api/users/route\"\n },\n resolvedPagePath: \"/home/alma/nextgen/Neah-mail/app/api/users/route.ts\",\n nextConfigOutput,\n userland: _home_alma_nextgen_Neah_mail_app_api_users_route_ts__WEBPACK_IMPORTED_MODULE_3__\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return (0,next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__.patchFetch)({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\n\n\n//# sourceMappingURL=app-route.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIvaW5kZXguanM/bmFtZT1hcHAlMkZhcGklMkZ1c2VycyUyRnJvdXRlJnBhZ2U9JTJGYXBpJTJGdXNlcnMlMkZyb3V0ZSZhcHBQYXRocz0mcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcGklMkZ1c2VycyUyRnJvdXRlLnRzJmFwcERpcj0lMkZob21lJTJGYWxtYSUyRm5leHRnZW4lMkZOZWFoLW1haWwlMkZhcHAmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZyb290RGlyPSUyRmhvbWUlMkZhbG1hJTJGbmV4dGdlbiUyRk5lYWgtbWFpbCZpc0Rldj10cnVlJnRzY29uZmlnUGF0aD10c2NvbmZpZy5qc29uJmJhc2VQYXRoPSZhc3NldFByZWZpeD0mbmV4dENvbmZpZ091dHB1dD0mcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCEiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBK0Y7QUFDdkM7QUFDcUI7QUFDRztBQUNoRjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IseUdBQW1CO0FBQzNDO0FBQ0EsY0FBYyxrRUFBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsWUFBWTtBQUNaLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxRQUFRLHNEQUFzRDtBQUM5RDtBQUNBLFdBQVcsNEVBQVc7QUFDdEI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUMwRjs7QUFFMUYiLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBSb3V0ZVJvdXRlTW9kdWxlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9hcHAtcm91dGUvbW9kdWxlLmNvbXBpbGVkXCI7XG5pbXBvcnQgeyBSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yb3V0ZS1raW5kXCI7XG5pbXBvcnQgeyBwYXRjaEZldGNoIGFzIF9wYXRjaEZldGNoIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL3BhdGNoLWZldGNoXCI7XG5pbXBvcnQgKiBhcyB1c2VybGFuZCBmcm9tIFwiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9hcHAvYXBpL3VzZXJzL3JvdXRlLnRzXCI7XG4vLyBXZSBpbmplY3QgdGhlIG5leHRDb25maWdPdXRwdXQgaGVyZSBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSBpbiB0aGUgcm91dGVcbi8vIG1vZHVsZS5cbmNvbnN0IG5leHRDb25maWdPdXRwdXQgPSBcIlwiXG5jb25zdCByb3V0ZU1vZHVsZSA9IG5ldyBBcHBSb3V0ZVJvdXRlTW9kdWxlKHtcbiAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgIGtpbmQ6IFJvdXRlS2luZC5BUFBfUk9VVEUsXG4gICAgICAgIHBhZ2U6IFwiL2FwaS91c2Vycy9yb3V0ZVwiLFxuICAgICAgICBwYXRobmFtZTogXCIvYXBpL3VzZXJzXCIsXG4gICAgICAgIGZpbGVuYW1lOiBcInJvdXRlXCIsXG4gICAgICAgIGJ1bmRsZVBhdGg6IFwiYXBwL2FwaS91c2Vycy9yb3V0ZVwiXG4gICAgfSxcbiAgICByZXNvbHZlZFBhZ2VQYXRoOiBcIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvYXBwL2FwaS91c2Vycy9yb3V0ZS50c1wiLFxuICAgIG5leHRDb25maWdPdXRwdXQsXG4gICAgdXNlcmxhbmRcbn0pO1xuLy8gUHVsbCBvdXQgdGhlIGV4cG9ydHMgdGhhdCB3ZSBuZWVkIHRvIGV4cG9zZSBmcm9tIHRoZSBtb2R1bGUuIFRoaXMgc2hvdWxkXG4vLyBiZSBlbGltaW5hdGVkIHdoZW4gd2UndmUgbW92ZWQgdGhlIG90aGVyIHJvdXRlcyB0byB0aGUgbmV3IGZvcm1hdC4gVGhlc2Vcbi8vIGFyZSB1c2VkIHRvIGhvb2sgaW50byB0aGUgcm91dGUuXG5jb25zdCB7IHdvcmtBc3luY1N0b3JhZ2UsIHdvcmtVbml0QXN5bmNTdG9yYWdlLCBzZXJ2ZXJIb29rcyB9ID0gcm91dGVNb2R1bGU7XG5mdW5jdGlvbiBwYXRjaEZldGNoKCkge1xuICAgIHJldHVybiBfcGF0Y2hGZXRjaCh7XG4gICAgICAgIHdvcmtBc3luY1N0b3JhZ2UsXG4gICAgICAgIHdvcmtVbml0QXN5bmNTdG9yYWdlXG4gICAgfSk7XG59XG5leHBvcnQgeyByb3V0ZU1vZHVsZSwgd29ya0FzeW5jU3RvcmFnZSwgd29ya1VuaXRBc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzLCBwYXRjaEZldGNoLCAgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwLXJvdXRlLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fusers%2Froute&page=%2Fapi%2Fusers%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fusers%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n");
/***/ }),
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
/*!******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
\******************************************************************************************************/
/***/ (() => {
/***/ }),
/***/ "(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
/*!******************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
\******************************************************************************************************/
/***/ (() => {
/***/ }),
/***/ "../app-render/after-task-async-storage.external":
/*!***********************************************************************************!*\
!*** external "next/dist/server/app-render/after-task-async-storage.external.js" ***!
\***********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/after-task-async-storage.external.js");
/***/ }),
/***/ "../app-render/work-async-storage.external":
/*!*****************************************************************************!*\
!*** external "next/dist/server/app-render/work-async-storage.external.js" ***!
\*****************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/work-async-storage.external.js");
/***/ }),
/***/ "./work-unit-async-storage.external":
/*!**********************************************************************************!*\
!*** external "next/dist/server/app-render/work-unit-async-storage.external.js" ***!
\**********************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/server/app-render/work-unit-async-storage.external.js");
/***/ }),
/***/ "assert":
/*!*************************!*\
!*** external "assert" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("assert");
/***/ }),
/***/ "buffer":
/*!*************************!*\
!*** external "buffer" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("buffer");
/***/ }),
/***/ "crypto":
/*!*************************!*\
!*** external "crypto" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("crypto");
/***/ }),
/***/ "events":
/*!*************************!*\
!*** external "events" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = require("events");
/***/ }),
/***/ "http":
/*!***********************!*\
!*** external "http" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("http");
/***/ }),
/***/ "https":
/*!************************!*\
!*** external "https" ***!
\************************/
/***/ ((module) => {
"use strict";
module.exports = require("https");
/***/ }),
/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js":
/*!*************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***!
\*************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js");
/***/ }),
/***/ "next/dist/compiled/next-server/app-route.runtime.dev.js":
/*!**************************************************************************!*\
!*** external "next/dist/compiled/next-server/app-route.runtime.dev.js" ***!
\**************************************************************************/
/***/ ((module) => {
"use strict";
module.exports = require("next/dist/compiled/next-server/app-route.runtime.dev.js");
/***/ }),
/***/ "querystring":
/*!******************************!*\
!*** external "querystring" ***!
\******************************/
/***/ ((module) => {
"use strict";
module.exports = require("querystring");
/***/ }),
/***/ "url":
/*!**********************!*\
!*** external "url" ***!
\**********************/
/***/ ((module) => {
"use strict";
module.exports = require("url");
/***/ }),
/***/ "util":
/*!***********************!*\
!*** external "util" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("util");
/***/ }),
/***/ "zlib":
/*!***********************!*\
!*** external "zlib" ***!
\***********************/
/***/ ((module) => {
"use strict";
module.exports = require("zlib");
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../../../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next","vendor-chunks/jose","vendor-chunks/next-auth","vendor-chunks/openid-client","vendor-chunks/@babel","vendor-chunks/oauth","vendor-chunks/preact","vendor-chunks/uuid","vendor-chunks/yallist","vendor-chunks/preact-render-to-string","vendor-chunks/cookie","vendor-chunks/oidc-token-hash","vendor-chunks/@panva","vendor-chunks/jwt-decode"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fusers%2Froute&page=%2Fapi%2Fusers%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fusers%2Froute.ts&appDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2Fhome%2Falma%2Fnextgen%2FNeah-mail&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!")));
module.exports = __webpack_exports__;
})();