@q3assets/auth 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # @q3/auth
2
+
3
+ Shared authentication package for SHIRE project dashboards. Provides M365-safe magic link auth with Supabase.
4
+
5
+ ## What's included
6
+
7
+ | Export | Type | Description |
8
+ |--------|------|-------------|
9
+ | `Login` | Component | OTP email login form |
10
+ | `AuthConfirm` | Component | M365-safe confirmation page (user must click to proceed) |
11
+ | `AuthCallback` | Component | Exchanges auth code for session |
12
+ | `createBrowserClient` | Function | PKCE-enabled Supabase client for browser |
13
+ | `createServiceClient` | Function | Service-role client for admin API routes |
14
+ | `createAuthMiddleware` | Function | Next.js middleware factory for route protection |
15
+ | `requireAdmin` | Function | Validates bearer token + admin check |
16
+ | `inviteUser` | Function | Sends invite emails routed through /auth/confirm |
17
+
18
+ ## Consuming from a project dashboard
19
+
20
+ All SHIRE projects share a filesystem via Dropbox. Shared packages live at `Q3/packages/`. Every project dashboard consumes them the same way — no monorepo, no registry.
21
+
22
+ **1. Add the dependency** in `package.json`:
23
+
24
+ ```json
25
+ "@q3/auth": "file:../../Q3/packages/auth"
26
+ ```
27
+
28
+ Path is relative from your dashboard root to this package. From `SHIRE/projects/[PROJECT]/dashboard/` it's always `../../Q3/packages/auth`.
29
+
30
+ **2. Configure `next.config.ts`:**
31
+
32
+ ```typescript
33
+ import { join } from "path"
34
+
35
+ const nextConfig = {
36
+ transpilePackages: ["@q3/auth"],
37
+ turbopack: {
38
+ root: join(__dirname, "../.."), // common parent: SHIRE/projects/
39
+ },
40
+ }
41
+ ```
42
+
43
+ `transpilePackages` tells Next.js to compile the package's TypeScript. `turbopack.root` tells Turbopack to trust the shared Dropbox filesystem so it follows the symlink.
44
+
45
+ **3. Install:** `npm install` — creates a symlink. Changes to this package are picked up immediately.
46
+
47
+ Import as `@q3/auth/login`, `@q3/auth/confirm`, etc.
48
+
49
+ ### Pages and middleware
50
+
51
+ Create three pages and a middleware. Reference implementation: `Q3/dashboard/src/`
52
+
53
+ ```
54
+ app/login/page.tsx → Login component
55
+ app/auth/confirm/page.tsx → AuthConfirm component
56
+ app/auth/callback/page.tsx → AuthCallback component
57
+ middleware.ts → createAuthMiddleware
58
+ ```
59
+
60
+ ### Environment variables (`.env.local`)
61
+
62
+ ```
63
+ NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
64
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
65
+ ```
66
+
67
+ ## Why the confirm page exists
68
+
69
+ Microsoft 365 email security pre-clicks links in emails to scan for threats. This kills magic link tokens before the user sees them. The `/auth/confirm` page is a landing page that requires a human click — M365 hits the page but won't click the button, so the token survives for the real user.
70
+
71
+ ## Auth flow
72
+
73
+ ```
74
+ User enters email on /login
75
+ → Supabase sends magic link pointing to /auth/confirm
76
+ → M365 scanner hits /auth/confirm, sees a button, leaves
77
+ → User clicks "Continue to dashboard"
78
+ → Redirects to /auth/callback with token
79
+ → AuthCallback exchanges code for session
80
+ → Redirects to /
81
+ ```
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@supabase/functions-js/dist/module/types.d.ts","../../../node_modules/@supabase/functions-js/dist/module/functionsclient.d.ts","../../../node_modules/@supabase/functions-js/dist/module/index.d.ts","../../../node_modules/@supabase/postgrest-js/dist/index.d.mts","../../../node_modules/@supabase/realtime-js/dist/module/lib/websocket-factory.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/lib/constants.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/lib/serializer.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/lib/timer.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/lib/push.d.ts","../../../node_modules/@types/phoenix/index.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/realtimepresence.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/realtimechannel.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/realtimeclient.d.ts","../../../node_modules/@supabase/realtime-js/dist/module/index.d.ts","../../../node_modules/iceberg-js/dist/index.d.ts","../../../node_modules/@supabase/storage-js/dist/index.d.mts","../../../node_modules/@supabase/auth-js/dist/module/lib/error-codes.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/errors.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/web3/ethereum.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/web3/solana.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/webauthn.dom.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/helpers.d.ts","../../../node_modules/@supabase/auth-js/dist/module/gotrueclient.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/webauthn.errors.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/webauthn.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/types.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/fetch.d.ts","../../../node_modules/@supabase/auth-js/dist/module/gotrueadminapi.d.ts","../../../node_modules/@supabase/auth-js/dist/module/authadminapi.d.ts","../../../node_modules/@supabase/auth-js/dist/module/authclient.d.ts","../../../node_modules/@supabase/auth-js/dist/module/lib/locks.d.ts","../../../node_modules/@supabase/auth-js/dist/module/index.d.ts","../../../node_modules/@supabase/supabase-js/dist/index.d.mts","../src/admin.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@types/react/index.d.ts","../node_modules/next/dist/server/get-page-files.d.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/react/canary.d.ts","../../../node_modules/@types/react/experimental.d.ts","../../../node_modules/@types/react-dom/index.d.ts","../../../node_modules/@types/react-dom/canary.d.ts","../../../node_modules/@types/react-dom/experimental.d.ts","../node_modules/next/dist/lib/fallback.d.ts","../node_modules/next/dist/compiled/webpack/webpack.d.ts","../node_modules/next/dist/server/config.d.ts","../node_modules/next/dist/lib/load-custom-routes.d.ts","../node_modules/next/dist/shared/lib/image-config.d.ts","../node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../node_modules/next/dist/server/body-streams.d.ts","../node_modules/next/dist/server/route-kind.d.ts","../node_modules/next/dist/server/route-definitions/route-definition.d.ts","../node_modules/next/dist/server/route-matches/route-match.d.ts","../node_modules/next/dist/client/components/app-router-headers.d.ts","../node_modules/next/dist/server/lib/cache-control.d.ts","../node_modules/next/dist/server/lib/cache-handlers/types.d.ts","../node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","../node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","../node_modules/next/dist/lib/constants.d.ts","../node_modules/next/dist/server/render-result.d.ts","../node_modules/next/dist/server/response-cache/types.d.ts","../node_modules/next/dist/server/response-cache/index.d.ts","../../../node_modules/@types/react/jsx-runtime.d.ts","../node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","../node_modules/next/dist/server/request-meta.d.ts","../node_modules/next/dist/cli/next-test.d.ts","../node_modules/next/dist/server/lib/experimental/ppr.d.ts","../node_modules/next/dist/lib/setup-exception-listeners.d.ts","../node_modules/next/dist/lib/worker.d.ts","../node_modules/next/dist/build/rendering-mode.d.ts","../node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","../node_modules/next/dist/server/require-hook.d.ts","../node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","../node_modules/next/dist/lib/page-types.d.ts","../node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","../node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","../node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../node_modules/next/dist/server/node-polyfill-crypto.d.ts","../node_modules/next/dist/server/node-environment-baseline.d.ts","../node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","../node_modules/next/dist/server/node-environment-extensions/random.d.ts","../node_modules/next/dist/server/node-environment-extensions/date.d.ts","../node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","../node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","../node_modules/next/dist/server/node-environment.d.ts","../node_modules/next/dist/build/page-extensions-type.d.ts","../node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../node_modules/next/dist/server/instrumentation/types.d.ts","../node_modules/next/dist/lib/coalesced-function.d.ts","../node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../node_modules/next/dist/server/lib/router-utils/types.d.ts","../node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../node_modules/next/dist/shared/lib/constants.d.ts","../node_modules/next/dist/trace/types.d.ts","../node_modules/next/dist/trace/trace.d.ts","../node_modules/next/dist/trace/shared.d.ts","../node_modules/next/dist/trace/index.d.ts","../node_modules/next/dist/build/load-jsconfig.d.ts","../node_modules/@next/env/dist/index.d.ts","../node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","../node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","../node_modules/next/dist/telemetry/storage.d.ts","../node_modules/next/dist/build/build-context.d.ts","../node_modules/next/dist/shared/lib/bloom-filter.d.ts","../node_modules/next/dist/build/webpack-config.d.ts","../node_modules/next/dist/build/swc/generated-native.d.ts","../node_modules/next/dist/build/swc/types.d.ts","../node_modules/next/dist/server/dev/parse-version-info.d.ts","../node_modules/next/dist/next-devtools/shared/types.d.ts","../node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","../node_modules/next/dist/server/lib/parse-stack.d.ts","../node_modules/next/dist/next-devtools/server/shared.d.ts","../node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","../node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","../node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","../node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","../node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../node_modules/next/dist/server/lib/i18n-provider.d.ts","../node_modules/next/dist/server/web/next-url.d.ts","../node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../node_modules/next/dist/server/web/spec-extension/request.d.ts","../node_modules/next/dist/server/after/builtin-request-context.d.ts","../node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../node_modules/next/dist/server/web/spec-extension/response.d.ts","../node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","../node_modules/next/dist/server/web/types.d.ts","../node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../node_modules/next/dist/server/base-http/node.d.ts","../node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","../node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","../node_modules/next/dist/shared/lib/mitt.d.ts","../node_modules/next/dist/client/with-router.d.ts","../node_modules/next/dist/client/router.d.ts","../node_modules/next/dist/client/route-loader.d.ts","../node_modules/next/dist/client/page-loader.d.ts","../node_modules/next/dist/shared/lib/router/router.d.ts","../node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","../node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","../node_modules/next/dist/server/lib/app-dir-module.d.ts","../node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../node_modules/next/dist/server/app-render/cache-signal.d.ts","../node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","../node_modules/next/dist/server/request/fallback-params.d.ts","../node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","../node_modules/next/dist/server/lib/lazy-result.d.ts","../node_modules/next/dist/server/lib/implicit-tags.d.ts","../node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","../node_modules/next/dist/shared/lib/deep-readonly.d.ts","../node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","../node_modules/next/dist/server/app-render/app-render.d.ts","../node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","../node_modules/next/dist/client/components/error-boundary.d.ts","../node_modules/next/dist/client/components/layout-router.d.ts","../node_modules/next/dist/client/components/render-from-template-context.d.ts","../node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","../node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","../node_modules/next/dist/client/components/client-page.d.ts","../node_modules/next/dist/client/components/client-segment.d.ts","../node_modules/next/dist/server/request/search-params.d.ts","../node_modules/next/dist/client/components/hooks-server-context.d.ts","../node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","../node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../node_modules/next/dist/lib/metadata/types/resolvers.d.ts","../node_modules/next/dist/lib/metadata/types/icons.d.ts","../node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","../node_modules/next/dist/lib/metadata/metadata.d.ts","../node_modules/next/dist/lib/framework/boundary-components.d.ts","../node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../node_modules/next/dist/server/app-render/rsc/postpone.d.ts","../node_modules/next/dist/server/app-render/rsc/taint.d.ts","../node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","../node_modules/next/dist/server/app-render/collect-segment-data.d.ts","../node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","../node_modules/next/dist/server/app-render/entry-base.d.ts","../node_modules/next/dist/build/templates/app-page.d.ts","../../../node_modules/@types/react/jsx-dev-runtime.d.ts","../../../node_modules/@types/react/compiler-runtime.d.ts","../node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","../../../node_modules/@types/react-dom/client.d.ts","../../../node_modules/@types/react-dom/static.d.ts","../../../node_modules/@types/react-dom/server.d.ts","../node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","../node_modules/next/dist/server/route-modules/app-page/module.d.ts","../node_modules/next/dist/server/web/adapter.d.ts","../node_modules/next/dist/server/use-cache/cache-life.d.ts","../node_modules/next/dist/server/app-render/types.d.ts","../node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../node_modules/next/dist/client/flight-data-helpers.d.ts","../node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","../node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","../node_modules/next/dist/build/templates/pages.d.ts","../node_modules/next/dist/server/route-modules/pages/module.d.ts","../node_modules/next/dist/server/render.d.ts","../node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","../node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","../node_modules/next/dist/server/route-matchers/route-matcher.d.ts","../node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","../node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","../node_modules/next/dist/server/normalizers/normalizer.d.ts","../node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","../node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","../node_modules/next/dist/server/normalizers/request/suffix.d.ts","../node_modules/next/dist/server/normalizers/request/rsc.d.ts","../node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","../node_modules/next/dist/server/normalizers/request/next-data.d.ts","../node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","../node_modules/next/dist/build/static-paths/types.d.ts","../node_modules/next/dist/server/base-server.d.ts","../node_modules/next/dist/server/lib/async-callback-set.d.ts","../node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../../node_modules/sharp/lib/index.d.ts","../node_modules/next/dist/server/image-optimizer.d.ts","../node_modules/next/dist/server/next-server.d.ts","../node_modules/next/dist/server/lib/types.d.ts","../node_modules/next/dist/server/lib/lru-cache.d.ts","../node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../node_modules/next/dist/server/dev/static-paths-worker.d.ts","../node_modules/next/dist/server/dev/next-dev-server.d.ts","../node_modules/next/dist/server/next.d.ts","../node_modules/next/dist/server/lib/render-server.d.ts","../node_modules/next/dist/server/lib/router-server.d.ts","../node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","../node_modules/next/dist/server/route-modules/route-module.d.ts","../node_modules/next/dist/server/load-components.d.ts","../node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","../node_modules/next/dist/server/async-storage/work-store.d.ts","../node_modules/next/dist/server/web/http.d.ts","../node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","../node_modules/next/dist/client/components/redirect-status-code.d.ts","../node_modules/next/dist/client/components/redirect-error.d.ts","../node_modules/next/dist/build/templates/app-route.d.ts","../node_modules/next/dist/server/route-modules/app-route/module.d.ts","../node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","../node_modules/next/dist/build/segment-config/app/app-segments.d.ts","../node_modules/next/dist/build/utils.d.ts","../node_modules/next/dist/build/turborepo-access-trace/types.d.ts","../node_modules/next/dist/build/turborepo-access-trace/result.d.ts","../node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","../node_modules/next/dist/build/turborepo-access-trace/index.d.ts","../node_modules/next/dist/export/routes/types.d.ts","../node_modules/next/dist/export/types.d.ts","../node_modules/next/dist/export/worker.d.ts","../node_modules/next/dist/build/worker.d.ts","../node_modules/next/dist/build/index.d.ts","../node_modules/next/dist/server/config-shared.d.ts","../node_modules/next/dist/server/base-http/index.d.ts","../node_modules/next/dist/server/api-utils/index.d.ts","../node_modules/next/dist/types.d.ts","../node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../node_modules/next/dist/shared/lib/utils.d.ts","../node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../node_modules/next/dist/server/after/after.d.ts","../node_modules/next/dist/server/after/after-context.d.ts","../node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","../node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","../node_modules/next/dist/server/request/params.d.ts","../node_modules/next/dist/client/components/redirect.d.ts","../node_modules/next/dist/client/components/not-found.d.ts","../node_modules/next/dist/client/components/forbidden.d.ts","../node_modules/next/dist/client/components/unauthorized.d.ts","../node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","../node_modules/next/dist/client/components/unstable-rethrow.d.ts","../node_modules/next/dist/client/components/navigation.react-server.d.ts","../node_modules/next/dist/client/components/unrecognized-action-error.d.ts","../node_modules/next/dist/client/components/navigation.d.ts","../node_modules/next/navigation.d.ts","../src/callback.tsx","../src/clients.ts","../src/confirm.tsx","../src/login.tsx","../../../node_modules/cookie/dist/index.d.ts","../../../node_modules/@supabase/ssr/dist/main/types.d.ts","../../../node_modules/@supabase/ssr/dist/main/createbrowserclient.d.ts","../../../node_modules/@supabase/ssr/dist/main/createserverclient.d.ts","../../../node_modules/@supabase/ssr/dist/main/utils/helpers.d.ts","../../../node_modules/@supabase/ssr/dist/main/utils/constants.d.ts","../../../node_modules/@supabase/ssr/dist/main/utils/chunker.d.ts","../../../node_modules/@supabase/ssr/dist/main/utils/base64url.d.ts","../../../node_modules/@supabase/ssr/dist/main/utils/index.d.ts","../../../node_modules/@supabase/ssr/dist/main/index.d.ts","../node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","../node_modules/next/dist/compiled/@vercel/og/types.d.ts","../node_modules/next/dist/server/after/index.d.ts","../node_modules/next/dist/server/request/root-params.d.ts","../node_modules/next/dist/server/request/connection.d.ts","../node_modules/next/server.d.ts","../src/middleware.ts","../src/index.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/json5/index.d.ts","../../../node_modules/@types/ws/index.d.ts"],"fileIdsList":[[87,103,149],[82,103,149],[77,85,86,103,149],[77,81,85,86,87,103,149],[77,82,85,87,88,89,90,103,149],[103,149],[76,85,103,149],[85,103,149],[80,85,103,149],[77,78,79,80,84,86,103,149],[77,80,82,83,85,103,149],[60,103,149],[60,61,103,149],[64,70,71,72,103,149],[71,103,149],[65,67,68,70,72,103,149],[64,65,66,67,71,103,149],[69,71,103,149],[92,103,149,460],[103,149,460,461,462,467],[103,149,459],[103,149,460],[103,149,463,464,465,466],[74,103,149],[62,63,73,75,91,103,149],[103,146,149],[103,148,149],[149],[103,149,154,182],[103,149,150,155,160,168,179,190],[103,149,150,151,160,168],[98,99,100,103,149],[103,149,152,191],[103,149,153,154,161,169],[103,149,154,179,187],[103,149,155,157,160,168],[103,148,149,156],[103,149,157,158],[103,149,159,160],[103,148,149,160],[103,149,160,161,162,179,190],[103,149,160,161,162,175,179,182],[103,149,157,160,163,168,179,190],[103,149,160,161,163,164,168,179,187,190],[103,149,163,165,179,187,190],[101,102,103,104,105,106,107,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[103,149,160,166],[103,149,167,190,195],[103,149,157,160,168,179],[103,149,169],[103,149,170],[103,148,149,171],[103,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[103,149,173],[103,149,174],[103,149,160,175,176],[103,149,175,177,191,193],[103,149,160,179,180,182],[103,149,181,182],[103,149,179,180],[103,149,182],[103,149,183],[103,146,149,179,184],[103,149,160,185,186],[103,149,185,186],[103,149,154,168,179,187],[103,149,188],[103,149,168,189],[103,149,163,174,190],[103,149,154,191],[103,149,179,192],[103,149,167,193],[103,149,194],[103,144,149],[103,144,149,160,162,171,179,182,190,193,195],[103,149,179,196],[96,103,149,198,199,200,202,436,474],[96,103,149],[96,103,149,198,199,200,201,361,436,474],[96,103,149,198,199,201,202,436,474],[96,103,149,202,361,362],[96,103,149,202,361],[96,103,149,199,200,201,202,436,474],[96,103,149,198,200,201,202,436,474],[94,95,103,149],[103,149,160,163,165,168,179,187,190,196,197],[103,149,179,197],[103,116,120,149,190],[103,116,149,179,190],[103,111,149],[103,113,116,149,187,190],[103,149,168,187],[103,149,197],[103,111,149,197],[103,113,116,149,168,190],[103,108,109,112,115,149,160,179,190],[103,116,123,149],[103,108,114,149],[103,116,137,138,149],[103,112,116,149,182,190,197],[103,137,149,197],[103,110,111,149,197],[103,116,149],[103,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,138,139,140,141,142,143,149],[103,116,131,149],[103,116,123,124,149],[103,114,116,124,125,149],[103,115,149],[103,108,111,116,149],[103,116,120,124,125,149],[103,120,149],[103,114,116,119,149,190],[103,108,113,116,123,149],[103,149,179],[103,111,116,137,149,195,197],[103,149,206,233,234,235,237,433],[103,149,206,258,260,262,263,266,433,435],[103,149,206,213,214,218,228,229,230,431,433,435],[103,149,433],[103,149,234,327,412,421,444],[103,149,206],[103,149,203,444],[103,149,268],[103,149,267,433,435],[103,149,163,310,327,356],[103,149,163,320,336,421,443],[103,149,163,374],[103,149,425],[103,149,424,425,426],[103,149,424],[97,103,149,163,203,206,214,218,226,231,232,234,238,246,247,367,391,422,433,436],[103,149,204,206,236,254,258,259,264,265,433],[103,149,204,236],[103,149,204,247,254,308,433],[103,149,204],[103,149,204,206,236,237],[103,149,204,261],[103,149,231,423,430],[103,149,174,222,444],[103,149,222,444],[96,103,149,222],[96,103,149,328],[103,149,324,372,444,451,452],[103,149,418,445,446,447,448,450],[103,149,417],[103,149,417,418],[103,149,213,368,369,370],[103,149,368,371,372],[103,149,449],[103,149,368,372],[96,103,149,236,298],[96,103,149,236],[103,149,296,300],[96,103,149,297,438],[96,103,149,163,197,198,199,200,201,202,436,472,473],[103,149,163],[103,149,163,214,217,368,377,392,412,427,428,433,434],[103,149,246,429],[103,149,436],[103,149,205],[96,103,149,310,323,335,345,347,443],[103,149,174,310,323,344,345,346,443],[103,149,338,339,340,341,342,343],[103,149,340],[103,149,344],[103,149,222,274,275,277],[96,103,149,269,270,271,276],[103,149,274,276],[103,149,272],[103,149,273],[103,149,392,440],[103,149,440],[103,149,163,434,438],[103,149,332],[103,148,149,331],[103,149,219,221,224,248,316,319,320,321,322,365,368,434,443],[103,149,248,353,368,372],[103,149,320,443],[96,103,149,320,329,330,332,333,334,335,336,337,348,349,350,351,352,354,355,443,444],[103,149,315],[103,149,163,174,217,248,249,292,321,365,366,367,372,392,412,433,434,435,436,439],[103,149,443],[103,148,149,234,318,321,367,434,439,441,442],[103,149,320],[103,148,149,217,221,282,311,312,313,314,315,316,317,319,443,444],[103,149,163,282,283,311,434,435],[103,149,234,367,368,392,434,439,443],[103,149,163,433,435],[103,149,163,179,224,434,435],[103,149,163,174,190,203,214,219,221,224,236,248,249,251,279,284,289,292,321,368,377,379,382,384,387,388,389,390,391,412,432,433,434,435,439,444],[103,149,163,179],[103,149,204,206,207,208,214,224,225,226,229,236,254,432,436,438],[103,149,163,179,190,204,211,266,268,269,270,271,277],[103,149,174,190,203,211,221,224,258,288,289,290,291,368,382,391,392,398,401,402,412,439,444],[103,149,226,231,246,367,391,433,439],[103,149,163,190,207,214,221,224,396,433],[103,149,309],[103,149,163,399,400,409],[103,149,224,433],[103,149,316,318],[103,149,221,321,432,438],[103,149,163,174,224,252,258,291,382,392,398,401,404],[103,149,163,231,246,258,405],[103,149,206,251,407,432,433],[103,149,163,190,433],[103,149,163,236,250,251,252,263,278,406,408,432,433],[97,103,149,248,321,411,436,438],[103,149,163,174,190,212,214,219,221,224,231,238,246,249,284,288,289,290,291,292,368,379,392,393,395,397,412,432,438,439,444],[103,149,163,179,224,231,398,403,409],[103,149,241,242,243,244,245],[103,149,279,383],[103,149,385],[103,149,383],[103,149,385,386],[103,149,163,213,214,217,218,434],[103,149,163,174,205,207,219,223,224,248,292,321,376,412,435,436,438],[103,149,163,174,190,209,212,213,221,223,434],[103,149,444],[103,149,210,220],[103,149,163,210,214,219],[103,149,215,220],[103,149,216],[103,149,210,211],[103,149,210,293],[103,149,210],[103,149,212,279,381],[103,149,380],[103,149,211,212,444],[103,149,212,378],[103,149,211,444],[103,149,365],[103,149,214,219,221,224,229,307,310,316,321,323,326,357,360,364,368,411,432,434],[103,149,301,304,305,306,324,325,372],[96,103,149,200,202,222,358,359],[96,103,149,200,202,222,358,359,363],[103,149,420],[103,149,234,283,320,321,332,336,368,411,413,414,415,416,418,419,422,432,433,443],[103,149,372],[103,149,376],[103,149,163,219,224,294,373,375,377,411,436,438],[103,149,301,302,303,304,305,306,324,325,372,437],[97,103,149,163,174,190,210,211,221,249,292,321,409,410,412,432,433,434,436,439],[103,149,283,285,288,439],[103,149,163,279,433],[103,149,282,320],[103,149,281],[103,149,283,284],[103,149,280,282,433],[103,149,163,209,283,285,286,287,433,434],[96,103,149,368,369,371],[103,149,253],[96,103,149,444],[96,97,103,149,292,321,436,438],[96,103,149,207],[96,103,149,300],[96,103,149,174,190,205,265,295,297,299,438],[103,149,236,434,444],[103,149,394,444],[103,149,368],[96,103,149,161,163,174,205,254,260,300,436,437],[103,149,154],[103,149,255,256,257],[103,149,255],[96,103,149,163,165,174,197,198,199,200,201,202,203,205,249,344,404,433,435,438,474],[103,149,453],[103,148,149,283,285,286,288,335,444,469,470,471,474,475,476,477],[92,103,149],[92,96,103,149,454],[96,103,149,454],[93,103,149,455,456,457,458,479],[92,96,103,149],[103,149,468,478]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"c9a77ed9a04fea1f0ff41787598704ec316d1ce2c727306019acbeaf3764cd73","impliedFormat":1},{"version":"59bf5a79d7de85f8743543977bafb4b478b60bf6ee7d1aa5ac3b4332968659f3","impliedFormat":1},{"version":"a3628f430f8d502a5c026a0c932a5c41e6361d8e0248287872cd8999bc534399","impliedFormat":1},{"version":"405737b765499f4947732a8dbabb02ea5a6ed644745601f4977543a989e5174a","impliedFormat":99},{"version":"14d2c82e20688a04591f3f936c0a3d976c702af336dac78ff06f4a5a238f3d69","impliedFormat":1},{"version":"0bf68cfa305eaef5a03603ca193bdb85a4983febfbb9e564576eaa7894e8230a","impliedFormat":1},{"version":"2b6c6039f4d2f656904d66f82231488f4852f861d27147884895097f74e3e812","impliedFormat":1},{"version":"1f84dff7964146377785aa684028ca62290e0639ac41fd0c5f391a5f5d414adc","impliedFormat":1},{"version":"4edf6371c3fd1f12c91cab0b0c42340ba0205e1a24f95757551ba46b6ab0e8a4","impliedFormat":1},{"version":"54d2709d08dc65b1cb180673e8f667f965a41b35be47e9aade190e931f3e29e8","impliedFormat":1},{"version":"727ba8cceee36c0b20288e608971ba2c438d3f99fb75f99614d659020f7c932f","impliedFormat":1},{"version":"86d7e0f2e4d36ccff4a10d8b269d46ad0cd22c27978196576303ff77cf065e2f","impliedFormat":1},{"version":"826e4a25b9c82e13e672f3b9872e7d25f5dd12345fa330cedff2a8a6f6ac9aa3","impliedFormat":1},{"version":"c0e42e780d502d530ce67e30d09a3b81c5d37d500c1f7ef04f4bd806f648b96a","impliedFormat":1},{"version":"447b6a80636a59c918ed18af1019de1efa94109a086e8fd8f3d20eb9b9a6937b","impliedFormat":99},{"version":"9deb03acb755ffd60c22788620a38cb3d1ed17b5350f07d07096f5693c1f028b","impliedFormat":99},{"version":"05c9c065eadecdce0ee370455e3c36674bfb08673f1a268a398002a0d2d801b7","impliedFormat":1},{"version":"596c5e157764a7859c6cd9c34313b24820dbea63717c9deec9cd789964ffcd7f","impliedFormat":1},{"version":"0eae63800777384563d5727e572982c220d47acf736dcdb569a2749a32378f19","impliedFormat":1},{"version":"9bf41a89bd0bbd4f8a23a7925d04f99267cb84a5a5b239185f3320edea329b9c","impliedFormat":1},{"version":"ba69d5ef968a0350e3216f4dfd39f846ed9a500f360acbe473e4f88278b3c746","impliedFormat":1},{"version":"ca2d1749803143fc680e7f89c0ee9e59fdbf1b4139666016fb152121e3e2c53c","impliedFormat":1},{"version":"a59998647e8e82373b152ba5188a4c7bcb77f8a12bb3ee3f1daa0f4012352e9d","impliedFormat":1},{"version":"ecfb7796212d2f1d7fc48d7d42dd6ec4c270f3080572d19f24b2638ae0defac3","impliedFormat":1},{"version":"717c42dfb8774242bcf05836fbc643bd7ccbf21908e5b8fe7920c950617ffc19","impliedFormat":1},{"version":"e69456ea49c1f66e93561e93f06ee50eb152ab021087a628961804f815772bd8","impliedFormat":1},{"version":"18eaffdf9c5aaf96d3ba7e3d9d788193a119be6792c1f32da4ac3595687a3a59","impliedFormat":1},{"version":"22c44a43e394a0f3009e5b574c6b572a6b5f80d8117af46ba645dd7a9df8e584","impliedFormat":1},{"version":"4ae9b50481136302de9c77668621ed3a0b34998f3e091ca3701426f4fe369c8a","impliedFormat":1},{"version":"9ba9ecc57d2f52b3ed3ac229636ee9a36e92e18b80eeae11ffb546c12e56d5e5","impliedFormat":1},{"version":"17644c49b3a6c1907a292b491472a609f342d069c660043b96e398574e34b6a7","impliedFormat":1},{"version":"d182d419bb30a1408784ed95fbabd973dde7517641e04525f0ce761df5d193a5","impliedFormat":1},{"version":"bbdcb0f1e68cca1b022b04ee38364a371754ba6a31d613be6bd1a027865333cc","impliedFormat":99},"7ad5cae8e8e22cca911219b78156e8ea75c43633e82d600d722734362a9c6b25",{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"fad4e3c207fe23922d0b2d06b01acbfb9714c4f2685cf80fd384c8a100c82fd0","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"42bc0e1a903408137c3df2b06dfd7e402cdab5bbfa5fcfb871b22ebfdb30bd0b","impliedFormat":1},{"version":"9894dafe342b976d251aac58e616ac6df8db91fb9d98934ff9dd103e9e82578f","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"829b9e6028b29e6a8b1c01ddb713efe59da04d857089298fa79acbdb3cfcfdef","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"5d8717b437b9d6afeb4da84b9082db35cafce3dfd025bc7c9ad7abbe50fa2778","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"ca6e5264278b53345bc1ce95f42fb0a8b733a09e3d6479c6ccfca55cdc45038c","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"d6e73f8010935b7b4c7487b6fb13ea197cc610f0965b759bec03a561ccf8423a","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"75b868be3463d5a8cfc0d9396f0a3d973b8c297401d00bfb008a42ab16643f13","impliedFormat":1},{"version":"5178eb4415a172c287c711dc60a619e110c3fd0b7de01ed0627e51a5336aa09c","impliedFormat":1},{"version":"15a234e5031b19c48a69ccc1607522d6e4b50f57d308ecb7fe863d44cd9f9eb3","impliedFormat":1},{"version":"174f3864e398f3f33f9a446a4f403d55a892aa55328cf6686135dfaf9e171657","impliedFormat":1},{"version":"71d8ba39a9e024d9e4bb922464d18542ed8d2c25ee78efa7890c27213cc6e5d3","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d1c9bf292a54312888a77bb19dba5e2503ad803f5393beafd45d78d2f4fe9b48","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"98b18458acb46072947aabeeeab1e410f047e0cacc972943059ca5500b0a5e95","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"496bbf339f3838c41f164238543e9fe5f1f10659cb30b68903851618464b98ba","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"fb1d8e814a3eeb5101ca13515e0548e112bd1ff3fb358ece535b93e94adf5a3a","impliedFormat":1},{"version":"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"570bb5a00836ffad3e4127f6adf581bfc4535737d8ff763a4d6f4cc877e60d98","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c83bb0c9c5645a46c68356c2f73fdc9de339ce77f7f45a954f560c7e0b8d5ebb","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"6a148329edecbda07c21098639ef4254ef7869fb25a69f58e5d6a8b7b69d4236","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"f63ab283a1c8f5c79fabe7ca4ef85f9633339c4f0e822fce6a767f9d59282af2","impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a54c996c8870ef1728a2c1fa9b8eaec0bf4a8001cd2583c02dd5869289465b10","impliedFormat":1},{"version":"3754982006a3b32c502cff0867ca83584f7a43b1035989ca73603f400de13c96","impliedFormat":1},{"version":"a30ae9bb8a8fa7b90f24b8a0496702063ae4fe75deb27da731ed4a03b2eb6631","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"50b5bc34ce6b12eccb76214b51aadfa56572aa6cc79c2b9455cdbb3d6c76af1d","impliedFormat":1},{"version":"b7e16ef7f646a50991119b205794ebfd3a4d8f8e0f314981ebbe991639023d0e","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"e9dd71cf12123419c60dab867d44fbee5c358169f99529121eaef277f5c83531","impliedFormat":1},{"version":"5b6a189ba3a0befa1f5d9cb028eb9eec2af2089c32f04ff50e2411f63d70f25d","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"1a42d2ec31a1fe62fdc51591768695ed4a2dc64c01be113e7ff22890bebb5e3f","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"72d63643a657c02d3e51cd99a08b47c9b020a565c55f246907050d3c8a5e77fb","impliedFormat":1},{"version":"1d415445ea58f8033ba199703e55ff7483c52ac6742075b803bd3e7bbe9f5d61","impliedFormat":1},{"version":"d6406c629bb3efc31aedb2de809bef471e475c86c7e67f3ef9b676b5d7e0d6b2","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"754498c5208ce3c5134f6eabd49b25cf5e1a042373515718953581636491f3c3","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82","impliedFormat":1},{"version":"633d58a237f4bb25ec7d565e4ffa32cecdcee8660ac12189c4351c52557cee9e","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"ce791f6ea807560f08065d1af6014581eeb54a05abd73294777a281b6dfd73c2","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad","impliedFormat":1},{"version":"9666533332f26e8995e4d6fe472bdeec9f15d405693723e6497bf94120c566c8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"43fa6ea8714e18adc312b30450b13562949ba2f205a1972a459180fa54471018","impliedFormat":1},{"version":"6e89c2c177347d90916bad67714d0fb473f7e37fb3ce912f4ed521fe2892cd0d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"d93c544ad20197b3976b0716c6d5cd5994e71165985d31dcab6e1f77feb4b8f2","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"a8b1c79a833ee148251e88a2553d02ce1641d71d2921cce28e79678f3d8b96aa","impliedFormat":1},{"version":"126d4f950d2bba0bd45b3a86c76554d4126c16339e257e6d2fabf8b6bf1ce00c","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"2d3cc2211f352f46ea6b7cf2c751c141ffcdf514d6e7ae7ee20b7b6742da313f","impliedFormat":1},{"version":"c75445151ff8b77d9923191efed7203985b1a9e09eccf4b054e7be864e27923d","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"fa8a8fbf91ee2a4779496225f0312aac6635b0f21aa09cdafa4283fe32d519c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e8aef93d79b000deb6ec336b5645c87de167168e184e84521886f9ecc69a4b5","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"de7052bfee2981443498239a90c04ea5cc07065d5b9bb61b12cb6c84313ad4ef","impliedFormat":1},{"version":"a3e7d932dc9c09daa99141a8e4800fc6c58c625af0d4bbb017773dc36da75426","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"4a2edd238d9104eac35b60d727f1123de5062f452b70ed8e0366cb36387dfdfd","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"fee92c97f1aa59eb7098a0cc34ff4df7e6b11bae71526aca84359a2575f313d8","impliedFormat":1},{"version":"0bd0297484aacea217d0b76e55452862da3c5d9e33b24430e0719d1161657225","impliedFormat":1},{"version":"2ab6d334bcbf2aff3acfc4fd8c73ecd82b981d3c3aa47b3f3b89281772286904","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"4805f6161c2c8cefb8d3b8bd96a080c0fe8dbc9315f6ad2e53238f9a79e528a6","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"49179c6a23701c642bd99abe30d996919748014848b738d8e85181fc159685ff","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"8514c62ce38e58457d967e9e73f128eedc1378115f712b9eef7127f7c88f82ae","impliedFormat":1},{"version":"f1289e05358c546a5b664fbb35a27738954ec2cc6eb4137350353099d154fc62","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"1d17ba45cfbe77a9c7e0df92f7d95f3eefd49ee23d1104d0548b215be56945ad","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"1d879125d1ec570bf04bc1f362fdbe0cb538315c7ac4bcfcdf0c1e9670846aa6","impliedFormat":1},{"version":"e16344db9b8ee59d41abdb3a61e4470955b5712c0ee869fb47112e152aabe142","impliedFormat":1},{"version":"46273e8c29816125d0d0b56ce9a849cc77f60f9a5ba627447501d214466f0ff3","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"144bc326e90b894d1ec78a2af3ffb2eb3733f4d96761db0ca0b6239a8285f972","impliedFormat":1},{"version":"3af3584f79c57853028ef9421ec172539e1fe01853296dc05a9d615ade4ffaf6","impliedFormat":1},{"version":"f82579d87701d639ff4e3930a9b24f4ee13ca74221a9a3a792feb47f01881a9c","impliedFormat":1},{"version":"d7e5d5245a8ba34a274717d085174b2c9827722778129b0081fefd341cca8f55","impliedFormat":1},{"version":"d9d32f94056181c31f553b32ce41d0ef75004912e27450738d57efcd2409c324","impliedFormat":1},{"version":"752513f35f6cff294ffe02d6027c41373adf7bfa35e593dbfd53d95c203635ee","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"1a7e2ea171726446850ec72f4d1525d547ff7e86724cc9e7eec509725752a758","impliedFormat":1},{"version":"8c901126d73f09ecdea4785e9a187d1ac4e793e07da308009db04a7283ec2f37","impliedFormat":1},{"version":"db97922b767bd2675fdfa71e08b49c38b7d2c847a1cc4a7274cb77be23b026f1","impliedFormat":1},{"version":"aab290b8e4b7c399f2c09b957666fc95335eb4522b2dd9ead1bf0cb64da6d6ee","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"06c25ddfc2242bd06c19f66c9eae4c46d937349a267810f89783680a1d7b5259","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4","impliedFormat":1},{"version":"14f6b927888a1112d662877a5966b05ac1bf7ed25d6c84386db4c23c95a5363b","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"90c54a02432d04e4246c87736e53a6a83084357acfeeba7a489c5422b22f5c7a","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"0a372c2d12a259da78e21b25974d2878502f14d89c6d16b97bd9c5017ab1bc12","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"ec1ca97598eda26b7a5e6c8053623acbd88e43be7c4d29c77ccd57abc4c43999","impliedFormat":1},{"version":"cb8d8ef7b9ce8ed3e6f1c814fcbf3f90dab0cb8863079236784fc350746e27c4","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"3be035da7bee86b4c3abf392e0edaa44fc6e45092995eefe36b39118c8a84068","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f828825d077c2fa0ea606649faeb122749273a353daab23924fe674e98ba44c","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"6e2261cd9836b2c25eecb13940d92c024ebed7f8efe23c4b084145cd3a13b8a6","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"a47e6d954d22dd9ebb802e7e431b560ed7c581e79fb885e44dc92ed4f60d4c07","impliedFormat":1},{"version":"f019e57d2491c159d47a107fd90219a1734bdd2e25cd8d1db3c8fae5c6b414c4","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"5f0292a40df210ab94b9fb44c8b775c51e96777e14e073900e392b295ca1061b","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"8627ad129bcf56e82adff0ab5951627c993937aa99f5949c33240d690088b803","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},"da5bba2fdd9850556baca553fc5c0a0f3c681c14e18915c4ed888879ba1bad16","299b27753768cc32db888e43bdb2b0a5b921b62348d34cc21037d3ee50e15775",{"version":"f76a8d32f90478e274d945b72e028c8d9ee3c2db827782c982b93e91c8bb73c2","signature":"65643d50fd7ac4aecfc1c7fedb36560364031e3f0e883892c407f642f8accd0d"},"f741fa9cd07097ba481010b5796a393fbdb0c9089dbc5899394fd553e876e0a4",{"version":"79c164aa4f8a8418df7717206ea52508f72743224a6b9c705f10724c6dbb5548","impliedFormat":1},{"version":"d3806a07e96dc0733fc9104eb4906c316f299b68b509da3604d8f21da04383b4","impliedFormat":1},{"version":"c83431bbdf4bc0275f48d6c63a33bdbda7cadd6658327db32c97760f2409afc1","impliedFormat":1},{"version":"881d40de44c5d815be8053b0761a4b3889443a08ccd4fa26423e1832f52d3bfb","impliedFormat":1},{"version":"b0315c558e6450590f260cc10ac29004700aa3960c9aef28f2192ffcf7e615f7","impliedFormat":1},{"version":"2ed360a6314d0aadeecb8491a6fde17b58b8464acde69501dbd7242544bcce57","impliedFormat":1},{"version":"4158a50e206f82c95e0ad4ea442ff6c99f20b5b85c5444474b8a9504c59294aa","impliedFormat":1},{"version":"c7a9dc2768c7d68337e05a443d0ce8000b0d24d7dfa98751173421e165d44629","impliedFormat":1},{"version":"d93cbdbf9cb855ad40e03d425b1ef98d61160021608cf41b431c0fc7e39a0656","impliedFormat":1},{"version":"561a4879505d41a27c404f637ae50e3da92126aa70d94cc073f6a2e102d565b0","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e","impliedFormat":99},{"version":"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0","impliedFormat":99},{"version":"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"ecbaf0da125974be39c0aac869e403f72f033a4e7fd0d8cd821a8349b4159628","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"ceec3c81b2d81f5e3b855d9367c1d4c664ab5046dff8fd56552df015b7ccbe8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d5c9219aa032b157e2f4a81124444a0f4f6d7193d2a6db8d38a03111e0b18ba","signature":"b73aef786af409bcad59786d91050d4a6735c91402bfd4509421f14a11d8d8e7"},"e7b6ab02341671aa5fce566dec3e330db679126758846fb734650f3e4ea097b2",{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[93,[455,458],479,480],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[88,1],[89,2],[87,3],[82,4],[91,5],[76,6],[77,7],[86,8],[81,9],[90,6],[85,10],[78,6],[79,6],[84,11],[80,8],[83,9],[61,12],[62,13],[60,6],[63,6],[73,14],[65,6],[68,15],[66,6],[67,6],[64,6],[71,16],[72,17],[70,18],[461,19],[462,19],[468,20],[460,21],[466,6],[465,6],[464,22],[463,21],[467,23],[75,24],[92,25],[481,6],[482,6],[483,6],[146,26],[147,26],[148,27],[103,28],[149,29],[150,30],[151,31],[98,6],[101,32],[99,6],[100,6],[152,33],[153,34],[154,35],[155,36],[156,37],[157,38],[158,38],[159,39],[160,40],[161,41],[162,42],[104,6],[102,6],[163,43],[164,44],[165,45],[197,46],[166,47],[167,48],[168,49],[169,50],[170,51],[171,52],[172,53],[173,54],[174,55],[175,56],[176,56],[177,57],[178,6],[179,58],[181,59],[180,60],[182,61],[183,62],[184,63],[185,64],[186,65],[187,66],[188,67],[189,68],[190,69],[191,70],[192,71],[193,72],[194,73],[105,6],[106,6],[107,6],[145,74],[195,75],[196,76],[69,6],[201,77],[361,78],[202,79],[200,80],[363,81],[362,82],[198,83],[359,6],[199,84],[94,6],[96,85],[358,78],[222,78],[484,86],[459,6],[95,6],[74,6],[396,87],[58,6],[59,6],[10,6],[11,6],[13,6],[12,6],[2,6],[14,6],[15,6],[16,6],[17,6],[18,6],[19,6],[20,6],[21,6],[3,6],[22,6],[23,6],[4,6],[24,6],[28,6],[25,6],[26,6],[27,6],[29,6],[30,6],[31,6],[5,6],[32,6],[33,6],[34,6],[35,6],[6,6],[39,6],[36,6],[37,6],[38,6],[40,6],[7,6],[41,6],[46,6],[47,6],[42,6],[43,6],[44,6],[45,6],[8,6],[51,6],[48,6],[49,6],[50,6],[52,6],[9,6],[53,6],[54,6],[55,6],[57,6],[56,6],[1,6],[123,88],[133,89],[122,88],[143,90],[114,91],[113,92],[142,93],[136,94],[141,95],[116,96],[130,97],[115,98],[139,99],[111,100],[110,93],[140,101],[112,102],[117,103],[118,6],[121,103],[108,6],[144,104],[134,105],[125,106],[126,107],[128,108],[124,109],[127,110],[137,93],[119,111],[120,112],[129,113],[109,114],[132,105],[131,103],[135,6],[138,115],[260,6],[236,116],[264,117],[432,118],[259,119],[247,6],[229,6],[234,6],[422,120],[287,121],[235,6],[391,122],[267,123],[268,124],[357,125],[419,126],[375,127],[426,128],[427,129],[425,130],[424,6],[423,131],[266,132],[237,133],[308,6],[309,134],[232,6],[248,135],[238,136],[292,135],[289,135],[208,135],[262,137],[261,6],[431,138],[225,6],[213,6],[333,139],[334,140],[328,78],[447,6],[336,6],[337,141],[329,142],[453,143],[451,144],[446,6],[418,145],[417,6],[445,146],[330,78],[371,147],[369,148],[448,6],[452,6],[450,149],[449,6],[370,150],[299,151],[298,152],[297,153],[296,154],[281,6],[470,6],[473,6],[472,78],[474,155],[204,6],[428,156],[429,157],[430,158],[250,6],[218,159],[203,6],[349,78],[206,160],[348,161],[347,162],[338,6],[339,6],[346,6],[341,6],[344,163],[340,6],[342,164],[345,165],[343,164],[233,6],[227,6],[228,6],[276,166],[277,167],[275,168],[273,169],[274,170],[270,6],[355,141],[223,141],[441,171],[440,6],[284,6],[475,172],[435,173],[331,174],[332,175],[323,176],[314,6],[354,177],[315,178],[356,179],[351,180],[350,6],[352,6],[368,181],[442,182],[443,183],[317,184],[320,185],[312,186],[414,187],[434,188],[291,189],[392,190],[209,191],[433,192],[205,119],[271,6],[278,193],[403,194],[269,6],[402,195],[97,6],[397,196],[249,6],[310,197],[393,6],[214,6],[215,6],[401,198],[226,6],[279,199],[319,200],[439,201],[318,6],[400,6],[272,6],[405,202],[406,203],[230,6],[408,204],[410,205],[409,206],[252,6],[399,191],[412,207],[398,208],[404,209],[240,6],[243,6],[241,6],[245,6],[242,6],[244,6],[246,210],[239,6],[384,211],[383,6],[389,212],[385,213],[388,214],[387,214],[390,212],[386,213],[219,215],[377,216],[224,217],[477,6],[316,6],[444,182],[476,218],[335,182],[231,6],[221,219],[220,220],[216,221],[217,222],[307,223],[413,223],[293,223],[378,224],[294,224],[211,225],[210,6],[382,226],[381,227],[380,228],[379,229],[212,230],[327,231],[365,232],[326,233],[360,234],[364,235],[421,236],[420,237],[416,238],[374,239],[376,240],[373,241],[411,242],[367,6],[366,243],[415,6],[280,244],[313,156],[311,245],[282,246],[285,247],[471,6],[283,248],[286,248],[469,6],[288,249],[325,78],[372,250],[265,6],[254,251],[321,6],[306,78],[305,252],[437,253],[304,254],[207,6],[302,78],[303,78],[295,6],[253,6],[301,255],[300,256],[251,257],[322,55],[290,55],[407,6],[395,258],[394,6],[353,259],[324,78],[438,260],[263,261],[258,262],[257,6],[256,263],[255,6],[436,264],[454,265],[478,266],[93,267],[455,268],[456,267],[457,269],[480,270],[458,271],[479,272]],"affectedFilesPendingEmit":[93,455,456,457,480,458,479],"version":"5.9.3"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@q3assets/auth",
3
+ "version": "0.1.0",
4
+ "exports": {
5
+ ".": "./src/index.ts",
6
+ "./login": "./src/login.tsx",
7
+ "./callback": "./src/callback.tsx",
8
+ "./confirm": "./src/confirm.tsx",
9
+ "./clients": "./src/clients.ts",
10
+ "./admin": "./src/admin.ts",
11
+ "./middleware": "./src/middleware.ts"
12
+ },
13
+ "dependencies": {
14
+ "@supabase/ssr": "^0.6.1",
15
+ "@supabase/supabase-js": "^2.98.0"
16
+ },
17
+ "devDependencies": {
18
+ "@q3assets/tsconfig": "file:../tsconfig",
19
+ "@types/react": "^19",
20
+ "next": "^15",
21
+ "react": "^19",
22
+ "typescript": "^5"
23
+ }
24
+ }
package/src/admin.ts ADDED
@@ -0,0 +1,53 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js"
2
+
3
+ /**
4
+ * Check if the requesting user is an admin. Reads the session from the
5
+ * Authorization header (browser client sends this automatically via cookies
6
+ * or bearer token). Checks for an `is_admin` flag in user metadata.
7
+ *
8
+ * Usage in Next.js API route:
9
+ * const { user, error } = await requireAdmin(supabase, request)
10
+ * if (error) return new Response(error, { status: 403 })
11
+ */
12
+ export async function requireAdmin(
13
+ supabase: SupabaseClient,
14
+ request: Request
15
+ ): Promise<{ user: any; error: string | null }> {
16
+ const authHeader = request.headers.get("authorization")
17
+ if (!authHeader) {
18
+ return { user: null, error: "Not authenticated" }
19
+ }
20
+
21
+ const token = authHeader.replace("Bearer ", "")
22
+ const {
23
+ data: { user },
24
+ error,
25
+ } = await supabase.auth.getUser(token)
26
+
27
+ if (error || !user) {
28
+ return { user: null, error: "Invalid session" }
29
+ }
30
+
31
+ const isAdmin = user.app_metadata?.is_admin === true
32
+ if (!isAdmin) {
33
+ return { user: null, error: "Forbidden" }
34
+ }
35
+
36
+ return { user, error: null }
37
+ }
38
+
39
+ /**
40
+ * Invite a user by email using the service-role client.
41
+ * Sets redirect to /auth/confirm for M365 safety.
42
+ */
43
+ export async function inviteUser(
44
+ serviceClient: SupabaseClient,
45
+ email: string,
46
+ siteUrl: string,
47
+ metadata?: Record<string, any>
48
+ ) {
49
+ return serviceClient.auth.admin.inviteUserByEmail(email, {
50
+ redirectTo: `${siteUrl}/auth/confirm`,
51
+ data: metadata,
52
+ })
53
+ }
@@ -0,0 +1,63 @@
1
+ "use client"
2
+
3
+ import { useEffect, useState } from "react"
4
+ import { useRouter, useSearchParams } from "next/navigation"
5
+ import type { SupabaseClient } from "@supabase/supabase-js"
6
+
7
+ interface CallbackProps {
8
+ supabase: SupabaseClient
9
+ redirectTo?: string
10
+ }
11
+
12
+ export function AuthCallback({ supabase, redirectTo = "/" }: CallbackProps) {
13
+ const router = useRouter()
14
+ const searchParams = useSearchParams()
15
+ const [error, setError] = useState<string | null>(null)
16
+
17
+ useEffect(() => {
18
+ async function handleCallback() {
19
+ const code = searchParams.get("code")
20
+ const errorParam = searchParams.get("error_description")
21
+
22
+ if (errorParam) {
23
+ setError(errorParam)
24
+ return
25
+ }
26
+
27
+ if (code) {
28
+ const { error } = await supabase.auth.exchangeCodeForSession(code)
29
+ if (error) {
30
+ setError(error.message)
31
+ return
32
+ }
33
+ }
34
+
35
+ router.replace(redirectTo)
36
+ }
37
+
38
+ handleCallback()
39
+ }, [supabase, router, searchParams, redirectTo])
40
+
41
+ if (error) {
42
+ return (
43
+ <div className="flex min-h-screen items-center justify-center px-4">
44
+ <div className="w-full max-w-sm text-center">
45
+ <h1 className="text-xl font-semibold text-red-400">Login failed</h1>
46
+ <p className="mt-2 text-sm text-[var(--text-muted)]">{error}</p>
47
+ <a
48
+ href="/login"
49
+ className="mt-4 inline-block text-sm text-[var(--accent)] hover:text-[var(--accent-light)]"
50
+ >
51
+ Try again
52
+ </a>
53
+ </div>
54
+ </div>
55
+ )
56
+ }
57
+
58
+ return (
59
+ <div className="flex min-h-screen items-center justify-center">
60
+ <p className="text-sm text-[var(--text-muted)]">Signing in...</p>
61
+ </div>
62
+ )
63
+ }
package/src/clients.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { createClient, type SupabaseClient } from "@supabase/supabase-js"
2
+
3
+ /**
4
+ * Browser-side Supabase client. Uses the public anon key.
5
+ * Each project provides its own URL and key.
6
+ */
7
+ export function createBrowserClient(
8
+ url: string,
9
+ anonKey: string
10
+ ): SupabaseClient {
11
+ return createClient(url, anonKey, {
12
+ auth: {
13
+ flowType: "pkce",
14
+ detectSessionInUrl: true,
15
+ persistSession: true,
16
+ },
17
+ })
18
+ }
19
+
20
+ /**
21
+ * Service-role client for admin operations (invite users, manage data).
22
+ * Never expose this on the client side — API routes only.
23
+ */
24
+ export function createServiceClient(
25
+ url: string,
26
+ serviceRoleKey: string
27
+ ): SupabaseClient {
28
+ return createClient(url, serviceRoleKey, {
29
+ auth: { autoRefreshToken: false, persistSession: false },
30
+ })
31
+ }
@@ -0,0 +1,67 @@
1
+ "use client"
2
+
3
+ import { useEffect, useState } from "react"
4
+ import { useSearchParams } from "next/navigation"
5
+
6
+ /**
7
+ * M365-safe confirmation page. Magic links redirect here instead of directly
8
+ * to /auth/callback. Microsoft's email scanner will hit this page but won't
9
+ * click the button, preserving the token for the actual user.
10
+ *
11
+ * Supabase magic link URL should set redirect_to to /auth/confirm.
12
+ * This page extracts the token hash from the URL fragment and forwards
13
+ * to /auth/callback only when the user clicks.
14
+ */
15
+ interface AuthConfirmProps {
16
+ callbackPath?: string
17
+ }
18
+
19
+ export function AuthConfirm({ callbackPath = "/auth/callback" }: AuthConfirmProps) {
20
+ const searchParams = useSearchParams()
21
+ const [tokenHash, setTokenHash] = useState<string | null>(null)
22
+ const [type, setType] = useState<string | null>(null)
23
+
24
+ useEffect(() => {
25
+ const hash = window.location.hash
26
+ if (hash) {
27
+ const params = new URLSearchParams(hash.substring(1))
28
+ setTokenHash(params.get("access_token") || params.get("token_hash"))
29
+ setType(params.get("type"))
30
+ }
31
+ const qToken = searchParams.get("token_hash") || searchParams.get("token")
32
+ const qType = searchParams.get("type")
33
+ if (qToken) {
34
+ setTokenHash(qToken)
35
+ setType(qType)
36
+ }
37
+ }, [searchParams])
38
+
39
+ function handleConfirm() {
40
+ const { origin, search, hash } = window.location
41
+ window.location.href = `${origin}${callbackPath}${search}${hash}`
42
+ }
43
+
44
+ return (
45
+ <div className="flex min-h-screen items-center justify-center px-4">
46
+ <div className="w-full max-w-sm text-center">
47
+ <div className="rounded-xl border border-[var(--border)] bg-[var(--bg-card)] p-8">
48
+ <h1 className="text-xl font-semibold">Confirm login</h1>
49
+ <p className="mt-3 text-sm text-[var(--text-muted)]">
50
+ Click below to complete your sign-in.
51
+ </p>
52
+ <button
53
+ onClick={handleConfirm}
54
+ className="mt-6 w-full rounded-lg bg-[var(--accent)] px-4 py-2.5 text-sm font-medium text-white transition-colors hover:bg-[var(--accent-light)]"
55
+ >
56
+ Continue to dashboard
57
+ </button>
58
+ {type && (
59
+ <p className="mt-4 text-xs text-[var(--text-muted)]">
60
+ {type === "invite" ? "Welcome! You've been invited." : "Magic link login"}
61
+ </p>
62
+ )}
63
+ </div>
64
+ </div>
65
+ </div>
66
+ )
67
+ }
package/src/index.ts ADDED
@@ -0,0 +1,6 @@
1
+ export { Login } from "./login"
2
+ export { AuthCallback } from "./callback"
3
+ export { AuthConfirm } from "./confirm"
4
+ export { createBrowserClient, createServiceClient } from "./clients"
5
+ export { requireAdmin, inviteUser } from "./admin"
6
+ export { createAuthMiddleware } from "./middleware"
package/src/login.tsx ADDED
@@ -0,0 +1,102 @@
1
+ "use client"
2
+
3
+ import { useState } from "react"
4
+ import type { SupabaseClient } from "@supabase/supabase-js"
5
+
6
+ interface LoginProps {
7
+ supabase: SupabaseClient
8
+ title?: string
9
+ subtitle?: string
10
+ footer?: string
11
+ redirectTo?: string
12
+ }
13
+
14
+ export function Login({
15
+ supabase,
16
+ title = "Dashboard",
17
+ subtitle = "Sign in to access the dashboard",
18
+ footer = "Authorized users only",
19
+ redirectTo,
20
+ }: LoginProps) {
21
+ const [email, setEmail] = useState("")
22
+ const [sent, setSent] = useState(false)
23
+ const [loading, setLoading] = useState(false)
24
+ const [error, setError] = useState<string | null>(null)
25
+
26
+ async function handleSubmit(e: React.FormEvent) {
27
+ e.preventDefault()
28
+ setLoading(true)
29
+ setError(null)
30
+
31
+ const { error } = await supabase.auth.signInWithOtp({
32
+ email,
33
+ options: {
34
+ shouldCreateUser: false,
35
+ emailRedirectTo: redirectTo || `${window.location.origin}/auth/confirm`,
36
+ },
37
+ })
38
+
39
+ setLoading(false)
40
+
41
+ if (error) {
42
+ setError(error.message)
43
+ } else {
44
+ setSent(true)
45
+ }
46
+ }
47
+
48
+ return (
49
+ <div className="flex min-h-screen items-center justify-center px-4">
50
+ <div className="w-full max-w-sm">
51
+ <div className="mb-8 text-center">
52
+ <h1 className="text-2xl font-bold tracking-tight">{title}</h1>
53
+ <p className="mt-2 text-sm text-[var(--text-muted)]">{subtitle}</p>
54
+ </div>
55
+
56
+ <div className="rounded-xl border border-[var(--border)] bg-[var(--bg-card)] p-6">
57
+ {!sent ? (
58
+ <form onSubmit={handleSubmit}>
59
+ <label className="block text-sm font-medium text-[var(--text-muted)] mb-2">
60
+ Email address
61
+ </label>
62
+ <input
63
+ type="email"
64
+ value={email}
65
+ onChange={(e) => setEmail(e.target.value)}
66
+ placeholder="you@example.com"
67
+ required
68
+ autoFocus
69
+ className="w-full rounded-lg border border-[var(--border)] bg-[var(--bg)] px-3 py-2.5 text-sm text-[var(--text)] placeholder:text-[var(--text-muted)] focus:border-[var(--accent)] focus:outline-none focus:ring-1 focus:ring-[var(--accent)]"
70
+ />
71
+ {error && (
72
+ <p className="mt-3 text-sm text-red-400">{error}</p>
73
+ )}
74
+ <button
75
+ type="submit"
76
+ disabled={loading}
77
+ className="mt-4 w-full rounded-lg bg-[var(--accent)] px-4 py-2.5 text-sm font-medium text-white transition-colors hover:bg-[var(--accent-light)] disabled:opacity-50"
78
+ >
79
+ {loading ? "Sending..." : "Send login link"}
80
+ </button>
81
+ </form>
82
+ ) : (
83
+ <div className="text-center">
84
+ <p className="text-sm text-[var(--text-muted)]">
85
+ Check your email for a login link.
86
+ </p>
87
+ <p className="mt-2 text-sm font-medium text-[var(--text)]">{email}</p>
88
+ <button
89
+ onClick={() => { setSent(false); setEmail(""); setError(null) }}
90
+ className="mt-4 text-sm text-[var(--text-muted)] hover:text-[var(--text)]"
91
+ >
92
+ Send to a different email
93
+ </button>
94
+ </div>
95
+ )}
96
+ </div>
97
+
98
+ <p className="mt-6 text-center text-xs text-[var(--text-muted)]">{footer}</p>
99
+ </div>
100
+ </div>
101
+ )
102
+ }
@@ -0,0 +1,51 @@
1
+ import { createServerClient } from "@supabase/ssr"
2
+ import { type NextRequest, NextResponse } from "next/server"
3
+
4
+ /**
5
+ * Creates a Next.js middleware that protects routes behind Supabase auth.
6
+ * Unauthenticated requests to protected paths redirect to /login.
7
+ *
8
+ * Usage in middleware.ts:
9
+ * export const middleware = createAuthMiddleware(url, anonKey, ["/", "/admin"])
10
+ * export const config = { matcher: ["/", "/admin/:path*"] }
11
+ */
12
+ export function createAuthMiddleware(
13
+ supabaseUrl: string,
14
+ supabaseAnonKey: string,
15
+ protectedPaths: string[] = ["/"]
16
+ ) {
17
+ return async function middleware(request: NextRequest) {
18
+ const response = NextResponse.next({ request })
19
+
20
+ const supabase = createServerClient(supabaseUrl, supabaseAnonKey, {
21
+ cookies: {
22
+ getAll: () => request.cookies.getAll(),
23
+ setAll: (cookies: { name: string; value: string; options?: any }[]) => {
24
+ for (const { name, value, options } of cookies) {
25
+ response.cookies.set(name, value, options)
26
+ }
27
+ },
28
+ },
29
+ })
30
+
31
+ const {
32
+ data: { user },
33
+ } = await supabase.auth.getUser()
34
+
35
+ const path = request.nextUrl.pathname
36
+
37
+ if (path === "/login" || path.startsWith("/auth/")) {
38
+ return response
39
+ }
40
+
41
+ const isProtected = protectedPaths.some(
42
+ (p) => path === p || path.startsWith(p + "/")
43
+ )
44
+
45
+ if (isProtected && !user) {
46
+ return NextResponse.redirect(new URL("/login", request.url))
47
+ }
48
+
49
+ return response
50
+ }
51
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@q3/tsconfig/base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist"
5
+ },
6
+ "include": ["src"],
7
+ "exclude": ["node_modules", "dist"]
8
+ }