import { usePostAuthRedirect } from "/_nuxt/lib/auth/composables/postAuthRedirect.ts"; import { deserializeHashState, serializeHashState } from "/_nuxt/lib/common/composables/url.ts"; import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; import { useSafeLogger } from "/_nuxt/composables/logging.ts"; export const profileRoute = "/profile"; export const authBlockedDueToVerificationRoute = "/error-email-verify"; export const homeRoute = "/"; export const projectsRoute = "/projects"; export const loginRoute = "/authn/login"; export const registerRoute = "/authn/register"; export const ssoLoginRoute = "/authn/sso"; export const forgottenPasswordRoute = "/authn/forgotten-password"; export const verifyEmailRoute = "/verify-email"; export const verifyEmailCountdownRoute = "/verify-email?source=registration"; export const serverManagementRoute = "/server-management"; export const accLoginRoute = "/authn/acc"; export const accRoute = "/acc"; export const connectorsRoute = "/connectors"; export const tutorialsRoute = "/tutorials"; export const docsPageUrl = "https://docs.speckle.systems/"; export const forumPageUrl = "https://speckle.community/"; export const guideBillingUrl = "https://docs.speckle.systems/workspaces/billing"; export const onboardingRoute = "/onboarding"; export const viewerDocsRoute = "https://docs.speckle.systems/3d-viewer/interface-nav"; export const settingsUserRoutes = { profile: "/settings/user/profile", notifications: "/settings/user/notifications", developerSettings: "/settings/user/developer", emails: "/settings/user/emails" }; export const settingsServerRoutes = { general: "/settings/server/general", projects: "/settings/server/projects", members: "/settings/server/members", regions: "/settings/server/regions" }; export const settingsWorkspaceRoutes = { general: { name: "settings-workspaces-slug-general", route: (slug) => slug ? `/settings/workspaces/${slug}/general` : "/" }, members: { name: "settings-workspaces-slug-members", route: (slug) => slug ? `/settings/workspaces/${slug}/members` : "/" }, membersGuests: { name: "settings-workspaces-slug-members-guests", route: (slug) => slug ? `/settings/workspaces/${slug}/members/guests` : "/" }, membersInvites: { name: "settings-workspaces-slug-members-invites", route: (slug) => slug ? `/settings/workspaces/${slug}/members/invites` : "/" }, membersRequests: { name: "settings-workspaces-slug-members-requests", route: (slug) => slug ? `/settings/workspaces/${slug}/members/requests` : "/" }, projects: { name: "settings-workspaces-slug-projects", route: (slug) => slug ? `/settings/workspaces/${slug}/projects` : "/" }, integrations: { name: "settings-workspaces-slug-integrations", route: (slug) => slug ? `/settings/workspaces/${slug}/integrations` : "/" }, automation: { name: "settings-workspaces-slug-automation", route: (slug) => `/settings/workspaces/${slug}/automation` }, security: { name: "settings-workspaces-slug-security", route: (slug) => slug ? `/settings/workspaces/${slug}/security` : "/" }, billing: { name: "settings-workspaces-slug-billing", route: (slug) => slug ? `/settings/workspaces/${slug}/billing` : "/" }, regions: { name: "settings-workspaces-slug-regions", route: (slug) => slug ? `/settings/workspaces/${slug}/regions` : "/" } }; export const projectRoute = (id, tab) => { let res = `/projects/${id}`; if (tab && tab !== "models") { res += `/${tab}`; } return res; }; export const projectAutomationRoute = (projectId, automationId) => { return `${projectRoute(projectId, "automations")}/${automationId}`; }; export const modelRoute = (projectId, resourceIdString, hashState) => `/projects/${projectId}/models/${resourceIdString}${hashState ? serializeHashState(hashState) || "" : ""}`; export const viewerRoute = modelRoute; export const modelVersionsRoute = (projectId, modelId) => `/projects/${projectId}/models/${modelId}/versions`; export const allProjectModelsRoute = (projectId) => `/projects/${projectId}`; export const projectDiscussionsRoute = (projectId) => `/projects/${projectId}`; export const projectSettingsRoute = (projectId) => `/projects/${projectId}/settings`; export const projectWebhooksRoute = (projectId) => `/projects/${projectId}/settings/webhooks`; export const projectTokensRoute = (projectId) => `/projects/${projectId}/settings/tokens`; export const projectIntegrationsRoute = (projectId) => `/projects/${projectId}/settings/integrations`; export const threadRedirectRoute = (projectId, threadId) => `/projects/${projectId}/threads/${threadId}`; export const automateGithubAppAuthorizationRoute = (workspaceSlug) => { return `/api/automate/auth/githubapp${workspaceSlug ? `?workspaceSlug=${workspaceSlug}` : ""}`; }; export const publicAutomateFunctionsRoute = "/functions"; export const automateFunctionRoute = (functionId) => `${publicAutomateFunctionsRoute}/${functionId}`; export const workspaceRoute = (slug) => slug ? `/workspaces/${slug}` : "/"; export const workspaceSsoRoute = (slug) => `/workspaces/${slug}/sso`; export const dashboardsRoute = (slug) => `/workspaces/${slug}/dashboards`; export const dashboardRoute = (slug, id) => `/workspaces/${slug}/dashboards/${id}`; export const workspaceCreateRoute = "/workspaces/actions/create"; export const workspaceJoinRoute = "/workspaces/actions/join"; export const workspaceFunctionsRoute = (slug) => `/workspaces/${slug}/functions`; export const workspaceIntegrationSettingsRoute = (slug) => `/settings/workspaces/${slug}/integrations`; export const presentationRoute = (projectId, presentationId) => `/projects/${projectId}/presentations/${presentationId}`; const buildNavigationComposable = (route) => () => { const router = useRouter(); return (params) => { const { query } = params || {}; return router.push({ path: route, query }); }; }; export const useNavigateToHome = buildNavigationComposable(homeRoute); export const useNavigateToLogin = buildNavigationComposable(loginRoute); export const useNavigateToRegistration = buildNavigationComposable(registerRoute); export const useNavigateToForgottenPassword = buildNavigationComposable(forgottenPasswordRoute); export const useNavigateToProject = () => { const router = useRouter(); return (params) => { const { query, id } = params || {}; return router.push({ path: projectRoute(id), query }); }; }; export const useRememberRouteAndGoToLogin = () => { const goToLogin = useNavigateToLogin(); const postAuthRedirect = usePostAuthRedirect(); return async (...params) => { postAuthRedirect.setCurrentRoute(); return goToLogin(...params); }; }; export const doesRouteFitTarget = (fullPathA, fullPathB) => { const fakeOrigin = "https://test.com"; let urlA; let urlB; try { urlA = new URL(fullPathA, fakeOrigin); urlB = new URL(fullPathB, fakeOrigin); } catch (e) { useSafeLogger().logger().warn("Failed to parse URLs", e); return false; } if (urlA.pathname !== urlB.pathname) { return false; } const queryKeysA = urlA.searchParams.keys(); for (const key of queryKeysA) { if (urlB.searchParams.get(key) !== urlA.searchParams.get(key)) { return false; } } const hashA = deserializeHashState(urlA.hash); const hashB = deserializeHashState(urlB.hash); for (const [key, value] of Object.entries(hashA)) { if (hashB[key] !== value) { return false; } } return true; }; export const LearnMoreMoveProjectsUrl = "https://speckle.systems/pricing"; //# sourceMappingURL=data:application/json;base64,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QUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksS0FBSyxhQUFhLEtBQUssVUFBVTtBQUNuQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sYUFBYSxLQUFLLGFBQWEsS0FBSztBQUMxQyxhQUFXLE9BQU8sWUFBWTtBQUM1QixRQUFJLEtBQUssYUFBYSxJQUFJLEdBQUcsTUFBTSxLQUFLLGFBQWEsSUFBSSxHQUFHLEdBQUc7QUFDN0QsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsUUFBTSxRQUFRLHFCQUFxQixLQUFLLElBQUk7QUFDNUMsUUFBTSxRQUFRLHFCQUFxQixLQUFLLElBQUk7QUFDNUMsYUFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDaEQsUUFBSSxNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQ3hCLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVPLGFBQU0sMkJBQTJCIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJyb3V0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvY2F0aW9uUXVlcnlSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xyXG5pbXBvcnQgeyB1c2VQb3N0QXV0aFJlZGlyZWN0IH0gZnJvbSAnfi9saWIvYXV0aC9jb21wb3NhYmxlcy9wb3N0QXV0aFJlZGlyZWN0J1xyXG5pbXBvcnQgeyBkZXNlcmlhbGl6ZUhhc2hTdGF0ZSwgc2VyaWFsaXplSGFzaFN0YXRlIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy91cmwnXHJcbmltcG9ydCB0eXBlIHsgVmlld2VySGFzaFN0YXRlS2V5cyB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvdXJsSGFzaFN0YXRlJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5cclxuZXhwb3J0IGNvbnN0IHByb2ZpbGVSb3V0ZSA9ICcvcHJvZmlsZSdcclxuZXhwb3J0IGNvbnN0IGF1dGhCbG9ja2VkRHVlVG9WZXJpZmljYXRpb25Sb3V0ZSA9ICcvZXJyb3ItZW1haWwtdmVyaWZ5J1xyXG5leHBvcnQgY29uc3QgaG9tZVJvdXRlID0gJy8nXHJcbmV4cG9ydCBjb25zdCBwcm9qZWN0c1JvdXRlID0gJy9wcm9qZWN0cydcclxuZXhwb3J0IGNvbnN0IGxvZ2luUm91dGUgPSAnL2F1dGhuL2xvZ2luJ1xyXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJSb3V0ZSA9ICcvYXV0aG4vcmVnaXN0ZXInXHJcbmV4cG9ydCBjb25zdCBzc29Mb2dpblJvdXRlID0gJy9hdXRobi9zc28nXHJcbmV4cG9ydCBjb25zdCBmb3Jnb3R0ZW5QYXNzd29yZFJvdXRlID0gJy9hdXRobi9mb3Jnb3R0ZW4tcGFzc3dvcmQnXHJcbmV4cG9ydCBjb25zdCB2ZXJpZnlFbWFpbFJvdXRlID0gJy92ZXJpZnktZW1haWwnXHJcbmV4cG9ydCBjb25zdCB2ZXJpZnlFbWFpbENvdW50ZG93blJvdXRlID0gJy92ZXJpZnktZW1haWw/c291cmNlPXJlZ2lzdHJhdGlvbidcclxuZXhwb3J0IGNvbnN0IHNlcnZlck1hbmFnZW1lbnRSb3V0ZSA9ICcvc2VydmVyLW1hbmFnZW1lbnQnXHJcbmV4cG9ydCBjb25zdCBhY2NMb2dpblJvdXRlID0gJy9hdXRobi9hY2MnXHJcbmV4cG9ydCBjb25zdCBhY2NSb3V0ZSA9ICcvYWNjJ1xyXG5leHBvcnQgY29uc3QgY29ubmVjdG9yc1JvdXRlID0gJy9jb25uZWN0b3JzJ1xyXG5leHBvcnQgY29uc3QgdHV0b3JpYWxzUm91dGUgPSAnL3R1dG9yaWFscydcclxuZXhwb3J0IGNvbnN0IGRvY3NQYWdlVXJsID0gJ2h0dHBzOi8vZG9jcy5zcGVja2xlLnN5c3RlbXMvJ1xyXG5leHBvcnQgY29uc3QgZm9ydW1QYWdlVXJsID0gJ2h0dHBzOi8vc3BlY2tsZS5jb21tdW5pdHkvJ1xyXG5leHBvcnQgY29uc3QgZ3VpZGVCaWxsaW5nVXJsID0gJ2h0dHBzOi8vZG9jcy5zcGVja2xlLnN5c3RlbXMvd29ya3NwYWNlcy9iaWxsaW5nJ1xyXG5leHBvcnQgY29uc3Qgb25ib2FyZGluZ1JvdXRlID0gJy9vbmJvYXJkaW5nJ1xyXG5leHBvcnQgY29uc3Qgdmlld2VyRG9jc1JvdXRlID0gJ2h0dHBzOi8vZG9jcy5zcGVja2xlLnN5c3RlbXMvM2Qtdmlld2VyL2ludGVyZmFjZS1uYXYnXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NVc2VyUm91dGVzID0ge1xyXG4gIHByb2ZpbGU6ICcvc2V0dGluZ3MvdXNlci9wcm9maWxlJyxcclxuICBub3RpZmljYXRpb25zOiAnL3NldHRpbmdzL3VzZXIvbm90aWZpY2F0aW9ucycsXHJcbiAgZGV2ZWxvcGVyU2V0dGluZ3M6ICcvc2V0dGluZ3MvdXNlci9kZXZlbG9wZXInLFxyXG4gIGVtYWlsczogJy9zZXR0aW5ncy91c2VyL2VtYWlscydcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzU2VydmVyUm91dGVzID0ge1xyXG4gIGdlbmVyYWw6ICcvc2V0dGluZ3Mvc2VydmVyL2dlbmVyYWwnLFxyXG4gIHByb2plY3RzOiAnL3NldHRpbmdzL3NlcnZlci9wcm9qZWN0cycsXHJcbiAgbWVtYmVyczogJy9zZXR0aW5ncy9zZXJ2ZXIvbWVtYmVycycsXHJcbiAgcmVnaW9uczogJy9zZXR0aW5ncy9zZXJ2ZXIvcmVnaW9ucydcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzV29ya3NwYWNlUm91dGVzID0ge1xyXG4gIGdlbmVyYWw6IHtcclxuICAgIG5hbWU6ICdzZXR0aW5ncy13b3Jrc3BhY2VzLXNsdWctZ2VuZXJhbCcsXHJcbiAgICByb3V0ZTogKHNsdWc6IE1heWJlTnVsbE9yVW5kZWZpbmVkPHN0cmluZz4pID0+XHJcbiAgICAgIHNsdWcgPyBgL3NldHRpbmdzL3dvcmtzcGFjZXMvJHtzbHVnfS9nZW5lcmFsYCA6ICcvJ1xyXG4gIH0sXHJcbiAgbWVtYmVyczoge1xyXG4gICAgbmFtZTogJ3NldHRpbmdzLXdvcmtzcGFjZXMtc2x1Zy1tZW1iZXJzJyxcclxuICAgIHJvdXRlOiAoc2x1ZzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICAgICAgc2x1ZyA/IGAvc2V0dGluZ3Mvd29ya3NwYWNlcy8ke3NsdWd9L21lbWJlcnNgIDogJy8nXHJcbiAgfSxcclxuICBtZW1iZXJzR3Vlc3RzOiB7XHJcbiAgICBuYW1lOiAnc2V0dGluZ3Mtd29ya3NwYWNlcy1zbHVnLW1lbWJlcnMtZ3Vlc3RzJyxcclxuICAgIHJvdXRlOiAoc2x1ZzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICAgICAgc2x1ZyA/IGAvc2V0dGluZ3Mvd29ya3NwYWNlcy8ke3NsdWd9L21lbWJlcnMvZ3Vlc3RzYCA6ICcvJ1xyXG4gIH0sXHJcbiAgbWVtYmVyc0ludml0ZXM6IHtcclxuICAgIG5hbWU6ICdzZXR0aW5ncy13b3Jrc3BhY2VzLXNsdWctbWVtYmVycy1pbnZpdGVzJyxcclxuICAgIHJvdXRlOiAoc2x1ZzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICAgICAgc2x1ZyA/IGAvc2V0dGluZ3Mvd29ya3NwYWNlcy8ke3NsdWd9L21lbWJlcnMvaW52aXRlc2AgOiAnLydcclxuICB9LFxyXG4gIG1lbWJlcnNSZXF1ZXN0czoge1xyXG4gICAgbmFtZTogJ3NldHRpbmdzLXdvcmtzcGFjZXMtc2x1Zy1tZW1iZXJzLXJlcXVlc3RzJyxcclxuICAgIHJvdXRlOiAoc2x1ZzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICAgICAgc2x1ZyA/IGAvc2V0dGluZ3Mvd29ya3NwYWNlcy8ke3NsdWd9L21lbWJlcnMvcmVxdWVzdHNgIDogJy8nXHJcbiAgfSxcclxuICBwcm9qZWN0czoge1xyXG4gICAgbmFtZTogJ3NldHRpbmdzLXdvcmtzcGFjZXMtc2x1Zy1wcm9qZWN0cycsXHJcbiAgICByb3V0ZTogKHNsdWc6IE1heWJlTnVsbE9yVW5kZWZpbmVkPHN0cmluZz4pID0+XHJcbiAgICAgIHNsdWcgPyBgL3NldHRpbmdzL3dvcmtzcGFjZXMvJHtzbHVnfS9wcm9qZWN0c2AgOiAnLydcclxuICB9LFxyXG4gIGludGVncmF0aW9uczoge1xyXG4gICAgbmFtZTogJ3NldHRpbmdzLXdvcmtzcGFjZXMtc2x1Zy1pbnRlZ3JhdGlvbnMnLFxyXG4gICAgcm91dGU6IChzbHVnOiBNYXliZU51bGxPclVuZGVmaW5lZDxzdHJpbmc+KSA9PlxyXG4gICAgICBzbHVnID8gYC9zZXR0aW5ncy93b3Jrc3BhY2VzLyR7c2x1Z30vaW50ZWdyYXRpb25zYCA6ICcvJ1xyXG4gIH0sXHJcbiAgYXV0b21hdGlvbjoge1xyXG4gICAgbmFtZTogJ3NldHRpbmdzLXdvcmtzcGFjZXMtc2x1Zy1hdXRvbWF0aW9uJyxcclxuICAgIHJvdXRlOiAoc2x1Zz86IHN0cmluZykgPT4gYC9zZXR0aW5ncy93b3Jrc3BhY2VzLyR7c2x1Z30vYXV0b21hdGlvbmBcclxuICB9LFxyXG4gIHNlY3VyaXR5OiB7XHJcbiAgICBuYW1lOiAnc2V0dGluZ3Mtd29ya3NwYWNlcy1zbHVnLXNlY3VyaXR5JyxcclxuICAgIHJvdXRlOiAoc2x1ZzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICAgICAgc2x1ZyA/IGAvc2V0dGluZ3Mvd29ya3NwYWNlcy8ke3NsdWd9L3NlY3VyaXR5YCA6ICcvJ1xyXG4gIH0sXHJcbiAgYmlsbGluZzoge1xyXG4gICAgbmFtZTogJ3NldHRpbmdzLXdvcmtzcGFjZXMtc2x1Zy1iaWxsaW5nJyxcclxuICAgIHJvdXRlOiAoc2x1ZzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICAgICAgc2x1ZyA/IGAvc2V0dGluZ3Mvd29ya3NwYWNlcy8ke3NsdWd9L2JpbGxpbmdgIDogJy8nXHJcbiAgfSxcclxuICByZWdpb25zOiB7XHJcbiAgICBuYW1lOiAnc2V0dGluZ3Mtd29ya3NwYWNlcy1zbHVnLXJlZ2lvbnMnLFxyXG4gICAgcm91dGU6IChzbHVnOiBNYXliZU51bGxPclVuZGVmaW5lZDxzdHJpbmc+KSA9PlxyXG4gICAgICBzbHVnID8gYC9zZXR0aW5ncy93b3Jrc3BhY2VzLyR7c2x1Z30vcmVnaW9uc2AgOiAnLydcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBwcm9qZWN0Um91dGUgPSAoXHJcbiAgaWQ6IHN0cmluZyxcclxuICB0YWI/OlxyXG4gICAgfCAnbW9kZWxzJ1xyXG4gICAgfCAnZGlzY3Vzc2lvbnMnXHJcbiAgICB8ICdhdXRvbWF0aW9ucydcclxuICAgIHwgJ2NvbGxhYm9yYXRvcnMnXHJcbiAgICB8ICdzZXR0aW5ncydcclxuICAgIHwgJ2FjYydcclxuICAgIHwgJ2Rhc2hib2FyZHMnXHJcbikgPT4ge1xyXG4gIGxldCByZXMgPSBgL3Byb2plY3RzLyR7aWR9YFxyXG4gIGlmICh0YWIgJiYgdGFiICE9PSAnbW9kZWxzJykge1xyXG4gICAgcmVzICs9IGAvJHt0YWJ9YFxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc1xyXG59XHJcbmV4cG9ydCBjb25zdCBwcm9qZWN0QXV0b21hdGlvblJvdXRlID0gKHByb2plY3RJZDogc3RyaW5nLCBhdXRvbWF0aW9uSWQ6IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiBgJHtwcm9qZWN0Um91dGUocHJvamVjdElkLCAnYXV0b21hdGlvbnMnKX0vJHthdXRvbWF0aW9uSWR9YFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgbW9kZWxSb3V0ZSA9IChcclxuICBwcm9qZWN0SWQ6IHN0cmluZyxcclxuICByZXNvdXJjZUlkU3RyaW5nOiBzdHJpbmcsXHJcbiAgaGFzaFN0YXRlPzogUGFydGlhbDxSZWNvcmQ8Vmlld2VySGFzaFN0YXRlS2V5cywgc3RyaW5nPj5cclxuKSA9PlxyXG4gIGAvcHJvamVjdHMvJHtwcm9qZWN0SWR9L21vZGVscy8ke3Jlc291cmNlSWRTdHJpbmd9JHtcclxuICAgIGhhc2hTdGF0ZSA/IHNlcmlhbGl6ZUhhc2hTdGF0ZShoYXNoU3RhdGUpIHx8ICcnIDogJydcclxuICB9YFxyXG5leHBvcnQgY29uc3Qgdmlld2VyUm91dGUgPSBtb2RlbFJvdXRlXHJcblxyXG5leHBvcnQgY29uc3QgbW9kZWxWZXJzaW9uc1JvdXRlID0gKHByb2plY3RJZDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcpID0+XHJcbiAgYC9wcm9qZWN0cy8ke3Byb2plY3RJZH0vbW9kZWxzLyR7bW9kZWxJZH0vdmVyc2lvbnNgXHJcblxyXG4vLyBUZW1wIGNoYW5nZSB0byBhbGxQcm9qZWN0TW9kZWxzUm91dGUgdW50aWwgdGFiIHJvdXRpbmcgaXMgaW1wbGVtZW50ZWRcclxuZXhwb3J0IGNvbnN0IGFsbFByb2plY3RNb2RlbHNSb3V0ZSA9IChwcm9qZWN0SWQ6IHN0cmluZykgPT4gYC9wcm9qZWN0cy8ke3Byb2plY3RJZH1gXHJcblxyXG4vLyBUZW1wIGNoYW5nZSB0byBwcm9qZWN0RGlzY3Vzc2lvbnNSb3V0ZSB1bnRpbCB0YWIgcm91dGluZyBpcyBpbXBsZW1lbnRlZFxyXG5leHBvcnQgY29uc3QgcHJvamVjdERpc2N1c3Npb25zUm91dGUgPSAocHJvamVjdElkOiBzdHJpbmcpID0+IGAvcHJvamVjdHMvJHtwcm9qZWN0SWR9YFxyXG5cclxuZXhwb3J0IGNvbnN0IHByb2plY3RTZXR0aW5nc1JvdXRlID0gKHByb2plY3RJZDogc3RyaW5nKSA9PlxyXG4gIGAvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3NldHRpbmdzYFxyXG5cclxuZXhwb3J0IGNvbnN0IHByb2plY3RXZWJob29rc1JvdXRlID0gKHByb2plY3RJZDogc3RyaW5nKSA9PlxyXG4gIGAvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3NldHRpbmdzL3dlYmhvb2tzYFxyXG5cclxuZXhwb3J0IGNvbnN0IHByb2plY3RUb2tlbnNSb3V0ZSA9IChwcm9qZWN0SWQ6IHN0cmluZykgPT5cclxuICBgL3Byb2plY3RzLyR7cHJvamVjdElkfS9zZXR0aW5ncy90b2tlbnNgXHJcblxyXG5leHBvcnQgY29uc3QgcHJvamVjdEludGVncmF0aW9uc1JvdXRlID0gKHByb2plY3RJZDogc3RyaW5nKSA9PlxyXG4gIGAvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3NldHRpbmdzL2ludGVncmF0aW9uc2BcclxuXHJcbmV4cG9ydCBjb25zdCB0aHJlYWRSZWRpcmVjdFJvdXRlID0gKHByb2plY3RJZDogc3RyaW5nLCB0aHJlYWRJZDogc3RyaW5nKSA9PlxyXG4gIGAvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3RocmVhZHMvJHt0aHJlYWRJZH1gXHJcblxyXG5leHBvcnQgY29uc3QgYXV0b21hdGVHaXRodWJBcHBBdXRob3JpemF0aW9uUm91dGUgPSAod29ya3NwYWNlU2x1Zz86IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiBgL2FwaS9hdXRvbWF0ZS9hdXRoL2dpdGh1YmFwcCR7XHJcbiAgICB3b3Jrc3BhY2VTbHVnID8gYD93b3Jrc3BhY2VTbHVnPSR7d29ya3NwYWNlU2x1Z31gIDogJydcclxuICB9YFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgcHVibGljQXV0b21hdGVGdW5jdGlvbnNSb3V0ZSA9ICcvZnVuY3Rpb25zJ1xyXG5cclxuZXhwb3J0IGNvbnN0IGF1dG9tYXRlRnVuY3Rpb25Sb3V0ZSA9IChmdW5jdGlvbklkOiBzdHJpbmcpID0+XHJcbiAgYCR7cHVibGljQXV0b21hdGVGdW5jdGlvbnNSb3V0ZX0vJHtmdW5jdGlvbklkfWBcclxuXHJcbmV4cG9ydCBjb25zdCB3b3Jrc3BhY2VSb3V0ZSA9IChzbHVnOiBNYXliZU51bGxPclVuZGVmaW5lZDxzdHJpbmc+KSA9PlxyXG4gIHNsdWcgPyBgL3dvcmtzcGFjZXMvJHtzbHVnfWAgOiAnLydcclxuZXhwb3J0IGNvbnN0IHdvcmtzcGFjZVNzb1JvdXRlID0gKHNsdWc6IHN0cmluZykgPT4gYC93b3Jrc3BhY2VzLyR7c2x1Z30vc3NvYFxyXG5cclxuZXhwb3J0IGNvbnN0IGRhc2hib2FyZHNSb3V0ZSA9IChzbHVnPzogTWF5YmVOdWxsT3JVbmRlZmluZWQ8c3RyaW5nPikgPT5cclxuICBgL3dvcmtzcGFjZXMvJHtzbHVnfS9kYXNoYm9hcmRzYFxyXG5cclxuZXhwb3J0IGNvbnN0IGRhc2hib2FyZFJvdXRlID0gKHNsdWc/OiBNYXliZU51bGxPclVuZGVmaW5lZDxzdHJpbmc+LCBpZD86IHN0cmluZykgPT5cclxuICBgL3dvcmtzcGFjZXMvJHtzbHVnfS9kYXNoYm9hcmRzLyR7aWR9YFxyXG5cclxuZXhwb3J0IGNvbnN0IHdvcmtzcGFjZUNyZWF0ZVJvdXRlID0gJy93b3Jrc3BhY2VzL2FjdGlvbnMvY3JlYXRlJ1xyXG5cclxuZXhwb3J0IGNvbnN0IHdvcmtzcGFjZUpvaW5Sb3V0ZSA9ICcvd29ya3NwYWNlcy9hY3Rpb25zL2pvaW4nXHJcblxyXG5leHBvcnQgY29uc3Qgd29ya3NwYWNlRnVuY3Rpb25zUm91dGUgPSAoc2x1Zz86IHN0cmluZykgPT5cclxuICBgL3dvcmtzcGFjZXMvJHtzbHVnfS9mdW5jdGlvbnNgXHJcblxyXG5leHBvcnQgY29uc3Qgd29ya3NwYWNlSW50ZWdyYXRpb25TZXR0aW5nc1JvdXRlID0gKHNsdWc/OiBzdHJpbmcpID0+XHJcbiAgYC9zZXR0aW5ncy93b3Jrc3BhY2VzLyR7c2x1Z30vaW50ZWdyYXRpb25zYFxyXG5cclxuZXhwb3J0IGNvbnN0IHByZXNlbnRhdGlvblJvdXRlID0gKHByb2plY3RJZD86IHN0cmluZywgcHJlc2VudGF0aW9uSWQ/OiBzdHJpbmcpID0+XHJcbiAgYC9wcm9qZWN0cy8ke3Byb2plY3RJZH0vcHJlc2VudGF0aW9ucy8ke3ByZXNlbnRhdGlvbklkfWBcclxuXHJcbmNvbnN0IGJ1aWxkTmF2aWdhdGlvbkNvbXBvc2FibGUgPSAocm91dGU6IHN0cmluZykgPT4gKCkgPT4ge1xyXG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXHJcbiAgcmV0dXJuIChwYXJhbXM/OiB7IHF1ZXJ5PzogTG9jYXRpb25RdWVyeVJhdyB9KSA9PiB7XHJcbiAgICBjb25zdCB7IHF1ZXJ5IH0gPSBwYXJhbXMgfHwge31cclxuICAgIHJldHVybiByb3V0ZXIucHVzaCh7IHBhdGg6IHJvdXRlLCBxdWVyeSB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHVzZU5hdmlnYXRlVG9Ib21lID0gYnVpbGROYXZpZ2F0aW9uQ29tcG9zYWJsZShob21lUm91dGUpXHJcbmV4cG9ydCBjb25zdCB1c2VOYXZpZ2F0ZVRvTG9naW4gPSBidWlsZE5hdmlnYXRpb25Db21wb3NhYmxlKGxvZ2luUm91dGUpXHJcbmV4cG9ydCBjb25zdCB1c2VOYXZpZ2F0ZVRvUmVnaXN0cmF0aW9uID0gYnVpbGROYXZpZ2F0aW9uQ29tcG9zYWJsZShyZWdpc3RlclJvdXRlKVxyXG5leHBvcnQgY29uc3QgdXNlTmF2aWdhdGVUb0ZvcmdvdHRlblBhc3N3b3JkID1cclxuICBidWlsZE5hdmlnYXRpb25Db21wb3NhYmxlKGZvcmdvdHRlblBhc3N3b3JkUm91dGUpXHJcblxyXG5leHBvcnQgY29uc3QgdXNlTmF2aWdhdGVUb1Byb2plY3QgPSAoKSA9PiB7XHJcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKClcclxuICByZXR1cm4gKHBhcmFtczogeyBxdWVyeT86IExvY2F0aW9uUXVlcnlSYXc7IGlkOiBzdHJpbmcgfSkgPT4ge1xyXG4gICAgY29uc3QgeyBxdWVyeSwgaWQgfSA9IHBhcmFtcyB8fCB7fVxyXG4gICAgcmV0dXJuIHJvdXRlci5wdXNoKHsgcGF0aDogcHJvamVjdFJvdXRlKGlkKSwgcXVlcnkgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB1c2VSZW1lbWJlclJvdXRlQW5kR29Ub0xvZ2luID0gKCkgPT4ge1xyXG4gIGNvbnN0IGdvVG9Mb2dpbiA9IHVzZU5hdmlnYXRlVG9Mb2dpbigpXHJcbiAgY29uc3QgcG9zdEF1dGhSZWRpcmVjdCA9IHVzZVBvc3RBdXRoUmVkaXJlY3QoKVxyXG5cclxuICByZXR1cm4gYXN5bmMgKC4uLnBhcmFtczogUGFyYW1ldGVyczx0eXBlb2YgZ29Ub0xvZ2luPikgPT4ge1xyXG4gICAgcG9zdEF1dGhSZWRpcmVjdC5zZXRDdXJyZW50Um91dGUoKVxyXG4gICAgcmV0dXJuIGdvVG9Mb2dpbiguLi5wYXJhbXMpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgdGhhdCBmdWxsUGF0aEEgZml0cyBmdWxsUGF0aEIgKG5vdCBuZWNlc3NhcmlseSB0aGUgaW52ZXJzZSlcclxuICovXHJcbmV4cG9ydCBjb25zdCBkb2VzUm91dGVGaXRUYXJnZXQgPSAoZnVsbFBhdGhBOiBzdHJpbmcsIGZ1bGxQYXRoQjogc3RyaW5nKSA9PiB7XHJcbiAgY29uc3QgZmFrZU9yaWdpbiA9ICdodHRwczovL3Rlc3QuY29tJ1xyXG5cclxuICBsZXQgdXJsQTogVVJMXHJcbiAgbGV0IHVybEI6IFVSTFxyXG5cclxuICB0cnkge1xyXG4gICAgdXJsQSA9IG5ldyBVUkwoZnVsbFBhdGhBLCBmYWtlT3JpZ2luKVxyXG4gICAgdXJsQiA9IG5ldyBVUkwoZnVsbFBhdGhCLCBmYWtlT3JpZ2luKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHVzZVNhZmVMb2dnZXIoKS5sb2dnZXIoKS53YXJuKCdGYWlsZWQgdG8gcGFyc2UgVVJMcycsIGUpXHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGlmICh1cmxBLnBhdGhuYW1lICE9PSB1cmxCLnBhdGhuYW1lKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IHF1ZXJ5S2V5c0EgPSB1cmxBLnNlYXJjaFBhcmFtcy5rZXlzKClcclxuICBmb3IgKGNvbnN0IGtleSBvZiBxdWVyeUtleXNBKSB7XHJcbiAgICBpZiAodXJsQi5zZWFyY2hQYXJhbXMuZ2V0KGtleSkgIT09IHVybEEuc2VhcmNoUGFyYW1zLmdldChrZXkpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgaGFzaEEgPSBkZXNlcmlhbGl6ZUhhc2hTdGF0ZSh1cmxBLmhhc2gpXHJcbiAgY29uc3QgaGFzaEIgPSBkZXNlcmlhbGl6ZUhhc2hTdGF0ZSh1cmxCLmhhc2gpXHJcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGFzaEEpKSB7XHJcbiAgICBpZiAoaGFzaEJba2V5XSAhPT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTGVhcm5Nb3JlTW92ZVByb2plY3RzVXJsID0gJ2h0dHBzOi8vc3BlY2tsZS5zeXN0ZW1zL3ByaWNpbmcnXHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUudHMifQ==