From 8155d2e3012eb4b184eaabe07c9771219bb5173c Mon Sep 17 00:00:00 2001 From: Nicolas Burtey Date: Wed, 27 Sep 2023 12:07:35 +0100 Subject: [PATCH] chore: poc on replacing the hydra demo app to a real dashboard --- .eslintrc.json | 2 +- apps/consent/src/routes/consent.ts | 10 +- apps/consent/src/routes/login.ts | 17 +- apps/dashboard/.env | 3 + apps/dashboard/.eslintrc.json | 3 + apps/dashboard/.gitignore | 35 + apps/dashboard/README.md | 36 + .../app/api/auth/[...nextauth]/route.ts | 55 + apps/dashboard/app/favicon.ico | Bin 0 -> 25931 bytes apps/dashboard/app/globals.css | 27 + apps/dashboard/app/graphql/config.ts | 4 + apps/dashboard/app/graphql/generated.ts | 3362 +++++++++++++++++ apps/dashboard/app/graphql/index.ts | 26 + apps/dashboard/app/layout.tsx | 22 + apps/dashboard/app/page.tsx | 56 + apps/dashboard/bun.lockb | Bin 0 -> 302628 bytes apps/dashboard/codegen.yml | 66 + apps/dashboard/next.config.js | 4 + apps/dashboard/package.json | 40 + apps/dashboard/postcss.config.js | 6 + apps/dashboard/public/next.svg | 1 + apps/dashboard/public/vercel.svg | 1 + apps/dashboard/tailwind.config.ts | 20 + apps/dashboard/tsconfig.json | 27 + dev/ory/oathkeeper_rules.yaml | 10 +- 25 files changed, 3816 insertions(+), 17 deletions(-) create mode 100755 apps/dashboard/.env create mode 100644 apps/dashboard/.eslintrc.json create mode 100644 apps/dashboard/.gitignore create mode 100644 apps/dashboard/README.md create mode 100644 apps/dashboard/app/api/auth/[...nextauth]/route.ts create mode 100644 apps/dashboard/app/favicon.ico create mode 100644 apps/dashboard/app/globals.css create mode 100644 apps/dashboard/app/graphql/config.ts create mode 100644 apps/dashboard/app/graphql/generated.ts create mode 100644 apps/dashboard/app/graphql/index.ts create mode 100644 apps/dashboard/app/layout.tsx create mode 100644 apps/dashboard/app/page.tsx create mode 100755 apps/dashboard/bun.lockb create mode 100644 apps/dashboard/codegen.yml create mode 100644 apps/dashboard/next.config.js create mode 100644 apps/dashboard/package.json create mode 100644 apps/dashboard/postcss.config.js create mode 100644 apps/dashboard/public/next.svg create mode 100644 apps/dashboard/public/vercel.svg create mode 100644 apps/dashboard/tailwind.config.ts create mode 100644 apps/dashboard/tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index 1b29f42c79..dd73173c75 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,7 +4,7 @@ "es6": true, "node": true }, - "ignorePatterns": ["/*.js", "lib", "coverage", "generated", "protos"], + "ignorePatterns": ["/*.js", "lib", "coverage", "generated", "protos", "apps"], "parser": "@typescript-eslint/parser", "parserOptions": { "project": "tsconfig.json", diff --git a/apps/consent/src/routes/consent.ts b/apps/consent/src/routes/consent.ts index 6cbc4f4a60..2e5bb06eea 100644 --- a/apps/consent/src/routes/consent.ts +++ b/apps/consent/src/routes/consent.ts @@ -64,7 +64,9 @@ router.get("/", csrfProtection, async (req, res, next) => { // unless you limit who can introspect tokens. access_token: { card: "alice" }, // This data will be available in the ID token. - id_token: { who: "bob" }, + + // TODO fetch email + id_token: { who: "bob", email: "" }, }, }, }) @@ -127,9 +129,11 @@ router.post("/", csrfProtection, async (req, res, next) => { let session = { // This data will be available when introspecting the token. Try to avoid sensitive information here, // unless you limit who can introspect tokens. - access_token: { card: "alice" }, + + // TODO: pass email + access_token: { card: "alice", email: "" }, // This data will be available in the ID token. - id_token: { card: "bob" }, + id_token: { card: "bob", email: "" }, } try { diff --git a/apps/consent/src/routes/login.ts b/apps/consent/src/routes/login.ts index 0843b9353d..46ca9249bb 100644 --- a/apps/consent/src/routes/login.ts +++ b/apps/consent/src/routes/login.ts @@ -107,12 +107,21 @@ router.post("/", csrfProtection, async (req, res, next) => { const url = `${authUrl}/auth/email/code` - const result = await axios.post(url, { - email, - }) + let emailLoginId: string + + try { + const result = await axios.post(url, { + email, + }) + emailLoginId = result.data.result + } catch (err) { + // TODO: error layout + console.error(err) + return + } + // TODO: manage error on ip rate limit // TODO: manage error when trying the same email too often - const emailLoginId = result.data.result if (emailLoginId) { console.log({ emailLoginId }) diff --git a/apps/dashboard/.env b/apps/dashboard/.env new file mode 100755 index 0000000000..c75e0da20d --- /dev/null +++ b/apps/dashboard/.env @@ -0,0 +1,3 @@ +NEXTAUTH_URL=https://bdb1-93-108-186-220.ngrok-free.app +PORT=3001 +NEXTAUTH_SECRET="thisismysecret" \ No newline at end of file diff --git a/apps/dashboard/.eslintrc.json b/apps/dashboard/.eslintrc.json new file mode 100644 index 0000000000..bffb357a71 --- /dev/null +++ b/apps/dashboard/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/apps/dashboard/.gitignore b/apps/dashboard/.gitignore new file mode 100644 index 0000000000..8f322f0d8f --- /dev/null +++ b/apps/dashboard/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/apps/dashboard/README.md b/apps/dashboard/README.md new file mode 100644 index 0000000000..c4033664f8 --- /dev/null +++ b/apps/dashboard/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/apps/dashboard/app/api/auth/[...nextauth]/route.ts b/apps/dashboard/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000000..a86e5b0302 --- /dev/null +++ b/apps/dashboard/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,55 @@ +import NextAuth from "next-auth" +import GithubProvider from "next-auth/providers/auth0" +import { ProviderType } from "next-auth/providers/index" + +const type = "oauth" as const // as ProviderType + +export const authOptions = { + // Configure one or more authentication providers + providers: [ + { + id: "blink", + clientId: process.env.CLIENT_ID, + clientSecret: process.env.CLIENT_SECRET, + wellKnown: "http://127.0.0.1:4444/.well-known/openid-configuration", + useSecureCookies: false, + authorization: { params: { scope: "offline transactions:read" } }, + idToken: false, + name: "Blink", + type, + profile(profile) { + console.log({ profile }, "profile123") + return { + id: profile.sub, + // email: profile.email, + } + }, + }, + // ...add more providers here + ], + debug: true, + secret: process.env.NEXTAUTH_SECRET as string, + callbacks: { + async jwt({ token, account, profile }) { + // Persist the OAuth access_token and or the user id to the token right after signin + if (account) { + token.accessToken = account.access_token + token.expiresAt = account.expires_at + token.refreshToken = account.refresh_token + token.id = profile.id + } + return token + }, + async session({ session, token, user }) { + console.log({ session, token, user }, "session12") + // Send properties to the client, like an access_token from a provider. + session.sub = token.sub + session.accessToken = token.accessToken + return session + }, + }, +} + +const handler = NextAuth(authOptions) + +export { handler as GET, handler as POST } diff --git a/apps/dashboard/app/favicon.ico b/apps/dashboard/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/apps/dashboard/app/globals.css b/apps/dashboard/app/globals.css new file mode 100644 index 0000000000..fd81e88583 --- /dev/null +++ b/apps/dashboard/app/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} diff --git a/apps/dashboard/app/graphql/config.ts b/apps/dashboard/app/graphql/config.ts new file mode 100644 index 0000000000..3ab574b70c --- /dev/null +++ b/apps/dashboard/app/graphql/config.ts @@ -0,0 +1,4 @@ +// export const serverUrl = +// process.env.SERVER_URL ?? "https://fe69-93-108-186-220.ngrok-free.app" + +export const coreUrl = process.env.CORE_URL ?? "http://localhost:4002/graphql" diff --git a/apps/dashboard/app/graphql/generated.ts b/apps/dashboard/app/graphql/generated.ts new file mode 100644 index 0000000000..29cc79fa08 --- /dev/null +++ b/apps/dashboard/app/graphql/generated.ts @@ -0,0 +1,3362 @@ +// this file is autogenerated by codegen +/* eslint-disable */ +import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +import { gql } from '@apollo/client'; +import * as Apollo from '@apollo/client'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +export type Omit = Pick>; +export type RequireFields = Omit & { [P in K]-?: NonNullable }; +const defaultOptions = {} as const; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + /** An Opaque Bearer token */ + AuthToken: { input: string; output: string; } + /** (Positive) Cent amount (1/100 of a dollar) */ + CentAmount: { input: number; output: number; } + /** An alias name that a user can set for a wallet (with which they have transactions) */ + ContactAlias: { input: string; output: string; } + /** A CCA2 country code (ex US, FR, etc) */ + CountryCode: { input: string; output: string; } + /** Display currency of an account */ + DisplayCurrency: { input: string; output: string; } + /** Email address */ + EmailAddress: { input: string; output: string; } + /** An id to be passed between registrationInitiate and registrationValidate for confirming email */ + EmailRegistrationId: { input: string; output: string; } + EndpointId: { input: string; output: string; } + /** Url that will be fetched on events for the account */ + EndpointUrl: { input: string; output: string; } + /** Feedback shared with our user */ + Feedback: { input: string; output: string; } + /** Hex-encoded string of 32 bytes */ + Hex32Bytes: { input: string; output: string; } + Language: { input: string; output: string; } + LeaderboardName: { input: string; output: string; } + LnPaymentPreImage: { input: string; output: string; } + /** BOLT11 lightning invoice payment request with the amount included */ + LnPaymentRequest: { input: string; output: string; } + LnPaymentSecret: { input: string; output: string; } + /** Text field in a lightning payment transaction */ + Memo: { input: string; output: string; } + /** (Positive) amount of minutes */ + Minutes: { input: string; output: string; } + NotificationCategory: { input: string; output: string; } + /** An address for an on-chain bitcoin destination */ + OnChainAddress: { input: string; output: string; } + OnChainTxHash: { input: string; output: string; } + /** An authentication code valid for a single use */ + OneTimeAuthCode: { input: string; output: string; } + PaymentHash: { input: string; output: string; } + /** Phone number which includes country code */ + Phone: { input: string; output: string; } + /** Non-fractional signed whole numeric value between -(2^53) + 1 and 2^53 - 1 */ + SafeInt: { input: number; output: number; } + /** (Positive) Satoshi amount */ + SatAmount: { input: number; output: number; } + /** (Positive) amount of seconds */ + Seconds: { input: number; output: number; } + /** An amount (of a currency) that can be negative (e.g. in a transaction) */ + SignedAmount: { input: number; output: number; } + /** A string amount (of a currency) that can be negative (e.g. in a transaction) */ + SignedDisplayMajorAmount: { input: string; output: string; } + /** Timestamp field, serialized as Unix time (the number of seconds since the Unix epoch) */ + Timestamp: { input: number; output: number; } + /** A time-based one-time password */ + TotpCode: { input: string; output: string; } + /** An id to be passed between set and verify for confirming totp */ + TotpRegistrationId: { input: string; output: string; } + /** A secret to generate time-based one-time password */ + TotpSecret: { input: string; output: string; } + /** Unique identifier of a user */ + Username: { input: string; output: string; } + /** Unique identifier of a wallet */ + WalletId: { input: string; output: string; } + _FieldSet: { input: string; output: string; } +}; + +export type Account = { + readonly callbackEndpoints: ReadonlyArray; + readonly csvTransactions: Scalars['String']['output']; + readonly defaultWalletId: Scalars['WalletId']['output']; + readonly displayCurrency: Scalars['DisplayCurrency']['output']; + readonly id: Scalars['ID']['output']; + readonly level: AccountLevel; + readonly limits: AccountLimits; + readonly notificationSettings: NotificationSettings; + readonly realtimePrice: RealtimePrice; + readonly transactions?: Maybe; + readonly wallets: ReadonlyArray; +}; + + +export type AccountCsvTransactionsArgs = { + walletIds: ReadonlyArray; +}; + + +export type AccountTransactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + walletIds?: InputMaybe>>; +}; + +export type AccountDeletePayload = { + readonly __typename: 'AccountDeletePayload'; + readonly errors: ReadonlyArray; + readonly success: Scalars['Boolean']['output']; +}; + +export type AccountDisableNotificationCategoryInput = { + readonly category: Scalars['NotificationCategory']['input']; + readonly channel?: InputMaybe; +}; + +export type AccountDisableNotificationChannelInput = { + readonly channel: NotificationChannel; +}; + +export type AccountEnableNotificationCategoryInput = { + readonly category: Scalars['NotificationCategory']['input']; + readonly channel?: InputMaybe; +}; + +export type AccountEnableNotificationChannelInput = { + readonly channel: NotificationChannel; +}; + +export const AccountLevel = { + One: 'ONE', + Two: 'TWO', + Zero: 'ZERO' +} as const; + +export type AccountLevel = typeof AccountLevel[keyof typeof AccountLevel]; +export type AccountLimit = { + /** The rolling time interval in seconds that the limits would apply for. */ + readonly interval?: Maybe; + /** The amount of cents remaining below the limit for the current 24 hour period. */ + readonly remainingLimit?: Maybe; + /** The current maximum limit for a given 24 hour period. */ + readonly totalLimit: Scalars['CentAmount']['output']; +}; + +export type AccountLimits = { + readonly __typename: 'AccountLimits'; + /** Limits for converting between currencies among a account's own wallets. */ + readonly convert: ReadonlyArray; + /** Limits for sending to other internal accounts. */ + readonly internalSend: ReadonlyArray; + /** Limits for withdrawing to external onchain or lightning destinations. */ + readonly withdrawal: ReadonlyArray; +}; + +export type AccountUpdateDefaultWalletIdInput = { + readonly walletId: Scalars['WalletId']['input']; +}; + +export type AccountUpdateDefaultWalletIdPayload = { + readonly __typename: 'AccountUpdateDefaultWalletIdPayload'; + readonly account?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type AccountUpdateDisplayCurrencyInput = { + readonly currency: Scalars['DisplayCurrency']['input']; +}; + +export type AccountUpdateDisplayCurrencyPayload = { + readonly __typename: 'AccountUpdateDisplayCurrencyPayload'; + readonly account?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type AccountUpdateNotificationSettingsPayload = { + readonly __typename: 'AccountUpdateNotificationSettingsPayload'; + readonly account?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type AuthTokenPayload = { + readonly __typename: 'AuthTokenPayload'; + readonly authToken?: Maybe; + readonly errors: ReadonlyArray; + readonly totpRequired?: Maybe; +}; + +/** A wallet belonging to an account which contains a BTC balance and a list of transactions. */ +export type BtcWallet = Wallet & { + readonly __typename: 'BTCWallet'; + readonly accountId: Scalars['ID']['output']; + /** A balance stored in BTC. */ + readonly balance: Scalars['SignedAmount']['output']; + readonly id: Scalars['ID']['output']; + /** An unconfirmed incoming onchain balance. */ + readonly pendingIncomingBalance: Scalars['SignedAmount']['output']; + /** A list of BTC transactions associated with this wallet. */ + readonly transactions?: Maybe; + readonly transactionsByAddress?: Maybe; + readonly walletCurrency: WalletCurrency; +}; + + +/** A wallet belonging to an account which contains a BTC balance and a list of transactions. */ +export type BtcWalletTransactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A wallet belonging to an account which contains a BTC balance and a list of transactions. */ +export type BtcWalletTransactionsByAddressArgs = { + address: Scalars['OnChainAddress']['input']; + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +export type BuildInformation = { + readonly __typename: 'BuildInformation'; + readonly commitHash?: Maybe; + readonly helmRevision?: Maybe; +}; + +export type CallbackEndpoint = { + readonly __typename: 'CallbackEndpoint'; + readonly id: Scalars['EndpointId']['output']; + readonly url: Scalars['EndpointUrl']['output']; +}; + +export type CallbackEndpointAddInput = { + /** callback endpoint to be called */ + readonly url: Scalars['EndpointUrl']['input']; +}; + +export type CallbackEndpointAddPayload = { + readonly __typename: 'CallbackEndpointAddPayload'; + readonly errors: ReadonlyArray; + readonly id?: Maybe; +}; + +export type CallbackEndpointDeleteInput = { + readonly id: Scalars['EndpointId']['input']; +}; + +export type CaptchaCreateChallengePayload = { + readonly __typename: 'CaptchaCreateChallengePayload'; + readonly errors: ReadonlyArray; + readonly result?: Maybe; +}; + +export type CaptchaCreateChallengeResult = { + readonly __typename: 'CaptchaCreateChallengeResult'; + readonly challengeCode: Scalars['String']['output']; + readonly failbackMode: Scalars['Boolean']['output']; + readonly id: Scalars['String']['output']; + readonly newCaptcha: Scalars['Boolean']['output']; +}; + +export type CaptchaRequestAuthCodeInput = { + readonly challengeCode: Scalars['String']['input']; + readonly channel?: InputMaybe; + readonly phone: Scalars['Phone']['input']; + readonly secCode: Scalars['String']['input']; + readonly validationCode: Scalars['String']['input']; +}; + +export type CentAmountPayload = { + readonly __typename: 'CentAmountPayload'; + readonly amount?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type ConsumerAccount = Account & { + readonly __typename: 'ConsumerAccount'; + readonly callbackEndpoints: ReadonlyArray; + /** return CSV stream, base64 encoded, of the list of transactions in the wallet */ + readonly csvTransactions: Scalars['String']['output']; + readonly defaultWalletId: Scalars['WalletId']['output']; + readonly displayCurrency: Scalars['DisplayCurrency']['output']; + readonly id: Scalars['ID']['output']; + readonly level: AccountLevel; + readonly limits: AccountLimits; + readonly notificationSettings: NotificationSettings; + /** List the quiz questions of the consumer account */ + readonly quiz: ReadonlyArray; + readonly realtimePrice: RealtimePrice; + /** A list of all transactions associated with walletIds optionally passed. */ + readonly transactions?: Maybe; + readonly wallets: ReadonlyArray; + readonly welcomeProfile?: Maybe; +}; + + +export type ConsumerAccountCsvTransactionsArgs = { + walletIds: ReadonlyArray; +}; + + +export type ConsumerAccountTransactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; + walletIds?: InputMaybe>>; +}; + +export type Coordinates = { + readonly __typename: 'Coordinates'; + readonly latitude: Scalars['Float']['output']; + readonly longitude: Scalars['Float']['output']; +}; + +export type Country = { + readonly __typename: 'Country'; + readonly id: Scalars['CountryCode']['output']; + readonly supportedAuthChannels: ReadonlyArray; +}; + +export type Currency = { + readonly __typename: 'Currency'; + readonly flag: Scalars['String']['output']; + readonly fractionDigits: Scalars['Int']['output']; + readonly id: Scalars['ID']['output']; + readonly name: Scalars['String']['output']; + readonly symbol: Scalars['String']['output']; +}; + +export type DepositFeesInformation = { + readonly __typename: 'DepositFeesInformation'; + readonly minBankFee: Scalars['String']['output']; + /** below this amount minBankFee will be charged */ + readonly minBankFeeThreshold: Scalars['String']['output']; + /** ratio to charge as basis points above minBankFeeThreshold amount */ + readonly ratio: Scalars['String']['output']; +}; + +export type DeviceNotificationTokenCreateInput = { + readonly deviceToken: Scalars['String']['input']; +}; + +export type Email = { + readonly __typename: 'Email'; + readonly address?: Maybe; + readonly verified?: Maybe; +}; + +export type Error = { + readonly code?: Maybe; + readonly message: Scalars['String']['output']; + readonly path?: Maybe>>; +}; + +export const ExchangeCurrencyUnit = { + Btcsat: 'BTCSAT', + Usdcent: 'USDCENT' +} as const; + +export type ExchangeCurrencyUnit = typeof ExchangeCurrencyUnit[keyof typeof ExchangeCurrencyUnit]; +export type FeedbackSubmitInput = { + readonly feedback: Scalars['Feedback']['input']; +}; + +export type FeesInformation = { + readonly __typename: 'FeesInformation'; + readonly deposit: DepositFeesInformation; +}; + +/** Provides global settings for the application which might have an impact for the user. */ +export type Globals = { + readonly __typename: 'Globals'; + readonly buildInformation: BuildInformation; + readonly feesInformation: FeesInformation; + /** The domain name for lightning addresses accepted by this Galoy instance */ + readonly lightningAddressDomain: Scalars['String']['output']; + readonly lightningAddressDomainAliases: ReadonlyArray; + /** Which network (mainnet, testnet, regtest, signet) this instance is running on. */ + readonly network: Network; + /** + * A list of public keys for the running lightning nodes. + * This can be used to know if an invoice belongs to one of our nodes. + */ + readonly nodesIds: ReadonlyArray; + /** A list of countries and their supported auth channels */ + readonly supportedCountries: ReadonlyArray; +}; + +export type GraphQlApplicationError = Error & { + readonly __typename: 'GraphQLApplicationError'; + readonly code?: Maybe; + readonly message: Scalars['String']['output']; + readonly path?: Maybe>>; +}; + +export type InitiationVia = InitiationViaIntraLedger | InitiationViaLn | InitiationViaOnChain; + +export type InitiationViaIntraLedger = { + readonly __typename: 'InitiationViaIntraLedger'; + readonly counterPartyUsername?: Maybe; + readonly counterPartyWalletId?: Maybe; +}; + +export type InitiationViaLn = { + readonly __typename: 'InitiationViaLn'; + readonly paymentHash: Scalars['PaymentHash']['output']; +}; + +export type InitiationViaOnChain = { + readonly __typename: 'InitiationViaOnChain'; + readonly address: Scalars['OnChainAddress']['output']; +}; + +export type IntraLedgerPaymentSendInput = { + /** Amount in satoshis. */ + readonly amount: Scalars['SatAmount']['input']; + /** Optional memo to be attached to the payment. */ + readonly memo?: InputMaybe; + readonly recipientWalletId: Scalars['WalletId']['input']; + /** The wallet ID of the sender. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type IntraLedgerUpdate = { + readonly __typename: 'IntraLedgerUpdate'; + readonly amount: Scalars['SatAmount']['output']; + readonly displayCurrencyPerSat: Scalars['Float']['output']; + readonly txNotificationType: TxNotificationType; + /** @deprecated updated over displayCurrencyPerSat */ + readonly usdPerSat: Scalars['Float']['output']; + readonly walletId: Scalars['WalletId']['output']; +}; + +export type IntraLedgerUsdPaymentSendInput = { + /** Amount in cents. */ + readonly amount: Scalars['CentAmount']['input']; + /** Optional memo to be attached to the payment. */ + readonly memo?: InputMaybe; + readonly recipientWalletId: Scalars['WalletId']['input']; + /** The wallet ID of the sender. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export const InvoicePaymentStatus = { + Expired: 'EXPIRED', + Paid: 'PAID', + Pending: 'PENDING' +} as const; + +export type InvoicePaymentStatus = typeof InvoicePaymentStatus[keyof typeof InvoicePaymentStatus]; +export type Leader = { + readonly __typename: 'Leader'; + readonly name?: Maybe; + readonly points: Scalars['Int']['output']; + readonly rank: Scalars['Int']['output']; +}; + +export type Leaderboard = { + readonly __typename: 'Leaderboard'; + readonly leaders: ReadonlyArray; + readonly range: WelcomeRange; +}; + +export type LnInvoice = { + readonly __typename: 'LnInvoice'; + readonly paymentHash: Scalars['PaymentHash']['output']; + readonly paymentRequest: Scalars['LnPaymentRequest']['output']; + readonly paymentSecret: Scalars['LnPaymentSecret']['output']; + readonly satoshis?: Maybe; +}; + +export type LnInvoiceCreateInput = { + /** Amount in satoshis. */ + readonly amount: Scalars['SatAmount']['input']; + /** Optional invoice expiration time in minutes. */ + readonly expiresIn?: InputMaybe; + /** Optional memo for the lightning invoice. */ + readonly memo?: InputMaybe; + /** Wallet ID for a BTC wallet belonging to the current account. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnInvoiceCreateOnBehalfOfRecipientInput = { + /** Amount in satoshis. */ + readonly amount: Scalars['SatAmount']['input']; + readonly descriptionHash?: InputMaybe; + /** Optional invoice expiration time in minutes. */ + readonly expiresIn?: InputMaybe; + /** Optional memo for the lightning invoice. */ + readonly memo?: InputMaybe; + /** Wallet ID for a BTC wallet which belongs to any account. */ + readonly recipientWalletId: Scalars['WalletId']['input']; +}; + +export type LnInvoiceFeeProbeInput = { + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnInvoicePayload = { + readonly __typename: 'LnInvoicePayload'; + readonly errors: ReadonlyArray; + readonly invoice?: Maybe; +}; + +export type LnInvoicePaymentInput = { + /** Optional memo to associate with the lightning invoice. */ + readonly memo?: InputMaybe; + /** Payment request representing the invoice which is being paid. */ + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + /** Wallet ID with sufficient balance to cover amount of invoice. Must belong to the account of the current user. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnInvoicePaymentStatusInput = { + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; +}; + +export type LnInvoicePaymentStatusPayload = { + readonly __typename: 'LnInvoicePaymentStatusPayload'; + readonly errors: ReadonlyArray; + readonly status?: Maybe; +}; + +export type LnNoAmountInvoice = { + readonly __typename: 'LnNoAmountInvoice'; + readonly paymentHash: Scalars['PaymentHash']['output']; + readonly paymentRequest: Scalars['LnPaymentRequest']['output']; + readonly paymentSecret: Scalars['LnPaymentSecret']['output']; +}; + +export type LnNoAmountInvoiceCreateInput = { + /** Optional invoice expiration time in minutes. */ + readonly expiresIn?: InputMaybe; + /** Optional memo for the lightning invoice. */ + readonly memo?: InputMaybe; + /** ID for either a USD or BTC wallet belonging to the account of the current user. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnNoAmountInvoiceCreateOnBehalfOfRecipientInput = { + /** Optional invoice expiration time in minutes. */ + readonly expiresIn?: InputMaybe; + /** Optional memo for the lightning invoice. */ + readonly memo?: InputMaybe; + /** ID for either a USD or BTC wallet which belongs to the account of any user. */ + readonly recipientWalletId: Scalars['WalletId']['input']; +}; + +export type LnNoAmountInvoiceFeeProbeInput = { + readonly amount: Scalars['SatAmount']['input']; + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnNoAmountInvoicePayload = { + readonly __typename: 'LnNoAmountInvoicePayload'; + readonly errors: ReadonlyArray; + readonly invoice?: Maybe; +}; + +export type LnNoAmountInvoicePaymentInput = { + /** Amount to pay in satoshis. */ + readonly amount: Scalars['SatAmount']['input']; + /** Optional memo to associate with the lightning invoice. */ + readonly memo?: InputMaybe; + /** Payment request representing the invoice which is being paid. */ + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + /** Wallet ID with sufficient balance to cover amount defined in mutation request. Must belong to the account of the current user. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnNoAmountUsdInvoiceFeeProbeInput = { + readonly amount: Scalars['CentAmount']['input']; + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnNoAmountUsdInvoicePaymentInput = { + /** Amount to pay in USD cents. */ + readonly amount: Scalars['CentAmount']['input']; + /** Optional memo to associate with the lightning invoice. */ + readonly memo?: InputMaybe; + /** Payment request representing the invoice which is being paid. */ + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + /** Wallet ID with sufficient balance to cover amount defined in mutation request. Must belong to the account of the current user. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnUpdate = { + readonly __typename: 'LnUpdate'; + readonly paymentHash: Scalars['PaymentHash']['output']; + readonly status: InvoicePaymentStatus; + readonly walletId: Scalars['WalletId']['output']; +}; + +export type LnUsdInvoiceCreateInput = { + /** Amount in USD cents. */ + readonly amount: Scalars['CentAmount']['input']; + /** Optional invoice expiration time in minutes. */ + readonly expiresIn?: InputMaybe; + /** Optional memo for the lightning invoice. */ + readonly memo?: InputMaybe; + /** Wallet ID for a USD wallet belonging to the current user. */ + readonly walletId: Scalars['WalletId']['input']; +}; + +export type LnUsdInvoiceCreateOnBehalfOfRecipientInput = { + /** Amount in USD cents. */ + readonly amount: Scalars['CentAmount']['input']; + readonly descriptionHash?: InputMaybe; + /** Optional invoice expiration time in minutes. */ + readonly expiresIn?: InputMaybe; + /** Optional memo for the lightning invoice. Acts as a note to the recipient. */ + readonly memo?: InputMaybe; + /** Wallet ID for a USD wallet which belongs to the account of any user. */ + readonly recipientWalletId: Scalars['WalletId']['input']; +}; + +export type LnUsdInvoiceFeeProbeInput = { + readonly paymentRequest: Scalars['LnPaymentRequest']['input']; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type MapInfo = { + readonly __typename: 'MapInfo'; + readonly coordinates: Coordinates; + readonly title: Scalars['String']['output']; +}; + +export type MapMarker = { + readonly __typename: 'MapMarker'; + readonly mapInfo: MapInfo; + readonly username?: Maybe; +}; + +export type MobileVersions = { + readonly __typename: 'MobileVersions'; + readonly currentSupported: Scalars['Int']['output']; + readonly minSupported: Scalars['Int']['output']; + readonly platform: Scalars['String']['output']; +}; + +export type Mutation = { + readonly __typename: 'Mutation'; + readonly accountDelete: AccountDeletePayload; + readonly accountDisableNotificationCategory: AccountUpdateNotificationSettingsPayload; + readonly accountDisableNotificationChannel: AccountUpdateNotificationSettingsPayload; + readonly accountEnableNotificationCategory: AccountUpdateNotificationSettingsPayload; + readonly accountEnableNotificationChannel: AccountUpdateNotificationSettingsPayload; + readonly accountUpdateDefaultWalletId: AccountUpdateDefaultWalletIdPayload; + readonly accountUpdateDisplayCurrency: AccountUpdateDisplayCurrencyPayload; + readonly callbackEndpointAdd: CallbackEndpointAddPayload; + readonly callbackEndpointDelete: SuccessPayload; + readonly captchaCreateChallenge: CaptchaCreateChallengePayload; + readonly captchaRequestAuthCode: SuccessPayload; + readonly deviceNotificationTokenCreate: SuccessPayload; + readonly feedbackSubmit: SuccessPayload; + /** + * Actions a payment which is internal to the ledger e.g. it does + * not use onchain/lightning. Returns payment status (success, + * failed, pending, already_paid). + */ + readonly intraLedgerPaymentSend: PaymentSendPayload; + /** + * Actions a payment which is internal to the ledger e.g. it does + * not use onchain/lightning. Returns payment status (success, + * failed, pending, already_paid). + */ + readonly intraLedgerUsdPaymentSend: PaymentSendPayload; + /** + * Returns a lightning invoice for an associated wallet. + * When invoice is paid the value will be credited to a BTC wallet. + * Expires after 'expiresIn' or 24 hours. + */ + readonly lnInvoiceCreate: LnInvoicePayload; + /** + * Returns a lightning invoice for an associated wallet. + * When invoice is paid the value will be credited to a BTC wallet. + * Expires after 'expiresIn' or 24 hours. + */ + readonly lnInvoiceCreateOnBehalfOfRecipient: LnInvoicePayload; + readonly lnInvoiceFeeProbe: SatAmountPayload; + /** + * Pay a lightning invoice using a balance from a wallet which is owned by the account of the current user. + * Provided wallet can be USD or BTC and must have sufficient balance to cover amount in lightning invoice. + * Returns payment status (success, failed, pending, already_paid). + */ + readonly lnInvoicePaymentSend: PaymentSendPayload; + /** + * Returns a lightning invoice for an associated wallet. + * Can be used to receive any supported currency value (currently USD or BTC). + * Expires after 'expiresIn' or 24 hours for BTC invoices or 5 minutes for USD invoices. + */ + readonly lnNoAmountInvoiceCreate: LnNoAmountInvoicePayload; + /** + * Returns a lightning invoice for an associated wallet. + * Can be used to receive any supported currency value (currently USD or BTC). + * Expires after 'expiresIn' or 24 hours for BTC invoices or 5 minutes for USD invoices. + */ + readonly lnNoAmountInvoiceCreateOnBehalfOfRecipient: LnNoAmountInvoicePayload; + readonly lnNoAmountInvoiceFeeProbe: SatAmountPayload; + /** + * Pay a lightning invoice using a balance from a wallet which is owned by the account of the current user. + * Provided wallet must be BTC and must have sufficient balance to cover amount specified in mutation request. + * Returns payment status (success, failed, pending, already_paid). + */ + readonly lnNoAmountInvoicePaymentSend: PaymentSendPayload; + readonly lnNoAmountUsdInvoiceFeeProbe: CentAmountPayload; + /** + * Pay a lightning invoice using a balance from a wallet which is owned by the account of the current user. + * Provided wallet must be USD and have sufficient balance to cover amount specified in mutation request. + * Returns payment status (success, failed, pending, already_paid). + */ + readonly lnNoAmountUsdInvoicePaymentSend: PaymentSendPayload; + /** + * Returns a lightning invoice denominated in satoshis for an associated wallet. + * When invoice is paid the equivalent value at invoice creation will be credited to a USD wallet. + * Expires after 'expiresIn' or 5 minutes (short expiry time because there is a USD/BTC exchange rate + * associated with the amount). + */ + readonly lnUsdInvoiceCreate: LnInvoicePayload; + /** + * Returns a lightning invoice denominated in satoshis for an associated wallet. + * When invoice is paid the equivalent value at invoice creation will be credited to a USD wallet. + * Expires after 'expiresIn' or 5 minutes (short expiry time because there is a USD/BTC exchange rate + * associated with the amount). + */ + readonly lnUsdInvoiceCreateOnBehalfOfRecipient: LnInvoicePayload; + readonly lnUsdInvoiceFeeProbe: SatAmountPayload; + readonly onChainAddressCreate: OnChainAddressPayload; + readonly onChainAddressCurrent: OnChainAddressPayload; + readonly onChainPaymentSend: PaymentSendPayload; + readonly onChainPaymentSendAll: PaymentSendPayload; + readonly onChainUsdPaymentSend: PaymentSendPayload; + readonly onChainUsdPaymentSendAsBtcDenominated: PaymentSendPayload; + readonly quizCompleted: QuizCompletedPayload; + /** @deprecated will be moved to AccountContact */ + readonly userContactUpdateAlias: UserContactUpdateAliasPayload; + readonly userEmailDelete: UserEmailDeletePayload; + readonly userEmailRegistrationInitiate: UserEmailRegistrationInitiatePayload; + readonly userEmailRegistrationValidate: UserEmailRegistrationValidatePayload; + readonly userLogin: AuthTokenPayload; + readonly userLoginUpgrade: UpgradePayload; + readonly userLogout: SuccessPayload; + readonly userPhoneDelete: UserPhoneDeletePayload; + readonly userPhoneRegistrationInitiate: SuccessPayload; + readonly userPhoneRegistrationValidate: UserPhoneRegistrationValidatePayload; + /** @deprecated Use QuizCompletedMutation instead */ + readonly userQuizQuestionUpdateCompleted: UserQuizQuestionUpdateCompletedPayload; + readonly userTotpDelete: UserTotpDeletePayload; + readonly userTotpRegistrationInitiate: UserTotpRegistrationInitiatePayload; + readonly userTotpRegistrationValidate: UserTotpRegistrationValidatePayload; + readonly userUpdateLanguage: UserUpdateLanguagePayload; + /** @deprecated Username will be moved to @Handle in Accounts. Also SetUsername naming should be used instead of UpdateUsername to reflect the idempotency of Handles */ + readonly userUpdateUsername: UserUpdateUsernamePayload; +}; + + +export type MutationAccountDisableNotificationCategoryArgs = { + input: AccountDisableNotificationCategoryInput; +}; + + +export type MutationAccountDisableNotificationChannelArgs = { + input: AccountDisableNotificationChannelInput; +}; + + +export type MutationAccountEnableNotificationCategoryArgs = { + input: AccountEnableNotificationCategoryInput; +}; + + +export type MutationAccountEnableNotificationChannelArgs = { + input: AccountEnableNotificationChannelInput; +}; + + +export type MutationAccountUpdateDefaultWalletIdArgs = { + input: AccountUpdateDefaultWalletIdInput; +}; + + +export type MutationAccountUpdateDisplayCurrencyArgs = { + input: AccountUpdateDisplayCurrencyInput; +}; + + +export type MutationCallbackEndpointAddArgs = { + input: CallbackEndpointAddInput; +}; + + +export type MutationCallbackEndpointDeleteArgs = { + input: CallbackEndpointDeleteInput; +}; + + +export type MutationCaptchaRequestAuthCodeArgs = { + input: CaptchaRequestAuthCodeInput; +}; + + +export type MutationDeviceNotificationTokenCreateArgs = { + input: DeviceNotificationTokenCreateInput; +}; + + +export type MutationFeedbackSubmitArgs = { + input: FeedbackSubmitInput; +}; + + +export type MutationIntraLedgerPaymentSendArgs = { + input: IntraLedgerPaymentSendInput; +}; + + +export type MutationIntraLedgerUsdPaymentSendArgs = { + input: IntraLedgerUsdPaymentSendInput; +}; + + +export type MutationLnInvoiceCreateArgs = { + input: LnInvoiceCreateInput; +}; + + +export type MutationLnInvoiceCreateOnBehalfOfRecipientArgs = { + input: LnInvoiceCreateOnBehalfOfRecipientInput; +}; + + +export type MutationLnInvoiceFeeProbeArgs = { + input: LnInvoiceFeeProbeInput; +}; + + +export type MutationLnInvoicePaymentSendArgs = { + input: LnInvoicePaymentInput; +}; + + +export type MutationLnNoAmountInvoiceCreateArgs = { + input: LnNoAmountInvoiceCreateInput; +}; + + +export type MutationLnNoAmountInvoiceCreateOnBehalfOfRecipientArgs = { + input: LnNoAmountInvoiceCreateOnBehalfOfRecipientInput; +}; + + +export type MutationLnNoAmountInvoiceFeeProbeArgs = { + input: LnNoAmountInvoiceFeeProbeInput; +}; + + +export type MutationLnNoAmountInvoicePaymentSendArgs = { + input: LnNoAmountInvoicePaymentInput; +}; + + +export type MutationLnNoAmountUsdInvoiceFeeProbeArgs = { + input: LnNoAmountUsdInvoiceFeeProbeInput; +}; + + +export type MutationLnNoAmountUsdInvoicePaymentSendArgs = { + input: LnNoAmountUsdInvoicePaymentInput; +}; + + +export type MutationLnUsdInvoiceCreateArgs = { + input: LnUsdInvoiceCreateInput; +}; + + +export type MutationLnUsdInvoiceCreateOnBehalfOfRecipientArgs = { + input: LnUsdInvoiceCreateOnBehalfOfRecipientInput; +}; + + +export type MutationLnUsdInvoiceFeeProbeArgs = { + input: LnUsdInvoiceFeeProbeInput; +}; + + +export type MutationOnChainAddressCreateArgs = { + input: OnChainAddressCreateInput; +}; + + +export type MutationOnChainAddressCurrentArgs = { + input: OnChainAddressCurrentInput; +}; + + +export type MutationOnChainPaymentSendArgs = { + input: OnChainPaymentSendInput; +}; + + +export type MutationOnChainPaymentSendAllArgs = { + input: OnChainPaymentSendAllInput; +}; + + +export type MutationOnChainUsdPaymentSendArgs = { + input: OnChainUsdPaymentSendInput; +}; + + +export type MutationOnChainUsdPaymentSendAsBtcDenominatedArgs = { + input: OnChainUsdPaymentSendAsBtcDenominatedInput; +}; + + +export type MutationQuizCompletedArgs = { + input: QuizCompletedInput; +}; + + +export type MutationUserContactUpdateAliasArgs = { + input: UserContactUpdateAliasInput; +}; + + +export type MutationUserEmailRegistrationInitiateArgs = { + input: UserEmailRegistrationInitiateInput; +}; + + +export type MutationUserEmailRegistrationValidateArgs = { + input: UserEmailRegistrationValidateInput; +}; + + +export type MutationUserLoginArgs = { + input: UserLoginInput; +}; + + +export type MutationUserLoginUpgradeArgs = { + input: UserLoginUpgradeInput; +}; + + +export type MutationUserLogoutArgs = { + input?: InputMaybe; +}; + + +export type MutationUserPhoneRegistrationInitiateArgs = { + input: UserPhoneRegistrationInitiateInput; +}; + + +export type MutationUserPhoneRegistrationValidateArgs = { + input: UserPhoneRegistrationValidateInput; +}; + + +export type MutationUserQuizQuestionUpdateCompletedArgs = { + input: UserQuizQuestionUpdateCompletedInput; +}; + + +export type MutationUserTotpDeleteArgs = { + input: UserTotpDeleteInput; +}; + + +export type MutationUserTotpRegistrationInitiateArgs = { + input: UserTotpRegistrationInitiateInput; +}; + + +export type MutationUserTotpRegistrationValidateArgs = { + input: UserTotpRegistrationValidateInput; +}; + + +export type MutationUserUpdateLanguageArgs = { + input: UserUpdateLanguageInput; +}; + + +export type MutationUserUpdateUsernameArgs = { + input: UserUpdateUsernameInput; +}; + +export type MyUpdatesPayload = { + readonly __typename: 'MyUpdatesPayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; + readonly update?: Maybe; +}; + +export const Network = { + Mainnet: 'mainnet', + Regtest: 'regtest', + Signet: 'signet', + Testnet: 'testnet' +} as const; + +export type Network = typeof Network[keyof typeof Network]; +export const NotificationChannel = { + Push: 'PUSH' +} as const; + +export type NotificationChannel = typeof NotificationChannel[keyof typeof NotificationChannel]; +export type NotificationChannelSettings = { + readonly __typename: 'NotificationChannelSettings'; + readonly disabledCategories: ReadonlyArray; + readonly enabled: Scalars['Boolean']['output']; +}; + +export type NotificationSettings = { + readonly __typename: 'NotificationSettings'; + readonly push: NotificationChannelSettings; +}; + +export type OnChainAddressCreateInput = { + readonly walletId: Scalars['WalletId']['input']; +}; + +export type OnChainAddressCurrentInput = { + readonly walletId: Scalars['WalletId']['input']; +}; + +export type OnChainAddressPayload = { + readonly __typename: 'OnChainAddressPayload'; + readonly address?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type OnChainPaymentSendAllInput = { + readonly address: Scalars['OnChainAddress']['input']; + readonly memo?: InputMaybe; + readonly speed?: InputMaybe; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type OnChainPaymentSendInput = { + readonly address: Scalars['OnChainAddress']['input']; + readonly amount: Scalars['SatAmount']['input']; + readonly memo?: InputMaybe; + readonly speed?: InputMaybe; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type OnChainTxFee = { + readonly __typename: 'OnChainTxFee'; + readonly amount: Scalars['SatAmount']['output']; +}; + +export type OnChainUpdate = { + readonly __typename: 'OnChainUpdate'; + readonly amount: Scalars['SatAmount']['output']; + readonly displayCurrencyPerSat: Scalars['Float']['output']; + readonly txHash: Scalars['OnChainTxHash']['output']; + readonly txNotificationType: TxNotificationType; + /** @deprecated updated over displayCurrencyPerSat */ + readonly usdPerSat: Scalars['Float']['output']; + readonly walletId: Scalars['WalletId']['output']; +}; + +export type OnChainUsdPaymentSendAsBtcDenominatedInput = { + readonly address: Scalars['OnChainAddress']['input']; + readonly amount: Scalars['SatAmount']['input']; + readonly memo?: InputMaybe; + readonly speed?: InputMaybe; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type OnChainUsdPaymentSendInput = { + readonly address: Scalars['OnChainAddress']['input']; + readonly amount: Scalars['CentAmount']['input']; + readonly memo?: InputMaybe; + readonly speed?: InputMaybe; + readonly walletId: Scalars['WalletId']['input']; +}; + +export type OnChainUsdTxFee = { + readonly __typename: 'OnChainUsdTxFee'; + readonly amount: Scalars['CentAmount']['output']; +}; + +export type OneDayAccountLimit = AccountLimit & { + readonly __typename: 'OneDayAccountLimit'; + /** The rolling time interval value in seconds for the current 24 hour period. */ + readonly interval?: Maybe; + /** The amount of cents remaining below the limit for the current 24 hour period. */ + readonly remainingLimit?: Maybe; + /** The current maximum limit for a given 24 hour period. */ + readonly totalLimit: Scalars['CentAmount']['output']; +}; + +/** Information about pagination in a connection. */ +export type PageInfo = { + readonly __typename: 'PageInfo'; + /** When paginating forwards, the cursor to continue. */ + readonly endCursor?: Maybe; + /** When paginating forwards, are there more items? */ + readonly hasNextPage: Scalars['Boolean']['output']; + /** When paginating backwards, are there more items? */ + readonly hasPreviousPage: Scalars['Boolean']['output']; + /** When paginating backwards, the cursor to continue. */ + readonly startCursor?: Maybe; +}; + +export type PaymentSendPayload = { + readonly __typename: 'PaymentSendPayload'; + readonly errors: ReadonlyArray; + readonly status?: Maybe; +}; + +export const PaymentSendResult = { + AlreadyPaid: 'ALREADY_PAID', + Failure: 'FAILURE', + Pending: 'PENDING', + Success: 'SUCCESS' +} as const; + +export type PaymentSendResult = typeof PaymentSendResult[keyof typeof PaymentSendResult]; +export const PayoutSpeed = { + Fast: 'FAST' +} as const; + +export type PayoutSpeed = typeof PayoutSpeed[keyof typeof PayoutSpeed]; +export const PhoneCodeChannelType = { + Sms: 'SMS', + Whatsapp: 'WHATSAPP' +} as const; + +export type PhoneCodeChannelType = typeof PhoneCodeChannelType[keyof typeof PhoneCodeChannelType]; +/** Price amount expressed in base/offset. To calculate, use: `base / 10^offset` */ +export type Price = { + readonly __typename: 'Price'; + readonly base: Scalars['SafeInt']['output']; + readonly currencyUnit: Scalars['String']['output']; + readonly formattedAmount: Scalars['String']['output']; + readonly offset: Scalars['Int']['output']; +}; + +/** The range for the X axis in the BTC price graph */ +export const PriceGraphRange = { + FiveYears: 'FIVE_YEARS', + OneDay: 'ONE_DAY', + OneMonth: 'ONE_MONTH', + OneWeek: 'ONE_WEEK', + OneYear: 'ONE_YEAR' +} as const; + +export type PriceGraphRange = typeof PriceGraphRange[keyof typeof PriceGraphRange]; +export type PriceInput = { + readonly amount: Scalars['SatAmount']['input']; + readonly amountCurrencyUnit: ExchangeCurrencyUnit; + readonly priceCurrencyUnit: ExchangeCurrencyUnit; +}; + +export type PriceInterface = { + readonly base: Scalars['SafeInt']['output']; + /** @deprecated Deprecated due to type renaming */ + readonly currencyUnit: Scalars['String']['output']; + readonly offset: Scalars['Int']['output']; +}; + +/** Price of 1 sat in base/offset. To calculate, use: `base / 10^offset` */ +export type PriceOfOneSatInMinorUnit = PriceInterface & { + readonly __typename: 'PriceOfOneSatInMinorUnit'; + readonly base: Scalars['SafeInt']['output']; + /** @deprecated Deprecated due to type renaming */ + readonly currencyUnit: Scalars['String']['output']; + readonly offset: Scalars['Int']['output']; +}; + +/** Price of 1 sat or 1 usd cent in base/offset. To calculate, use: `base / 10^offset` */ +export type PriceOfOneSettlementMinorUnitInDisplayMinorUnit = PriceInterface & { + readonly __typename: 'PriceOfOneSettlementMinorUnitInDisplayMinorUnit'; + readonly base: Scalars['SafeInt']['output']; + /** @deprecated Deprecated due to type renaming */ + readonly currencyUnit: Scalars['String']['output']; + /** @deprecated Deprecated please use `base / 10^offset` */ + readonly formattedAmount: Scalars['String']['output']; + readonly offset: Scalars['Int']['output']; +}; + +/** Price of 1 usd cent in base/offset. To calculate, use: `base / 10^offset` */ +export type PriceOfOneUsdCentInMinorUnit = PriceInterface & { + readonly __typename: 'PriceOfOneUsdCentInMinorUnit'; + readonly base: Scalars['SafeInt']['output']; + /** @deprecated Deprecated due to type renaming */ + readonly currencyUnit: Scalars['String']['output']; + readonly offset: Scalars['Int']['output']; +}; + +export type PricePayload = { + readonly __typename: 'PricePayload'; + readonly errors: ReadonlyArray; + readonly price?: Maybe; +}; + +export type PricePoint = { + readonly __typename: 'PricePoint'; + readonly price: Price; + /** Unix timestamp (number of seconds elapsed since January 1, 1970 00:00:00 UTC) */ + readonly timestamp: Scalars['Timestamp']['output']; +}; + +/** A public view of a generic wallet which stores value in one of our supported currencies. */ +export type PublicWallet = { + readonly __typename: 'PublicWallet'; + readonly id: Scalars['ID']['output']; + readonly walletCurrency: WalletCurrency; +}; + +export type Query = { + readonly __typename: 'Query'; + readonly accountDefaultWallet: PublicWallet; + /** @deprecated Deprecated in favor of realtimePrice */ + readonly btcPrice?: Maybe; + readonly btcPriceList?: Maybe>>; + readonly businessMapMarkers?: Maybe>>; + readonly currencyList: ReadonlyArray; + readonly globals?: Maybe; + readonly lnInvoicePaymentStatus: LnInvoicePaymentStatusPayload; + readonly me?: Maybe; + readonly mobileVersions?: Maybe>>; + readonly onChainTxFee: OnChainTxFee; + readonly onChainUsdTxFee: OnChainUsdTxFee; + readonly onChainUsdTxFeeAsBtcDenominated: OnChainUsdTxFee; + /** @deprecated TODO: remove. we don't need a non authenticated version of this query. the users can only do the query while authenticated */ + readonly quizQuestions?: Maybe>>; + /** Returns 1 Sat and 1 Usd Cent price for the given currency */ + readonly realtimePrice: RealtimePrice; + /** @deprecated will be migrated to AccountDefaultWalletId */ + readonly userDefaultWalletId: Scalars['WalletId']['output']; + readonly usernameAvailable?: Maybe; + readonly welcomeLeaderboard: Leaderboard; +}; + + +export type QueryAccountDefaultWalletArgs = { + username: Scalars['Username']['input']; + walletCurrency?: InputMaybe; +}; + + +export type QueryBtcPriceArgs = { + currency?: Scalars['DisplayCurrency']['input']; +}; + + +export type QueryBtcPriceListArgs = { + range: PriceGraphRange; +}; + + +export type QueryLnInvoicePaymentStatusArgs = { + input: LnInvoicePaymentStatusInput; +}; + + +export type QueryOnChainTxFeeArgs = { + address: Scalars['OnChainAddress']['input']; + amount: Scalars['SatAmount']['input']; + speed?: InputMaybe; + walletId: Scalars['WalletId']['input']; +}; + + +export type QueryOnChainUsdTxFeeArgs = { + address: Scalars['OnChainAddress']['input']; + amount: Scalars['CentAmount']['input']; + speed?: InputMaybe; + walletId: Scalars['WalletId']['input']; +}; + + +export type QueryOnChainUsdTxFeeAsBtcDenominatedArgs = { + address: Scalars['OnChainAddress']['input']; + amount: Scalars['SatAmount']['input']; + speed?: InputMaybe; + walletId: Scalars['WalletId']['input']; +}; + + +export type QueryRealtimePriceArgs = { + currency?: InputMaybe; +}; + + +export type QueryUserDefaultWalletIdArgs = { + username: Scalars['Username']['input']; +}; + + +export type QueryUsernameAvailableArgs = { + username: Scalars['Username']['input']; +}; + + +export type QueryWelcomeLeaderboardArgs = { + input: WelcomeLeaderboardInput; +}; + +export type Quiz = { + readonly __typename: 'Quiz'; + /** The reward in Satoshis for the quiz question */ + readonly amount: Scalars['SatAmount']['output']; + readonly completed: Scalars['Boolean']['output']; + readonly id: Scalars['ID']['output']; +}; + +export type QuizCompletedInput = { + readonly id: Scalars['ID']['input']; +}; + +export type QuizCompletedPayload = { + readonly __typename: 'QuizCompletedPayload'; + readonly errors: ReadonlyArray; + readonly quiz?: Maybe; +}; + +export type QuizQuestion = { + readonly __typename: 'QuizQuestion'; + /** The earn reward in Satoshis for the quiz question */ + readonly earnAmount: Scalars['SatAmount']['output']; + readonly id: Scalars['ID']['output']; +}; + +export type RealtimePrice = { + readonly __typename: 'RealtimePrice'; + readonly btcSatPrice: PriceOfOneSatInMinorUnit; + readonly denominatorCurrency: Scalars['DisplayCurrency']['output']; + readonly id: Scalars['ID']['output']; + /** Unix timestamp (number of seconds elapsed since January 1, 1970 00:00:00 UTC) */ + readonly timestamp: Scalars['Timestamp']['output']; + readonly usdCentPrice: PriceOfOneUsdCentInMinorUnit; +}; + +export type RealtimePriceInput = { + readonly currency?: InputMaybe; +}; + +export type RealtimePricePayload = { + readonly __typename: 'RealtimePricePayload'; + readonly errors: ReadonlyArray; + readonly realtimePrice?: Maybe; +}; + +export type SatAmountPayload = { + readonly __typename: 'SatAmountPayload'; + readonly amount?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type SettlementVia = SettlementViaIntraLedger | SettlementViaLn | SettlementViaOnChain; + +export type SettlementViaIntraLedger = { + readonly __typename: 'SettlementViaIntraLedger'; + /** Settlement destination: Could be null if the payee does not have a username */ + readonly counterPartyUsername?: Maybe; + readonly counterPartyWalletId?: Maybe; +}; + +export type SettlementViaLn = { + readonly __typename: 'SettlementViaLn'; + /** @deprecated Shifting property to 'preImage' to improve granularity of the LnPaymentSecret type */ + readonly paymentSecret?: Maybe; + readonly preImage?: Maybe; +}; + +export type SettlementViaOnChain = { + readonly __typename: 'SettlementViaOnChain'; + readonly transactionHash?: Maybe; + readonly vout?: Maybe; +}; + +export type Subscription = { + readonly __typename: 'Subscription'; + readonly lnInvoicePaymentStatus: LnInvoicePaymentStatusPayload; + readonly myUpdates: MyUpdatesPayload; + readonly price: PricePayload; + /** Returns the price of 1 satoshi */ + readonly realtimePrice: RealtimePricePayload; +}; + + +export type SubscriptionLnInvoicePaymentStatusArgs = { + input: LnInvoicePaymentStatusInput; +}; + + +export type SubscriptionPriceArgs = { + input: PriceInput; +}; + + +export type SubscriptionRealtimePriceArgs = { + input: RealtimePriceInput; +}; + +export type SuccessPayload = { + readonly __typename: 'SuccessPayload'; + readonly errors: ReadonlyArray; + readonly success?: Maybe; +}; + +/** + * Give details about an individual transaction. + * Galoy have a smart routing system which is automatically + * settling intraledger when both the payer and payee use the same wallet + * therefore it's possible the transactions is being initiated onchain + * or with lightning but settled intraledger. + */ +export type Transaction = { + readonly __typename: 'Transaction'; + readonly createdAt: Scalars['Timestamp']['output']; + readonly direction: TxDirection; + readonly id: Scalars['ID']['output']; + /** From which protocol the payment has been initiated. */ + readonly initiationVia: InitiationVia; + readonly memo?: Maybe; + /** Amount of the settlement currency sent or received. */ + readonly settlementAmount: Scalars['SignedAmount']['output']; + /** Wallet currency for transaction. */ + readonly settlementCurrency: WalletCurrency; + readonly settlementDisplayAmount: Scalars['SignedDisplayMajorAmount']['output']; + readonly settlementDisplayCurrency: Scalars['DisplayCurrency']['output']; + readonly settlementDisplayFee: Scalars['SignedDisplayMajorAmount']['output']; + readonly settlementFee: Scalars['SignedAmount']['output']; + /** Price in WALLETCURRENCY/SETTLEMENTUNIT at time of settlement. */ + readonly settlementPrice: PriceOfOneSettlementMinorUnitInDisplayMinorUnit; + /** To which protocol the payment has settled on. */ + readonly settlementVia: SettlementVia; + readonly status: TxStatus; +}; + +/** A connection to a list of items. */ +export type TransactionConnection = { + readonly __typename: 'TransactionConnection'; + /** A list of edges. */ + readonly edges?: Maybe>; + /** Information to aid in pagination. */ + readonly pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type TransactionEdge = { + readonly __typename: 'TransactionEdge'; + /** A cursor for use in pagination */ + readonly cursor: Scalars['String']['output']; + /** The item at the end of the edge */ + readonly node: Transaction; +}; + +export const TxDirection = { + Receive: 'RECEIVE', + Send: 'SEND' +} as const; + +export type TxDirection = typeof TxDirection[keyof typeof TxDirection]; +export const TxNotificationType = { + IntraLedgerPayment: 'IntraLedgerPayment', + IntraLedgerReceipt: 'IntraLedgerReceipt', + LnInvoicePaid: 'LnInvoicePaid', + OnchainPayment: 'OnchainPayment', + OnchainReceipt: 'OnchainReceipt', + OnchainReceiptPending: 'OnchainReceiptPending' +} as const; + +export type TxNotificationType = typeof TxNotificationType[keyof typeof TxNotificationType]; +export const TxStatus = { + Failure: 'FAILURE', + Pending: 'PENDING', + Success: 'SUCCESS' +} as const; + +export type TxStatus = typeof TxStatus[keyof typeof TxStatus]; +export type UpgradePayload = { + readonly __typename: 'UpgradePayload'; + readonly authToken?: Maybe; + readonly errors: ReadonlyArray; + readonly success: Scalars['Boolean']['output']; +}; + +/** A wallet belonging to an account which contains a USD balance and a list of transactions. */ +export type UsdWallet = Wallet & { + readonly __typename: 'UsdWallet'; + readonly accountId: Scalars['ID']['output']; + readonly balance: Scalars['SignedAmount']['output']; + readonly id: Scalars['ID']['output']; + /** An unconfirmed incoming onchain balance. */ + readonly pendingIncomingBalance: Scalars['SignedAmount']['output']; + readonly transactions?: Maybe; + readonly transactionsByAddress?: Maybe; + readonly walletCurrency: WalletCurrency; +}; + + +/** A wallet belonging to an account which contains a USD balance and a list of transactions. */ +export type UsdWalletTransactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A wallet belonging to an account which contains a USD balance and a list of transactions. */ +export type UsdWalletTransactionsByAddressArgs = { + address: Scalars['OnChainAddress']['input']; + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +export type User = { + readonly __typename: 'User'; + /** + * Get single contact details. + * Can include the transactions associated with the contact. + * @deprecated will be moved to Accounts + */ + readonly contactByUsername: UserContact; + /** + * Get full list of contacts. + * Can include the transactions associated with each contact. + * @deprecated will be moved to account + */ + readonly contacts: ReadonlyArray; + readonly createdAt: Scalars['Timestamp']['output']; + readonly defaultAccount: Account; + /** Email address */ + readonly email?: Maybe; + readonly id: Scalars['ID']['output']; + /** + * Preferred language for user. + * When value is 'default' the intent is to use preferred language from OS settings. + */ + readonly language: Scalars['Language']['output']; + /** Phone number with international calling code. */ + readonly phone?: Maybe; + /** + * List the quiz questions the user may have completed. + * @deprecated use Quiz from Account instead + */ + readonly quizQuestions: ReadonlyArray; + /** Whether TOTP is enabled for this user. */ + readonly totpEnabled: Scalars['Boolean']['output']; + /** + * Optional immutable user friendly identifier. + * @deprecated will be moved to @Handle in Account and Wallet + */ + readonly username?: Maybe; +}; + + +export type UserContactByUsernameArgs = { + username: Scalars['Username']['input']; +}; + +export type UserContact = { + readonly __typename: 'UserContact'; + /** + * Alias the user can set for this contact. + * Only the user can see the alias attached to their contact. + */ + readonly alias?: Maybe; + readonly id: Scalars['Username']['output']; + /** Paginated list of transactions sent to/from this contact. */ + readonly transactions?: Maybe; + readonly transactionsCount: Scalars['Int']['output']; + /** Actual identifier of the contact. */ + readonly username: Scalars['Username']['output']; +}; + + +export type UserContactTransactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +export type UserContactUpdateAliasInput = { + readonly alias: Scalars['ContactAlias']['input']; + readonly username: Scalars['Username']['input']; +}; + +export type UserContactUpdateAliasPayload = { + readonly __typename: 'UserContactUpdateAliasPayload'; + readonly contact?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type UserEmailDeletePayload = { + readonly __typename: 'UserEmailDeletePayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserEmailRegistrationInitiateInput = { + readonly email: Scalars['EmailAddress']['input']; +}; + +export type UserEmailRegistrationInitiatePayload = { + readonly __typename: 'UserEmailRegistrationInitiatePayload'; + readonly emailRegistrationId?: Maybe; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserEmailRegistrationValidateInput = { + readonly code: Scalars['OneTimeAuthCode']['input']; + readonly emailRegistrationId: Scalars['EmailRegistrationId']['input']; +}; + +export type UserEmailRegistrationValidatePayload = { + readonly __typename: 'UserEmailRegistrationValidatePayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserLoginInput = { + readonly code: Scalars['OneTimeAuthCode']['input']; + readonly phone: Scalars['Phone']['input']; +}; + +export type UserLoginUpgradeInput = { + readonly code: Scalars['OneTimeAuthCode']['input']; + readonly phone: Scalars['Phone']['input']; +}; + +export type UserLogoutInput = { + readonly deviceToken: Scalars['String']['input']; +}; + +export type UserPhoneDeletePayload = { + readonly __typename: 'UserPhoneDeletePayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserPhoneRegistrationInitiateInput = { + readonly channel?: InputMaybe; + readonly phone: Scalars['Phone']['input']; +}; + +export type UserPhoneRegistrationValidateInput = { + readonly code: Scalars['OneTimeAuthCode']['input']; + readonly phone: Scalars['Phone']['input']; +}; + +export type UserPhoneRegistrationValidatePayload = { + readonly __typename: 'UserPhoneRegistrationValidatePayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserQuizQuestion = { + readonly __typename: 'UserQuizQuestion'; + readonly completed: Scalars['Boolean']['output']; + readonly question: QuizQuestion; +}; + +export type UserQuizQuestionUpdateCompletedInput = { + readonly id: Scalars['ID']['input']; +}; + +export type UserQuizQuestionUpdateCompletedPayload = { + readonly __typename: 'UserQuizQuestionUpdateCompletedPayload'; + readonly errors: ReadonlyArray; + readonly userQuizQuestion?: Maybe; +}; + +export type UserTotpDeleteInput = { + readonly authToken: Scalars['AuthToken']['input']; +}; + +export type UserTotpDeletePayload = { + readonly __typename: 'UserTotpDeletePayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserTotpRegistrationInitiateInput = { + readonly authToken: Scalars['AuthToken']['input']; +}; + +export type UserTotpRegistrationInitiatePayload = { + readonly __typename: 'UserTotpRegistrationInitiatePayload'; + readonly errors: ReadonlyArray; + readonly totpRegistrationId?: Maybe; + readonly totpSecret?: Maybe; +}; + +export type UserTotpRegistrationValidateInput = { + readonly authToken: Scalars['AuthToken']['input']; + readonly totpCode: Scalars['TotpCode']['input']; + readonly totpRegistrationId: Scalars['TotpRegistrationId']['input']; +}; + +export type UserTotpRegistrationValidatePayload = { + readonly __typename: 'UserTotpRegistrationValidatePayload'; + readonly errors: ReadonlyArray; + readonly me?: Maybe; +}; + +export type UserUpdate = IntraLedgerUpdate | LnUpdate | OnChainUpdate | Price | RealtimePrice; + +export type UserUpdateLanguageInput = { + readonly language: Scalars['Language']['input']; +}; + +export type UserUpdateLanguagePayload = { + readonly __typename: 'UserUpdateLanguagePayload'; + readonly errors: ReadonlyArray; + readonly user?: Maybe; +}; + +export type UserUpdateUsernameInput = { + readonly username: Scalars['Username']['input']; +}; + +export type UserUpdateUsernamePayload = { + readonly __typename: 'UserUpdateUsernamePayload'; + readonly errors: ReadonlyArray; + readonly user?: Maybe; +}; + +/** A generic wallet which stores value in one of our supported currencies. */ +export type Wallet = { + readonly accountId: Scalars['ID']['output']; + readonly balance: Scalars['SignedAmount']['output']; + readonly id: Scalars['ID']['output']; + readonly pendingIncomingBalance: Scalars['SignedAmount']['output']; + /** + * Transactions are ordered anti-chronologically, + * ie: the newest transaction will be first + */ + readonly transactions?: Maybe; + /** + * Transactions are ordered anti-chronologically, + * ie: the newest transaction will be first + */ + readonly transactionsByAddress?: Maybe; + readonly walletCurrency: WalletCurrency; +}; + + +/** A generic wallet which stores value in one of our supported currencies. */ +export type WalletTransactionsArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +/** A generic wallet which stores value in one of our supported currencies. */ +export type WalletTransactionsByAddressArgs = { + address: Scalars['OnChainAddress']['input']; + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +export const WalletCurrency = { + Btc: 'BTC', + Usd: 'USD' +} as const; + +export type WalletCurrency = typeof WalletCurrency[keyof typeof WalletCurrency]; +export type WelcomeLeaderboardInput = { + readonly range: WelcomeRange; +}; + +export type WelcomeProfile = { + readonly __typename: 'WelcomeProfile'; + readonly allTimePoints: Scalars['Int']['output']; + readonly allTimeRank: Scalars['Int']['output']; + readonly innerCircleAllTimeCount: Scalars['Int']['output']; + readonly innerCircleThisMonthCount: Scalars['Int']['output']; + readonly leaderboardName?: Maybe; + readonly outerCircleAllTimeCount: Scalars['Int']['output']; + readonly outerCircleThisMonthCount: Scalars['Int']['output']; + readonly thisMonthPoints: Scalars['Int']['output']; + readonly thisMonthRank: Scalars['Int']['output']; +}; + +export const WelcomeRange = { + AllTime: 'AllTime', + ThisMonth: 'ThisMonth' +} as const; + +export type WelcomeRange = typeof WelcomeRange[keyof typeof WelcomeRange]; +export type MeQueryVariables = Exact<{ [key: string]: never; }>; + + +export type MeQuery = { readonly __typename: 'Query', readonly me?: { readonly __typename: 'User', readonly defaultAccount: { readonly __typename: 'ConsumerAccount', readonly id: string, readonly level: AccountLevel } } | null }; + + +export const MeDocument = gql` + query me { + me { + defaultAccount { + id + level + } + } +} + `; + +/** + * __useMeQuery__ + * + * To run a query within a React component, call `useMeQuery` and pass it any options that fit your needs. + * When your component renders, `useMeQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useMeQuery({ + * variables: { + * }, + * }); + */ +export function useMeQuery(baseOptions?: Apollo.QueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(MeDocument, options); + } +export function useMeLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(MeDocument, options); + } +export type MeQueryHookResult = ReturnType; +export type MeLazyQueryHookResult = ReturnType; +export type MeQueryResult = Apollo.QueryResult; + + +export type ResolverTypeWrapper = Promise | T; + + +export type ResolverWithResolve = { + resolve: ResolverFn; +}; +export type Resolver = ResolverFn | ResolverWithResolve; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterable | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe | Promise>; + +export type IsTypeOfResolverFn = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +/** Mapping of union types */ +export type ResolversUnionTypes> = { + InitiationVia: ( InitiationViaIntraLedger ) | ( InitiationViaLn ) | ( InitiationViaOnChain ); + SettlementVia: ( SettlementViaIntraLedger ) | ( SettlementViaLn ) | ( SettlementViaOnChain ); + UserUpdate: ( IntraLedgerUpdate ) | ( LnUpdate ) | ( OnChainUpdate ) | ( Price ) | ( RealtimePrice ); +}; + +/** Mapping of interface types */ +export type ResolversInterfaceTypes> = { + Account: ( ConsumerAccount ); + AccountLimit: ( OneDayAccountLimit ); + Error: ( GraphQlApplicationError ); + PriceInterface: ( PriceOfOneSatInMinorUnit ) | ( PriceOfOneSettlementMinorUnitInDisplayMinorUnit ) | ( PriceOfOneUsdCentInMinorUnit ); + Wallet: ( BtcWallet ) | ( UsdWallet ); +}; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + Account: ResolverTypeWrapper['Account']>; + String: ResolverTypeWrapper; + ID: ResolverTypeWrapper; + Int: ResolverTypeWrapper; + AccountDeletePayload: ResolverTypeWrapper; + Boolean: ResolverTypeWrapper; + AccountDisableNotificationCategoryInput: AccountDisableNotificationCategoryInput; + AccountDisableNotificationChannelInput: AccountDisableNotificationChannelInput; + AccountEnableNotificationCategoryInput: AccountEnableNotificationCategoryInput; + AccountEnableNotificationChannelInput: AccountEnableNotificationChannelInput; + AccountLevel: AccountLevel; + AccountLimit: ResolverTypeWrapper['AccountLimit']>; + AccountLimits: ResolverTypeWrapper; + AccountUpdateDefaultWalletIdInput: AccountUpdateDefaultWalletIdInput; + AccountUpdateDefaultWalletIdPayload: ResolverTypeWrapper; + AccountUpdateDisplayCurrencyInput: AccountUpdateDisplayCurrencyInput; + AccountUpdateDisplayCurrencyPayload: ResolverTypeWrapper; + AccountUpdateNotificationSettingsPayload: ResolverTypeWrapper; + AuthToken: ResolverTypeWrapper; + AuthTokenPayload: ResolverTypeWrapper; + BTCWallet: ResolverTypeWrapper; + BuildInformation: ResolverTypeWrapper; + CallbackEndpoint: ResolverTypeWrapper; + CallbackEndpointAddInput: CallbackEndpointAddInput; + CallbackEndpointAddPayload: ResolverTypeWrapper; + CallbackEndpointDeleteInput: CallbackEndpointDeleteInput; + CaptchaCreateChallengePayload: ResolverTypeWrapper; + CaptchaCreateChallengeResult: ResolverTypeWrapper; + CaptchaRequestAuthCodeInput: CaptchaRequestAuthCodeInput; + CentAmount: ResolverTypeWrapper; + CentAmountPayload: ResolverTypeWrapper; + ConsumerAccount: ResolverTypeWrapper; + ContactAlias: ResolverTypeWrapper; + Coordinates: ResolverTypeWrapper; + Float: ResolverTypeWrapper; + Country: ResolverTypeWrapper; + CountryCode: ResolverTypeWrapper; + Currency: ResolverTypeWrapper; + DepositFeesInformation: ResolverTypeWrapper; + DeviceNotificationTokenCreateInput: DeviceNotificationTokenCreateInput; + DisplayCurrency: ResolverTypeWrapper; + Email: ResolverTypeWrapper; + EmailAddress: ResolverTypeWrapper; + EmailRegistrationId: ResolverTypeWrapper; + EndpointId: ResolverTypeWrapper; + EndpointUrl: ResolverTypeWrapper; + Error: ResolverTypeWrapper['Error']>; + ExchangeCurrencyUnit: ExchangeCurrencyUnit; + Feedback: ResolverTypeWrapper; + FeedbackSubmitInput: FeedbackSubmitInput; + FeesInformation: ResolverTypeWrapper; + Globals: ResolverTypeWrapper; + GraphQLApplicationError: ResolverTypeWrapper; + Hex32Bytes: ResolverTypeWrapper; + InitiationVia: ResolverTypeWrapper['InitiationVia']>; + InitiationViaIntraLedger: ResolverTypeWrapper; + InitiationViaLn: ResolverTypeWrapper; + InitiationViaOnChain: ResolverTypeWrapper; + IntraLedgerPaymentSendInput: IntraLedgerPaymentSendInput; + IntraLedgerUpdate: ResolverTypeWrapper; + IntraLedgerUsdPaymentSendInput: IntraLedgerUsdPaymentSendInput; + InvoicePaymentStatus: InvoicePaymentStatus; + Language: ResolverTypeWrapper; + Leader: ResolverTypeWrapper; + Leaderboard: ResolverTypeWrapper; + LeaderboardName: ResolverTypeWrapper; + LnInvoice: ResolverTypeWrapper; + LnInvoiceCreateInput: LnInvoiceCreateInput; + LnInvoiceCreateOnBehalfOfRecipientInput: LnInvoiceCreateOnBehalfOfRecipientInput; + LnInvoiceFeeProbeInput: LnInvoiceFeeProbeInput; + LnInvoicePayload: ResolverTypeWrapper; + LnInvoicePaymentInput: LnInvoicePaymentInput; + LnInvoicePaymentStatusInput: LnInvoicePaymentStatusInput; + LnInvoicePaymentStatusPayload: ResolverTypeWrapper; + LnNoAmountInvoice: ResolverTypeWrapper; + LnNoAmountInvoiceCreateInput: LnNoAmountInvoiceCreateInput; + LnNoAmountInvoiceCreateOnBehalfOfRecipientInput: LnNoAmountInvoiceCreateOnBehalfOfRecipientInput; + LnNoAmountInvoiceFeeProbeInput: LnNoAmountInvoiceFeeProbeInput; + LnNoAmountInvoicePayload: ResolverTypeWrapper; + LnNoAmountInvoicePaymentInput: LnNoAmountInvoicePaymentInput; + LnNoAmountUsdInvoiceFeeProbeInput: LnNoAmountUsdInvoiceFeeProbeInput; + LnNoAmountUsdInvoicePaymentInput: LnNoAmountUsdInvoicePaymentInput; + LnPaymentPreImage: ResolverTypeWrapper; + LnPaymentRequest: ResolverTypeWrapper; + LnPaymentSecret: ResolverTypeWrapper; + LnUpdate: ResolverTypeWrapper; + LnUsdInvoiceCreateInput: LnUsdInvoiceCreateInput; + LnUsdInvoiceCreateOnBehalfOfRecipientInput: LnUsdInvoiceCreateOnBehalfOfRecipientInput; + LnUsdInvoiceFeeProbeInput: LnUsdInvoiceFeeProbeInput; + MapInfo: ResolverTypeWrapper; + MapMarker: ResolverTypeWrapper; + Memo: ResolverTypeWrapper; + Minutes: ResolverTypeWrapper; + MobileVersions: ResolverTypeWrapper; + Mutation: ResolverTypeWrapper<{}>; + MyUpdatesPayload: ResolverTypeWrapper & { update?: Maybe }>; + Network: Network; + NotificationCategory: ResolverTypeWrapper; + NotificationChannel: NotificationChannel; + NotificationChannelSettings: ResolverTypeWrapper; + NotificationSettings: ResolverTypeWrapper; + OnChainAddress: ResolverTypeWrapper; + OnChainAddressCreateInput: OnChainAddressCreateInput; + OnChainAddressCurrentInput: OnChainAddressCurrentInput; + OnChainAddressPayload: ResolverTypeWrapper; + OnChainPaymentSendAllInput: OnChainPaymentSendAllInput; + OnChainPaymentSendInput: OnChainPaymentSendInput; + OnChainTxFee: ResolverTypeWrapper; + OnChainTxHash: ResolverTypeWrapper; + OnChainUpdate: ResolverTypeWrapper; + OnChainUsdPaymentSendAsBtcDenominatedInput: OnChainUsdPaymentSendAsBtcDenominatedInput; + OnChainUsdPaymentSendInput: OnChainUsdPaymentSendInput; + OnChainUsdTxFee: ResolverTypeWrapper; + OneDayAccountLimit: ResolverTypeWrapper; + OneTimeAuthCode: ResolverTypeWrapper; + PageInfo: ResolverTypeWrapper; + PaymentHash: ResolverTypeWrapper; + PaymentSendPayload: ResolverTypeWrapper; + PaymentSendResult: PaymentSendResult; + PayoutSpeed: PayoutSpeed; + Phone: ResolverTypeWrapper; + PhoneCodeChannelType: PhoneCodeChannelType; + Price: ResolverTypeWrapper; + PriceGraphRange: PriceGraphRange; + PriceInput: PriceInput; + PriceInterface: ResolverTypeWrapper['PriceInterface']>; + PriceOfOneSatInMinorUnit: ResolverTypeWrapper; + PriceOfOneSettlementMinorUnitInDisplayMinorUnit: ResolverTypeWrapper; + PriceOfOneUsdCentInMinorUnit: ResolverTypeWrapper; + PricePayload: ResolverTypeWrapper; + PricePoint: ResolverTypeWrapper; + PublicWallet: ResolverTypeWrapper; + Query: ResolverTypeWrapper<{}>; + Quiz: ResolverTypeWrapper; + QuizCompletedInput: QuizCompletedInput; + QuizCompletedPayload: ResolverTypeWrapper; + QuizQuestion: ResolverTypeWrapper; + RealtimePrice: ResolverTypeWrapper; + RealtimePriceInput: RealtimePriceInput; + RealtimePricePayload: ResolverTypeWrapper; + SafeInt: ResolverTypeWrapper; + SatAmount: ResolverTypeWrapper; + SatAmountPayload: ResolverTypeWrapper; + Seconds: ResolverTypeWrapper; + SettlementVia: ResolverTypeWrapper['SettlementVia']>; + SettlementViaIntraLedger: ResolverTypeWrapper; + SettlementViaLn: ResolverTypeWrapper; + SettlementViaOnChain: ResolverTypeWrapper; + SignedAmount: ResolverTypeWrapper; + SignedDisplayMajorAmount: ResolverTypeWrapper; + Subscription: ResolverTypeWrapper<{}>; + SuccessPayload: ResolverTypeWrapper; + Timestamp: ResolverTypeWrapper; + TotpCode: ResolverTypeWrapper; + TotpRegistrationId: ResolverTypeWrapper; + TotpSecret: ResolverTypeWrapper; + Transaction: ResolverTypeWrapper & { initiationVia: ResolversTypes['InitiationVia'], settlementVia: ResolversTypes['SettlementVia'] }>; + TransactionConnection: ResolverTypeWrapper; + TransactionEdge: ResolverTypeWrapper; + TxDirection: TxDirection; + TxNotificationType: TxNotificationType; + TxStatus: TxStatus; + UpgradePayload: ResolverTypeWrapper; + UsdWallet: ResolverTypeWrapper; + User: ResolverTypeWrapper; + UserContact: ResolverTypeWrapper; + UserContactUpdateAliasInput: UserContactUpdateAliasInput; + UserContactUpdateAliasPayload: ResolverTypeWrapper; + UserEmailDeletePayload: ResolverTypeWrapper; + UserEmailRegistrationInitiateInput: UserEmailRegistrationInitiateInput; + UserEmailRegistrationInitiatePayload: ResolverTypeWrapper; + UserEmailRegistrationValidateInput: UserEmailRegistrationValidateInput; + UserEmailRegistrationValidatePayload: ResolverTypeWrapper; + UserLoginInput: UserLoginInput; + UserLoginUpgradeInput: UserLoginUpgradeInput; + UserLogoutInput: UserLogoutInput; + UserPhoneDeletePayload: ResolverTypeWrapper; + UserPhoneRegistrationInitiateInput: UserPhoneRegistrationInitiateInput; + UserPhoneRegistrationValidateInput: UserPhoneRegistrationValidateInput; + UserPhoneRegistrationValidatePayload: ResolverTypeWrapper; + UserQuizQuestion: ResolverTypeWrapper; + UserQuizQuestionUpdateCompletedInput: UserQuizQuestionUpdateCompletedInput; + UserQuizQuestionUpdateCompletedPayload: ResolverTypeWrapper; + UserTotpDeleteInput: UserTotpDeleteInput; + UserTotpDeletePayload: ResolverTypeWrapper; + UserTotpRegistrationInitiateInput: UserTotpRegistrationInitiateInput; + UserTotpRegistrationInitiatePayload: ResolverTypeWrapper; + UserTotpRegistrationValidateInput: UserTotpRegistrationValidateInput; + UserTotpRegistrationValidatePayload: ResolverTypeWrapper; + UserUpdate: ResolverTypeWrapper['UserUpdate']>; + UserUpdateLanguageInput: UserUpdateLanguageInput; + UserUpdateLanguagePayload: ResolverTypeWrapper; + UserUpdateUsernameInput: UserUpdateUsernameInput; + UserUpdateUsernamePayload: ResolverTypeWrapper; + Username: ResolverTypeWrapper; + Wallet: ResolverTypeWrapper['Wallet']>; + WalletCurrency: WalletCurrency; + WalletId: ResolverTypeWrapper; + WelcomeLeaderboardInput: WelcomeLeaderboardInput; + WelcomeProfile: ResolverTypeWrapper; + WelcomeRange: WelcomeRange; +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + Account: ResolversInterfaceTypes['Account']; + String: Scalars['String']['output']; + ID: Scalars['ID']['output']; + Int: Scalars['Int']['output']; + AccountDeletePayload: AccountDeletePayload; + Boolean: Scalars['Boolean']['output']; + AccountDisableNotificationCategoryInput: AccountDisableNotificationCategoryInput; + AccountDisableNotificationChannelInput: AccountDisableNotificationChannelInput; + AccountEnableNotificationCategoryInput: AccountEnableNotificationCategoryInput; + AccountEnableNotificationChannelInput: AccountEnableNotificationChannelInput; + AccountLimit: ResolversInterfaceTypes['AccountLimit']; + AccountLimits: AccountLimits; + AccountUpdateDefaultWalletIdInput: AccountUpdateDefaultWalletIdInput; + AccountUpdateDefaultWalletIdPayload: AccountUpdateDefaultWalletIdPayload; + AccountUpdateDisplayCurrencyInput: AccountUpdateDisplayCurrencyInput; + AccountUpdateDisplayCurrencyPayload: AccountUpdateDisplayCurrencyPayload; + AccountUpdateNotificationSettingsPayload: AccountUpdateNotificationSettingsPayload; + AuthToken: Scalars['AuthToken']['output']; + AuthTokenPayload: AuthTokenPayload; + BTCWallet: BtcWallet; + BuildInformation: BuildInformation; + CallbackEndpoint: CallbackEndpoint; + CallbackEndpointAddInput: CallbackEndpointAddInput; + CallbackEndpointAddPayload: CallbackEndpointAddPayload; + CallbackEndpointDeleteInput: CallbackEndpointDeleteInput; + CaptchaCreateChallengePayload: CaptchaCreateChallengePayload; + CaptchaCreateChallengeResult: CaptchaCreateChallengeResult; + CaptchaRequestAuthCodeInput: CaptchaRequestAuthCodeInput; + CentAmount: Scalars['CentAmount']['output']; + CentAmountPayload: CentAmountPayload; + ConsumerAccount: ConsumerAccount; + ContactAlias: Scalars['ContactAlias']['output']; + Coordinates: Coordinates; + Float: Scalars['Float']['output']; + Country: Country; + CountryCode: Scalars['CountryCode']['output']; + Currency: Currency; + DepositFeesInformation: DepositFeesInformation; + DeviceNotificationTokenCreateInput: DeviceNotificationTokenCreateInput; + DisplayCurrency: Scalars['DisplayCurrency']['output']; + Email: Email; + EmailAddress: Scalars['EmailAddress']['output']; + EmailRegistrationId: Scalars['EmailRegistrationId']['output']; + EndpointId: Scalars['EndpointId']['output']; + EndpointUrl: Scalars['EndpointUrl']['output']; + Error: ResolversInterfaceTypes['Error']; + Feedback: Scalars['Feedback']['output']; + FeedbackSubmitInput: FeedbackSubmitInput; + FeesInformation: FeesInformation; + Globals: Globals; + GraphQLApplicationError: GraphQlApplicationError; + Hex32Bytes: Scalars['Hex32Bytes']['output']; + InitiationVia: ResolversUnionTypes['InitiationVia']; + InitiationViaIntraLedger: InitiationViaIntraLedger; + InitiationViaLn: InitiationViaLn; + InitiationViaOnChain: InitiationViaOnChain; + IntraLedgerPaymentSendInput: IntraLedgerPaymentSendInput; + IntraLedgerUpdate: IntraLedgerUpdate; + IntraLedgerUsdPaymentSendInput: IntraLedgerUsdPaymentSendInput; + Language: Scalars['Language']['output']; + Leader: Leader; + Leaderboard: Leaderboard; + LeaderboardName: Scalars['LeaderboardName']['output']; + LnInvoice: LnInvoice; + LnInvoiceCreateInput: LnInvoiceCreateInput; + LnInvoiceCreateOnBehalfOfRecipientInput: LnInvoiceCreateOnBehalfOfRecipientInput; + LnInvoiceFeeProbeInput: LnInvoiceFeeProbeInput; + LnInvoicePayload: LnInvoicePayload; + LnInvoicePaymentInput: LnInvoicePaymentInput; + LnInvoicePaymentStatusInput: LnInvoicePaymentStatusInput; + LnInvoicePaymentStatusPayload: LnInvoicePaymentStatusPayload; + LnNoAmountInvoice: LnNoAmountInvoice; + LnNoAmountInvoiceCreateInput: LnNoAmountInvoiceCreateInput; + LnNoAmountInvoiceCreateOnBehalfOfRecipientInput: LnNoAmountInvoiceCreateOnBehalfOfRecipientInput; + LnNoAmountInvoiceFeeProbeInput: LnNoAmountInvoiceFeeProbeInput; + LnNoAmountInvoicePayload: LnNoAmountInvoicePayload; + LnNoAmountInvoicePaymentInput: LnNoAmountInvoicePaymentInput; + LnNoAmountUsdInvoiceFeeProbeInput: LnNoAmountUsdInvoiceFeeProbeInput; + LnNoAmountUsdInvoicePaymentInput: LnNoAmountUsdInvoicePaymentInput; + LnPaymentPreImage: Scalars['LnPaymentPreImage']['output']; + LnPaymentRequest: Scalars['LnPaymentRequest']['output']; + LnPaymentSecret: Scalars['LnPaymentSecret']['output']; + LnUpdate: LnUpdate; + LnUsdInvoiceCreateInput: LnUsdInvoiceCreateInput; + LnUsdInvoiceCreateOnBehalfOfRecipientInput: LnUsdInvoiceCreateOnBehalfOfRecipientInput; + LnUsdInvoiceFeeProbeInput: LnUsdInvoiceFeeProbeInput; + MapInfo: MapInfo; + MapMarker: MapMarker; + Memo: Scalars['Memo']['output']; + Minutes: Scalars['Minutes']['output']; + MobileVersions: MobileVersions; + Mutation: {}; + MyUpdatesPayload: Omit & { update?: Maybe }; + NotificationCategory: Scalars['NotificationCategory']['output']; + NotificationChannelSettings: NotificationChannelSettings; + NotificationSettings: NotificationSettings; + OnChainAddress: Scalars['OnChainAddress']['output']; + OnChainAddressCreateInput: OnChainAddressCreateInput; + OnChainAddressCurrentInput: OnChainAddressCurrentInput; + OnChainAddressPayload: OnChainAddressPayload; + OnChainPaymentSendAllInput: OnChainPaymentSendAllInput; + OnChainPaymentSendInput: OnChainPaymentSendInput; + OnChainTxFee: OnChainTxFee; + OnChainTxHash: Scalars['OnChainTxHash']['output']; + OnChainUpdate: OnChainUpdate; + OnChainUsdPaymentSendAsBtcDenominatedInput: OnChainUsdPaymentSendAsBtcDenominatedInput; + OnChainUsdPaymentSendInput: OnChainUsdPaymentSendInput; + OnChainUsdTxFee: OnChainUsdTxFee; + OneDayAccountLimit: OneDayAccountLimit; + OneTimeAuthCode: Scalars['OneTimeAuthCode']['output']; + PageInfo: PageInfo; + PaymentHash: Scalars['PaymentHash']['output']; + PaymentSendPayload: PaymentSendPayload; + Phone: Scalars['Phone']['output']; + Price: Price; + PriceInput: PriceInput; + PriceInterface: ResolversInterfaceTypes['PriceInterface']; + PriceOfOneSatInMinorUnit: PriceOfOneSatInMinorUnit; + PriceOfOneSettlementMinorUnitInDisplayMinorUnit: PriceOfOneSettlementMinorUnitInDisplayMinorUnit; + PriceOfOneUsdCentInMinorUnit: PriceOfOneUsdCentInMinorUnit; + PricePayload: PricePayload; + PricePoint: PricePoint; + PublicWallet: PublicWallet; + Query: {}; + Quiz: Quiz; + QuizCompletedInput: QuizCompletedInput; + QuizCompletedPayload: QuizCompletedPayload; + QuizQuestion: QuizQuestion; + RealtimePrice: RealtimePrice; + RealtimePriceInput: RealtimePriceInput; + RealtimePricePayload: RealtimePricePayload; + SafeInt: Scalars['SafeInt']['output']; + SatAmount: Scalars['SatAmount']['output']; + SatAmountPayload: SatAmountPayload; + Seconds: Scalars['Seconds']['output']; + SettlementVia: ResolversUnionTypes['SettlementVia']; + SettlementViaIntraLedger: SettlementViaIntraLedger; + SettlementViaLn: SettlementViaLn; + SettlementViaOnChain: SettlementViaOnChain; + SignedAmount: Scalars['SignedAmount']['output']; + SignedDisplayMajorAmount: Scalars['SignedDisplayMajorAmount']['output']; + Subscription: {}; + SuccessPayload: SuccessPayload; + Timestamp: Scalars['Timestamp']['output']; + TotpCode: Scalars['TotpCode']['output']; + TotpRegistrationId: Scalars['TotpRegistrationId']['output']; + TotpSecret: Scalars['TotpSecret']['output']; + Transaction: Omit & { initiationVia: ResolversParentTypes['InitiationVia'], settlementVia: ResolversParentTypes['SettlementVia'] }; + TransactionConnection: TransactionConnection; + TransactionEdge: TransactionEdge; + UpgradePayload: UpgradePayload; + UsdWallet: UsdWallet; + User: User; + UserContact: UserContact; + UserContactUpdateAliasInput: UserContactUpdateAliasInput; + UserContactUpdateAliasPayload: UserContactUpdateAliasPayload; + UserEmailDeletePayload: UserEmailDeletePayload; + UserEmailRegistrationInitiateInput: UserEmailRegistrationInitiateInput; + UserEmailRegistrationInitiatePayload: UserEmailRegistrationInitiatePayload; + UserEmailRegistrationValidateInput: UserEmailRegistrationValidateInput; + UserEmailRegistrationValidatePayload: UserEmailRegistrationValidatePayload; + UserLoginInput: UserLoginInput; + UserLoginUpgradeInput: UserLoginUpgradeInput; + UserLogoutInput: UserLogoutInput; + UserPhoneDeletePayload: UserPhoneDeletePayload; + UserPhoneRegistrationInitiateInput: UserPhoneRegistrationInitiateInput; + UserPhoneRegistrationValidateInput: UserPhoneRegistrationValidateInput; + UserPhoneRegistrationValidatePayload: UserPhoneRegistrationValidatePayload; + UserQuizQuestion: UserQuizQuestion; + UserQuizQuestionUpdateCompletedInput: UserQuizQuestionUpdateCompletedInput; + UserQuizQuestionUpdateCompletedPayload: UserQuizQuestionUpdateCompletedPayload; + UserTotpDeleteInput: UserTotpDeleteInput; + UserTotpDeletePayload: UserTotpDeletePayload; + UserTotpRegistrationInitiateInput: UserTotpRegistrationInitiateInput; + UserTotpRegistrationInitiatePayload: UserTotpRegistrationInitiatePayload; + UserTotpRegistrationValidateInput: UserTotpRegistrationValidateInput; + UserTotpRegistrationValidatePayload: UserTotpRegistrationValidatePayload; + UserUpdate: ResolversUnionTypes['UserUpdate']; + UserUpdateLanguageInput: UserUpdateLanguageInput; + UserUpdateLanguagePayload: UserUpdateLanguagePayload; + UserUpdateUsernameInput: UserUpdateUsernameInput; + UserUpdateUsernamePayload: UserUpdateUsernamePayload; + Username: Scalars['Username']['output']; + Wallet: ResolversInterfaceTypes['Wallet']; + WalletId: Scalars['WalletId']['output']; + WelcomeLeaderboardInput: WelcomeLeaderboardInput; + WelcomeProfile: WelcomeProfile; +}; + +export type DeferDirectiveArgs = { + if?: Scalars['Boolean']['input']; + label?: Maybe; +}; + +export type DeferDirectiveResolver = DirectiveResolverFn; + +export type AccountResolvers = { + __resolveType: TypeResolveFn<'ConsumerAccount', ParentType, ContextType>; + callbackEndpoints?: Resolver, ParentType, ContextType>; + csvTransactions?: Resolver>; + defaultWalletId?: Resolver; + displayCurrency?: Resolver; + id?: Resolver; + level?: Resolver; + limits?: Resolver; + notificationSettings?: Resolver; + realtimePrice?: Resolver; + transactions?: Resolver, ParentType, ContextType, Partial>; + wallets?: Resolver, ParentType, ContextType>; +}; + +export type AccountDeletePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AccountLimitResolvers = { + __resolveType: TypeResolveFn<'OneDayAccountLimit', ParentType, ContextType>; + interval?: Resolver, ParentType, ContextType>; + remainingLimit?: Resolver, ParentType, ContextType>; + totalLimit?: Resolver; +}; + +export type AccountLimitsResolvers = { + convert?: Resolver, ParentType, ContextType>; + internalSend?: Resolver, ParentType, ContextType>; + withdrawal?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AccountUpdateDefaultWalletIdPayloadResolvers = { + account?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AccountUpdateDisplayCurrencyPayloadResolvers = { + account?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type AccountUpdateNotificationSettingsPayloadResolvers = { + account?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface AuthTokenScalarConfig extends GraphQLScalarTypeConfig { + name: 'AuthToken'; +} + +export type AuthTokenPayloadResolvers = { + authToken?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + totpRequired?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BtcWalletResolvers = { + accountId?: Resolver; + balance?: Resolver; + id?: Resolver; + pendingIncomingBalance?: Resolver; + transactions?: Resolver, ParentType, ContextType, Partial>; + transactionsByAddress?: Resolver, ParentType, ContextType, RequireFields>; + walletCurrency?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type BuildInformationResolvers = { + commitHash?: Resolver, ParentType, ContextType>; + helmRevision?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CallbackEndpointResolvers = { + id?: Resolver; + url?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CallbackEndpointAddPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + id?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CaptchaCreateChallengePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + result?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CaptchaCreateChallengeResultResolvers = { + challengeCode?: Resolver; + failbackMode?: Resolver; + id?: Resolver; + newCaptcha?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface CentAmountScalarConfig extends GraphQLScalarTypeConfig { + name: 'CentAmount'; +} + +export type CentAmountPayloadResolvers = { + amount?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type ConsumerAccountResolvers = { + callbackEndpoints?: Resolver, ParentType, ContextType>; + csvTransactions?: Resolver>; + defaultWalletId?: Resolver; + displayCurrency?: Resolver; + id?: Resolver; + level?: Resolver; + limits?: Resolver; + notificationSettings?: Resolver; + quiz?: Resolver, ParentType, ContextType>; + realtimePrice?: Resolver; + transactions?: Resolver, ParentType, ContextType, Partial>; + wallets?: Resolver, ParentType, ContextType>; + welcomeProfile?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface ContactAliasScalarConfig extends GraphQLScalarTypeConfig { + name: 'ContactAlias'; +} + +export type CoordinatesResolvers = { + latitude?: Resolver; + longitude?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type CountryResolvers = { + id?: Resolver; + supportedAuthChannels?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface CountryCodeScalarConfig extends GraphQLScalarTypeConfig { + name: 'CountryCode'; +} + +export type CurrencyResolvers = { + flag?: Resolver; + fractionDigits?: Resolver; + id?: Resolver; + name?: Resolver; + symbol?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type DepositFeesInformationResolvers = { + minBankFee?: Resolver; + minBankFeeThreshold?: Resolver; + ratio?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface DisplayCurrencyScalarConfig extends GraphQLScalarTypeConfig { + name: 'DisplayCurrency'; +} + +export type EmailResolvers = { + address?: Resolver, ParentType, ContextType>; + verified?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface EmailAddressScalarConfig extends GraphQLScalarTypeConfig { + name: 'EmailAddress'; +} + +export interface EmailRegistrationIdScalarConfig extends GraphQLScalarTypeConfig { + name: 'EmailRegistrationId'; +} + +export interface EndpointIdScalarConfig extends GraphQLScalarTypeConfig { + name: 'EndpointId'; +} + +export interface EndpointUrlScalarConfig extends GraphQLScalarTypeConfig { + name: 'EndpointUrl'; +} + +export type ErrorResolvers = { + __resolveType: TypeResolveFn<'GraphQLApplicationError', ParentType, ContextType>; + code?: Resolver, ParentType, ContextType>; + message?: Resolver; + path?: Resolver>>, ParentType, ContextType>; +}; + +export interface FeedbackScalarConfig extends GraphQLScalarTypeConfig { + name: 'Feedback'; +} + +export type FeesInformationResolvers = { + deposit?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type GlobalsResolvers = { + buildInformation?: Resolver; + feesInformation?: Resolver; + lightningAddressDomain?: Resolver; + lightningAddressDomainAliases?: Resolver, ParentType, ContextType>; + network?: Resolver; + nodesIds?: Resolver, ParentType, ContextType>; + supportedCountries?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type GraphQlApplicationErrorResolvers = { + code?: Resolver, ParentType, ContextType>; + message?: Resolver; + path?: Resolver>>, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface Hex32BytesScalarConfig extends GraphQLScalarTypeConfig { + name: 'Hex32Bytes'; +} + +export type InitiationViaResolvers = { + __resolveType: TypeResolveFn<'InitiationViaIntraLedger' | 'InitiationViaLn' | 'InitiationViaOnChain', ParentType, ContextType>; +}; + +export type InitiationViaIntraLedgerResolvers = { + counterPartyUsername?: Resolver, ParentType, ContextType>; + counterPartyWalletId?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type InitiationViaLnResolvers = { + paymentHash?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type InitiationViaOnChainResolvers = { + address?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type IntraLedgerUpdateResolvers = { + amount?: Resolver; + displayCurrencyPerSat?: Resolver; + txNotificationType?: Resolver; + usdPerSat?: Resolver; + walletId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface LanguageScalarConfig extends GraphQLScalarTypeConfig { + name: 'Language'; +} + +export type LeaderResolvers = { + name?: Resolver, ParentType, ContextType>; + points?: Resolver; + rank?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LeaderboardResolvers = { + leaders?: Resolver, ParentType, ContextType>; + range?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface LeaderboardNameScalarConfig extends GraphQLScalarTypeConfig { + name: 'LeaderboardName'; +} + +export type LnInvoiceResolvers = { + paymentHash?: Resolver; + paymentRequest?: Resolver; + paymentSecret?: Resolver; + satoshis?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LnInvoicePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + invoice?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LnInvoicePaymentStatusPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + status?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LnNoAmountInvoiceResolvers = { + paymentHash?: Resolver; + paymentRequest?: Resolver; + paymentSecret?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type LnNoAmountInvoicePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + invoice?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface LnPaymentPreImageScalarConfig extends GraphQLScalarTypeConfig { + name: 'LnPaymentPreImage'; +} + +export interface LnPaymentRequestScalarConfig extends GraphQLScalarTypeConfig { + name: 'LnPaymentRequest'; +} + +export interface LnPaymentSecretScalarConfig extends GraphQLScalarTypeConfig { + name: 'LnPaymentSecret'; +} + +export type LnUpdateResolvers = { + paymentHash?: Resolver; + status?: Resolver; + walletId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MapInfoResolvers = { + coordinates?: Resolver; + title?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MapMarkerResolvers = { + mapInfo?: Resolver; + username?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface MemoScalarConfig extends GraphQLScalarTypeConfig { + name: 'Memo'; +} + +export interface MinutesScalarConfig extends GraphQLScalarTypeConfig { + name: 'Minutes'; +} + +export type MobileVersionsResolvers = { + currentSupported?: Resolver; + minSupported?: Resolver; + platform?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type MutationResolvers = { + accountDelete?: Resolver; + accountDisableNotificationCategory?: Resolver>; + accountDisableNotificationChannel?: Resolver>; + accountEnableNotificationCategory?: Resolver>; + accountEnableNotificationChannel?: Resolver>; + accountUpdateDefaultWalletId?: Resolver>; + accountUpdateDisplayCurrency?: Resolver>; + callbackEndpointAdd?: Resolver>; + callbackEndpointDelete?: Resolver>; + captchaCreateChallenge?: Resolver; + captchaRequestAuthCode?: Resolver>; + deviceNotificationTokenCreate?: Resolver>; + feedbackSubmit?: Resolver>; + intraLedgerPaymentSend?: Resolver>; + intraLedgerUsdPaymentSend?: Resolver>; + lnInvoiceCreate?: Resolver>; + lnInvoiceCreateOnBehalfOfRecipient?: Resolver>; + lnInvoiceFeeProbe?: Resolver>; + lnInvoicePaymentSend?: Resolver>; + lnNoAmountInvoiceCreate?: Resolver>; + lnNoAmountInvoiceCreateOnBehalfOfRecipient?: Resolver>; + lnNoAmountInvoiceFeeProbe?: Resolver>; + lnNoAmountInvoicePaymentSend?: Resolver>; + lnNoAmountUsdInvoiceFeeProbe?: Resolver>; + lnNoAmountUsdInvoicePaymentSend?: Resolver>; + lnUsdInvoiceCreate?: Resolver>; + lnUsdInvoiceCreateOnBehalfOfRecipient?: Resolver>; + lnUsdInvoiceFeeProbe?: Resolver>; + onChainAddressCreate?: Resolver>; + onChainAddressCurrent?: Resolver>; + onChainPaymentSend?: Resolver>; + onChainPaymentSendAll?: Resolver>; + onChainUsdPaymentSend?: Resolver>; + onChainUsdPaymentSendAsBtcDenominated?: Resolver>; + quizCompleted?: Resolver>; + userContactUpdateAlias?: Resolver>; + userEmailDelete?: Resolver; + userEmailRegistrationInitiate?: Resolver>; + userEmailRegistrationValidate?: Resolver>; + userLogin?: Resolver>; + userLoginUpgrade?: Resolver>; + userLogout?: Resolver>; + userPhoneDelete?: Resolver; + userPhoneRegistrationInitiate?: Resolver>; + userPhoneRegistrationValidate?: Resolver>; + userQuizQuestionUpdateCompleted?: Resolver>; + userTotpDelete?: Resolver>; + userTotpRegistrationInitiate?: Resolver>; + userTotpRegistrationValidate?: Resolver>; + userUpdateLanguage?: Resolver>; + userUpdateUsername?: Resolver>; +}; + +export type MyUpdatesPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + update?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface NotificationCategoryScalarConfig extends GraphQLScalarTypeConfig { + name: 'NotificationCategory'; +} + +export type NotificationChannelSettingsResolvers = { + disabledCategories?: Resolver, ParentType, ContextType>; + enabled?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type NotificationSettingsResolvers = { + push?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface OnChainAddressScalarConfig extends GraphQLScalarTypeConfig { + name: 'OnChainAddress'; +} + +export type OnChainAddressPayloadResolvers = { + address?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OnChainTxFeeResolvers = { + amount?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface OnChainTxHashScalarConfig extends GraphQLScalarTypeConfig { + name: 'OnChainTxHash'; +} + +export type OnChainUpdateResolvers = { + amount?: Resolver; + displayCurrencyPerSat?: Resolver; + txHash?: Resolver; + txNotificationType?: Resolver; + usdPerSat?: Resolver; + walletId?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OnChainUsdTxFeeResolvers = { + amount?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type OneDayAccountLimitResolvers = { + interval?: Resolver, ParentType, ContextType>; + remainingLimit?: Resolver, ParentType, ContextType>; + totalLimit?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface OneTimeAuthCodeScalarConfig extends GraphQLScalarTypeConfig { + name: 'OneTimeAuthCode'; +} + +export type PageInfoResolvers = { + endCursor?: Resolver, ParentType, ContextType>; + hasNextPage?: Resolver; + hasPreviousPage?: Resolver; + startCursor?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface PaymentHashScalarConfig extends GraphQLScalarTypeConfig { + name: 'PaymentHash'; +} + +export type PaymentSendPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + status?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface PhoneScalarConfig extends GraphQLScalarTypeConfig { + name: 'Phone'; +} + +export type PriceResolvers = { + base?: Resolver; + currencyUnit?: Resolver; + formattedAmount?: Resolver; + offset?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PriceInterfaceResolvers = { + __resolveType: TypeResolveFn<'PriceOfOneSatInMinorUnit' | 'PriceOfOneSettlementMinorUnitInDisplayMinorUnit' | 'PriceOfOneUsdCentInMinorUnit', ParentType, ContextType>; + base?: Resolver; + currencyUnit?: Resolver; + offset?: Resolver; +}; + +export type PriceOfOneSatInMinorUnitResolvers = { + base?: Resolver; + currencyUnit?: Resolver; + offset?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PriceOfOneSettlementMinorUnitInDisplayMinorUnitResolvers = { + base?: Resolver; + currencyUnit?: Resolver; + formattedAmount?: Resolver; + offset?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PriceOfOneUsdCentInMinorUnitResolvers = { + base?: Resolver; + currencyUnit?: Resolver; + offset?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PricePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + price?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PricePointResolvers = { + price?: Resolver; + timestamp?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type PublicWalletResolvers = { + id?: Resolver; + walletCurrency?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QueryResolvers = { + accountDefaultWallet?: Resolver>; + btcPrice?: Resolver, ParentType, ContextType, RequireFields>; + btcPriceList?: Resolver>>, ParentType, ContextType, RequireFields>; + businessMapMarkers?: Resolver>>, ParentType, ContextType>; + currencyList?: Resolver, ParentType, ContextType>; + globals?: Resolver, ParentType, ContextType>; + lnInvoicePaymentStatus?: Resolver>; + me?: Resolver, ParentType, ContextType>; + mobileVersions?: Resolver>>, ParentType, ContextType>; + onChainTxFee?: Resolver>; + onChainUsdTxFee?: Resolver>; + onChainUsdTxFeeAsBtcDenominated?: Resolver>; + quizQuestions?: Resolver>>, ParentType, ContextType>; + realtimePrice?: Resolver>; + userDefaultWalletId?: Resolver>; + usernameAvailable?: Resolver, ParentType, ContextType, RequireFields>; + welcomeLeaderboard?: Resolver>; +}; + +export type QuizResolvers = { + amount?: Resolver; + completed?: Resolver; + id?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuizCompletedPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + quiz?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type QuizQuestionResolvers = { + earnAmount?: Resolver; + id?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RealtimePriceResolvers = { + btcSatPrice?: Resolver; + denominatorCurrency?: Resolver; + id?: Resolver; + timestamp?: Resolver; + usdCentPrice?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type RealtimePricePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + realtimePrice?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface SafeIntScalarConfig extends GraphQLScalarTypeConfig { + name: 'SafeInt'; +} + +export interface SatAmountScalarConfig extends GraphQLScalarTypeConfig { + name: 'SatAmount'; +} + +export type SatAmountPayloadResolvers = { + amount?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface SecondsScalarConfig extends GraphQLScalarTypeConfig { + name: 'Seconds'; +} + +export type SettlementViaResolvers = { + __resolveType: TypeResolveFn<'SettlementViaIntraLedger' | 'SettlementViaLn' | 'SettlementViaOnChain', ParentType, ContextType>; +}; + +export type SettlementViaIntraLedgerResolvers = { + counterPartyUsername?: Resolver, ParentType, ContextType>; + counterPartyWalletId?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SettlementViaLnResolvers = { + paymentSecret?: Resolver, ParentType, ContextType>; + preImage?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SettlementViaOnChainResolvers = { + transactionHash?: Resolver, ParentType, ContextType>; + vout?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface SignedAmountScalarConfig extends GraphQLScalarTypeConfig { + name: 'SignedAmount'; +} + +export interface SignedDisplayMajorAmountScalarConfig extends GraphQLScalarTypeConfig { + name: 'SignedDisplayMajorAmount'; +} + +export type SubscriptionResolvers = { + lnInvoicePaymentStatus?: SubscriptionResolver>; + myUpdates?: SubscriptionResolver; + price?: SubscriptionResolver>; + realtimePrice?: SubscriptionResolver>; +}; + +export type SuccessPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + success?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface TimestampScalarConfig extends GraphQLScalarTypeConfig { + name: 'Timestamp'; +} + +export interface TotpCodeScalarConfig extends GraphQLScalarTypeConfig { + name: 'TotpCode'; +} + +export interface TotpRegistrationIdScalarConfig extends GraphQLScalarTypeConfig { + name: 'TotpRegistrationId'; +} + +export interface TotpSecretScalarConfig extends GraphQLScalarTypeConfig { + name: 'TotpSecret'; +} + +export type TransactionResolvers = { + createdAt?: Resolver; + direction?: Resolver; + id?: Resolver; + initiationVia?: Resolver; + memo?: Resolver, ParentType, ContextType>; + settlementAmount?: Resolver; + settlementCurrency?: Resolver; + settlementDisplayAmount?: Resolver; + settlementDisplayCurrency?: Resolver; + settlementDisplayFee?: Resolver; + settlementFee?: Resolver; + settlementPrice?: Resolver; + settlementVia?: Resolver; + status?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransactionConnectionResolvers = { + edges?: Resolver>, ParentType, ContextType>; + pageInfo?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type TransactionEdgeResolvers = { + cursor?: Resolver; + node?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UpgradePayloadResolvers = { + authToken?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + success?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UsdWalletResolvers = { + accountId?: Resolver; + balance?: Resolver; + id?: Resolver; + pendingIncomingBalance?: Resolver; + transactions?: Resolver, ParentType, ContextType, Partial>; + transactionsByAddress?: Resolver, ParentType, ContextType, RequireFields>; + walletCurrency?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserResolvers = { + contactByUsername?: Resolver>; + contacts?: Resolver, ParentType, ContextType>; + createdAt?: Resolver; + defaultAccount?: Resolver; + email?: Resolver, ParentType, ContextType>; + id?: Resolver; + language?: Resolver; + phone?: Resolver, ParentType, ContextType>; + quizQuestions?: Resolver, ParentType, ContextType>; + totpEnabled?: Resolver; + username?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserContactResolvers = { + alias?: Resolver, ParentType, ContextType>; + id?: Resolver; + transactions?: Resolver, ParentType, ContextType, Partial>; + transactionsCount?: Resolver; + username?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserContactUpdateAliasPayloadResolvers = { + contact?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserEmailDeletePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserEmailRegistrationInitiatePayloadResolvers = { + emailRegistrationId?: Resolver, ParentType, ContextType>; + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserEmailRegistrationValidatePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserPhoneDeletePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserPhoneRegistrationValidatePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserQuizQuestionResolvers = { + completed?: Resolver; + question?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserQuizQuestionUpdateCompletedPayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + userQuizQuestion?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserTotpDeletePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserTotpRegistrationInitiatePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + totpRegistrationId?: Resolver, ParentType, ContextType>; + totpSecret?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserTotpRegistrationValidatePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + me?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserUpdateResolvers = { + __resolveType: TypeResolveFn<'IntraLedgerUpdate' | 'LnUpdate' | 'OnChainUpdate' | 'Price' | 'RealtimePrice', ParentType, ContextType>; +}; + +export type UserUpdateLanguagePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + user?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type UserUpdateUsernamePayloadResolvers = { + errors?: Resolver, ParentType, ContextType>; + user?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export interface UsernameScalarConfig extends GraphQLScalarTypeConfig { + name: 'Username'; +} + +export type WalletResolvers = { + __resolveType: TypeResolveFn<'BTCWallet' | 'UsdWallet', ParentType, ContextType>; + accountId?: Resolver; + balance?: Resolver; + id?: Resolver; + pendingIncomingBalance?: Resolver; + transactions?: Resolver, ParentType, ContextType, Partial>; + transactionsByAddress?: Resolver, ParentType, ContextType, RequireFields>; + walletCurrency?: Resolver; +}; + +export interface WalletIdScalarConfig extends GraphQLScalarTypeConfig { + name: 'WalletId'; +} + +export type WelcomeProfileResolvers = { + allTimePoints?: Resolver; + allTimeRank?: Resolver; + innerCircleAllTimeCount?: Resolver; + innerCircleThisMonthCount?: Resolver; + leaderboardName?: Resolver, ParentType, ContextType>; + outerCircleAllTimeCount?: Resolver; + outerCircleThisMonthCount?: Resolver; + thisMonthPoints?: Resolver; + thisMonthRank?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type Resolvers = { + Account?: AccountResolvers; + AccountDeletePayload?: AccountDeletePayloadResolvers; + AccountLimit?: AccountLimitResolvers; + AccountLimits?: AccountLimitsResolvers; + AccountUpdateDefaultWalletIdPayload?: AccountUpdateDefaultWalletIdPayloadResolvers; + AccountUpdateDisplayCurrencyPayload?: AccountUpdateDisplayCurrencyPayloadResolvers; + AccountUpdateNotificationSettingsPayload?: AccountUpdateNotificationSettingsPayloadResolvers; + AuthToken?: GraphQLScalarType; + AuthTokenPayload?: AuthTokenPayloadResolvers; + BTCWallet?: BtcWalletResolvers; + BuildInformation?: BuildInformationResolvers; + CallbackEndpoint?: CallbackEndpointResolvers; + CallbackEndpointAddPayload?: CallbackEndpointAddPayloadResolvers; + CaptchaCreateChallengePayload?: CaptchaCreateChallengePayloadResolvers; + CaptchaCreateChallengeResult?: CaptchaCreateChallengeResultResolvers; + CentAmount?: GraphQLScalarType; + CentAmountPayload?: CentAmountPayloadResolvers; + ConsumerAccount?: ConsumerAccountResolvers; + ContactAlias?: GraphQLScalarType; + Coordinates?: CoordinatesResolvers; + Country?: CountryResolvers; + CountryCode?: GraphQLScalarType; + Currency?: CurrencyResolvers; + DepositFeesInformation?: DepositFeesInformationResolvers; + DisplayCurrency?: GraphQLScalarType; + Email?: EmailResolvers; + EmailAddress?: GraphQLScalarType; + EmailRegistrationId?: GraphQLScalarType; + EndpointId?: GraphQLScalarType; + EndpointUrl?: GraphQLScalarType; + Error?: ErrorResolvers; + Feedback?: GraphQLScalarType; + FeesInformation?: FeesInformationResolvers; + Globals?: GlobalsResolvers; + GraphQLApplicationError?: GraphQlApplicationErrorResolvers; + Hex32Bytes?: GraphQLScalarType; + InitiationVia?: InitiationViaResolvers; + InitiationViaIntraLedger?: InitiationViaIntraLedgerResolvers; + InitiationViaLn?: InitiationViaLnResolvers; + InitiationViaOnChain?: InitiationViaOnChainResolvers; + IntraLedgerUpdate?: IntraLedgerUpdateResolvers; + Language?: GraphQLScalarType; + Leader?: LeaderResolvers; + Leaderboard?: LeaderboardResolvers; + LeaderboardName?: GraphQLScalarType; + LnInvoice?: LnInvoiceResolvers; + LnInvoicePayload?: LnInvoicePayloadResolvers; + LnInvoicePaymentStatusPayload?: LnInvoicePaymentStatusPayloadResolvers; + LnNoAmountInvoice?: LnNoAmountInvoiceResolvers; + LnNoAmountInvoicePayload?: LnNoAmountInvoicePayloadResolvers; + LnPaymentPreImage?: GraphQLScalarType; + LnPaymentRequest?: GraphQLScalarType; + LnPaymentSecret?: GraphQLScalarType; + LnUpdate?: LnUpdateResolvers; + MapInfo?: MapInfoResolvers; + MapMarker?: MapMarkerResolvers; + Memo?: GraphQLScalarType; + Minutes?: GraphQLScalarType; + MobileVersions?: MobileVersionsResolvers; + Mutation?: MutationResolvers; + MyUpdatesPayload?: MyUpdatesPayloadResolvers; + NotificationCategory?: GraphQLScalarType; + NotificationChannelSettings?: NotificationChannelSettingsResolvers; + NotificationSettings?: NotificationSettingsResolvers; + OnChainAddress?: GraphQLScalarType; + OnChainAddressPayload?: OnChainAddressPayloadResolvers; + OnChainTxFee?: OnChainTxFeeResolvers; + OnChainTxHash?: GraphQLScalarType; + OnChainUpdate?: OnChainUpdateResolvers; + OnChainUsdTxFee?: OnChainUsdTxFeeResolvers; + OneDayAccountLimit?: OneDayAccountLimitResolvers; + OneTimeAuthCode?: GraphQLScalarType; + PageInfo?: PageInfoResolvers; + PaymentHash?: GraphQLScalarType; + PaymentSendPayload?: PaymentSendPayloadResolvers; + Phone?: GraphQLScalarType; + Price?: PriceResolvers; + PriceInterface?: PriceInterfaceResolvers; + PriceOfOneSatInMinorUnit?: PriceOfOneSatInMinorUnitResolvers; + PriceOfOneSettlementMinorUnitInDisplayMinorUnit?: PriceOfOneSettlementMinorUnitInDisplayMinorUnitResolvers; + PriceOfOneUsdCentInMinorUnit?: PriceOfOneUsdCentInMinorUnitResolvers; + PricePayload?: PricePayloadResolvers; + PricePoint?: PricePointResolvers; + PublicWallet?: PublicWalletResolvers; + Query?: QueryResolvers; + Quiz?: QuizResolvers; + QuizCompletedPayload?: QuizCompletedPayloadResolvers; + QuizQuestion?: QuizQuestionResolvers; + RealtimePrice?: RealtimePriceResolvers; + RealtimePricePayload?: RealtimePricePayloadResolvers; + SafeInt?: GraphQLScalarType; + SatAmount?: GraphQLScalarType; + SatAmountPayload?: SatAmountPayloadResolvers; + Seconds?: GraphQLScalarType; + SettlementVia?: SettlementViaResolvers; + SettlementViaIntraLedger?: SettlementViaIntraLedgerResolvers; + SettlementViaLn?: SettlementViaLnResolvers; + SettlementViaOnChain?: SettlementViaOnChainResolvers; + SignedAmount?: GraphQLScalarType; + SignedDisplayMajorAmount?: GraphQLScalarType; + Subscription?: SubscriptionResolvers; + SuccessPayload?: SuccessPayloadResolvers; + Timestamp?: GraphQLScalarType; + TotpCode?: GraphQLScalarType; + TotpRegistrationId?: GraphQLScalarType; + TotpSecret?: GraphQLScalarType; + Transaction?: TransactionResolvers; + TransactionConnection?: TransactionConnectionResolvers; + TransactionEdge?: TransactionEdgeResolvers; + UpgradePayload?: UpgradePayloadResolvers; + UsdWallet?: UsdWalletResolvers; + User?: UserResolvers; + UserContact?: UserContactResolvers; + UserContactUpdateAliasPayload?: UserContactUpdateAliasPayloadResolvers; + UserEmailDeletePayload?: UserEmailDeletePayloadResolvers; + UserEmailRegistrationInitiatePayload?: UserEmailRegistrationInitiatePayloadResolvers; + UserEmailRegistrationValidatePayload?: UserEmailRegistrationValidatePayloadResolvers; + UserPhoneDeletePayload?: UserPhoneDeletePayloadResolvers; + UserPhoneRegistrationValidatePayload?: UserPhoneRegistrationValidatePayloadResolvers; + UserQuizQuestion?: UserQuizQuestionResolvers; + UserQuizQuestionUpdateCompletedPayload?: UserQuizQuestionUpdateCompletedPayloadResolvers; + UserTotpDeletePayload?: UserTotpDeletePayloadResolvers; + UserTotpRegistrationInitiatePayload?: UserTotpRegistrationInitiatePayloadResolvers; + UserTotpRegistrationValidatePayload?: UserTotpRegistrationValidatePayloadResolvers; + UserUpdate?: UserUpdateResolvers; + UserUpdateLanguagePayload?: UserUpdateLanguagePayloadResolvers; + UserUpdateUsernamePayload?: UserUpdateUsernamePayloadResolvers; + Username?: GraphQLScalarType; + Wallet?: WalletResolvers; + WalletId?: GraphQLScalarType; + WelcomeProfile?: WelcomeProfileResolvers; +}; + +export type DirectiveResolvers = { + defer?: DeferDirectiveResolver; +}; diff --git a/apps/dashboard/app/graphql/index.ts b/apps/dashboard/app/graphql/index.ts new file mode 100644 index 0000000000..75f29da76b --- /dev/null +++ b/apps/dashboard/app/graphql/index.ts @@ -0,0 +1,26 @@ +import { ApolloClient, HttpLink, InMemoryCache } from "@apollo/client" +import { registerApolloClient } from "@apollo/experimental-nextjs-app-support/rsc" + +import { loadDevMessages, loadErrorMessages } from "@apollo/client/dev" + +import { coreUrl } from "./config" + +export const apollo = (token: string) => + registerApolloClient(() => { + return new ApolloClient({ + cache: new InMemoryCache(), + link: new HttpLink({ + headers: { + ["Oauth2-Token"]: token, + }, + uri: coreUrl, + // you can disable result caching here if you want to + // (this does not work if you are rendering your page with `export const dynamic = "force-static"`) + fetchOptions: { cache: "no-store" }, + }), + }) + }) + +// TODO: Adds messages only in a dev environment +loadDevMessages() +loadErrorMessages() diff --git a/apps/dashboard/app/layout.tsx b/apps/dashboard/app/layout.tsx new file mode 100644 index 0000000000..ae84562123 --- /dev/null +++ b/apps/dashboard/app/layout.tsx @@ -0,0 +1,22 @@ +import './globals.css' +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata: Metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} diff --git a/apps/dashboard/app/page.tsx b/apps/dashboard/app/page.tsx new file mode 100644 index 0000000000..32ba6559f8 --- /dev/null +++ b/apps/dashboard/app/page.tsx @@ -0,0 +1,56 @@ +import { NextRequest } from "next/server" +import { getServerSession } from "next-auth/next" +import { authOptions } from "./api/auth/[...nextauth]/route" +import { gql } from "@apollo/client" +import { apollo } from "./graphql" +import { MeDocument, MeQuery } from "./graphql/generated" + +gql` + query me { + me { + defaultAccount { + id + level + } + } + } +` + +export default async function Home(req: NextRequest) { + const session = await getServerSession(authOptions) + console.log("sessionHome", session) + const isAuthed = session?.sub ?? false + + const token = session?.accessToken + + const client = apollo(token).getClient() + + let level: string | undefined = "undefined" + + try { + const data = await client.query({ + query: MeDocument, + }) + level = data.data.me?.defaultAccount?.level + } catch (e) { + console.log("error", e) + } + + return ( +
+ {isAuthed && ( + <> +

logged in

+

UserId: {session.sub}

+

Level: {level}

+ + )} + {!isAuthed && ( + <> +

not logged in

+ Sign in + + )} +
+ ) +} diff --git a/apps/dashboard/bun.lockb b/apps/dashboard/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..8818368af3ff6c8adacc3b22206be10a75a22191 GIT binary patch literal 302628 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 z zynnd-@1#`2?aqUD*Wk0_xSshs&!zL5`_J`ql2D#tY@Bau?Pt)y(GN^xUvWF%6`)vghoPX9HK=&MrbUQ5~&eh6Y-)mZw6kJG?nbn!i((B7CHw?NmHrci!w?j zrS^+Oo|N)S@S=E@;YI0BO7$x;YJXLVV>Mn>zgE=$NvU0usMl2TzX31OjiR2E>}?i# zO{MY_yvW`*ylCC*!i$ooQoGcQQc0=Ze!R%f0a2cr5`RdvBPH&z&?7>RLMdq~wL6wk zDkQL&Rg~->2Qp!xJiKS>qO7`lBJSn}c zFY=@mXG2lmNR*S(+r~nhh;mZ0*G!aKi*izWYa{ZSO7?9$&@E8fw>zQur`jcSH)W7CmEzim za%z8Av^yg7sL*3jiu1V0pMX*#CBLUd`57qLxdOmRdP8YFMu_@ID5XCs*^LtQe^RQCMm^nEjD?c@1kqkosoexo zPD<^jK&gDH&}pKcl*V@^l;WNXrG2vuO6`|JDUs6Kl_F0{*A7ZW9q@z3#f36LiR&fuq}1LMO69&#^6L*Jt{;@*35C*qO{~cG zhf*RXJ`PI!NGMf}!4KlbQsy_M^J2OvCnbL~Mf*f3^=GaqpD%Qws9yvnKP#Z*cdf{8 z67`#fCPOKaQa^S=$UaS^)J|M7^d`zptX4^cs}>-hfim+aiBg zQ$zMq*{;A5)523`BN1oPARiPG88h>lij+ENjLTR2Hpj6ck zKgeGvDA{*~Qe54k)V>##+Ix#~A1EbKDi0KSO{M$lXq3~u4TaJ;3==wB=m?=Bg^m(B zTId*|V}*``(t4f&rT7ws&K5csO7Sib`9(sP2wf(01(e#Y7P?N9CyD$fD8;)ON=Z}6 zZ;B`yrZC${-hLV4C;v=45fYz6WmxR zt)FR7N~C0WK9snHP-?#vN`6;B$=`ZWzd_`;LdpJaC|zHVL#h2KC?!&=zaaFgsJ{WN zh;l8e{EO24m#(NMrTHi*@}!h61f_WOMY*O@{6$et@feAE(u{QiC9b3>C#7;@ktd~m zDUsJy;>w_$?3Ra8-bA$1R5~YXi*i!xPh%+AZ6dU(sQ;6aeQVT{+KToqM0-;5YcKMD zQsP<*&Ox*zCI5~h|0kvArY@qLD-=_u>IJ3o^bi~=+3^(lKPhp2M7^d`d4MPfzrGzlZyYSRKG&hYbx!J)p$|;pPoY#Lgmyhi84r> zM`I9>{(BxRjYBzF6i9zkswyw)NooDjb7)GW^ww19f6t?(@%Zm~v@{O?J&%^g;lJn6 z(m4G0JUZjpRQ>lnS{jG{o<~d9Q_bhlG%}Q@`{@6kM@!@I-}7kczW%@G(f>V3sO_d9<`1{(BxR-Bx-cRHy5 zpHnWCWLML)_M>4%*Hx;#`^e!=bpi`FnXCRXthu96ubz%&OWKvJ*7V|_5{9)_e_c87 zW1c(vy0~n96)?mWbLaAF?^C+sQ0F@8`7Lcdwv=<)JG^)z zC1Hr|(puxBJ;Q86Q~w{`KJ}gUI3<7T`Ot{cml{;Bs#RIL>5EATm+!g1u{G^AIbrue zgB!bh)+?LavW?!&r@cB?NT~a&O+WkU1+K#o+ZD%uhG}j4vz-UIXkR~Ar@Co%TV1Uk zP9vJV>>NJS>CBdy0iRkm7}MB)rcO$gYYWVr-*2hiczUjsi617KHg?!~>sIA;8-h<& z)38h5EpXB-vvN>uxrDzG9f0W8w#DXvF2Kw6ctz`FZ$@>)dvh_{8BBW>Q z(t4opMmTBTx*A=^;BukhH!UX*ZeC{X#qV1>+%VR08+pt-`Jir}3Qp%$ z?E;!T*xn^<)0Jr>3#R-t%PVqEp(Tsoi{HJ@9|wcuekN+eF7d4t!YP^`ybaM((+Jsd&owd7tN(zHb}U`SC0#7dusaaMHL9 z-(V;gEXG0UyEjhS4KL|_?`m1H^`{<#_TL&m`tDo&nKbEKBcq zepP0`HlvUGgUfaJ@MVL`-WP8|T|Ry)`|@hqCYq~U_%^*h-*+i11W z>D|?Ngb{rQf_;|1FqFQV<)mHkYtuPB;xFE=7C5NM<`b{RgcdoIcenrfO`Fa)So)ye z_H7jwevQ79aNuIv!_^PAwQ&48HD8US?XO0kN;opPx641KFJOr6((gKO(l&Z-cjjpecn|l_9*W_+qJ1i zJ2zQ18vUbFYP|jJsor=5(0A+}53DRa`kSMd1r z_z1IFE6fvCmOc4A{;qTJz%gT!PDM=)`7!uJU(5bCZVx#(#ecYO^V^kg=p5<&yjmBJ z4sLeGjyufJ*|+}n0vMukpgm0A&2rN2G|})yI0zTC6k;X)xVvt?q7HBZvHB zgRflBZQXy+v>&TGer`kGrSU$d-<{;7Jv$+;+V;2AdY(LaYQImOKBXpozIQz!)w$`) zX$^88XkBebgIP&h1uu$B5lzhAPE3pqg(0>}-_3H;w%-`@z0rt}bG9M%VisSTGRNTP*Zy_7_0oSC zdF_+Sr@6JBR<@q$S95f!stL91ee;a?KBLR(88MA-lsmR&@bckvi__mCu-#&86skSl z{(b3buZ|q9wqF0UN6Vg9PVQef(WG>l>$Dgn=9O#z%c3C^W z9T8L9N;Dif~c`rSrO+Dn68=yr>qX*6Ja-a9^9@^3V$gZ1ra>9N?ep)`UhipIFtlY1w0dUXY{qEZVyqFa7NaC+!No zPVQ)Zwod)NQL)|b9!;BM-6D5V`HP9CPOO+Xa@vlt@E)P7Hl;Sbu;b3xA^*fL|B=6r zSK;KUt9)zpU3>V&s|jWnFvNC?vr(va(ZK`SIn2*Bqvsy#*(zThB_Jywt)(uaa+JF1ghAEG`7uEY=*-~e-;o-8OY37UX zR@g8%_t)CfuN>W3bdPC|O`Y#|ac+5|<-sk94;BPfP91e5rQ&!PV!Os{6soP=r@FP2oaiG94^q!jQ?X}PxAZ`-_N8BcwB4qy}T9o+W&LoHfHR_497c3SUoj?ZTKxO8$!9v?Gi(4BJM>{o`>(|LBN+k^Ce$1dx*R}bGm z?9k*^00Z<%WfW7V-nsxy6e@g=d>G?yFb0j{w1C(>sX{~*e$PV*L|GZ+tts4n&f(6 zx^?>@tN2aN`<&QOd*`5T#|vqz^-P{xY_lj}d+piw_?|x&jXPjkYmwH-mp9su+#FG( zp=(?d`d?N28*c?oyPq!BNY5AFqt-}Q=i#%j^_jnLpWfU`&s8m6_zgIoT)E22s1{S~ zPhTl*uNO}ka9+O35}dS>F(~7MvxArTR^&zZjc6Pq@=sMySqc+!usyH zYwrHD{q?xlo_FSrnFATn{WL0%@@I5aim7!hPTW?I3L-h%GBKIPogFmi8?kCPSA1m8 zyHp_0l(MwA%<*H%nn{f(o9lNP-utwOR%mp4I)M8D=xQITrsQUG0IeN?;8tdK2T7M}KX2Nh>Y6=Mm?zW< zF0o}FM-E9SuJk0GY{`*oISJnv<^L5(J){-@xUX|4I6%IX=q#RiGKoF6p%uNp2I)kO z(DPi#pBi!TGn0(@h{&X*LDk^NRS_(s+Niu-{=Db*sW4t~ z4mH#c3U&sGK=y>h2ACZN1KiiW1~@<~u;M?a9g1WBP7Gtyi8jc`#)u-HhTD;o7?U(w z=ZXzHZ>Sc`?M00(rV80Gm^v&+LYDhy(KXkZs!pK%Ym(oI2 zXqOUUuqu|d_>NLz-aI|6A!iJ4<`-ktz)v${$UeiEAN?;5RpYNtt%eV2!UNf;ffl8i z9SZ02f8UDyx4)nTx?iHvHA_u`yg{AJM487$iViv}mP<$Z6uj=g5stcQ$`@08%8fn~ z%X|Y$9t`w;MV(- zHFDEty+2R>{Dtm4L6HwT#yHe!4bN_0%tYNN-ri{a_ZvQEeeE)t#eb{$1}&-OGNm$e;3w5 z)}taSiE8efTG*#_Gt3X`2nIJ9p}lvgP$m{v5=xB9ahz^y!_TD zDsw5x|pdIgX)Wu zXJF5lLcNTNq4rHC(MzkO>AR=>w+cD8d~^Cv`0JX5!nae!@|}oWNeACKh+y>Cew?G8 zu6Y+7{C6#A%?IFe0NuiU*&ZW%h%)2we`k2D4!rj*r+DAxeV3+j{zOG4Z7|VHJtzi0 z^*FvIL1LjV{bQ%LzWUhBLE%tP`qw0xmI-(ta{^sKwayJ{WdiX=1{f-?FR1VeH+A^(}D9#YrzVztY*QB7fnl|GES{7+31HIQXC~zORfUZz{ zl$*?bFyS?OL2~qop^S1Rp*FoIuKt~2xYeTT({zi3-B7qnt<50OfeUuL!D7`K(zlw~ z({EEEWLKYZZ_NNMH_+unjzp~XEbFts__4(HPUs&ub!l_LCknm#l{G6gKtvn<20JHxdvH z9C9POzae{}V-c!ovQ~l@=1x$ms_#v0|JJ!lVU4PMGqQuUd-9^mo--8|jS zw;vDvt;d7pzm*wGHdW{1xZ0S}uoazPDHP|HhL+c|e}b==BbssJHC;IU`e|rFtFC8R z|9PWXcI*3l#0-GT3v{yuco1MD;TQ6hgFpK!q94L-An|fpDd2;=W`3|_>hX zB|qN^yJDt#T4AHIDC8-tcyugx<^L(h2?!-L?$Wq5u~~fjeyG#(VRTpTjvPaMfSh`9 zQ4NhiquyTLFmhE_8Q{LICBOlam7qRLMVP{7O}?OPk+CNr`C9!8Nt?xe1|1s5OE9FZ(skLHwD4yO9qkU_q2HuNj*gu z!cwL=^wHp8=-O~IY0oFxSMud^)x$f{`^>R!L#Z;6s!Y$evmN&j*2oAGx^|T&mnxee z56-+8;QK-d=yH5|CwBl_FrtJ##3^;6u^1c_J{Jn}n~}HsN6e>UYGpxVvcnP8PNhFh zH_M!aDaR3$KYZAkuWT62k^3k6Zz=$;FwlL1$Zmb#^x-^#!*+U{Eq|y3HSb=5erU<~ zDX<&s`a7x-F5f)z9l3_@+r!!ZJgNeQ7}w^4`D>~`VsV2R(F|CCD*|+}Cc_<$qJ+8% zSWV@ciT#ksl{fDdic(jx1o&}0_9^zEz6tuK4GJ6E{QL7GOZ51N1%ZQt3mz&V>E1a; zPuWkhQrJ*Yp)I{0dga4Du7 zuNSuxCvwM5m&Dr=ZLrIW?t`he&o~;!H@MyC8A|`A0jtadhS#$U@O2aae{RIPvgkuA zQvAOHy4b#2Ev;-q5+N;Jbjs)cSwxA?H9dmf9$h~F489s1LRpU(mYS`!!<0r*${0o& z$r9YB0>^^{(1jAtl$OXiTH|7VE}+Wb3~fCo_ z?t?ELzSUy&p~BMDh|~}5|2l|_8+a~ZR~72{zB9Y^#GUb3VE0Grm}S1wmoH|jYU_Sd zrN7iZ*C~X?|9mmP{gnf{V(Q8y`jU8hu(96?vgg-Y`QBdbH9C^~We|EcfU%(|@c52{ z@SU>#eGuww-uqFJv$VxFHk|MT-Dv@s+`D>x;CYEW&^?mbrY=+$U$XOKxe~9e%pz5P z7RA8~%FJ6UH?cK|$Y3nRYuIw?v4!6+HZ0V)wV|(L2*Rl&&3oh`L^37NnFZ9V0CZ2N z9pVpgL@uTlX4lZTzbW1B?!`a&(EKQmcIPeHcU(F-`ZwPH#Th0Qq|(=>6o(%4<63~TEKV1_3>OQ@H5ISzbD3~I# z;jS`&p3q&$c9`^So|KF_y+tIB>(hsW(8$S*n*;?_CQP@A6$}Mlrn^Y@8pzjYF4%pY zlfVIroBrVwSt}BcE{KC~CmbXP6>0HJwfn0UhU#0>a3m~2hR@RJlM3Pew*({C!M(GM z<`b+uiMEs8lshBcXpP?0nK_X@|%nXGA8Ah37MS{=guH^q3j{vz1>WHCjh71U zgS@`T?}|&*X4R_C(m309n6+benucfcpxe*uWiVBI`|PB%5QC9l1gQ6Q&Ibo*IUrr} z=q!(PIUxfWpNfdAY1`R zauO2w@87wB=Ng(|^d*C0AG$5P1dP<{ba=xME=Re)5)!-ba}}Ha!nPS=-W!g?8ASX* z)vGmI9+3JzhIO%9+7H^LUxW5ty>n0!2}1gR??wJwmuUSzcPaR>nYTEM@m&u#+@F1~ zzwKooyH2PQD-na$uS5@5ICQ*|i&Br3Ms>WfQU}hoB)o4)VYgTyLq86Tpj7(3oNtpI-(}BklrgLF|#AEJeI6u9w94IO*rQX>oV^WMXy7lYSXKT?UR?vKYGs;E8v@1 zh8$*PG0ijek5GNDd_FVRdv4-u~XK=Y#p-ijmbd?_cGStiU8P`0h>&+#f zP}U0scJ;vMO9n+hJ_yfD-+C}V{z-V>u_#eWioLi_P*(hpLW=n7wu24-c+t!c4STmY zu%r6FoyV|5nwDZXVG!O_DWCY-*DC_|-TFY+MX$K?gH4=pA_1EbO2zr!{-B{{c!%GJ zGb*Ma3Q6Okws4oe=$YxfKW`>;C6lIr8x&K(WB!%$R2%T|}XRi-AHPu|^+ zvDKLdinW>giN zn(DjhU6uE{$@gLD&n?s((t_O6>-SR(C7{f{t(50Itc(lg#9Z|K60HKbMnE@v>0O#r zvlpz1PY@yBaWwuMyCy1s^2YpLXO1hu)M@FT;!&aL>dqwsi$nLz5p@TM5xPB{lT#KJ zt*55RHu?#GYYcShSRDD3Kxmg<1CgvZc5LWNEPAcfZ}0=PBR97K35*al7ajvD4n9;Q z?;ooKbvG5O?p?VtH)bMuSmF(ny!i*L*97RA*O}}g@aC=-F6+}*dirg}Ygc{uQo%>d zTEq!xq-I=F`P9YIYmaSlvDhD!uDyQH!Ms@RlF8G`#MT7+!5!)Kojka|ra;%*+?Gd7 zb$2J{2LmK`_+O=GPVKE!t-T*ep-d9wj`-{|x7DZL z4;jK)Vb+fT+}AY~I6%E2j8LrD8w=29KU~i){WR09nn{l>DMq@S;4vF~xvP&6nvuMf zv-v~BStpF%as32QtXPzO56VAqMe$)*?HzrA!1bDg(U%ND&vVArr%)7gah?@Pe?F__ zKkPv`?V2ein2N)7x>b!MdI)mbe##>V{BpYNzAUdbie>bB_%90fbaigseNS5803k;V-4OOXk%mBpq#vcV!|yzs_mkK3D?XpVBU!7o=O&3Blcme*PPqod-d-eD&uA>ML&t!L>MQ1X@hx*q5vTbQ z^ez8!DM&^>4yw6*8c?ql&}|ZybnMg%#1rb02FItn;2 zAZ5dQTyL>`{5w|t**(jph)D|xM!vloBe-J!z-$n{cRvaKi{PXN6=Q)rbx{_=>oXVJ zUmGy`l0l7A5p`!l!&}U$zbj!2OfFPEbMGU&xZst#l;O&=^y*v2<39y|SO1e9Fn1q_ zuRSv&imZ(B_qngX=u+Y!TN(%8+5%lCmag+?l$j;N4+Ez7Dq~*;twNdSS%<>tFH97_ zsn#fAEziC!NG5yePr=AX+Nlop9KNNdIDLM?a7jv@tyUugxOPBSaI@U))+&K&)fi;I zhxag8AdB6nBW~r@08zPc(BZfq{J3gf#b^?;tQ~3H=JTa4uZ;c@j>*P(x{xuOJF@om zUI6#ubqxp(P+;;CrM%Frnx-Ojk4vd$Z+PQj#u5^jtV*Vv1MT)X=Fe#k_*AU3!OVV? zK~{<{GK5XV5jY(YMTO6i)~AYy?k^D7eLX`02Z#sO_MeVBDQjlRZFTpBh`I8CD3p@t zA(yS?7i`A_X2>)8hdOIUXmzxbQsOY$A4)s2EX-q3qEieVZYu~IOh5xV;p2;mj0xC&ze`|K*+C^x4QqPaz}fdt^-4nF z%QfgQTylsa)F%4{0=rIN^d*BPCxokt%S!LCthc(?7~!!5tY_xxH+>3zJhN)nxn^D_ z?TAvg_4MC*ZnTE;ehWT*uCT6s((YoA40c1bP?2y2xUcsfI6z|5kJ#m?Vcrr&bJmsA z`v&wH`rp$p-yiQB)hrQt*o~Fe{NgKK^x@`Rvgt1;DVyi8QTII6dKdq*+$^C?N*(G2 z0@wQ$jJ{;h-nP}|A5QJj>zWE2pkMoZ*gLYy2DS9vx6n1VsoD0j zx9usLN_oe`C~L*T!Vf>iOdn@wrH>+wUdP zzyUgleF)`G+##Wz8pQXzWVZgzbR@;;bJ*Y%WNjYO(Y(GNSSKa0zW&d{t&X&sP5f!r z;CI?;7zIgD$(we`Io`?_2<&=*(U%O`P|Ws{{OI0!9#5lJ^HHB(g{GNURDTfwmdbp{XDvWx!UYLD4!1V;WOYCk}2?x#kahsf@ zA(qrTlAV{_Zj>E0;iY;_?*^^Q56!VcYn@~m$IriT(ca#~~JlZ8dr(ezN=4bM0?udi_{s`!(f zBh1iEd=t+Cstd|NU)J`NU(brbeeedlQomE)%po7hO@#(`nmzH+Z%MIuvEU)%4W&|* zNV8zjmR2n7kO%4TcvX3!|JZ|o%H5WHCwP=zCMAJWp6GH2+z0po-B0*%ry^NuaPJC! z`7<6ZjJJOD4swI=s*;j-B{+5I8x3f1m~o8OHQXq>ckT9?te2HMe%AX^=l6q;mDu{O zeD%cw*Xs*(qsA2axeT}3b4sPGyGJUpiISqLwR>=q?mTf+Je5BV3S&$>s@~EUf6+Hb z7IFPk$QYfEoTGR^8pf=Fw4qsq0&x9+?s?f11{A!GpGQs4lmH{~#DuO0jGiroXc2a+ zRuUB%*Uqz3H!7k$e5eK<8Yj$?zez5YP=%{sBvoAi8A z&9=ujar?@LcysxqAm|`RE92X(_0#G5n?ZsTle*uoOIC=p=GGmlHK z7K~as05<^WW*T^@;23E2qQxLlotlI2VDqz>trwM1uJY%taFX$$dowYTZcWa|W3Mg} zmT^%A5~#e{Nyary+p4t8hu!dj+cFa$A)DxkAeX151`Aj9WGUt5tn;M zp8HdT<#Vh&{1D3(97-}S-d*YW^x`cI)CLCvu9mPJ)8|hjT%eK}$trAO-_svUa)=L&et(Bg znMe;g96GDwZA~Hh*Rkp%CJ?2IN!J9G=IDH$oY}$a;S2+{S~>b=i-4HKsR8s`eL5) z4BMt~daW5nYo&q>o$9cdzbFlx$g2Z$CDQfX=29Vb%Tc}5!niH*0R)l|rKOh$|B3a| zM?N(i*+GCC1$0gRq8lE3%;in%U(5d5^XKE=vzp&LS{iW}VXG3iJf%y_%G5tObml}A z`e%D_q^CT`5~}@7NloSQbxl7uj}14F zeGvOY_Gka_fK9s*70_F$*>-~2tO!1+1Q&gg+AVATH2m!hHn^Dc5Hu=)8v}HyI`y%n zFJVKyP&a&I*uGJRlxOvS)yu8oNmsQa%=d*NSj=C1yO*FqJEc+aJlrE{H8-_afTMh1 z66}QC{P9Wx;J#i%aDe!N&oS5gMHU+lQ%3h7ch5$NIf|KrI@m?qHJxE?6iRfos1R0i zp3NVg3PyNyhnvGXh-A8!PW6MQMFq&lCUIXNa3A8p=t~AE*S!G|)muw;ryU^M8O@K>SDcI{chLFJBsm(}@oEaP3Z#e={IaN~il z>Qa#vjpZ!sJHO#^)lUfW=DgPG2_x=Y>E_Ud7>9=!LUmEtZmd}p+b+Y%C2&H+t^7(Y z1$Ol7{I`>S8bv|C{c!@&#oQalq5WR3eDX-qg2}FArVoRo_y$w6iGByYB0_t50%g+y zbZ(cwPTQ8qn|Lw**`T^48l(pw^a1@BaDGb!x|}DNA#K=57QDP_Bdd0-YDDJN zckz@SvvknevLQ5xDR&{g1%a)_+uIQr#|MjViR#B0JVM_bVOyxfq#~MQ6af106X+Uy zWATwJ772Yph&C5lIF@oPYCO2hatz5ekKM~EE_dU^84-+EZ~TBgDY;r;iymn5sdYRA z?yzX2;bjpop}GlhlYnl~x}v`7xT4WDowu@*8?Of9`}Ka@^!HS|Rmv&Dpvel|w*#C! zveaKcIQ9`aJ|;-9sJv_S+UMGS%o{gl7DB)RxXD15g6UU(vR7E)RqYt`TYN*e(GZsu z&tWuT$eRW%`}HoKE@a!g&rLeGSN1&faqb;PLYyyGG7nl-qe z0C{zY-ipC6YnB%{AEyG{yXxzDFVJRXz%kLz(!rw416o{sdv1tZzb%Spy1qtv;~@`C z;`zJ<|NaLw`uV1ntnxcSbl)Jf^&Sn`Itw&vK)q=|S6?G8Ys99_bU)k*+d^~>(rVC7 z-Sr{^4eHBDj~eX`27V}3ufPdns^Y46lIn^~$^J~ySDg=74=onQ2qzQ2fcxXuH8wav zEfP@t)mk~KIP?v7qLq>PsM9|KK5iGi)5eCOeqPwxH;oZ5{v_2r(r*D@?2@cfq})~5 zyYSQJXi9=+mVj<%`vn5`Hv^2mWYARb;T-MY8Rr%{(J<;alnAT@?u5HjRcss>sRUX_d`zgRNH`KET`BMAaIt7h8*&GJI zO-Q-pK&PajSaP}I>A8vduse3k0^e`G?(M+=qHJ_q#x#QDWoKh%>QMU=>h%OmO3Q8B z@bbq}htj6F+b?++Q`!@^H7=ZXm<2~bd`ffy_Fkn+A}zEDMbJ>eL@yAyzpranaDYaO zj0>IAT54Gkx~{4~-g+$6&1LbzqDZ?PpAYX7PAVM2;66j3@uJ_4OfK`&DCfLvSxf~> z#RO)RcO49Pa!6hvu$v1;Uor@KdUs&Yy&8EK$L4z^iG;Su9mA?ar0V91!$yB8ZV%m3 z?8-AaRqdZ|BU7OKZ_45AW$|43FmZ@Yhg2o%H1`4k_jT_H4p4ilR@KDku7n@xq~auT z=Sbo|^Yx&qiTN>!v?=J)fBuqfmsRvHU0dUmrhtYajN9jBRdTTS$*@Z+&SDBPRWAAh zf$Pl&qc0hBaiU(hy@35u<8sqWt1Mz+x`Z^CP;_t+cNC6&UKZcO$6t?VA|VD#QO8a? z(EDPhLx~I`qiEr}69&1XWxsz3;J!XH!2!ZrCVunosqe4P&mxAi4Weq=LTQ@2czjFm zK>w#3Cp*3(N8f>osvP)(AeL729G_pz1%6aaPX7dbxz%zMpc(mIAaK3E!01Z`QJ4;z zmoPMOhX&hIBrfI-=QJil=wv;@;Q4*9GYeoJjYi@QQ+GW-9+s#GhJ~*!nm`Wgy%i~v zR8a=i(#u8S1Kig$W^jO*U~W#aF|0fZ@ki}58uMnyo})c)J_>$|PZMIFbw`_tMnIo1 z>O9e|Vz427!!%i&pw@{2?T1KfvV zpi88<r9k&&WJHh8F79`SFKYNh26k&jWVEX zsh~Iz#}giStpiIq5N*+d9FhquU=l1NSrr3gV%86JhzF0QzC>hNN>et$dT&!o&IIcj z$NSFJclB>Qz15#*K)vNaH~3n5Z=1~a+r3E@iLYym zi}|v48a7?>8ji(3#9koqIQtDoUoxmvi>{?_2!7l<8$I>lJ!%J;ha0wEcW)?bUuC_* z(UWofufz)ejhbZAJy|DGaZo>8T_vMG;Ttt=zXcvbW34%WTLp9vEv+7%e<%IkoP(UD z^>@teC^ljxaSGF@4?UlIV?`&Q7qL%3b7P`CvRFVWwMZ_h9)0R3MKrWILZ>Hy^L!1^B~OB9PI~iRNkPDjMlXKEs!tXMk$F%7j$xRb>HG71 zIO3I{-Q~&bazq6->iU)6d|ns44nj((D?z9K5@KmAF`(XBpqr}dG}x#*=aVdfPX(7U zuqV?_WF*$BCfN!as0g~AL=1`>_yDD8C^yH?pblTXr&+gf|Mh_t)j(W4Q|A5y!WF=+ z1G<7#F_zEj7M=<|qJ4KXav21XV($tm@6n}RKKeeE$MKDcXwsp&5>rR}mT2r}Rgt@5 zD|cSvQ`>GV%`*jU)!7Je>w)fCjVtu!*W`jx*`yYY6a~JSC$p5S;LwTsH?IDD_@$0X zd2G)jNLXS94u3sA54YrDY%E!M*nLhiyR^wC`$8lIa2tT`N=YS(m&D{g;F;Tv7VpP9n&3adza{cJEW+jvYo6*4q@d<4T128)k&M*I&r z7D%MT$iGU}hd3eFJl0+y@O|+IjJ{-0v<`luD;F1y+Zlz^S4j}HX5({j&WaoYv`JsF zXXN8Fp%z;OZMb?LuXfy$zPJIm`4r~Ann%=1b!k&iNf_pRfcyH+3>+Xs$Qk7%!M2}} zeUm(={_q1Z!uI<#vD&Z`Dgk1XKI9`0Dh4cxaBGsJ9T@W!{zJ|`#xb5}dR3xx@S1!5 zSi*q&tY$F!l0i&8g5q1EB3$8e>msLINJXFRB=m&DP!~bZg$&aKQrs(x?I>qw`oaF9 z)}HsK6Q-UD4^T5VzOr1G1iQimr?2M@;6Ahf-RwU}pS8%ctM{-ybCF58pIg*IA=1s@ z3f^1Qa`?yiJMr0gkf$4LuR83+=%K%LeM)DVk&t_^2>0sAzx39#emm z6ANvL?w&pZGH((Us$Tlls6B!v02I#-$^tQb4+46iF+;!sW~*>nVFG>-UneiR46>)cCu90^0+ zIOB4XHmoDl6ULMj;C29A8uNa}ulIPH8com0FQ>ior6!E`kniBH*}r$z=KTBDyhmN6 z3gz2mr>32$H?HDY2gi@yALs3P`-{+mKD2xS*xyc|D?hKxmNo;$`wh38P7A-!LOn-( zh(QC5!vLPZR&#sq2kMA#qZ>3d6ftK;$`M+izQ-N6RvD(=?=qRh{;2pgA3(ibK(~)E zYMXuy`l%a6!iCBf_h?m)-B_HSBcKE3oibIg!SF?yIuxs*n6AqPpM|=)s=<+XnsZ_> z%ID@Vy`JP>Q40XK8|d<3eJ9+ETUtF5j6F%6<{|GRtkb-#i!J;3*OB+%p_|~{T#`qj zL>KWHX%+N7>De@n(y*`hAH0Wlwpslkq))GBP~hv<19U4aP}9pyRMIYxG>R0 z=@gU91M2k)0=ezV4+d23Ic{1M#`>}o1Vkoi$xDA$hmEx+JBxNU|6%794+7TP3v_>= zjeN*MRTU9A8XMv1-?Z8rDIh-gZR@J}yyt2x?9cd4z;ebBYv7FMgV-kd?*89dnJ@~cC>fps zELOf(^KX+thtidm5@TOAb@}(VMcE6o4VFi=WT!+KB*>!mBrs$a(p4V_$pG#E(2er= zvcO?sG-Fn>WQp?e;M28pDS-)I+u1!lHLX&;t82ObAcdWrp`3xbq3l*^KGV#KJ3QSU&%5PS?c%l$34fbT>{3{!Kc-MwNo;Vb_5^#? z#d@;=15D+3@^c&C-#b-jX~`zm#R~M}|8tYTn|y)5<6#JlzGP4~cRHtZ+5a&e*^lN4MWS=k=Srwy%7F@xCk#hPXBspMmJdV^q7Y%l{$ytY2(&;A&1s~6n^ zxWhm1`r(v6R zn78opA@(GzuFkVDm0a`bzdDwVZ8Rp|g*{mm#)#kIDU4^$vg?wCm_TAc{^;9kj>U;_ zCkxycj)Bpa3>vENEFl$C&|Zij7qR_pNu@Mo&}2}nfUJbCwHRoJYVXFesG}DLneLQ5 z*}#13v-^Ew>s?yy0<<7qu)awg2F8m4?!!3H6+?&Q?|le4IkQbhFdTp;ps~Q5JB)n# z%B?y^-NGu6O!)~~Y=zw{=_9h;PB-FeG)iLsqrAu31@TI^1bh}bHNc$!x=x2Ji--wJ zr4{V85~LeAd7Q*yUqV$Ld>J27?4v!ozjoyGtgN1}sHY2gOJv9l1Z0J97yH^DP4j&O z!RWuC69l-gV-6gk$Zt~&h!Z(!e=I$I_Qt;aHcAKYU?&ZR@vT%tvIYJWOG^eCb-rLI zli#I9I)ROvFo$nUAWlmxGnc7sE{s3%`U?c^!xR{O$)MxkaRc->BD$$J{fd)J6by^l zGYVoyEJWIBHHP!N+ImKzs_BH3=|Mt09yg(L7ud8VmsLHfG$Wr%XhSLPmVoQ^X`ow* z5$5HBS~VUr7il_)Z1U{5>A}P^w{jwFV&*g5d#S| zDJs*%4>9u>Knt&HQ*gaAK)0*5ohVV*P+sM<4it!&b?D%6>U^x@RzmibZE#zR`dXBr zUp?4afD(W6z*eZNJLSoklmOA_1`73Im|OIw4!Dk*1-c2?-ff>kV^?6!0@`cUzI=B7 z6cj%j!a`=Lwix>dS9u{hjrg2y(3}u65sk%?2<;)c(*sq;FS*d9ohkkT@018o@9W+O z93We~WsUD1tqFMR-=O9A4)~~WK>NZmoc$9FRBCEcZK3|En6k)jBYjRXHzTB5MV=|s zJH0|=T6YcFf@U>01Fzo@fcr2HMqe_B)9e6a756JWr2R~oo)n37l*ih^2Z#|QbWfpy zq5ub6tN~D_?m1cZF|ARblZO4qSkf^bB@6BtD{ ztw+EM1g>`xjJ{+L8*$wTUrYKm!7VjW(C`6N#D&*UR3(C~VR<1-hW1i!E6{G3CMQPpe8w+rWk1$UrbiYr^Qr^S%1uj1~m6_E&BuP=kqmkipw zSiB=74MK?AU706+%$SCPJy(gZF@ep_tnV%RCCRRqHINV4(_X}lo&M`53r^Ty#%(l* zy(5jRgr)t&LeY>H1KfudpxeCt{yR(yswxC6_sMsmGuxi|ZtYWL4=WcYJjitJLpdh8 z*nt7p|JwoRiK;KI%s5iSPjooiEe-XGn`CE z9CH#56Zs@cuDjTm0ZKz`A7bzMVAZS`@_j;KDnn160cG5C)3y!cB~{L@pUH!lkG;+C$zeju^#BN{Mn%O{k-_Qekfe& zN$M!(w+_2?N%)mGhW9TJxDT)Y2RJ|iZN`vYC#HPpVDu$}29wI*KVPd> zSg#E=z@JK5b<4bO%8Gg5VdOqn^OEpNUC!!U^9jDwgRE!VUUJvqJZ& z+r{RTpoYF*`WyBmW6}`k$++k}?F0VtQ&5G}4_D#SUB`y^oQ8mUw}I}76B<({BIIx0 z=O%Hwae>9Ayb^KRxO`>XsOJ09;p&|Vc}KL+#J6`@d~d_8=&18T9r$<+^HFuP%_$vn zd_{rhQ9D4l#B>4II3T+nEi{+$%QCDo7i!f)zs`;cUM;UkY%TYXcZ?;_7HnEPgM;gz z6>dTkcT$P_Yc4$LlX1tY6k9sU0rl{`v1{enC;@Mob~IGg9UBcss&`9M5aN zV3gFCnnQIfIeIWGOf<}H!U#v-{nBuIcD@(c+-nP+nBD<3{ZqO3!=}nSl7~VAJYM`^c&L0~jEiCB19lU| z)!p>Cg-x$>8rXe(R)7OE%SqRF3X!;rg)h<0oqM2-RC+&s&rAaIv#2F1LZYp<*9dO) zXAjnCF4y#S$cV1JQr}~BiUC$NCb|a5dI{S21p>RTYj<#f5*^y>^}~Ev?POVUoqYpB z-jUTMEAdqlZxkIRSd8nu2ah|{`Z9pEq&tPB0 z+Gh9!JWB!Zb#><7KOZ<~0|D+4&^4Y)+`;9wq@eo;f)ViGk?kUji>Vr`7h$YQ^Jf5%ZF+j52Wk2|O_d&PBNRD~EL=GEf zMOZ4_EI68=r9^;*?-Bajl6hIPI)q}d|LWop8BH?qoa+qesxVg!^`5snmO|c>%kzon zkZBH`Dc#eg;Br!egpf@Y3t1zF{B^V5FN`m%dUvw@S>w2FGi=sjRc7;#xf0WPT{D2k z!#U9XR;I(DjQb65&-RqVqDC(vyGSFwE@IQ%T&*;=n7tyvqkaKfqM7+u*iV_- zl)Y00;}4F^gcgVG)EtIw0QUmuRx!ltc6bFkKDQ0FkkA<{OV9LF2-cX&uSql1lX(x5 z@hM6zj~yf@sc3s}o*)h_h|WLm&|_^=<+!jxE6&@#z5@W)dkJ*U;G<}=-bmKDW)NUb z5`2!TB)66+s~z`-{7NDAb-~JDI;c2iK>-xTk6l#Wdjt9BkIX%f0`_dM0QVZ`8gIG=BwtjeMZsC;eQvmIn8wP$Bg$YD&fS&!F0=Xg zAx4A5O~IyX=v~)%|1LkJ@*n4anSviadWKxcQ$(b=DFNIYplcNN39D^8kTp~DszgKY zY3{9Yv67n-{7TiyTdzgrqQ$MBx}ExWs($3tJpu!VXElU#@8;7AZdiF4pq~(*G3|J&=&TBKLF4MwnMVL37Vm#bLmZqVoI4D{J zJ%V{=&b(1h6}N0V8}ugq?k^Ddy4``%mkf&1T$G$Ok27_SrGbg9N~ET!Ac~Q^e1Q>=UWe`TDFWDzY}?UEmp^=LE0nhg(P z%6}`bG#AB9)trgGABI7=;R>|hpDv8e$M9C;0JzUU7x6R_COaYhMz=frjRbx~Q0SGC z5DJ`|0dna(BLrzA6}qAR5&N6f?Oi)*sCGKO1Rb2BeOl5g0iHUx%jtzc;5_uwkpBx% zwOrgMuJZ8XUmjO~60H}*Si`<37}z$MLS{9F+2}_WM{0P+#v9+T<*fTn2f8@gT-}q{ zcWO2TCox|{q;6x@0_ueTy0L0(B=`d?5p(f=L_>JBi@RnAI+JvWQmjmz70eZQajt2lmc8xpzFhdOXXme&X22upR?zCuBWXh zR6?&>Il0yS0o_3& z;j#_fWZwJ>&06xbNfs{`-mDT49(cEi%BH2B59yGQoyf4iq8sPG%11nKpN2PvS>?Br z4CUfRa8J0!BiH&g$BAb91gjbEo5g8_z@Cu`!IxJaf+5L zBBCST5sT@Yiq-$@P%{|})=N^>-&0;q2<}#YQ#I~OV{$I$wJPQ)ko^W6XD~q5T>mY$ zksMz8VO2&COR>}Q1)Ddzl)BQffdN4amFk`=A;VOrzk zAbnfX)e)IY3$C@rS15`*Xv`-^>nnl!hVoPlQ?jt)G$;GKsi1$u*1-KdJkT|6kChB2 zkDW-uXk{IM3&ywIOhW0`p*nPRXNRx;b$(jEfU@RqxN69&tOIp>&m#g|4u(gR0^buev0|N|e=Sv%tNo_jDAnh% z+1EFQ(WB}l{P-Uk8ssTpeh<@e-yzS`iGHH#NRCHmCJQ_<&FVmG0@RBHbmMPlSHF>V zU1D=z7a`n0)UV?fP!wmeuh~fSak}8cs+9KcoBJBoR|vhmEL6H`}Fz^0rC^Q&+k`s6MFqNhUne1Z ze!ev-{kT@F()9N~ezUzC z#$8VW9F`ofXD{G-(SUBJ%Nk1aA{$0EET<|t*^HUHq6*P=TW5m=%9~@Az8kUbH^;$} z&&#~5HaRkDzqVEH1n($92-=9>WW^CIYWUCsTy&s2Z6)n3(Qx+XJe;_cI*_XpyE$ai zWbxdhXk9*h{lmxzH~iotnIGear~y8P>+CQFX`(_{ENIbvjXQS!dwfGvfQtci3kR&~ zYt2ZI`I|q4d40F-)u_ES321Rmnme3mOjCyGX}({Cgx^h0%mRfv>dt2AdY2cC7z**b z%=}hh4#-Ugo>#vGy1#S2D)Q7k%QiM%olB2Kj8F-NeaIu|`JUPSL#L}5T|u{nQb1?{ zXIu#L#=djF0TWGKGT8g3V-@yM6pzC!#ki`p&_~1a zMY^TCrKP)Dx*G)PZs`(Gq#u9pdhfO7&o}&Vt?g#!oH={;oU`~oJzQ@fjfp9UJ78Te zXDUEoMO>#7KmO@scz;?q1iwMWZzn4rTNb65u~$Q$U`pX$z{LaIW%(R39aakXj1of$ z9t4(1`RjJ2U!1qzTpYSv8ei8jnt5srf4q$k_4iXN>*~r>MS(G{2xz7l4(#`xQ_bp+ z2V8v6eV4(0xyGiM{O8=9aLkpv3BS$y@~1;g0S^psCCxnltKsT5JWC2cG**d`UG$#o z^{WME~esLqk7zMxIhNV-G_>Su)Z@WaXDp2!Ho?tM4SowOOku zs+epKKkB3Ygm0i5_H1WT0bF9x9qm;pNpz~cTO+*;IF?HBQC@o&Nyi>hhmFS(S=@K^ zo~vvrzt6uQC-{bGfs1>el?bysbS(Tsk*{bnW;3<;8^9$2UFOF+XUi9!CbkXF4+K*W z_n&INVI7r3FPU@sVWD-SUg|mj`L&PS=ik5#8*z(~O6kvq{m?hDX2|T7v*+C$_rEpz zf8&=FbYVyrI@wZ*FDus2r3}W{74ych3=(s?2S&J=3Sb}SY0BjPX2an!M?mKME&r7H zzK0`o_>P=OMyXN~`}?uyxLirx`P9O=7;Zo}Uhzg(4&DJj0P#)#KJnh#A0<^K@{aLK`V?NsWs+4WR? z-Oew!W+Dpu)#Fv)7EVqk5&VYSd1#-mOT9MbM=&2qPGkzFxASG+soG=1*VB-YQ^I$T zD3}od*HILp>#M=1J6J+^sa| z+v%>8u)rf^pP1Uwzb_YjcAofT^1mK}|ML6acTNAlJgEJdChmWz>p`Qsk1Km(CJSnh zrdfw~n1~8M?3CQhK2Sa|kl@1Am;C9ydS?lzpFrAHL4f4-wCn0^4e__Y1|4w!_kGm= zexPH>9bOfz(;rd4HU#==;Ym5h;_{o@!0)+W&SvlrhN@zp{MM}3?SxoLpr)8h^Te!+ zLwJ-e5eUr7E4LB5Ax{TfYS6XLWV>~d+rJ1AfsTAD^OS3;@Yz~N6{42d0p?qVQrz`W zg?iXY`fk-cJFMhvmDe(nMwKN zIbbrCCVACyNmgPfGX9!akRk&aA`r8 z)+tQ5HwVd&l&xiDjf``}KCu^>d5fzLy0WJJZdqGlD*jihycoeFW{jPJDHoR)MQ7}r zq%p_R?0jj%3|UCX|#3awZBB3iQ;08-*Xs^`IMZ&+7hOHdof3@%b#u)?X zqLADX4=`ORUA198S#&_F2tj*#j#+4ot%$wVU(LtS)gC%aQc0-W+D0 z2UuS7-uA>syY%%%Q2WCY=!SRNzOJlMq&lC$`w$c8TG*b+_4Zi|a3kbf*i)sds&vz* zr3EPPb6y2{L~*C`l)0UYdC45 ztVH-FfO5Td-BN$pl=q!>hQ%j5!eA=tCOpXlrFYIDm-t0KIJXgsUg@PUNeeJg?Mvg+ z{rJD|x0*;q=7Ida1>IJM)b2IeM1;5fuFC1y!dLK8T&=3=Y;#zSP9k~eGte&LzrKnU zX)8)9x7R;9@;=IRtn2ux2*7>YXXx{ENy-FV7SQD;SKk%C&)55{iFA3_#ndJbrQ6t? z#fO7^AzFR<$EC^Ge*WOrd*V_?wSAL`&l7(}(_Z6J9HF^)bwurvgcw{$v4Za7J31v9 z6U*$^$PZa8Sf_ljQBT7)2P!5ewU$eP<0f@v?!g%Yn2wBBu&&b3iaVv(eAM5;Rr%KPTzgZYjTRYzF>GHlPt+^@X6t6Pz@b1wRtec%gnq{200$dKz{n6Rh zy@1d-8Yh`OxHFFQ6 zR=PDuM!C@OraI(nb{J_o=L!KqXXEi=ke7-JrAmYqda+c;xSCLsAox7Q4Z2$yNl6z3 zM%ApoOyTHkY^`67gKekYv#%_MJL6qqD)jJR4(sh8r1}4>DjbLQnEVl{nI*U3YdZxM zOJ@t?e?tYt%LBTk`%uKkRtxVkThnh8W}%?zeAm}4$R`<5(Kd(`>An7B<^GkI5wX)= z$QG6=m+7P!z*VV-t*RS0<9$*$Q&R%hlf0mdgyGZgwKE=)U3(E(aseHCgq=sAuA&$V4HI+usubh?fs^PhD(-BO<() zKNe2V!pf`2$S=f@V6Ch}UX8zo1a|vkH+4{Km`AyC{vx>#?9|2HOZ`_p)6B_4CPwws zTJF&X|8D%CTb6DuxCCp$k`HZBHYnaxS0V}Fa!=~hMfx4r;efY@CJmLCi+9qE`*`ZR zV@USwK8w5{omI{t!W;RP2mkpOunsN&x=kC%NJ3w}#=P!+m_0c&PSGw?PkDqObnGph zIW#9cm$Ev!x4s!(gweBgU-{{)_}Qg6mM~o8o6Xh2B;oDn{QuP?|C?`upv!9d#x@I2 zUY_SMw!CL7x-orB)%HEExYVw2bMJAUqe9g?Tg6LD2X&RF12lCLMBYXj}kn>{aFK~SrGQz0#F~UMWW2hdS2-k8iAV2on71`E> zeDTTgXVJ^0-jO~VL?)S8z4p?* z)~_g(@o;UOEroD+iwF<4a>;hu&1V_a@o#hJUt?TrcOsGzw_TegX&umfyOv1dGjSy zdl(NK52B#^ykhs`=_BVSUvsBPJf3iU@2x$dwOYkh^R8Ac42iU<9~W-1B52ok$UG?1 zRFhP+C>lHR>mygArwzN>nwR&pFG~m z)JZCv2zga86Fx7U)U9xa92=`;WTv&&$pA%tB?d)P`8C2JxO;p>l$NX6chGI;uuTu$ zl#xaL2yi7p_cq=fR|Bi_r`OMN*StKrzqRi#BUxuDW4z)rdva?s2VCr#yna7D+`Tg( zqW|#_QVj#oe&UPqr}^h6-r98r7jU0f5_Ah+EleQNU6Wqv(8Gn#N4m+-Uma|I=9VuF z49ejM;5^@*ZmMNd^kMRHG{;sft!17K|9s-9ZNiGKJc0dz9{s;PmjCiA1-f08z3e#O z196n`%CFJoqu1FKmX;HXc@OJpz6>hJg?9Aauk`TM}3E>3Wq$$)OKCN5i@#dM!SwC=Y7X%4Nfs|QLWFEbcu z*r2Z;q6Cr+e!gO{C|WtSHa~nXBWKRhL+B>KfmN{(d3|zTC0a5A;*|wmH_SZ*^X1?u z!Z+RPgBRcOE<5NT>at_@t?ulrSboPMB(&%$9eyqEt>AZ5I_b*TNYvTHZh()z)I^F! z;4(1>`h{PbxnM4W6?J?IPke!0d(Q@Zp;HIclb;r zk#@h=t9jqf8Tq_JEY9`mbc4c&t{=QP{xaeCfF#v;5yZs-yX+k>EG4atIc7eD_OjR! z?Pd(*R}plN^j+JUCafICR%)lT$Z0&~EWg*-4ntns(g=@*Ub=L!=Ieyh)}9^WjGq2p z60LMSC;I?#Dw{*q)9fR?VWpV@xJsa_r}rmn^3U>@e2v$j%W15X^QlvgyX;vR&E9P5 z#+5F0YUn?apJ+ULSX{>89Vb#$aOx7jI(n?WLds9Hy{f7GZ}0rSd7%uttQ7soHdit~?Ahe~ndS zGc!r}09OTchvDp+S1Erw9!7@ONMe>usm(zOPFR%L^*a>xkNO1UkMc9g=t&^`Vay1E z82WRmf+g^ykBqJ`vqf7pD+Z|$tiz~+ZvP(hbfn395pxGy^6lsWO_>v#G6w%2ZE0zE zg?>-JKRu`KAm{?6MMg&x)#I7ombw!b4rUMdeD`Nt~5)`6PJM^=&S6JO43h#mt z-cJLrI_SQ2$J(=qyfBcX7pq(~!=osqaT|~be;J&~QxLd7l)r~de=V`Gs(Kvq3Pfj& z8VZ__jN5TinPB3=Ki9jeG-d=`4ba73pXq}BPX3ZO#yhxzZ1^kHn#X}Fcbc`-kh9Oq zBK?^s^V8XgTXk+`qI-$(fc3^VO|8#2bs;M=4MI?*$BcG>s|mU)hSgX{UrXN$%Jy$P zGLqK%&YwO*L&^$?1&XiRK)Py#O^5R-6LfA7i!Y&k>ue5&sV(ka+%=BUk2$Q>ui5KFUP4}`<_bln!5rrQ&@(`cU7|5-~h#w>Y)7ktK1gBhA57}^O;CV3MoLfTMcnU0&1;hbNP0Y1;` zf^P2|X~i7p{+dg%=)9E;|9h<$ozFQ61977FjKsRwhMKS1__AwIo;TZ5D-PISs0<}H zA25X8uu715SZjA9(*5s@(|_|=4|Esmk}znzMP3Wm)Gtd3J)Jj^(FJgZ1o%( zHMCDAi<*{pBl<43JsJ3klk$H(%Ky2BplhJ8So$MzyLgMXS$@<$0LoGUrt8i8&gN7k)XApN@X>Jm^*Y%Je+w zX;9Nt*K<4*NgOKI7(5uYc!OV~`B3}D;$(#!YV zSY8PII9452U?_1qB52<{LRAScHJWwo-kyH%Vstqsqh{XFl!-G1xTc_sZv4DALLK07 z|LrfnBWhSUIsXxV?F~KG1LF&9J4QU*hp{9FZ#n&`DparDma6?}Bw?S;&6N)%vLsne zZt189U!)S*j!$cFP?F=IZSG-}ab@0CM0lOl5=ea>vwje_Jqf7rLkE=F&JCH+Abf9vip z(gwJepzF9w{p>SN9($;fL6c(=ze?=Lw%YF$TnITC)P}H#iPe6Z=u%CkKBO90k;Tz@ z5gllQ){yM~UETDQ=21-*fItwFbE*QlokX}M)fi6t%v zk8pT3k}E3#Qcs_O(p2^(Kex?1n_kPrgfI)nIjYbtIo1uDthJgDk%LLpnWk)Miw zZ0w|K31$jpA0cU>{I>!+i0dJGYKb9&u%4PpJ4lyO%8c`oG zN6Q{*<&%F)k}}jmh$&x;8L#9|IQ!jJ?hCdxm3dk&;M#(2Tht?+|EkYTqW+?Zq|pbq zv{s%ao3h>>nxyWa6Ef5`BsD|@Dc6mq>AB$<6}mvK*V7bAy|Sv+EpwBqg)Sa1z_kNi zvNFnj6>b^7*G$Y};iBKR!Q`)9=1PdAv#`)#v}y*H^SJGuC6StM(svOu3DBJ1oo5w& zCLPw!xgmJQ>y~>T3%Kt=*8z%EFhluSm08ICY{9F2u}z)Wz2czVi`R?cmNk~{mT&%* z^55YAg>#XY%1)tEDza5&{Vr7Vk|7_FbK93Auuf|ax@8|1PyF7mU5t-n;D2qg``AmX z`L_U(Ob4Gb&*X-EWZGXjTwWi4r2t2+aAEG_=N&)4mlv#C;f~@C_kL?MRXHGD2hgQz zXx2DKhJISbF5}CNQ#&{0X+7W8w{G8?V6Zh!3~rbEy~h1Zj_$#5dxv6uN>(A|BmY}7 z-SN`do9&ALa)%(mbp+kz9t&T{;!A|I-WS%*WY1D_#SmfC#Y%*d>k=M@do45(jT>#} zI6*a@Kn#-<_cn+J=cUG6>;(+F#yIw4b_Z?1bpl~G=BS)?#N_Jf^tU<9H7aGgPSGPdO< zNoNg)fZr(Zn@$R=dN0gMk}jccEeB(gAY2v=6%W>t-joEx<3gLqW|OB}feMD@*Sn8J zO&K{F)bdB*y4nSFf6Uo8Qgdy$D`leX<@|{#5xryM_@XG1<-v-g-@o?* z^)s`&b{0j?3@7QI)8f0QQg&s^OjN?u5k*PIKUPC#b{(3)4M*K)a8y>7vuP{7&fuQh zq)**`WC2`v&`t7{S*^iF^66}tml=hThd=y)Yk!ZDp7>!!&K4REvMHC2wp)OZfhSr~ zqT?+rVNJyaLCJ0w%Jh?Bd7jCeAyL5f0Nt@tCowIBx9+HfkaS0|1|1tzoA8)|^cBX+ zFt=Y!z1%6dYa^3GUmD}Y*7*42e1y)-VC?-NVI7N1QSpkFh};3!6Lhg4jAGj;7 z-{S(V7wFE@KU-_)f;qa_88B9F^AKY^P6pb_%%LP=)pl8A1>P6z4|3& z@Lq6+mnpW=z3)x&opuFJg)O|pKuNbvX>b>eBbuBv2~6d8AYLEPJ(-y^!!w`_gy_< z;Qp~M=$_9vPGO7ur7Y!&->)iPmNprqFPt~(qc}CBxBZy+=lvok@sI(=yTK=!w2Lkm zVU>>R{v}r}A%+8r@yjx%nE#y-`EQ--2fED$4m3^!?!4Jh6m|}QZa&`i6iCoVt7xvd zo64(e4uRjoB^K&!-{n_tKRAYeRFi9GziGtv)JhfmYt7>7JOKx|{-8UXHZ*laiee#4 z9Z0Lxq`E8w7yHAj@!Qd#wZ`Uob|_2~gtgg6uVM1lcn@WW62eH?XQYrfT8gzV=j2&; z|GEMIHvn{ds}iIUE$I~DORGbwX^ja-Cu!^nOEWQe=w-t$!p>4vUYAGViaETmUz&a5 zD%!TMMb`(57RRjFx~Na1XkGu;qx@eU0zr40q2%ziyN(Idko>u9@oTK{0PbH2hA{1i)p#0*gBbrq1mSe)S6J&&_9ms~6dH8LrwvXMOnZa{ z4f7DN{`(npeI2Bzdg|(&Kh)e=HniEWI>xbc?UE2faI{lm?2%WFa^}_b2qQkq3`)v# z%m@Ejfy|P==ax(G5O@udW9%rn2jUF|T{H^Sbu7`1pgFPa6xJs${=^@%1`3|5s=^to&@rcQMx8LB|%}*`?nKB$LSGsxbc! zTR0?*t)OCa;R;U6P%9;L%++065nUX$xNhwb!)nH3$J@Z?tZ>l%t?!*KO{-XB#Mqze zs4*`z!zJVh?N78`*+=dGGroDJm-||3RiWATwvt}Y3lHxTN0aB@FDJHE#*uv-MlQY$ zK)ey4TXiR#Cp4K$$2$G z_G`a-%xcx~#_}ZgA!@R)Ucik6-FL;D_dINv`GQuPpMnuy=Ic@m7qx4$)rF2!SiIIP zWVqjPrnfXd;laID>A!t9=#`#PbtGf@Qy`XaBqP)Hw%)+DYE-!h?lNmM@LPkzJ%X}7{Ug#! z21;z2Kad7?)v4Dw(Pie3HNiL65%Z|?=K_AuVt*)v+5KX~(=dl!PXFi#1u;RSAbCN+ zjRRdhS6_NAqBJ~@)$k9V5%f3S8(QoCPTwq^a@<(_L`(>H*F}Ev!@$B zZ_Qtz!wIM*5d7WiVqjYZ+<4H1bb8G)W9i$bm-h-$XhE;N4zhdvDnDSDYa1)5*gk0R zhbB!mBN{U+yB5-&`jmX4=P)>fI;#3*EL-OjV!zxcz)b+%1J2LdE^o}%5)<-WxpGM0 z>FVm!(+g!?f4$NB!jD>{)?RDP$43y=a^Isek-vwcXFhX+()HVZa3KWKoi8b;9B>ms zH_iqHQ@dmQrbF5I4w0**i#}wHj((%r-BqwhkZt_afVMSE?jY??bgqeLhF=ly+2pc`CJ!(bO`JViz>imT^G6}3q|0~wT;E|HK-^zU>~Jq0$; zt%w!tn_dT;g)0m zBjl(2mHwAa5mPpYc{XMp=$s8*_YOl*j+NI7N!eDo;*$KCyL=YUST11_tx<5_KLvE( zP($aY%L$vT_?$`SyJ>Aej~MGLigd0DC^@3fp>gaf9&5|ie5D|{I{)K6Q^MH+i*&)c zY0R<0@xfo|iAQ}4h&L5@42fL} zyKPZmNmd{AO(3r3!TII)CO~b3DH&+54Ajwh0`3>kbq!MYlkahB#eLT-vhcp?4MYQW zPwUr>EG!iMz9)_8?Zsky$`*vApvZ=mc@jg)&r7wQ=#3{F)5}v*v4tGxVBbm_=+@`+ zU-*;{tJJQ$^Bx}Ez`+vEHY80*|F}x2w|XLH>Ar51fc%b88-Ws_EFQ^Xm0B^);5N0#X_(h z@Oh}|rbU=|C~4d3$8K6|BOleZ6q?cVSUf#z*VQ!*$t2y2E>~Uy1_TX4OOjq9^WqOn06n~hwKf6f?O84 zHW;$X(vNl!dO!U6Fwf)1&{1exvLjv17odzQM=$qsSvjF+*abaX1g>{-KsWLEgx?j$ zWr8Q*w$su@$lv+Tz)mJH0$J^c(lC-}fg@2`M7>vLavUR-P0p_hDIxA*#K;Bf#(I-c zZwxI1Nx*gASJ0*F`BlLWt1N^{YZED!^Z8z_5BX;#tCvF6N98>#La90gGS{Oz(&30( z134aJ%nq)TlZvTMD_-vfaSMR#R0E+}88nn$! z`x^ldszth4u^8!9ZM^+LGZXgg4S3%y09{CDG=|LrQ=i^yn?uoqOKO>Ym+@$lj@$HH%OSprxv$FX zBaq)x(2ZK1SB6!6=40+7g_Wme>9gjnQoY)@HSC=VGxf|~QCS`E+Y3}A9J{9JDtml- z2j7*B!YPQRQqLb&c!47q0*m@5Hf%@SCzf+3Bs|e8!O_|dc9TX8?2d^xl)WGXj+mJgPPysSon{C zTLHSbC(w(PhICOxfJmSrQ1R++a~l1>#Hd+HXv9VQ;iNCAht>$dC!YOU-sM))i`10&X?v zUXpQhQ9drMqBxEBY})#V8uS{NJ7I(}*3^y;cwtWlVE8a<{)Xm)Zbwk;8UCXZd!xN) z7!_`?yx4d7?Ah6j0k}1w>s!@ZUCo4_iVX)D6u1Isvwvhg_M);dQoNm)DT%-~%)U7I z#yl@+oI_lWwk6w7lF;dF)6W*xn<8JU&vtWS0B~zT7w@PAx)P?!zdf=T##MSW5XG1cA)OkPr8z-P2AsP~E>-z`m6_&_$gR zE?f4UK-mwa-=*bCp>z*3UAHbzSUyX&A9XMuGMN%Stq^~(7Dy2|rIfZg^@wR{n>?d7 zMKQaT;Q3bODFDP<54voxwU5jaWm7**(7d|xL=ru(Wu6iT-DrX`uayr`E{-_S<*&sG zYOWG=-^A=5}KJt|;uu@D^qKL{v5J`;-nex zqx1c_Kc-y_OnUoBYT?QsRbVi)vJnM~vTL*0#KW=U)9mc3Era#cHqea~%EG-3XB8%y zr$nGv`3(CxiAtE-(N}!PaL$q!y7~IM+=IGEoBX~tb{+G?A+3iZZ5ww2`$~xoLXPVK zuc{-E-*(VNVinwJLLd`YT}FOHZ=Bp)4xT)=l(1+P`t?A0=3vM%t4fSjzC~h$BJ4J# zUlsStGT?rKmuzX}TWM1e^$a@%xE-KdVk@+02ybNF+U8t}LmojSFD(|Mqy6no?6#G> z-8<3VjE4F-F?q;Cm${2gNaFVELiE{fCt^`7{xvE&F0SYs!0iOx<5vD(bIT!AaHMDK zsq^fDpVYa(k|IVByiE8%s^+@9eOD{DOQ0zB3DdojKU&u6(cLQNKQ(S&>2X?-kBH(Pm-I4)FA5MSOc$Sx-w& z(1Uuu+}~D}qyOf)dc^Ywt(^k#c7yHkOBsoCt~9HczG$tTJ-p>C-A-8#|;Yhu_3GHGdlyA*Kz_JHp0NFNO&-jJGSHTvgL z^JH9f{CWv9h})nI15u>8faa)=^i!ZDy(Jvj|80}xp9@lj@Cp$Ep zkc?)jSb0)1^IsZLg?rf4wHWu1P1#P_g#pHmRLk z(l+*DG1oy-twlLvHs#SOr%0{hGd zKz9?%hr5#6;^xg;SpEZq#r1iSj8kaH6U_=e5iOa$OQ93=UTq%Yb%HR`G6PW+9nRx@ zN}O>wk_jlQe{E0Do!~qk1YJl9@%9|#X~Twyh+gjU-|-wX?`^xLHIK|`C8B6?mvuRX zTT6|<^W&t6TXlX{J$ZPbqx>dG@4oW6g*87mk9r2k?-1y2gme2zot@6Xz8o0RYRpo7 zl#?6#qi$Rod@lKNtD;fzG2F{LGN`|?KBjb!??=Mp=%J)z#MlRATcvb+*Fzbwzi$|H zXFqeOUzbsNC6!H_4dNN42(cR#_o|_>K3C{FP8TSWV^~Bt7Y@sy;m%u94&^&$))ckG zuvgF?IQQrVM8z5m1M!Z4?$bdOlagM|)Ib)tURlpI%5>g9Tl6U*Or-YZmtYYwf!>n1?k(Vsfo}SD zC;>i#LNe^XX?T)vc4NX6G4;tYliO^OY|)0J$03%0I{~_S+jdXluo{%iG>krd6R#76s1MqH z8jn?=6n7CNUM`R{cvy>dFJOnFRbNl9cGj`eLd7la<;?^od zvks4L&qRW@O;WRp&WAdE??ya67(*#=KkGZ__S)|MhSmOlPxq!Oib5L0d2)FZaS34{ zqxJGpf3j21KD!m)?u#{A!lCu&VDpRx6Q6g&%c*MtMs^$v%8n20;Cp(fL6=WquwwjI zY|7Y2T2F!aulbo@4Hw`e4q42K!Iuq^{i)IZg|DUIJ)yO} z+eJ!__#Vu|4CspeVp7-t)mw)PV594J`kq@5I)f16_@WZ5(nMSmX4Gye`rBD&$yT-E$UnIhMNvR_v&k z*zlrtbf>>pbDiVq5kwz8;g)}dTxF>)H^MPj(=+bofe2T?-$&?)z{WiJ-I39&{NbY% z_HJ5I8xZdt=t^)~_AQLI#tN}T1eVeK&6lVOQVuDDY;3eVPI4j?58KN+kkXUI-Ju)e z7Wn&ZKtH3JbRzuz3)E=>38ASJav|W(gKk}c>Cz#o7~x;JF;)o|NiIRt9qwZt9GUk^ zHM3j)PQ!W3=&xbfee0ZEy4U{tylR=+6W$J)KIL>F{^9w`br76y3!tklOh8pmAU(hH zD<*Q_Q;cI|PsiSS|6X>?)VP_u=Z0EQpH18mta70$KO7S2H1cYGwJCnI&aW%)@$eH} zPwvZrco#ue{0h5ys}^VGEe;&i6?ucjhN-!OMj3q6%3$y*Ti?~jdPyH7)a{4T_3wnJ zVb2sJG=W$*)2q|hEXZa^bqj`sfV%{`m+xl1J(UK`SJ=5_J;{aX8OqVaZVafIW43}w zdJPrVP8aPRAFeHhSD4AMw9@l%f3a&JUn~5i!QOzEy8VF%UeA_6*IiZ#e&cvTwWy9B zKi#}DrZnu$D^~ImLLV)Dih4a!hE3>oY#wscTo?l@p~iw^$K=lrsDwa7I=z=;kd8_$$8J+)o>)z4#cT0OS2|ObX*jl?lylbG#AKhW3w3k55iwWnT(ZUob8%o`=|aGi*T@v`dXHya51@3I3gOg^U72SGST z5*ZB5nA}VXheTs`WmpC00qzFq8lW!@7#i1T-3E?g(=h1Hgs|qFoA5e4f3L%KRP$#{ zb$9)AohB+m_%V(}UqZ1YATkAdOou%*RqNC3Nuv$EDBx~_Zm#(At?Kw+{382+ZoS#x zXE(KlQRDhwe_AQHNgmEN>&!=w{StA@xOPb z{o|M0F2vw?TIzA9_mSC|Qbida{8b%9KU;@>oE2x;}9AffAC2x#R=irJ0yMgq1JAQPI0-b(+sv{ z8AksU^@tS8+)U8Kz|a7~@lvn$1#eBnsI&mPy27UooNxP}3j<5V(5@R7dWGX;Nmy1e znS!qR=krCP&FwKazddt-Pu{n{g0&hNr#GB3IT;*Q8maeqM}oM>yv)@T3crZS!29M; z&`r^#q7fKk^?YPq4;q0bL#!@3si-4kzR)mTg7wV399UHP!ohlHS_loNr+ijgEbva? zOB5x+*OW=Y&BidfE3m$P0J`7W9OjB~7$IeTL;U66(PI{`_UwnS&tOoxgJE^%_(lo; zedOUCWd?`7g4T8hE`G*A*1JA`+NM$+cnr}t5kl~Kb_lv`SE!m6T+yTNN#c7<2q>gb zKBHwoEKq->b%iyQB0fjKshEr(O%Ek-{&x)HhnGb6IHdfjD@N$Y;Y&FcBDpI{U_2aw zZW2of-hG(^PGk%O)J=?Xl_mxE{XDiv`fL+2fk#ob9RAFbiTQ{5AF1SIY+Zu6ZTp5a zxK-=rM+QrrzS^(S=&{fj!I%#@gqp@jU6<^F_EkrAT zWm6VjoDZoG=Bdl#F6N#1eDc_HR-@_A4K+1wTW-hx#$ud#!s~meOq_{MF}Oc;3c7tb zd%tt!u)AI+6ProQ@qe&j8JGJ!OgZb|u5{IUvon55YE~@6j(*;7|LuEBsFql*vd&Z!s7>im;=hp9N)*9J zg(~jHeo~z>s8S@-{i;yP&wx9SA==>9w~`O`iJgOPd4w?i^S4hT?-Og~_gX*M>2u6% zW$oO~-^@<^AwP^Eb$PEyi4Hn&v_x#*m!3JI)`?FD3;rFe)Hibz6Sur9C!f$qu5-wr(j+C1! z{jamKcbcnQmTzolrSUOUB}O&5U?TWJ&wa1~_X>11O9%HT;D(Pyzm~^GV;m1?=a&AH7| z(HV`p+#)A9fO`$Pj1QiNKTdVcrRdZG8{R5(?BQ?9RFRo#;xS-NJLsg3R2;YQa4RpF z{Hti7HfJeWH9Ne0RG&3}9m@g!8wZ9R_*4s6>#8s+`hJ-WyEVB1gvkP9WY}(2crr9270U zcu?hAM2yOzcKV_uJqN{2GEx;?a5a-6V@=YD3v2t12+qwOfAm9NR-@}#R@hYKd(HEC zQ`F(=LT14I4Z4VkDJbDbf#HNRBl2 z8*i*$bUo`Rdv|X{Sjf?@>Om(|X)0c`!uF9F5RFhx*C(XE1 z51${1_b=%7%UV16vfM1BnHA6p8-MK{g`Tc5_KO$a#9@~#7m~>?aV){jzB>(vtfBuG6GYPQgmoWUUWsII=RMifcpTt4CIZ(6bxBtgU)?U zP9dg$Uy=2<(c&YndeQwL5k006ueYC;5l;ic*Y8)7hfEo-6L;2Pii#+pT-@tFL|WQ_ z_1{O(9Y`{8O=(Dg%b+el7sQmPacadx4cJ*$(hFx%ZWpde6mj}SD4)qCvnOx8*T8{< z?T)@#Ah4G5jVDp)?{>On3Verwho#Gw6EINv#;7v~6u$CwAc& zze%0zy?B5gWO&4Z!4 zp;u{@3{Tvv)FOTe9umC%zJe~vx={I?Mft2ROVMpaHM1^1j5D8rKfz2z>0$`_FBf-b z&2E3VgN7-g&XHq&DiZuV>+c~yX-2vk8V`Dp@Y30Vcp;$v{qq0+K*O^Bo|Yd84neL% z45Y<#_-nv4+F^BuG9q?tRh?|Jg+XoEW(3E199vbDmT?}utBH{yur`Vw!~+4tbW)|;Kse|1<_VlrrR zhlO<)zm?V2h=MetK1y2hPzU#Up+NW0grPX7&$fz;2D7JVrrq_X-q)rnzo`_;_|wUy z55@-ksgrV4fHyt-d2^z-RoCXi$MX{6cNL8Ve`xZuPP?7{{lEWvzIX$=jBsYi7LF?d zPQ5traggn4LOcZK>IlwiiT9K}V!z5hOqeAew7k(}%F4(n_yt6DBn!>hmNUjQ!_K zeDFLk9Oz=`_f(U4VyCP``)>N>^7uAqI`5<{eIDZtI@QBtDa>ch9PnhCZ^2# zQ(MCQ5~96EHS$pNAxMs#jIRWU7anxa?_1Mc#qbt#d5c@Ak8^*nUKJapUG_WXS$MoD zZn7_VmpaF{gp#Y9@b^x^fnMvFeN9Lyi}ZPC0^1OU*mLAF;39zTUet#ybk?sfsJ-}n zO|FNDkJ~X%M6N0D^-OQMRnuK^Y!^!N$AY(iB%qzP!JqY3{>&QdZIeP5^-J#Ba-&I3=+<>za+Dw-NKi781tcRuK?DRPXHaqm z$;kkM3J6FJib&2$MMOa)ih=|YM3jtz0s;~gCEc(8)&E(2&ONv8u2cKeUVGJ?#Zx`{ zW%N5ozq7mNH+oKVJs^&8sF}Dl(PEPJ&8f3g-R;XGc1M<3HX`pyV0@{tzJj|>f~Fy_ zS;i{degxgio)gJFrDd;wi_9WS8ee3)kLb~-#-*jXwid$a&l&Dx7kLj3SEdKdW;yHD zbldZ1&S39PQe%Cu;8Bf>hu!?_+;JlFkYv1YlAvBs&7H7|%!frhlT`#=N*c`>%T@2G ztFIetTAiAyb8`+qw-)(K@3|E(+pyLz?B_T%Sl^Y}TAt{SD$R+x)E^9lRPwhC8&d16 z{lradUhS2~emmRBDfw7Ezdh~wx=DFdIXA_z5l!X;r@HTNQY?<%qBqsT<0h7!7a!-{IhGPZ{Jb_w7BLZdoiNPtCg2_3ZJh&bC5> zZ|az5S7cY}9hI}5JlC%?0Nos!Kw^rlu(<5MNg4MD*HdDr`jOJm>pRWeema>#9X zij3w`M(@(8Us$&xY0o_wff+9o)|ZJ?&oZavI@sEUj^A|@clj4ekl5ra=4df;axAD2GhP;~@7mFElR;X0{)hJsODp}#DO{svwByu>#y8g* zdq)MU{(SPMYaW{=XVSiNTAk(9;{x#pT8+Y_^|2hqmPp_0!j2eUR;;hzmy*)oUcN_E zPF4QtcY}XYY-E?nldYsq>fDM!>W01Ln9Yx$KZCiX?h=o?2Fc#*oDoz!#*Vi;Ng^Zf zdwgt_2;<9!^$qrUtQ$Q)@@V!p@1Icr)7-}>bDzi_8RwcLF5V1r9sMFF2>;#lcszc4 zpd#JX0=H*(+uvsG@7ow*I$=S-&7I1D@jZm~6{2|?RLNCNklmn4rv1S4w#KL9cl6^Ebl zIv1LUUDQbJ;fi5@%ufyfIsl=`c<%L%j;ALvW*mM%6f7{z{bcyR*dCLe`xU( z^{bq$qrVtMGWP9K5ShQLs_2te@bA8Tm8JQ6D@mAF|2HXj!Ivyi*3@iUQcM_MPOR@n z>AOgh{Gmaiui-^+=-I9wOAwHL>e^se|GQ@8J;l!E4cb@DRJA$vjM5Cvt4R|HHw5%1 zNEHofe!VtbT1=e8-sj@N`nt?~YM0Bh@oG{m3$M9<)8@oQ@=u#07Gv48KFcj~i>v(A zeZ9t;+7);m3@TGA;%x_5_Y^)nN!fI#{m}cJczqKyUT&;!{ypyg^yK`bn?m`S-UWOX zr9M_Zx#drU)lQAlkW1&;oa51Eko@AoQ$9=mLXF#`nKxC!q5ag7wmPv(qV=2`ImVX< z>)U7FWHGcgPRpRL(Im5M=H_xD?c4S**&GGV@&^@H1k~i43+o-Pm+lXiB^eWRGn=4w@&d=uC4!y{XNHX5H_Vn3R3a4NURRaWA}0h^)PQo@Y#o30|Goyn7i zUBh3(dWt=pbAPfDl8R^^t;WuW__4l%T;XS$kC@s>9F=E3@Vi=w!b({_uiN_8bJDH} zp}os`TO^8sd*p${U0~C-GVN0393Ggw4ES5Y(zw2C<^sUP~#rDMh`g!O$=fAMFMlKEDRWa>(C*3jXsT&{}Aj|E?n z^v_<^Ol`Nn8|v*cVw&yH=_wWUQCMDL{=O$m3K6qS<9AnWK?B!SjIS`(_w)-hryVgu zx*H842PG`GZy){a$x2lzIv|kU*M6cUEc*(ROXUHN`$A6CwFmt#2JoDGxpu(%)uz^d zfu)QmS`^s2S_JF6w|6|lDCr10Z@ch{A0EDT($8bO;lp0pobhk=Jx?lm8kRVn^0Pwk zxm(g}+1XJezJmSx>PRs_P!Nz<&Qs6zh9Bx)0y5*+Ato&6TSxI!nBJTUIyv zeFZr+ioFQw_G^6LWVAlKY-*I_(jv8Q$J;Tz{d?5#$z;m!Gvc3?b1LNhF*zK?`aY>( zz4np7dga)|@&52jnzs4h2NsAf*VFoMsVP3}-sxWc>f8Rs^k|7t7>A^vG_l;sC;19X z!77ph$!DE(Vs|SszG7J4>e6!;_djq5*6i437?wF|e531WmD@_S&wwL;n#takedeAzZr^^}*yKKr^=)sR{MvP3 z&1QdAL&n!KUGm?qgCfr`zQ?e>MRey+=z2OQ%T?x=@=4xL;`l?7)=D4YzPI|(+Pa4M zmLc(NnS1unPVISEdu0DGj#)UV78h;hzIlI}Dtu5RM-t;JiS_OMMAzB$nq)*&;(K zjW?)Hpxd_Z-d5B?ouL2XdjneRbw?WOD@OF%|IVeFXA$YUjUwxO?t91hSNo-`!#VGe zU29-tkW^Cd?%HOvrXtMgri;ltB(e7@kfiWbmSDmz>6OZ_QP|@_2J4$0t!s6E^XP2f z&WXarpHa`Gc8Ds}TkRF)l=$SweO?^p5;6^JEokTA&wq1)N}Hqbr+>a(oLvLQkq?#q z@9DbFVsenh`Vw=#50eawDwi9GOAPIDX}Y%?ocrUNIXE}ubmiJoBZt*##bKe>$9SCgv8n4 z)cl{rX$jrU`uXj4M+4-ZRDL_HC9?5spmb+rOQW`=<%@E7GH?6=r@BJz`>NCAhh5K} zlbcUAkjH*+Pyy@vajlQ;Xy$j<*rU!PHp8l%+fS*B)~lV?LfzlBzq7xWcD+zFAG z-pZi?vfrir4-g<{U&J?k}#rHx6 zS?<>JC1tU5b2j#~eRH|iHY;@JwV_NK|FSy!C;1^n`%r`@t0)x2>A#rM-ECj znKI|t{q|8|aiY>B$sn`P{J!(#(7j!rUi?ko7L2bl)>k3Z_m`!<+&q(V&Qdz(M4Gwl zriNsHN8aNk*4kfRHO|a)1Uk%;j@p%&zL6@vtraml`uoGGf{W{S=kP_6;9&3Wzc_u zvb3G}=BjKOt@z&d@dV<${%0fVa(*VS4yrDEcN4?jUq6ZU{qib4ghA)(l!V?~O@5ob z2U*Ian;}jIZ|3J%62I<9Ba6QBJ)~T{-+)H5DUNjjPm94rUxIcZZaQ7_R0xmHI_y>~Iv(=RZAs$)8yE&*GV<3Z*65zbyc)|$+ek~OM)W5Uey@!l&RMm9abBQGkiXe2O{PLxtzxd; zKtClbwD|b2mC!kTUwv8C+Sn#F6U=zEu)b%x!>UNFgo0!C4(Yb++PI07w#V0yXD**C z>(DCt9-((D-PTg_Ri)w857{Msn>`x^j}Pl?e;B;T#2`0FY_*Q9qt0M`Z^$W>L;>{!MW^U*+j+x!gStP_XUh#ATFEEjgA zBGb3i7Js_GF;uJBanBMqc-#5%g5&vdCj{$#i_63#`yw<}}#GpXtJ{x9^KW}){=W;H%P)4Cu==JO2u_vmM_zHDqP zdB^! z%R0lLNXb6MCob~oh9+L?*uek?Ge1Z6^+g2V8oU8r*tt-(vDA0UOw7BkP{JqQp0MlbgOTe*A9dSjKC;AmMOL~#iWaTY^DIl5^b4nd%u7mROl;3ZBmdey z-O!wy-cUlGWp8`m)^fUD#cAjN`_0^5-mu#;sKG7LX{v`LC zZ=G@^CBD<`Sv`|$#n%?T)F_r*wdB;BkN=leR+`o!1cm=O+QaRP{=HVvH zcnz_>nMMRjt=AUUf|6`(7O&+!y(S$i)p>mC5t(fJ8TOMq1Vw`5Z2JO! zua+sERVu#oyT_asE;2ef`DUJY~JxCucP~ znpEz}$Fdy!>9>nxIvMZWJHM)R_|>WV&={WJ*f13+Fn*v&_h4Ke<7W|{S10uto1Av? zd9s3ql5&i%Io9{$f{>>zwYAgkmmA%`CI)8S%iNAH*ij7e8Y%qo^m)o|+=klIXsU-q zRg*tupy-nqeisykD`M-RQ} za?_Ui<3%`s)lidD=+%%n)%hObM*cq6Q&B2cy}p=Sp2}(K;@&pr{)C79`%O!%@264& zsgMJw`j0%w8CJU6Dy7vVXB25DdbjhjSKr6hIqv|E5(YC*(P{p=KkURIGE?6f1(lh1 z)A+_2Xf2aRs^~G}wZi&Z$Hc~nXL^l3>2_F5n7BPmOcHI$=#=D`BYCm&{u34(ft1nI zV{X#aG-Sete5;RRXS#$~MNJFhPo#H9bvNEi!T4HZeXn?O1xOUSsk2;Hy}&TgN~-lx z^Ao=k-??!fqVcB^0~ZWyUj|HYyx!oliYPYG;h1}7kXptWc$i}6-s5E}N#+X}-}6}C zK>O!w9C=4+hccKWe`vh)UR#zt#Y$)-SDyO7#m11C?X{*ZbD5{{*Oz@hW85zTbM)>V ziFy)uewzBt8HJW8MQV)i1+1^nxBHe;et#~FR6V+MYDZ+Tuac>p*|%Xzm4w#koa^xJ z#Sc^BDav=JclQ^xo^r7=`|d=jPWX(m{73oz!q(e~hcLc2Sl`%EF~a*AR^0=xTy?tR zatRf5lpmD@=b36~mk)0!FEV9ah`Gc}mD2jyi;+M@Q*AerdF9CA*c)pE^>0=jvS-pT zzP4E3uTAb={oAc~&29vp5oY2H<{tbmtGq3q7T)Wjav*&sFGKrtKbvbr(XJm8EjiEP zb;CQ$K@-l8T@>|{ufF~%+lKMA!}`8(A>6+dnmR}S%s7H;#z0x*ZFdyq!R*Yz@5}UN zLg4{ARqaZ`hA$6U8pU<=J+kh;UT4HSr^2_#JJAdK`KCSAS9u`x{rc~$r>eo{ zi4XTW$uQpXe0Cn++LGz6(DSep2V*W*|JDtk25E%?^x`#s)rT1 ziPNDMDUU27yh2pIO+BSJxIFN=>vzLt|G?OE5`2R;)+Y-6XX6E5NTpKhifc^g57e_u zfA=O2iGGC{uQS%yH1;!(@pD$iMuy1dxj(soYG^S>exPblKax%dB&%tcpxrTkURqF)d-PsnOFutx>-wb8X z%NeRHY~`AT2`rDLR88cr>KFvO>02Bfr6K+hn@-B5Xu2(4*Lmjb6+L!}&0w?Fvup!m z)0S-ysf?F6HR&+EZdl)1_lHyc+-l)s+%>*6hj_dEbL7+K<4(K&G8!h(XQZ*K;orZN zBXE^D@x>t}eA$q9DQndD0@|t#+`FY}`(r&Su)@ zWYNk}P@1voC6bfKLx}P9#QJ9T8Y%OPn@q1n^+ibkAw01*-$KHvcz!fJqnAW-QY+}8 zYqj!PQ9RWePlZl=z*pVRI+8caKG#3L9#GHoj!GB%xri6m*GyaPT>rk|m_ad10wLBr=4V+7sxE|Qi8trO3F@l8K2boh!H z??tR{lG#uEdjZe*pBdagdm_+I^sJM-seeIG#Sr_Yi_+?hfghtthBvGxI$rvVwc3+D zyKW$mjMumtcZbPpG&N(5T^-}=jrH}rt2`1qQoP8)c9s6~z2vgH2ETTzOe79AQdcqH z<+?50fBp_Xc!d4*jZNm-?O1|aYDBiB3_rR9E$c4vX!leGVtjqDz9DuAQJ139c+YZ4 zqzZf@``j@zVf84Jb|oXkM^9Qi?vK~Y>On*NL7wYYMtgimOeX+hQsf=d*MtXC~j%Ctgxo3#FhVAGBVj4>i=Zp#-3tdU)-S^8axEzo67g<5) z{M878v_FoG606gtR|2F|T3xuY^A?_L0(*RPrOaQ{v3BIh{M7CsB}t`U4Yx|6bj z{%57XOxpQ;STv%}d1LSP=lmpnqW_(dYgZS(c!<%z3$n)V>*vOd*B|R!;hlfpVsbYi zU|(4x^GctjXfV0s2?-N5qn6!Yx(3%7pYeX)?*Evc6gVOLfLY{#c$Wad743Zw&ptTq zPbHCCi+$Y!u)b_k>8!6RBtlhQ?+<>S{X=l-s64|a0khtdozWi2{6+`yxUg^|hJ!O5 zw)-yKw^KIa3bVI}e8Ws=Ud&!Nc0kMzGu}X~Z;5pcXN|8#v(C9iF5_nJ%7}`OH`pFA zC}gs>7XBa`4eqgTraQNlzFgQSk*mhHxp|kmheKhjG`HJueUPrb}LN zS<6+T-ZSR>NA5N7YK2WVfAjR%93r_|AeuotY|z#&U-)@EuH!eY7`a_u3C1@R>wDbk z2w!B&J-vqud{j&aQl(E@5=`!U_-UzjLOV=C!z6D#$BUhGR!2s}V2i-lm3{wlSE2Wg zo{HoLF8it$AGKz~_+G;LF2BAg5temdv!|hTvFFi-F7@PGayI>~t%@UQS-mG_?k!|} z+;pve8Z*|h|CU)LCzr&J5xM)CX+`U@iu*?NkCb72FJpb@6^(yd*%I_^c7$mR@lhLP zUBAd*vC%|9R(t#k9trE&{uk1TB1U>AS0vW5;_f)=$3;y}cH~YIdZldT8|S)G%;~L@lofTchcED4c&1Wm9#DXz*9fxbG}>Lf3&5(VYpUcZc}0{aCemeKKNta z=l*JBhk_4pOvs+Q$(W^DQL(i|&x;OXze&9@#uzbVIS(NE|adN$z zJ@MQ2aF%A1=^{s$cW<7X7YZkw@Hv`RViS+IHA*$3Z;bH`!}{V;y)#y>C3LRhisUgp z`Jyh@j-)bwE5G+!+%ewnHDP=kT7BwKpYfMU*y^i&r`fzPMAenwT5w9bcn&qXeN{(5UbI2Oo z7dd;mM}ks92Mj82+ewY=aMRyDegjX>-*$nc-HFajoQZ_Rk8GQE5aW9T>$~xrhic(X z@aE)z%Og`=;~&w)%427%gx3;1#-glS3%rs(s2}RSoow`@rq6Pm=}l;)uz%kAZS5&V zX|lV^F=hG~-VyWz=d;P~#h)Bb8M25I zdN28LA-c9eN^AFdoF9cCwPp0fm4kQ0)`Ult=fZr?6J-ofkOpJ;V|RU2-`X?f_7UX^H_NV?R=)rI#Yzv8W@TgWc7Ca^MNd}Fb` ziOP@~wbYhbEhr|2VBcAI%c6~#sekYH*+7WmMSCy)B zpVjQ#?W!=})E(ax<2TeB46$qM*HXPQ=bmx!jq42`%y{FmzF~zkp9vNO>?t3FKaV$j zo5}t|(Bi?N^O+m?VvG8hvUPr8LfqYnIX#x`9@^#4zm~7L3>9*{*7Q4A z;j+@#yI<Dc*D0@j!F2Vo}#BbVG^%jecs&C~hR4DKaUA|Ib^pGh)e zR~H-aGQ7O-lj!)^(ytqDHl)T3#`(wQST|Za5-%)A%&SCUeG{?1_d9!Uu@TY~?a9>_ z_sD-6O1j=te^lV^Qs4S=h+Ox5;rr|~SkJxuYl^WUG^FO%--ykKQ(H;mH(0?IqvL-X6HH!V7O$ydmA#_pv=KB~j zp98gHtIWrZ3i3BpNNC|Nrmnu&{Yv(5EK%aD^}C=D^=oun+J!Zirtc|dl_n2vuhnx+ z@gD%N+eveK42`|I(6&n&4mA5ZTFlcZjeqg*fjc0R6-JA{`|f5`Ms_Y=m% zidl87{>ry@BMY2V%OM((R9q3_Wo#|j`<`i7-(yBq1ddxpSAG2qJx)YRe@k$-J1e8r zS=*vJmK^3%^degBQi2`dSlwz<`Y1zmy+_=K<+`Z2?r!@{4dDyd1+kycr(=EVHk^!i zq`W$%)NADFvR@|(*{vm3z4$34{zlM-d?mh_ZlrxS<3~7&7BSXalBK_B}D&r!8#dw1fGGVJ009k!cK z^%xyYdZt3$9-eHzorSf7@fdXl&6G`MQ4u^|78DbwhV)%4@Wvl!nySl=Lv zJEE~KPBRw1a1r`r9-FGUK;>{{TuC79SQH<@tH?OHl}L8e>}6}VNRH5^!~G2tuXzs= zd}yDJP*Cqz4!y8~@x6=n<;5QvA!MAl`pCZdr(H1NETi)J)F#cI!=o!~*G}O_oi6ca z7<_l@^rifk2PYpZ6`j;0RAAwdq{qh6@@3pHw)|gA@mh(fpe*7-L)x#KRI?q z>z*D%JHw~0NlY6!O)GZ&i81in82Nl_?)K?pl;$2y{Lj+uKDN=!X)0N!x9qj5VZSGK z59=EnblBTN;HB0PqI5UGt_R@zdie2^!;sS?wjWH)2vdn z&-E?To~W<6k#3i6(+xc~E=(oN#uM1dojrTP(}%U$Y6?5v`&i$f%Zu3@<#rc;n|&fu zyVOY^UUz|aKF9Nvwm%n{C>`gsKUS?H#Bp-3tJMUh4=2BS+CC{3>)JG!u1-YMpgNe9 zgUL4s>w81Z(rc)s@uF1POwQZ>!w&b$>I zJYQN^>%4p}BRJzcKzr|s`+Rv6zrtS@b#1jmZ*B*Trg z&6eR(IYB(~Pc>0B0m>f|9LX81^KVQ1td$WjJZ5&e%UIWZ>g=1>m!%I4+4WbojyZ;p zD>NLy_~v7M{oj;DDhv;b%BKcc8t0S>O?ikj9Po>vT3DHwRgmtzmGUsRfxDderH}^Y zQrCsb=K@2$!hxQ@BsOczz8aCwJ7atcu)cU@=C*ostK)P=k8V;Py*oD@b8S7Ssey3y z=W=Cz0^ePQOF8e7jPWD1$KL@KVSOXpWyvqQyceFWuaj`hd!z8@h76Toi_ngW*zK!Q6R*sBoq3XS znda&B@4xRgzh4#oIql?voprNUk8u#v609$c zjov$d+v*1z4e=(#akZJ!yE`dqq&mWJ=j{B6zpn)mR>U(uQ9AYL#cFpG$A@u!BNEw; zI9KW>A*tbuHU~@wFutW&-xt12_Y&BeF4ZJT5jjRj;deWP)|yz&-IF`C(MBF>Y*}Kt zM0@Lf`ST;iQpClfhNGv+P9D`;5srK8u63_SSs6QjE5rKQ+>sILNusH>?GhmxRHMn0 zSX3MgY_;&|%YeqxM<1CBgzZkW?%oa0-y|N^Ve_KMI$57mhZ%1< z);Cj`i>hntT}T8ogJTX=ZU&vx%S;Dx_S!wI!e05z{i1OJyb<1+1d`;k6+g^2XymFr zm$EhDq-mJtg_$k)uVBAtUV-&xVku2nTWQdnshT5S0^KxL6{G*zSy)RdZ_5FVAhx}8EC=c=?!^{i9 z5AHkk*A?1WM@Po_^O>gVpGl;D?>i-%Qo;G+{W*%X>o1wUdhAc}AGrOlyVkzzE?o}` zCWk7lZ_4#UwN*9&Hz&yzp13Fq%jGWG9NKE)73J&^Y7K6)jK14!X!*?jmiVmsu`_<$ zza~3GE50VPH)wU!7(M!VcOx6)TaEQid>QiFQ@5uzP}x9atEX3g?<<>mCR^+!>P7W$ zv%zY1MC#Y(i^DuwWKWBP$7~k=wlbq_%F)l*_ae(7Zaim_7UNrk^>yQjY4Z9O$@xHD zeZL0x@sAuUJ`>7x(F1gNNgeL0OTV7Q265Dw1zk?nC0f@Br=W=Way9qEsS5Xgt1Q;& zl}7A+#0Oa4PR@&6EMK=1`LE{YhB`m`FwB&vSdkXtZvJApMom@d57+S{AElXtWrx50 zkvxQ-qN{q6+;p__mjpA@Q`=u=oY=bhA=dZ%+tbpn*#|g9MiSg9>Psq0=f>`p-kux# zsTuW+g0b!P-o6)k7gf&to>C}D$a`4!uBKq7?Pd>?NU6oUGOhmYX-p1}u)ckY@@KmJ z^5qFFTbiCesaue_rad&uAMx5gqcM`DWBSNRQ8!sKFWuUzc@is&Jkhf>;x6%TSU)Gv zvhlqslFsPG_|{^5D`$ChPO3P(xS&59puTZZ`oQS`>N>UH*WYa&er##qx@qf_Z=Cun zzK8JAYAUD3$@Z4tnm5MzRTS2lRJ7AcGHNltkFma14Ax&=JOg9Kb`le=@cLJM8Mxdq z!8_+*@?QSUw{u&zwbLu6QHdg<kM{U!@K)2?-P zGmL=#R^qdFc^>wE0yjD@vC$Z*ibXY2D~cxfe8KqEV|`EF52lIiwX-ZXxEbDlw25~fo@;x!}}#7hz`nsKRm4gMm=_&&w@ zwvAGR9jm7tcfA*&*OD?pVf((E$0;v7|6(l3J3K=33E`<8U}FOGhmA6-neAN?@!M5OCx>Wdh*3+1ts zH>YL#ebh|)`?)xqUo^%fBuji~bNxv!SwqMq^tky?3dXkq>udZzW4cRA=UuR9JId;OGFSKCmvblaX zedS9vzd~NE{IW-Mr*&6VC3WVbVy;B1wsU?C;a&b7ZoO86@omET9xz+3$h%lHaYori zMdG}mT@4$@3@nFupBV-&@D@+W)Ww zrRQw#ySci5|9s!grEIRcbG2i5ccx$d;11Ra=uEgE^q`kgRI-{?=VESc?My+|A8Cg! z!sqiMl?!AT-&U-zr*-yh^TE(7X5W6Wh86Zy71&toM%#ReAyF^SJ9v=r^7anLPLPI4 z9aU@ahpj6MffhVxa`9c*Wv1KcD!zwIT4Q|Mu)ZJGUrA{Ts~6n+)5p|a6m3RsSg%UT zyD#$Dp=>|K_bd6DeQMFl#B?<7Z_SGzF`U*}jBO5I$Y3)fV0w1EhsmrTx~dr*)WvYV$L%<5X)M@Al5{%DS%?T~!K;*#1l(cKJsARBFH8v6|C_gKsG( z4Zd8FehcnToq~y-RSr_d+iiSYV6k;^n3l$j_chk{cgk)Qn~@%s`NOY*SxP15 zk+x?%Rg#XKXFVt9m#1FqZXZa{U(uQ}N8mQ{D4v0MO`v_Lth(WHrhx?h6HTU9HW=S7 ztZ(s`zRRM5-}3|nOgQcYXhpWU-mtL$q;cMQgoR6OB3>?!zcu(}L$Gg?%*E$2-K!1V z=96QtuPASOvvAT*yIaX%e7mu}9NQf;)XJwOg4}6rGesL8Cz#uD7;A9Kez($NnGqr# z=X!lCik`^P@cDziup?Wgk!O<@__J+Js$8;&CdMze=EV5E!TLUOVs9y-Rv~K4Kb!1J zaKC!!!LW%A^MjxCpI-Nw2%5~k5MInR9T=1vkJeRky6^fIhZ{dr7f=I0NobDeL` zV|;tCzIZ%K(dz>oH&&D01RRn-GM4K>R+z=1w0G0LJ(ES%<{iO#`cLWKp0fq)9)Zxf$;nnU&{WG^?4DSw4bu7M! zD5JH#`Pdw4G1HOMhd_7Hx@&8_d zWhWFZA3ml2r6sU7x+A~(Uo~VX$iJVw4-YTQ&fP`S)fegYf36{Zo(@6C$NP8@@Z}dO z@I~4E&XNhldo{)PHCHU!Wml@%KkYf`_+3`Oo73r{Quzj){MVpF=e7)QQ9PrdQ@bKUg7zWb6jE0QQ&ezw$ z*A5S_iwh4A-Y)(cA5QzP$pv{mTwVN-uQlLp9Qo(*g46zeb3tBn2VZv=PpFnXkN&ep z!fF5ST>d&gd_{t7JlyeCB>!34y5cmv|40T%em*W9J~obcc(yK{|6`u_@2VmDYh&l- zgM443PXP~)9DRTLSJ9C1wJ84MeYYEy@VQ$UNH`6b0q!`!oeQ|@0q&X@_Fw(JfV@Zf zI(P&)z?Zla%>PlJ{#8f(3(sp|$p12PY}{D>weETRXTKiEx!~&S<%#^w%MQ~&@1fwd z|J+>uch@20wftYNP5QxNBnA zzuWr)5nS8h{_J1h>&5OHPQ&E_hXwA~z-17II}ZLa55Qd$|9f5!kmL71`oR7z;(v4- zTt8d_xCC$s;1a+kfJ*?E04@Ps0=NWl3E&dIC4fr+mjEsSTmrZRa0%cNz$Ji70G9wR z0bByO1aJx962K*ZO8}PuE&*HuxCC$s;1a+kfJ*?E04@Ps0=NWl3E&dIC4fr+mjEsS zTmrZRa0%cNz$Ji70G9wR0bByO1aJx962K*ZO8}PuE&*HuxCC$s;1a+kfJ*?E04@Ps z0=NWl3E&dIC4fr+mjEsSTmrZRa0%cNz$Ji70G9wR0bByO1aJx962K*ZO8}PuE&*Hu zxCC$s;1a+kfJ*?E04@Ps0=NWl3E&dIC4fr+mjEsSTmrZRa0%cNz$Ji70G9wR0bByO z1aJx962K*ZO8}PuE&*HuxCC$s;1a+kfJ*?Ez<=)qbh`-t+5yYqe=I4E`})|4x_J8f z*|@ulx_jBVIl8zzh#LAhI4E&Qh;jJ3ggAIP3Uf$u*tokmd3rfg{JsCXd;fSK>nUJ{ z4@(5(@%K9N9K?SqczCI>LI`aHQdG-8wlw(MN}(6x1|Mb71c`7e#rj+LbY9*@y}jL@D$wI`^?1lkm;J%uIm8Xg3uQSBM3F@rXPY7MYNnk>L)RC^9f zWLs9?3#v7t8XIV{sP+PuNb?XdhiWabM7BK)d_}cZRAUG28>+RT8V6|esMd~ZoS-eB zS_dqVO9?QH=+*B~(LB5TqY3u#9Tmutb`Cz$$<|deDAHpgsGS zf``|OYW%SN71jFCZ3SR`9@XBWnjoxSLbZ43wnDIe71ah&O&Hd1quLOviNLxAs=Y@w zQCPP`HRJ?G_TwmEg=!yAO$^qpQEdd(#9{pcs(nN?30SvBwNI#a4AznHAdgX0lY};s zEAkjaH7RJ1BQFB7L^Ww>S0V=|Jdk4(8J`SL3K}9K$0q#X$pX1(Kjb(>G&!IU)sSNj z*;XFlL@pliK#n=2p8~)G8gjlP#}}d<2k6m$$gzZMs|Z{HzrW67w4V}ahtV-3#|_d? z8Q?%Qd7;`as+|Mv0bHAq>((Bs=|VdOw7;(J;EQCc2gITpK4{Pt zPalXwHA1wX0cb(!a}c4LA!xyO7nba3KNn~t*Kg#3oKMKM zt^o30hdhw;3DMjDq*g$#t6Zq&4(v&lli_tdMJzFsk`M+Yj2v z^+*Jk$PoMiWLxBVbQJ9ufNIFK2l*Z17YOJ=8+nMMS`f7LP)!2WfSs1^ck zcl2D9M72=RJWx#v)h>bNiE7fQb{Vvbs3wDIS3q+`HCa?c-iw~X{vr=K(BKCz47i1A z$I*V_pv9t^BC1^jEe_R`P%Q$qcvMqHwMfuzqnZk;T?Z`z)lQ(=4bT!%?Ifz*1T6{G zR8cJov}9CML$zqoQc&#_s>OhoifZbpb_=v!Xd~z6X;h1ab_}$UhX$&}K|3DRG+~Ln z=JCL7R6B$AL*BO&ppBd-+GxK7XeXlm&Z1f(X#B_l0T1MOK$^&Ln+(Rt@sAu2h?We@ zLmN4U^~K12$o2{RNxD$8KYVnXvi^y9Iqy*mJaPu^ffm{wG7Z2As6Je zH$$~dXum-49_%Z2tX`dT`oS{`Wqpdn*-LbZHoBV$3H-x<{k zppEz;&+me2h0y*4+aeyWs8$5+G0>3TxuIGVI+Kz`i(ZQ3{>LPgV8ZnOF?B*-8)RQ$ z^S?4Ah9wd|DL@7wbqfVR3G4%q`UI&TXaHJZKR^f20}KH2zJOfcnSf7VHVTXb6Tl=e z1t4=KWR8T)iI6!EGUq|&ILMp^nZqD+7G#d{9asXEffe8ffXq|YfOTL4_z58Mluh6_ z@CVoewt-z>4`>2ffOg;|&&c z)`1P+7qAKZ2L1qBz&5Z0>;iiLa#G;~1OOpG1P}ux04YEYPym#`K7b0K2510UU_U?y z%z)Kr;0rJd%mH74Z@@gT0Mr5X0CIgtuII@0`!axBpOJGi0=N#`0Fdh%avejiTgY|l zuj>*lk#o%gumr3CYv4R^0k8pV0Xx7Ra0K)KeLx5h21EccKpc<&jscQ@6d(=A0J4A_ zAP*=2hXHng1K0B(Q>;05>qR)87sfn&fI@B_XR!fOO91LMF1&;#@WeE>3NCP2b*skM>X+6V9hdLTEX4o2!;q|Qa^TBMFe z>QTh zeZWf?CsG^M01tqN08$qsbs$prA$1;7*CBNrQnw*>8d8@bbr@22ZGqP|um-FH8^BNC z9WV$uKp#9Y;193`Yy&$0QVZ?@$PH+GfB+x_hyY@M1Rw>- z0CIo=pak{-Q~)(V1FV6^0g0-zAM28060 zeFWtG!788)c_8-#kh%V4;5@9m03)!EJwOuR2Lu7WKmgzam;f4p4loUVS^!e_iv!5~ zT@-i(Z9gCo`1^OPp#R-Q=2Bh&GRJTPP5^)Z&I|H!1598nXF+FyHgeC45|%Wuz8{th zundHZo`Gi(EUSTBARo97q=6m-L<3R4P2dJ_9f$-XfNQ`m_>2I|06wq<&r=1<8dN(8 zebj+USjXxKu$~O0p#3^wyE-5RK<1Um@)mF(GMa}zGr(uy3xM2rkO$Ad_ZL}5K<0GF z{10hghJ6eH0swyixsQO%8(#v*T(KG`1uB3$KrxU76ax7`E|3jm0C+$SY=0NX0y2QV zpBtGcrUL?yH8N)GIFWhVEP#wB7{-8%xfej@eZ#;9AQyg@jrRH5^Y87xg02Uz#V6>8 zcp&S@9B&+OMkXTg5JujF;PL-AxBI&u@q^8r0AB#9J9c2)7XdE-sV`gsTL7sOkb1!l zKTJd@B5uQH@nH+ z*+u?7-}}7Jiym${_nbL%=FFKhXXf553@8M66i^VrxoLjDBLMQ$`SH92?iB}=0`PuW z0Au|!fC>Q44XOhu7v-!4cpOj@@C1NbDVqdTb781|ZLt0Mh8d`#k6K`jK(o48SD7M8E{VC_olq z1mGnAW509&{Sjk9>VfS%1mFZX0D}Mn0Tuv#73XSw0M7!t06GBL0~jANPNbY20rY9S zegV)M!1%H|pex`xKsP`S0Da)|0N&@l0f2shzJUJnJRV0YAP!&yBmnGyL;z)@%)af& zdL;pAT0eog0 zU_4+tfc*IUQ~;l)Zl?ey16a;90Ppdf@jS62bcqx4VVj91Xu!C3|I)@^Ya0`&ubpp&MN_H0qX(l02=@s0q+3b z18f1j57-3Q40r+18_)~DvS}Z*n-2gV19k#-09Zes?*i~Xf%W_ha0qY!un({wa1ii0 z;0WL-;27XIfI9gSa0>7R;3VKIfV!m3QolUk2B5yEtFHmn5oJ3MxB&PD@GXEcvCRmK z?>Wz`4~PXY)~AfsaU^Xu9IFC2@2m`HihGrC(BUJQy)4`Z$Cb#I_LA$iC#93yhpjhTa3MEFO-KosHfVvrakB8Px?9l+AZrJjU#o#d{88S z?Ld2^-f1s&ab(*^;8+h34lo1Amt~O$&v|6IAIWQ7H>@Y0^Ob}5!g23O9Cbg@66Y-d z%>c|-F>giv&|fqH`1%a`2>OS{I5M9=AfHYE>YIM2J%E0P<4ZdLd9fWw0LY8J=NSOo zh5VidkY`&Q+W=YvTFIlY?5qoUcL4B6o)&=bGkTrrJD+>>TG+-oP1mGpWC_olq4xZ(G9>?Iw zF;%~Ajq^$X@*4-7Ue;oquL7(DECTWgQEr4&ms4MDz z7{J#?HsbniADnJG8*pzuV4Xa^kE3rrH{tp{0Lyz9K%Kn<&}HI%o)b3XoU*Zvc&+Q> z1D|I;!uf{)-IiHzyfHQz^0OtT-0Z4lkpwsWc`ECGx&Mq830qg_p1$+k3d7Q@i5x`-@%$GPn2KWNNet8^l0&o&=3c#|6&jVhheG$jLfU`LFm6bAl4LA>=45VXS zg&a735BLsX16%-91bhq7`CZ02ZA8~G^-JCAx-+t$Yd$pBaZX+5rsKUE0G-b*oa^PV zzpn!DnI8eP8}LlaHVmNIbHqPf;cY#$Pah~kPq-MATJ;f;2}ULfb|UqrSMz{KuJI$Kyg4} zKruj3Kp3D1;86g1@fjZZ438||_nPJAen!7$Ik}(J`A}w-M|?RP%L2*(9s^VWlm}D< zaIJ&7tHN_UOWo0)*ym|ejJ0%|YKdn!Ha5dC2Cy0D%=1SBngF;?5(%gZARn%sR0nXa zMIRfv_QEw7w&CMA)&x`o)Bx~VuDPrOZCxDAfN%hx<+vGvbKh~3vQZ9}{}9d_iuW9Q{7m1-_Qol!Z9`c^-YA)oFZ> zog~lGc(x19JIia*5$L=5{CR*cU!4d2JAJc$?R%ttjA-}_eJgR4pFCJT`LKNADHr`L z{kw{X(S7=1@*@wn3w6xrERwHYre2<2XO>6(vP}9fK1cgzf42eR0ak$C_jQ|(!@WcR zeTlCh;eFEU&%1CvNIpZJIz7kYA-GNfBmu z*Pr#(D`hdd&wIMA>4UOk0r~t<9FG7F12{%b3-8;2vy+{|ZC{(2lY0p0_= z4R{^E@#`hP44wm0@jS<~mvGMYs9^xsAqg-XI6cmqhWk?iV*#T9qX1cek$^GsInuq% zYrrdj$$;^IR{;?K`mb>~X5snQaGVI30GI@r0+>g73E*pbka6iu3(|eSpsZwQ-+y*n@Mn$8G@m?ZT1$;8Ps;0!T~H&)I)CZt)q$ zcC=li_)5q1mUYzQF2;tWp{y*AeAtILAK-nxFAWeQB*rx^B;v0?(>_u4`=&O;>tOY> z_cTW4d>t%5o+|-!I`B=o-R8Z=+B_1{FE%_P97R-+m{U7F{VN`PE5nP41g0WrUVY@~ z+jH}b>I6(ocqD1qipTA!1En@gpuck$Ak1Ev%(XZ~8a-Q0LpEs2TJa-#)-nO5(G zNi{b$YxGE{!{V{Ik)pT@nn!^tTe3#cQPsK~^kND?hhe~s`)K8{GU=b!^^r z8?v6gcrM+GvAG@gWN_WmJ!{zduvNc%F*QL`3^cczI?|q4_Jh@nNpZS8R=3;qqUG@Z z>m45%<;64v4W(}X`#wkBTg$q8F;4?i0GP!!vg+0uV~g`*IssD{n1x?FlNh=5={unz z{i4GghR106oyURsY{uPnGf#z11|}jrCOjG=fXkASIK*Kp*UI&Wwd#%vz(m#uQKTu^ zmVw&9-|hS5bc?S27KUc)Z8XY(m1NzH4WC?i}dff7oB`p5VnWZlFd(PYubM{bW=fN}$=!SxM9NyOo1y#;t!|NR4tL{K^Rf zO~ddgVAR|=)=}!qt6nQ|^5nxQp&^X$*ve{}%IG%KXsNqZTW?=~oO){z9tHD_4hM$q z^LWPV^|!uKyONMPA{_Q+bvg&zZ5U^cFaJKW+l{Q$cXLwwCS=gZ$$xv zUJ{80a#~V7^tI8WzsWx(BfgWMX%rqAD|U?)LOC_ME$;f$+QqK`6N{Duw-l-Dc1Lb} zK6OLeZ-9x62(OPu<<5`NpxN-!s9h1?pU4z6&}k!6YO0;-L{qt&9orqPQSksU4a1`; zbzjiXswRAPzH`RfZ|ao@=~o}jViDKmvV*XYfl@2ETRSX-d)cV3+^y}!?8Fmng>|cb zezohojr&4FpvzcV;(lOg2M3;i{m`)!qx*-3L;wNNOmV61IAbmfox6B0jwy~V=Z=)vwt z+5Q^$=JYQQ4=EWM5~ZoyG}I~7W-{0R?poVcBX@>|Kxu3^Qz%jo^gD}sH9i@-%UUr{ zc74hKQv#S#kzaU9)S1!Ci>V6?vZPt-M~=K)EdQ-JUQBCX$^!GuSX2ADZ}ytu#c)>+ z+w|1vQXBIhuban>1I+$mKI z67<>dNH3fH6$g8;*6W)+qS;W3-&5**nD53o*eHD!8mI#>>~js<@4p!}zib9D9A#i4 zC1Fy;>`i`QZkI!k52fvhLB>F~%6PUio=vtSJJ}ohcd1mp>L({BfLk=`gErlSCukw= z@z30SZ$>#Fm`GS}yW-+57DAVEG9PfJX@a(L?G85=JPj2Hnu7#HH8 zw>FEdTg-36>5Ue=Gh zUrJeU>fmv3Lnk4(UcgX0uek<&+_(LePlW_@mL@AOMSz(XZu|4idoO(e499x(#!S3I zZpR?`)9ei=%MP#d6EN^Pq;Z3wIA|VSee`JKJPQ(mfvV|}hK6b7R4(2(eB7qi2L(nn z!x&&F+lyN!x{sI1R}2`mb`+X!GBDKJ*muLfzus`-7>yf6$UT~ch0MdV>{0$6sUMsO zO~lX=sWy{gD~R@~T~up@^XoP}e!ZEK-V#<#tFpVz>4_GP>E&W?O{(AdH;#?8w}y!O zV7gTxNp!PWbC=)R`>mi6PNV}ctk048kH3&MbJ<-{p9a)uPhi;El@3^vhi#ekg}}sy z*T?J>7;0x}$Js|N6#U34Fk*C00){P@b@j~9O#_a!0w#)jt8dBxhW?<-rjSv?o7Gau42;M6J`DhqCr4dBYBfQEK$UN^c>l_sBvF)KD41Da_rFi=C* z!Z~Go_I&-wQbEIFOsgfPS5kb#i<9rG->q5pD} zIVfeD^S|ELUY}m_0K7{q+&?h6+q6W;Nj!^K)NhpWV)DR1>G?_@FguQ|pOUXc$j`Fm z-0@CWNJTtLZewud*!5%aGslnInmC$11aS}~FpLkx82lE@k!{*_{K<6{d$lhhv?J_5 zNNu*er6(xA&qEl zf0|A(S;RS6tubJsGiQ~LF4nNd(drAK9SrsKE*957(O)0kQ}xtyv!AOfFj`!dh`1^q z_#LnHE!U#nhrr0lp$E9pt~VB{`2F}vZ<(oUaEpRQ9chBw_R;b0u9?@Nr@&y;g4YKP z`&?v;SP>#qchvvB0n| zfZHIu$IgPrFF4sV&-0J&(8@tXYI4hRGRoVJUKrPpeiWs!ro*Mw*OGS6?{(=p#$x0K zdm9T3Ephn6edjluxFQ)CdL+;ocyftRk6Hea5Mn;Y>!z8qoCxQUxzkF&#QH=s7K$(} zm9mw4YvkAKE^RVN*)RsL1qK}@tIM5To3`eOo9D%Bm)v@lL=aiF2+8+x`<*g>nA-k)&@P)S4CqF7(*dScA~dZj)MOcb0YS|P>m;tbL>^5(V7 zrtM2DmgS(PZgArWb@e&xuxBUK8UYM65Z(y0eYhi9)r#LT;=2|8lw&;TxhMCh%x zq{(|b{`;%njgRoscoJ>N_JmB+Pd~4{va0{iNueQ=@hrz3bvffO4W|ToFU_i-JZIgb zUT*f}1bh!B(Nl6o-A}H4d-R0FAQG}CC)!+gkGtr+tEJ0)ePSRYVofQg8Q?};R|@^M z-*Y!_Vm2jg6g19ctC;2N-SE`hIT;rEL>VV808JQZ_8hpnX+-~yL%b5CV-}i{iTufe z(}y1)p7tjqd|A$Pq^SKk9`u?=4&|>Ci6_CqmI8!dJ_tmf#&EHcEoqg}aB=)ru)JN0tKtKLdujjXOncgYU*1nkz7f z5F$+90s~XX%KYD^FVD8vs@Xv_?Vvrj_+{>G#C?T2P$qcrm>Z^nl2lZ zmYR9D591K{5W3izz_6w-Z?GMy-KfhJDI2u22pANV_1BIDcMjN|iEP9F+<^Dfy$t|{y)jR(sP2azUcCnx&Ln_&2N-gzUGJH{ ze(zI)BOqxY!N6J?w*m_-VsxfYG>!sL)88OLan$tC zqn%E?u<6zl%pXK@KsO~=+@2vgrhVJ~ctqz(eMLDUh2gTLy4gfUs<-amVpd&!Mu~F# zYl_iNaC^VD=IdY0_r#)3%icjg1T__-%tLiFZ`q{MGyR56Z{I=c05!BEXC_%Z*2Lda z@4V9E+VoAKAtUH_fbq8jV1!2f^)^E4tx;XAwObY0@TOA)C-ng4>p6OZK=wm^!-jn49Cy=V3WwtT(h#$bkI= zkgX_MA%5cK=j~rDx(OXnaVW=M0%7sM7;;0_0scB%%dR{>_xr3OcsC9-j9uX0 zJ_d#}${+WwGnc6P@G)Q*-J*TY14B>o@DD!~@9|KHG*O=@W@vu`rW7!@H_UANP@lBx zz|=>C0v$Y3PqV~tf2?_~b_3^GU@!-z;#vVi*`D{@%A%@bXV^Sv|ic{YI++OdY4jpdspaO;br6o8-~YaAJll*|faK4}UX*c6OD zvOF-9pmAh}?qx@Py%rdbW++GD4;rE`3`(O*H2vCTX5p4!wSN*ckPJx~lQq%e7!1sj z??y#*EcN1-z(}v$809c}dUk|k>sK4!WjXX>kUHKLmpTwMlV3K)TqwJr*%i#)1;%Oh zxa`Tc*LpnB#(Z=aEs;G7oLU3erjy@zr^nwf9qHjMr#CQ+oTYH{B{UqWhOmfZ#Fk_!HBt5mTo<$)YfrPz%)XF6gsfEhostEnWmG`zg{l% zZY>)y$XZf1n>*EGceqU%wZADhe8+CiG1yCh$v`>DnA;RR-6N=nfwl)+PW`6Me z761n5tmn%<^LeHJy$c)F?ag6JOQuytKT@MpyN-R}6CnYUQl|5uVVfr3Y4m%iL0!uU zZuO~a!zfzxg{z=pE0he|_|ecQ$y(GYbZ`e4_L9nJ?KikewC7wCK?tRO2xSpdq3VTd zJMvd$G$?0ag(RlO=?is=Rq8NQ&DF+&Qmk(MlKHR~y^;by)*%~DHfO87Fy)y7teok zUdx;c?=llo&_;I_Yw~OVj?)i_`e0=!%2XK9H!bn`=MHqXguV9}Fl+_X^f8HPJG}TC zas7nnlinr8jIVWKPI;iBhXhyIcq+QxrY4WB6N;6Ipaia1d{pHt5@ zGaG4oOM0SW-0GQeUAUGbn$)zqv8K1d&1Q}pa{Mc{oR$tTS*%VMJNN0^Q{q2d@;%47 zhUjx>)9Ot$JD4-GXOfeR+^Ssj{c+$^6|+0%B;W9&a1 zOHhuXY@!FNF=`*5zK-{Hf3fM*lxMU^6-{bNv3L^AFot99?RUTE+B82Tkn_`b znrR-XWy!DSG~WIQ?Tx(=vZW{5t;p(`4kk^$y{yYmZ6pRYwYzN@aMz|)b$g!aR_y92 zFU^?d+MKDtm7Wz^ESdO+C`WK>-a>1i&hw;eF_*R6M1t%n}}*#!*k z4H95ZYldwPobgrShlP5b-7jbax1ueza^i+mZ`QJ4k%qufYREPK81|CSd#yg&?w7@g z(nc_fMlVr}fS~yTG;F6=TAV1?{^;Jek{cwr1q?^@)8lI1ZQf@b^(MW4s>^O31bshV zDC^S~>%7Lk%@_&FPDxG9v|_UPMDw`u4GQPwtUyN5JD(E!U9y^wdv58S{*K|mWcyx& zXhZY`!?8q67}W8OI(AXS6sW0s+*Xgy%bwOo!1J5e6tQ+)u>|!&A7Lw~M_R-Bh_P`! zxD|)4yS)8*`i)bM#R_gh2hX2}O0Y>`X zYrxQxUwgFjV+BXoVDvBjUZSWn`ag7f4u0N*iSV!2b@8wBC|s7S=5l zdWbWA_AHDe`PynTi5pM$=@r|hL?a*; zprLk3K7Z)Dy47|ww;>|pC}STY>eCxE%=~meJG54v@(mM0L)zg^81ATBApuXYKDSrJ zb$sP?r7S5M>f-^X7%=Zn+ZbAC>R}Twa@-y(%ej8(sr=R24aIBc2r-^LS+P?qle zHnZmO$+R8X0Y*&!HvJUOR>reWKBHMki+(?){qgi-eU5=1+#Z;sc;cDe%}RB4b?zyo z7GAjzFdUsH>>W|?)S>gpXtD>>%r1r zzXJ^WLZMQ>zwqP4Z|KQsA@F>Pnu435)MCDH7u|_*cYM|Dz1_>b<*bz$*WERLocwm89`{Bg zQw9us0f5`+FVdu{}Ho~YQTg6^HtA=YbTqxoC6JY4I0eeUABR?jQ86tTd=oo zYN~hHO!^Np10iz^xFt)$cg8PWa+m;o!y?79LjN zuVDx2prOCcFxR;@ymr~kQUYMc0YiHmwyaBg%esS!5(5jF4NOU3R{fOmYOlFf-WQlC zj%I6tp|475Ieg8IkxdFq8t7m*FpOc#)Vx&X{8Vjc0(1?`d0=Sq$FHV;`CZvA>%Hat z2n_AI#FMd4rG9dR`9#_0@^#TLqn7U~b|%jxX67WOA~58Zx0vUHCG*?py%9Qy0EYGX z@zK(Q5|91SNz$OTTL42H^jiDkPgNXUPY4WJDDr`NaDvli#)i~HQ`IYDCTu(UI=C_0 z8nFM&m$G%U7Cu>LK|f8S!n-I&XGm>m*J2*5_AY#Nntj34=$EvmZ6^%#>OfHrq%H^= zwsy(M8CC9{K6Kto;{t{jf7P-sZ!^!zFC-=sZ#4i@6qthFHo4ki#x!koMhoE`1Yp?b z9_o?)+Qrw)bCriJhxSqQA9%|JpkX;n<`$@5Y0Jc0k_NIVq=t6X8dYP|dQ;OVG#VMm z$Ez(w;VFVcl7+H+4<_<#G@W()0O8w+|xqgT&Wr9sIwUn_+w)e297k zRM%A9OVl)m5{Rfq(YMj-?QV<9Wyv%ZKmXG9TS1JC>T=X0t-3xB zf>G!I-coJ7iuyo1Y6%R>5wWtG#;_b{8*g`@&l%4()pHrem<8|Ow6_)`m2WdD?edqQ z+!w%c0e)2B{R8@VMNOd{b)>4cUUlsM@9ND^YS9f_K`F|_uR;h~9+fw#*Gy@|}Jdfuq$r_h_a<mO zrQR_9C~`H3UDV^x9dKh!hu!|kytDsGX#+N`Wrj(Nv=ITa9_l=WIu=vU8|y=YFi3EG9c!bn5C*gzLpu=Ble*>9mZ+vt_XYLJs=6FSZwzShY9DW?1L3RwD+yHZ z#x^kJ#ZF=8ss?_UQb08aYgOLxtv-5KQvB)9k8FG z<>HkXb(@yLt`WXjRiJ6JQR_pdz6EX=vDiN9xJqpY25Z$^Lxvrw*FqKhEkP3v*=Pp^ z-|JGL++0VhsHu4OQr+5yF}c`>56>qy!}z}$q;75XDrp;AitE>`%$js58`?CvC`j2H&>;jSY@cIWL{ ze2{qSy<1&lJWrtI;K`YEFzi1KNMrbBotQJ-1UFh$$-?bkuqK{r3~tMZn)iUI1Wf2xV~5WfAD!&QsN2V12gkuB3|!O_818Bj`&8954K{{G{XIg@|Y-XfuBCcK9r49>lK&)EaBZgH)Rz6yTS(5|ESPM3P$li~X%Lf3AG z#hnOCxv?;Ri6?B64$E>NL1?n(E!TbZ(e*0sx@CcpJCz=!eMIL$IXT~a!~kge5B6w^ z)uad6qxrj2Yi;M8BSl7x>o{BJ03Y0ljNq?@&XP<4aNDl|Cu{5PLmZlyQjqtun*+vqY~qeAi0Yj=yX_O4>Tz*2H4j z7uA_FBV@e8W1}OA4$-84zs#Pmjvl?sb!SFgkGJ95Ryq^?hHjfRDc2Y-&rcVP?EsQwkC&}?t{l}nrLemwD)HYILl ze(J^C045AH9S^6Bo=|1bDlZ0a3VJeAY^FxPc^)m8Ib#~6maG3=JX-s_ccmV#Sq}T{|DqFzCRhIlyp#NWWjo586;+33fm0H17iQ7%;c;HR-yt z>4Dl_nuEYp1Lmg^s zF=k*G5f|UwW%Ttvt)K%+K-t;@!}?U}SL55S>&@Kf#S8+5Zw6iOuzY0g7Ol&8F%y8{ zy9oJSYIW+bC%bL(ma_pE>R?}q^Un`-t$4;ua~K$|{!jh+yUOdIy9GNh5ZH7HepAHUZ1wWP;ck$r>8_u z96G{FcnIZlA53(Br_wU)yOd zM_vC23|sq~Aw`y*e>olfN0(YHoBx|Z+|WULORx`2MRW(pQ@Q+^P5BWKb6P^{eKuXQ z_|Tz+HosOi408<95aag5n{CNyrufP)ZcG__2|HBew9()T40>PimjL5}U>B01>21i$ zbEdS%ALEz>t+Ali0BY3dJtN%bEHoS=a~Lq~5+~-Hb*SI3d`B8DRN;C5{Vs4V;yp@r zE2#CRrpevs!m?W-w~cBT>RMe+Zch=G?J2Addny7?Q<=wKv7A^E^(?f**LGnDYCoEH zs5WA(x3Br)VDW9GKtrz#y_Eo_DD?LIx#vE!->A?}V1)0j0Sx`<-;R(CDOFpY0fu1+ z!okeQh8WZFh0>owe)?gXX9qBJBH$J&X_^f@8bAEiLDk6(%pjaWHiA;4eQtt=cD>da z`JUsZbrERfY)bw9k3u$ZQ`7Vru8j{pj$f}n)EU+r<;eGT4R`1Z*$m4OR;4Hh5~#nW z<8M1?1$0#-JNO3D)`C`gzNGc-4Gl*3`YNs!=FU=W0eY6&sy+fY>N>Gj%etSu(hL2R z-&kW+j{#F2m_2oCZ2wE%R%hIxt)d+m-Y^v3(YcqM2hF>f?G;yze9u0Ajn4R+lVm|~#$<7ieygVh5#2J;Ou z=*n)dC0`IJ??MN*jax}I?_ugOqg0J~B zZ>EjHJ%A~IauVI^?)_0@jU8VSkgoh^)P>QY{?$isgmMftY||cF{#d=X@aincCf?L& zV7dYfbsg60_|TFii!BERT4POTW@(rw7u8(<#Sa&`Cm6LM#{b)NsHq5E-UJPG@WYo+ z4F0<5>&1l*gr|5P7{;T$%5Kk7refBc5)-Y^sF*t&yeoo?DhHs6qcn>TdwSg3gS(cN z5Zr_vj2W$IXX3Hhm46 zlF&i5Urh&&Cl`pO)HL4+le#bbb9;*lU~g)_6E9XV@CA!86)(THX+U>TA2HagB~aV- z>Q}TeIATh#$&q(VhmA6S(Y81^hz+>!Ja zht6DJn`-^%pSO0bX(+g{Z_n(If5_9b_At}PybCPeuoYmxfyM>34*cyvkKgi*)mpAd z;$MY#9cj}F640(=6cUJ$N#*$hS)xj|f2@OlT>|9alp}`!xFB7Kar+3_a{G9W&PYYW zb^_Sj19*S6)cz81oI|q)80S>&6Xo~SI#>wuqpYf-jS3y8YwC|V_Nq3DsU=X`s5%M= zA18ATF&XPOzA&BfC_{fpjeM2U4IjVq_0U_-Y)r#U4?S3{Dyr-AAQt~K%J3bX#rG{S z{u%Wweg5-b&Gh<>*W&m~k2qqAdERTN%?>G?GsPz2_{R6fmRghdT&VUQ6q{*dG+UIPtmm*xDMK0d;<8Re9P)FIzp4{g7p$lKm> zjsnA(Ys0cXHTl%>u(sbtNT9Im2KW^p&=d#FuCZ$iUMyB=7Pv9)g?CYm=)f4{h-Dn& z-=@&0_#%scKfR5T8F4FQ!_I6&ZX&WX#E5cAP1G_nhx@IF8@PSr|3u3P9jJT#%q&%; zsxC*(O--{8vT=IxD!rs`^aQGG;&iU4CoS`grV-;k1O@ zh62Mjz0|$!`Sxf3F6W)k`TNA+*&=n$!M{z_St&hIRYx`cUu{5Bv-=opC&;+qUsGLz zYLhh!*}gk{<-N=N{xQi$BuGuRXYgB8gH0n_bR88l3HB!AH-GKuvo?co zDoMZdF=S(wE&YXfTZ^+{MI|>h>i8*|cPa98o3lll-GGPXd;Iw7yy`j+;AgAsa5<#m0d8G%)m<*DlYS*R9?z?LA6p4*uHcn@XYs4YVb@ zGn1{R0cE>1SnzzoL!lu(z=ineOTI`#L5n;yf^v?a2~r>}A(K&-b(BNULhO$Y|r1V{F-Erq*(|7ZkZL_JjTGS;BUr zB3=ZBYZCiQ{ZX<&k^g<6VMvn>Oa)*XZ<)~j&yw-)=rpmWnZVHEi>$f3Hg#V0!a7FP zrsQVaKEwpjwZRvfn4MH{V{03iLyXF*B4dqdD4SZ>hCT%Lrs77-wb!+twSCCrXRnWJ z&rFGEg~(`w+&VLjQP>sMLW@*=zDC07VPv4(y1{o!@Cyg1j?s5YaG#i>Ej26l`A!MG z=ts-|U<#nMz27Ne8=(7`)Yhx6kN>Y==#ibe71UqcRea|(vH|u9i4TUFu61qS{Mz?j zuR+(0o}f3i9T<9l@p~U?+0;F&);ujw(eLz+;hmS19iQFWv8{k%pL33w(fah8wc$f_ zf1vJJYF(?mKYkg=Xv`8mQH6<&O`os%olnabzq{~C5v=xUvNbY|2c{yVzP84;V$re1 zn{`ZNZ0@yPU|_raAf!Qb%bl2L1%sUy@(URTU;d|!qAw`y05+cjoX@bx6{@s@tuz!X+o&^UhrT+f?_k{ykWqqx<&~eIBf~9sixB%wRCCQh)o|UpBq}s7D!p zsr9+@znf3=FGtsoztp-$|Erv;e=7vf)%;hoskNils5)QuAl%g2F)!C*|8w!v-i;fP zryh6d@E6{U@<{)6n;P!*5P4-cq-Jh##_?+pZQFV8ZTyCqw$0mAafKEQe!aU|+g@wt zaW{h;xVxZEjLG%ii4-xcNC7qj4QIQFQ6IO2s*Z>iV6*SC-@BMB2y;qY% zF|Qv%B8-jx?K6V&5@7sW+W{_p!DY@$ZCx|!;bEr1%}zf8*`&8r*JnLwxF02I<<_xT zu0hPl%fQONwe@VCT5A8@T3nUqOx*YvqKG*K3D^qPZe0DY^`E`5UN5qFh~s|%hWVYr zuN~gE^_8MnMZojomyRApJ5AoyX2{Dr-5PbS!CTyAAh*V~0fzBG=EvsKTl(JqRq72A zbdwl!$t_WzUjJ>T7c&4D&UO#SxWD}6%*>l!%phRGfZ5-vWS5!^exmKL6~JvMFkDT_ z8uD$u=8@$d14dK`zsCynOQo77j_>NFnJmkBd4G%NI(!()ybEVJ=vs3m=AFWY zLz`s2hn%Wj&Qf3~!JZGUOfTcHai4>fz+Z0y18)Cc!$hps+NW8;*~e>_IQTJiAX~dJ zFwD?4e)6g3udiRA?^lk&FW&(}JBS|g-nfk)^-9ecHVg zccbI9cfA;OYpZLjrcu{aO{4BVYMKWrN8K0xtC~JYIcgjIue9?Zx>kE6wOy<0<9=J~ zSqT|~noqcAZw~9Fx5NlI0vPs%&~8)RY0ch$4;c7YVqTS)Q!Q7Wc1}s;2#5iLgYbS} zIF=0W-Ky`b@3zm97|_gKr7^Mz{`nGC`*hiyz;HDC`J2*p>tD09kmaBUtH;yY8?}7o-P?u*|du*5A=!P=KnSkq8ecb2f&TC z6W#gp+r4Vmg;kA+#+w@0F?d2^x<}5~c=F8NxuP8LX5BepXb088UKl)UwUZf5rnX^K zmw+h*%tgoMGaLSL`n23Hz;KjVUns0>|KTgRnk20^_YQDkn07bXb6T6#!=J(4aQUtN z=#83e`|96&BRt*~E6Ndl!Qi(pZ9H@-VEh%g|N(pRogFaUsDO? z$X4hI3~TymzXg>q)_vXwqmI1$Nt#my$G*J!!cwleN^S;w(4`$1>_NwGX>)K~18!{7 zSMyGV_m(sPFl^<}0;UXTZg-q=EAsnld@o0q(;gT~aMbq8lId4}{>zIQA~8=! zrZ1d%v{H93W)3jnpsDhG{>v9*tb4tfPl2Iq4f9RjG9$L?C@MZS`V)00skl z*6nBeF1*_PWxRK&ms9#9O@il6TXr-!7>ithj%fi*bzO+lDUnV#WZ&);|8}NK?kPl9#-gb--YZ$Z~bR{`;$c*XK+^a{Ce(?!g#7v*D0@ zNprc!Sz_)0Qx}+9A0PZKDKU=k2uMtgt(taXEmOwCom`-;=?RTK4GbmNmYMM0yQ`n( z7%XWrfg!j2FYWr>F@MIX&=3diu;=E^$LqUIup&M6pYKpn)7<@7YlRgzt6Z7?+KO93 zHnDoClE55c7@-InbvbHov$kt`+uA7Pvtzc?$WuT&f}476S6z-_Zw#^;tCme&j+*A* z)y{)R@bA)8{6t$fdnW&e8>4otsP1hawGPzl^|Qc@7JssHzwM75N?xgRi;Ud~Oif^3 zjDC6iraAZM$%E{?`sZu!2yhjutphc;f0stJHWh0!-gU%XI{%ey>T(Rn z(;$9F&F$aSsJa~0`dpyhfolJzYPrZ*RsRXprt1Equ8*p3Hwv)(jI+bszv#yaT||H# zl4=S5tCstR}8+{W-(f zvLT~r!$=4;4Fc5Xu>)EpR5<@P-74PvsITz7m>ugV^wQ) zU193=ZIuoJ<*U@|GDQw*_O`eA!=7my9dTT-!B1vm-cwd$-d|Jwr>NrJVCS!#o|+ua zc=3su9p9!kTiB@c39$x-&u19Di-37nkTtLe$(X5E#|9tLR{J)%&&Jf5*JnMfN{X#s z?NhIg`OBuR&sda%A%?Pv_mI`=nz`2w z;l*UO$Y8~jZyUq&8Po?`#%YQME1vZ=t1{4NLzpkPscZV5taxHI$xv@1OQ6=<|G(mC zq&L`(LT~zh7Xv%s7dBz>wKx2mnR@>>dPVjN<@mSu14%8dSJ4|`RsVs%R_I#yJO5Hm z<(uk?nj)L`|9njiJd(^fcft5r4!-`M>?u)uB!7*nM;W~p)KQx8e1WkTGVbEd#{=J# z+il)^3_Ei5to!-TwH#N8_|k8d*<+h1F|ccOO$UJ+=gv2WW!3(9#v6QVi6bp&LXT-* zXsXpcGTyqleKGI88ihtd<3DEU-2D5T{uX@=l*26O$|&387yDLcepF_h4g7)f-OJ#* z_HQ4(Z;yop%$yxwU$x2H?i=~;SPaH2j6eQ9K7g;1vMIC!ZvNVlstz#D`AZ$Vrt04K z|GaE!2_B@T#w)9QVc)R-aNWu{2T4qHpA*_zTag_n!GE3LWGBZmf=(0jbMF>de3Q z75VdnI{5aPj`9CKl8#aLM#G)vTKtx1aSVosIr818h>oRRWd2&N+^vTMTnF4fa?W2D zo_wLdkU+e)gdN7t)MTrz#)%b+XCAO}<&NJNKr4I*8uruLciY!+E-Tgz7`Ynz88BS^ z|9#q?l^ajLQwtdSctoA{ z=6U{6@%@8v%#0#UU!a`gDCgAJ@5-)hQY~J}hH@PEvat)tODUZkg`2ls0t`DhMnM0s zya^2Iqu56bn#)o<1;R^=e5PHu;i4Sz>DZrvp|^azUPO^fA6I)>V1&Q+xbY+L1M$V7 z(_24V*1aPwk!zut%=q^#-ScHyk{qmQ%pZ?_+;i5(eu75KF^pErwWWuGUudh?&L7iT zm3poFLt<7SR{Q+Dr9RG;IjODoUH8-)+Gs+JPNEz^QymzLXj%F1OF?`siF7lMXgj)ks0i7sdAz(iC1$%W62`Jvo3Awe|1_-?T3D_37^(yA)G zo%Z^Gn7@+4LK?^#8tPiqwBRXCZ+TC32=Oe9%|bbHrZ)f>_Jv2rKb`OEWlNh02}Df? z14D~{-~7;uB1d-p1dP-{%$J%*8z-!G&v?AwAb}AzZ3ztZW*WV1)!sHPu8whS7kXbC z&XCQSZ1dQYY^I)#*YuxMG-Nio@l7;f27!j!+1Ay*EA;Mh{p;Z9Yf1Q?xYeAHyuNR% zY6WL6xGE$NG&AdKR<*NOlVAIHoPGcpcmui@10Bd#FkG(}en-8={~$VW*^+GWc8g<1 zht{J84V$NZLq+^v!5e3_FS_P^V#3U!t%vfBMAU|RWDHwd%!~~8?}$AzYC9PAm8P9i zGkZVke${gji2qkCbsGOX608c|GAeQgxUuExOqp+b zyXvf6+?_6dO2OoGS=dcYk3N2&Oy9+CR7N@YiZi3mMN+mOt3F%&)jO*|qx&j#4>oK$ zVF&6R9g1ELT^sfV;bG&1uSABfcBex}PCxM~WRs(rq7`7h>Q*RnPV2$Tdn{i)_rMEW z-sjTQlK}v7-y!){SZnCc zDZs$LvIpCf6KyWL$6a*Z)zW3YKEXX%^b|4p^5uEW-VWTz+v~}i+v@`(_oXRlAi-hK zP&*$TyBN31{T^FE?h4DmGCna&qfd5Tyy8v+ff4no{IzC@RnFGy_jtc5SjiuOFQ`zq zg}`w9>DhIG>F%vR_6r&@0@`ghTZ7mb(UX`IXzrPF#p8!;&R6_1Ev5S2 zXkgHP$!*>@a#z^;<{!p)Z%Vu7o|32-lP4*K25+kKbcwX`Bj#rc3^W>TIu062aN1gU z?aPPbum@uVbq$U7zo1#jokCSNm2A1>$Iy^&^3J~-4XVFD_aM=rBC>;ajN>ZisSSPw zLw*}IP`u-?$3dfQ7N1+awDd=8ADLn5|E-oS`m<3;$f6(0&q9PkjY0zd2qg{AHi!17 zm)9(@_x7847o5Mr2$EKX-D=C8)>`5G<~2pET~{!&SJ@c_#4I<=dN5F_f`0;IYMe- zy)H;l0rhI~+S0G0s@&n67O^0uj(beo3p(^{rLcomGcA!dh39+Xd##uJmi+qY5(QRP z1BUy1;ScKkpvAq@KlwZD>sDFZZO`wMgPY;kGR0Tb)nC3e_>QKWGc`v!B_MV0Ro6ai z^~S+;lq0{UFf&V&AjcOrg-24C^CoD*!0q4p!sfP%+Uzj4`m|??m7lGBZAsMhxWx31 zzcIQ?0XKCmJW`bDGBE7heM(jR>eF#2A_N9CQpDuKTmBC;^kVxn7ykCuXQkc}H2A8y z$@Cx+Slr2xjC==@Pj1LfU5>DLMSVDD`e(Wp+)6wokse6`h?vY?^wg%452i4ksVsy!a%ENk}X z&4RNY?I>u34%8OX5aqC@)xv-1+A==0HE2+Ncucf`kJoc{`~ncaU-fnTm82J@J~LX< zK(^^uHGggUdrjjCjYj?o40V8h>i@no!WQx8kAZf?ui_YT3)H4y>7O4Jo)31Q-mB|B znnlJ`Hdn^n+4y~DR42gO5dQfP8ZWx3Do+8a)$Q{j?>j$;)aq|d{JXNLzuNE*^J2og zsAcnSQ{8$MIY?ND`a5%K+59CK5p<1z)w+j-CFm5KJ>V;bvw=G>U+HMsICbee&1ADi^E=N7<(`zqwrmi#qLPAC&#z#bFAjg zIvXGV8+hhDX5Wo|%CVtCv4$a9G}Hd~eU7}hmUYjKcc)ric(u^9c~43~e2CrkeHrcf zvpt3_@42S(W4CbqDEN&k-J|fm5;5oh#B~_1_cZF?twmbnQv-)M%=p@vDQ5TLh@zM4 zPd|EGD}Ps~&40WU7~pddgG5*!SEV?@Y3!dYq_K zf<42AsyXbaqt%&=jE6bdmf_LuO#X6>tfD3x3xP^n$}3w2YKJUVGCG8y#W-n6Nin-q zQ&OBR54o99SfW-vl$_}Cq_`W`tLL%}Wd1laJUJz4kUQMz8i-p|0iLO6_MV%uPQj_O zXW&qW6QeVKBm^Ux+nQ*LPj%Q_!T4qK^708l;#&kLeJ{--{HGikrZDhU9zMLX7VMzP z9_L_u3nT#J>}S9=``j#IC9(`anO##*W}lleQd5e+q}kdBY4$k^1!*KnTgF-9Y>s-a z)MO?iTc%i&(=7E82gfJyGaUAKv)0tG6Sj-XmK<+$p{8au8~hwiEC~+D=IV#deDI_~ zA(7GjxS=XMO1o+pk4COXKgaR|)RJgjN^JSzTWS?y=!#mK?Tt^B{Ldy2WEnOtDx8YYaeaj<>krI?WbWQvDdeyBWUs z&>K=SvSd&1>=vMn5P}s6*gzhe z19??+p?a1SdjQqu=B_iLJwY*Ak@`)uSNZ>dWwyXMcxK;yFs7oZgc@>i_1^xcY_;~& zn?o|qdGo2YP{eQwXx1<`^2ar{EDJWD*>Amq!<@4>GIhkqF z-IrAkb;g4h|C*6+ptla}9kZPTh_cVkBB4e~hS~IX7^pDFA%L*j5>g%Jgg{>2=P5At zxuVnMJTkCEIg2ER95TS^GualHht~;$-g{vdA2}qg3~8Lnj?CuG5UXJe!(N18A$d?5v-FFNF zrSGMXK#X;)a;yos;sK8*)12URC0POmK^h}3M{KX+9*p3EdAV!E-fI{j6U~9EmLuE)haA_a z1~-;~gTs}I@5~_ZcE%0Dgu{%V1y4keuxin-xD250Tu-u?oU|wi$(LZFdW$9p?-i^@ zP7?yikX-}NW}llyzA#9+@)NM2lV|r8yEB~#5+3k8{97dz z(>d7AQnVA%--0!`PpA(P7v7#~XUKLW@%zw;R&<+v-DY$v#(Rk6UM- zj`?qP%%;t?wNwQ18&Cz71dwhOMg_HC&~~TBY55x_pzwtd3$jH>%-{!b`iUMTiRpXg zsc?q@Y`{-6=+o~WY>UZN*g{U!ee?BaihVTqVJEp2No&b{@4kGuUmJmw-#u8L9ODC2 z%-il@;k_`!wWCJVksQY?Za0#}0XS)y7`t1D!lVrP5UfG(#Q`XDlmPM^*IE}0(s7+B zND|rIOwQ@2^gY~C7`Vr0_YhFBqku|!$pG^D_BYVUo(EEF2@O)7qW6J|0waR-VBw$M z|Iod`$>$1z2l8KHV9(k4^bV!F2(5s_QM=*2r}s&2}+6$8fXM{ctYte z8+0SXDpXF+6#s9irltq62&*lMXdXU*fp~N8kkor2f^N~4*eXLeA0BYJ=9B3r8@axM zytl9kEeDB}9;dY)_EcL3n-Mg|+v78x7#%Fh2^M&HPSM3QJ;j0ysmEb=Xo+;})5Mp6 zn1@Ve*zdrCkU0g>zdqr$C(#Y-SA*b`-5!?fa9WUf6}fo*Rx&c1ws`%@jkF)L{ov+; zmZ&bdt|Jd((DJ!0t^;UNlA-=O158?Fu+?&q%N{?_mTq%6>LIY>Ts#F4g4LOnWMMiO z*)tmw{>c>Ck(z{cF$Osp)Dn;`F=MJ=9UL%4Z}d1D!hj2%4Lx08XOm*bcxt1AlxM=% z2MfEChJqkzD7rFD5G5cK!lIA(l9MM9x$p!;M-E2-CHg!?`Moq42<0>!*%n4y5tW-( zjtS1mhYNEE!D3h+fkEkWh4O-OB~j-Qa!c+8p-`A_~*U_*=QbtZNrIIEI`Wxo)12qNO!^7GeM!9h%$l= z6WR3xS@yXIj2lwAIHnP?dksr1ZUkfjDxK>|u*-D^;^03~XMAG9f=b1sd&1wqc~~tT zcGUpvy$^x2_X3?PxE^yBN6B)Oe_wjiH@kvbKSl3jWDvLw?a2vPP)`)|2YD*W3)aJZ zOb|u-TnXx66U%IWCzK_9-+e_*3I_^4KJFA+XCFt+eILh)GuDV)mdqSCMQ)QRQ7&a$ zeNl+*wQMOpbbzK;(m<#jJcL-0jdII{AebxA=2Ta}RVSa3LrchJ3ypGe-9aN@78o>; z^kL~E1lajpp|7!H1hyhy6=bWKV(BV}K%Bs^$6|by>;vdjKH(z@$YoRrC&wA2ImyWd zYvH-X&@Gq9-P-N~?E5fdq5`iw*lkX5U=pcbC=Wu(ifGI4D&F^H^j=B9(0d_h8w62s z&N_oW=MBcp!AB+J7eR@CMUkR^B;YkUZly4zSpp?@b36woIj%+H1~U;wxJ6aSNG(?& zCenyne8SzI=6D;@xp2gRMz)*}f_KgvqTbn7i0BZzO#+yO_5iqOCt}nI=GpYhXfdWw z?X(+OrGhlJiO% z@3TArHa=JP)irX?+rS{_jr-!^odts4dm(H^40l{?6j57%CdhtOc#Y|NDUZ>+-_5gKCvbhG@ zqQF)=fg+j94;*^=NS~`N^i{#?l3O@d$sJBH*@{R|F^2Z75Ej$p?SVE4QX@m8W`=+X zTxKv+aM@DbnrD+|APYWoF%V0W-mS?fEJ64Lteeq8BjI2RlydNW44ix~g)&4nhNRly z?}g{_SlodcGuM;gnCp&U8Z7^kqn5BHSw)a|ZAuit{=BI;5@qM* zgrLDJ$(o2|Q*1i|rGAP&A@?1kv%-y7Tu1^TO%XtX1h*{>SwFg1{Zu&SU~1w(3cE}J zoqmeaWuhoRc{v3GbI7DmFxEuzYPYrpR;;FJ+pon=akEwqCR7Z;WT7%#le0*d$k-}S-c+}I zKuV*r$axPtVa=Av$jqE~VQ^Ltb}qxwG3_o^{tyNVb8iqC*)SnCKE8oDDk3U6qCrHg z0j)U^TMpcKU5HzdMdn^CJ#ygHo(??pYR`Bz-Y`5?4!~1@=@`G)eZZXQn+iWRju_lAiiQCq(Q&)?&#o`gR?qc73 zstf;f9}W7km||lyzdhc@?E)x~3&FBrhS2GDPogu`gUxW_r7rF5vT!l>CR;qI7%-4% zNMfA81v)40VG|w1PCO$tuIYAkw*SkRVdkUjX;-CX95Qghuw*}?Ps+4*_UXP=AlD%c3*+x0-~ zdx>d5@ZF2|)xW{`zMex}<$R1D7>NkxKmxm9`H(0oIWt&HE5}Wm9;o6`(E%FkF@d&}k>4 zqXjb{nk*>9G#wFM&^Z|59ZuPJfLX}-lki*G*Kq=f=kpXe_*@A=gLxI|0^1@$DbGL^ zg@HbB`XN_nMr!Wj@CIu_vB9QqHn)gKK`qaO9}G?fqr4TmlpJ)m}CZiG=vXxM_asbs!07oedGLR`TKi&Y-8Z{Q2%1>f40 zT_Sj7pNmQe+tfbaAf^>!KTysIh9C$as=#M6=EpBJw;O=OH<seJYsy5+8UVku5HDppZP+D4E1z zF3Ao151zd9nN)$u=Sn1RMelJZ+TxIv<~)WQjF`#8c450UF&3ND9Q3E-+mLe}8ZoLotxT$v&8&vnN;{|aCQxtRK9qQKGjl5r+%Ll{^tD!GEm zuK*-j?!T}cWGF4iHKeCf0!K~Wj2g%>dGx020!g6_tl4QfkZN~aR?!Z^E6dDh0#cvI zqcT?|Y=ZuudG!G74W32`26ykv2l~nZHoljjmj=$%8X_L8{bjP&oPcej0mSru42*p* z@5`&@C=(2FTzgH=ikvuee1SBU{S4S-p9}2-bIHootEds*k4`~l_{#|QWk+Io_fPPG znT*9mbS)f`;Aj*QHg6`9&N6Qumyl3D&eqTtr{%31Ma2ea5?P2$oQrh0meTeL;E&U0 zpL(9$zdY7F_lH45=qmE-;!G?B7zMTg-?TQ6Rv{-|jgb3ZM26dJPqs4K=@wVv*v{;6 zGMf<2`4Tqc<-Uz%D0ZaVK#=`fl3D-c2H%R06r!^$M2Lk2Oq)bIY3?MP32r;K28vfQ z!`Ulx-oaSzOiz|*v6aIuzKI$k7E;1v*mIKy`iLo3l3>>TqD8?m;$Q76BlR^cihmmh zXlW%+Xi$k0-4gQ#G$?zC*lLEa!y=sKmTpc!Eu#_?on+7ovg7j_#st8`R z_l?|QA3Qz_Wp+E9c(t0n#HV(QaIm4vW6s{1#;AbFe`KF6$;knietjQfReY#~OAt}J zbo27_KmoLr^Fi>-c>^2~djy-@=FkFoyC(IFW5T#32`6NJx;5+toS z7nH$9x$M>kW%jwC3^sxAYe#VKyXTD?r8UJ{JQm%gGIcX><2`C@1r^31t3s2@M2bRt zj}L1)L3AgrGzW=S8GhVE4TE`ZBk{n~=r;HTHy0xnfS=KA@CzQa4Roe36~u$6Pq4N& z?vLPLi~vt=PYFD_`8f%1g=CY!aR}`QPO_JA!7xCB`aA`8K3765!9>d8gFv6-S|}>m zrfVNZ2YR0?RzxO8wBbg}_nG4|kz{t*k_US5&1mdi*KYfGJ}jbJZI(2=YbDk^2yQ#9)AT?QjQ4+Y}@)u~RDzUtrPp|N5|FPocAsZ+Yt71nZw#_8qHxZY((X z%7{z$Zx)Z!WZOWzo{K&=)aG*H+6}pNiOibxyelNaiI2RvO1D`C<2!0vyM${maJnrC zHd!75dnDb(4Q(FJuT=SsJYbzy5-2{@0nF6zSs07oJ&bA1m9eDgc%3*UzopR-vhs` zfX{G&;P-uIRW1!)EH#OZY4ElIq_{(m)hrps;QNCMtR=@+28 z$L{ucH)b~cB(p(Dl+12QRFITq&C~Cf2d*j#nky=t9wZl53hLz2z%BFl8f`;|Acv=A%qBado(u~H92#!pqjzKF_ zd5EMS9mVS(*ea&b5#6fe`*;qLdEzQgC_@El1*sBL4lFXqf~Wy>ma%bc!d3M}S&K%7 z8CDw$dsywu^;q?ph$%u%T!m|S3IONwN5vgA_bxco&Jt!my&vxqQZTyh?qD#OOrnBI z=Gii>u977UQ6T_NLEvId>}*a?^le>X^Sp8pF3D^^t_&FP8pGITfdOn2XU7_sfa3aM z#mepx&u=17!z2;76;zzv%$!;Hz>PwYH{VRa>2e+E?QBE=cieeT#jT`wSm?rLa7pv;c=c zu>$~CECZBO%rdMbFQkR9^dwlo0liCN|0^q zNMq2+4TVlB1Y+w5Yw$^xoLJ4eWj#KKssq}|(N)qY8%NVr<;d=VZ_jT}x9NKk*gRz* z?0II$&J(pcXvb$KFV0myFmS8dP}YXW`vHYM095)Pw0yd1_kGmM{&3+cfzTOHnP-N= zJWq`@hA?DaxM1dM5WUOS(Y?UOdQW-rU zCTk8(9z4Y8KEPcvNu?RA%m*^8MWb{fRba*afWXGERLyLOazOd2H_Z@bR$3OkP2JU4ZUQotzf8=2_^)&h5t%+-8>YSOA zaZU(E*^%jRG${TONKIsdP4#=IsK-i$s+1zkQf5pfUA;YEt0OkBbW*kOdOdZ3t*sIe zwF%6%v8l$LUO5sbG@$)5T6%4L}?FZgWerCnb5=?KAiHRL2 z*m?%NctVW`{f6A2+FO(qpiPh^mUufrj{b~`n8^Ggnww{otRv%-oCl;i48C~Tr}ts# zlmMn6O*q!lC~E-euQvLq5!GeNfWqL%$d=o83|=w7wh2l-n(aIF4Wdpe4M+@5#*MkP zpOx+!HUHXvHtMF%mD?uyHqS1L7M^=wbtH_WIqVkTAAZ-i@lO7AO47Tr%cUrJXuWQ^ zzI(z>LcE^2Bt+Yidd{G?)!86eM;Y|Q;F~&5d+6uC9>kH_XwI8v1?MzLTVm99ro|Cq zOiIY0xWYZb1=Ak3h`@VD#=dabyLd$zJeUe`S6P=7TF0HdW-gD-HmihF=et(mQhK@= zjg^eQT9s1dhQY7(4Fh|q(F}iN7#mb{hgyw^a@EmNy6aGC!9>=&u##0*)D1d(Rn1#2 zdFVxrSz6%`_n2&=%=&7;ZJkXxte~_-MvP9?P~z%0I&u=#>5VK)EwB+&RvR{T{6K{< z-cg>JiRF-1e^<>^xKT)+SyE8pbmUh%c#-5lOgRr^b6AbQqApt%3D_z|kBj#oop#Xl zB9VezFlPYLURCOUP?!aW1mN=7gA(3;qx${g(Fm12zBTiCP~j?$5Gr2@1C-Jz0GA)G z0=QODw4(KUbOZQ08+hvI28%t8LG-@y&FT2cfCcC0OL;Bqk56Cj#a@pF$nDtT%qen% zG|36wNea_zyeq6ogQ1Gi(&8s#>JkB7M}bdwOY5@!r@9F~;YR@bncHvT%NGB?E1zr8 z?zTC(WzSDy@>ml#Z|v*F_u;cQ^b9Dj!$m%az0L%-`?BW}^*M+cB?hBAZX5f>wH`w0 zd*aoQ_0b&K;kvJS>VC5e!xbOV$}AJT+uz@hJ|AzzIjP>Y>kxRLK#Lsn@!QMI;5*JV zzVTq}A_A6ncv+FBO9w3IZIDG2_Ms;n|!=cEkhQ5=st z{GhXSp-q#jR+k#f1$(NqdI;?mc%fAujt?xzuVc?(V9El@iVk?hlX3e1<6K^o=t1lGdEI8%DT6&OnH}V?W%MR*Zvd;NYxo|f0 z!d?&*9->?_A&n=rp2Hzf^pbUojSkm44bYW+^246e&qQ!oD^I*W-M($K$qlM_nick@ zNg|*XYv9zltAW>gq)5#>m$_Drrl&W2k_eFgZg`i(xAL;V7ZXl4u;Pm0gj#e@vDqsy z@*GcZq8H=F@$3HX^37mvyE`a;oh?)JO){&Tc+K+mw=Z%?E~#=ox^(9JsJXXm#xNpkl3|2b!nhX3}0|k z9SPkaP?F3$V43)YWS#}fG%)2ZXBo(15vHY)TgW6o9!kYZe>X`+Uw?}euhT{-FMUfT zd@a+ai8VtDZbrRX2C1~KJRi?J9SnD{N7&r&*gb!h2h3i1DxE&|tEH&2=GRv)8XO;w zr)NACfKAP5HgLxpmzR@9I*4gjq%uvi?Nl@hHVlBJiR)MswY^svL|^5OZ#s2&x!iBQ zh*M@=@|bCrG{sSMCxIkfD_$g;NflU?E>j8bAlj~{&ZLWf%|Rj|w5>>8Jj7fwWzoFXtef-A5z zn%Mhhy2%fC3hFjD8epenFh) ztEsf?!qo!0w2R8#85Urwj1eI5WmRbfgOZj^U?~x1DBsz7tD$BGSV|_alt}6Jue+Q5 zop^~92N;oC*m-8bI>VrAf=FDK)9;^wmLHW&q>-77^f$>AyG2Md!Q!kM zdMh-`pgXY(65UiZ8h1IQAjYZ{MaSbwM)m1AsOVmH&??xvL8}!-nqI+?g2tQ;x^3ng z)gasCxilfmlxdsuK`BZmp_?IS^s(W^L;`6l2T=+#4)|W{>xrEWiw9m|WhrUF0b9N7 z;7yR)-lJoX344vmz}3XH!meydxsZA3QkOg@>R1@{wPwPPI`X7onUB;&6j>)#CxU3{ z(I6=i#xH#$k!|yT|5LV=zx?B$fBQVD!2~;5=LtwHCyA?wRQmYGmE!^3C5{e!>19V* zBk3>TvL_05^fhK>prRy4WGhw~sYqp`JW*kRcaowj_SFrmLR{<41Z^EJNE1hI$A^(K z8hK0{B=Whv!Z>9A%SKy^AY z=qvddbePNGYLXp*c1VN7cwm-i&Axh=ls4q*M&U!1mfAC;3T{PG3rkq3WT(PbY%Pdv zRM0+(7k{i9dCy|BAdNtwImfrEnS8BV0BBS-mtPdhUv*nGs*;4p_Fu^?AtM@rre;?L z0#~nVjmWu0rHIRtupw5L_3G(#qN}&hlDLL+$?Y^(sf+?%RGREMD)x#VX9AmKAXcgP z0Jbhdl%0p;ZmGoE?j;0lc*dG!|DMp3t0eguzU)#|j3;J5R^yTj2viF2X=( z@f&Pkp{TVgn#l*{>F%VCtbRMa6!`!|r{F-PC3K!+r8|p@ES_4(~^E z^Ew1D8;}r3g&(nzkb_oZ*E}IfqmZ{BR1-I-2nVY5?26GIsM$U~qY{!^@lq@Hq;7_g zmU_Y(+Y|C#fR+#0K68L2^6+6R3C|gI3s$83bjIVsWBWP9F1yEPua_z=q&o5O zN95o^f$!D~v+5pG8u4hB{2jO4rMpw=x2gSPkIsJ=({{PI*M2-dA2?&jGZ>!N@bGlY zk+k;d0sCS+HSsRb0Pb7e59%gY>&LZ+f#HKyr8PMuVS!2x14h=Bq^hcgvRbW0s+X49 zM5u+xXiV|@owuA6K$=k^KKJox* z>+V-P`$c=i)`>4Xv3B^lZ!&FfZ+F9|U0aOkWeQYbsY$k~icX_jyk1=Av> zNy)_n7oym0*)A&vd!uR4oU%p&;yEn(K>m-L)f*-sc7Mr3s<4ls#*7vTOp8z#e^8vc zWI$QT${Bro5S;+|su~PYK>bSI}#xNiDns||;nELDUn4bpdOC~92hTybA zv_YaR)ct}yHOfX~sHto+s?-F6eMP*N%0sY7hn2crKD0ZNJ~*CaC9P_wNpg|m42w_p zzW$zlPPZjJ8_SkQ-WbLF4j+?GcmMiL?nmpHlN|k|kXUPYqMUQ4U^v?HLG{e`WQgbIcdGPnWv)2y&RP14yW8o3Hki$OGK z5o{>}uqC33j7S-fo zpjVn4xzdIUxK&Id-xF_z0!Yp7OS_RdV zO_;6Ax(b5~T#0fHuY}C9hH@o&pksr)QfCUBDsUC$s_Fr*V%q$o8me0q;B{2HaR^_x zLP1c+SMgt3x6)5dy)^$p+ia&C;M)W(fexPZQ{F{69$wIN>$uNbRa(KP<8fqJk@F~S z8i(X(S>=kJ{Mo$s4mnN0$;(Wp0-@2ME5h zc;dSHphzW?VRVQh^f7FrWxy%cu*0hg`Y!MoQOaeAQmi1#DJuB^t~Mj++Jsd#l$WQ$ zVhQYv3#p=f$mZOZ*A$$)QyUZgcbhUO;{wLaP9m|6 zw#5O&{_*iecPINNJxYAKJaO0S!oB`iUM7`=;^~ERVR=F5;c0hg$MpmDCb#9pv4`$? zIfIl*kkx3qboIE!-a#}$a_k|T-S9H=Us$A=pGea+N0j_9lG4|A=QiAD_v;BtRVP?% zGSC0@D}pwka37wYAOAdmIG!G`ze~J7!BI5@%huP`Mq!B2RtGjx#MTypV zwOAllM|Glz=+zn}1{(Vm)Xfx1Zz+EKm%NRe_FBa)a_-K7Dpqh;_NwEbp$ z06`P4#-9O-Jn8_R!z!p~-6G={K=Pxj6x&^5LCtZnT&B|xxS`;F*-73*W1!pJ?J-Gu z;cYDQJ2mu`U1x(%9aZ6ciVO>Cnjom7iXb}h@XLLGdWcyi9#ytyz0o2++6N;p8!;t$ zCb21>(UQjATUMC^U&VCc9Nj=Jvkkx{0_FH9F3(+n<}g(Mj?!#A_Er<1mN`#{Dzm7> zHy8{8CO_nNKJ{`Hr#7E|A2j!pNlJ^7O&<9B{5uO1nE}Q;&t`F9VSB^Ik{8%zH21FH znEVvZm1<(kbv(;n5)&>h7A{EJj)e3ra0{wz`^8lvNm86?qdW8PP3a;$gAN z>E-sq<;7)kB13(7C^_XZvz!@Sd4uYBzeK7rHCoDq;TW31!=f-BcaJwTd~C~T9dg%i z6G9yCUa(M8pC-qrKNm53y<-G~E1QJ^>PCA9hl^NT;%^~a?nG&itsKi-S%oeUwVbo& zT3W;T8%K`lJlE8BuR9e?*^ny<)f^L=t?F;y-_2IoyBDx#$en9fH0XG{TVC*9gQko! ztEk%6$Jq@=v?X!RWB?DdmOje_#mGC`F@Ua?s7eH`J>UWlZ952ymWiKu-e1CfAfs9 zoYjT*UPWgwluO!Gh4N~evQjE=`sFI@vmP-Y&q@i(05i|^b5v);ZI9?I(@)YA4Y^JN zU1IsGQCVxDHWO$)AN2^;->U+(4Uy};hb`)Qoz>Ql1T7fUy)m`vM%C=PTC($5T8#41 zhv`k1Hm@B3a?B_0jH>Y~?laER5`x0^QjSV&tEr8PR%nj%3FUYL?}C~&4bx7QB~7n+ zO!NFC#l>Y;m-b@rt0X=vcUqP7Xr^yJMyc?P{G1RAD)yhLw}`H6)|>k|e@>K>EqRaZB+Gl~dF!5Q3JSf&EYSNBYTMg^ z-*HXV9W!Fn43Od&CiD~B5|hP}>S{)%8)OoB#_yvn(43Z_6fskrW|2aEF_oJm^<}{= zYfW)wsw$^@!s4{jZ@R9Y?MFypZUrfk2bB=%Tl2wRGQ#riVicN_@y@)_TR;vV;4wPDsc=*9Dh7P)FQQ@+=qiS)HGYvN3#YX#15>gd zQ_X3l!^~)sjEf~9s7gdjr1F?SxQip)kzpAqXPn9O?ZsKS%$Z1D=4uYX;ZOqg7^;$A>c$&du9E4oyB#HF1jVo&X0Ja#4~b z=cNVjJn?JE>&`zJ~YhojgL%-(oKy-uyAb;Yxd|0551AEianZsaVNxc4rJ& z9v#Cqtk3{qMa=!xFkJ?jnW!7jP1Y`K?%-Z79z$lX|1Hb&X@7p)`qh=&;g2E>Q)`(kGi-BD|$wf~v%HF%%8fa{u%6 z5kL!QD>w54xwwJ7)Gf!mt_Td4GDp}@Z)pi^` z2r$VBs!5943njN+xiZNQImB$k~2m9?65o~Qj!6-IKlx+8dn~uxpnN=>4P=Ntayc5P-uoyT3=^;kr zcmeas)f)VEiwnXOM2NA&tGXQkTSuu-@jWr_=Q0ms;iNBU=CD{0$Nre}kObWv)|wA* zhD(c0Bbz{1(N(1`trqAK(fWzHR%c=YNhg(Y%6QdO5%I!zfu!!XKB?i2T;+9H86|hyMouBtlPvZOeZ0iGg5AFNt)b;gNivcbVscfRD z7gw3vm%~Li1}Ug;k+tCMfxZop{;q;(3j%1Hpg5wITMI^s7dato{8$Ek{YKi(&4F>j z#}%sgPP{#NO^+(L%?X|fEL~4*L>X*oH7xD^2g7GJHlrE5%?Qdi0g?DJ;=H}zZOotl zfW<18;3_b*ta!(4=tVv+_xIQ%$s1oP&l~O?VNy3V?%eNoyTAYOJJ242_Z1`)W}%wG zK+1G69<;0832YT(;FkNXW9Ug&2g4+#%$Ksv|E`u#1HoS&Wg*93rT$3`&yVK~2|Qji zfXjJ+&SC8c(WF(_0<=Wb?(w7cU0oYf39>eprf^!!hypb5cLMq88mr5G8^%;+I$(Va{I;iSGw>ByD0csZ*n}yNlsREwE+NUCQk(5WZAQsS3 zIf8lqp0xEIf>OMd>WT|~E8!^~4yeX+dqGrH28gPd4nxt6hO9U2=>J5HwLVZAwk}!x z(Nk1LqVCHv4l_}{_&SrdA>OFdTqU=?*nG-pCbsQA-ZnfG>W}Tz2_}dM5+TCY1Qonq zz!?mQlbn=bl0u*2(nNG;?tJ^Q7j3WpYK25g_AcLG=%$0wr|dyd1k&7jdq`Q2R*Z_U z7AQQ-(opm{eXWFzEJ_EQluRHi5wOH_grM!PQzt1mk$flZ2u3C;>t-x8()z9^P6vgek!aYZ)SmDIY)D9O?W0ol*#4O>440O2(0 kJ!pH!51{TPEBdHO \ No newline at end of file diff --git a/apps/dashboard/public/vercel.svg b/apps/dashboard/public/vercel.svg new file mode 100644 index 0000000000..d2f8422273 --- /dev/null +++ b/apps/dashboard/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/dashboard/tailwind.config.ts b/apps/dashboard/tailwind.config.ts new file mode 100644 index 0000000000..c7ead80465 --- /dev/null +++ b/apps/dashboard/tailwind.config.ts @@ -0,0 +1,20 @@ +import type { Config } from 'tailwindcss' + +const config: Config = { + content: [ + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + './app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': + 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, + }, + }, + plugins: [], +} +export default config diff --git a/apps/dashboard/tsconfig.json b/apps/dashboard/tsconfig.json new file mode 100644 index 0000000000..c714696378 --- /dev/null +++ b/apps/dashboard/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/dev/ory/oathkeeper_rules.yaml b/dev/ory/oathkeeper_rules.yaml index 40e363b4b9..62cbca321e 100644 --- a/dev/ory/oathkeeper_rules.yaml +++ b/dev/ory/oathkeeper_rules.yaml @@ -93,14 +93,7 @@ url: "<(http|https)>://<.*><[0-9]+>/admin<.*>" methods: ["GET", "POST", "OPTIONS"] authenticators: - # - handler: oauth2_client_credentials - # config: - # token_url: http://hydra:4444/oauth2/token - # required_scope: - # - admin - # - editor - - - handler: cookie_session + - handler: oauth2_introspection config: check_session_url: http://host.docker.internal:3002/api/auth/session preserve_path: true @@ -120,7 +113,6 @@ preserve_query: true subject_from: identity.id extra_from: "@this" - - handler: anonymous authorizer: handler: allow mutators: