From 013902a2e5feb91de0c852ec079fc03fd579a96a Mon Sep 17 00:00:00 2001 From: Mohammad Shahbaz Alam Date: Wed, 20 Sep 2023 14:42:49 +0800 Subject: [PATCH 1/2] Add more social options --- .../aggregate-verifier.mdx | 4 +- .../auth-provider-setup.mdx | 5 - .../federated-identity-providers.mdx | 2 +- .../social-providers/apple.mdx | 4 +- .../social-providers/baidu.mdx | 81 ++++++++++++++++ .../social-providers/bitbucket.mdx | 81 ++++++++++++++++ .../social-providers/discord.mdx | 79 ++++++++++++++- .../social-providers/facebook.mdx | 79 ++++++++++++++- .../social-providers/github.mdx | 4 +- .../social-providers/google.mdx | 79 ++++++++++++++- .../social-providers/kakao.mdx | 4 +- .../social-providers/line.mdx | 10 +- .../social-providers/linkedin.mdx | 4 +- .../social-providers/microsoft.mdx | 81 ++++++++++++++++ .../social-providers/renren.mdx | 81 ++++++++++++++++ .../social-providers/slack.mdx | 81 ++++++++++++++++ .../social-providers/social-providers.mdx | 5 - .../social-providers/spotify.mdx | 81 ++++++++++++++++ .../social-providers/twitch.mdx | 79 ++++++++++++++- .../social-providers/twitter.mdx | 4 +- .../social-providers/vkontakte.mdx | 82 ++++++++++++++++ .../social-providers/weibo.mdx | 11 +-- .../social-providers/yandex.mdx | 81 ++++++++++++++++ docs/dashboard-setup/dashboard-setup.mdx | 2 +- docs/pnp/features/custom-authentication.mdx | 7 +- sidebars.js | 10 +- src/common/docs/_federated-providers.mdx | 6 -- src/common/docs/_social-login-providers.mdx | 90 ++++++++++++++++++ .../docs/_social-via-federated-providers.mdx | 26 ++--- static/content-hub/logo-baidu.png | Bin 0 -> 6961 bytes static/content-hub/logo-bitbucket.png | Bin 0 -> 29386 bytes static/content-hub/logo-microsoft.png | Bin 0 -> 815 bytes static/content-hub/logo-renren.png | Bin 0 -> 7614 bytes static/content-hub/logo-slack.png | Bin 0 -> 6297 bytes static/content-hub/logo-spotify.png | Bin 0 -> 5836 bytes static/content-hub/logo-vkontakte.png | Bin 0 -> 4623 bytes static/content-hub/logo-yandex.png | Bin 0 -> 5706 bytes 37 files changed, 1087 insertions(+), 76 deletions(-) create mode 100644 docs/auth-provider-setup/social-providers/baidu.mdx create mode 100644 docs/auth-provider-setup/social-providers/bitbucket.mdx create mode 100644 docs/auth-provider-setup/social-providers/microsoft.mdx create mode 100644 docs/auth-provider-setup/social-providers/renren.mdx create mode 100644 docs/auth-provider-setup/social-providers/slack.mdx create mode 100644 docs/auth-provider-setup/social-providers/spotify.mdx create mode 100644 docs/auth-provider-setup/social-providers/vkontakte.mdx create mode 100644 docs/auth-provider-setup/social-providers/yandex.mdx create mode 100644 static/content-hub/logo-baidu.png create mode 100644 static/content-hub/logo-bitbucket.png create mode 100644 static/content-hub/logo-microsoft.png create mode 100644 static/content-hub/logo-renren.png create mode 100644 static/content-hub/logo-slack.png create mode 100644 static/content-hub/logo-spotify.png create mode 100644 static/content-hub/logo-vkontakte.png create mode 100644 static/content-hub/logo-yandex.png diff --git a/docs/auth-provider-setup/aggregate-verifier.mdx b/docs/auth-provider-setup/aggregate-verifier.mdx index 22a70d6fc..dce02a128 100644 --- a/docs/auth-provider-setup/aggregate-verifier.mdx +++ b/docs/auth-provider-setup/aggregate-verifier.mdx @@ -21,9 +21,9 @@ such verifiers are called `Single ID Verifiers`. `Client ID` field and click on `Add Sub Verifiers`. ![Select Google from Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-aggregate-google.png) 4. Next, create the second sub-verifier. Click on `Add Sub Verifiers` to add a new sub-verifier. -5. Select `Auth0` from the dropdown or choose `Custom Providers` from the radio buttons. We're selecting `Auth0` in this example. +5. Select `Auth0` on the dropdown or choose `Custom Providers` from the radio buttons. We're selecting `Auth0` in this example. ![Auth0 as sub verifier on Web3Auth Dashboard](/images/dashboard/create-verifier-aggregate-add-second-sub.png) -6. Select the `Authentication Type` based on your application need from the dropdown. We're selecting `Github` in this example. +6. Select the `Authentication Type` based on your application need on the dropdown. We're selecting `Github` in this example. ![Create Aggregate Verifiier on Web3Auth Dashboard](/images/dashboard/create-verifier-aggregate-auth0-github.png) 7. Select `Email` as the **JWT Verifier ID** and enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). diff --git a/docs/auth-provider-setup/auth-provider-setup.mdx b/docs/auth-provider-setup/auth-provider-setup.mdx index 423a4baf8..ff1fa53a5 100644 --- a/docs/auth-provider-setup/auth-provider-setup.mdx +++ b/docs/auth-provider-setup/auth-provider-setup.mdx @@ -8,7 +8,6 @@ description: "Auth Provider Setup | Documentation - Web3Auth" import BYOCustomJWTTiles from "@site/src/common/docs/_byo-custom-jwt-providers.mdx"; import FederatedTiles from "@site/src/common/docs/_federated-providers.mdx"; import SocialTiles from "@site/src/common/docs/_social-login-providers.mdx"; -import SocialViaFederatedTiles from "@site/src/common/docs/_social-via-federated-providers.mdx"; Auth Provider setup refers to the capability of creating a verifier with Web3Auth. We recommend you set a verifier to use the Custom Authentication feature of Web3Auth. @@ -19,10 +18,6 @@ feature of Web3Auth. -#### Social via Federated/Identity Providers - - - ### Federated / Identity Providers diff --git a/docs/auth-provider-setup/federated-identity-providers.mdx b/docs/auth-provider-setup/federated-identity-providers.mdx index 73b64be3b..eec59529c 100644 --- a/docs/auth-provider-setup/federated-identity-providers.mdx +++ b/docs/auth-provider-setup/federated-identity-providers.mdx @@ -19,7 +19,7 @@ Note: This will require you to register an app with the Federated / Identity Pro 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![Auth0 - Login Providers list on Web3Auth Dashboard](/dashboard/verifiers/login-providers-list.png) -2. Select the `Authentication Type` based on your application need from the dropdown. +2. Select the `Authentication Type` based on your application need on the dropdown. ![Auth0 Authentication Type list on Web3Auth Dashboard](/dashboard/verifiers/auth0-authentication-type-list.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). diff --git a/docs/auth-provider-setup/social-providers/apple.mdx b/docs/auth-provider-setup/social-providers/apple.mdx index 771112d01..89d18fe41 100644 --- a/docs/auth-provider-setup/social-providers/apple.mdx +++ b/docs/auth-provider-setup/social-providers/apple.mdx @@ -10,7 +10,7 @@ description: "Apple Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![Apple - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select `Apple` as the **Authentication Type** based from the dropdown. +2. Select `Apple` as the **Authentication Type** based on the dropdown. ![Apple - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +21,7 @@ description: "Apple Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [Apple Social Connection](https://marketplace.auth0.com/integrations/apple-social-connection) to your Auth0 application. 5. Click on the `Create Verifier` button. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; diff --git a/docs/auth-provider-setup/social-providers/baidu.mdx b/docs/auth-provider-setup/social-providers/baidu.mdx new file mode 100644 index 000000000..e0407b89e --- /dev/null +++ b/docs/auth-provider-setup/social-providers/baidu.mdx @@ -0,0 +1,81 @@ +--- +title: Baidu Login with Web3Auth +sidebar_label: Baidu +displayed_sidebar: docs +description: "Baidu Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [Baidu](https://marketplace.auth0.com/integrations/baidu-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Baidu - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![Baidu - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Baidu - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Baidu - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Baidu Social Connection](https://marketplace.auth0.com/integrations/baidu-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Baidu` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Baidu +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "baidu", // Use this to skip Auth0 Modal for Baidu login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/bitbucket.mdx b/docs/auth-provider-setup/social-providers/bitbucket.mdx new file mode 100644 index 000000000..e98d9e5a3 --- /dev/null +++ b/docs/auth-provider-setup/social-providers/bitbucket.mdx @@ -0,0 +1,81 @@ +--- +title: Bitbucket Login with Web3Auth +sidebar_label: Bitbucket +displayed_sidebar: docs +description: "Bitbucket Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [Bitbucket](https://marketplace.auth0.com/integrations/bitbucket-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Bitbucket - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![Bitbucket - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Bitbucket - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Bitbucket - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Bitbucket Social Connection](https://marketplace.auth0.com/integrations/bitbucket-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Bitbucket` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Bitbucket +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "bitbucket", // Use this to skip Auth0 Modal for Bitbucket login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/discord.mdx b/docs/auth-provider-setup/social-providers/discord.mdx index dbe670a27..e9f96d81a 100644 --- a/docs/auth-provider-setup/social-providers/discord.mdx +++ b/docs/auth-provider-setup/social-providers/discord.mdx @@ -31,14 +31,14 @@ import Tabs from "@theme/Tabs"; ![Discord OAuth2.0 App Client ID and Secret](/content-hub/social-providers/discord/discord-clientid-secret.png) -## Set up Discord Custom Authentication +## Set up Discord 1. Create a verifier for your Discord application by selecting `Discord` as the Login provider from this modal. ![Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 2. Paste the **Client ID** from the Discord App(above) to the `Client ID` field and click on Create. ![Discord Client ID on Web3Auth Dashboard](/images/dashboard/create-verifier-discord.png) -## Example +### Example + +## Set up [Facebook](https://marketplace.auth0.com/integrations/facebook-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Facebook - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Facebook` as the **Authentication Type** based on the dropdown. + ![Facebook - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Facebook - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Facebook - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Facebook Social Connection](https://marketplace.auth0.com/integrations/facebook-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Facebook` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "hUVVf4SEsZT7syOiL0gLU9hFEtm2gQ6O", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Facebook +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.au.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "facebook", // Use this to skip Auth0 Modal for Facebook login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/github.mdx b/docs/auth-provider-setup/social-providers/github.mdx index 8b9ce70a6..71734f8bc 100644 --- a/docs/auth-provider-setup/social-providers/github.mdx +++ b/docs/auth-provider-setup/social-providers/github.mdx @@ -10,7 +10,7 @@ description: "Github Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![Twitter - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select the `GitHub` as the **Authentication Type** based from the dropdown. +2. Select the `GitHub` as the **Authentication Type** based on the dropdown. ![Twitter - Auth0 Authentication Type list on Web3Auth Dashboard](/dashboard/verifiers/auth0-authentication-type-list.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +21,7 @@ description: "Github Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [GitHub Social Connection](https://marketplace.auth0.com/integrations/github-social-connection) to your Auth0 application. 5. Click on the `Create` button to create `GitHub` Custom Authentication via Auth0 verifier. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; diff --git a/docs/auth-provider-setup/social-providers/google.mdx b/docs/auth-provider-setup/social-providers/google.mdx index 9e376fa45..4d406f05e 100644 --- a/docs/auth-provider-setup/social-providers/google.mdx +++ b/docs/auth-provider-setup/social-providers/google.mdx @@ -26,7 +26,7 @@ import Tabs from "@theme/Tabs"; 3. Obtain the OAuth `Client ID` from your [App on the Google Developer dashboard](https://console.developers.google.com/) -## Set up Google Custom Authentication +## Set up Google 1. Create a verifier for your Google application by first clicking on `Social Login Provider` and then selecting `Google` as the Login provider from the dropdown list. @@ -43,7 +43,7 @@ import Tabs from "@theme/Tabs"; ::: -## Example +### Example + +## Set up [Google](https://marketplace.auth0.com/integrations/google-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Google - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Google` as the **Authentication Type** based on the dropdown. + ![Google - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Google - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Google - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Google Social Connection](https://marketplace.auth0.com/integrations/google-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Google` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "hUVVf4SEsZT7syOiL0gLU9hFEtm2gQ6O", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Google +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.au.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "google-oauth2", // Use this to skip Auth0 Modal for Google login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/kakao.mdx b/docs/auth-provider-setup/social-providers/kakao.mdx index c6e0e15f2..65760c614 100644 --- a/docs/auth-provider-setup/social-providers/kakao.mdx +++ b/docs/auth-provider-setup/social-providers/kakao.mdx @@ -10,7 +10,7 @@ description: "KaKao Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![KaKao - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select the `KaKao` as the **Authentication Type** based from the dropdown. +2. Select the `KaKao` as the **Authentication Type** based on the dropdown. ![KaKao - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +21,7 @@ description: "KaKao Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [KaKao Social Connection](https://marketplace.auth0.com/integrations/kakao-login) to your Auth0 application. 5. Click on the `Create` button to create `KaKao` Custom Authentication via Auth0 verifier. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; diff --git a/docs/auth-provider-setup/social-providers/line.mdx b/docs/auth-provider-setup/social-providers/line.mdx index 2476b5a37..4f02ddbef 100644 --- a/docs/auth-provider-setup/social-providers/line.mdx +++ b/docs/auth-provider-setup/social-providers/line.mdx @@ -10,7 +10,7 @@ description: "Line Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![LINE - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select the `LINE` as the **Authentication Type** based from the dropdown. +2. Select the `LINE` as the **Authentication Type** based on the dropdown. ![LINE - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +21,7 @@ description: "Line Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [LINE Social Connection](https://marketplace.auth0.com/integrations/line-social-connection) to your Auth0 application. 5. Click on the `Create` button to create `LINE` Custom Authentication via Auth0 verifier. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; @@ -57,9 +57,9 @@ const openloginAdapter = new OpenloginAdapter({ uxMode: "redirect", loginConfig: { jwt: { - verifier: "w3a-auth0-demo", // Pass the Verifier name here + verifier: "w3a-auth0-jp-demo", // Pass the Verifier name here typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created - clientId: "hUVVf4SEsZT7syOiL0gLU9hFEtm2gQ6O", // Pass on the Auth0 `Client ID` here + clientId: "N9jnKM2Fo8PFRj8rYM9I7rWX1FW6X5xx", // Pass on the Auth0 `Client ID` here }, }, }, @@ -74,7 +74,7 @@ await web3auth.init(); await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { loginProvider: "jwt", extraLoginOptions: { - domain: "https://web3auth.au.auth0.com", // Pass on the Auth0 `Domain` here + domain: "https://web3auth.jp.auth0.com", // Pass on the Auth0 `Domain` here verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT connection: "line", // Use this to skip Auth0 Modal for Line login }, diff --git a/docs/auth-provider-setup/social-providers/linkedin.mdx b/docs/auth-provider-setup/social-providers/linkedin.mdx index c60d35b3a..3a0a648df 100644 --- a/docs/auth-provider-setup/social-providers/linkedin.mdx +++ b/docs/auth-provider-setup/social-providers/linkedin.mdx @@ -10,7 +10,7 @@ description: "LinkedIn Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![LinkedIn - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select `LinkedIn` as the **Authentication Type** based from the dropdown. +2. Select `LinkedIn` as the **Authentication Type** based on the dropdown. ![LinkedIn - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +21,7 @@ description: "LinkedIn Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [LinkedIn Social Connection](https://marketplace.auth0.com/integrations/linkedin-social-connection) to your Auth0 application. 5. Click on the `Create` button to create `LinkedIn` Custom Authentication via Auth0 verifier. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; diff --git a/docs/auth-provider-setup/social-providers/microsoft.mdx b/docs/auth-provider-setup/social-providers/microsoft.mdx new file mode 100644 index 000000000..8b47bcb4f --- /dev/null +++ b/docs/auth-provider-setup/social-providers/microsoft.mdx @@ -0,0 +1,81 @@ +--- +title: Microsoft Social Login with Web3Auth +sidebar_label: Microsoft +displayed_sidebar: docs +description: "Microsoft Social Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [Microsoft](https://marketplace.auth0.com/integrations/microsoft-account-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Microsoft - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![Microsoft - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Microsoft - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Microsoft - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Microsoft Social Connection](https://marketplace.auth0.com/integrations/microsoft-account-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Microsoft` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Microsoft +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "windowslive", // Use this to skip Auth0 Modal for Microsoft login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/renren.mdx b/docs/auth-provider-setup/social-providers/renren.mdx new file mode 100644 index 000000000..31c805050 --- /dev/null +++ b/docs/auth-provider-setup/social-providers/renren.mdx @@ -0,0 +1,81 @@ +--- +title: RenRen Login with Web3Auth +sidebar_label: RenRen +displayed_sidebar: docs +description: "RenRen Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [RenRen](https://marketplace.auth0.com/integrations/renren-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![RenRen - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![RenRen - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![RenRen - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![RenRen - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [RenRen Social Connection](https://marketplace.auth0.com/integrations/renren-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `RenRen` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with RenRen +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "renren", // Use this to skip Auth0 Modal for RenRen login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/slack.mdx b/docs/auth-provider-setup/social-providers/slack.mdx new file mode 100644 index 000000000..ddb8f794e --- /dev/null +++ b/docs/auth-provider-setup/social-providers/slack.mdx @@ -0,0 +1,81 @@ +--- +title: Slack Login with Web3Auth +sidebar_label: Slack +displayed_sidebar: docs +description: "Slack Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [Slack](https://marketplace.auth0.com/integrations/sign-in-with-slack) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Slack - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![Slack - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Slack - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Slack - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Slack Social Connection](https://marketplace.auth0.com/integrations/sign-in-with-slack) to your Auth0 application. +5. Click on the `Create` button to create `Slack` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Slack +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "sign-in-with-slack", // Use this to skip Auth0 Modal for Slack login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/social-providers.mdx b/docs/auth-provider-setup/social-providers/social-providers.mdx index 0e597cc96..e6ea7997b 100644 --- a/docs/auth-provider-setup/social-providers/social-providers.mdx +++ b/docs/auth-provider-setup/social-providers/social-providers.mdx @@ -5,7 +5,6 @@ description: "Social Providers | Documentation - Web3Auth" --- import SocialTiles from "@site/src/common/docs/_social-login-providers.mdx"; -import SocialViaFederatedTiles from "@site/src/common/docs/_social-via-federated-providers.mdx"; Social providers allow you to register your app directly with [implicit grant support ](https://oauth.net/2/grant-types/implicit/)and use them with the Web3Auth SDK. @@ -16,7 +15,3 @@ used in the Custom Authentication. ### Social via Dashboard - -### Social via Federated/Identity Providers - - diff --git a/docs/auth-provider-setup/social-providers/spotify.mdx b/docs/auth-provider-setup/social-providers/spotify.mdx new file mode 100644 index 000000000..4036a8572 --- /dev/null +++ b/docs/auth-provider-setup/social-providers/spotify.mdx @@ -0,0 +1,81 @@ +--- +title: Spotify Login with Web3Auth +sidebar_label: Spotify +displayed_sidebar: docs +description: "Spotify Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [Spotify](https://marketplace.auth0.com/integrations/spotify-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Spotify - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![Spotify - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Spotify - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Spotify - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Spotify Social Connection](https://marketplace.auth0.com/integrations/spotify-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Spotify` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-jp-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "N9jnKM2Fo8PFRj8rYM9I7rWX1FW6X5xx", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Spotify +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.jp.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "spotify", // Use this to skip Auth0 Modal for Spotify login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/twitch.mdx b/docs/auth-provider-setup/social-providers/twitch.mdx index c003bcf3a..eb95bac44 100644 --- a/docs/auth-provider-setup/social-providers/twitch.mdx +++ b/docs/auth-provider-setup/social-providers/twitch.mdx @@ -34,14 +34,14 @@ import Tabs from "@theme/Tabs"; ![Twitch OAuth2.0 App Manage](/content-hub/social-providers/twitch/twitch-client-id.png) -## Set up Twitch Custom Authentication +## Set up Twitch 1. Create a verifier for your Twitch application by selecting `Twitch` as the Login provider from this modal. ![Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 2. Paste the **Client ID** from the Twitch App(above) to the `Client ID` field and click on Create. ![Twitch Client ID on Web3Auth Dashboard](/images/dashboard/create-verifier-twitch.png) -## Example +### Example + +## Set up [Twitch](https://marketplace.auth0.com/integrations/twitch-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Twitch - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Twitch` as the **Authentication Type** based on the dropdown. + ![Twitch - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Twitch - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Twitch - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Twitch Social Connection](https://marketplace.auth0.com/integrations/twitch-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Twitch` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-jp-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "N9jnKM2Fo8PFRj8rYM9I7rWX1FW6X5xx", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Twitch +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.jp.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "twitch", // Use this to skip Auth0 Modal for Twitch login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/twitter.mdx b/docs/auth-provider-setup/social-providers/twitter.mdx index f69489bd8..579620dad 100644 --- a/docs/auth-provider-setup/social-providers/twitter.mdx +++ b/docs/auth-provider-setup/social-providers/twitter.mdx @@ -10,7 +10,7 @@ description: "Twitter Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![Twitter - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select `Twitter` as the **Authentication Type** based from the dropdown. +2. Select `Twitter` as the **Authentication Type** based on the dropdown. ![Twitter - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +21,7 @@ description: "Twitter Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [Twitter Social Connection](https://marketplace.auth0.com/integrations/twitter-social-connection) to your Auth0 application. 5. Click on the `Create` button to create `Twitter` Custom Authentication via Auth0 verifier. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; diff --git a/docs/auth-provider-setup/social-providers/vkontakte.mdx b/docs/auth-provider-setup/social-providers/vkontakte.mdx new file mode 100644 index 000000000..b03dc7130 --- /dev/null +++ b/docs/auth-provider-setup/social-providers/vkontakte.mdx @@ -0,0 +1,82 @@ +--- +title: ВКонтакте (vKontakte) Login with Web3Auth +sidebar_label: ВКонтакте (vKontakte) +displayed_sidebar: docs +description: "ВКонтакте (vKontakte) Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [ВКонтакте (vKontakte)](https://marketplace.auth0.com/integrations/vkontakte-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![ВКонтакте (vKontakte) - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![ВКонтакте (vKontakte) - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![ВКонтакте (vKontakte) - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![ВКонтакте (vKontakte) - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [ВКонтакте (vKontakte) Social Connection](https://marketplace.auth0.com/integrations/vkontakte-social-connection) to your Auth0 + application. +5. Click on the `Create` button to create `ВКонтакте (vKontakte)` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with ВКонтакте (vKontakte) +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "vkontakte", // Use this to skip Auth0 Modal for ВКонтакте (vKontakte) login + }, +}); +``` diff --git a/docs/auth-provider-setup/social-providers/weibo.mdx b/docs/auth-provider-setup/social-providers/weibo.mdx index 2f6b9b879..768a6ff28 100644 --- a/docs/auth-provider-setup/social-providers/weibo.mdx +++ b/docs/auth-provider-setup/social-providers/weibo.mdx @@ -1,7 +1,6 @@ --- title: Weibo Social Login with Web3Auth sidebar_label: Weibo - displayed_sidebar: docs description: "Weibo Social Login with Web3Auth | Documentation - Web3Auth" --- @@ -10,7 +9,7 @@ description: "Weibo Social Login with Web3Auth | Documentation - Web3Auth" 1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. ![Weibo - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) -2. Select the `Weibo` as the **Authentication Type** based from the dropdown. +2. Select the `Weibo` as the **Authentication Type** based on the dropdown. ![Weibo - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) 3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application [here](https://auth0.com/docs/quickstart/webapp/). @@ -21,7 +20,7 @@ description: "Weibo Social Login with Web3Auth | Documentation - Web3Auth" 4. Add the [Weibo Social Connection](https://marketplace.auth0.com/integrations/weibo-social-connection) to your Auth0 application. 5. Click on the `Create` button to create `Weibo` Custom Authentication via Auth0 verifier. -## Example +### Example ```tsx import { Web3AuthNoModal } from "@web3auth/no-modal"; @@ -57,9 +56,9 @@ const openloginAdapter = new OpenloginAdapter({ uxMode: "redirect", loginConfig: { jwt: { - verifier: "w3a-auth0-demo", // Pass the Verifier name here + verifier: "w3a-auth0-jp-demo", // Pass the Verifier name here typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created - clientId: "hUVVf4SEsZT7syOiL0gLU9hFEtm2gQ6O", // Pass on the Auth0 `Client ID` here + clientId: "N9jnKM2Fo8PFRj8rYM9I7rWX1FW6X5xx", // Pass on the Auth0 `Client ID` here }, }, }, @@ -74,7 +73,7 @@ await web3auth.init(); await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { loginProvider: "jwt", extraLoginOptions: { - domain: "https://web3auth.au.auth0.com", // Pass on the Auth0 `Domain` here + domain: "https://web3auth.jp.auth0.com", // Pass on the Auth0 `Domain` here verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT connection: "weibo", // Use this to skip Auth0 Modal for Weibo login }, diff --git a/docs/auth-provider-setup/social-providers/yandex.mdx b/docs/auth-provider-setup/social-providers/yandex.mdx new file mode 100644 index 000000000..7fb2f8d3f --- /dev/null +++ b/docs/auth-provider-setup/social-providers/yandex.mdx @@ -0,0 +1,81 @@ +--- +title: Yandex Login with Web3Auth +sidebar_label: Yandex +displayed_sidebar: docs +description: "Yandex Login with Web3Auth | Documentation - Web3Auth" +--- + +## Set up [Yandex](https://marketplace.auth0.com/integrations/yandex-social-connection) via Auth0 + +1. Create a verifier for your Auth0 application by selecting `Auth0` as the Login provider from this modal. + ![Yandex - Login Providers list on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0.png) +2. Select the `Other` as the **Authentication Type** based on the dropdown. + ![Yandex - Auth0 Authentication Type list on Web3Auth Dashboard](/images/dashboard/create-verifier-google.png) +3. Enter the `Auth0 Client ID` and `Auth0 Domain` from your Auth0 application. See how to create a new Auth0 application + [here](https://auth0.com/docs/quickstart/webapp/). + + ![Yandex - Domain and Client ID from Auth0 Dashboard](/images/dashboard/create-verifier-auth0-filled-common.png) + ![Yandex - Auth0 Client ID and Auth0 Domain on Web3Auth Dashboard](/images/dashboard/create-verifier-auth0-unfilled.png) + +4. Add the [Yandex Social Connection](https://marketplace.auth0.com/integrations/yandex-social-connection) to your Auth0 application. +5. Click on the `Create` button to create `Yandex` Custom Authentication via Auth0 verifier. + +### Example + +```tsx +import { Web3AuthNoModal } from "@web3auth/no-modal"; +import { OpenloginAdapter } from "@web3auth/openlogin-adapter"; +import { EthereumPrivateKeyProvider } from "@web3auth/ethereum-provider"; + +const clientId = "BPi5PB_UiIZ-cPz1GtV5i1I2iOSOHuimiXBI0e-Oe_u6X3oVAbCiAZOTEBtTXw4tsluTITPqA8zMsfxIKMjiqNQ"; +// get it from https://dashboard.web3auth.io by creating a project. + +const chainConfig = { + chainNamespace: "eip155", + chainId: "0x1", + rpcTarget: "https://rpc.ankr.com/eth", + displayName: "Ethereum Mainnet", + blockExplorer: "https://goerli.etherscan.io", + ticker: "ETH", + tickerName: "Ethereum", +}; + +const web3auth = new Web3Auth({ + clientId, + chainConfig, + web3AuthNetwork: "sapphire_mainnet", +}); + +const privateKeyProvider = new EthereumPrivateKeyProvider({ + config: { chainConfig }, +}); + +const openloginAdapter = new OpenloginAdapter({ + privateKeyProvider, + adapterSettings: { + uxMode: "redirect", + loginConfig: { + jwt: { + verifier: "w3a-auth0-uk-demo", // Pass the Verifier name here + typeOfLogin: "jwt", // Pass on the login provider of the verifier you've created + clientId: "OfDAVldBEGslU9wjiWyQ1LPWOWNnnzim", // Pass on the Auth0 `Client ID` here + }, + }, + }, +}); +web3auth.configureAdapter(openloginAdapter); +setWeb3auth(web3auth); + +// Initialize +await web3auth.init(); + +// Login with Yandex +await web3auth.connectTo(WALLET_ADAPTERS.OPENLOGIN, { + loginProvider: "jwt", + extraLoginOptions: { + domain: "https://web3auth.uk.auth0.com", // Pass on the Auth0 `Domain` here + verifierIdField: "sub", // Pass on the field name of the `sub` field in the JWT + connection: "yandex", // Use this to skip Auth0 Modal for Yandex login + }, +}); +``` diff --git a/docs/dashboard-setup/dashboard-setup.mdx b/docs/dashboard-setup/dashboard-setup.mdx index 79605abe1..cb497e621 100644 --- a/docs/dashboard-setup/dashboard-setup.mdx +++ b/docs/dashboard-setup/dashboard-setup.mdx @@ -69,7 +69,7 @@ At a glance you can find the following on the home page: ### Left navbar - Workspace ( Default Organization ) with plan name. - - Choose your Organization from the dropdown. + - Choose your Organization on the dropdown. - Home (Overview) - Projects - List of all the projects you have created. - Archive - List of all the archived projects. diff --git a/docs/pnp/features/custom-authentication.mdx b/docs/pnp/features/custom-authentication.mdx index e86ba4a5e..cc5de24fb 100644 --- a/docs/pnp/features/custom-authentication.mdx +++ b/docs/pnp/features/custom-authentication.mdx @@ -8,7 +8,6 @@ description: "Custom Authentication | Documentation - Web3Auth" import BYOCustomJWTTiles from "@site/src/common/docs/_byo-custom-jwt-providers.mdx"; import FederatedTiles from "@site/src/common/docs/_federated-providers.mdx"; import SocialTiles from "@site/src/common/docs/_social-login-providers.mdx"; -import SocialViaFederatedTiles from "@site/src/common/docs/_social-via-federated-providers.mdx"; Custom Authentication is the ability to integrate your own authentication flow with Web3Auth. We suggest using Custom Authentication instead of relying on Web3Auth's default authentication Modal. @@ -25,10 +24,6 @@ The benefits of using Custom Authentication are: -#### Social via Federated/Identity Providers - - - ### Federated / Identity Providers @@ -37,7 +32,7 @@ The benefits of using Custom Authentication are: :::info -For a Custom JWT based authentication services you need to use the [`Web3Auth Plug and Play No Modal SDK`](/sdk/pnp/web/no-modal/), since the Web3Auth +For Custom JWT based authentication services, you need to use the [`Web3Auth Plug and Play No Modal SDK`](/sdk/pnp/web/no-modal/), since the Web3Auth Modal will only help you configure the social logins present within the Modal UI. ::: diff --git a/sidebars.js b/sidebars.js index d2e7ca7e9..df494290f 100644 --- a/sidebars.js +++ b/sidebars.js @@ -166,8 +166,14 @@ module.exports = { "auth-provider-setup/social-providers/linkedin", "auth-provider-setup/social-providers/github", "auth-provider-setup/social-providers/line", - "auth-provider-setup/social-providers/weibo", - "auth-provider-setup/social-providers/kakao", + "auth-provider-setup/social-providers/baidu", + "auth-provider-setup/social-providers/bitbucket", + "auth-provider-setup/social-providers/microsoft", + "auth-provider-setup/social-providers/renren", + "auth-provider-setup/social-providers/slack", + "auth-provider-setup/social-providers/spotify", + "auth-provider-setup/social-providers/vkontakte", + "auth-provider-setup/social-providers/yandex", ], collapsible: true, collapsed: false, diff --git a/src/common/docs/_federated-providers.mdx b/src/common/docs/_federated-providers.mdx index 5c67a335f..f73546670 100644 --- a/src/common/docs/_federated-providers.mdx +++ b/src/common/docs/_federated-providers.mdx @@ -23,12 +23,6 @@ export const tileGroupsDataFederated = [ icon: "logo-firebase.png", path: "/content-hub/guides/firebase", }, - { - key: "okta", - title: "Okta", - icon: "logo-okta.png", - path: "/auth-provider-setup/federated-identity-providers", - }, ], }, ]; diff --git a/src/common/docs/_social-login-providers.mdx b/src/common/docs/_social-login-providers.mdx index 5b3475369..fd3c6daa5 100644 --- a/src/common/docs/_social-login-providers.mdx +++ b/src/common/docs/_social-login-providers.mdx @@ -29,6 +29,96 @@ export const tileGroupsDataSocial = [ icon: "logo-discord.png", path: "/auth-provider-setup/social-providers/discord", }, + { + key: "twitter", + title: "Twitter", + icon: "logo-twitter.png", + path: "/auth-provider-setup/social-providers/twitter", + }, + { + key: "apple", + title: "Apple", + icon: "logo-apple.png", + path: "/auth-provider-setup/social-providers/apple", + }, + { + key: "linkedin", + title: "Linkedin", + icon: "logo-linkedin.png", + path: "/auth-provider-setup/social-providers/linkedin", + }, + { + key: "github", + title: "Github", + icon: "logo-github.png", + path: "/auth-provider-setup/social-providers/github", + }, + { + key: "line", + title: "Line", + icon: "logo-line.png", + path: "/auth-provider-setup/social-providers/line", + }, + { + key: "weibo", + title: "Weibo", + icon: "logo-weibo.png", + path: "/auth-provider-setup/social-providers/weibo", + }, + { + key: "kakao", + title: "KaKao", + icon: "logo-kakao.png", + path: "/auth-provider-setup/social-providers/kakao", + }, + { + key: "baidu", + title: "Baidu", + icon: "logo-baidu.png", + path: "/auth-provider-setup/social-providers/baidu", + }, + { + key: "bitbucket", + title: "Bitbucket", + icon: "logo-bitbucket.png", + path: "/auth-provider-setup/social-providers/bitbucket", + }, + { + key: "microsoft", + title: "Microsoft", + icon: "logo-microsoft.png", + path: "/auth-provider-setup/social-providers/microsoft", + }, + { + key: "renren", + title: "RenRen", + icon: "logo-renren.png", + path: "/auth-provider-setup/social-providers/renren", + }, + { + key: "slack", + title: "Slack", + icon: "logo-slack.png", + path: "/auth-provider-setup/social-providers/slack", + }, + { + key: "spotify", + title: "Spotify", + icon: "logo-spotify.png", + path: "/auth-provider-setup/social-providers/spotify", + }, + { + key: "vkontakte", + title: "vKontakte", + icon: "logo-vkontakte.png", + path: "/auth-provider-setup/social-providers/vkontakte", + }, + { + key: "yandex", + title: "Yandex", + icon: "logo-yandex.png", + path: "/auth-provider-setup/social-providers/yandex", + }, ], }, ]; diff --git a/src/common/docs/_social-via-federated-providers.mdx b/src/common/docs/_social-via-federated-providers.mdx index 6aed61f2d..0ea83633a 100644 --- a/src/common/docs/_social-via-federated-providers.mdx +++ b/src/common/docs/_social-via-federated-providers.mdx @@ -9,55 +9,43 @@ export const tileGroupsDataSocialViaFederated = [ key: "twitter", title: "Twitter", icon: "logo-twitter.png", - path: "/auth-provider-setup/federated-identity-providers#twitter", + path: "/auth-provider-setup/social-providers/twitter", }, { key: "github", title: "Github", icon: "logo-github.png", - path: "/auth-provider-setup/federated-identity-providers#github", - }, - { - key: "reddit", - title: "Reddit", - icon: "logo-reddit.png", - path: "/auth-provider-setup/federated-identity-providers#reddit", + path: "/auth-provider-setup/social-providers/github", }, { key: "linkedin", title: "Linkedin", icon: "logo-linkedin.png", - path: "/auth-provider-setup/federated-identity-providers#linkedin", + path: "/auth-provider-setup/social-providers/linkedin", }, { key: "apple", title: "Apple", icon: "logo-apple.png", - path: "/auth-provider-setup/federated-identity-providers#apple", + path: "/auth-provider-setup/social-providers/apple", }, { key: "line", title: "Line", icon: "logo-line.png", - path: "/auth-provider-setup/federated-identity-providers#line", - }, - { - key: "wechat", - title: "WeChat", - icon: "logo-wechat.png", - path: "/auth-provider-setup/federated-identity-providers#wechat", + path: "/auth-provider-setup/social-providers/line", }, { key: "weibo", title: "Weibo", icon: "logo-weibo.png", - path: "/auth-provider-setup/federated-identity-providers#weibo", + path: "/auth-provider-setup/social-providers/weibo", }, { key: "kakao", title: "KaKao", icon: "logo-kakao.png", - path: "/auth-provider-setup/federated-identity-providers#kakao", + path: "/auth-provider-setup/social-providers/kakao", }, ], }, diff --git a/static/content-hub/logo-baidu.png b/static/content-hub/logo-baidu.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9ebcbbe9dcc91386986929e3b5d7a02a52b00b GIT binary patch literal 6961 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 literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-bitbucket.png b/static/content-hub/logo-bitbucket.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1810a235ee6c536a0ff9724940a87e99bdd16e GIT binary patch literal 29386 zcma&Nc|4TS`#*f&Gh;S`v5$Smo{&9R$Jj-LY}vPvJxOV~$CjOtDAlMal!&5)v1ZFs z2$jaZhDs5|Gkw0x>-T#-&mYepGxu4q^S<8KbEpCne!O{VCDYz0fC!E z1OR{oHkS6rrs0;-iThIV`_c*f@@e~=0n=hv_N4!ll}+6TZ2M%PeSxTTW{FI~zEr|K z5!#oE`bp5~+vM3$DhjbYcj@e|^ zB3*_t9%E>?F`?-1%q&wf3EGD{3}QVeM9yz=hb#)7-QWzG<_lX9JO2yk^$|QVfN*{f zvmbyv3?Q7|a|X^~JwGx#;sa(-t{=F9X1RjqK)Zgfz!_$VQ1k|~mOo;ZFMJuWeaq%E z$*kq@pC&}E3CH{pJiE@+NG$fJ@VW1T(cc83zA~|iUHC=1^qUy7#e^qx_8U*=vP|N> zz?n5BcxGd!rr^IWza*et;>9gyNAW8=A~8Rt;`d0Ge>0gOUD{?g7QOIOlKMyV{3h(g zfKc=|$+*8POw100EH1-BXE#8*w;1;^zOZHf@D=XU^JupZgvhVl!3zk-AvWJH9R3U@ za(2HjOth?CABmT?Q71>ZPtV~`O=CUAao(SJLzh7NenP}5hyN5)9nQcRgws2wnmF&z zOvacDh+X)JKQ)E*m_WIXN>KlZU;d5r`79Opmp62gH)N3~WPvYi3FAJ_q>D*1Q#&TZ zT!FKwlcU1X-VG<|vV?Op?*Aqf8Fjd?z{l82=3I^$F+oNgUc`(uHt* z$8-|@h!vjTdCtIDacD;%@~Z^&NBG<~N$OvGz%<-ph{?0SnXjy#6L7~N?%;WLKL*p> z?7ovs>ku#g;tyX2?FX1{gFHDR7`29R8)I5T^ui`!_m;(ZSmgWel6Y~Oba`7W zc8lZGlt9#)==q<#Aq#|v6_J=t-moRn^FNr5Cm6MX^O=;O{>_+f_G3;E_bA(AcEFeH zbr8fud*B|anHJH^=`|3JUu%AP{HYRIIm@%(M#);KnGTVkHs6^fW`+N?`9p4Q&L*!9 zgg1vb8#E6<*-w+6GP6&ch6dKVJ)pJqr(s#^UtSUW*VezR$t7sz0RRy&H!`q~nOME8 z8z$t)mn1W3_U!qFTy^l+GjHu`;A8Ur5WZx6$QU@c6!#Yt_;iH~@vOnPqAgx|wb_1# z1=%MfK69Cs#dT^V;GuH+Yfmn>POfJa&(8JnHBFt*@^zLr7Es-~edf!;r!!ZblgLCo z8UdsJ|9b3=RbTR%N%P?B74i7=vibK$`H+X(E_Xls^_br=p??l5|H+fu7`ar$74%J( zurH?clRI6eB6R1?_In3@`0z8fB1BI$3oBXM-Cq+`3y0AZ0eLt#KcE9F)#rvxN!nzx4TFz9fTA;! z_{>|k#tn;DdSGMy4iS8^te(6T)CV)}`5-*Nkc`C9gtG>@%tT-+o)zrH$Py=UY35DM%3ZZ1s?)0FTex zFVey?@%LC_me+YQYYdp>C+WaDeD-G;GCK+I1R~J%&y*BHa=tEoiG~B6f1N7g=)prH zz%-sX&3+8+hwciUvNAL?1RUVWhJX^Ji2&eetfw{?v!Dy(sm{kNQ(=}Zc9<-^y-x+( zr;nQhbikXB_6Pa>-%tRK_z!4M#GzgYgqTATnfTtrg8Tmq=l`Mb|E=f$#l?TBWSg38 znWFz!Bn1`|^BjP{ynpo#@{gjigP$blY&-U|} z{yP(ZCNgp4&2*n-RuBFc1Q#X%9+~o=rW)k)fAhEZpWvTcdJ-q!K ze(3+By-jk4HB*tQKi?K}nF9aADF_B%VFHCp_~}9a488RXM*x_e0H!Q81^WCxp2?XS zle7ON^wIw?`@bdsoA`fM<+}j-^5RUq|A5#qfz!F(j8gt*aHc_pOy#QqQAKHpt*Bgz zmrj}Cz&TCCJSzY;_9AMTy6k1zJuj+$L1R*PGzh$-D9e-;_&-XW{h!2t1pPNJ^p9rT zSAo}8g#W7+l8=Sn8w>omvsUH7#wwY3=--*{0B35sw@9dZo*(mP=8M)|$;?ccnEvHY z`yu-?O_^Kbzy2;X{r2B){B5JZ;l7`D>B5&r#-+{8rpqO<YGAu?RY2Q|gdh|9z z@NZKN@PVtKZ&gajwK#NecrFN;)A5ox5P$HK`?}7~3B{*X8(Rf$M(;XulkX9#2KVL% z4nU)UM~#)(HnpdJP-Li>yH=Ls97xT+zrQBfuTJ`1;L}|^be8X+;T24c>7A!f9sYH+ zDZBYi!26*R3|$2E02G$nDHb5NA7VA;QI0$g816A*BVZNi!2}>aMpXP3`op~DZ$cAv~KR} zqB`AMk05UYauo6_Liic=K=8F9mIQt);gtf5q0Dm3=2>$xrvVgg(3I8Ja1L&nA$bmd za?~(6)j*H&>nAUX=!F|Q<^p^!7XB+owcuMC03-Ub^m(f4E zCSQids~mT-_AFVF;7Q-vs_1!>vm8XA_h@3?9#= z%TI5=6qsz#aa=k$cae=dz52+IQ7V`I&ogsA=K+4FOUSXW(XqB*D4%Q;SCyZE8~0$z zRLTMN{A&GIwI{f;fUN5#=lU%>uN$2V{`BOcQkgfoM=^XZ#4*7P_70oMagw`A&-0Uw z{NQ?pBr%<6w+-PAz@#?=X3#jr9S&U+5#ViyBh ziuf|oZh`efL(jb$HHcpUpQ%CRW?B1I;IQL1=YrzVDr--vfe%+6D?-}g)Dtsno`b7D zqqqnbEJYTFG~aP;xZ4cCg9P#Zo*F(=Kl>>jO3khO1y|N;;!f^=yK$v2W#wE2D?`K8 zb7Z^vfGYWEgpi>aZ>@fxQBN4ONjN`uL(nu= z4yj}A2!yq7b0FWLqGB71qhS>Ag`8vnZH{N~TL`RN8lNT0VXm0a_FG=;Io{~`EUoL$ znT-49yzqA+7^m@&azZkK5lHTXJHYx`Gqroz-541FQ7(E{wb&u@zV4@RoNuMhVk*N;8h^V>(OSm}3GAdAWAwnV9 zn2mT%tkyardW1p=;0QU~bxZJSt~^rbm;>;%f6J2H<_E+>cC>;^EFtVqJetdZeu4ZV z9~I^g*7JS0xEOG{Q{Elnd3;F!JKVugok*N&1iLkoCO_Z0bJu!gJMB;o5@|?+?%YHL zo0DZ}bNOg>JXU7x8n$3AY0??9amiZtj2{$v21vVrvM_G>xxS1hp1_Tnod5>5`i;kg zX;ho~mV1Qq90;U5g)X;gux*{Sf==)9{T$X%Q&OTEy~#x#B8knzT6fgz>8bdt zhu#yo*R(3w^dVKY+Nd`)H(|m-;q1g>)*8xVZR2|^UXBNRBY5d^X#WOsJl_u;q|vWe zqu(CvbaIwyBvr1Kf78F4Dp_?Zmu&q2P-aUWup@zWl*J^uy?FDzvBUq(kRAdD)KV0MzY#a;#6V7 z==riQw{Gm{#9L$yVb4jd$C?a3J@2prh5p6zJF&rz9gAX5PKO?2>T~F2EBrr>(1XR6 zZ)LzKF!?o@>^0qicngEEL-YP|G#8pKqwYDo?D$sJ(OTurHRs*-SteXr8DfCv;L1b? zr~p2J-uD7%p~$Ud2ozPrB{jTiW!bM6oD~5Yo{4T;A(LAP*#SrCKcaV6SB*|lmwr#a z>;@^|+dB$u6};l7Skn1}7w3x8`i(u#Vc*st*i(+~SR*zs#s7Zd;keGOQg;9Nk7U~p z$mk?&GWlCro%O^8(XkriVt>0K$bo!#Q84TtZso&CLX)AS#0FLeXvj8B$AFS@}V))->m5!$Ip@)Yl2eblbmbKdM;!^o5|1&+BE z9=z4woOGo7n$$0C^yG-n17BrgcRqBz?#&w)mi3=zKiRovh@?_ z%O}#0-`+IG@iZs0Bed%E+vYw5< zKIY=?)W*ifcKi@zLr-}I+SQTAR-?~a(KoRf$9l0!#>GvO#&Z10ahJ&r+Fh)~wVhNs zqvM!rMZ|;MPEPYsjtkL`co^wWIP96M(%Ce)E$o8$BCi&P$3KKNg6)k9%GmbyUXxW$ zd-2z#A^slHAo}kb?Zfk|rPK9vEIvF+k~dsZD!g<7jE}c-6c}AGltZOQeTm@=lMp$q z6*>cr8_f6a$lv|K9qxuAFA~0t=sgN!!1(#;))YV*C7d>;Kl}sw6=!!84tEw5eUw8t zdkee&GIQvd{;M+FU6!q@*j;K7qJCUwTDxsJ)^a2XO8BC$*wQ(8Jw9II0H_f6;wHR5 zPeA9m11&I|_Hk967cU3$Jp3V)60e&ea`x!8l!g-fszZ?RR*vVldCoc;$>vd}3}vDL zfBl(_f%yCJ@ok2=h>3E!n9<3a6QrZ?9&}fr=Oa6)63eTINguKD+v&lUOHnR`RWEjW zT;_y!=Sip7{^ZaUIlm6`(=VwdDdNE9{mbFR8psS3)9VUkIK77oQKbv-%Oofx>Yv`< zGQ}2C^FNbk!w&l9K(DItcbD!Q7j++-LS757s(L*X+_+~@k_Ik4N9gPhQ2FRX#d!Ku z^|odjA8N06a-`~tNgdm($W-4!_k)SG&{)At(MVFNmAKfX@5}$`*csC&#gqE zqv%RJvP=MDZ!Tx=)X6V^`6MJM&r3l+ZZ*nyzr&A<)%&v5_>BA65KA-iU^hq1OPK|o zfg=Ow`+sH%a7hr1w9G1I4QmWze3s}&Fq)(*nLp+0m9S8_-}EFtB1X2G@fQ2^`*q~D z492WcI75kr%sbYBrUL<{I2J4dF>j*KX+`2>Q{_>*47+vf7+UxYdV}x4c}vBE39iL- zTSvMP-TI);N`ooS_J|~rkYUM1CK3+twd0*c@vjoHnN2*hvw`lU5$_zMwxcJ3CBL`z zpK<259#mDg*1RqOCozV02KYXI2@LQU{#N5&OPmq(3o*~m&d{~(g10$&gnzt{CSu2q z*JC(g0JfTCaM-Nt3PRE=o!F5H3AUyq8C?f4%*LuV-!Yk zcXb}_8gxj$MbQ+cP0>qgL^h|^zS1_oM-T3YaQsvXfWlyW5KG-o>HZn*{sNlsz zOH{qOPTdo)HP#<{gv_h`GxxmsQia7Kgd&kd#a#?Sf2Q9ss7A%$js81 z)>PI(-M*88jPVOL%OUqUZFvdGLPSZM`}5%qZg9P1$fkw1geHq<9=LnG_c34Za=PZq z&7S&-*&Ds3lse;h6Z6MuiTY1AtJX!2GaPfEDyn`t%m!I?aM(zatWQj2Sz>1u8I+@2 za5`X%U9%62~0?OjH3_ z9zux&;7U$l&vr3eFnr9P0C-*p!a-qnoUxpdvga~6Fpkw%s=@TnQk&Z+{TKTFNaPpK z|1j#&I>`S-sU3jOo@&V?@qY#T?pHp&GZ47Wd`r*^Nlm^D!P(AT(3o(J;q3J+B+ zVT%jtm~)8;R8d+(fdV|&Cm;9hSo`CgkC`5w!8tD*LAB(QClvsuhq*sNmAE@rjAZAK zlLM-#zH|-bEiF>}m(4Cqv`CrR)%-45#Ix~_jxt@|+25f)WB|4AI`}Yb%3$wr{q*~P z0+=ouc5=kwETgRNXhCNIIRk108HaZLv4cO971j3(Uzezac%bgYbr|Hw ze40|*Cx!C;b{89Mp9K?f3Hsr`MP(wBx2e@F{dwt00Z!2}DLzXdCS*zcZN7AQZ z0&95ofg;{kp$4-)H_|F=q}_(C)cw2T>=r+&3p04{&L3jiFekjy2rxj@)??*0QA8oK z2EmL(@Au?+&Z@qQdm zA=7hkT)c#{_$y`*>0CJMZFn!<`IH_ltzE2;-LP+}xYLKRH=0vtSk% z4rU{e1t?hr-!TC|iJoDw#%9`zde|RM=S&T*EvF>=es9B9J<`uB)CJG0{fp=tH3EC?g4gB|uvJ8O;M1m6Kt?U{b!Svb@FM~qP z=%|dmhwytsZ~Cj|p`72}hCur?zwM9Oua0*jg%0ZXdk8W(u&yg}B$yH!U~S!cYQsfT zBNTL2Nm6f;4P3--y69svfKlB0i{#Pdu#js#>hH3o8jT9OeT6w6HHg%zU^WVnF-#L} z?w-d|vGE3$ur!v8tF3elNQoZ`HA>IEMM*`>m$G|0J~Ff-c_;Ym%~s}Er! zVXkuZOc901Z3*0^k@cV7h2hx<7h7~Iivg9q8%MpK?kxpqcG(Q}Afjt!h@G}NQqiI8 zpW2@!Splx)jjo@LAfnMl&!D`oA&;V9%Bx_J5&|o5$)?RN=`Z4~P z;r1oiz>gcqZE>7cWBmR;0klOBF=Vz!HhfMSQNS48Y$r}N6qk03ZXa#hZbe_kd!v&V z{uGMRTsq^pj~w-|ty!`T;GNq^F7c4w&x<8p8X*(gvdv{SEK| zTx3b;pf3v%k%zzv!#*$OKo(&+eB&Vj= z*O`Os%Zq|My9bLZF4OstDtF9x9qPjGqi`M0q*C|Mm9uE-4(|itB=Wn$DlXDTDe403 zzQ8Y*TNGrB21LS(I2Y3Y2#Ofns7xHFxt)N7fR>QhNPq$*!gAm$nGWHq*HC(wjHn*$ z(3g!}A2c99*8)JOhWc6~5t$0N6u?V%aeBV)aJ}n%<}8KHxaYO8j@lg+2lc*_4_4J& zTPw52*)QaF!S{bB!ZJ2UwjIUjKiN$NZ1h?Y8p#NI+sIU)b zUb^a{NZE!&`o*fSMSun9Mi^-bC!`{xPg#Yst(%z0CFpy?O_9t!&XR+3NMgVx*@oL9 zK^}w3`C9WT^!FedGBW$OaB-N^n_m$?R}@Z!s6i${xgeH03SbS|is26G{Y6#&ZYC$x zMYXkuyd*uP?pNOdQV@@@gY#%3vKA*7L!E8IOIP;i`Wivpvq+T$1(OBiEzzhPq>*Y6 z%1BaZ{wE0*zpNqpA)}&&_BeZpMeZf#+nmLGHgLpq?4bw)yOv z8DSRC%OElC@4c^Bkms@ec?;JP6}kfHBiEy1cib{0pKX;fqGUp6Pf6+yzKKJ2JIHC< z=N_+wM?&exIF}PPtSHu-%;`nMn0-C_=Cg1R3Ebqv z3l3l($ORG*3Wn&nd}Vo5w>QqIf949O@;(x_CpP~kztRmiGdoR_~ zyUu;#9@F?Jp86(KGh7~?jgGuBi{n`}_rcqd-51FfK@d4$EBTwXogp#kj4540TQ%U z5+e`X%qtw9<8+r)z{}L8wU=`PlJy<^wtk&)(HT5+Mgl6q6`6TRbs!fD>FeL451{CW zHvTFjI`MEPj1sUsEYS4KkLJ-`W9donmH5-P{)GXOZdqysQXZMgOqiNTg@>3V%st7R zQHr^fF#$_k;g%zhJx?Tq; zEoK^BMoc06-GTAA=aliOsv=$Ox^l1EoYqD%-=(Wf_db6F>aTb$PIN4Rm#N`_!WaIz~huK@_fa1NZ9o>PKn3WpJQ5dRwswCyJ`f6ZkzUc{VPj_J)tVQuBP} zU{NF#*PLmPPv_aSF$vvLa7z*Q_xI-J<}`!sLyo23VJ|gBWar=RWWS@9 zf0ha}6A6g)39lRXmsPr5Uefich{TiD{oVPc#1YS!%XdCUUxlklxLYd%e@ehD1?Kr= zQvY*veZA(O*5FqavBl9drBZ|3CE2M-sNa0%iLTXS=oRQ#im`&j{Ysl#3-P97{I4e? z|444nlASZJr4BvTN(J~XUULOvj>6a6xUzTr#4g()f0bZu5VM_Y7ts}TUZvJMzgSM9 z;dtD;HFQ{3f{9YsVN?}PZN$M0Gxg`f+9J!#!|4qYey_AR-^AUzg~@;OFiUph47hRk zQYwI^vdSPjlh|z#G^a-cDj*N5mk<6r1eVDlU)a=s?4;Nv z2ZYhx#Z;WhmVW(Oes4~@@O6c1e399<%nGFIvKn5|)cNx_I|pco#0}zLGv7p1sNT)% z0f}a^twO%<_`EB;j^oz8e>by|_gg&?X#wl>diP1Z!!5E&&sbtQ195jrnXUd5&-Rb? zt5@?7L{_?3DAtReaPCd)OWkGMho|YTRbLJtfs)|UGRNKiWHnXvWc-(+TJVWc=UEl3FcJ5Wvx#9})=%LG+3r7}o7LGU^&Ybry=a-B(pCF#J z3#)cJcdg(d+`7ZVhU56&mOuxzE`xy%J(S=0!NW*d-KS8v)K1Z@+lYeZ69&?_PdKc#^O!$#ER3R~YNYp33U@q)^LMj1y;;o4C9F&WkkO$GR zu<0hIU<#_>ort%mUp3{+c!=vqeQ9_>In-`Hul};fMmgrnJ&wN@dSLn?8g^D@J01Qz}Gzuf^LJg-DE}JZ8IHh+C$Ct5_9oLctySfe!GKXxx<~G#R(J<#(y; zLRxn?nM^kdw>mpB>VB-3dPAK5;?D`K)Qg9QuA0>0wtreYGA2L0fx_Wo7Zp)A-`1vI zMZ>xfPI9(yCpsB>O>i&>Q&rX%^ffND=uozoqgmxKc`et$2qBMrB6Pt3(GuScBfjz@ z7pxdm-vt5P3@`zl2Q3lxl19?mZ`t*Vy=%(>dR&!Mh{2@PsbaKJOPvuS=)%RW9V{ne zG>XbOAutOH}jbVK>qU z>$^3m9kMG&@%1Sl8OL-X3*YmnpVqCf3yA~HA|Cq=Zzhdi@9iKx1DH z7DglSK!jw#hxz}B1)x2#B;M8&*N{aQoIv$x3?_ zUI>r^r{m7wgXJM1>~wZa=5q?$eS&>8;YlV>$m#m0Ymu`uEfurs+9b;!tDq+BY4_VP zhB-r9rGo8K^p$n#Kf~x7APH+ICc%tBDs(?&NCeR7k{oy-SY3&X_B0@Ocs>s@O<0y~ z<;!*Dtc*MgU8W6F0(e_Iv12g}m5Zd`u;be<6sNhD;el+{Uj?l5 ze>o*+!#Z&~N?-B_5T3AtJ<(zRXfe_tf`?RM)3R;Bc0!{`VK1&;f3_a$B|6wobbvq2 z_xOBE4X8Zk%rFN2JULm0M$ib5*a^6lG4r^o%m&~d2|{0vl%QFWC*}Csz6~y0cxa%4 zM%_XK6bHyhHi{}azAD_&ImiC~$IjrC{wxzaV!CtWN$W{AM^tG!Uk>|T7o z%Y9|_gB@Q?HG1RK=L>bV3xvV8)T+ay0-bSqU{DQBV^eXHQ2$YU$w&2-r-JmC$Rh!` zg)DVe+JL+@N|v?guz=K=>WBK4f2xNR;H^H?y2cCqdbf}h69i!lLX$P%G~pw~40+;U zl-!Ep?x?dxIr!)2+1N*=F2ysNcf~v6vinL$Y~t#!u9A9g9164gQ~l2unD=78UWq0E z18wqT16sxiU;|#sd#FY<^p@Z=WKPS1w}RD970*5FtH=7|8g=4xjyE1rN?+j%w0%2w ztlf85k?SZvM(I3YREI+!<-+g2Ts;plry~yx58qyRn3V!3gMBbl2W9O3sS}!tAqIS` zyeAGkd%ym)YXq~R;*wT#4B<(3MBiOeu)UUX)F-=)-q;OiEa$Pf%fcd0&4miY0pTsL zrsBR@ifYH}h}m{LdH}jh-s#mk`9PdE=sAwp*D&S8d){(htbYVU^ME_dL?P+kP;SJV z^K^PfxBiwz6o}7JQj5+%cw?ZyUkNv?j8;Ni;DQm6>3!LRdq59D63qzrghIKZ3yb{Q z`=j-Jzwyv87S!2FTYN^(PALAs?PmlnTyNBRW&n_H z-=c&Jr_??d-gw`nEu3xjoyv_UFXtM(18JrX7SvZQha2#*y)jom<~lfmK_ko*e#t@$ z|9r}va6$V<@AYpBAfS^9wj<;;#Z*+MbHaW=HQM4@;2pfnVQ?rTw}mDhS3P&FxLW8& zn}nLA$#tj@-?abr?Gxb6?yko}`EVV$j`=K?9~$(Vjr*y1E>RN=Ai^yyFSOX2%OvQC z1VyStKtMg5^2RID<1i|Uyg9nVN>L7I>#9z1Rjvc0Ilu|-OW7_xr!~jpPZaTV&xgKPdbd+iOPL-h&@-1 z+Y{Y>UV|Ll9xPKl>HQ%t8E|C2WL-J4$p`?sAt65Y^VI}T96)3#zR&+)9C8-Fed~tq zw86-@)WZw(V0NdPz+krTQ8W|R!8;{ixKEMh!3X@WIoso(S~@ev4(BdP;$gx_Sq{%r zRgss;T|w13*V0`KIc?bnB2H<>E?46Dtd7!}DI(O{FpTlA|7MJ=g!e;XS|>x?1_a1N zj?8cYe5%ssu?0LhXby1nkziG#oAv5N-DqylGW0RD6x#Dh084xU3OU~L5V_L%^((2y z5N#Qr*v;r46aSX|8BtICv|Qep8CgBKZ&-5+MfzjaT)CA$mHsSp!>(#Ag9%XK&do)DfW9*$%&_)uY|YsO7^ z5Kllnc1r&wsfko$fo1yUJ?)nT5@_+m zm)5W&4%e|c$B5>Jlu*_lwr4^uM$i}I!>9xzrhwYKC(QyfV9ZU)fkz|I8#hubx#Y9- zb*MJ!(g^ljION!kicdPoSK%N41S!7+=9pnnv2851H*(dK+B>K|3q)lHc&tnssC%T< zkBn{|)Go`g4}#yPd&wDi0i5BT_($i?>*OhW5wrC5!)hr@(xq{~OIfJ~K9(vyPrTl^ zvA+j$4bJ2VTW1%KN4X}7Yl_714CXc$J|owmHOI#OKqLU4ZC0q3olP9j@ zqav2~vv|IsdYGoHS*INr3tv_WxajYEpmmN+#e1%C%9yLYjy_0}*+0+<)NeAakP9c1 zE%b4qNCJ?Nd;ncEqAS87&@CI3Xmb8O&r}m6heQR*`TR<*u*YRPBy)kWJ!o#(Md{z) z21Bpes)wu64x7Hj)kpCW8XB4+!imbBHD|`AN|_h_&v3~$s&e?n;!xrD^sW~yzt_L0 z$$<`RGYLv3pG-7J7=Q4Nd^6TNG=fP74dX#s43*WL6$^M+In!9^`iB7kkI+cLUe;U< zR|g0HVwM2V;jgtu;uC^lc z-RP-NUEP|k5F3E$A>m7{gM~kTX8dFWTINe7s8aGNDo0bsdMv&rrX*# zt%bBP%dD3Lxl?JDM(kXN7I$nswAwly{9_(x{`lBkNE7|rk;gJ24uIiRnP?~yV#Z!1 zDYHqM$=K#MRplZX>vy}gE8u|@JcX)3$}5^r{oe=3`<$IQSbDHs!kY~ifq`YgVx#hU zp=dsvIP#P97l*RX84SJ+oanA2PFBp1G+fdv?I@$k?B z6wM5vR{B)20LOI!m|K?pjGL)6{dUW>$L!mi3#W#v>apq%4!b@-<W#nyuM1gGZ+a zzs6^+WGnr?6b@_$^}wt+H$nsXeCY3xAl-=CUmR&r!F%uN$`Kb*ah${_X~*~$wUBG# zyai#5gzV5kw(?Quaw#p&Bf9VTbB~`ommrhy1&M-~8@LpVLqDya(8 zLdG4DITc1^VsYK6I=#?FLs8%ekOI^p3NVCX^l&`J9y_NqDZCizQ~&P$1*P?cqfI$2 zTp=8RC(SCT%1;Jan!kSzd!V?VxxpyvKMeL&Z-h+SA--Y zqaGcKk*1J1%9)N{W5I~4;W?XV=`(1Nc&wuHeKfRqic4KmNpQfy=Z+s|0 z(kS?BT&2_tT#&)(VZW3Iv79z#3d@8i1@{6BIa#b?i&+wf-ibLh)M&3B891`OdufS% z^+fAA<*=q%y^9>oUscasew_|-!JSjVtT!3T^`oRa87p>lK*%*4xT;5_WB(26OpN>sj zO*L0Ns>sjj{zMAc+hAqo0rC#=lA(HHB6Mk%T75~8qfB&GJmTFq#F)qnw)>S1q|fp! zj*IR;Z^KV~ocrXM-Ho1lTuAgevawnA1i$yyRsr0o@Nl9fLq_*G)`C>nqQkQa@l{uHC&5^z@DaZu@cml~27Y zv^yEaS1gL`r{^Mz3ZVy}biB`FRHx{25|H5q1If*-`!P0yBpBY%s1d{PyJj?{3WT77J%i{0+72xn;a|Td7C5 z!U0#B%=k=S&aM84N$GIM7rjpwwLop1);Jp>W396}e;$^r(R=6o-^%{BJHs(GG6AEv zsn9YNKz^>m^KtZx_ljs+9(;;j9V7#K$N`Q(0{JZc8k`_Gs%#q~zyi$sHhFx!p#So?}n6S;*`rXGFH0$ueZ|5(4Wck#E>rKKAK9clc(SBefgR&IPK z`tqmw%vV9(50%z_rSk(RNJ%apmg%{KM_@fA863BsK#V>(Zd3*(Kn9-`Oj3Z}IoE^6 z1lUR?Cq+bza-Ob8xHz;mUF@bHomNu7dfDORYOE7-yDjS7RMffE%n4qALRd zE~TfASQEyA7jjP@MxzrKzlL#QElSKJjb+Vvu`CzkVP zS9|H5V4>AJmc1DL=A2^B9M0 z3ww`%?d;5|>A(^9xDfY*5y*Qya2)UnA27FNji#Zi#+wRz6CD%)3KxrQhqwgs1OuQu z6LY)JuxY;f&LqxsTtW)Gai@xBDurfOIm^qgf#nx+hql%o9$=z>Y6qvbbx zaQ8e0$0+Bdu=V*?hHUi?slhbIc##Lz1&8Q?W<#aU3^Rmk-rb0{CXkvU!XHZeYy#$l`+~Dg?3I(=x8H{-<1B zt8$r(V3-)?+BWG$8Ygnk=``k#wsq4LeUS`+5m$tMHwfEQcA**60==LK;6>ax6G_Gc za?I1YTQWV!Xby-l*Z>gB?M315^tm`%oF5jpi-T=q%o?&EP*v9iO)in&kvZ(B=9Zi) z+(ik*qK1-&j>)a9SEu2sm8D*vbZ4Dl{&Bb$o^N&Whk78d=KbpwPv6<>ILMcJ*lQ?W zgO!Zes3MM$&_;z=CzVIew3HG6M!g14V!b0MXd{>wxwSF{toadbh zCj|f*tCnf-)2w%+*eZm>>xqY1E9<3GKF7l&mlA3m%_`b2T}p;0Ktk#$2<1l)xPRrE z`~J`nXB-_J(Gs<-FbqAQo@+YCHo(JTcn?KJ96&QSI@LFE7HCgt`W-U+9lG2lYin~{ zF!O+$m&(UHI2^+(&5_plR4))$f&|>07L`Qq>)u0ita_K7%q{h@DTLBkBXL!?#oYq< zZ$*!wJh~WNt8Kl^;kSJ00X{PaVa(S}ahx!Mhr5kBJ-WzvM$HW{3vN~^v50sA@XsnFd!l}(o|4kmaE3j@u2PZrRCm=(+v0b;>TiBe)Q zW4qpk4G$A6Kwlgi=X4CeF-KQ4q?s!XzLJmh6bJ(B!%t)sk0k4Q<1BDpWcI-YNdwC& zuDbpzJQ&4x%IbsCZrqssaPF{LxKfPLfrb2+XUG=qV+YR;jB8%8dvo>GE8mz04Y4~i zH31I5#(C!7xZe2E^SadP_cZ z0-h-a)f~{FeHM(r_Qb9@Ug{Uz313=@rNMr(sEnl`QAV@cW4krB2U~3QC?=9mzgO9nWp_k+p>6qc4vvg~^o#8j*+W|Rj+IGyZbBE@{6hJBjBT3UcG3=T zWW3Ze(O%^Vv}H94;3mv2k#37Oj%Yvp8h0W?{4r8Xor8AV*X1GeuKmUe037-(_CYwU zLl!BoK!PiAGi0l}DjCU=uosBm=eb|F+9+2wvYpo40WGtK0ik$(6@l8h;yJ$=oT>m( zH$VYg!8}OqLUhE9qMdOzJeplF!Aj$C2EnvqZeo&P5Qo%1FC2snv5Wo{0XfZRwE6Zba$ixodfE4b5%P7MeGoCu53 z6LfskO##%PXJpaN@HPETf=))jb*G;AWSE^S*MN*lF#BCuL^8VT4_>)-HAD?tAgFwk zdEnTT4<~4P9%W?q@*{aTl0(HB(=KoghsI#su){Rm{Mh8P@re9sHk+?wiGSeU<^F$zDLG4K)o8 z0c8e6VrYheh@`)H*JsL1fp~%-UamkV8#X0!9Nypgn>PY^oz*)M+BL2i0R}kEPQRmS zB?BDY(2EyCGS+xF0e)0D9?Squ_h=q*04FsZ-$~b(D(3ySmJxfo9lnKJvEeH zHLau%J!N_0y{6vhvX!~zcbrSS0!msF8Wzfo6mjA_n$p}3^uvu1>;lXQBz#|IwvydU zkg!9`r_&Y7;jxk^cR^iZK3VT+KJyay7RsL8#P$*AL+pWXEDMROckXM@Pk0}L_p!)C zJujFA1;mC*y*laCM_?PmH_2w#s2r6tF5r4M;wNj*XVt^YFd(Z7n!obmxq97k9wLtt zZ1K4A;C5HDETBmVVc_GG-rk12Db-7mWxxSRjz_9G#Pd)$O@ZV2{I_v?$F32jfVB3K zd+1inOkgmEe)Ykbqbp<9>vBrMoLF4h>P5p_-%#7i#mQzt z)!RE(Txl3_ONJ)>44_V?kdO&w*SuRi|30O#Dkzw96bP+L76UERW6UknVFS(nFU=Sz zyMz)=ya%tgX=~84OY(&Q32`VQ|L(b_-iKB-S8XZ{^JKrz{0zV{RCFZV&X8G@=9~2X z2H@(gstiVfn=rc?O?FwqM;(G>UK@Tj@Npa&-iVP->JMcV9D6kv)~kS`3k@Z(oMsc6z;HsVu~-jb1)V-nvY_q=v4cJJD`NpfGSGZX7Mzc_Mk zh==YMqj?Xh09Zk>!2S;Qx+|Q;70ruR5!O6%yphODcY%;*lJv-yjM@s=2Nnc-=r|!< zO3C^@@nueXhUW7}7pf1J@)ZBbzJ)NtaLOosPFVp?q6683StXRZP6IE|OO$OM=Qagu zyk!ym9m3@~hVi#dQG;Dc!R%SYA^zC2`y+S%+W;Fv_tohc)Wp3+fJbS)Fh=%}>L2DXFhIfUWVBVC_qd@Jue+38l9d#cw~R40tAn?s5?X zj+dDAug7U}G?j(9m!rgmO)*vWX0IiXXl)`7?FfCiY7;8-d(cBZRNrely&zB6T*pUp z6Q2*}4r+h5y_dB9Wjz&%aLw78F)=+@3)}fTFhaiKV>knA14+mwEt|4%d}_;I?r)j3 zx9!p^pU&tE9$YK__<(y`*abDF={bMRb*&{3#3zd-p5gxS`TJXkG*5HV592{Z%*93s_71h4@>T299D5$qrqWoW3FP?4Hl&yv!|(uu`{dzu_ZD!YW^o$E@q7S3ke- zHj#9{SI;``F}&gHKnGbP*m3&J1D^BW+C5P6PRoamkI(EoO|I(;1jBgmKSQUhi{fRB zSO(Gl^`u}J7PZJxLm6Yq<9{r-42$5!r3PQ*PJ=MUCJ$KYPX~ z#NFe4e^-Qo_TEU<4?3<}*^Ph~Hxn3LM7+F7Uoe9#xj+U|&?pTv)rG-m8PWqZ30~si zzZLvkOgguu^z1&{Koga2V2~)wG03+hy_ZpGcuT_o#-~iT8-+{eL$9DssLlHIeo`cE zaW4O%GXgO8l`e@IHRoGD(aG(`>bnye-(k(S&KrcKz6tG&4})Ycf|aRUP!z6CA^MT`;!nAO;F-V3DU6z z6a%3&$-$V&ispwGe1UD`nWZ{h<6z@A2BopBasW*yTCFX@k&!Lk;rdv)W*))=lmT0p zf#i#Wpi3M;wl;pN=L!z<|Bnm6`;uveiYSlY+}z|Z%AAN=vQFI``lmwp^kxZrT)3_M z7gAbrMHxJB*o%G2oTEvv6RF+~YO~rl=cX3n9ZGZt1tR1tp=pfY!LC3~+=cSTNL(j> z>Abro%^OxhGShL|%mjGx{bwDjHixBJoFDiRQ2a+U0Gv?BlFod7U&JQ!T6$i|YJvyn zzu|Pgm+Cx)StAlxVE7km$xO#*PEV?S|20R^#WWy$3>Iqg_W#qj19&C@n=|tN1VxhR z5-xU>EZ|H)gOvZgmiS++?BmP}>Sd2CoI8K~;bk%X9K!QS1=yRI1kLy59L6&{OIXr= zromLgJ^Im|R9u|9;qZ?D;}m*nC7x1Qyo<#WMir%NptS9|VgssVdwUPg4+gGwLx=4y zqlS+F9S94wi`wkC;L;F=mk9C7v;)pV%stTFpQ-G>n3BU*u#`J2$E$TXma;p`(tgQj zl5O6KlY+LCZT}@nUy+F3-#1uwD~CQB#kOhRT}q&GQEPhIfIYZi2pr&$7;vMfdK96) zYD zA$|GvYXynK5IaySZJ$m_5tu$2#|7)QuQf6IygI64aXWrJd(DtsZq|)xa%tLMk^i0W zfi@HGpSr(lAXy}MWPz0P>m)u+ys4LzduaKyQ%%oEeJRM2iS)p@3F1tq-@@8|uJ@I> zLCIjExLu1|Og)y$%XVT`Qos576j_bkrM0-~TWV6nmCMyT35rmrUaC!elY@WtRXq=} z>=crI^>RAHo@j}Jl+yOe>W9cTsqgXYZ>Th^MmCPFqFnd935+|sWO-iSM7_-N7f0cm zTn}Q?krkWT*_A0zKl=6etCCqCN_X1!Db@%8Z8?CZr(8czwy@{jLyQ_XG1%d}GS0;Q zg^p645DX*e?hgbky{`RuKLKwNn%vUc!QV&q39{_gKMtO2v!m6AgFXPjk|zfR%olc5 z3Inuz45Scmyl#IoRFOV&F=ZVSv!_NRGQer%UNxYlmaT3dV_6A*r2iz-0uwvXNfpcP33Prc za*rBbN~+uoF25vx#}xs;P-jF9AeU`c7Z;z53=)~AyhRlV&l%GP>miB)-hZ?156DBq z7!4NlZFptrCncM_nX$$UuHa>kG_A3s7Ms%Aj(q9*aWj(M&zse9&lp>ZMZR_%vSM#S zl$^FK3wf6ENjLy{C_%--t)v}i(SLq_iQ>1SMZ?D>8Jqso*ROYSroM2#dHuY!VBs@1 zjBjzNWNv^}3HXwk0o?#j3S_MYPdv5|KY-fqDHmma>eW`_^;wDKa%;F6Cy(jd9|J>j zS;Si(O%p{8zaDi|#=_zJ?Y*LDCXo@wl|t=3xyW zN&{68Z9TFk)SSjIEI8TIMcwj$xZRM>Z&%n6da8$}j6hU}aNr!X-fBI_UePdMY`R(> z233bBKc(M?TlV|&-)Jrg?N5x%3QK)8G>4g*t_u=NgM2p8_7~ zYwU-RY*zLSCn%p8Fx#s!i@8H(?Z69HK;GdeAQoIctCyjR1FyqcoI&OR=#7-@){Z-G zW7^(_t^5nBx`y-f)_n|My>_76;F?pMm}{Sye7yg;3VbNWg#J|T2Yif4dI8yP%(gKb za4;-;TX#po4(?5Stb8?G2hyeeJ=KSS-Fj=ePve;&jW}>PLOy|w=@gkvxgjL&*NmNo z{*uiXnOw64J_Oa>V3KW@4CZOhOS?P0v$p>HIgeMNtmm4bSszw!++oC2Dou$}9Wg9v zVA;?4Q1RU4HnESze$B3-xcKWkiY?zEk?Z()9cMsZFK+e{1MpRqeoh)!qt+`$UyTv~ z-a}kUH;(N|BZCo7;tIyA$5tXqg6##hJ#Wr~3TgZ;!!pf87kPQYGFB~Lr`=id@QYc} z;pOtS@2&42S|W$NN_3fM@rxb>@vbd2G@KiFJbvzzt)$+^+)0CXNO>EkR|JQ&gP{;h zU7w>$|7Q|cs~}^VJBk;}B*sT?)6zuYjv7qTQ8oN*y?$@(-BGvQp_o_GVj?B&H?pDP zpXfizJ?5oQJFeB|w}N~BL62EyU+;z<-|=#@RdRa=VPXzo7Mul!S)oM^#{U#(01Tf4 zhmtNhTWb@~3h3MJEp_wsAKDRhgmDO57euy_<$iQb%AhsL=TP6M}}G-!eg?zrDtP+G*Nt8Y-$ z#OSfXn0Of+!WQXoWC(OZ1U^Aoe!-NbWRbJXy%pFZ{%*7i$c>LeqPoR(H}^^uqgpJj zECNil&Z0R2FrKuocxG0_8Sv@a>g$#HpLLBTpp?v(LvKjkMrK%^(qv5^;Y-zX7?zzI ztmB|1f)~AS5ofXLo8TSONmbm0%+3vKSBtasdO~O!qIdb+O6qU#f2qc7(vkWP_>4=> zPmbc#35L;7dAl@oKxp!GSza4jzVDbL8{(5h!0%3IBE2xB8lXO%yKF>d%#c!IU{I`Xa?JxGvwFd^}8rZ;bG}P z!-LH1Fr0c)p>UoZdQ;mYQ&jiZvXyTDkr(fwM_FlYXBZFzzbrZi9=q%JS-bF`I7Jxq zA<}&^Xd=>rovX1muFZ%vvmedb%sK-iT@-_(&2qU&k;3fyK@|lXFX|E!0g}biI>yc6O3Vn0$!(t9qpqMo-?3SZ%>c;89>02!xHh| z&sCxSisLh7Oa)dB-}dRKB>|xHf=v>R6@4oS?9gPsS|xhhtel=tf3wRyc-izCEsCd* zX2#PyMH@o_!y>vSl{his*`1$af*HZz)!tKgzqP8+XF?GTajjUoclfPm8ql1)+!D`~ z7!DcAP@H>mbt+*IR77>Z_>4AKFt50rDfaG@ig6w3URe@gr3;)|#J`;!=xhTT)3NX9 z64(uW&mrTGWCAJ1w1!t&Z)l|?52#@5NWY#0mJ2*#_AYr0Rsy|=r!uWJp?5?57>MG9 zP1B2Nd6PuyvhouNCv{%RH`YqEA#jvIEM;5RCY>Q0=Aomud#&buxlU?gmMU?D?4ZA$ z89%CLvRGtaaUNWqCPd5c_wY%=>$G_9hqOtF63pmN-npM1RPM3PLqfmvSUU$>zXj5= zzfn&*LvA^C@fary{q?GegEQ>(c&45i%}QrV}V$N7W{&)z3=$5V{q zQ7`bTo?h@dJx7-b>ADXh67UF|F|3cifI%Gc2d-ctqb2fd$t?FREsoc@W}4m`ddh!p z%^)UEVD5E!5XQ$Q`aPk>!dS|YxA8GiW1hR2c7u~}h9a*ikOmSun}714JES%!WuSR{ zl8zaAc+WTr33VNa>yQu)2t8aG&ZD}h@S+6p9DH*dRdONSs*q+tZ&dtMXoUEj8}*!g zCbpgpW}=}@6bD;ji)XxL)IfJCezK0C$YVgabU_EIE_CL-%d$S8_X?ZKf~fTRam%jQ za>^#*FoCfqbyinpbTc%9;n}XpaeffqeF3zTYS!K&Y3X6Ar3%#iEiEOh-^! zAip<2H|2J4yZv_h>wGXvn2?n?8Xz&e1t|NW7`o^HOX6QkCb;yT2nK&BA-x*ZtO)_2 zp64lkTD)o-4n|XM=3DNa6-L(Q|i>v{Z;x$^E!K`pZ=c<|8jE>I;unbQ}&IpM5L89hn zhDh)X%H8d02wmt+c#~{4xyof0`h;}yA|pk(nh+VJ*9U1UIMWk@5kL8po-R2TzT8dw zPMix8f2uRu=G1p=*}numhNp#-Qa(t840tq~hl5re44FQp@B%j|WT?$vnGLAG zy|tiHA4uq}Pu!wEO`FitH^PfCTN!iyZfDAEL#Y6vf4&*517g2kEx+7jCACrs>13@u z&5iSbRURr71((DR)VlJm7jY0OX#|6O2-gpi#xTA+3u1&34tC>Te|%2|gXg^ke{4n? z14^(I-f_v%s;H~r!Vb`AOO=$5R;2`@DqSmK_ipma#8uqS!0O%k^LWu@9pD_eLX9l! zS!?ia)-Ca(N$iGKI5*^54M?!Ay5jEE+;SYL|EV)zY-St!B|R;>WIlBOBVZf)4W_BN zS=0vLFm}vPz0LR*o-3Nvb#SQ6^H`9m?uWS_K)tE)%{(4C z4ICnCb>pOiug8yiW8Pw50HDZwW5JJfj05U6U&loxAPpAH$8YRMWu=dW{IUmbzKE=j zqk0p@P2%5aSbr_fwXEzCr!((;{*zUeI+RtEnczUpD`@=gXQ?`=e~U9xIwo4-F*x`+ zfBJ2`O=1)KY-}$#ISC;v6zXH+JS81&hLk-%Z5ah7e;re9s-AFTozY1j_?J!Qk*@y* zSj6+P%gnvncVzAx=a7aw2S0gO>wXVgH3?* zF`EnaSM*cSr7xElSm~PMUPj7C!zP05xLU+C{vksyT(w%`yGD4voVq{>Mi`uU2$t?j zRsxQpcKn2QP%bFUeA`#(vt$BOALBD{nNV*5iT+yBg68Y7Q=V!3oRbeHF6e9YpVKgl zg}Q6ksRp&nmA&yCom5-eF0Tezm?eDv5pHC7SQsIq4L0xux2Yp!Xg7zj(T+UJZcdn! z$Lu&`z8d8t*>=8HE?jQSjTQs?0w|IKDZ00u$lO^v4QyM;VJC4fnab(Rv|^$^nBsav zZJb$d(kx&j%iWVJm0!JPd5%0+Q4Wb(Iipe2uQfPFnwZ|5mG1(UN9c(3$pR&bAD*v; z^3Ew$4z{LSEof6my+)K}tE)AdgRInKPb?=_y}Ya(LG$mgdgu9~{MC3ijR379s8k&H z2ba>sBal0lDb$PfBsqWu#u&C}B>pdQx`r}|eb|Nj;a&_prZWIw1TYqAPHHp@WdQim zGd8cH5`Isz-UpdiC6EYZd*3iOzUP8Vl{2{7Aq3j|Z!9Bc(mul_!bZSkiEvt{bTda4 zesgy?f9T_(sAS=5H<=d1rT}@6!lQ&j-sgCRmx-o3&NUpgU>vlLdl%P5vFP*%zCM~^ z=7EPK^05j^{VRcfS~U0#a6VweaZk4V10DSN+n&Ru#oO$Mqs*qsV6=1IAHE+bpwH@4 z@gu=&lhuOG)l$An0=<)=?+^SUf89b$L{@Myk8>Asz;h$TXhTPG?fX!9DEsqr>5XuN z{ilsQ-{ds*W4~w^k=74)c>w!Vh!H|i!v6qjt5!e%=OX*uJ_1)YxPcO3+<`MVS6&Gr zZhM{NOlaAvS)3wkDE*U8>yRR{!_8Q0F{b$nGhbkGdwG~K1#7paDX5Z_vnhFCOW+oA zBKWn++V|DA;@g>!mTuJQe`fP}P!qK7rol92(eZ;G6y zfK-o!t}7q&N80RnaImW%&S&p4XHDWL^I)Ro+3=3BYeH>&@@{tWNqqFpbzJ0#albz& zIcsEoQbW+#kiU5?`wk<^k2@p>cnu+v>J{nb*RNmAgozEZx0)DylDAlq*WW3P^dfA8 z!+D=^Cmi0?gXq1iyLWXUSeQAAzf$*4=R||u3`q5=!%8aktX>R$a`~P($B`)1lE1PF z2n&*hY6wsjFQYlzDgl0-Je<@={!k?ICvMj zl0~qA{3xZ>2d+O&;zaS@uqV$)X_`8Ey>L*Vg0vhSo zkkYNLYLH_tr2*OsUwy@Nc`-3;B~|GLt0h5%yUcla?-LyMoQ!TnED({odnkA0rd9S?LV;T!1qw{qZWv zch9Nj2Zw$mQ^A$#rZ-A(f5=jalrezO|M?i+lUD;eT+g7`!-5LRumo5w`Gve_G(4%HsE+(f8&MCSRxbQHu!s>v+Q} zf*UzqP6fjBb3Ke|NA39EKCD|gmTzX$XEmUe@wmo8|(T`tAY zcX{`4Fb)=KiF_xl+l~?bi5?^vis9bl6<>n_9%;|j+h(t*RbszM{(%yNg3aPUZjx_4 zqGb8G-HJ%Ser!31KK)wuc%TX&Rs&qm-bRjDO1_3;)?to0|9BN6l|B0ME;-JK)5ez* z;`NN~St3sz^)P};*?`#B8bZt6=R>?@gs?9DX2F^^B2b3U+)lktfKIx z)i<;vGlb{b{?Kn;mq@-e>P7;KR6+#;cwHI_Y1ZWP$6)pf99X`J7OmWmZRLP-bPjc{ zwK>$DVWC$bb@x(8wodhV^rg+#P_lSZ3ZHxC7%RaUT+YH;Cfl~u=s!?vI+%BQ^k=nyql zc)INHkd?PWrhl{H9-Hm8ck>?)DcCg5pIPnQk0=oclCeaPF&l)GJG$z8;@=-!KICj> z%ykiN+P(PlG+SR=689?yh%DLSfp6+dPB}5~123k{zi7>MfX~W4GdPVZWu&Dbzd;1> zX$&4;%--9ZObcY@-}Eez?|fvEoXxF2EX0G_xjG!DQgW=Gh+@VD4&If?0Eahe`ULYl5D*j?Cx4;IhH<9PF zCA7Tk*3(TZB7KFHn-ryzZH+p4QF93L=N{>I=s&4ykOlAHq(37AIV$y_Te1c}5RnZr zASejjWu-}1KPT^_pQe2AXoOeZzxnz@mC&ITmjH*d8m6p>fs)MMAJrm7vEPe4=uA!D z_40d&wa9j4+yR(_zaqqv`tV2Wbg4H1@$X)McyPz5(^@qNRh|1<{$B(mZqh_Cs7#ru z=+IYYKdsOSg}1V@q8NP`)rCrhc%oY0gWwVy``49|PTd7~oXWIpHgLt@ax1Kx8pKO5 z5^_y&OFcNG`3@gUG4Q{W9(M3|5N76xs4WA~CBEpe`Ot)k;iAl#N$>uym0TOHOrEw6 z<$$r%CQ@f~I0r;o-P99|O=)ne=U}(o zBw_Q>l}vhhdAa8`7fSCf+|;P? zDvQ!!Ck>Gl6EpsVrVH>w1&Zk}47HHEn0Fc5?0!P^REQuq)+ z#EHH3IrzT=u1DG$o|KHKY-zKnH{I%!GDJ_MWNB^Wb8WxXHq*!I|FdSmyk6WifG=0e zu&SFk5^pneaEsXk0Eof={SjctD_k50%4EoVeU!kX{m(-h9NgQ>Qv?sn07!5Dnj8PkPz_zj57ZbvW!7HO-1*C7L1G6#GL~Y;9x(YC?+mNf(OVej z$z@XV*wqL99(pWo^@__^u}3UmK~`^ zb#T}XraJ?kg-l7NHxMQUf3vE|AzZ&Rs>!abTjzI=$1i=|0k}Ioe>|a#-YOMYD)6!{ z-XyyrCO!`7=-GYV7xp&Z53_65)~0T3JcbW9`ik4AqA6G(14fzpU3uO?HLCa0?smCM z(wM++c-+{pvyF(DwKEvQbyQgZjsm~`9H$TM{6%a733|cdE;I-L1z|TIA|mq4Usxn> zYC1U96jZ-c9F8uj-lA75AW|s_PaZc^WTw}R&Q`J*$;%{@+o)Lkqq?E_wm9itMr}5; zICa)!P@7k9QdU?y;%AK`9`6-`Va-hicHg8s97Q?+4X z!Q*f~#J%Eifoz-i_;xG38~SCVAOZeP51<1zI^97(+QZcI*-M58K*zB^*(79evJ7Bv z*3_(pl8b(WCrLWS$zy3zNtcRRoVrUfv>7bW-k(-OX<`j>c(gTiQ=fi{uAzB~H9E5* zLgyY>C|<0eS?7bd@o_>Hykr&7i+z-$pw^S$3apZbEVLi493e>=MXy3^ISXN1#!;Fy zOeuxHdN-$AAzW+`kt?k{{uV%+WI^(4XrjXF0^}9;#r068o{Zlc(p3%~*x0$Q4zcyr zEXe}D)vo|-J0EUHeHMmBX@W<-Sv=zdaQ|jmu&HpN%RAR75^SoSwn9jX{NjCGViP2@ zi{k0n{am=B_B$nCj`*bz^SyQ(TBtPk?!XW@8Y&?AzxwT&#@n`1WVTOcw|{ z;*{7Zc2>Sf0d~q~p>-kK+ij7$$adaN&*}YJhjtFI)n5aynV(9}MD>#W0gMh=m0u57 zrQo^arD6jrd)AG(5aB2flRkr8Bsq#ahxDcTmN+4TQ?(NVi2MyRZ@$m*_KuVVd~gTz z_fv|E!>%94o$@f}SQY$B9W${|C{iEi24`jVFNwmO;I>Lx)u9LK6WuoeL%6G6PI)js5&0Hg3Av?IznVPV^ zQ53D3#$Tt8qz-H4)(rGh*5&bIj`O6(pYX0q9tp5>5+hpp)T*H`{R*#%L&qTjY6i zTpgTu&?{WaUSSbod3~1P99omj{*Y8!M2b2uJ9b+MSEbEzir0FE13!VY zqPOTq&ERgx4X!Xe32I%6DX;v*95}PU#Jgc!oM= zXEeoJ(Th|zp#n#uYdWWc#x09Ptu2U|OehK4FK2?bU=*!G3VkDr;?v9ZY5*BSxF<6Y zWX9hZyv1$*n#s&$Q>E)V{orypn3G|Z*_7hYpF`IK>8b4q6c@BJuXsU~K0bGAjFiwZ z3C+rjqhU@OQ6{^&H2vciE;#Xa+wZMsAU$qDW0t`z()iQ7ZU!?zVnodHm0#16=73 z!3Yw62Fr6GT*0B#r}7lfzVFf`ZN1@T!9Jla`+Ju@W;I%u0%~q@!C*9!C#9s%-j{M% zKyZoHH_jm<4--0Sna_yZZkZ-5Y8X|@r~DcZk54xkNL~3snwZk$TN4#Ps?{48GmEcV z--PJ8Dkn$KV|g>l4|pAlBu<%I0z#;GlVv&h>|VoLv^24oL=WEORsX_6OoY%ejG@(n z=^NXYNw!GJi>EPT@BX~cs>q})D?l3b85FIJb*=BJx6f+baFv+#8d(Yti5K$_E-Y_U zUwXBoZ4l8~Z2XafltF0YZ|7+1USqAWWuIYO_V1|CaT)3d)+oJXfL@+Bc_vDwz5;L^ za-QRk$XZ_TjWN$hKNjhEz{DBW$6XID1Ye(;1)zqk7~xsd3I2fsLQxvkGo&BiGsf_o zL11w%v|MoP-FrtvziF!uAza`oR=pGQpB~y;_(mCYYEg#ML1p%b-@ z*zMtWT!>hCH;`lCf^@o_wG$l|yRokqU0124N}6}G+*hV(l`@K*oyFPmQ}s$hn?NMK z*5*2HQ~vtMUn}2CquK_<1y6_WoG-uWK{ydOnxqUa!-^mkWA8$SeVe`T1z^w~}L z`8JWMYI-T~J*vR^F9*2=E5y1`Dc7||=X2R`8`=tp7N^jvd{>US6SG282??*iSf?UXr4E&h*~AbO1J@(ztm*xmxi z3M5ic+6cD`2KOleIp|91cT<}u3bh_s>SfYf=y-yt!vyX8mdw?;Fb)-(8uWLU>Ugi= zE_D?a_Kr#Hr-Q=4gRh<~IN4yv^}DT8DDrT}e*xdC6BJI(dCgn`PZEsXReL|PuL-`a7F@x9{SQ3LfZ^8Aqak(84TV+l(T8$d#4~c8G$Nt( zNt&|Nyx3%Y%N)@W;MY=BBS`vS#r^&vCaGbmBzR@RK=r;cM3!H|(+dB4`a|~9yGxq{ zCJY9Z`s3LfQO`MK?l-H$=%39dmV?$?#1~r(?d_S5zxb~{oqYNH3FIw>)Li12J%VsV zvkg@3=O3~O#;aFQyoSi96W}_ttQu@n=SPKZ#Dqy_#D}kuk{`ud66epJe4DfJ{-~)V zA!8XA5UkNN%^W5HlU)C(ylGhW(3)gm%t|M#D9~MV*QII?Ajj4BW@&3H)%6-~qW@)R zOn3o9;G#E+pv6p>Qq#9StX zl*gd#btwv^y;N$VaG}Q2Nc4ztp~82+B1EcrP3bbsBRMtKvaLTWhr4{e^Ms)C*s;I| zlcm_3(G)$tj;qXTe6u4eGm@?>{f-YY_i0KK*2=v3yV*~@DjM|4PP^k$iwk~EbH;O> zE2rR(O4r0aYt5V6cE!RD|M8;aO86d4DqfsDxtuDS<2NoUdwY{t10HB^okCmBRD`X^ zugJ4SUvHyzxlN^k7<-SfNs05qMj#nJ-@kPB-dFF8y;yEZWD_x!LOoU1^vJn*9~&1T zC>$VDOE)2jxzg5%>rnJ2)g{i%M|fPGPTR5G@NNbM0>o&QM8Fz9B|i3K-(WqpIRP{r zJe{d}_6)`o6Bxz_T6_E`juN5(ol)Xnvmtz0t!E?kFZp7>yM6u==J|u-FmhvBLEuS1 z?yX$tI}lf@s*Bbze_LX<96N%8o7irC;>8S0x>x6T+N*EkhurbmuL6aC z=2!idyjn(uUD3~a0(N&d=;XT;{la*hTC4ru*3=~p23Q5sO(p{%myr7|_*<1XPrYL| zwrE!8^#LOx7@I5kbRto1JX}+g8_af1Z{A9ci{%tybN#yY0k88-^9IrCwra;a49p~p zKbIN^I@vH<_%aV|AjazJwcUoYgLY=V70guO-@88J{)Q=gp&i`Q z*vjVJUPTxi^?aT>|P}Ii`2#f$>-0 P>j4aP&2(O1T@wBe5;pOt literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-microsoft.png b/static/content-hub/logo-microsoft.png new file mode 100644 index 0000000000000000000000000000000000000000..9514b866b22b699f86e16643408e930d37802c6f GIT binary patch literal 815 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7+9Er6kFKIlR%0k-O<;Pfnj4m_n$;oAfK@~ z$lZxy-8q?;Kn`btM`SSr1Gg{;GcwGYBLNiD3h)VWbuaMwzn$S@fD*&vw{<%iYIia) zEPnq!KmjP&u$_Tn$@@*P#0H8kY6xE0|+<(0nbtnU7%AcJY5_^ zDsH{K5Xjk_AklWwKcHZ`nS`3anuH0i5qjDYiK1^Fz2#@CV4tUc@bF6ItGj2l#jgT+ zViZ6_;E%S$eC8R!wb2dNr>#=)oCHB%rd$h||1D`w(A9ZanT)%PMMuL6DFhCz<(}&; Um-_Q!;Z2aJr>mdKI;Vst0E>uU(EtDd literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-renren.png b/static/content-hub/logo-renren.png new file mode 100644 index 0000000000000000000000000000000000000000..40fada9f321b14bea6a2a7ff482f20595b02274d GIT binary patch literal 7614 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 literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-slack.png b/static/content-hub/logo-slack.png new file mode 100644 index 0000000000000000000000000000000000000000..fbad005161ccf24c7428d5aac8ec0a05e5a08413 GIT binary patch literal 6297 zcma)Ac|25K*gyBqVwf4mE?I`i*r%)|nGr=KijXi`rLu%9k!w;-QfZ|k6Dn;8A<2xg zB_VCH%~Y1cFT03l-rM{8yvtwj=RKc$?)^UB`+c70Jm-GS`P_R?ySr^5OQ}i$0Lacx z4qE_#Q3wM92EDwzqtk?5u=|*sm;gLJPh1Sbp*9q`WrIB^Y*qV#8j|5ozL5YB<^OgF zT+dQL1;OsFo{k&BU5ASFg&Nx}8pcP8=%XbjCgq8!Y4YT#MdLS%x^eTDVodjw=s0I}nmnWFljhPf7C`K8J`frqFKBg8!MutUM3ZZ^dbZm|4pRsYw{$){3SXz zV^nWkmVm|?EjFg3Uh2LmMoAP{)Qwp-P6~?X=rI18XwrspG!&gbX8a`HqJ9izjGrV3 z)VI-#!v85X5orANMU^P9XqZ4#pfwsitw&Q+i~m++Qhw}jWKCbo`iarUXqIE6r6!h* z6JteMXyHQ5?WhKI`J&->r`UC@m_Amlg;s%@U)253!O(eQsMo)f`JYv9uh>^bK_5g^ z)E2j`fGXfIMFIqYY8VI=ftUhO4V5}JHYT9tjIl%%QBHVHcsPT>;!zoWR2HQ#oYL2p z)8Q@SpB|L1;KUv|d+*6Wk3 z0>`&UV#21^zl+)xQo4V3u&SmU zFHdGPo!$A5T>iS?L)Y4| z%-yBZm9b2CLqNC?1|BRv`?+GJfxbA1#L7rgp_+EO8g`F4fVz;aYv*H#o!DwiaB5uJ_$a25dtAZgGf23JlkdUu zecSVZ&mxxkUN3nqZ}FL=j_($TT9-eHIiN;FMwVaLBdIRby@g4zIHl|Aa2uZUtKrfGMIKgkUZ?%h``1I<5a4SEn&f(LMs&Y#DXZ!Ya!WTZ{__ zXyhUJ6iBLRHnG8eax7YUPTK*DLSGyCpIUNor(fCaWtyo-$+1G^+vRn@PvV6Sa4ZRP zgN^0;L%(Q}&2|xkj&EgkkTcFm$|`z&c95|L%q3p_fN9mloo?oJZ)g}xSJVa9ru@H< zgJ9udOru%hV;(OnZR12SryZwjy2ap@bK6g9fL)aL6DGo-@SM`5zN5TYwf{F5-3p`i8Sd+tyMe$K5fL^1d-Rl%D>W5+{1V{Mn~FbK9k_?lHxz!>Ah<4we|%6V52<}ptYEqEi*lG=+fNyDm-ld*~qz< zu(+Oc2VbBM9ux$VIo_hgCER>4%FZ>ThR*-mg`~p8X{Q^IxdFi`NJ@%tsS}3j(mCg; zZOFJZQ>C#lxq68UT>#? z8;l*BkzLGoj^}0vn0i0w_0C+7;}1Sf@UM_gFTv7u80SYOz0`@oQPSNBF-`bX zG~xrQU69rAv~^M7hsPi`14LuzUf3X2=WzT|ENvO%>`@T2k$-DBOw!gy-q^8aRLM}- z4n-r!bqFjbT(tV+BJW?|V2{*%C#W65`lO`*by=isDCX;H8KS{xS22n(EBjYzp0v4Mpr5pJX9B;r2gw~{ zjWrQkZiPU=?tE(?z5`e6YEAUXv4*O;5>3Ce6MqE0dKzbT&J!B0)EhUE*tvmz5jV#j z@UM+ba&&sXs`x$|7~Arc=~ow6__lS3HFVIJw`8}ocxTN98JZh%{*%jI3pxG;QSdq9 zM^6fC)9Wyaur_7Z=6E9275RA9!a@}nw`S$`7FxkQHn3WtB-UvDoPXG4S`q_-;Iy)Y z_3h=~1NToF)O27g6PepHZ28lRZxJ#ygq$}ZgdbhnF`y=lwYwu`OiEKXBHhgID~Y*t z6U9}0D9r&nxW>?D`_jrgY!IWVT)1Ir=N(xjMzY}kc-`;<^I>qhcvDr*h{B(OV@u#3 znVo4c^$xbvU@@eAI4$~{9Z9uAwDZ^fI%!54C}q>?k13_!Rb=Uu0uF_Bgc8A9@jaXQ zMz*5jSmGuK(vZ^bOBC)s9e|vTUbT+Fgx4rIR41)od1#JnatK4AGKOkz8+L-ZP*`Cp zNP-4&vVslkLsi#)nJliUx`lwL&<%!%8Z5+dJovr!4nn7r~#?lx%^;SqVjw`8sW^u|17cGjDVkkS5 zr!AVb;Sxowq!>#bblvcm*Y)T4uT1FA$pO>MvTu<}H19Nboio}Cc7Y-C*K7E$ zOSOKS_CaKtC3zm6BWo)?V$B!trnA1$-dh&0 zUD;184)`UmYV;7`Tgq!WqIk|EFUU!m%Ah0#s&JxYS<~pd5Pmeba&y3z6X(TVdc|^H zxMsus$My4OfRw^T=GwS496_mWh81g;Ds|baf;>3=$AD5iUZThiE;^CW`*thh@;lMc z-CF8*tDe_Ju|S!Sec1Qg*Cdx@uhqEJpkWh3DD_LK_)!4&u{>F#`NrpqwO6)xl#&#P z+3}gW7Y~;3w(tA>V(N-wy*e$!yJY`5kk=nFp(UAG&-Ry@e@ZmwJ5r7=9Sw}t&sM+b z4G*lTB@c%j*2EuZcj@n@?$8(*GuwqPQy#?{E(qB1|Nw}DEWk8pDKH}COP3c z|M{bZC8*ZHuaD3x$}CQs_!YrQeJ6f+mV+SnoZwf>eKAk(?cfm5JlT_Uck2&0g}5`> zL$7#xw_NniITQGr;O-=j(91R&@);FfQW+mT!Sntz_rtRWkY>3_C;RZN0d8NDiw+4- z{pDQQglFXHuIqIt9@!NH&P;kjkP1$=74hD@d?L9@R(LhZ4yF@#en}i(h6=A<_a;^eQ!pFgKbOZ;S9Dt_j*&O;H-Gq;C(I-Xz5jxVg9 z@m2*?UCzhNS{g2XUKaAziSGdN^m2}H0g ztjHi7FOk6-(}l*7=lD>zD<_@!#dQbj{#J#g^8 zZ(Pu8h{V(zsIe|7IFYr3ec-}JZAnYq6s`Gq;8bXz^b)E$;86BER1z7bYAYa-x=22F z4^ewhk~~1`737vQa0)zS9swCi@o!<%+kh(I)>E|yA;z_>ZD4pzd}$E`tiV{?5-UGJ zKuYuahXFg&r@BFVQm$z^0|m?U36vVxd| zb{K&54*_StG{zi5%}otzouKpg+rB%?8iA;0x!zu&#RnR{(s|4aM)yud@NhCP{{0!m z0DNZ`SnIDA;uy})2?en5rV&TN2wrQ1DFcWJ=k65K=o(ba?ICT!@C|(_ILqS+oeH@) z5XJN)!3`~FK26+ym`{nM{<{UZ1BMic!XiKWl&@p>Z?Go!#{OIy1ayCVhjFdh8;G@< z(6LkM0S*xN0@r&vFC9?TbP(n9rA|h$G(zwlNLv3~tN+X_81JFjN7Elp?zpM}bRGhg zA7z?bWk4($zWV;g3XL)e`TPE80~ZNaQK`O^1YW-^a6m)8mhLGXAC$5R3b)!xh>xUMzVHEP<Cx?0C>RHh%L%jNo!cC4VcMkto|v3DXKXuzV;F+Em;f^*<~dCj9+p4`zVX8uiyuBN z&l!Fz1s<2GA}c2JY*fubFUag#bPtafRaI;`!hSjkQI%#3vDM7_k=1)1Vx@wpK&c3O z^-ADRqC#)jKcM&{KJC7#&D7DFUeg!upsu-jactP+*-&rLLX!`8XwEMEJ@PYJXHCS3 z$AFWZh;8|a)ra0p6)gj^vh6gn1f1}D@qi?92y5QLqukrvEq;RIo50&*&K51)JO4pg zy-8$&W4Jz=KglUQ5ZN0#bUIxyy!HSQp)6}Ww|KtW|A_h6M?Blr2SzxDf-wOmT?YTO z;}@S8K7<&gZFiKReUW-yuM?k^5wQCg0^g|st%kjJs!|zWS1Ky6g2eTTS0O6?^seHC zXYv`%hwS9WKYezzyKM#R`)^(&SU=bib)mbJ6mb36AISPT^OXPZBx-T?T*tdG7)W4A zk;fDB#dno`7G_9uwd1#5hGhc&TcXNVd{%grUi>A$H^`Vo_rq?}Oo-2P!Kj31g=d_( zIk5K4FOj5_^sB(TzC(6lB(Pzf_4X6z^1>#qzMV+Vqq$U!Bno*4N^)d~6&ZGiuGgfF96oI{g{RgzaIC=XU&@m$XgKCgRJW{29dv?0aM`NKJPZ^o^-CjGj)lG$ z_jBn7`alW|s)iVnLTRuOL;`m-s8FlB8lpw!->?Ep|DKAITOiu5eiU^o^VJZ_{2&>8 zgnA%;D|HYgIKDtr$fNvWBy9>0Y+hz!fO3->vTt{m70AS`lmJ7ROboI~>wizCJ?NNX zra=G$Qm2@8yFp9(giMt#hH9f(caemQHO)!9i3Tht9vn$Yc)xEY$em)6ngD;Ef8L-8 z6r^g`ePekw7fgz`E7p^`*?E8JNw5|7( zB^0*CGP?bR8N;;DV8B1s??!X~L*x96pco-lzQT3U6!Yc4&;H5`5*F=|p2iM0>hIS< zawS?ua$_4_F&=12ta*>Skca8)!OYHhP#$9F5^I;uAB9tYQyY9Roi@bZAE}&sQA;^7 zDf*?!FPD3yxr595X-j~2uscl0Z`%f+e3P5*2d}ACbMTVPtbD^p4IwbF@OXwz=TQ)h zyCpHx{QS<7FxS;IM4dYtK|P5yCkV?oDcD#u_QYR&4{|M;uD0f2PgipjZ>$`BGiYiO zOMgDpft`JSH2K~(xKF*L+aZ+u5j2%Rba3_)d+ndCtoZ{>2^;3p2kvI@9OJbWN|MvV?2I%J*Lp76&znqZcixu034cn5!u-4zj8EM!BA97({DAUzD z@gSzrr2X|El$}Ff=>F-EruI;LAyI6Ew_WR#mqkA(YJB`7a z6+9w8G&P2qU4aV970|vDlY%${YmeV!;s*pBY0;l6iphsYw1t~XYVtVGKN3=wMTu`x zg7@M7IBP9Sy-G-t>=5X|^1O(Nq>GA zJW~F`M*O1iHYb0BY?#54@T?Dn)<6wR{VnAzF8|l@8Ot-A+@=`A#t66mzKM$};)N2$ zJwFl>>x3EXKd;MUIh?$vZ@qh!R`UiPU7V16rS}MLciWOvyIE_Bg1uId1X9uulpB)I Q`2e&zJGwa(+OydI0SmvTF8}}l literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-spotify.png b/static/content-hub/logo-spotify.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e4eb7846c311d7baa457d3814e77575f3af478 GIT binary patch literal 5836 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 literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-vkontakte.png b/static/content-hub/logo-vkontakte.png new file mode 100644 index 0000000000000000000000000000000000000000..757b3ffedb16c55b7d8593ef18fd437cba1b000f GIT binary patch literal 4623 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 aDrlz5R7V_|tVACdfZbjvt1?S^(*Fa90=;1X literal 0 HcmV?d00001 diff --git a/static/content-hub/logo-yandex.png b/static/content-hub/logo-yandex.png new file mode 100644 index 0000000000000000000000000000000000000000..84f79f818cca045c8a8a21d8d3967f8b9771d426 GIT binary patch literal 5706 zcmdT|i8oa5|9|c^W{i<7dt~f{D1`{4?82lhWgEN5Qdx>{X_rEUvinGpZ6Ye`$WkI? zXB3g_OLoTc8=v1f-#_7d&i9^spXK#>zh3WWIrll|-Umce{e8>=%m9FWh6Xz30KoJn z444?`RoyG`FZ2rKu5F?Xz}pzymLns*4_!0YKLrX~1t;kpte?S!YXIQ(?>!JmO5vk} z-NZBJb@lzuj7j1l7=|DSzDzFNaKG?;YaE0zn)_f_)$qbJ%H{&j~kcVQ_-paT)+QCeoNrT=|YLUn{K$5onAr^ zT|OeVC!uGggJV*Asp;AgdKkS+2Vs~#l0Dmhhe1z42bcS%_LfA~-`w;Z7@Dt1XCK0o z2*?nAC|1#reZGc7sL60>BNF^#Gm6rY^!YXiU*DM6@C-8&zDAMkP}J5&^eZBok$p*K zZ80(76u(tNu{Hp>3Ji6$&tD&yNew?u)#JST==QsW!X58X63gMc1pFN_!{jH*Rb@f1 zX*L=ay!sq^4y7&0QXA%37I4&tX%>norP#)^j||){BTV_p-F01B0Q-T3ZPWs55tgKO2tgrA3zNg0}~9njzn+pZvwgVY!0l+7SDBmVN=K-W-v{ z2ySdgX7n)OeHM3qJpOfcA$3iG$uk}( zT{mi{v9uqC>c@2w`*<70n8_72f4Ewp_cx9GDo}h8CrC~2QSXhxTQ0vS7cg(n-gOjm zBeIgv9;v`dCPVSf(1K8$_kMyLW6IS2#=UK%!YznQtxdJWhfo-wysgOa?ktiWcHzry zU#w3iFjw)LQD%7FFcuuphbxwwxRdAqR!reyG*6<{^a5^Le|$y{sa-xAI(+m70A9)`3;?`>F;KB7UAJvWP!SL&ded{txwkP z8qB%-D%WZ6SwQmC|ubYe{0ASgKM(L z@GkG`;>4FnH?!>?Y~A)P&OZYE?7D;#SwxL(w+xQ6MfhaIGBlQpfc zd{Xg#Nh3;eockV@({KGne3)YzZC&;ySF8=s)t5H79$lOH_yS;Ok#a((gEB7Xbq4J3 zy^Q-cewT=z&^3@DnWsYbvga)97<8bnh(APOhQg9RC_YpGRg~LFugSN0=mD)kSkqDt z*Wc-iX#Nbt*&^X^uG);M;rA7k;#Z%uhIZ1NtVeXz9-(C!1{LT0u6cJ9_-{zE@ zn=i?jWlLGw)FbBDg5;{5Zn)*gyE}fqE8TXKTZ{aeZ(K#hLizhdQO{!BJ#n!X_YiR} zBI2d*9XC-CfgR{gJAZO%{2uN0%Y!fVn7cpY&lD#woLf11@kDKDk;_`HR)t1 zGWeH;A5nB8t4?0HjcmfGh0ArjuzR@y+VJX?#jGmuk1d9`bFu+L?9E;6X^P={gQl9x z41dT^v|ijI&K+YrX!r9H8!NQJ_=U3qCT>bok}kEGg2~}+UyO1di@*<@SgnBtYQjRY zcC_Q_f_yR0%!@FZnG$(2Gco53QZwTqSAB*}ODA!e5-4u1Xwb&Z@st4v-JZExCM`sb zzm1&V_{DA-$$erN9W1UYU%ln9rHVRD$OIT(vlWGE!!>!eNppCp?h4;Ad)G+Y98B=*!yb}jcY2uO!nN|ZUcZsJ=cKY=IwyR-2(7I5 zRLtKU%Zz88+Q$Rz0|uG!C}8KsrJrACWW%C~mbpifm#6NF6; zfO`JS7w5&Vl4W#YmTnScNs&m+vS83b3Og1LKVj&IntS?oAN^b#)*2g57r3rX%-H=# z2BB2|opw?O#T1{4lg8+9|9Jhe`ZO)&z(>K8o+EL?`?s%3TO*k}NrAtLMexX3$iu!5vR68{T*!f*j7DvAK zs%4lWe$0-4@leP~(+PCiPvsJYzK@$d^w))b78Zs5BR+(&uINNMm6W%e6TU^a|9qcFuHSYC1VGwXbj?u!TyQRi*@%^HBUl(_S(7#zHpg%ma_q$;xVYzA{Eyw1*P2Kdli@Xs=wWt;1Gxcr)w1`p}JMutCJuKFy@$y^H#K=Ggw3~np8^Jhu%9TL2x?D*p6d&-hL?Z=OI!5 z!L?nbw-t(?3m<~-q$K--UaQGt4~%R)>R|t0F9-yLX~x0-yYLG($k05GIsXtN#dX-D zJgk_gWpBr79|byml!dHd@!?u6M>}+GFFCDO4z>tl_%2E)e!?^P*&#^pQK{I_D-@IW zCUOzFJ3MNLEmzE5JhGKGyTY5!QQQPvldo5+P&`*iF% z+`qOdRR1go{DJ`xbZQ||Kx*lUDNMMc!rlbZyQvL6#vqfYpnt(chQKo5Dz|vHDF4WA zjtC_`kYBa9Uz$D*N=VTu*rjjg@v_+Hn{$TE0wq0R8&8v5NzL*>%CeMpPp%v;z^b4O z>p+7ErEa&oT!$mZ5{#3%@udQchZti&HM3=aZuh6kT!6VeqA0m)S4AEnhO(t#iOSzS z&`thHnsslaIk=U_Doi!zyj%cHzE@cmvEwJmApX9ruM@5E>e8w;-k7~2=f!t%5vI_G z95{IUeLudx0JZ*&NVG?uwm_Cr=R#Q4|KwZtsGvy83@ThNfmsB&@ziI){D?;lo%{V|trC6lUFNtRqd~iq zyeQ$_5h!{|lqdw%13$@VLs!PK!-U>=;N}dsBx6AWd>$=)2`1f;*_ z8ItXwauep*%SMRLepiAQ)S4-B=?pZ5!#57@B%t_6T9I%UFJVVZ`<)O(kzc#He^{7z zn+@ac!zi6o@tVqkZw$NT3*V##NE*K4y;NS5v8Z==$_s77LD>A>w?ww#C4GP(+oQgo z%6&%23F~KJ5%5cONy4w_(;xOhFOLwG=U3+n-g_T-Tt{|)@uZ1T9CgFfiA9q~cH{3XuEp4WkhTm?uBI#G*4Q3xVJd zNcuAya{Y4w7EQWh0a?HI#|N*W#vtkJy!`zb0vkW#6b;@LRvpd4;GeGQN%A3^NpQR7 zkfN{#7+E|ch#;Z=Y%^q_t#jo)U_B3X6a$&(y$(I>q$O~R=r(?)NqUx+p$ZmPxF0ZN zeByDsSA=cB6aY)t!9xT=#K;zxy>s%U-;Vbo=!3_#cr_n0q972PMTxT!4p%#AgH^|F zp;hUR#6Smm-;v}A;hllGI9NVgqj

+Vi_ zKCvnx=P<*@ed{kAKo|bnyVi%+ea(g(NCMz;+$OYXME<#z-+9G^p>n{XPSP7l{zQ|* zYSsi~0ZpU=x}$N?qW(nf?rHE?dwz1^k!Y1=3Zn(U^@h9_Pyih(g#ApE!xI{_{7Cy4 zTDubz6&6}6+k@Zwijr&u?k?tK7Qz*QLJqS3_Ryi9eYaErE$;wxSy9e|KsTc1AhG?s zh0iwy#x=uxk%^tGNI<&oepygas|UZU7)#RiLhHR?dGksLOnb>bO<;Bm94o3;tAw)4E;77%6InuU-oQnopRTIapR4x-3sMmVfx{ z#0{|8VL6Y2iHtYTkA~m8scFC+TN-0;6<2<65%5hOqGC~mJxUl%tK;YUIXt);-%OYC z^sK~U2*yjA5uk4fk~9bTf7LW}=NRmH25eHW&<#*ucjz1wvN9TVgF^~D-ghgYi#g-( zd{S?apcLpyr&?~G5do{GtybgU;lA3}ZTSnuqx(qSkEXA{L~LHC42q)WMYVT|1gei$ zzJ`e7=MO9G&z|OB2bUgtazgDRHsV+$RB7!Xc75c?FUv3bDx)aM&exEnKp;3jDQ607 zrD%*&_$B_!-<-}c-9}M1S^a!C|N1BC073OljRq`|#jN^GOV<8GyrZ@J4CIDIXYB*~|~$ZKRqtl;SEw@;3NYHVMw-nX$*+S3_{bJMLy zKg1Wdsy^lc)Xdm%RvQ~<32)%$*&FK28lQb?b#SK{H56vU*uL`3s;5Y*PXX9nDZ)+X z$zK6(C2e-K+w-4F5U_3umyYQPG2Q~LdbeC|ML8rx>-b#l^ZgrK$Bm1ZSqU^tP3o}j z*@o89zrM=>Tj}{G?kHBb+3o_H06n$o<6_Iy^cvfBJJp1V%PVrNhpTdYcP!Mce5!|1 zrl-Ci+o9BKmjn#`v-p|I+iO1WZw$rpm*9_~)ZL6b`gwstXPE=KsyrFOr!xgo?PzZ;df35H1{%;z`~dnbWWK^KNa6)#w^~^?W;JxsJN_b#c33 z(EcnXK1_Og-eQ6_;utG+ZgRGfZ;9Mr*v&%!7x~}5UQH`B_$#Q;mKjU-QXA@;>J*+L GMgAYYmYz!h literal 0 HcmV?d00001 From a58e7b0a448dcae6eb4c6ee005c457b759f5b85f Mon Sep 17 00:00:00 2001 From: Mohammad Shahbaz Alam Date: Wed, 20 Sep 2023 14:44:48 +0800 Subject: [PATCH 2/2] Update vkontakte.mdx --- docs/auth-provider-setup/social-providers/vkontakte.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/auth-provider-setup/social-providers/vkontakte.mdx b/docs/auth-provider-setup/social-providers/vkontakte.mdx index b03dc7130..a755ae3b5 100644 --- a/docs/auth-provider-setup/social-providers/vkontakte.mdx +++ b/docs/auth-provider-setup/social-providers/vkontakte.mdx @@ -1,6 +1,6 @@ --- title: ВКонтакте (vKontakte) Login with Web3Auth -sidebar_label: ВКонтакте (vKontakte) +sidebar_label: vKontakte displayed_sidebar: docs description: "ВКонтакте (vKontakte) Login with Web3Auth | Documentation - Web3Auth" ---