diff --git a/.env.template b/.env.template index 0131eb77d..78a103940 100644 --- a/.env.template +++ b/.env.template @@ -1,35 +1,73 @@ REACT_APP_VERSION="1.0.0" -REACT_APP_MAIN_ENVIRONMENT = "Sepolia" # used to determine which SCROLL_ENVIRONMENT is to be treated as the main/production one -REACT_APP_SCROLL_ENVIRONMENT = "Sepolia" + +REACT_APP_MAIN_ENVIRONMENT = "Mainnet" # used to determine which SCROLL_ENVIRONMENT is to be treated as the main/production one REACT_APP_ETH_SYMBOL = "ETH" REACT_APP_PREFIX_CLS = "scroll" REACT_APP_SENTRY_DSN = "https://791d7df9132d46a9868de0863bd6583c@o4504371258785792.ingest.sentry.io/4504371261079552" REACT_APP_GOOGLE_ANALYTICS_ID = "G-XR3MGVSHFC" REACT_APP_CONNECT_WALLET_PROJECT_ID = "14efbaafcf5232a47d93a68229b71028" +REACT_APP_UNIFRA_API_KEY = "9d431c1c-d717-4931-9595-ad0b3a246d13" +REACT_APP_NFT_VIEWER_URL="https://nft.scroll.io" +REACT_APP_NFT_API_URI="https://nft.scroll.io" +REACT_APP_ENS_API_URL="https://ens.scroll.cat" + +REACT_APP_SCROLL_ENVIRONMENT = "Staging" REACT_APP_API_BASE_URI = "https://sepolia-api.scroll.io" -REACT_APP_BRIDGE_API_URI = "https://sepolia-api-bridge.scroll.io/api" +REACT_APP_BRIDGE_API_URI = "https://sepolia-api-bridge-v2.scroll.io/api" REACT_APP_ROLLUPSCAN_API_URI = "https://sepolia-api-re.scroll.io/api" REACT_APP_CHAIN_ID_L1 = "11155111" REACT_APP_CHAIN_ID_L2 = "534351" REACT_APP_EXTERNAL_RPC_URI_L1 = "https://ethereum-sepolia.blockpi.network/v1/rpc/public" REACT_APP_EXTERNAL_RPC_URI_L2 = "https://sepolia-rpc.scroll.io" REACT_APP_EXTERNAL_EXPLORER_URI_L1 = "https://sepolia.etherscan.io" -REACT_APP_EXTERNAL_EXPLORER_URI_L2 = "https://sepolia-blockscout.scroll.io" -REACT_APP_L2_SCAN_URI = "https://scroll.unifra.xyz/" -REACT_APP_EXTERNAL_EXPLORER_URI_DORA = "https://www.ondora.xyz/zh/network/scroll-sepolia/interactions" -REACT_APP_ETHERSCAN_L2 = "https://sepolia.scrollscan.dev" +REACT_APP_EXTERNAL_EXPLORER_URI_L2 = "https://sepolia.scrollscan.com" +REACT_APP_L2_SCAN_URI = "https://scroll-sepolia.l2scan.co" +REACT_APP_EXTERNAL_EXPLORER_URI_DORA = "https://www.ondora.xyz/network/scroll-sepolia" +REACT_APP_ETHERSCAN_L2 = "https://sepolia.scrollscan.com" +REACT_APP_SCROLL_VENUS_URI = "https://sepolia-venus.scroll.io" REACT_APP_L2_SWAP_URI = "https://uniswap-showcase.sepolia.scroll.xyz/" -REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR="0x8A54A2347Da2562917304141ab67324615e9866d" -REACT_APP_L2_ETH_GATEWAY_PROXY_ADDR="0x91e8ADDFe1358aCa5314c644312d38237fC1101C" -REACT_APP_L1_WETH_GATEWAY_PROXY_ADDR="0x3dA0BF44814cfC678376b3311838272158211695" -REACT_APP_L2_WETH_GATEWAY_PROXY_ADDR="0x481B20A927206aF7A754dB8b904B052e2781ea27" +REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR = "0x8A54A2347Da2562917304141ab67324615e9866d" +REACT_APP_L2_ETH_GATEWAY_PROXY_ADDR = "0x91e8ADDFe1358aCa5314c644312d38237fC1101C" +REACT_APP_L1_WETH_GATEWAY_PROXY_ADDR = "0x3dA0BF44814cfC678376b3311838272158211695" +REACT_APP_L2_WETH_GATEWAY_PROXY_ADDR = "0x481B20A927206aF7A754dB8b904B052e2781ea27" +REACT_APP_L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR = "0x31C994F2017E71b82fd4D8118F140c81215bbb37" +REACT_APP_L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR = "0x058dec71E53079F9ED053F3a0bBca877F6f3eAcf" +REACT_APP_L1_USDC_GATEWAY_PROXY_ADDR = "" +REACT_APP_L2_USDC_GATEWAY_PROXY_ADDR= "" +REACT_APP_L1_DAI_GATEWAY_PROXY_ADDR = "0x8b0B9c4e9f41b9bbDEfFee24F9f11C328093d248" +REACT_APP_L2_DAI_GATEWAY_PROXY_ADDR = "0xbF28c28490988026Dca2396148DE50136A54534e" +REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "0xF22B24fa7c3168f30b17fd97b71bdd3162DDe029" +REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "0x635B054A092F6aE61Ce0Fddc397A704F6626510D" +REACT_APP_L1_PUFFER_GATEWAY_PROXY_ADDR = "0xA033Ff09f2da45f0e9ae495f525363722Df42b2a" +REACT_APP_L2_PUFFER_GATEWAY_PROXY_ADDR = "0x9eBf2f33526CD571f8b2ad312492cb650870CFd6" REACT_APP_L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0x65D123d6389b900d954677c26327bfc1C3e88A13" REACT_APP_L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0xaDcA915971A336EA2f5b567e662F5bd74AEf9582" -REACT_APP_L1_SCROLL_MESSENGER="0x50c7d3e7f7c656493D1D76aaa1a836CedfCBB16A" -REACT_APP_L2_SCROLL_MESSENGER="0xBa50f5340FB9F3Bd074bD638c9BE13eCB36E603d" +REACT_APP_L1_SCROLL_MESSENGER = "0x50c7d3e7f7c656493D1D76aaa1a836CedfCBB16A" +REACT_APP_L2_SCROLL_MESSENGER = "0xBa50f5340FB9F3Bd074bD638c9BE13eCB36E603d" REACT_APP_L1_GATEWAY_ROUTER_PROXY_ADDR = "0x13FBE0D0e5552b8c9c4AE9e2435F38f37355998a" REACT_APP_L2_GATEWAY_ROUTER_PROXY_ADDR = "0x9aD3c5617eCAa556d6E166787A97081907171230" REACT_APP_L1_GAS_PRICE_ORACLE = "0x5300000000000000000000000000000000000002" +REACT_APP_SCROLL_CHAIN = "0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0" +REACT_APP_L1_MESSAGE_QUEUE = "0xF0B2293F5D834eAe920c6974D50957A1732de763" +REACT_APP_L1_BATCH_BRIDGE_GATEWAY_PROXY_ADDR = "0xE86ad3312FA693aDeD34dEc3899176d97ac883B2" +REACT_APP_SCROLL_ORIGINS_NFT="0x90a274D591d5AB1a25f0DD0F06F28533C34D7d9f" +REACT_APP_SCROLL_ORIGINS_NFT_V2="0xDd7d857F570B0C211abfe05cd914A85BefEC2464" +REACT_APP_L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE="0xF0B2293F5D834eAe920c6974D50957A1732de763" +REACT_APP_OPEN_BLOCK_URI="https://kx58j6x5me.execute-api.us-east-1.amazonaws.com" +REACT_APP_OKX_URI="https://www.okx.com/web3/explorer/scroll?channelId=scroll" +REACT_APP_BLOCKSCOUT_URI="https://scroll.blockscout.com/" REACT_APP_L2_GAS_PRICE_ORACLE = "0x247969F4fad93a33d4826046bc3eAE0D36BdE548" -REACT_APP_SCROLL_CHAIN="0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0" -REACT_APP_L1_MESSAGE_QUEUE="0xF0B2293F5D834eAe920c6974D50957A1732de763" \ No newline at end of file + +REACT_APP_EAS_ADDRESS="0xaEF4103A04090071165F78D45D83A0C0782c2B2a" +REACT_APP_BADGE_SCHEMA="0xa35b5470ebb301aa5d309a8ee6ea258cad680ea112c86e456d5f2254448afc74" +REACT_APP_PROFILE_REGISTRY_ADDRESS="0x26aa585d5Da74A373E58c4fA723E1E1f6FD6474f" +REACT_APP_BADGE_RESOLVER_ADDRESS="0xd2270b3540FD2220Fa1025414e1625af8B0dd8f3" +REACT_APP_EAS_GRAPHQL_URL="https://scroll-sepolia.easscan.org/graphql" +REACT_APP_CANVAS_BACKEND_URI="https://skelly-backend-git-sepolia-scroll-tech.vercel.app" +REACT_APP_FFRONTENDS_URL = "https://scroll-skelly.env.scroll.io" +REACT_APP_EAS_EXPLORER_URL = "https://scroll-sepolia.easscan.org" +REACT_APP_ETHEREUM_YEAR_BADGE_API_URI = "https://genesis-nft-backend-git-sepolia-scroll-tech.vercel.app" +REACT_APP_BADGE_REGISTRY_URL="https://badge-registry.canvas.scroll.cat" +REACT_APP_BADGE_INDEXER_URL="https://canvas-indexer.scroll.cat" +REACT_APP_ETHEREUM_YEAR_BADGE_ADDRESS = "0xB59B6466B21a089c93B14030AF88b164905a58fd" +REACT_APP_SCR_HOLDING_BADGE_ADDRESS = "0xef071708e09becfeac1e3d8afa1602bb6eb57922" diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..c467cc7ce --- /dev/null +++ b/.envrc @@ -0,0 +1,3 @@ +layout node + +dotenv_if_exists .env diff --git a/.github/workflows/bump_version.yml b/.github/workflows/bump_version.yml index d329e99ec..f4d7c65ac 100644 --- a/.github/workflows/bump_version.yml +++ b/.github/workflows/bump_version.yml @@ -6,7 +6,7 @@ name: "Bump Version on sepolia" on: push: branches: - - sepolia + - disabled-sepolia jobs: bump-version: diff --git a/.github/workflows/merge_prod_back_to_dev.yml b/.github/workflows/merge_prod_back_to_dev.yml index df1bea7b5..ee4b52719 100644 --- a/.github/workflows/merge_prod_back_to_dev.yml +++ b/.github/workflows/merge_prod_back_to_dev.yml @@ -5,7 +5,7 @@ name: "Merge Prod Back to Dev" on: push: branches: - - mainnet + - disabled-mainnet jobs: merge-back: diff --git a/.gitignore b/.gitignore index 25d16984e..aec92f6b9 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,13 @@ yarn-error.log* .vscode .env -.tool-versions \ No newline at end of file +.tool-versions + + +.next +next-env.d.ts + +/src/pages/blog/data.json + +# Local Netlify folder +.netlify diff --git a/craco.config.js b/craco.config.js index 42de06d76..7e8d9763a 100644 --- a/craco.config.js +++ b/craco.config.js @@ -2,7 +2,8 @@ const CracoLessPlugin = require("craco-less") const webpack = require("webpack") const path = require("path") const MiniCssExtractPlugin = require("mini-css-extract-plugin") -const SentryWebpackPlugin = require("@sentry/webpack-plugin") +// const SentryWebpackPlugin = require("@sentry/webpack-plugin") +require("./scripts/download-blog-posts.data.json.js") module.exports = { babel: { @@ -73,14 +74,22 @@ module.exports = { fullySpecified: false, }, }) - if (env === "production") { - const sentryPlugin = new SentryWebpackPlugin({ - org: "scroll-zkp", - project: "scroll-io", - include: "./build", - release: process.env.REACT_APP_VERSION, - }) - webpackConfig.plugins.push(sentryPlugin) + + webpackConfig.module.rules.push({ + test: /\.m?js$/, + include: /node_modules/, + type: "javascript/auto", + resolve: { + fullySpecified: false, + }, + }) + + if (env === "production" && process.env.CI) { + // const sentryPlugin = new SentryWebpackPlugin({ + // include: "./build", + // release: process.env.REACT_APP_VERSION, + // }) + // webpackConfig.plugins.push(sentryPlugin) const instanceOfMiniCssExtractPlugin = webpackConfig.plugins.find(plugin => plugin instanceof MiniCssExtractPlugin) instanceOfMiniCssExtractPlugin.options.ignoreOrder = true diff --git a/docs/canvas.md b/docs/canvas.md new file mode 100644 index 000000000..b8293388f --- /dev/null +++ b/docs/canvas.md @@ -0,0 +1,80 @@ +# Scroll Canvas - Anthropomorphic "assistants" Integration Guide for Developers + +## Introduction + +This guide provides developers with the necessary steps to integrate the Canvas minting functionality on the Scroll network into third-party platforms. By following this guide, you will enable your users to mint badges directly from your platform. + +## Prerequisites + +Ensure that your platform is compatible with and connected to the Scroll network. Developers should have a basic understanding of blockchain interactions and contract operations within the Scroll ecosystem. + +## Integration Steps + +### Step 1: Network Connection + +Before initiating any minting operations, verify that the platform is connected to the Scroll network. + +### Step 2: Compliance with Minting Requirements + +Check for compliance with predefined minting rules set by your platform. These rules are defined by partners and should be verified before proceeding. + +### Step 3: Mint Prompt + +A scrolly can be placed in the corner of the page to remind the user to mint a badge. +![Canvas on Bridge](https://github.com/user-attachments/assets/3b8445f5-8890-453f-b92c-4834dad5846c) +[Reference code](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/bridge/components/MintBadge/index.tsx) + +After clicking the button, there are two ways to show the badge introduction: + +- Redirect to badge introduction page 【officially used】 + ![CleanShot 2024-09-11 at 13 58 01@2x](https://github.com/user-attachments/assets/62a21eb5-3bbf-49a5-8599-8d1c2fc71805) + [Reference code](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/badgeContract/index.tsx) +- Show a mint pop-up displaying badge introduction + ![BadgeDetailDialog](https://github.com/user-attachments/assets/8a664aa2-9d17-4f38-a170-11bb0f413e20) + [Reference code](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/Dashboard/BadgeDetailDialog/index.tsx) + +##### Main actions: + +1. Retrieve the badge description information according to [badgeTokenURI](https://github.com/scroll-tech/canvas-contracts/blob/master/src/badge/extensions/ScrollBadgeDefaultURI.sol) and display it to the user. +2. Check if the user already has this badge +3. Check user eligibility for minting +4. Display an ineligibility message according to the badge type +5. Disable the mint button for ineligible users +6. Enable the mint button for eligible users + +### Step 4: Additional Conditions + +Badges and Canvas are not inherently linked, meaning a user can mint a badge without minting a Canvas. However, if you want to require the user to mint the Canvas first before minting the badge (so that the minted badge can be automatically attached to the Scroll Canvas), you can add an extra check for this. + +- On a badge introduction page + ![BadgeDetailPage without Canvas](https://github.com/user-attachments/assets/6c6e1dfe-cac1-4e82-8e8d-02c3e88ae148) + +- On a badge introduction modal + ![BadgeDetailDialog without Canvas](https://github.com/user-attachments/assets/56d92a81-81c8-42fc-98e1-4f6df729bc67) + +[Reference Code](https://github.com/scroll-tech/frontends/blob/mainnet/src/services/canvasService.ts#L128) + +### Step 5: Execute Mint Operation + +Scroll supports 3 different types of badges, each with its corresponding minting method except for gifted badge which would be minted by the issuer. You can refer to [the function](https://github.com/scroll-tech/frontends/blob/mainnet/src/services/canvasService.ts#L330) for details. + +### Step 6: Post-Mint Process + +After minting successfully, + +- Redirect to the user’s badge detail page and display the badge details. + ![BadgeDetailPage](https://github.com/user-attachments/assets/4a0d53ae-7a24-4c1c-abdf-d6c7716a2a4c) + [Reference code](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/badge/index.tsx) + +- Only display a success notification. + [Reference code](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/Dashboard/BadgeDetailDialog/index.tsx#L121) + +## Conclusion + +[canvasService](https://github.com/scroll-tech/frontends/blob/mainnet/src/services/canvasService.ts) includes many useful methods for interacting with Canvas-related contracts, like: `getBadgeMetadata`, `checkIfHasBadgeByAddress`, `mintBadge`. + +[badgeContract](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/badgeContract/index.tsx) and [badge](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/badge/index.tsx) are the two important parts currently used in the Scroll frontend's mint badge process. + +Additionally, if you want a more lightweight way to integrate the mint badge process into your website, [BadgeDetailDialog](https://github.com/scroll-tech/frontends/blob/mainnet/src/pages/canvas/Dashboard/BadgeDetailDialog/index.tsx) is a solution worth trying. + +This guide should assist you in integrating the Canvas mint functionality within your platform. If you need additional support or have some questions, please contact our developer support team. diff --git a/netlify.toml b/netlify.toml index 025ed33d2..759c5aadb 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,94 @@ +[[redirects]] +from = "/blog/scalingSecurity" +to = "/blog/scaling-security" +status = 301 + +[[redirects]] +from = "/blog/founderLetter" +to = "/blog/founder-letter" +status = 301 + +[[redirects]] +from = "/blog/scrollSepolia" +to = "/blog/scroll-sepolia" +status = 301 + +[[redirects]] +from = "/blog/contributeToScroll" +to = "/blog/contribute-to-scroll" +status = 301 + +[[redirects]] +from = "/blog/alphaTestnet" +to = "/blog/alpha-testnet" +status = 301 + +[[redirects]] +from = "/blog/releaseNote0109" +to = "/blog/release-note-0109" +status = 301 + +[[redirects]] +from = "/blog/proofGeneration" +to = "/blog/proof-generation" +status = 301 + +[[redirects]] +from = "/blog/upgradingPreAlphaTestnet" +to = "/blog/upgrading-pre-alpha-testnet" +status = 301 + +[[redirects]] +from = "/blog/technicalPrinciples" +to = "/blog/technical-principles" +status = 301 + +[[redirects]] +from = "/blog/preAlphaTestnet" +to = "/blog/pre-alpha-testnet" +status = 301 + +[[redirects]] +from = "/blog/visionAndValues" +to = "/blog/vision-and-values" +status = 301 + +[[redirects]] +from = "/blog/zkEVM" +to = "/blog/zkevm" +status = 301 + +[[redirects]] +from = "/blog/scrollsFreshCoat" +to = "/blog/scrolls-fresh-coat" +status = 301 + +[[redirects]] +from = "/sticker-vote" +to = "/sticker-winners" +status = 301 + +[[redirects]] +from = "/canvas/listing" +to = "https://badge-registry.canvas.scroll.cat/badge-registry" +status = 200 +force = true + +[[redirects]] +from = "/badge-registry/*" +to = "https://badge-registry.canvas.scroll.cat/badge-registry/:splat" +status = 200 + +[[redirects]] +from = "/airdrop-faq" +to = "https://scroll-faqs.gitbook.io/faqs" +status = 301 + +[[redirects]] +from = "/gov-docs/*" +to = "https://scroll-governance-documentation.vercel.app/:splat" +status = 200 + [[redirects]] from = "/*" to = "/" @@ -21,13 +112,15 @@ package = "/plugins/netlify/env" REACT_APP_MAIN_ENVIRONMENT = "Mainnet" # used to determine which SCROLL_ENVIRONMENT is to be treated as the main/production one REACT_APP_ETH_SYMBOL = "ETH" REACT_APP_PREFIX_CLS = "scroll" -REACT_APP_SENTRY_DSN = "https://791d7df9132d46a9868de0863bd6583c@o4504371258785792.ingest.sentry.io/4504371261079552" +REACT_APP_SENTRY_DSN = "https://ca6f303c47c5bb4f0077d0cf6ae31b52@sentry.scroll.io/2" REACT_APP_GOOGLE_ANALYTICS_ID = "G-XR3MGVSHFC" REACT_APP_CONNECT_WALLET_PROJECT_ID = "14efbaafcf5232a47d93a68229b71028" REACT_APP_UNIFRA_API_KEY = "9d431c1c-d717-4931-9595-ad0b3a246d13" REACT_APP_NFT_VIEWER_URL="https://nft.scroll.io" REACT_APP_NFT_API_URI="https://nft.scroll.io" - +REACT_APP_OKX_URI="https://www.okx.com/web3/explorer/scroll?channelId=scroll" +REACT_APP_BLOCKSCOUT_URI="https://scroll.blockscout.com" +REACT_APP_ENS_API_URL="https://ens.scroll.cat" [context.deploy-preview.environment] REACT_APP_SCROLL_ENVIRONMENT = "Staging" @@ -43,6 +136,7 @@ REACT_APP_EXTERNAL_EXPLORER_URI_L2 = "https://sepolia.scrollscan.com" REACT_APP_L2_SCAN_URI = "https://scroll-sepolia.l2scan.co" REACT_APP_EXTERNAL_EXPLORER_URI_DORA = "https://www.ondora.xyz/network/scroll-sepolia" REACT_APP_ETHERSCAN_L2 = "https://sepolia.scrollscan.com" +REACT_APP_SCROLL_VENUS_URI = "https://sepolia-venus.scroll.io" REACT_APP_L2_SWAP_URI = "https://uniswap-showcase.sepolia.scroll.xyz/" REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR = "0x8A54A2347Da2562917304141ab67324615e9866d" REACT_APP_L2_ETH_GATEWAY_PROXY_ADDR = "0x91e8ADDFe1358aCa5314c644312d38237fC1101C" @@ -54,8 +148,10 @@ REACT_APP_L1_USDC_GATEWAY_PROXY_ADDR = "" REACT_APP_L2_USDC_GATEWAY_PROXY_ADDR= "" REACT_APP_L1_DAI_GATEWAY_PROXY_ADDR = "0x8b0B9c4e9f41b9bbDEfFee24F9f11C328093d248" REACT_APP_L2_DAI_GATEWAY_PROXY_ADDR = "0xbF28c28490988026Dca2396148DE50136A54534e" -REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "" -REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "" +REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "0xF22B24fa7c3168f30b17fd97b71bdd3162DDe029" +REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "0x635B054A092F6aE61Ce0Fddc397A704F6626510D" +REACT_APP_L1_PUFFER_GATEWAY_PROXY_ADDR = "0xA033Ff09f2da45f0e9ae495f525363722Df42b2a" +REACT_APP_L2_PUFFER_GATEWAY_PROXY_ADDR = "0x9eBf2f33526CD571f8b2ad312492cb650870CFd6" REACT_APP_L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0x65D123d6389b900d954677c26327bfc1C3e88A13" REACT_APP_L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0xaDcA915971A336EA2f5b567e662F5bd74AEf9582" REACT_APP_L1_SCROLL_MESSENGER = "0x50c7d3e7f7c656493D1D76aaa1a836CedfCBB16A" @@ -63,51 +159,28 @@ REACT_APP_L2_SCROLL_MESSENGER = "0xBa50f5340FB9F3Bd074bD638c9BE13eCB36E603d" REACT_APP_L1_GATEWAY_ROUTER_PROXY_ADDR = "0x13FBE0D0e5552b8c9c4AE9e2435F38f37355998a" REACT_APP_L2_GATEWAY_ROUTER_PROXY_ADDR = "0x9aD3c5617eCAa556d6E166787A97081907171230" REACT_APP_L1_GAS_PRICE_ORACLE = "0x5300000000000000000000000000000000000002" -REACT_APP_L2_GAS_PRICE_ORACLE = "0x247969F4fad93a33d4826046bc3eAE0D36BdE548" REACT_APP_SCROLL_CHAIN = "0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0" REACT_APP_L1_MESSAGE_QUEUE = "0xF0B2293F5D834eAe920c6974D50957A1732de763" REACT_APP_SCROLL_ORIGINS_NFT="0x90a274D591d5AB1a25f0DD0F06F28533C34D7d9f" REACT_APP_SCROLL_ORIGINS_NFT_V2="0xDd7d857F570B0C211abfe05cd914A85BefEC2464" +REACT_APP_L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE="0xF0B2293F5D834eAe920c6974D50957A1732de763" +REACT_APP_L1_BATCH_BRIDGE_GATEWAY_PROXY_ADDR = "0xE86ad3312FA693aDeD34dEc3899176d97ac883B2" +REACT_APP_OPEN_BLOCK_URI = "http://obl-data-gateway-dev-568660380.us-east-1.elb.amazonaws.com:8000" + +REACT_APP_EAS_ADDRESS="0xaEF4103A04090071165F78D45D83A0C0782c2B2a" +REACT_APP_BADGE_SCHEMA="0xa35b5470ebb301aa5d309a8ee6ea258cad680ea112c86e456d5f2254448afc74" +REACT_APP_PROFILE_REGISTRY_ADDRESS="0x26aa585d5Da74A373E58c4fA723E1E1f6FD6474f" +REACT_APP_BADGE_RESOLVER_ADDRESS="0xd2270b3540FD2220Fa1025414e1625af8B0dd8f3" +REACT_APP_EAS_GRAPHQL_URL="https://scroll-sepolia.easscan.org/graphql" +REACT_APP_CANVAS_BACKEND_URI="https://skelly-backend-git-sepolia-scroll-tech.vercel.app" +REACT_APP_FFRONTENDS_URL = "https://scroll-skelly.env.scroll.io" +REACT_APP_EAS_EXPLORER_URL = "https://scroll-sepolia.easscan.org" +REACT_APP_ETHEREUM_YEAR_BADGE_API_URI = "https://genesis-nft-backend-git-sepolia-scroll-tech.vercel.app" +REACT_APP_BADGE_REGISTRY_URL="https://badge-registry.canvas.scroll.cat/badge-registry" +REACT_APP_BADGE_INDEXER_URL="https://canvas-indexer.scroll.cat" +REACT_APP_ETHEREUM_YEAR_BADGE_ADDRESS = "0xB59B6466B21a089c93B14030AF88b164905a58fd" +REACT_APP_SCR_HOLDING_BADGE_ADDRESS="0xeF071708e09BECFEac1e3d8AfA1602BB6eB57922" -[context.staging.environment] -REACT_APP_SCROLL_ENVIRONMENT = "Staging" -REACT_APP_API_BASE_URI = "https://sepolia-api.scroll.io" -REACT_APP_BRIDGE_API_URI = "https://sepolia-api-bridge-v2.scroll.io/api" -REACT_APP_ROLLUPSCAN_API_URI = "https://sepolia-api-re.scroll.io/api" -REACT_APP_CHAIN_ID_L1 = "11155111" -REACT_APP_CHAIN_ID_L2 = "534351" -REACT_APP_EXTERNAL_RPC_URI_L1 = "https://ethereum-sepolia.blockpi.network/v1/rpc/public" -REACT_APP_EXTERNAL_RPC_URI_L2 = "https://sepolia-rpc.scroll.io" -REACT_APP_EXTERNAL_EXPLORER_URI_L1 = "https://sepolia.etherscan.io" -REACT_APP_EXTERNAL_EXPLORER_URI_L2 = "https://sepolia.scrollscan.com" -REACT_APP_L2_SCAN_URI = "https://scroll-sepolia.l2scan.co" -REACT_APP_EXTERNAL_EXPLORER_URI_DORA = "https://www.ondora.xyz/network/scroll-sepolia" -REACT_APP_ETHERSCAN_L2 = "https://sepolia.scrollscan.com" -REACT_APP_L2_SWAP_URI = "https://uniswap-showcase.sepolia.scroll.xyz/" -REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR = "0x8A54A2347Da2562917304141ab67324615e9866d" -REACT_APP_L2_ETH_GATEWAY_PROXY_ADDR = "0x91e8ADDFe1358aCa5314c644312d38237fC1101C" -REACT_APP_L1_WETH_GATEWAY_PROXY_ADDR = "0x3dA0BF44814cfC678376b3311838272158211695" -REACT_APP_L2_WETH_GATEWAY_PROXY_ADDR = "0x481B20A927206aF7A754dB8b904B052e2781ea27" -REACT_APP_L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR = "0x31C994F2017E71b82fd4D8118F140c81215bbb37" -REACT_APP_L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR = "0x058dec71E53079F9ED053F3a0bBca877F6f3eAcf" -REACT_APP_L1_USDC_GATEWAY_PROXY_ADDR = "" -REACT_APP_L2_USDC_GATEWAY_PROXY_ADDR= "" -REACT_APP_L1_DAI_GATEWAY_PROXY_ADDR = "0x8b0B9c4e9f41b9bbDEfFee24F9f11C328093d248" -REACT_APP_L2_DAI_GATEWAY_PROXY_ADDR = "0xbF28c28490988026Dca2396148DE50136A54534e" -REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "" -REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "" -REACT_APP_L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0x65D123d6389b900d954677c26327bfc1C3e88A13" -REACT_APP_L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0xaDcA915971A336EA2f5b567e662F5bd74AEf9582" -REACT_APP_L1_SCROLL_MESSENGER = "0x50c7d3e7f7c656493D1D76aaa1a836CedfCBB16A" -REACT_APP_L2_SCROLL_MESSENGER = "0xBa50f5340FB9F3Bd074bD638c9BE13eCB36E603d" -REACT_APP_L1_GATEWAY_ROUTER_PROXY_ADDR = "0x13FBE0D0e5552b8c9c4AE9e2435F38f37355998a" -REACT_APP_L2_GATEWAY_ROUTER_PROXY_ADDR = "0x9aD3c5617eCAa556d6E166787A97081907171230" -REACT_APP_L1_GAS_PRICE_ORACLE = "0x5300000000000000000000000000000000000002" -REACT_APP_L2_GAS_PRICE_ORACLE = "0x247969F4fad93a33d4826046bc3eAE0D36BdE548" -REACT_APP_SCROLL_CHAIN = "0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0" -REACT_APP_L1_MESSAGE_QUEUE = "0xF0B2293F5D834eAe920c6974D50957A1732de763" -REACT_APP_SCROLL_ORIGINS_NFT="0x90a274D591d5AB1a25f0DD0F06F28533C34D7d9f" -REACT_APP_SCROLL_ORIGINS_NFT_V2="0xDd7d857F570B0C211abfe05cd914A85BefEC2464" [context.sepolia.environment] REACT_APP_SCROLL_ENVIRONMENT = "Sepolia" @@ -123,6 +196,7 @@ REACT_APP_EXTERNAL_EXPLORER_URI_L2 = "https://sepolia.scrollscan.com" REACT_APP_L2_SCAN_URI = "https://scroll-sepolia.l2scan.co" REACT_APP_EXTERNAL_EXPLORER_URI_DORA = "https://www.ondora.xyz/network/scroll-sepolia" REACT_APP_ETHERSCAN_L2 = "https://sepolia.scrollscan.com" +REACT_APP_SCROLL_VENUS_URI = "https://sepolia-venus.scroll.io" REACT_APP_L2_SWAP_URI = "https://uniswap-showcase.sepolia.scroll.xyz/" REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR = "0x8A54A2347Da2562917304141ab67324615e9866d" REACT_APP_L2_ETH_GATEWAY_PROXY_ADDR = "0x91e8ADDFe1358aCa5314c644312d38237fC1101C" @@ -134,8 +208,10 @@ REACT_APP_L1_USDC_GATEWAY_PROXY_ADDR = "" REACT_APP_L2_USDC_GATEWAY_PROXY_ADDR= "" REACT_APP_L1_DAI_GATEWAY_PROXY_ADDR = "0x8b0B9c4e9f41b9bbDEfFee24F9f11C328093d248" REACT_APP_L2_DAI_GATEWAY_PROXY_ADDR = "0xbF28c28490988026Dca2396148DE50136A54534e" -REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "" -REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "" +REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "0xF22B24fa7c3168f30b17fd97b71bdd3162DDe029" +REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "0x635B054A092F6aE61Ce0Fddc397A704F6626510D" +REACT_APP_L1_PUFFER_GATEWAY_PROXY_ADDR = "0xA033Ff09f2da45f0e9ae495f525363722Df42b2a" +REACT_APP_L2_PUFFER_GATEWAY_PROXY_ADDR = "0x9eBf2f33526CD571f8b2ad312492cb650870CFd6" REACT_APP_L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0x65D123d6389b900d954677c26327bfc1C3e88A13" REACT_APP_L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0xaDcA915971A336EA2f5b567e662F5bd74AEf9582" REACT_APP_L1_SCROLL_MESSENGER = "0x50c7d3e7f7c656493D1D76aaa1a836CedfCBB16A" @@ -143,11 +219,28 @@ REACT_APP_L2_SCROLL_MESSENGER = "0xBa50f5340FB9F3Bd074bD638c9BE13eCB36E603d" REACT_APP_L1_GATEWAY_ROUTER_PROXY_ADDR = "0x13FBE0D0e5552b8c9c4AE9e2435F38f37355998a" REACT_APP_L2_GATEWAY_ROUTER_PROXY_ADDR = "0x9aD3c5617eCAa556d6E166787A97081907171230" REACT_APP_L1_GAS_PRICE_ORACLE = "0x5300000000000000000000000000000000000002" -REACT_APP_L2_GAS_PRICE_ORACLE = "0x247969F4fad93a33d4826046bc3eAE0D36BdE548" REACT_APP_SCROLL_CHAIN = "0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0" REACT_APP_L1_MESSAGE_QUEUE = "0xF0B2293F5D834eAe920c6974D50957A1732de763" REACT_APP_SCROLL_ORIGINS_NFT="0x90a274D591d5AB1a25f0DD0F06F28533C34D7d9f" REACT_APP_SCROLL_ORIGINS_NFT_V2="0xDd7d857F570B0C211abfe05cd914A85BefEC2464" +REACT_APP_L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE="0xF0B2293F5D834eAe920c6974D50957A1732de763" +REACT_APP_L1_BATCH_BRIDGE_GATEWAY_PROXY_ADDR = "0xE86ad3312FA693aDeD34dEc3899176d97ac883B2" +REACT_APP_OPEN_BLOCK_URI = "http://obl-data-gateway-dev-568660380.us-east-1.elb.amazonaws.com:8000" + +REACT_APP_EAS_ADDRESS="0xaEF4103A04090071165F78D45D83A0C0782c2B2a" +REACT_APP_BADGE_SCHEMA="0xa35b5470ebb301aa5d309a8ee6ea258cad680ea112c86e456d5f2254448afc74" +REACT_APP_PROFILE_REGISTRY_ADDRESS="0x26aa585d5Da74A373E58c4fA723E1E1f6FD6474f" +REACT_APP_BADGE_RESOLVER_ADDRESS="0xd2270b3540FD2220Fa1025414e1625af8B0dd8f3" +REACT_APP_EAS_GRAPHQL_URL="https://scroll-sepolia.easscan.org/graphql" +REACT_APP_CANVAS_BACKEND_URI="https://skelly-backend-git-sepolia-scroll-tech.vercel.app" +REACT_APP_FFRONTENDS_URL = "https://sepolia.env.scroll.io" +REACT_APP_EAS_EXPLORER_URL = "https://scroll-sepolia.easscan.org" +REACT_APP_ETHEREUM_YEAR_BADGE_API_URI = "https://genesis-nft-backend-git-sepolia-scroll-tech.vercel.app" +REACT_APP_BADGE_REGISTRY_URL="https://badge-registry.canvas.scroll.cat/badge-registry" +REACT_APP_BADGE_INDEXER_URL="https://canvas-indexer.scroll.cat" +REACT_APP_ETHEREUM_YEAR_BADGE_ADDRESS = "0xB59B6466B21a089c93B14030AF88b164905a58fd" +REACT_APP_SCR_HOLDING_BADGE_ADDRESS="0xeF071708e09BECFEac1e3d8AfA1602BB6eB57922" + [context.mainnet.environment] REACT_APP_SCROLL_ENVIRONMENT = "Mainnet" @@ -162,6 +255,7 @@ REACT_APP_EXTERNAL_EXPLORER_URI_L1 = "https://etherscan.io" REACT_APP_EXTERNAL_EXPLORER_URI_L2 = "https://scrollscan.com" REACT_APP_EXTERNAL_EXPLORER_URI_DORA = "https://www.ondora.xyz/network/scroll" REACT_APP_ETHERSCAN_L2 = "https://scrollscan.com" +REACT_APP_SCROLL_VENUS_URI = "https://venus.scroll.io" REACT_APP_L2_SCAN_URI = "https://scroll.l2scan.co" REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR = "0x7F2b8C31F88B6006c382775eea88297Ec1e3E905" REACT_APP_L2_ETH_GATEWAY_PROXY_ADDR = "0x6EA73e05AdC79974B931123675ea8F78FfdacDF0" @@ -175,6 +269,8 @@ REACT_APP_L1_DAI_GATEWAY_PROXY_ADDR = "0x67260A8B73C5B77B55c1805218A42A7A6F98F51 REACT_APP_L2_DAI_GATEWAY_PROXY_ADDR = "0xaC78dff3A87b5b534e366A93E785a0ce8fA6Cc62" REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR = "0x6625C6332c9F91F2D27c304E729B86db87A3f504" REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR = "0x8aE8f22226B9d789A36AC81474e633f8bE2856c9" +REACT_APP_L1_PUFFER_GATEWAY_PROXY_ADDR = "0xA033Ff09f2da45f0e9ae495f525363722Df42b2a" +REACT_APP_L2_PUFFER_GATEWAY_PROXY_ADDR = "0x9eBf2f33526CD571f8b2ad312492cb650870CFd6" REACT_APP_L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0xD8A791fE2bE73eb6E6cF1eb0cb3F36adC9B3F8f9" REACT_APP_L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR = "0xE2b4795039517653c5Ae8C2A9BFdd783b48f447A" REACT_APP_L1_SCROLL_MESSENGER = "0x6774Bcbd5ceCeF1336b5300fb5186a12DDD8b367" @@ -182,9 +278,24 @@ REACT_APP_L2_SCROLL_MESSENGER = "0x781e90f1c8Fc4611c9b7497C3B47F99Ef6969CbC" REACT_APP_L1_GATEWAY_ROUTER_PROXY_ADDR = "0xF8B1378579659D8F7EE5f3C929c2f3E332E41Fd6" REACT_APP_L2_GATEWAY_ROUTER_PROXY_ADDR = "0x4C0926FF5252A435FD19e10ED15e5a249Ba19d79" REACT_APP_L1_GAS_PRICE_ORACLE = "0x5300000000000000000000000000000000000002" -REACT_APP_L2_GAS_PRICE_ORACLE = "0x987e300fDfb06093859358522a79098848C33852" REACT_APP_SCROLL_CHAIN = "0xa13BAF47339d63B743e7Da8741db5456DAc1E556" REACT_APP_L1_MESSAGE_QUEUE = "0x0d7E906BD9cAFa154b048cFa766Cc1E54E39AF9B" REACT_APP_SCROLL_ORIGINS_NFT="0x74670A3998d9d6622E32D0847fF5977c37E0eC91" REACT_APP_SCROLL_ORIGINS_NFT_V2="0x42bCaCb8D24Ba588cab8Db0BB737DD2eFca408EC" +REACT_APP_L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE="0x0d7E906BD9cAFa154b048cFa766Cc1E54E39AF9B" +REACT_APP_L1_BATCH_BRIDGE_GATEWAY_PROXY_ADDR = "0x5Bcfd99c34cf7E06fc756f6f5aE7400504852bc4" +REACT_APP_OPEN_BLOCK_URI = "https://www.data-openblocklabs.com" +REACT_APP_EAS_ADDRESS="0xC47300428b6AD2c7D03BB76D05A176058b47E6B0" +REACT_APP_BADGE_SCHEMA="0xd57de4f41c3d3cc855eadef68f98c0d4edd22d57161d96b7c06d2f4336cc3b49" +REACT_APP_PROFILE_REGISTRY_ADDRESS="0xB23AF8707c442f59BDfC368612Bd8DbCca8a7a5a" +REACT_APP_BADGE_RESOLVER_ADDRESS="0x4560FECd62B14A463bE44D40fE5Cfd595eEc0113" +REACT_APP_EAS_GRAPHQL_URL="https://scroll.easscan.org/graphql" +REACT_APP_CANVAS_BACKEND_URI="https://canvas.scroll.cat" +REACT_APP_FFRONTENDS_URL = "https://scroll.io" +REACT_APP_EAS_EXPLORER_URL = "https://scroll.easscan.org" +REACT_APP_ETHEREUM_YEAR_BADGE_API_URI = "https://nft.scroll.io" +REACT_APP_BADGE_REGISTRY_URL="https://badge-registry.canvas.scroll.cat/badge-registry" +REACT_APP_BADGE_INDEXER_URL="https://canvas-indexer.scroll.cat" +REACT_APP_ETHEREUM_YEAR_BADGE_ADDRESS = "0x3dacAd961e5e2de850F5E027c70b56b5Afa5DfeD" +REACT_APP_SCR_HOLDING_BADGE_ADDRESS="" diff --git a/package.json b/package.json index dbc44fc3b..337016669 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "scroll.io", - "version": "5.0.65", + "version": "5.4.0", "private": false, "license": "MIT", "scripts": { "build": "craco build", "convert:webp": "cwebp -q 100 $1 -o $2", "eject": "craco eject", - "generate:sitemap": "npx sitemap --index-base-url https://scroll.io/sitemap < ./public/sitemap.txt > ./public/sitemap.xml", + "generate:sitemap": "cd scripts && node generate_sitemap.js", "lint": "eslint --fix --max-warnings=0 \"**/*.{ts,tsx}\"", "prepare": "husky install", "start": "BROWSER=none craco start", @@ -36,33 +36,41 @@ "react-scripts/**/minimatch": "^3.0.6" }, "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", "@emotion/react": "^11.4.0", "@emotion/styled": "^11.3.0", + "@ethereum-attestation-service/eas-sdk": "^1.5.0", "@mui/icons-material": "^5.8.4", "@mui/lab": "^5.0.0-alpha.108", "@mui/material": "^5.11.15", - "@rainbow-me/rainbowkit": "^1.2.0", + "@rainbow-me/rainbowkit": "^2.1.2", "@sentry/react": "^7.43.0", "@sentry/tracing": "^7.43.0", + "@tanstack/react-query": "^5.28.9", "@types/jest": "^27.5.2", "@types/node": "^20.10.6", "@types/react": "^18.0.15", "@types/react-dom": "^18.0.6", - "@web3-onboard/injected-wallets": "^2.2.4", - "@web3-onboard/react": "^2.3.6", + "canvas-confetti": "^1.9.3", "copy-to-clipboard": "^3.3.2", "dayjs": "^1.11.5", - "ethers": "^6.6.4", + "emoji-regex": "^10.4.0", + "ethers": "6.12.0", "framer-motion": "^9.0.4", "lodash": "^4.17.21", + "notistack": "^3.0.1", + "number-flip": "^1.2.3", "numbro": "^2.3.6", "react": "^18.2.0", + "react-advanced-cropper": "^0.20.0", "react-awesome-reveal": "^4.2.5", "react-cool-img": "^1.2.12", "react-countdown": "^2.3.2", "react-dom": "^18.2.0", "react-ga4": "^1.4.1", "react-helmet-async": "^1.3.0", + "react-intersection-observer": "^9.13.1", "react-mailchimp-subscribe": "^2.1.3", "react-markdown": "^8.0.3", "react-query": "^3.39.2", @@ -71,16 +79,19 @@ "react-virtualized": "^9.22.5", "rehype-katex": "^6.0.2", "rehype-raw": "^6.1.1", + "rehype-sanitize": "^6.0.0", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", "squirrel-gill": "1.0.5", "swiper": "^10.1.0", "swr": "^2.1.3", + "three": "^0.128.0", "tss-react": "^4.4.1", - "viem": "^1.10.1", - "wagmi": "^1.4.12", + "use-debounce": "^10.0.0", + "viem": "2.9.31", + "wagmi": "^2.9.2", "web-vitals": "^2.1.4", - "zustand": "^4.1.3" + "zustand": "^5.0.1" }, "devDependencies": { "@craco/craco": "^6.4.5", @@ -93,8 +104,8 @@ "@types/lodash": "^4.14.186", "@types/react-helmet": "^6.1.6", "@types/react-redux": "^7.1.8", - "@types/react-router-dom": "^5.0.0", "@types/testing-library__cypress": "^5.0.5", + "@types/three": "^0.128.0", "assert": "^2.0.0", "autoprefixer": "^10.4.12", "buffer": "^6.0.3", @@ -108,6 +119,7 @@ "husky": "^8.0.2", "less": "^4.1.3", "less-loader": "^11.1.0", + "lint-staged": "^15.2.2", "os-browserify": "^0.3.0", "postcss": "^8.4.17", "prettier": "^2.8.1", @@ -115,6 +127,7 @@ "react-device-detect": "^2.2.3", "react-redux": "^7.2.0", "react-router-dom": "^6.3.0", + "sitemap": "^7.1.1", "stream": "^0.0.2", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", diff --git a/public/files/airdrop/terms-and-conditions.pdf b/public/files/airdrop/terms-and-conditions.pdf new file mode 100644 index 000000000..fbe0734e8 Binary files /dev/null and b/public/files/airdrop/terms-and-conditions.pdf differ diff --git a/public/files/whitepaper.pdf b/public/files/whitepaper.pdf new file mode 100644 index 000000000..f76e29a73 Binary files /dev/null and b/public/files/whitepaper.pdf differ diff --git a/public/files/world.json b/public/files/world.json new file mode 100644 index 000000000..e04faf993 --- /dev/null +++ b/public/files/world.json @@ -0,0 +1,34992 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "features": [ + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [47.97822265625, 7.9970703125], + [46.97822265625, 7.9970703125], + [43.9837890625, 9.00883789062499], + [43.48251953125, 9.37949218749999], + [43.181640625, 9.87998046874999], + [42.8416015625, 10.203076171875], + [42.6564453125, 10.6], + [42.92275390625, 10.99931640625], + [43.24599609375, 11.4998046875], + [43.852734375, 10.78427734375], + [44.3865234375, 10.430224609375], + [44.94296875, 10.43671875], + [45.81669921875, 10.835888671875], + [46.5650390625, 10.74599609375], + [47.40498046875, 11.1740234375], + [48.01923828125, 11.13935546875], + [48.57255859375, 11.3205078125], + [48.93857421875, 11.258447265625], + [50.11005859375, 11.529296875], + [50.79228515625, 11.98369140625], + [51.2548828125, 11.830712890625], + [51.08427734375, 11.33564453125], + [51.140625, 10.656884765625], + [51.0318359375, 10.444775390625], + [51.19296875, 10.554638671875], + [51.390234375, 10.422607421875], + [50.930078125, 10.335546875], + [50.825, 9.428173828125], + [50.10283203125, 8.19980468749999], + [49.85205078125, 7.96254882812499], + [49.2349609375, 6.77734375], + [49.04931640625, 6.17363281249999], + [47.97529296875, 4.497021484375], + [46.87880859375, 3.28564453125], + [46.051171875, 2.47514648437499], + [44.92021484375, 1.81015625], + [43.717578125, 0.857861328124997], + [41.9798828125, -0.973046875], + [41.53271484375, -1.6953125], + [41.521875, -1.572265625], + [41.426953125, -1.44951171875], + [41.2498046875, -1.2205078125], + [40.9787109375, -0.870312500000011], + [40.964453125, 2.8146484375], + [41.341796875, 3.20166015625], + [41.6134765625, 3.59047851562499], + [41.883984375, 3.977734375], + [41.91533203125, 4.03129882812499], + [42.02412109375, 4.137939453125], + [42.856640625, 4.32421875], + [43.12568359375, 4.644482421875], + [43.58349609375, 4.85498046875], + [43.9888671875, 4.95053710937499], + [44.94052734375, 4.91201171874999], + [47.97822265625, 7.9970703125] + ] + ] + }, + "properties": { + "name": "Somalia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.57997913393674, 47.0585638862931], + [9.40945859664723, 47.0201967654029], + [9.46249431093294, 47.0901074796886], + [9.46249431093294, 47.1985896225458], + [9.52765819747012, 47.2702698977367], + [9.57997913393674, 47.0585638862931] + ] + ] + }, + "properties": { + "name": "Liechtenstein", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-8.683349609375, 27.7780074080568], + [-13.0387617870136, 27.8119016662486], + [-12.9489257812499, 27.91416015625], + [-11.552685546875, 28.310107421875], + [-10.486474609375, 29.06494140625], + [-10.2005859375, 29.3803710937501], + [-9.66708984374995, 30.1092773437501], + [-9.65292968749998, 30.44755859375], + [-9.87548828124994, 30.717919921875], + [-9.80869140624992, 31.424609375], + [-9.34746093749993, 32.086376953125], + [-9.245849609375, 32.5724609375], + [-8.51284179687499, 33.25244140625], + [-6.90097656249995, 33.96904296875], + [-6.353125, 34.77607421875], + [-5.92480468749994, 35.785791015625], + [-5.27783203124994, 35.902734375], + [-5.25268554687497, 35.61474609375], + [-4.62832031249997, 35.206396484375], + [-4.32998046874994, 35.161474609375], + [-3.69326171874999, 35.27998046875], + [-3.39472656249993, 35.2118164062501], + [-2.97221679687499, 35.407275390625], + [-2.83994140624995, 35.12783203125], + [-2.73139648437496, 35.135205078125], + [-2.63681640624998, 35.1126953125], + [-2.42373046874999, 35.123486328125], + [-2.21962890624997, 35.10419921875], + [-1.79560546874993, 34.751904296875], + [-1.67919921875, 33.31865234375], + [-1.55073242187496, 33.073583984375], + [-1.510009765625, 32.87763671875], + [-1.45, 32.784814453125], + [-1.35214843749998, 32.703369140625], + [-1.29638671875, 32.67568359375], + [-1.188232421875, 32.60849609375], + [-1.11103515624998, 32.552294921875], + [-1.06552734374995, 32.468310546875], + [-1.16259765625, 32.399169921875], + [-1.27534179687498, 32.089013671875], + [-2.86342773437494, 32.07470703125], + [-2.93085937499993, 32.042529296875], + [-2.98823242187498, 31.87421875], + [-3.01738281249996, 31.83427734375], + [-3.43979492187495, 31.704541015625], + [-3.60458984374995, 31.686767578125], + [-3.70024414062499, 31.7000976562501], + [-3.76816406249998, 31.68955078125], + [-3.83710937499998, 31.512353515625], + [-3.83339843749994, 31.197802734375], + [-3.62690429687496, 31.000927734375], + [-4.14877929687498, 30.8095703125], + [-4.32285156250001, 30.698876953125], + [-4.52915039062492, 30.625537109375], + [-4.77851562499993, 30.552392578125], + [-4.96826171874994, 30.465380859375], + [-5.06191406249994, 30.3264160156251], + [-5.18012695312496, 30.166162109375], + [-5.29365234374998, 30.058642578125], + [-5.44877929687496, 29.95693359375], + [-6.00429687499999, 29.83125], + [-6.47973632812494, 29.820361328125], + [-6.52055664062499, 29.65986328125], + [-6.59775390624992, 29.578955078125], + [-6.63535156249995, 29.568798828125], + [-6.755126953125, 29.583837890625], + [-6.85556640624995, 29.601611328125], + [-7.14243164062495, 29.619580078125], + [-7.42768554687498, 29.425], + [-7.48574218749999, 29.392236328125], + [-8.659912109375, 28.7186035156251], + [-8.683349609375, 27.900390625], + [-8.683349609375, 27.7780074080568] + ] + ] + }, + "properties": { + "name": "Morocco", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-13.0387617870136, 27.8119016662486], + [-8.683349609375, 27.7780074080568], + [-8.683349609375, 27.6564453125], + [-8.81782226562496, 27.6564453125], + [-8.81782226562495, 27.6564453125], + [-8.683349609375, 27.6564453125], + [-8.683349609375, 27.2859375], + [-8.682861328125, 26.921337890625], + [-8.6826171875, 26.72314453125], + [-8.68232421874998, 26.497705078125], + [-8.68212890625, 26.273193359375], + [-8.68212890625, 26.10947265625], + [-8.68222656249998, 25.9955078125], + [-12.01630859375, 25.99541015625], + [-12.01630859375, 25.74013671875], + [-12.01630859375, 25.331689453125], + [-12.01630859375, 25.059375], + [-12.01630859375, 24.9232421875], + [-12.01630859375, 24.378662109375], + [-12.01630859375, 23.97021484375], + [-12.0234375, 23.467578125], + [-12.372900390625, 23.318017578125], + [-12.559375, 23.2908203125], + [-12.62041015625, 23.271337890625], + [-13.031494140625, 23.000244140625], + [-13.153271484375, 22.8205078125], + [-13.1270284598214, 22.7037709263393], + [-13.1365406840916, 22.7081825486167], + [-13.0943359375, 22.49599609375], + [-13.051220703125, 21.85478515625], + [-13.041748046875, 21.713818359375], + [-13.0322265625, 21.5720703125], + [-13.02509765625, 21.466796875], + [-13.0162109375, 21.333935546875], + [-15.231201171875, 21.331298828125], + [-16.96455078125, 21.329248046875], + [-17.06396484375, 20.898828125], + [-17.048046875, 20.80615234375], + [-17.098779296875, 20.856884765625], + [-16.930859375, 21.9], + [-16.358740234375, 22.59453125], + [-16.21025390625, 23.097900390625], + [-15.7892578124999, 23.79287109375], + [-15.9807128906249, 23.6703125], + [-15.89931640625, 23.84443359375], + [-14.904296875, 24.719775390625], + [-14.7949218749999, 25.404150390625], + [-14.4138671874999, 26.2537109375], + [-13.57578125, 26.735107421875], + [-13.1759765625, 27.655712890625], + [-13.0387617870136, 27.8119016662486] + ], + [ + [-8.77436523437498, 27.460546875], + [-8.79487304687498, 27.120703125], + [-8.79487304687498, 27.120703125], + [-8.77436523437498, 27.460546875] + ] + ] + }, + "properties": { + "name": "Western Sahara", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [21.5625, 42.247509765625], + [21.56083984375, 42.24765625], + [21.38955078125, 42.21982421875], + [21.28662109375, 42.100390625], + [21.059765625, 42.1712890625], + [20.778125, 42.071044921875], + [20.725, 41.87353515625], + [20.5662109375, 41.873681640625], + [20.48544921875, 42.223388671875], + [20.06396484375, 42.547265625], + [20.054296875, 42.76005859375], + [20.3443359375, 42.8279296875], + [20.4099630527979, 42.8437316674188], + [20.3443359375001, 42.8279296875], + [19.67099609375, 43.16396484375], + [19.21875, 43.449951171875], + [19.1964843750001, 43.485009765625], + [19.1916015625, 43.521044921875], + [19.1943359375, 43.53330078125], + [19.4951171875001, 43.64287109375], + [19.24501953125, 43.9650390625], + [19.5837890625, 44.04345703125], + [19.1184570312501, 44.3599609375], + [19.3486328125001, 44.880908203125], + [19.00712890625, 44.869189453125], + [19.062890625, 45.13720703125], + [19.4, 45.2125], + [19.0046875000001, 45.3995117187501], + [19.0642578125, 45.5149902343751], + [18.8390625, 45.8357421875], + [18.90537109375, 45.93173828125], + [19.4212890625, 46.064453125], + [19.6134765625, 46.169189453125], + [19.84443359375, 46.1458984375], + [19.9340820312501, 46.161474609375], + [20.16142578125, 46.14189453125], + [20.2101562500001, 46.126025390625], + [20.241796875, 46.10859375], + [20.3013671875, 46.05068359375], + [20.35859375, 45.97548828125], + [20.58115234375, 45.8694824218751], + [20.652734375, 45.77939453125], + [20.7092773437501, 45.73525390625], + [20.72783203125, 45.73740234375], + [20.746875, 45.748974609375], + [20.7601562500001, 45.75810546875], + [20.775, 45.7498046875], + [20.79404296875, 45.46787109375], + [21.4314453125, 45.192529296875], + [21.4654296875, 45.171875], + [21.35703125, 44.990771484375], + [21.5323242187501, 44.90068359375], + [21.519921875, 44.880810546875], + [21.4421875000001, 44.873388671875], + [21.384375, 44.870068359375], + [21.3579101562501, 44.86181640625], + [21.36005859375, 44.82666015625], + [21.52314453125, 44.790087890625], + [21.6361328125001, 44.71044921875], + [21.90927734375, 44.66611328125], + [22.026953125, 44.619873046875], + [22.0930664062501, 44.541943359375], + [22.2009765625, 44.560693359375], + [22.3506835937501, 44.676123046875], + [22.49765625, 44.70625], + [22.64208984375, 44.6509765625], + [22.7208984375, 44.605517578125], + [22.734375, 44.569921875], + [22.7007812500001, 44.555517578125], + [22.6201171875001, 44.562353515625], + [22.55400390625, 44.54033203125], + [22.4945312500001, 44.43544921875], + [22.687890625, 44.248291015625], + [22.4208007812501, 44.0074218750001], + [22.3990234375001, 43.96953125], + [22.3654296875, 43.862109375], + [22.36962890625, 43.781298828125], + [22.5545898437501, 43.4544921875], + [22.767578125, 43.354150390625], + [22.8197265625001, 43.300732421875], + [22.8595703125, 43.25234375], + [22.97685546875, 43.18798828125], + [22.79990234375, 42.9857421875], + [22.70615234375, 42.8839355468751], + [22.466796875, 42.84248046875], + [22.532421875, 42.481201171875], + [22.52353515625, 42.440966796875], + [22.4457031250001, 42.359130859375], + [22.4220703125, 42.328857421875], + [22.34404296875, 42.31396484375], + [22.23974609375, 42.3031100284687], + [21.8146484375, 42.303125], + [21.5625, 42.247509765625], + [21.5625, 42.247509765625] + ] + ] + }, + "properties": { + "name": "Serbia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [74.54140625, 37.02216796875], + [74.0388671875, 36.825732421875], + [73.116796875, 36.8685546875], + [72.2498046875, 36.734716796875], + [71.23291015625, 36.12177734375], + [71.18505859375, 36.04208984375], + [71.57197265625, 35.546826171875], + [71.6205078125, 35.1830078125], + [70.965625, 34.53037109375], + [71.095703125, 34.36943359375], + [71.0515625, 34.04970703125], + [70.65400390625, 33.952294921875], + [69.8896484375, 34.007275390625], + [70.2611328125, 33.289013671875], + [69.5015625, 33.020068359375], + [69.24140625, 32.433544921875], + [69.279296875, 31.93681640625], + [68.8689453125, 31.634228515625], + [68.59765625, 31.802978515625], + [68.16103515625, 31.802978515625], + [67.57822265625, 31.506494140625], + [67.737890625, 31.3439453125], + [67.45283203125, 31.234619140625], + [66.829296875, 31.263671875], + [66.346875, 30.802783203125], + [66.23125, 29.86572265625], + [65.0955078125, 29.55947265625], + [64.39375, 29.5443359375], + [64.09873046875, 29.391943359375], + [63.567578125, 29.497998046875], + [62.4765625, 29.408349609375], + [62.0009765625, 29.530419921875], + [61.2244140625, 29.7494140625], + [60.843359375, 29.85869140625], + [61.331640625, 30.363720703125], + [61.55947265625, 30.599365234375], + [61.7841796875, 30.83193359375], + [61.81083984375, 30.91328125], + [61.8142578125, 31.07255859375], + [61.755078125, 31.285302734375], + [61.66015625, 31.382421875], + [61.346484375, 31.421630859375], + [61.1107421875, 31.451123046875], + [60.8541015625, 31.483251953125], + [60.820703125, 31.495166015625], + [60.7916015625, 31.660595703125], + [60.804296875, 31.73447265625], + [60.7875, 31.877197265625], + [60.78994140625, 31.987109375], + [60.82724609375, 32.16796875], + [60.829296875, 32.2494140625], + [60.71044921875, 32.6], + [60.5765625, 32.994873046875], + [60.560546875, 33.137841796875], + [60.9169921875, 33.505224609375], + [60.573828125, 33.588330078125], + [60.4859375, 33.7119140625], + [60.4857421875, 34.094775390625], + [60.64267578125, 34.307177734375], + [60.889453125, 34.31943359375], + [60.80390625, 34.418017578125], + [60.76259765625, 34.475244140625], + [60.7361328125, 34.491796875], + [60.72626953125, 34.51826171875], + [60.739453125, 34.5447265625], + [60.80234375, 34.554638671875], + [60.8453125, 34.5876953125], + [60.91474609375, 34.633984375], + [60.951171875, 34.653857421875], + [61.080078125, 34.855615234375], + [61.1, 35.272314453125], + [61.1892578125, 35.31201171875], + [61.2455078125, 35.474072265625], + [61.278515625, 35.51376953125], + [61.2818359375, 35.55341796875], + [61.26201171875, 35.619580078125], + [61.3447265625, 35.6294921875], + [61.62099609375, 35.43232421875], + [62.0896484375, 35.3796875], + [62.3078125, 35.17080078125], + [62.6880859375, 35.255322265625], + [63.056640625, 35.44580078125], + [63.0841796875, 35.56806640625], + [63.1697265625, 35.678125], + [63.12998046875, 35.84619140625], + [63.8625, 36.012353515625], + [64.184375, 36.14892578125], + [64.51103515625, 36.340673828125], + [64.5658203125, 36.427587890625], + [64.6025390625, 36.554541015625], + [64.782421875, 37.05927734375], + [64.81630859375, 37.132080078125], + [64.9515625, 37.1935546875], + [65.0896484375, 37.237939453125], + [65.30361328125, 37.24677734375], + [65.55498046875, 37.251171875], + [65.7650390625, 37.569140625], + [66.471875, 37.3447265625], + [66.522265625, 37.348486328125], + [66.827734375, 37.3712890625], + [67.06884765625, 37.334814453125], + [67.1955078125, 37.235205078125], + [67.3197265625, 37.2095703125], + [67.44169921875, 37.2580078125], + [67.51728515625, 37.266650390625], + [67.546484375, 37.23564453125], + [67.607421875, 37.222509765625], + [67.7, 37.22724609375], + [67.7529296875, 37.1998046875], + [67.758984375, 37.172216796875], + [67.766015625, 37.14013671875], + [67.83447265625, 37.064208984375], + [67.9580078125, 36.972021484375], + [68.0677734375, 36.9498046875], + [68.2609375, 37.0130859375], + [68.284765625, 37.036328125], + [68.29951171875, 37.088427734375], + [68.3869140625, 37.1375], + [68.669140625, 37.2583984375], + [68.7232421875, 37.268017578125], + [68.78203125, 37.2580078125], + [68.82373046875, 37.270703125], + [68.8384765625, 37.30283203125], + [68.85537109375, 37.316845703125], + [68.88525390625, 37.328076171875], + [68.91181640625, 37.333935546875], + [68.96044921875, 37.325048828125], + [69.18017578125, 37.15830078125], + [69.26484375, 37.1083984375], + [69.30390625, 37.116943359375], + [69.35380859375, 37.150048828125], + [69.414453125, 37.207763671875], + [69.4296875, 37.290869140625], + [69.39921875, 37.39931640625], + [69.4201171875, 37.48671875], + [69.49208984375, 37.553076171875], + [69.62578125, 37.59404296875], + [69.8208984375, 37.6095703125], + [69.9849609375, 37.566162109375], + [70.188671875, 37.582470703125], + [70.25146484375, 37.66416015625], + [70.25498046875, 37.765380859375], + [70.1994140625, 37.88603515625], + [70.2146484375, 37.9244140625], + [70.4177734375, 38.075439453125], + [70.7359375, 38.42255859375], + [71.255859375, 38.306982421875], + [71.33271484375, 38.170263671875], + [71.278515625, 37.918408203125], + [71.319921875, 37.90185546875], + [71.3896484375, 37.906298828125], + [71.48779296875, 37.931884765625], + [71.551953125, 37.933154296875], + [71.5822265625, 37.910107421875], + [71.43291015625, 37.1275390625], + [71.530859375, 36.8451171875], + [71.665625, 36.696923828125], + [72.657421875, 37.029052734375], + [72.8955078125, 37.267529296875], + [73.2111328125, 37.40849609375], + [73.38291015625, 37.462255859375], + [73.48134765625, 37.4716796875], + [73.6046875, 37.446044921875], + [73.65712890625, 37.43046875], + [73.72060546875, 37.41875], + [73.7337890625, 37.37578125], + [73.71728515625, 37.329443359375], + [73.6275390625, 37.261572265625], + [73.653515625, 37.23935546875], + [73.749609375, 37.231787109375], + [74.16708984375, 37.329443359375], + [74.203515625, 37.3724609375], + [74.25966796875, 37.4154296875], + [74.659375, 37.394482421875], + [74.73056640625, 37.35703125], + [74.83046875, 37.2859375], + [74.89130859375, 37.231640625], + [74.840234375, 37.225048828125], + [74.7673828125, 37.249169921875], + [74.73896484375, 37.28564453125], + [74.72666015625, 37.29072265625], + [74.6689453125, 37.26669921875], + [74.558984375, 37.23662109375], + [74.37216796875, 37.15771484375], + [74.376171875, 37.137353515625], + [74.49794921875, 37.0572265625], + [74.52646484375, 37.0306640625], + [74.54140625, 37.02216796875] + ] + ] + }, + "properties": { + "name": "Afghanistan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [17.57958984375, -8.09902343750001], + [17.643359375, -8.09072265625001], + [18.0087890625, -8.10761718749998], + [18.5626953125, -7.9359375], + [18.9444335937501, -8.00146484375003], + [19.14267578125, -8.00146484375003], + [19.3408203125, -7.96660156250003], + [19.369921875, -7.70654296874999], + [19.3716796875001, -7.65507812499999], + [19.4798828125001, -7.47216796875003], + [19.4837890625001, -7.27949218750003], + [19.52763671875, -7.14443359374995], + [19.8751953125, -6.98632812499999], + [19.9974609375001, -6.97646484375002], + [20.1900390625001, -6.9462890625], + [20.4822265625001, -6.91582031250002], + [20.5900390625, -6.91992187499996], + [20.59873046875, -6.93515624999995], + [20.5369140625, -7.12177734374996], + [20.53583984375, -7.18281249999996], + [20.5583984375, -7.24443359374999], + [20.6078125000001, -7.27773437500002], + [20.9109375, -7.28144531249998], + [21.19033203125, -7.28496093749999], + [21.75107421875, -7.30546874999999], + [21.8060546875001, -7.32861328125], + [21.90537109375, -8.69335937499994], + [21.8131835937501, -9.46875], + [22.19775390625, -10.040625], + [22.3070312500001, -10.69130859375], + [22.203515625, -10.8294921875], + [22.226171875, -11.12197265625], + [22.27880859375, -11.194140625], + [22.3149414062501, -11.1986328125], + [22.3929687500001, -11.15947265625], + [22.4861328125, -11.08671875], + [22.56103515625, -11.055859375], + [22.81474609375, -11.0802734375], + [23.07626953125, -11.087890625], + [23.46396484375, -10.9693359375], + [23.8338867187501, -11.013671875], + [23.96650390625, -10.87177734375], + [23.98388671875, -11.725], + [23.909375, -12.6361328125], + [23.8865234375, -12.74326171875], + [23.882421875, -12.7990234375], + [23.96806640625, -12.95693359375], + [23.96298828125, -12.9884765625], + [23.8431640625, -13.0009765625], + [22.2095703125, -13.0009765625], + [21.9789062500001, -13.0009765625], + [21.9791015625, -13.79873046875], + [21.9792968750001, -14.11962890625], + [21.97939453125, -14.44052734375], + [21.97978515625, -15.95556640625], + [22.1939453125, -16.628125], + [23.3806640625, -17.640625], + [22.32421875, -17.8375], + [20.7455078125001, -18.0197265625], + [20.1943359375001, -17.863671875], + [18.9552734375, -17.803515625], + [18.3963867187501, -17.3994140625], + [16.1484375, -17.390234375], + [14.01748046875, -17.40888671875], + [13.4759765625, -17.0400390625], + [13.1794921875, -16.9716796875], + [12.54814453125, -17.2126953125], + [12.3592773437501, -17.205859375], + [12.31845703125, -17.21337890625], + [12.21337890625, -17.2099609375], + [12.0139648437501, -17.1685546875], + [11.9025390625, -17.2265625], + [11.74306640625, -17.24921875], + [11.780078125, -16.8712890625], + [11.8189453125, -16.7041015625], + [11.75087890625, -15.83193359375], + [12.0161132812501, -15.513671875], + [12.55048828125, -13.43779296875], + [12.983203125, -12.77568359375], + [13.4169921875, -12.52041015625], + [13.59794921875, -12.2861328125], + [13.7853515625, -11.81279296875], + [13.8335937500001, -10.9296875], + [13.3322265625, -9.99892578125001], + [12.99853515625, -9.048046875], + [13.358984375, -8.68720703125003], + [13.3785156250001, -8.36972656250001], + [12.8234375, -6.95478515624996], + [12.2833007812501, -6.12431640624996], + [13.184375, -5.85625], + [13.346484375, -5.86337890625001], + [13.978515625, -5.8572265625], + [16.3152343750001, -5.865625], + [16.4314453125, -5.90019531249996], + [16.537109375, -5.9658203125], + [16.697265625, -6.16425781250003], + [16.74296875, -6.61845703125], + [16.8130859375001, -6.77255859374996], + [16.9194335937501, -6.93398437499998], + [16.9847656250001, -7.25742187499998], + [17.57958984375, -8.09902343750001] + ] + ], + [ + [ + [12.50146484375, -4.5875], + [12.84814453125, -4.42890624999998], + [12.8810546875001, -4.44511718749999], + [12.9713867187501, -4.55175781249996], + [13.0480468750001, -4.61923828125003], + [13.07275390625, -4.634765625], + [13.05732421875, -4.65107421875003], + [12.9474609375, -4.69531249999999], + [12.8296875, -4.73662109374996], + [12.45146484375, -5.07148437499997], + [12.45322265625, -5.090625], + [12.5223632812501, -5.14892578125003], + [12.4845703125, -5.71875], + [12.2136718750001, -5.75869140624999], + [12.1771484375, -5.32480468749998], + [12.0183593750001, -5.00429687499997], + [12.50146484375, -4.5875] + ] + ] + ] + }, + "properties": { + "name": "Angola", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.06396484375, 42.547265625], + [20.48544921875, 42.223388671875], + [20.5662109375, 41.873681640625], + [20.48896484375, 41.272607421875], + [20.70927734375, 40.928369140625], + [20.9642578125, 40.84990234375], + [20.95576171875, 40.77529296875], + [21.030859375, 40.6224609375], + [20.881640625, 40.467919921875], + [20.657421875, 40.1173828125], + [20.4560546875, 40.065576171875], + [20.4080078125, 40.049462890625], + [20.38369140625, 40.0171875], + [20.3384765625, 39.991064453125], + [20.3111328125, 39.979443359375], + [20.311328125, 39.95078125], + [20.381640625, 39.841796875], + [20.382421875, 39.80263671875], + [20.2068359375, 39.653515625], + [20.1310546875, 39.66162109375], + [20.059765625, 39.69912109375], + [20.02255859375, 39.710693359375], + [20.00126953125, 39.709423828125], + [19.85185546875, 40.0435546875], + [19.322265625, 40.407080078125], + [19.4591796875, 40.40537109375], + [19.3375, 40.663818359375], + [19.57568359375, 41.6404296875], + [19.5775390625, 41.7875], + [19.3423828125, 41.869091796875], + [19.2806640625, 42.17255859375], + [19.6544921875, 42.628564453125], + [19.78828125, 42.476171875], + [20.06396484375, 42.547265625] + ] + ] + }, + "properties": { + "name": "Albania", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [19.6623046875, 60.187158203125], + [19.5365234375001, 60.144970703125], + [19.5513671875001, 60.24384765625], + [19.6623046875, 60.187158203125] + ] + ], + [ + [ + [19.9895507812501, 60.351171875], + [20.2588867187501, 60.261279296875], + [19.7998046875001, 60.08173828125], + [19.6869140625001, 60.267626953125], + [19.84765625, 60.2205566406251], + [19.8230468750001, 60.390185546875], + [19.9895507812501, 60.351171875] + ] + ] + ] + }, + "properties": { + "name": "Aland", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [1.7060546875, 42.5033203125], + [1.53408203125002, 42.44169921875], + [1.448828125, 42.437451171875], + [1.428125, 42.461328125], + [1.41484375000002, 42.548388671875], + [1.42832031250001, 42.5958984375], + [1.50136718750002, 42.642724609375], + [1.56816406250002, 42.635009765625], + [1.70986328125002, 42.604443359375], + [1.73945312500001, 42.575927734375], + [1.740234375, 42.55673828125], + [1.71396484375001, 42.525634765625], + [1.7060546875, 42.5033203125] + ] + ] + }, + "properties": { + "name": "Andorra", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [53.92783203125, 24.177197265625], + [53.63447265625, 24.169775390625], + [53.8337890625, 24.258935546875], + [53.92783203125, 24.177197265625] + ] + ], + [ + [ + [53.3322265625001, 24.25859375], + [53.19091796875, 24.29091796875], + [53.4124023437501, 24.41103515625], + [53.3322265625001, 24.25859375] + ] + ], + [ + [ + [56.2978515625, 25.65068359375], + [56.38798828125, 24.97919921875], + [56.0638671875001, 24.73876953125], + [56.0005859375001, 24.95322265625], + [55.7957031250001, 24.868115234375], + [55.7608398437501, 24.24267578125], + [55.9286132812501, 24.2151367187501], + [55.98515625, 24.06337890625], + [55.4684570312501, 23.94111328125], + [55.531640625, 23.81904296875], + [55.1999023437501, 23.034765625], + [55.1858398437501, 22.7041015625], + [55.1042968750001, 22.621484375], + [52.5550781250001, 22.9328125], + [51.5925781250001, 24.078857421875], + [51.568359375, 24.2861816406251], + [51.767578125, 24.25439453125], + [51.8431640625001, 24.010888671875], + [52.1185546875, 23.97109375], + [52.6482421875, 24.154638671875], + [53.8017578125, 24.069482421875], + [54.14794921875, 24.17119140625], + [54.3970703125001, 24.278173828125], + [54.74677734375, 24.81044921875], + [55.9412109375, 25.793994140625], + [56.08046875, 26.0626464843751], + [56.16748046875, 26.0474609375], + [56.14462890625, 25.69052734375], + [56.2978515625, 25.65068359375] + ] + ] + ] + }, + "properties": { + "name": "United Arab Emirates", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-64.549169921875, -54.7162109375], + [-63.8154296875, -54.72509765625], + [-64.637353515625, -54.9025390625], + [-64.75732421875, -54.8265625], + [-64.549169921875, -54.7162109375] + ] + ], + [ + [ + [-68.6532226562499, -54.85361328125], + [-68.629931640625, -52.65263671875], + [-68.24013671875, -53.0818359375], + [-68.43115234375, -53.0552734375], + [-68.488525390625, -53.2609375], + [-68.1611328125, -53.3064453125], + [-68.00849609375, -53.5640625], + [-67.29423828125, -54.0498046875], + [-66.23564453125, -54.53349609375], + [-65.1790039062499, -54.678125], + [-65.471142578125, -54.9146484375], + [-66.5111328125, -55.0321289062499], + [-67.127099609375, -54.90380859375], + [-68.6532226562499, -54.85361328125] + ] + ], + [ + [ + [-61.084716796875, -23.6564453125], + [-60.83984375, -23.85810546875], + [-59.8924804687499, -24.0935546875], + [-59.187255859375, -24.5623046875], + [-57.8216796874999, -25.13642578125], + [-57.5631347656249, -25.47373046875], + [-57.943115234375, -26.0529296875], + [-58.181494140625, -26.307421875], + [-58.2220703125, -26.65], + [-58.618603515625, -27.13212890625], + [-58.6417480468749, -27.19609375], + [-58.604833984375, -27.31435546875], + [-58.1682617187499, -27.2734375], + [-56.437158203125, -27.55380859375], + [-56.1640625, -27.321484375], + [-55.95146484375, -27.32568359375], + [-55.7899902343749, -27.41640625], + [-55.7146484375, -27.41484375], + [-55.63291015625, -27.35712890625], + [-55.593798828125, -27.2880859375], + [-55.597265625, -27.2076171875], + [-55.564892578125, -27.15], + [-55.496728515625, -27.11533203125], + [-55.450634765625, -27.068359375], + [-55.42666015625, -27.00927734375], + [-55.1359375, -26.93115234375], + [-54.93447265625, -26.7025390625], + [-54.677734375, -26.3087890625], + [-54.63193359375, -26.00576171875], + [-54.615869140625, -25.57607421875], + [-54.4439453125, -25.625], + [-54.15458984375, -25.523046875], + [-53.891162109375, -25.66884765625], + [-53.6685546875, -26.28818359375], + [-53.83818359375, -27.12109375], + [-54.327001953125, -27.42353515625], + [-54.8291015625, -27.5505859375], + [-55.101513671875, -27.866796875], + [-55.72548828125, -28.2041015625], + [-55.687255859375, -28.381640625], + [-55.89052734375, -28.37001953125], + [-56.938623046875, -29.59482421875], + [-57.224658203125, -29.78212890625], + [-57.405224609375, -30.03388671875], + [-57.5638671875, -30.13994140625], + [-57.60888671875, -30.18779296875], + [-57.65087890625, -30.29501953125], + [-57.7126953125, -30.38447265625], + [-57.831201171875, -30.49521484375], + [-57.872509765625, -30.591015625], + [-57.810595703125, -30.85859375], + [-57.886328125, -30.93740234375], + [-57.868408203125, -31.10439453125], + [-57.893359375, -31.1953125], + [-58.0333984375, -31.4166015625], + [-58.053857421875, -31.494921875], + [-58.00966796875, -31.534375], + [-57.98798828125, -31.576171875], + [-58.0069824218749, -31.6849609375], + [-58.042333984375, -31.76923828125], + [-58.16748046875, -31.87265625], + [-58.189013671875, -31.92421875], + [-58.160400390625, -31.9865234375], + [-58.15634765625, -32.0515625], + [-58.1770019531249, -32.11904296875], + [-58.1647949218749, -32.18486328125], + [-58.1197265625, -32.24892578125], + [-58.123046875, -32.321875], + [-58.201171875, -32.4716796875], + [-58.219970703125, -32.56396484375], + [-58.17099609375, -32.95927734375], + [-58.424462890625, -33.1115234375], + [-58.547216796875, -33.6634765625], + [-58.39248046875, -34.19296875], + [-58.52548828125, -34.29619140625], + [-58.2833496093749, -34.6834960937501], + [-57.5478515625, -35.0189453125], + [-57.170654296875, -35.3625], + [-57.3539062499999, -35.7203125], + [-57.33544921875, -36.0267578125], + [-57.0761718749999, -36.29677734375], + [-56.749462890625, -36.346484375], + [-56.6720214843749, -36.85126953125], + [-57.54697265625, -38.08564453125], + [-58.1791992187499, -38.43583984375], + [-59.8283203125, -38.83818359375], + [-61.11220703125, -38.99296875], + [-61.847900390625, -38.96181640625], + [-62.3347656249999, -38.80009765625], + [-62.295068359375, -39.24326171875], + [-62.053662109375, -39.373828125], + [-62.179345703125, -39.38046875], + [-62.076806640625, -39.4615234375], + [-62.1315429687499, -39.825390625], + [-62.2869140625, -39.8953125], + [-62.40185546875, -40.19658203125], + [-62.2463378906249, -40.674609375], + [-62.39501953125, -40.8908203125], + [-62.9590332031249, -41.1096679687501], + [-63.62177734375, -41.159765625], + [-64.869482421875, -40.73583984375], + [-65.1333984375, -40.8806640625], + [-64.986376953125, -42.10205078125], + [-64.5377441406249, -42.25458984375], + [-64.57099609375, -42.416015625], + [-64.42041015625, -42.4337890625], + [-64.1008789062499, -42.3951171875], + [-64.0611816406249, -42.26611328125], + [-64.228515625, -42.21826171875], + [-63.795556640625, -42.1138671875], + [-63.6298828125, -42.28271484375], + [-63.617333984375, -42.69580078125], + [-64.034765625, -42.88125], + [-64.487841796875, -42.5134765625001], + [-64.970703125, -42.66630859375], + [-65.026904296875, -42.75888671875], + [-64.319140625, -42.9689453125], + [-64.83994140625, -43.1888671875], + [-65.25234375, -43.571875], + [-65.26552734375, -44.2796875], + [-65.647607421875, -44.66142578125], + [-65.63876953125, -45.0078125], + [-66.19013671875, -44.96474609375], + [-66.94140625, -45.25732421875], + [-67.599560546875, -46.0525390625], + [-67.5064453125, -46.4427734375], + [-66.7768554687499, -47.005859375], + [-65.99853515625, -47.09375], + [-65.7380859375, -47.344921875], + [-65.814306640625, -47.63818359375], + [-66.225244140625, -47.8267578125], + [-65.934228515625, -47.8267578125], + [-65.81005859375, -47.94111328125], + [-67.46630859375, -48.9517578125], + [-67.68486328125, -49.2466796875], + [-67.8259765625, -49.9196289062501], + [-68.2572265625, -50.10458984375], + [-68.667578125, -49.7525390625], + [-68.66162109375, -49.9357421875001], + [-68.97958984375, -50.00302734375], + [-68.59794921875, -50.00947265625], + [-68.421875, -50.15791015625], + [-69.044775390625, -50.49912109375], + [-69.3585937499999, -51.028125], + [-69.201025390625, -50.99365234375], + [-69.035302734375, -51.48896484375], + [-69.4654296875, -51.58447265625], + [-68.96533203125, -51.6771484375], + [-68.443359375, -52.356640625], + [-69.9602539062499, -52.008203125], + [-71.91865234375, -51.98955078125], + [-72.407666015625, -51.5408203125], + [-72.340234375, -50.6818359375], + [-72.509814453125, -50.60751953125], + [-73.1529296875, -50.73828125], + [-73.50126953125, -50.12529296875], + [-73.55419921875, -49.4638671875], + [-73.461572265625, -49.3138671875], + [-73.13525390625, -49.30068359375], + [-73.033642578125, -49.01435546875], + [-72.65126953125, -48.8416015625], + [-72.582861328125, -48.475390625], + [-72.354736328125, -48.3658203125001], + [-72.3283203125, -48.11005859375], + [-72.517919921875, -47.8763671875], + [-72.345947265625, -47.49267578125], + [-71.90498046875, -47.20166015625], + [-71.940234375, -46.83125], + [-71.699658203125, -46.6513671875], + [-71.87568359375, -46.160546875], + [-71.63154296875, -45.9537109375], + [-71.74619140625, -45.57890625], + [-71.34931640625, -45.33193359375], + [-71.5962890625, -44.97919921875], + [-72.04169921875, -44.90419921875], + [-72.063720703125, -44.771875], + [-71.2611328125, -44.7630859375], + [-71.159716796875, -44.56025390625], + [-71.21259765625, -44.4412109375], + [-71.8200195312499, -44.38310546875], + [-71.680078125, -43.92958984375], + [-71.90498046875, -43.34755859375], + [-71.750634765625, -43.2373046875], + [-72.146435546875, -42.9900390625], + [-72.1082031249999, -42.25185546875], + [-71.75, -42.04677734375], + [-71.911279296875, -41.650390625], + [-71.9321289062499, -40.69169921875], + [-71.708984375, -40.38173828125], + [-71.8183105468749, -40.17666015625], + [-71.659765625, -40.02080078125], + [-71.719921875, -39.63525390625], + [-71.539453125, -39.60244140625], + [-71.4015625, -38.93505859375], + [-70.858642578125, -38.6044921875], + [-71.167578125, -37.7623046875], + [-71.1921875, -36.84365234375], + [-71.055517578125, -36.52373046875], + [-70.40478515625, -36.06171875], + [-70.41572265625, -35.523046875], + [-70.55517578125, -35.246875], + [-70.3931640625, -35.146875], + [-70.05205078125, -34.30078125], + [-69.85244140625, -34.22431640625], + [-69.81962890625, -33.2837890625], + [-70.08486328125, -33.2017578125], + [-70.02197265625, -32.8845703125], + [-70.36376953125, -32.08349609375], + [-70.25439453125, -31.95771484375], + [-70.585205078125, -31.56943359375], + [-70.5195800781249, -31.1484375], + [-70.3090820312499, -31.02265625], + [-70.15322265625, -30.3609375], + [-69.95634765625, -30.358203125], + [-69.8442871093749, -30.175], + [-69.9599609375, -30.0783203125], + [-70.026806640625, -29.3240234375], + [-69.827880859375, -29.10322265625], + [-69.65693359375, -28.41357421875], + [-69.1744140625, -27.92470703125], + [-68.8463378906249, -27.1537109375], + [-68.59208984375, -27.1400390625], + [-68.31865234375, -26.9732421875], + [-68.5916015625, -26.47041015625], + [-68.414501953125, -26.1537109375], + [-68.59208984375, -25.42001953125], + [-68.384228515625, -25.09189453125], + [-68.56201171875, -24.74736328125], + [-68.25029296875, -24.3919921875], + [-67.356201171875, -24.0337890625], + [-67.0087890624999, -23.0013671875001], + [-67.1948730468749, -22.8216796875], + [-66.99111328125, -22.50986328125], + [-66.71171875, -22.21630859375], + [-66.365185546875, -22.11376953125], + [-66.3224609375, -22.053125], + [-66.28212890625, -21.9474609375], + [-66.247607421875, -21.83046875], + [-66.220166015625, -21.8025390625], + [-66.174658203125, -21.8056640625], + [-66.098583984375, -21.83505859375], + [-66.05859375, -21.8794921875], + [-65.86015625, -22.0197265625], + [-65.7710449218749, -22.099609375], + [-65.686181640625, -22.1102539062501], + [-65.518798828125, -22.09453125], + [-64.992626953125, -22.10966796875], + [-64.605517578125, -22.22880859375], + [-64.5236328125, -22.37158203125], + [-64.477734375, -22.4853515625], + [-64.4455078125, -22.5853515625], + [-64.373974609375, -22.76103515625], + [-64.32529296875, -22.82763671875], + [-64.3079101562499, -22.7953125], + [-64.26640625, -22.6033203125], + [-63.976123046875, -22.07255859375], + [-63.9216796874999, -22.02861328125], + [-62.843359375, -21.997265625], + [-62.6259765625, -22.2904296875], + [-62.541552734375, -22.349609375], + [-62.372509765625, -22.43916015625], + [-62.21416015625, -22.61240234375], + [-61.79853515625, -23.18203125], + [-61.084716796875, -23.6564453125] + ] + ] + ] + }, + "properties": { + "name": "Argentina", + "childNum": 3 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [46.490625, 38.906689453125], + [46.1144531250001, 38.877783203125], + [45.97744140625, 39.243896484375], + [45.76630859375, 39.378466796875], + [45.78447265625, 39.54560546875], + [45.4568359375001, 39.494482421875], + [45.15283203125, 39.582666015625], + [45.0316406250001, 39.76513671875], + [44.76826171875, 39.7035156250001], + [44.2892578125, 40.040380859375], + [43.6662109375, 40.1263671875], + [43.5693359375, 40.482373046875], + [43.72265625, 40.71953125], + [43.439453125, 41.10712890625], + [44.07724609375, 41.18251953125], + [44.811328125, 41.259375], + [45.0013671875, 41.290966796875], + [45.18857421875, 41.147412109375], + [45.0705078125, 41.0755859375], + [45.5875, 40.846923828125], + [45.37890625, 40.6735839843751], + [45.45439453125, 40.532373046875], + [45.9646484375, 40.2337890625], + [45.8859375000001, 40.024853515625], + [45.57978515625, 39.9775390625], + [46.20205078125, 39.594482421875], + [46.4814453125, 39.55517578125], + [46.365234375, 39.402490234375], + [46.5847656250001, 39.223681640625], + [46.40029296875, 39.1921875], + [46.490625, 38.906689453125] + ] + ] + }, + "properties": { + "name": "Armenia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-170.72626953125, -14.351171875], + [-170.8205078125, -14.312109375], + [-170.568115234375, -14.266796875], + [-170.72626953125, -14.351171875] + ] + ] + }, + "properties": { + "name": "American Samoa", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [69.2824218750001, -49.05888671875], + [69.1671875, -48.88291015625], + [69.36875, -48.8904296875], + [69.2824218750001, -49.05888671875] + ] + ], + [ + [ + [69.18486328125, -49.1095703125], + [69.5927734375, -48.9709960937501], + [69.64404296875, -49.1173828125], + [69.405078125, -49.18173828125], + [69.5423828125, -49.2556640625001], + [70.3202148437501, -49.05859375], + [70.5554687500001, -49.20146484375], + [70.3861328125001, -49.433984375], + [70.1658203125, -49.34296875], + [69.7599609375, -49.43017578125], + [69.9864257812501, -49.581640625], + [70.2477539062501, -49.5306640625], + [70.12431640625, -49.70439453125], + [69.153125, -49.5296875], + [68.9929687500001, -49.70498046875], + [68.81474609375, -49.699609375], + [68.8833984375001, -49.16494140625], + [68.76953125, -49.06591796875], + [69.00244140625, -48.66123046875], + [69.1361328125001, -48.86103515625], + [69.0521484375001, -49.08193359375], + [69.18486328125, -49.1095703125] + ] + ], + [ + [ + [51.8345703125001, -46.43994140625], + [51.6592773437501, -46.3736328125], + [51.7418945312501, -46.32685546875], + [51.8345703125001, -46.43994140625] + ] + ] + ] + }, + "properties": { + "name": "Fr. S. Antarctic Lands", + "childNum": 3 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.716064453125, 17.03701171875], + [-61.85966796875, 17.013330078125], + [-61.887109375, 17.09814453125], + [-61.8172851562499, 17.1689453125001], + [-61.716064453125, 17.03701171875] + ] + ] + }, + "properties": { + "name": "Antigua and Barb.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [147.3560546875, -43.39697265625], + [147.30888671875, -43.50078125], + [147.10498046875, -43.43115234375], + [147.28388671875, -43.27890625], + [147.3560546875, -43.39697265625] + ] + ], + [ + [ + [145.04296875, -40.78671875], + [145.2830078125, -40.769921875], + [146.31748046875, -41.1634765625], + [146.7234375, -41.07802734375], + [146.84814453125, -41.16806640625], + [146.98984375, -40.9923828125], + [147.45478515625, -41.00166015625], + [147.6216796875, -40.8447265625], + [147.87294921875, -40.87255859375], + [147.96875, -40.77958984375], + [148.215234375, -40.8548828125], + [148.342578125, -42.21533203125], + [148.213671875, -41.97001953125], + [147.9244140625, -42.5724609375], + [147.94541015625, -43.1818359375], + [147.78583984375, -43.22001953125], + [147.69892578125, -43.12255859375], + [147.64794921875, -43.02060546875], + [147.8, -42.928125], + [147.573828125, -42.845703125], + [147.45234375, -43.0333984375], + [147.29794921875, -42.79091796875], + [147.24501953125, -43.21591796875], + [146.99697265625, -43.15634765625], + [147.07734375, -43.27587890625], + [146.87392578125, -43.6125], + [146.54853515625, -43.50888671875], + [146.0431640625, -43.54716796875], + [145.99443359375, -43.37607421875], + [146.2080078125, -43.3162109375], + [145.8732421875, -43.2923828125], + [145.48759765625, -42.92666015625], + [145.198828125, -42.230859375], + [145.46826171875, -42.49287109375], + [145.5166015625, -42.3544921875], + [145.3310546875, -42.1470703125], + [145.23486328125, -42.19697265625], + [145.23818359375, -42.01962890625], + [144.76611328125, -41.3900390625], + [144.64609375, -40.980859375], + [144.7185546875, -40.672265625], + [145.04296875, -40.78671875] + ] + ], + [ + [ + [148.2369140625, -40.51513671875], + [148.18779296875, -40.592578125], + [148.11728515625, -40.521484375], + [148.2369140625, -40.51513671875] + ] + ], + [ + [ + [144.784375, -40.50673828125], + [144.748046875, -40.589453125], + [144.7833984375, -40.43486328125], + [144.784375, -40.50673828125] + ] + ], + [ + [ + [148.32626953125, -40.30693359375], + [148.40400390625, -40.4865234375], + [148.0201171875, -40.40419921875], + [148.32626953125, -40.30693359375] + ] + ], + [ + [ + [148.000390625, -39.7576171875], + [148.29736328125, -39.9857421875], + [148.31357421875, -40.17353515625], + [148.1056640625, -40.262109375], + [147.7671875, -39.8703125], + [148.000390625, -39.7576171875] + ] + ], + [ + [ + [143.9279296875, -40.11611328125], + [143.83857421875, -39.9041015625], + [144.00078125, -39.58017578125], + [144.141015625, -39.95380859375], + [143.9279296875, -40.11611328125] + ] + ], + [ + [ + [145.314453125, -38.4908203125], + [145.355078125, -38.55703125], + [145.12841796875, -38.52763671875], + [145.314453125, -38.4908203125] + ] + ], + [ + [ + [137.596484375, -35.738671875], + [137.92890625, -35.72607421875], + [138.1234375, -35.85234375], + [137.6708984375, -35.89794921875], + [137.4484375, -36.0748046875], + [137.2095703125, -35.982421875], + [136.755078125, -36.03310546875], + [136.540625, -35.89013671875], + [136.638671875, -35.748828125], + [137.33408203125, -35.59248046875], + [137.5849609375, -35.62021484375], + [137.596484375, -35.738671875] + ] + ], + [ + [ + [153.53876953125, -27.43642578125], + [153.4265625, -27.7064453125], + [153.43544921875, -27.40537109375], + [153.53876953125, -27.43642578125] + ] + ], + [ + [ + [113.1830078125, -26.053125], + [112.9642578125, -25.78310546875], + [112.9470703125, -25.53154296875], + [113.1830078125, -26.053125] + ] + ], + [ + [ + [153.07744140625, -25.75078125], + [152.97666015625, -25.5513671875], + [153.0380859375, -25.1931640625], + [153.2275390625, -25.00576171875], + [153.14375, -24.81484375], + [153.25693359375, -24.72890625], + [153.3501953125, -25.0630859375], + [153.07744140625, -25.75078125] + ] + ], + [ + [ + [151.14658203125, -23.4908203125], + [151.24013671875, -23.5296875], + [151.23828125, -23.77578125], + [151.03330078125, -23.53017578125], + [151.14658203125, -23.4908203125] + ] + ], + [ + [ + [115.44619140625, -20.78779296875], + [115.31806640625, -20.8505859375], + [115.4345703125, -20.66796875], + [115.44619140625, -20.78779296875] + ] + ], + [ + [ + [149.04375, -20.29150390625], + [148.9388671875, -20.28369140625], + [148.9810546875, -20.153515625], + [149.04375, -20.29150390625] + ] + ], + [ + [ + [146.2783203125, -18.23125], + [146.298828125, -18.4847656250001], + [146.098828125, -18.2517578125], + [146.2783203125, -18.23125] + ] + ], + [ + [ + [139.4591796875, -17.11455078125], + [139.4927734375, -16.9904296875], + [139.5708984375, -17.09443359375], + [139.4591796875, -17.11455078125] + ] + ], + [ + [ + [139.5078125, -16.573046875], + [139.1595703125, -16.74169921875], + [139.29296875, -16.46728515625], + [139.587890625, -16.39521484375], + [139.69775390625, -16.51494140625], + [139.5078125, -16.573046875] + ] + ], + [ + [ + [137.09365234375, -15.778125], + [136.94267578125, -15.71171875], + [137.0095703125, -15.59482421875], + [137.09365234375, -15.778125] + ] + ], + [ + [ + [124.597265625, -15.401953125], + [124.52421875, -15.421484375], + [124.5193359375, -15.26748046875], + [124.597265625, -15.401953125] + ] + ], + [ + [ + [125.198828125, -14.5794921875], + [125.0912109375, -14.59169921875], + [125.1599609375, -14.4560546875], + [125.198828125, -14.5794921875] + ] + ], + [ + [ + [136.7146484375, -13.80390625], + [136.8908203125, -13.78662109375], + [136.7453125, -14.07265625], + [136.95078125, -14.18427734375], + [136.8943359375, -14.29306640625], + [136.33544921875, -14.21181640625], + [136.42470703125, -13.86484375], + [136.6556640625, -13.67587890625], + [136.7146484375, -13.80390625] + ] + ], + [ + [ + [136.23740234375, -13.82451171875], + [136.12265625, -13.8166015625], + [136.2154296875, -13.6647460937501], + [136.23740234375, -13.82451171875] + ] + ], + [ + [ + [136.338671875, -11.60234375], + [136.1802734375, -11.6767578125], + [136.479296875, -11.46591796875], + [136.338671875, -11.60234375] + ] + ], + [ + [ + [130.45927734375, -11.679296875], + [130.60625, -11.8166015625], + [130.04326171875, -11.7873046875], + [130.19755859375, -11.658203125], + [130.15283203125, -11.4775390625], + [130.294921875, -11.33681640625], + [130.45927734375, -11.679296875] + ] + ], + [ + [ + [130.61884765625, -11.37607421875], + [131.023046875, -11.334375], + [131.26826171875, -11.18984375], + [131.53857421875, -11.4369140625], + [130.9509765625, -11.92646484375], + [130.5119140625, -11.61787109375], + [130.3845703125, -11.1921875], + [130.61884765625, -11.37607421875] + ] + ], + [ + [ + [136.59853515625, -11.3789062499999], + [136.5265625, -11.4388671875], + [136.7802734375, -11.0125], + [136.59853515625, -11.3789062499999] + ] + ], + [ + [ + [132.593359375, -11.30283203125], + [132.4837890625, -11.0373046875], + [132.57880859375, -10.96884765625], + [132.593359375, -11.30283203125] + ] + ], + [ + [ + [143.17890625, -11.9544921875], + [143.11025390625, -12.303515625], + [143.4015625, -12.63994140625], + [143.58662109375, -13.44365234375], + [143.5484375, -13.741015625], + [143.75634765625, -14.348828125], + [143.96181640625, -14.462890625], + [144.473046875, -14.2318359375], + [144.648046875, -14.49248046875], + [145.2876953125, -14.9431640625], + [145.42607421875, -16.40615234375], + [145.75478515625, -16.8794921875], + [145.912109375, -16.9125], + [146.12587890625, -17.63525390625], + [146.0322265625, -18.2728515625], + [146.333203125, -18.5537109375], + [146.3833984375, -18.97705078125], + [147.13876953125, -19.3931640625], + [147.4185546875, -19.378125], + [147.7423828125, -19.7701171875], + [148.759375, -20.28955078125], + [148.884765625, -20.480859375], + [148.72998046875, -20.4677734375], + [148.68369140625, -20.58017578125], + [149.2048828125, -21.12509765625], + [149.4541015625, -21.5787109375], + [149.70390625, -22.44052734375], + [149.8224609375, -22.38984375], + [149.9744140625, -22.55068359375], + [149.94189453125, -22.30810546875], + [150.076171875, -22.164453125], + [150.54130859375, -22.55908203125], + [150.5685546875, -22.383984375], + [150.6724609375, -22.4181640625], + [150.8431640625, -23.4580078125], + [151.15380859375, -23.78408203125], + [151.831640625, -24.12294921875], + [152.1298828125, -24.59755859375], + [152.45634765625, -24.80244140625], + [152.654296875, -25.201953125], + [152.9134765625, -25.43212890625], + [152.9849609375, -25.8162109375], + [153.16494140625, -25.96416015625], + [153.116796875, -27.19443359375], + [153.57568359375, -28.24052734375], + [153.61689453125, -28.673046875], + [153.03056640625, -30.56337890625], + [152.9439453125, -31.43486328125], + [152.55927734375, -32.045703125], + [152.47041015625, -32.4390625], + [152.1365234375, -32.678125], + [152.1642578125, -32.757421875], + [151.812890625, -32.90107421875], + [151.29208984375, -33.58095703125], + [151.2802734375, -33.9266601562501], + [151.1248046875, -34.0052734375], + [151.23154296875, -34.0296875], + [150.8712890625, -34.49912109375], + [150.80458984375, -35.012890625], + [150.1953125, -35.83359375], + [149.93271484375, -37.528515625], + [149.480859375, -37.77119140625], + [147.8767578125, -37.9341796875], + [146.8568359375, -38.6634765625], + [146.21748046875, -38.72744140625], + [146.33662109375, -38.89423828125], + [146.4666015625, -38.84033203125], + [146.4, -39.1455078125], + [146.1583984375, -38.86572265625], + [145.9353515625, -38.9017578125], + [145.7908203125, -38.6669921875], + [145.397265625, -38.5353515625], + [145.5421875, -38.39384765625], + [145.47578125, -38.24375], + [145.2927734375, -38.23759765625], + [144.9595703125, -38.50078125], + [144.7177734375, -38.34033203125], + [144.91142578125, -38.34404296875], + [145.119921875, -38.09130859375], + [144.89130859375, -37.8998046875], + [144.3955078125, -38.1369140625], + [144.665234375, -38.2099609375], + [143.53896484375, -38.8208984375], + [142.455859375, -38.386328125], + [141.725, -38.27138671875], + [141.5939453125, -38.38779296875], + [141.42421875, -38.3634765625], + [141.0109375, -38.076953125], + [140.3904296875, -37.8966796875], + [139.78427734375, -37.24580078125], + [139.85732421875, -36.662109375], + [139.72900390625, -36.37138671875], + [138.9689453125, -35.58076171875], + [139.17802734375, -35.523046875], + [139.289453125, -35.611328125], + [139.28251953125, -35.375390625], + [138.521875, -35.6423828125], + [138.184375, -35.6126953125], + [138.5111328125, -35.0244140625], + [138.48994140625, -34.76357421875], + [138.0892578125, -34.16982421875], + [137.69169921875, -35.14296875], + [136.88359375, -35.23974609375], + [137.0142578125, -34.9158203125], + [137.391015625, -34.91328125], + [137.49384765625, -34.1611328125], + [137.9318359375, -33.5791015625], + [137.85234375, -33.20078125], + [137.992578125, -33.09423828125], + [137.783203125, -32.578125], + [137.79091796875, -32.8232421875], + [137.44228515625, -33.1935546875], + [137.2373046875, -33.6294921875], + [136.4306640625, -34.02998046875], + [135.891015625, -34.6609375], + [135.9697265625, -34.9818359375], + [135.7923828125, -34.86328125], + [135.64755859375, -34.9396484375], + [135.123046875, -34.5857421875], + [135.216796875, -34.4873046875], + [135.45, -34.5810546875], + [135.2189453125, -33.959765625], + [134.88876953125, -33.6263671875], + [134.791015625, -33.3283203125], + [134.60771484375, -33.19013671875], + [134.30126953125, -33.1650390625], + [134.17353515625, -32.9791015625], + [134.100390625, -32.7486328125], + [134.2271484375, -32.73056640625], + [134.2341796875, -32.54853515625], + [133.66533203125, -32.2072265625001], + [133.212109375, -32.1837890625], + [132.757421875, -31.95625], + [132.2146484375, -32.00712890625], + [131.14365234375, -31.4957031250001], + [130.7830078125, -31.60400390625], + [129.1876953125, -31.6599609375], + [127.31982421875, -32.2640625], + [125.9171875, -32.29697265625], + [124.7587890625, -32.88271484375], + [124.24375, -33.015234375], + [123.5068359375, -33.9162109375001], + [122.1509765625, -33.991796875], + [122.0611328125, -33.8744140625], + [121.405078125, -33.8267578125], + [119.8541015625, -33.97470703125], + [119.4505859375, -34.36826171875], + [118.8953125, -34.4798828125], + [118.135546875, -34.98662109375], + [117.58193359375, -35.09775390625], + [116.5171875, -34.987890625], + [115.98671875, -34.79501953125], + [115.5650390625, -34.42578125], + [115.0087890625, -34.255859375], + [114.99384765625, -33.51533203125], + [115.3587890625, -33.63994140625], + [115.6830078125, -33.19287109375], + [115.6984375, -31.6945312500001], + [115.0779296875, -30.56044921875], + [114.8568359375, -29.14296875], + [114.16513671875, -28.0806640625], + [114.028125, -27.347265625], + [113.184765625, -26.1822265625], + [113.3232421875, -26.24384765625], + [113.3560546875, -26.08046875], + [113.581640625, -26.55810546875], + [113.73369140625, -26.5951171875], + [113.83642578125, -26.5005859375], + [113.85283203125, -26.3321289062501], + [113.3953125, -25.71328125], + [113.4513671875, -25.59912109375], + [113.7130859375, -25.83076171875], + [113.72373046875, -26.12978515625], + [113.85390625, -26.014453125], + [113.9919921875, -26.321484375], + [114.09033203125, -26.39365234375], + [114.21572265625, -26.289453125], + [114.2142578125, -25.8515625], + [113.41767578125, -24.43564453125], + [113.48984375, -23.86962890625], + [113.75703125, -23.4181640625001], + [113.7951171875, -22.91455078125], + [113.6828125, -22.63779296875], + [114.0228515625, -21.8814453125], + [114.12392578125, -21.82861328125], + [114.1416015625, -22.48310546875], + [114.377734375, -22.34150390625], + [114.70927734375, -21.8234375], + [115.45615234375, -21.49169921875], + [116.0109375, -21.03037109375], + [116.70673828125, -20.65380859375], + [117.40625, -20.72119140625], + [118.19921875, -20.3751953125], + [118.75146484375, -20.2619140625], + [119.1044921875, -19.9953125], + [119.5859375, -20.03828125], + [120.99794921875, -19.60439453125], + [121.3376953125, -19.319921875], + [121.8337890625, -18.47705078125], + [122.34541015625, -18.1119140625], + [122.1474609375, -17.5490234375], + [122.2609375, -17.1357421875], + [122.72041015625, -16.7876953125], + [122.970703125, -16.43681640625], + [123.5630859375, -17.5208984375], + [123.5935546875, -17.0303710937501], + [123.8310546875, -17.12080078125], + [123.8744140625, -16.91865234375], + [123.4904296875, -16.49072265625], + [123.6259765625, -16.41630859375], + [123.60703125, -16.2240234375], + [123.72890625, -16.19248046875], + [123.8591796875, -16.38232421875], + [124.04443359375, -16.26494140625], + [124.300390625, -16.38828125], + [124.77197265625, -16.40263671875], + [124.4048828125, -16.29892578125], + [124.41640625, -16.13349609375], + [124.57685546875, -16.113671875], + [124.64853515625, -15.87021484375], + [124.504296875, -15.9724609375], + [124.381640625, -15.758203125], + [124.43955078125, -15.4935546875], + [124.56162109375, -15.4962890625], + [124.692578125, -15.2736328125], + [125.06298828125, -15.44228515625], + [125.07294921875, -15.30673828125], + [124.9091796875, -15.31005859375], + [124.8390625, -15.1607421875], + [125.03818359375, -15.0041015625], + [125.3556640625, -15.11982421875], + [125.1787109375, -14.71474609375], + [125.57978515625, -14.483203125], + [125.627734375, -14.256640625], + [125.70458984375, -14.29140625], + [125.66162109375, -14.5294921875], + [125.81953125, -14.469140625], + [125.890625, -14.61796875], + [126.020703125, -14.49453125], + [126.05390625, -13.97724609375], + [126.18427734375, -14.00205078125], + [126.25849609375, -14.16357421875], + [126.403125, -14.0189453125], + [126.5697265625, -14.1609375], + [126.7806640625, -13.95517578125], + [126.7755859375, -13.7884765625], + [126.90322265625, -13.744140625], + [127.4576171875, -14.0314453125], + [128.18046875, -14.71162109375], + [128.06943359375, -15.329296875], + [128.15546875, -15.2255859375], + [128.2546875, -15.29853515625], + [128.175, -15.0431640625], + [128.57578125, -14.77451171875], + [129.058203125, -14.884375], + [129.2158203125, -15.16025390625], + [129.267578125, -14.8714843750001], + [129.634765625, -15.13974609375], + [129.637109375, -14.8509765625], + [129.84873046875, -14.82890625], + [129.6046875, -14.6470703125], + [129.69794921875, -14.557421875], + [129.3787109375, -14.39248046875], + [129.70986328125, -13.97998046875], + [129.8388671875, -13.57294921875], + [130.259765625, -13.30224609375], + [130.1349609375, -13.1455078125], + [130.1681640625, -12.957421875], + [130.39990234375, -12.687890625], + [130.61748046875, -12.646875], + [130.62265625, -12.4310546875], + [130.8673828125, -12.5578125], + [130.873828125, -12.3671875], + [131.2916015625, -12.06787109375], + [131.43828125, -12.276953125], + [132.0640625, -12.28076171875], + [132.25322265625, -12.18603515625], + [132.41103515625, -12.2951171875], + [132.510546875, -12.13486328125], + [132.71279296875, -12.1234375], + [132.63046875, -12.03515625], + [132.67421875, -11.6490234375], + [132.4751953125, -11.49150390625], + [132.0728515625, -11.47470703125], + [131.8224609375, -11.30244140625], + [131.9615234375, -11.180859375], + [132.15546875, -11.3111328125], + [132.333984375, -11.22353515625], + [132.6828125, -11.50556640625], + [132.96103515625, -11.40732421875], + [133.18525390625, -11.7056640625], + [133.90419921875, -11.83203125], + [134.4173828125, -12.052734375], + [134.7302734375, -11.984375], + [135.0296875, -12.19375], + [135.21796875, -12.2216796875], + [135.9224609375, -11.82578125], + [135.70439453125, -12.20986328125], + [136.00849609375, -12.19140625], + [136.0818359375, -12.4224609375], + [136.26064453125, -12.4337890625], + [136.328515625, -12.30556640625], + [136.24990234375, -12.173046875], + [136.443359375, -11.95146484375], + [136.71943359375, -12.22646484375], + [136.8974609375, -12.2435546875], + [136.9474609375, -12.34990234375], + [136.53701171875, -12.78427734375], + [136.5943359375, -13.0038085937501], + [136.46103515625, -13.2251953125], + [136.294140625, -13.13798828125], + [135.92734375, -13.304296875], + [135.9544921875, -13.93486328125], + [135.40517578125, -14.758203125], + [135.4533203125, -14.92314453125], + [136.20537109375, -15.40341796875], + [136.29140625, -15.5701171875], + [136.7048828125, -15.68525390625], + [136.78466796875, -15.89423828125], + [137.0021484375, -15.8783203125], + [137.7037109375, -16.2330078125], + [138.24501953125, -16.718359375], + [139.00986328125, -16.89931640625], + [139.2484375, -17.32861328125], + [140.03583984375, -17.70263671875], + [140.5111328125, -17.62451171875], + [140.83046875, -17.414453125], + [141.29140625, -16.4634765625], + [141.62548828125, -15.056640625], + [141.52294921875, -14.4701171875], + [141.5943359375, -14.15283203125], + [141.47255859375, -13.79755859375], + [141.64541015625, -13.25908203125], + [141.61357421875, -12.94345703125], + [141.92978515625, -12.73984375], + [141.677734375, -12.49140625], + [141.68857421875, -12.35107421875], + [141.8705078125, -11.9755859375], + [141.9611328125, -12.054296875], + [142.168359375, -10.94658203125], + [142.4564453125, -10.70732421875], + [142.605078125, -10.7482421875], + [142.552734375, -10.8744140625], + [142.7796875, -11.11533203125], + [142.87255859375, -11.82138671875], + [143.17890625, -11.9544921875] + ] + ], + [ + [ + [142.2748046875, -10.70478515625], + [142.19140625, -10.76201171875], + [142.1310546875, -10.640625], + [142.19794921875, -10.5919921875], + [142.2748046875, -10.70478515625] + ] + ] + ] + }, + "properties": { + "name": "Australia", + "childNum": 30 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.953125, 48.598828125], + [16.8654296875, 48.3869140625], + [17.14736328125, 48.00595703125], + [17.0666015625, 47.707568359375], + [16.4212890625, 47.674462890625], + [16.6765625, 47.53603515625], + [16.44287109375, 47.39951171875], + [16.45341796875, 47.006787109375], + [16.09306640625, 46.86328125], + [15.9576171875, 46.67763671875], + [14.89326171875, 46.605908203125], + [14.5498046875, 46.39970703125], + [13.7, 46.520263671875], + [13.4900390625, 46.55556640625], + [13.3515625, 46.55791015625], + [13.16875, 46.57265625], + [12.47919921875, 46.672509765625], + [12.38828125, 46.70263671875], + [12.330078125, 46.759814453125], + [12.26796875, 46.835888671875], + [12.1541015625, 46.93525390625], + [12.13076171875, 46.984765625], + [12.16552734375, 47.028173828125], + [12.20126953125, 47.060888671875], + [12.19716796875, 47.075], + [12.16943359375, 47.08212890625], + [11.77568359375, 46.986083984375], + [11.5275390625, 46.997412109375], + [11.433203125, 46.983056640625], + [11.24443359375, 46.97568359375], + [11.13388671875, 46.936181640625], + [11.0634765625, 46.859130859375], + [11.02509765625, 46.79697265625], + [10.99326171875, 46.777001953125], + [10.92734375, 46.769482421875], + [10.82890625, 46.775244140625], + [10.759765625, 46.793310546875], + [10.6892578125, 46.84638671875], + [10.57978515625, 46.8537109375], + [10.47939453125, 46.855126953125], + [10.45283203125, 46.86494140625], + [10.45458984375, 46.8994140625], + [10.41494140625, 46.964404296875], + [10.3494140625, 46.984765625], + [10.13349609375, 46.851513671875], + [9.58027343750001, 47.057373046875], + [9.52753906250001, 47.270751953125], + [9.62587890625002, 47.467041015625], + [9.52402343750001, 47.52421875], + [9.74892578125002, 47.575537109375], + [9.83916015625002, 47.552294921875], + [9.97158203125002, 47.505322265625], + [10.03408203125, 47.473583984375], + [10.05986328125, 47.449072265625], + [10.06630859375, 47.393359375], + [10.20029296875, 47.363427734375], + [10.1830078125, 47.27880859375], + [10.369140625, 47.366064453125], + [10.40390625, 47.4169921875], + [10.439453125, 47.5515625], + [10.4828125, 47.541796875], + [10.65869140625, 47.547216796875], + [10.7416015625, 47.52412109375], + [10.873046875, 47.52021484375], + [11.0419921875, 47.393115234375], + [12.18564453125, 47.61953125], + [12.20380859375, 47.646728515625], + [12.196875, 47.70908203125], + [12.20927734375, 47.71826171875], + [12.268359375, 47.702734375], + [12.3535407366072, 47.7026478794643], + [12.4925530133929, 47.6855189732143], + [12.68583984375, 47.6693359375], + [12.77138671875, 47.639404296875], + [12.79619140625, 47.60703125], + [12.78115234375, 47.5904296875], + [12.7828125, 47.56416015625], + [12.809375, 47.5421875], + [12.87890625, 47.5064453125], + [12.96806640625, 47.47568359375], + [13.01435546875, 47.478076171875], + [13.03154296875, 47.5080078125], + [13.04794921875, 47.579150390625], + [13.0541015625, 47.655126953125], + [12.89765625, 47.721875], + [12.953515625, 47.890625], + [12.7603515625, 48.106982421875], + [13.215234375, 48.301904296875], + [13.3228515625, 48.33125], + [13.409375, 48.394140625], + [13.45986328125, 48.56455078125], + [13.4716796875, 48.571826171875], + [13.48662109375, 48.5818359375], + [13.6366238839286, 48.5809040178571], + [13.7853515625, 48.587451171875], + [13.798828125, 48.6216796875], + [13.8029296875, 48.747509765625], + [13.81474609375, 48.766943359375], + [14.04912109375, 48.602490234375], + [14.69130859375, 48.59921875], + [15.066796875, 48.9978515625], + [16.0572265625, 48.75478515625], + [16.5435546875, 48.796240234375], + [16.953125, 48.598828125] + ] + ] + }, + "properties": { + "name": "Austria", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [46.1144531250001, 38.877783203125], + [45.4796875000001, 39.00625], + [44.8171875, 39.650439453125], + [44.76826171875, 39.7035156250001], + [45.0316406250001, 39.76513671875], + [45.15283203125, 39.582666015625], + [45.4568359375001, 39.494482421875], + [45.78447265625, 39.54560546875], + [45.76630859375, 39.378466796875], + [45.97744140625, 39.243896484375], + [46.1144531250001, 38.877783203125] + ] + ], + [ + [ + [48.5728515625, 41.844482421875], + [49.45673828125, 40.799853515625], + [49.7759765625001, 40.583984375], + [50.1825195312501, 40.50478515625], + [50.3659179687501, 40.2794921875], + [49.9188476562501, 40.31640625], + [49.551171875, 40.194140625], + [49.3244140625001, 39.608349609375], + [49.36279296875, 39.349560546875], + [49.16533203125, 39.0302734375], + [49.0134765625001, 39.133984375], + [48.8544921875, 38.838818359375], + [48.86875, 38.435498046875], + [48.5926757812501, 38.411083984375], + [47.996484375, 38.853759765625], + [48.29208984375, 39.01884765625], + [48.1043945312501, 39.24111328125], + [48.32216796875, 39.399072265625], + [47.9958984375001, 39.683935546875], + [46.490625, 38.906689453125], + [46.40029296875, 39.1921875], + [46.5847656250001, 39.223681640625], + [46.365234375, 39.402490234375], + [46.4814453125, 39.55517578125], + [46.20205078125, 39.594482421875], + [45.57978515625, 39.9775390625], + [45.8859375000001, 40.024853515625], + [45.9646484375, 40.2337890625], + [45.45439453125, 40.532373046875], + [45.37890625, 40.6735839843751], + [45.5875, 40.846923828125], + [45.0705078125, 41.0755859375], + [45.18857421875, 41.147412109375], + [45.0013671875, 41.290966796875], + [45.2171875, 41.423193359375], + [45.28095703125, 41.449560546875], + [46.0865234375, 41.183837890625], + [46.43095703125, 41.07705078125], + [46.534375, 41.08857421875], + [46.6263671875001, 41.1596679687501], + [46.66240234375, 41.2455078125], + [46.67255859375, 41.28681640625], + [46.6189453125, 41.34375], + [46.30546875, 41.50771484375], + [46.18427734375, 41.7021484375], + [46.4298828125, 41.890966796875], + [46.74931640625, 41.81259765625], + [47.31767578125, 41.282421875], + [47.791015625, 41.199267578125], + [48.5728515625, 41.844482421875] + ] + ] + ] + }, + "properties": { + "name": "Azerbaijan", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [30.55361328125, -2.40009765625001], + [30.53369140625, -2.42626953125], + [30.4419921875, -2.61347656250001], + [30.42421875, -2.6416015625], + [30.47333984375, -2.6943359375], + [30.4240234375, -2.8240234375], + [30.43349609375, -2.87451171875], + [30.5150390625, -2.917578125], + [30.604296875, -2.93525390625001], + [30.70947265625, -2.97724609375001], + [30.7802734375, -2.98486328125], + [30.8111328125, -3.11640625000001], + [30.790234375, -3.27460937500001], + [30.4, -3.65390625], + [29.947265625, -4.30732421875001], + [29.7177734375, -4.455859375], + [29.40322265625, -4.44931640625001], + [29.21181640625, -3.8337890625], + [29.2244140625, -3.053515625], + [29.01435546875, -2.72021484375], + [29.10205078125, -2.595703125], + [29.390234375, -2.80859375], + [29.698046875, -2.7947265625], + [29.8681640625, -2.71640625], + [29.93017578125, -2.33955078125001], + [30.11728515625, -2.41660156250001], + [30.40849609375, -2.31298828125], + [30.55361328125, -2.40009765625001] + ] + ] + }, + "properties": { + "name": "Burundi", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [5.69355468750001, 50.774755859375], + [5.99394531250002, 50.750439453125], + [6.34091796875001, 50.4517578125], + [6.11650390625005, 50.12099609375], + [6.08906250000004, 50.15458984375], + [6.05478515624998, 50.154296875], + [5.97626953125007, 50.1671875], + [5.86689453125007, 50.0828125], + [5.81738281250003, 50.0126953125], + [5.7880859375, 49.96123046875], + [5.74404296874999, 49.91962890625], + [5.78974609374998, 49.53828125], + [5.50732421875, 49.510888671875], + [4.86757812500005, 49.788134765625], + [4.81865234375005, 50.153173828125], + [4.54501953125006, 49.96025390625], + [4.14931640625002, 49.97158203125], + [4.17460937500002, 50.2464843750001], + [3.68935546875002, 50.3060546875], + [3.59541015625007, 50.47734375], + [3.27333984375008, 50.53154296875], + [3.10683593750008, 50.779443359375], + [2.759375, 50.750634765625], + [2.52490234375, 51.097119140625], + [3.35009765625, 51.377685546875], + [3.43251953125008, 51.2457519531251], + [3.90205078125001, 51.207666015625], + [4.22617187500003, 51.386474609375], + [5.03095703125004, 51.469091796875], + [5.21416015625005, 51.278955078125], + [5.79648437500003, 51.153076171875], + [5.69355468750001, 50.774755859375] + ] + ] + }, + "properties": { + "name": "Belgium", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [3.59541015625001, 11.6962890625], + [3.55390625000001, 11.631884765625], + [3.49052734375002, 11.49921875], + [3.48779296875, 11.39541015625], + [3.63886718750001, 11.17685546875], + [3.65625, 11.15458984375], + [3.6953125, 11.1203125], + [3.71640625, 11.07958984375], + [3.7568359375, 10.76875], + [3.83447265625, 10.607421875], + [3.77177734375002, 10.417626953125], + [3.64658203125001, 10.408984375], + [3.60205078125, 10.004541015625], + [3.3251953125, 9.77846679687499], + [3.044921875, 9.08383789062499], + [2.77480468750002, 9.04853515625], + [2.703125, 8.371826171875], + [2.68603515625, 7.87373046875], + [2.71933593750001, 7.61625976562499], + [2.7509765625, 7.54189453124999], + [2.78515625, 7.47685546874999], + [2.78398437500002, 7.44340820312499], + [2.76582031250001, 7.42250976562499], + [2.75048828125, 7.39506835937499], + [2.75673828125002, 7.06791992187499], + [2.72138671875001, 6.98027343749999], + [2.73173828125002, 6.85283203124999], + [2.7529296875, 6.77163085937499], + [2.77460937500001, 6.71171874999999], + [2.75371093750002, 6.66176757812499], + [2.73564453125002, 6.595703125], + [2.70644531250002, 6.36923828124999], + [1.62265625, 6.216796875], + [1.77792968750001, 6.29462890625], + [1.53095703125001, 6.992431640625], + [1.62470703125001, 6.997314453125], + [1.60019531250001, 9.050048828125], + [1.3857421875, 9.36166992187499], + [1.330078125, 9.99697265624999], + [0.763378906250011, 10.386669921875], + [0.900488281250006, 10.99326171875], + [1.4267578125, 11.447119140625], + [1.98037109375002, 11.418408203125], + [2.38916015625, 11.8970703125], + [2.36601562500002, 12.221923828125], + [2.80527343750001, 12.383837890625], + [3.59541015625001, 11.6962890625] + ] + ] + }, + "properties": { + "name": "Benin", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0.217480468750011, 14.911474609375], + [0.163867187500017, 14.497216796875], + [0.382519531250011, 14.24580078125], + [0.42919921875, 13.972119140625], + [0.6181640625, 13.70341796875], + [1.201171875, 13.35751953125], + [0.988476562500011, 13.36484375], + [0.9873046875, 13.04189453125], + [1.56494140625, 12.635400390625], + [2.10458984375001, 12.70126953125], + [2.22626953125001, 12.466064453125], + [2.07294921875001, 12.309375], + [2.38916015625, 11.8970703125], + [1.98037109375002, 11.418408203125], + [1.4267578125, 11.447119140625], + [0.900488281250006, 10.99326171875], + [0.49267578125, 10.95498046875], + [-0.068603515625, 11.115625], + [-0.299462890624994, 11.16689453125], + [-0.627148437499983, 10.927392578125], + [-1.04248046875, 11.01005859375], + [-2.82993164062498, 10.998388671875], + [-2.91489257812498, 10.592333984375], + [-2.79116210937499, 10.432421875], + [-2.780517578125, 9.745849609375], + [-2.76596679687498, 9.65805664062499], + [-2.70620117187499, 9.533935546875], + [-2.69584960937499, 9.48134765624999], + [-2.7171875, 9.45712890624999], + [-2.7666015625, 9.42470703124999], + [-2.81674804687498, 9.42583007812499], + [-2.87514648437499, 9.500927734375], + [-2.90087890625, 9.534619140625], + [-2.94814453124999, 9.61074218749999], + [-2.98828125, 9.68735351562499], + [-3.04262695312499, 9.7208984375], + [-3.09580078124998, 9.75209960937499], + [-3.16069335937499, 9.84916992187499], + [-3.22353515624999, 9.895458984375], + [-3.28969726562499, 9.88222656249999], + [-3.58115234374998, 9.92431640625], + [-3.790625, 9.9171875], + [-4.18115234375, 9.78173828125], + [-4.26718749999998, 9.74326171874999], + [-4.33222656249998, 9.645703125], + [-4.40620117187498, 9.64799804687499], + [-4.526611328125, 9.72348632812499], + [-4.62583007812498, 9.71357421875], + [-4.72177734374998, 9.75654296875], + [-5.26230468749998, 10.319677734375], + [-5.52353515624998, 10.426025390625], + [-5.490478515625, 11.0423828125], + [-5.250244140625, 11.37578125], + [-5.28813476562499, 11.8279296875], + [-4.69931640624998, 12.076171875], + [-4.4287109375, 12.33759765625], + [-4.48061523437499, 12.672216796875], + [-4.22709960937499, 12.793701171875], + [-4.32871093749998, 13.11904296875], + [-4.15102539062499, 13.306201171875], + [-3.94731445312499, 13.402197265625], + [-3.52763671874999, 13.18271484375], + [-3.3017578125, 13.28076171875], + [-3.24863281249998, 13.658349609375], + [-2.95083007812499, 13.6484375], + [-2.87392578124999, 13.950732421875], + [-2.58671874999999, 14.227587890625], + [-2.11323242187498, 14.16845703125], + [-1.97304687499999, 14.45654296875], + [-1.049560546875, 14.81953125], + [-0.760449218749983, 15.04775390625], + [-0.235888671874989, 15.059423828125], + [0.217480468750011, 14.911474609375] + ] + ] + }, + "properties": { + "name": "Burkina Faso", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [91.94921875, 21.508056640625], + [91.8594726562501, 21.5329589843751], + [91.90771484375, 21.72294921875], + [91.94921875, 21.508056640625] + ] + ], + [ + [ + [91.873828125, 21.83212890625], + [91.8375976562501, 21.750244140625], + [91.8506835937501, 21.92705078125], + [91.873828125, 21.83212890625] + ] + ], + [ + [ + [91.1507812500001, 22.1751953125], + [91.0447265625, 22.10517578125], + [91.0794921875, 22.5197265625], + [91.1507812500001, 22.1751953125] + ] + ], + [ + [ + [91.5567382812501, 22.3822265625001], + [91.411328125, 22.47568359375], + [91.4560546875, 22.61650390625], + [91.5567382812501, 22.3822265625001] + ] + ], + [ + [ + [90.7776367187501, 22.089306640625], + [90.5150390625001, 22.06513671875], + [90.6804687500001, 22.327490234375], + [90.5029296875, 22.8353515625], + [90.596484375, 22.8635253906251], + [90.8681640625, 22.48486328125], + [90.7776367187501, 22.089306640625] + ] + ], + [ + [ + [88.94072265625, 26.245361328125], + [88.97041015625, 26.25087890625], + [88.951953125, 26.412109375], + [89.0186523437501, 26.41025390625], + [89.2892578125, 26.03759765625], + [89.5499023437501, 26.0052734375], + [89.57275390625, 26.13232421875], + [89.6708984375, 26.213818359375], + [89.8229492187501, 25.94140625], + [89.82490234375, 25.56015625], + [89.8008789062501, 25.3361328125], + [89.8140625000001, 25.30537109375], + [89.8663085937501, 25.2931640625], + [90.11962890625, 25.219970703125], + [90.6130859375, 25.167724609375], + [92.0497070312501, 25.169482421875], + [92.4683593750001, 24.944140625], + [92.3849609375, 24.848779296875], + [92.2512695312501, 24.895068359375], + [92.2283203125, 24.88134765625], + [92.2266601562501, 24.77099609375], + [92.11748046875, 24.4939453125], + [92.06416015625, 24.374365234375], + [91.84619140625, 24.17529296875], + [91.7265625, 24.205078125], + [91.3501953125001, 24.060498046875], + [91.1604492187501, 23.66064453125], + [91.359375, 23.068359375], + [91.43623046875, 23.19990234375], + [91.553515625, 22.991552734375], + [91.61953125, 22.9796875], + [91.7509765625, 23.053515625], + [91.7541992187501, 23.2873046875], + [91.7900390625, 23.36103515625], + [91.937890625, 23.5046875], + [91.9294921875001, 23.5982421875], + [91.92958984375, 23.685986328125], + [91.978515625, 23.6919921875], + [92.0440429687501, 23.677783203125], + [92.24609375, 23.6835937500001], + [92.3337890625, 23.2423828125], + [92.36162109375, 22.9290039062501], + [92.4644531250001, 22.734423828125], + [92.49140625, 22.685400390625], + [92.5612304687501, 22.048046875], + [92.57490234375, 21.978076171875], + [92.5828125, 21.94033203125], + [92.5934570312501, 21.467333984375], + [92.631640625, 21.306201171875], + [92.33056640625, 21.439794921875], + [92.1795898437501, 21.293115234375], + [92.32412109375, 20.7918457031251], + [92.0560546875, 21.1748046875], + [91.8633789062501, 22.35048828125], + [91.7970703125001, 22.2974609375], + [91.4800781250001, 22.884814453125], + [91.2162109375, 22.642236328125], + [90.94560546875, 22.597021484375], + [90.65625, 23.02548828125], + [90.60400390625, 23.591357421875], + [90.5556640625, 23.4215332031251], + [90.2691406250001, 23.455859375], + [90.5909179687501, 23.26640625], + [90.43505859375, 22.751904296875], + [90.61611328125, 22.362158203125], + [90.2305664062501, 21.82978515625], + [90.0711914062501, 21.887255859375], + [90.2095703125001, 22.156591796875], + [89.9541992187501, 22.0228515625], + [89.9180664062501, 22.116162109375], + [89.98515625, 22.4664062500001], + [89.8119140625001, 21.98349609375], + [89.5685546875, 21.767431640625], + [89.4832031250001, 22.275537109375], + [89.5005859375001, 21.91435546875], + [89.3537109375, 21.72109375], + [89.0939453125, 21.87275390625], + [89.05, 22.274609375], + [88.920703125, 22.63203125], + [88.89970703125, 22.8435058593751], + [88.8505859375, 23.0405273437501], + [88.928125, 23.1866210937501], + [88.7244140625, 23.25498046875], + [88.69765625, 23.493017578125], + [88.6357421875, 23.55], + [88.5673828125, 23.6744140625], + [88.6998046875001, 24.0025390625], + [88.71376953125, 24.06962890625], + [88.7265625, 24.18623046875], + [88.7335937500001, 24.230908203125], + [88.72353515625, 24.27490234375], + [88.64228515625, 24.3259765625], + [88.49853515625, 24.346630859375], + [88.3375, 24.453857421875], + [88.225, 24.46064453125], + [88.1455078125, 24.485791015625], + [88.0791015625, 24.5499023437501], + [88.0234375, 24.6278320312501], + [88.0302734375, 24.6644531250001], + [88.0451171875001, 24.713037109375], + [88.1498046875, 24.9146484375], + [88.1888671875, 24.92060546875], + [88.2794921875, 24.88193359375], + [88.3133789062501, 24.8818359375], + [88.37294921875, 24.9615234375], + [88.45625, 25.188427734375], + [88.5738281250001, 25.187890625], + [88.9297851562501, 25.2229980468751], + [88.944140625, 25.290771484375], + [88.85478515625, 25.333544921875], + [88.7691406250001, 25.490478515625], + [88.50244140625, 25.53701171875], + [88.1474609375, 25.81142578125], + [88.1066406250001, 25.84111328125], + [88.1507812500001, 26.087158203125], + [88.333984375, 26.25751953125], + [88.4404296875, 26.369482421875], + [88.38623046875, 26.471533203125], + [88.3514648437501, 26.482568359375], + [88.369921875, 26.564111328125], + [88.51826171875, 26.5177734375], + [88.6828125, 26.29169921875], + [88.94072265625, 26.245361328125] + ] + ] + ] + }, + "properties": { + "name": "Bangladesh", + "childNum": 6 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.5853515625, 43.742236328125], + [28.4654296875, 43.389306640625], + [28.13369140625, 43.39560546875], + [27.92890625, 43.1861328125], + [27.8888671875, 42.74970703125], + [27.484765625, 42.46806640625], + [28.014453125, 41.96904296875], + [27.4748046875, 41.946875], + [27.294921875, 42.079541015625], + [27.2443359375, 42.09326171875], + [27.01171875, 42.058642578125], + [26.96875, 42.02685546875], + [26.88486328125, 41.991845703125], + [26.61533203125, 41.964892578125], + [26.54970703125, 41.896728515625], + [26.51142578125, 41.8263671875], + [26.3603515625, 41.8015625], + [26.32724609375, 41.772802734375], + [26.31796875, 41.744677734375], + [26.3208984375, 41.716552734375], + [26.2005859375, 41.743798828125], + [26.107421875, 41.72568359375], + [26.085546875, 41.704150390625], + [26.066015625, 41.6732421875], + [26.1435546875, 41.521533203125], + [26.15517578125, 41.43486328125], + [26.1353515625, 41.3857421875], + [26.06640625, 41.35068359375], + [25.92333984375, 41.3119140625], + [25.7849609375, 41.330419921875], + [25.52705078125, 41.2998046875], + [25.38193359375, 41.26435546875], + [25.251171875, 41.2435546875], + [24.77373046875, 41.356103515625], + [24.59599609375, 41.442724609375], + [24.5693359375, 41.4673828125], + [24.51826171875, 41.5525390625], + [24.487890625, 41.555224609375], + [24.0560546875, 41.52724609375], + [24.03291015625, 41.469091796875], + [24.011328125, 41.46005859375], + [23.63515625, 41.386767578125], + [23.53583984375, 41.38603515625], + [23.4333984375, 41.39873046875], + [23.3720703125, 41.3896484375], + [23.23984375, 41.3849609375], + [23.15595703125, 41.3220703125], + [22.916015625, 41.336279296875], + [23.00361328125, 41.73984375], + [22.83681640625, 41.993603515625], + [22.34404296875, 42.31396484375], + [22.4220703125, 42.328857421875], + [22.445703125, 42.359130859375], + [22.52353515625, 42.440966796875], + [22.532421875, 42.481201171875], + [22.52421875, 42.50390625], + [22.43623046875, 42.6291015625], + [22.466796875, 42.84248046875], + [22.79990234375, 42.9857421875], + [22.97685546875, 43.18798828125], + [22.8595703125, 43.25234375], + [22.8197265625, 43.300732421875], + [22.767578125, 43.354150390625], + [22.55458984375, 43.4544921875], + [22.36962890625, 43.781298828125], + [22.3654296875, 43.862109375], + [22.3990234375, 43.96953125], + [22.42080078125, 44.007421875], + [22.4525296882281, 44.0510441391688], + [22.5479210959343, 44.1138239566344], + [22.6885648444781, 44.2543062492719], + [23.028515625, 44.077978515625], + [22.86826171875, 43.947900390625], + [22.91904296875, 43.83447265625], + [25.4970703125, 43.67080078125], + [26.2158203125, 44.007275390625], + [27.0869140625, 44.1673828125], + [27.425390625, 44.0205078125], + [27.88427734375, 43.987353515625], + [28.22197265625, 43.7728515625], + [28.5853515625, 43.742236328125] + ] + ] + }, + "properties": { + "name": "Bulgaria", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [50.6072265625, 25.88310546875], + [50.57490234375, 25.806787109375], + [50.46591796875, 25.96552734375], + [50.469921875, 26.228955078125], + [50.5859375, 26.24072265625], + [50.6072265625, 25.88310546875] + ] + ] + }, + "properties": { + "name": "Bahrain", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-73.0268554687499, 21.1923828125], + [-73.16455078125, 20.979150390625], + [-73.68115234375, 20.9755859375], + [-73.68037109375, 21.1033203125], + [-73.523095703125, 21.1908203125], + [-73.2353515625, 21.1544921875], + [-73.05849609375, 21.31337890625], + [-73.0268554687499, 21.1923828125] + ] + ], + [ + [ + [-73.041015625, 22.429052734375], + [-72.747265625, 22.327392578125], + [-73.1619140625, 22.380712890625], + [-73.041015625, 22.429052734375] + ] + ], + [ + [ + [-74.20673828125, 22.21376953125], + [-74.276904296875, 22.18369140625], + [-73.906396484375, 22.5274414062501], + [-73.95419921875, 22.71552734375], + [-73.849951171875, 22.7310546875001], + [-73.8365234375, 22.538427734375], + [-74.20673828125, 22.21376953125] + ] + ], + [ + [ + [-74.05751953125, 22.723486328125], + [-74.274609375, 22.711669921875], + [-74.30703125, 22.839599609375], + [-74.05751953125, 22.723486328125] + ] + ], + [ + [ + [-74.8404785156249, 22.8943359375], + [-75.22333984375, 23.1653320312501], + [-75.13056640625, 23.267919921875], + [-75.315966796875, 23.668359375], + [-74.8404785156249, 22.8943359375] + ] + ], + [ + [ + [-75.66455078125, 23.450146484375], + [-76.037109375, 23.602783203125], + [-76.01044921875, 23.6713867187501], + [-75.66455078125, 23.450146484375] + ] + ], + [ + [ + [-74.429443359375, 24.06806640625], + [-74.550927734375, 23.9689453125], + [-74.526904296875, 24.105078125], + [-74.429443359375, 24.06806640625] + ] + ], + [ + [ + [-77.6577148437499, 24.249462890625], + [-77.7552734375, 24.1634765625], + [-77.6153808593749, 24.216357421875], + [-77.5615234375, 24.13681640625], + [-77.57373046875, 23.73916015625], + [-77.7712890625, 23.7525390625], + [-77.9999023437499, 24.2198242187501], + [-77.6577148437499, 24.249462890625] + ] + ], + [ + [ + [-75.3083984375, 24.2], + [-75.50322265625, 24.1390625], + [-75.408935546875, 24.265771484375], + [-75.72666015625, 24.6893554687501], + [-75.3083984375, 24.2] + ] + ], + [ + [ + [-77.34755859375, 25.0138671875], + [-77.5619140625, 25.030029296875], + [-77.2755859375, 25.05576171875], + [-77.34755859375, 25.0138671875] + ] + ], + [ + [ + [-77.74384765625, 24.707421875], + [-77.74521484375, 24.4634765625], + [-78.044921875, 24.2874511718751], + [-78.14580078125, 24.49345703125], + [-78.3665039062499, 24.5441894531251], + [-78.435302734375, 24.627587890625], + [-78.2427246093749, 24.65380859375], + [-78.211376953125, 25.191259765625], + [-77.97529296875, 25.0848144531251], + [-77.74384765625, 24.707421875] + ] + ], + [ + [ + [-76.6488281249999, 25.48740234375], + [-76.343798828125, 25.33203125], + [-76.126611328125, 25.1405273437501], + [-76.16953125, 24.6494140625], + [-76.319970703125, 24.81767578125], + [-76.2137695312499, 24.8224609375], + [-76.160400390625, 25.1193359375], + [-76.369287109375, 25.31259765625], + [-76.620703125, 25.431640625], + [-76.7806640625, 25.42685546875], + [-76.71083984375, 25.564892578125], + [-76.6488281249999, 25.48740234375] + ] + ], + [ + [ + [-78.49287109375, 26.729052734375], + [-77.9224609375, 26.69111328125], + [-78.7436523437499, 26.50068359375], + [-78.98564453125, 26.689501953125], + [-78.798046875, 26.582421875], + [-78.5971191406249, 26.79794921875], + [-78.49287109375, 26.729052734375] + ] + ], + [ + [ + [-77.225634765625, 25.90419921875], + [-77.403173828125, 26.02470703125], + [-77.24677734375, 26.15634765625], + [-77.238623046875, 26.5611328125], + [-77.510595703125, 26.84599609375], + [-77.94375, 26.903564453125], + [-77.53388671875, 26.90341796875], + [-77.066357421875, 26.53017578125], + [-77.03828125, 26.333447265625], + [-77.16728515625, 26.24033203125], + [-77.225634765625, 25.90419921875] + ] + ] + ] + }, + "properties": { + "name": "Bahamas", + "childNum": 14 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.00712890625, 44.869189453125], + [19.3486328125001, 44.880908203125], + [19.1184570312501, 44.3599609375], + [19.5837890625, 44.04345703125], + [19.24501953125, 43.9650390625], + [19.4951171875001, 43.64287109375], + [19.1943359375, 43.53330078125], + [19.16435546875, 43.53544921875], + [19.11279296875, 43.527734375], + [19.0800781250001, 43.517724609375], + [19.0283203125, 43.53251953125], + [18.97421875, 43.542333984375], + [18.95068359375, 43.52666015625], + [19.03671875, 43.35732421875], + [19.02666015625, 43.292431640625], + [18.9787109375, 43.285400390625], + [18.93466796875, 43.339453125], + [18.85107421875, 43.346337890625], + [18.7492187500001, 43.283544921875], + [18.6742187500001, 43.230810546875], + [18.6236328125001, 43.027685546875], + [18.4884765625001, 43.012158203125], + [18.44384765625, 42.96845703125], + [18.466015625, 42.77724609375], + [18.5458984375, 42.6416015625], + [18.436328125, 42.559716796875], + [17.6675781250001, 42.897119140625], + [17.5851562500001, 42.9383789062501], + [17.6504882812501, 43.006591796875], + [17.2738281250001, 43.445751953125], + [16.30009765625, 44.12451171875], + [16.1034179687501, 44.5209960937501], + [15.73662109375, 44.7658203125], + [15.7880859375001, 45.178955078125], + [16.0283203125001, 45.189599609375], + [16.2933593750001, 45.008837890625], + [16.5306640625001, 45.21669921875], + [16.91865234375, 45.2765625], + [17.8127929687501, 45.078125], + [18.66259765625, 45.07744140625], + [18.83642578125, 44.883251953125], + [19.00712890625, 44.869189453125] + ] + ] + }, + "properties": { + "name": "Bosnia and Herzegovina", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.14794921875, 56.142919921875], + [28.28427734375, 56.055908203125], + [29.375, 55.938720703125], + [29.35341796875, 55.784375], + [29.41298828125, 55.724853515625], + [29.4822265625, 55.6845703125], + [29.630078125, 55.751171875], + [29.6845703125, 55.7697265625], + [29.744140625, 55.77041015625], + [29.82392578125, 55.7951171875], + [29.881640625, 55.83232421875], + [29.93701171875, 55.845263671875], + [30.04267578125, 55.83642578125], + [30.23359375, 55.84521484375], + [30.6255859375, 55.666259765625], + [30.9068359375, 55.57001953125], + [30.9005859375, 55.397412109375], + [30.82099609375, 55.3302734375], + [30.810546875, 55.306982421875], + [30.814453125, 55.2787109375], + [30.87744140625, 55.2234375], + [30.95888671875, 55.13759765625], + [30.977734375, 55.08779296875], + [30.977734375, 55.05048828125], + [30.8298828125, 54.914990234375], + [30.8044921875, 54.8609375], + [30.791015625, 54.806005859375], + [30.798828125, 54.783251953125], + [30.9841796875, 54.6958984375], + [31.1212890625, 54.648486328125], + [31.1521484375, 54.625341796875], + [31.0748046875, 54.491796875], + [31.184765625, 54.452978515625], + [31.29912109375, 54.29169921875], + [31.40361328125, 54.195947265625], + [31.62841796875, 54.111181640625], + [31.7919921875, 54.055908203125], + [31.8259765625, 54.030712890625], + [31.83779296875, 54.00078125], + [31.82529296875, 53.935009765625], + [31.7830078125, 53.85498046875], + [31.75419921875, 53.81044921875], + [31.82080078125, 53.791943359375], + [31.9921875, 53.796875], + [32.200390625, 53.78125], + [32.4509765625, 53.6533203125], + [32.704296875, 53.336328125], + [32.64443359375, 53.32890625], + [32.57802734375, 53.31240234375], + [32.4693359375, 53.2703125], + [32.1419921875, 53.091162109375], + [31.84970703125, 53.106201171875], + [31.66826171875, 53.200927734375], + [31.41787109375, 53.196044921875], + [31.38837890625, 53.184814453125], + [31.36455078125, 53.13896484375], + [31.3029296875, 53.060888671875], + [31.2587890625, 53.01669921875], + [31.2951171875, 52.989794921875], + [31.35302734375, 52.933447265625], + [31.4427734375, 52.86181640625], + [31.53515625, 52.7982421875], + [31.56484375, 52.759228515625], + [31.585546875, 52.532470703125], + [31.57734375, 52.3123046875], + [31.6015625, 52.284814453125], + [31.64990234375, 52.26220703125], + [31.690625, 52.220654296875], + [31.75859375, 52.125830078125], + [31.76337890625, 52.10107421875], + [31.57373046875, 52.10810546875], + [31.34599609375, 52.10537109375], + [31.21796875, 52.050244140625], + [30.9806640625, 52.04619140625], + [30.845703125, 51.953076171875], + [30.7552734375, 51.895166015625], + [30.66728515625, 51.814111328125], + [30.58388671875, 51.68896484375], + [30.5330078125, 51.596337890625], + [30.5607421875, 51.531494140625], + [30.60234375, 51.471240234375], + [30.61171875, 51.40634765625], + [30.63251953125, 51.355419921875], + [30.44951171875, 51.27431640625], + [30.1607421875, 51.477880859375], + [29.346484375, 51.382568359375], + [29.10205078125, 51.6275390625], + [29.0607421875, 51.625439453125], + [29.0130859375, 51.59892578125], + [28.977734375, 51.57177734375], + [28.9275390625, 51.562158203125], + [28.84951171875, 51.540185546875], + [28.73125, 51.4333984375], + [28.690234375, 51.4388671875], + [28.64775390625, 51.45654296875], + [28.5990234375, 51.542626953125], + [28.53203125, 51.562451171875], + [27.85859375, 51.5923828125], + [27.7, 51.477978515625], + [27.68974609375, 51.572412109375], + [27.2962890625, 51.597412109375], + [27.2701171875, 51.61357421875], + [27.1419921875, 51.75205078125], + [27.07412109375, 51.76083984375], + [26.95283203125, 51.75400390625], + [26.7734375, 51.770703125], + [25.7857421875, 51.923828125], + [24.3619140625, 51.867529296875], + [24.280078125, 51.77470703125], + [24.12685546875, 51.6646484375], + [23.9783203125, 51.59130859375], + [23.951171875, 51.58505859375], + [23.8642578125, 51.623974609375], + [23.79169921875, 51.637109375], + [23.7068359375, 51.64130859375], + [23.61376953125, 51.525390625], + [23.6052734375, 51.517919921875], + [23.65244140625, 52.040380859375], + [23.17509765625, 52.28662109375], + [23.9154296875, 52.770263671875], + [23.48466796875, 53.939794921875], + [23.55908203125, 53.91982421875], + [23.73369140625, 53.912255859375], + [24.19130859375, 53.950439453125], + [24.23662109375, 53.919970703125], + [24.31796875, 53.89296875], + [24.620703125, 53.979833984375], + [24.7681640625, 53.974658203125], + [24.7892578125, 53.9982421875], + [24.82568359375, 54.118994140625], + [24.86953125, 54.145166015625], + [25.04609375, 54.133056640625], + [25.11142578125, 54.154931640625], + [25.1794921875, 54.2142578125], + [25.4611328125, 54.2927734375], + [25.5056640625, 54.26494140625], + [25.52734375, 54.21513671875], + [25.49736328125, 54.175244140625], + [25.573046875, 54.139892578125], + [25.765234375, 54.17978515625], + [25.7025390625, 54.29296875], + [25.61689453125, 54.310107421875], + [25.55751953125, 54.310693359375], + [25.54736328125, 54.3318359375], + [25.567578125, 54.37705078125], + [25.6203125, 54.460400390625], + [25.68515625, 54.535791015625], + [25.7248046875, 54.5642578125], + [25.731640625, 54.590380859375], + [25.7224609375, 54.71787109375], + [25.85927734375, 54.919287109375], + [25.964453125, 54.94716796875], + [26.09296875, 54.9623046875], + [26.1751953125, 55.003271484375], + [26.25078125, 55.12451171875], + [26.291796875, 55.139599609375], + [26.601171875, 55.13017578125], + [26.6484375, 55.20419921875], + [26.77568359375, 55.273095703125], + [26.76015625, 55.293359375], + [26.68125, 55.3064453125], + [26.4953125, 55.318017578125], + [26.4576171875, 55.34248046875], + [26.46953125, 55.371923828125], + [26.51923828125, 55.44814453125], + [26.5666015625, 55.546484375], + [26.5908203125, 55.62265625], + [26.5935546875, 55.667529296875], + [27.0525390625, 55.83056640625], + [27.5767578125, 55.798779296875], + [28.14794921875, 56.142919921875] + ] + ] + }, + "properties": { + "name": "Belarus", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-87.8529296875, 17.4228515625], + [-87.92998046875, 17.2830078125], + [-87.826416015625, 17.5462890625], + [-87.8529296875, 17.4228515625] + ] + ], + [ + [ + [-88.89404296875, 15.890625], + [-89.2328125, 15.888671875], + [-89.161474609375, 17.81484375], + [-89.133544921875, 17.97080078125], + [-88.80634765625, 17.96552734375], + [-88.522998046875, 18.4458984375001], + [-88.2956542968749, 18.472412109375], + [-88.3492675781249, 18.358837890625], + [-88.1302734375, 18.350732421875], + [-88.08525390625, 18.226123046875], + [-88.2717285156249, 17.60986328125], + [-88.203466796875, 17.5166015625], + [-88.313427734375, 16.632763671875], + [-88.89404296875, 15.890625] + ] + ] + ] + }, + "properties": { + "name": "Belize", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-64.7302734375, 32.29345703125], + [-64.862841796875, 32.273876953125], + [-64.668310546875, 32.38193359375], + [-64.7302734375, 32.29345703125] + ] + ] + }, + "properties": { + "name": "Bermuda", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-58.159765625, -20.1646484375], + [-58.18017578125, -19.81787109375], + [-59.09052734375, -19.28623046875], + [-60.007373046875, -19.29755859375], + [-61.7568359375, -19.6453125], + [-62.276318359375, -20.5625], + [-62.27666015625, -21.066015625], + [-62.6509765625, -22.23369140625], + [-62.843359375, -21.997265625], + [-63.9216796875, -22.02861328125], + [-63.976123046875, -22.07255859375], + [-64.26640625, -22.6033203125], + [-64.30791015625, -22.7953125], + [-64.32529296875, -22.82763671875], + [-64.373974609375, -22.76103515625], + [-64.4455078125, -22.5853515625], + [-64.477734375, -22.4853515625], + [-64.5236328125, -22.37158203125], + [-64.605517578125, -22.22880859375], + [-64.992626953125, -22.10966796875], + [-65.518798828125, -22.09453125], + [-65.686181640625, -22.11025390625], + [-65.771044921875, -22.099609375], + [-65.86015625, -22.0197265625], + [-66.05859375, -21.8794921875], + [-66.098583984375, -21.83505859375], + [-66.174658203125, -21.8056640625], + [-66.220166015625, -21.8025390625], + [-66.247607421875, -21.83046875], + [-66.28212890625, -21.9474609375], + [-66.3224609375, -22.053125], + [-66.365185546875, -22.11376953125], + [-66.71171875, -22.21630859375], + [-66.99111328125, -22.50986328125], + [-67.194873046875, -22.8216796875], + [-67.362255859375, -22.85517578125], + [-67.579931640625, -22.89169921875], + [-67.79443359375, -22.8794921875], + [-67.879443359375, -22.82294921875], + [-67.88173828125, -22.493359375], + [-68.18642578125, -21.6185546875], + [-68.197021484375, -21.30029296875], + [-68.558251953125, -20.901953125], + [-68.484326171875, -20.62841796875], + [-68.745166015625, -20.45859375], + [-68.759326171875, -20.11552734375], + [-68.560693359375, -19.96708984375], + [-68.559375, -19.90234375], + [-68.578271484375, -19.85654296875], + [-68.69619140625, -19.74072265625], + [-68.698291015625, -19.72109375], + [-68.57529296875, -19.56015625], + [-68.462890625, -19.4328125], + [-68.470166015625, -19.4099609375], + [-68.4919921875, -19.38193359375], + [-68.857958984375, -19.093359375], + [-68.968310546875, -18.96796875], + [-68.978857421875, -18.81298828125], + [-69.026806640625, -18.65625], + [-69.09228515625, -18.282421875], + [-69.145458984375, -18.14404296875], + [-69.0939453125, -18.05048828125], + [-69.28232421875, -17.96484375], + [-69.31337890625, -17.9431640625], + [-69.5109375, -17.5060546875], + [-69.511083984375, -17.5048828125], + [-69.510986328125, -17.4603515625], + [-69.521923828125, -17.38896484375], + [-69.645703125, -17.24853515625], + [-69.624853515625, -17.2001953125], + [-69.020703125, -16.6421875], + [-69.03291015625, -16.4759765625], + [-68.8427734375, -16.337890625], + [-69.217578125, -16.14912109375], + [-69.4208984375, -15.640625], + [-69.1724609375, -15.23662109375], + [-69.37470703125, -14.96298828125], + [-69.35947265625, -14.7953125], + [-68.8708984375, -14.1697265625], + [-69.07412109375, -13.6828125], + [-68.97861328125, -12.880078125], + [-68.68525390625, -12.501953125], + [-69.57861328125, -10.9517578125], + [-69.228515625, -10.9556640625], + [-68.84833984375, -11.0111328125], + [-68.678369140625, -11.11279296875], + [-68.397998046875, -11.01875], + [-68.0716796875, -10.703125], + [-67.99169921875, -10.6744140625], + [-67.835009765625, -10.66279296875], + [-67.72177734375, -10.68310546875], + [-67.416943359375, -10.38984375], + [-66.575341796875, -9.89990234375], + [-65.396142578125, -9.71240234375], + [-65.298583984375, -10.14677734375], + [-65.3130859375, -10.25302734375], + [-65.395458984375, -10.39228515625], + [-65.4369140625, -10.4490234375], + [-65.447119140625, -10.507421875], + [-65.334033203125, -10.8927734375], + [-65.323779296875, -11.0248046875], + [-65.389892578125, -11.2462890625], + [-65.1857421875, -11.74951171875], + [-64.783447265625, -12.059375], + [-64.4205078125, -12.43974609375], + [-63.68857421875, -12.47802734375], + [-63.3466796875, -12.680078125], + [-63.06748046875, -12.669140625], + [-62.765478515625, -12.997265625], + [-62.118017578125, -13.159765625], + [-62.094775390625, -13.2419921875], + [-61.9447265625, -13.40625], + [-61.87412109375, -13.47041015625], + [-61.78994140625, -13.5255859375], + [-61.57568359375, -13.5248046875], + [-61.511572265625, -13.5412109375], + [-61.416064453125, -13.5265625], + [-61.129150390625, -13.49853515625], + [-61.077001953125, -13.48974609375], + [-60.506591796875, -13.78984375], + [-60.372705078125, -14.41875], + [-60.27333984375, -15.08876953125], + [-60.402001953125, -15.0927734375], + [-60.583203125, -15.09833984375], + [-60.53046875, -15.1431640625], + [-60.38046875, -15.31826171875], + [-60.242333984375, -15.47958984375], + [-60.206640625, -15.901953125], + [-60.18720703125, -16.13212890625], + [-60.1755859375, -16.2693359375], + [-58.537939453125, -16.32822265625], + [-58.49658203125, -16.32666015625], + [-58.423681640625, -16.30791015625], + [-58.375390625, -16.28359375], + [-58.34560546875, -16.284375], + [-58.350390625, -16.4908203125], + [-58.47060546875, -16.6501953125], + [-58.478125, -16.70068359375], + [-58.459814453125, -16.9107421875], + [-58.4173828125, -17.08056640625], + [-58.39599609375, -17.23427734375], + [-58.34775390625, -17.28212890625], + [-57.99091796875, -17.512890625], + [-57.905029296875, -17.53232421875], + [-57.832470703125, -17.512109375], + [-57.7888671875, -17.573046875], + [-57.78017578125, -17.67177734375], + [-57.661669921875, -17.94736328125], + [-57.586474609375, -18.122265625], + [-57.495654296875, -18.2146484375], + [-57.5740234375, -18.279296875], + [-57.725, -18.733203125], + [-57.78310546875, -18.9142578125], + [-57.716796875, -19.04404296875], + [-58.131494140625, -19.74453125], + [-57.8607421875, -19.97958984375], + [-57.88759765625, -20.02041015625], + [-57.96015625, -20.04072265625], + [-58.021142578125, -20.05517578125], + [-58.09375, -20.15107421875], + [-58.159765625, -20.1646484375] + ] + ] + }, + "properties": { + "name": "Bolivia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-48.4858886718749, -27.7669921875], + [-48.55458984375, -27.81220703125], + [-48.5421875, -27.5748046875], + [-48.414892578125, -27.399609375], + [-48.4858886718749, -27.7669921875] + ] + ], + [ + [ + [-48.584423828125, -26.4015625], + [-48.665771484375, -26.2896484375], + [-48.53974609375, -26.1703125], + [-48.584423828125, -26.4015625] + ] + ], + [ + [ + [-45.26025390625, -23.88916015625], + [-45.451416015625, -23.89560546875], + [-45.30234375, -23.7275390625], + [-45.26025390625, -23.88916015625] + ] + ], + [ + [ + [-44.1292968749999, -23.14189453125], + [-44.36015625, -23.1720703125], + [-44.24287109375, -23.07412109375], + [-44.1292968749999, -23.14189453125] + ] + ], + [ + [ + [-38.903564453125, -13.4734375], + [-38.977587890625, -13.52353515625], + [-39.02216796875, -13.44560546875], + [-38.90712890625, -13.40107421875], + [-38.903564453125, -13.4734375] + ] + ], + [ + [ + [-38.74384765625, -13.0970703125], + [-38.668115234375, -12.88017578125], + [-38.601171875, -12.992578125], + [-38.74384765625, -13.0970703125] + ] + ], + [ + [ + [-44.49931640625, -2.93964843749998], + [-44.59775390625, -3.03759765624994], + [-44.4814453125, -2.71757812500003], + [-44.49931640625, -2.93964843749998] + ] + ], + [ + [ + [-44.88310546875, -1.31787109374999], + [-45.020849609375, -1.37236328124997], + [-44.978662109375, -1.26728515624998], + [-44.88310546875, -1.31787109374999] + ] + ], + [ + [ + [-51.83251953125, -1.43378906249997], + [-51.93837890625, -1.45263671874999], + [-51.680029296875, -1.08613281250003], + [-51.546044921875, -0.649609375], + [-51.25400390625, -0.54140625], + [-51.1607421875, -0.666699218750011], + [-51.276318359375, -1.02177734374996], + [-51.83251953125, -1.43378906249997] + ] + ], + [ + [ + [-49.628662109375, -0.229199218749969], + [-49.1169921875, -0.163574218750014], + [-48.39267578125, -0.29736328125], + [-48.83359375, -1.39003906250002], + [-49.0384765625, -1.5140625], + [-49.172705078125, -1.41259765625], + [-49.233984375, -1.59951171874998], + [-49.506640625, -1.51162109375002], + [-49.587890625, -1.71240234374997], + [-49.805126953125, -1.79023437500003], + [-50.06572265625, -1.70380859375], + [-50.5076171875, -1.78798828125001], + [-50.759765625, -1.24023437499997], + [-50.7294921875, -1.12675781249995], + [-50.576953125, -1.103125], + [-50.709619140625, -1.07773437499999], + [-50.79609375, -0.90625], + [-50.6455078125, -0.27285156249998], + [-50.2482421875, -0.11640625], + [-49.628662109375, -0.229199218749969] + ] + ], + [ + [ + [-50.652880859375, -0.131640624999989], + [-50.9263671875, -0.327343749999983], + [-51.0380859374999, -0.225878906250003], + [-50.8421875, -0.050195312500009], + [-50.652880859375, -0.131640624999989] + ] + ], + [ + [ + [-49.443896484375, -0.112402343749977], + [-49.830078125, -0.093896484375023], + [-49.503466796875, 0.083691406250011], + [-49.372314453125, 0.001074218749963], + [-49.443896484375, -0.112402343749977] + ] + ], + [ + [ + [-49.738232421875, 0.26816406250002], + [-49.91708984375, -0.023193359375014], + [-50.339453125, 0.043359375000051], + [-50.27265625, 0.231738281249974], + [-49.738232421875, 0.26816406250002] + ] + ], + [ + [ + [-50.426123046875, 0.139257812500048], + [-50.4439453125, -0.007666015624949], + [-50.62392578125, 0.054394531249983], + [-50.37275390625, 0.590869140625031], + [-50.332275390625, 0.259033203125028], + [-50.426123046875, 0.139257812500048] + ] + ], + [ + [ + [-50.1529296875, 0.393017578125054], + [-50.261328125, 0.359179687500003], + [-50.281689453125, 0.51650390624998], + [-50.058837890625, 0.638037109374963], + [-50.1529296875, 0.393017578125054] + ] + ], + [ + [ + [-50.298974609375, 1.93852539062496], + [-50.456103515625, 1.91049804687503], + [-50.491015625, 2.12861328124997], + [-50.3419921875, 2.14174804687498], + [-50.298974609375, 1.93852539062496] + ] + ], + [ + [ + [-59.69970703125, 4.353515625], + [-59.7385742187499, 4.22675781250003], + [-59.62021484375, 4.02314453125003], + [-59.557763671875, 3.96000976562503], + [-59.551123046875, 3.93354492187497], + [-59.85439453125, 3.5875], + [-59.9943359375, 2.68999023437503], + [-59.8896484375, 2.36293945312501], + [-59.755224609375, 2.27412109375004], + [-59.743505859375, 2.12163085937496], + [-59.7517578125, 1.96240234375003], + [-59.756201171875, 1.90063476562497], + [-59.6666015625, 1.74628906249997], + [-59.535693359375, 1.7], + [-59.2312011718749, 1.37602539062503], + [-58.8217773437499, 1.20122070312503], + [-58.78720703125, 1.20849609375001], + [-58.730322265625, 1.24750976562505], + [-58.684619140625, 1.28105468749996], + [-58.511865234375, 1.28466796874999], + [-58.5060546874999, 1.43867187500001], + [-58.3958007812499, 1.48173828124999], + [-58.38037109375, 1.53022460937501], + [-58.340673828125, 1.58754882812505], + [-58.03466796875, 1.52026367187501], + [-57.9828125, 1.64843750000001], + [-57.8734375, 1.66728515625005], + [-57.795654296875, 1.7], + [-57.59443359375, 1.70410156249999], + [-57.545751953125, 1.72607421875003], + [-57.31748046875, 1.96347656249999], + [-57.2755859375, 1.95922851562501], + [-57.189599609375, 1.98159179687504], + [-57.1188964843749, 2.01396484374997], + [-57.09267578125, 2.005810546875], + [-57.03759765625, 1.936474609375], + [-56.96953125, 1.91640625], + [-56.4828124999999, 1.94213867187499], + [-56.019921875, 1.84223632812498], + [-55.963330078125, 1.85708007812498], + [-55.929638671875, 1.8875], + [-55.921630859375, 1.97666015625001], + [-55.91533203125, 2.03955078125003], + [-55.961962890625, 2.09511718749998], + [-56.020068359375, 2.15815429687504], + [-56.0736328125, 2.23676757812497], + [-56.1376953125, 2.25903320312499], + [-56.12939453125, 2.29951171874997], + [-56.08779296875, 2.34130859375004], + [-56.0451171875, 2.36440429687504], + [-56.020361328125, 2.39277343750005], + [-55.993505859375, 2.49750976562498], + [-55.9755859375, 2.51596679687501], + [-55.957470703125, 2.52045898437504], + [-55.73056640625, 2.40615234375002], + [-55.3853515625, 2.440625], + [-55.343994140625, 2.48876953124997], + [-55.28603515625, 2.49965820312498], + [-55.1876953125, 2.54750976562504], + [-55.114111328125, 2.53920898437504], + [-55.0703124999999, 2.54833984375003], + [-55.005810546875, 2.59296874999998], + [-54.978662109375, 2.59765625000004], + [-54.968408203125, 2.54833984375003], + [-54.9265625, 2.49736328125005], + [-54.87607421875, 2.45039062499997], + [-54.722216796875, 2.44165039062497], + [-54.697412109375, 2.359814453125], + [-54.661865234375, 2.32753906249999], + [-54.616259765625, 2.32675781250001], + [-54.591943359375, 2.31376953125003], + [-54.55048828125, 2.29306640624999], + [-54.515087890625, 2.24545898437496], + [-54.43310546875, 2.20751953125006], + [-54.130078125, 2.12104492187503], + [-53.7677734375, 2.35483398437505], + [-52.903466796875, 2.21152343749998], + [-52.5830078125, 2.52890624999998], + [-52.327880859375, 3.18173828125002], + [-51.6525390625, 4.06127929687497], + [-51.5470703125, 4.31088867187502], + [-51.219921875, 4.09360351562499], + [-50.714404296875, 2.134033203125], + [-50.45888671875, 1.82958984374997], + [-49.95712890625, 1.65986328125004], + [-49.898876953125, 1.16298828124998], + [-50.29443359375, 0.835742187500003], + [-50.755078125, 0.222558593749966], + [-51.28291015625, -0.085205078125028], + [-51.980810546875, -1.36796874999997], + [-52.229248046875, -1.3625], + [-52.66416015625, -1.55175781250003], + [-51.94755859375, -1.58671874999995], + [-50.894921875, -0.937597656249963], + [-50.6900390625, -1.76171874999999], + [-50.40322265625, -2.01552734375001], + [-49.99921875, -1.83183593749997], + [-49.71953125, -1.92636718749996], + [-49.313671875, -1.73173828125], + [-49.6365234375, -2.65693359375003], + [-49.45751953125, -2.50458984374998], + [-49.21103515625, -1.91650390624999], + [-48.99130859375, -1.82978515625], + [-48.710009765625, -1.48769531250002], + [-48.462939453125, -1.61396484375], + [-48.3498046874999, -1.48212890624996], + [-48.46806640625, -1.39384765625], + [-48.4498046875, -1.14550781249994], + [-48.115087890625, -0.7375], + [-47.55732421875, -0.669921874999957], + [-47.41865234375, -0.765917968749974], + [-47.398095703125, -0.626660156250026], + [-45.45859375, -1.35625], + [-45.329150390625, -1.71728515625], + [-45.0763671875, -1.46640624999995], + [-44.721142578125, -1.73349609375001], + [-44.778515625, -1.798828125], + [-44.65126953125, -1.74580078125003], + [-44.53779296875, -2.05273437499994], + [-44.75634765625, -2.26552734374995], + [-44.66240234375, -2.37324218749996], + [-44.43544921875, -2.16806640624999], + [-44.3818359375, -2.36552734374999], + [-44.5201171875, -2.40546875000004], + [-44.589013671875, -2.57343749999998], + [-44.723046875, -3.20478515625], + [-44.437548828125, -2.94443359374998], + [-44.22861328125, -2.47128906249995], + [-44.10556640625, -2.49345703125003], + [-44.19267578125, -2.80957031249994], + [-43.93291015625, -2.58349609374999], + [-43.455126953125, -2.50205078125001], + [-43.380078125, -2.37607421875001], + [-42.93671875, -2.46503906250001], + [-42.249609375, -2.7919921875], + [-41.8761718749999, -2.74658203124999], + [-41.479931640625, -2.91650390624997], + [-40.4745605468749, -2.79560546875003], + [-39.964697265625, -2.86152343749996], + [-38.47578125, -3.71748046875], + [-38.048828125, -4.21640625000003], + [-37.626318359375, -4.59208984375], + [-37.30146484375, -4.71308593749997], + [-37.174658203125, -4.91240234374997], + [-36.59072265625, -5.09755859374995], + [-35.5494140625, -5.12939453124996], + [-35.3925781249999, -5.25087890625001], + [-34.83388671875, -7.02441406250001], + [-34.83466796875, -7.97148437499996], + [-35.340869140625, -9.23066406249998], + [-35.7639648437499, -9.70253906250002], + [-35.8908203124999, -9.68701171874996], + [-35.88544921875, -9.84765625], + [-36.3983398437499, -10.48408203125], + [-36.768310546875, -10.6716796875], + [-37.1828125, -11.06845703125], + [-37.356005859375, -11.40390625], + [-37.359228515625, -11.2525390625], + [-37.688720703125, -12.1], + [-38.01923828125, -12.59130859375], + [-38.4017578125, -12.9662109375], + [-38.690966796875, -12.62392578125], + [-38.8517578125, -12.79013671875], + [-38.763720703125, -12.9072265625], + [-38.835302734375, -13.14716796875], + [-39.030908203125, -13.36513671875], + [-39.08935546875, -13.58818359375], + [-38.988623046875, -13.6150390625], + [-39.04814453125, -14.0439453125], + [-38.942333984375, -14.0306640625], + [-39.0595703125, -14.65478515625], + [-38.880615234375, -15.8642578125], + [-39.202880859375, -17.178125], + [-39.1540039062499, -17.70390625], + [-39.65078125, -18.25234375], + [-39.78330078125, -19.57177734375], + [-40.0013671875, -19.7419921875], + [-40.395947265625, -20.56943359375], + [-40.7892578125, -20.9060546875], + [-40.9545410156249, -21.237890625], + [-41.047265625, -21.5056640625], + [-41.00029296875, -21.9990234375], + [-41.705517578125, -22.30966796875], + [-41.980419921875, -22.5806640625], + [-42.0423828125, -22.9470703125], + [-42.95830078125, -22.96708984375], + [-43.154296875, -22.7251953125], + [-43.224169921875, -22.9912109375], + [-43.898828125, -23.10146484375], + [-43.973828125, -23.05732421875], + [-43.6759765625, -23.00947265625], + [-43.866162109375, -22.910546875], + [-44.637255859375, -23.05546875], + [-44.6738281249999, -23.206640625], + [-44.569677734375, -23.2740234375], + [-45.325390625, -23.59970703125], + [-45.464306640625, -23.8025390625], + [-45.9720703125, -23.7955078125], + [-46.86728515625, -24.236328125], + [-47.98916015625, -25.0357421875], + [-47.92939453125, -25.16826171875], + [-48.202734375, -25.41650390625], + [-48.1859374999999, -25.30986328125], + [-48.402490234375, -25.2720703125], + [-48.476123046875, -25.44296875], + [-48.7317382812499, -25.36875], + [-48.6921875, -25.49150390625], + [-48.401171875, -25.59736328125], + [-48.665771484375, -25.8443359375], + [-48.576318359375, -25.93544921875], + [-48.61943359375, -26.17939453125], + [-48.748291015625, -26.26865234375], + [-48.554150390625, -27.19599609375], + [-48.62080078125, -28.0755859375], + [-48.799658203125, -28.57529296875], + [-49.2712890625, -28.8711914062501], + [-49.74599609375, -29.36318359375], + [-50.29951171875, -30.42578125], + [-50.92138671875, -31.2583984375], + [-52.039208984375, -32.11484375], + [-52.063232421875, -31.83037109375], + [-51.6806640624999, -31.774609375], + [-51.27216796875, -31.476953125], + [-51.16142578125, -31.11884765625], + [-50.980078125, -31.09423828125], + [-50.9408203124999, -30.9037109375], + [-50.689306640625, -30.70419921875], + [-50.7163085937499, -30.4259765625], + [-50.58193359375, -30.4388671875], + [-50.563525390625, -30.25361328125], + [-51.0249511718749, -30.36865234375], + [-51.298046875, -30.03486328125], + [-51.157275390625, -30.3642578125], + [-51.283056640625, -30.7515625], + [-51.35908203125, -30.67451171875], + [-51.506298828125, -31.1044921875], + [-51.9724609375, -31.3837890625], + [-52.1935546875, -31.885546875], + [-52.127392578125, -32.1677734375], + [-52.65224609375, -33.13779296875], + [-53.37060546875, -33.7421875], + [-53.39755859375, -33.7373046875], + [-53.46357421875, -33.70986328125], + [-53.53134765625, -33.65546875], + [-53.53134765625, -33.1708984375], + [-53.511865234375, -33.10869140625], + [-53.4828613281249, -33.0685546875], + [-53.39521484375, -33.0103515625], + [-53.310107421875, -32.92705078125], + [-53.2140625, -32.82109375], + [-53.1255859375, -32.73671875], + [-53.157275390625, -32.680078125], + [-53.601708984375, -32.40302734375], + [-53.76171875, -32.0568359375], + [-53.9206054687499, -31.95234375], + [-54.220556640625, -31.85517578125], + [-54.587646484375, -31.48515625], + [-55.03603515625, -31.27900390625], + [-55.091162109375, -31.31396484375], + [-55.1735351562499, -31.27958984375], + [-55.55732421875, -30.8759765625], + [-55.60302734375, -30.85078125], + [-55.6271484375, -30.85810546875], + [-55.65048828125, -30.89208984375], + [-55.665234375, -30.92490234375], + [-55.807763671875, -31.03671875], + [-55.873681640625, -31.06962890625], + [-55.952001953125, -31.080859375], + [-56.0046875, -31.07919921875], + [-56.01845703125, -30.99189453125], + [-55.998974609375, -30.83720703125], + [-56.4072265625, -30.4474609375], + [-56.83271484375, -30.1072265625], + [-57.1205078125, -30.14443359375], + [-57.214453125, -30.2833984375], + [-57.552294921875, -30.26123046875], + [-57.60888671875, -30.18779296875], + [-57.5638671875, -30.13994140625], + [-57.405224609375, -30.03388671875], + [-57.224658203125, -29.78212890625], + [-56.938623046875, -29.59482421875], + [-55.89052734375, -28.37001953125], + [-55.687255859375, -28.381640625], + [-55.72548828125, -28.2041015625], + [-55.101513671875, -27.866796875], + [-54.8291015625, -27.5505859375], + [-54.327001953125, -27.42353515625], + [-53.83818359375, -27.12109375], + [-53.6685546875, -26.28818359375], + [-53.891162109375, -25.66884765625], + [-54.15458984375, -25.523046875], + [-54.4439453125, -25.625], + [-54.615869140625, -25.57607421875], + [-54.610546875, -25.43271484375], + [-54.47314453125, -25.22021484375], + [-54.43623046875, -25.1212890625], + [-54.281005859375, -24.3060546875], + [-54.3182617187499, -24.128125], + [-54.26689453125, -24.0658203125], + [-54.241796875, -24.047265625], + [-54.440234375, -23.9017578125], + [-54.62548828125, -23.8125], + [-54.9826660156249, -23.97451171875], + [-55.081884765625, -23.99765625], + [-55.1943359375, -24.01748046875], + [-55.2869140624999, -24.004296875], + [-55.36630859375, -23.991015625], + [-55.41591796875, -23.9513671875], + [-55.4423828125, -23.86533203125], + [-55.4423828125, -23.792578125], + [-55.45888671875, -23.6867187500001], + [-55.5184570312499, -23.62724609375], + [-55.53828125, -23.58095703125], + [-55.61767578125, -22.671484375], + [-55.746630859375, -22.5126953125], + [-55.753271484375, -22.41015625], + [-55.849169921875, -22.3076171875], + [-55.9914062499999, -22.2811523437501], + [-56.1898437499999, -22.2811523437501], + [-56.2460449218749, -22.2646484375], + [-56.394873046875, -22.09267578125], + [-56.447802734375, -22.076171875], + [-56.7751953125, -22.261328125], + [-57.955908203125, -22.1091796875], + [-57.94267578125, -21.79833984375], + [-57.830224609375, -20.99794921875], + [-57.91513671875, -20.69033203125], + [-57.9790527343749, -20.65732421875], + [-58.00224609375, -20.4654296875], + [-58.025390625, -20.4158203125], + [-58.058447265625, -20.3861328125], + [-58.0915039062499, -20.333203125], + [-58.124609375, -20.29345703125], + [-58.13779296875, -20.2373046875], + [-58.159765625, -20.1646484375], + [-58.09375, -20.15107421875], + [-58.021142578125, -20.05517578125], + [-57.96015625, -20.04072265625], + [-57.88759765625, -20.02041015625], + [-57.8607421875, -19.97958984375], + [-58.029931640625, -19.83271484375], + [-58.131494140625, -19.74453125], + [-57.716796875, -19.04404296875], + [-57.730859375, -18.9171875], + [-57.78310546875, -18.9142578125], + [-57.725, -18.733203125], + [-57.5740234374999, -18.279296875], + [-57.495654296875, -18.2146484375], + [-57.586474609375, -18.122265625], + [-57.6616699218749, -17.94736328125], + [-57.78017578125, -17.67177734375], + [-57.7888671875, -17.573046875], + [-57.832470703125, -17.512109375], + [-57.905029296875, -17.53232421875], + [-57.99091796875, -17.512890625], + [-58.20556640625, -17.3630859375], + [-58.34775390625, -17.28212890625], + [-58.39599609375, -17.23427734375], + [-58.4173828125, -17.08056640625], + [-58.459814453125, -16.9107421875], + [-58.478125, -16.70068359375], + [-58.47060546875, -16.6501953125], + [-58.350390625, -16.4908203125], + [-58.34560546875, -16.284375], + [-58.375390625, -16.28359375], + [-58.423681640625, -16.30791015625], + [-58.4965820312499, -16.32666015625], + [-58.537939453125, -16.32822265625], + [-60.1755859375, -16.2693359375], + [-60.18720703125, -16.13212890625], + [-60.206640625, -15.901953125], + [-60.242333984375, -15.47958984375], + [-60.38046875, -15.31826171875], + [-60.53046875, -15.1431640625], + [-60.583203125, -15.09833984375], + [-60.27333984375, -15.08876953125], + [-60.372705078125, -14.41875], + [-60.506591796875, -13.78984375], + [-61.077001953125, -13.48974609375], + [-61.129150390625, -13.49853515625], + [-61.416064453125, -13.5265625], + [-61.511572265625, -13.5412109375], + [-61.78994140625, -13.5255859375], + [-61.87412109375, -13.47041015625], + [-61.9447265625, -13.40625], + [-62.094775390625, -13.2419921875], + [-62.118017578125, -13.159765625], + [-62.765478515625, -12.997265625], + [-63.015185546875, -12.80556640625], + [-63.06748046875, -12.669140625], + [-63.3466796874999, -12.680078125], + [-63.68857421875, -12.47802734375], + [-64.4205078125, -12.43974609375], + [-64.783447265625, -12.059375], + [-65.1857421875, -11.74951171875], + [-65.389892578125, -11.2462890625], + [-65.334033203125, -10.8927734375], + [-65.447119140625, -10.507421875], + [-65.4369140625, -10.4490234374999], + [-65.395458984375, -10.39228515625], + [-65.3130859375, -10.25302734375], + [-65.298583984375, -10.14677734375], + [-65.3961425781249, -9.71240234374999], + [-66.575341796875, -9.89990234374999], + [-67.416943359375, -10.38984375], + [-67.72177734375, -10.6831054687499], + [-67.835009765625, -10.66279296875], + [-67.99169921875, -10.6744140624999], + [-68.0716796874999, -10.703125], + [-68.397998046875, -11.01875], + [-68.678369140625, -11.11279296875], + [-68.84833984375, -11.0111328125], + [-69.228515625, -10.9556640625], + [-69.462548828125, -10.94814453125], + [-69.57861328125, -10.9517578125], + [-69.6740234375, -10.9541015625], + [-69.839794921875, -10.9333984375], + [-69.9603515625, -10.9298828125], + [-70.06630859375, -10.982421875], + [-70.220068359375, -11.04765625], + [-70.290380859375, -11.0642578125], + [-70.3419921875, -11.06669921875], + [-70.39228515625, -11.05859375], + [-70.45087890625, -11.0248046875], + [-70.533251953125, -10.946875], + [-70.596533203125, -10.97685546875], + [-70.642333984375, -11.01025390625], + [-70.599169921875, -9.62050781250001], + [-70.54111328125, -9.4375], + [-70.60791015625, -9.46367187500003], + [-70.6369140625, -9.47822265624997], + [-71.041748046875, -9.81875], + [-71.115283203125, -9.85244140625001], + [-71.339404296875, -9.98857421875003], + [-72.181591796875, -10.0037109375], + [-72.379052734375, -9.51015625], + [-73.2094238281249, -9.41142578124995], + [-73.08984375, -9.26572265625002], + [-72.970361328125, -9.12011718750003], + [-72.9740234375, -8.9931640625], + [-73.0705078125, -8.8828125], + [-73.203125, -8.71933593749999], + [-73.30244140625, -8.65400390625001], + [-73.360400390625, -8.47929687500003], + [-73.39814453125, -8.45898437499999], + [-73.5491210937499, -8.34580078125002], + [-73.73203125, -7.875390625], + [-73.7204101562499, -7.78251953125002], + [-73.76689453125, -7.75351562499996], + [-73.8220703125, -7.73896484375003], + [-73.89462890625, -7.65478515625001], + [-73.946875, -7.61123046875002], + [-73.98173828125, -7.58505859375002], + [-74.00205078125, -7.55605468749997], + [-73.98173828125, -7.53574218750001], + [-73.9584960937499, -7.50664062500003], + [-73.964306640625, -7.37890625000003], + [-73.749462890625, -7.33535156250004], + [-73.7204101562499, -7.30927734374997], + [-73.758203125, -7.17275390624995], + [-73.793017578125, -7.13505859375], + [-73.75810546875, -6.90576171875], + [-73.137353515625, -6.4658203125], + [-73.235546875, -6.09843750000002], + [-73.209375, -6.02871093750002], + [-73.162890625, -5.93339843749997], + [-72.9798828125, -5.63486328124999], + [-72.887060546875, -5.12275390625003], + [-72.8319335937499, -5.09375], + [-72.69873046875, -5.06718749999999], + [-72.608349609375, -5.00957031249997], + [-72.468994140625, -4.90126953125002], + [-72.3528320312499, -4.78603515624999], + [-72.256787109375, -4.74892578124998], + [-71.8447265625, -4.50439453124999], + [-70.973681640625, -4.35048828124999], + [-70.866015625, -4.22958984374996], + [-70.79951171875, -4.17333984374996], + [-70.72158203125, -4.15888671875004], + [-70.5306640625, -4.16757812500003], + [-70.404638671875, -4.15009765625003], + [-70.34365234375, -4.19365234375002], + [-70.3168945312499, -4.24697265625004], + [-70.23916015625, -4.30117187499998], + [-70.12880859375, -4.28662109374994], + [-70.0533203125, -4.33310546875001], + [-70.003955078125, -4.32724609374996], + [-69.972021484375, -4.30117187499998], + [-69.96591796875, -4.2359375], + [-69.948193359375, -4.20058593750001], + [-69.66904296875, -2.66767578125], + [-69.400244140625, -1.19492187499998], + [-69.633984375, -0.50927734375], + [-70.0705078124999, -0.13886718750004], + [-70.0539062499999, 0.578613281250028], + [-69.472119140625, 0.72993164062504], + [-69.1533203124999, 0.65878906250002], + [-69.31181640625, 1.05048828124997], + [-69.8521484375, 1.05952148437504], + [-69.8485839843749, 1.70874023437504], + [-68.1765625, 1.71982421874999], + [-68.25595703125, 1.84550781250002], + [-68.193798828125, 1.98701171874998], + [-67.93623046875, 1.74848632812497], + [-67.400439453125, 2.11669921875003], + [-67.11923828125, 1.70361328124999], + [-67.082275390625, 1.18540039062501], + [-66.876025390625, 1.22304687500004], + [-66.347119140625, 0.7671875], + [-66.06005859375, 0.78535156250004], + [-65.6814453125, 0.983447265624989], + [-65.5229980468749, 0.843408203124966], + [-65.5560546875, 0.687988281250014], + [-65.473388671875, 0.691259765624977], + [-65.103759765625, 1.10810546874998], + [-64.2050292968749, 1.52949218750004], + [-64.00849609375, 1.93159179687497], + [-63.4325195312499, 2.15556640625005], + [-63.3892578125, 2.41191406250005], + [-64.04658203125, 2.502392578125], + [-64.22109375, 3.58740234374997], + [-64.668994140625, 4.01181640625002], + [-64.788671875, 4.27602539062502], + [-64.5763671875, 4.139892578125], + [-64.19248046875, 4.12685546875001], + [-64.021484375, 3.92910156250005], + [-63.338671875, 3.94389648437505], + [-62.856982421875, 3.59345703124997], + [-62.712109375, 4.01791992187502], + [-62.4106445312499, 4.15673828124997], + [-62.153125, 4.09838867187499], + [-61.820849609375, 4.197021484375], + [-61.280078125, 4.51689453124997], + [-61.00283203125, 4.53525390624999], + [-60.603857421875, 4.94936523437498], + [-60.67197265625, 5.16435546874999], + [-60.711962890625, 5.19155273437502], + [-60.7421386718749, 5.20205078125004], + [-60.6513671875, 5.22114257812501], + [-60.459521484375, 5.18808593750003], + [-60.4087890625, 5.21015625], + [-60.335205078125, 5.19931640625001], + [-60.2416503906249, 5.25795898437497], + [-60.142041015625, 5.23881835937497], + [-59.990673828125, 5.08286132812499], + [-60.1486328125, 4.53325195312503], + [-59.69970703125, 4.353515625] + ] + ] + ] + }, + "properties": { + "name": "Brazil", + "childNum": 17 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-59.493310546875, 13.081982421875], + [-59.611328125, 13.102099609375], + [-59.6466796875, 13.303125], + [-59.42763671875, 13.152783203125], + [-59.493310546875, 13.081982421875] + ] + ] + }, + "properties": { + "name": "Barbados", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [115.0267578125, 4.89970703124999], + [115.1400390625, 4.89975585937499], + [115.290625, 4.35258789062499], + [115.10703125, 4.39042968749997], + [115.0267578125, 4.89970703124999] + ] + ], + [ + [ + [115.0267578125, 4.89970703124999], + [114.7466796875, 4.71806640625002], + [114.840234375, 4.39321289062501], + [114.6541015625, 4.03764648437505], + [114.0638671875, 4.59267578124997], + [114.4244140625, 4.660400390625], + [114.99541015625, 5.02236328125002], + [115.0267578125, 4.89970703124999] + ] + ] + ] + }, + "properties": { + "name": "Brunei", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [91.63193359375, 27.7599609375], + [91.5947265625, 27.557666015625], + [91.74306640625, 27.442529296875], + [91.85126953125, 27.438623046875], + [91.9509765625, 27.45830078125], + [91.9908203125, 27.4501953125], + [92.044921875, 27.364697265625], + [92.0833984375, 27.290625], + [92.03115234375, 27.214306640625], + [92.0025390625, 27.14736328125], + [91.99228515625, 27.09990234375], + [91.9986328125, 27.079296875], + [92.030859375, 27.0408203125], + [92.0681640625, 26.9751953125], + [92.0734375, 26.91484375], + [92.04970703125, 26.874853515625], + [91.99833984375, 26.85498046875], + [91.84208984375, 26.852978515625], + [91.67158203125, 26.802001953125], + [91.517578125, 26.80732421875], + [91.455859375, 26.86689453125], + [91.4267578125, 26.86708984375], + [91.2865234375, 26.78994140625], + [90.7396484375, 26.7716796875], + [90.3458984375, 26.89033203125], + [90.2060546875, 26.847509765625], + [90.12294921875, 26.75458984375], + [89.9431640625, 26.72392578125], + [89.7638671875, 26.7015625], + [89.6099609375, 26.71943359375], + [89.5861328125, 26.778955078125], + [89.33212890625, 26.8486328125], + [89.1482421875, 26.816162109375], + [89.04091796875, 26.8650390625], + [88.8576171875, 26.961474609375], + [88.73876953125, 27.1755859375], + [88.7603515625, 27.218115234375], + [88.881640625, 27.2974609375], + [88.89140625, 27.316064453125], + [88.94755859375, 27.464013671875], + [89.4806640625, 28.0599609375], + [89.5369140625, 28.107421875], + [89.652734375, 28.15830078125], + [89.7498046875, 28.18818359375], + [89.81689453125, 28.256298828125], + [89.8978515625, 28.294140625], + [89.9810546875, 28.311181640625], + [90.3482421875, 28.2439453125], + [90.36298828125, 28.21650390625], + [90.33310546875, 28.093994140625], + [90.352734375, 28.080224609375], + [90.47734375, 28.070849609375], + [90.630078125, 28.078564453125], + [90.71572265625, 28.071728515625], + [91.02080078125, 27.970068359375], + [91.077734375, 27.974462890625], + [91.22587890625, 28.071240234375], + [91.273046875, 28.078369140625], + [91.3068359375, 28.064013671875], + [91.367578125, 28.021630859375], + [91.64189453125, 27.9232421875], + [91.63193359375, 27.7599609375] + ] + ] + }, + "properties": { + "name": "Bhutan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [25.2587890625, -17.7935546875], + [25.24228515625, -17.96904296875], + [25.93935546875, -18.938671875], + [26.16806640625, -19.53828125], + [27.17822265625, -20.1009765625], + [27.28076171875, -20.4787109375], + [27.679296875, -20.50302734375], + [27.66943359375, -21.0642578125], + [28.0140625, -21.55419921875], + [29.0255859375, -21.796875], + [29.0423828125, -22.018359375], + [29.23720703125, -22.0794921875], + [29.315234375, -22.15771484375], + [29.36484375, -22.1939453125], + [29.1298828125, -22.21328125], + [29.0134765625, -22.27841796875], + [28.94580078125, -22.3951171875], + [28.83984375, -22.480859375], + [28.21015625, -22.69365234375], + [27.81259765625, -23.1080078125], + [27.7685546875, -23.14892578125], + [27.085546875, -23.5779296875], + [26.83505859375, -24.2408203125], + [26.6177734375, -24.3955078125], + [26.4517578125, -24.58271484375], + [26.39716796875, -24.61357421875], + [26.130859375, -24.671484375], + [26.0318359375, -24.70244140625], + [25.912109375, -24.7474609375], + [25.5181640625, -25.66279296875], + [25.21337890625, -25.75625], + [24.33056640625, -25.74287109375], + [24.19296875, -25.63291015625], + [23.96953125, -25.62607421875], + [23.89375, -25.60087890625], + [23.3892578125, -25.29140625], + [23.14873046875, -25.288671875], + [22.87880859375, -25.45791015625], + [22.59765625, -26.13271484375], + [22.5486328125, -26.17841796875], + [22.4708984375, -26.21904296875], + [22.217578125, -26.3888671875], + [22.09091796875, -26.58017578125], + [22.0109375, -26.63583984375], + [21.78828125, -26.71005859375], + [21.7380859375, -26.8068359375], + [21.6947265625, -26.84091796875], + [20.73984375, -26.848828125], + [20.64140625, -26.7421875], + [20.7931640625, -25.915625], + [20.4306640625, -25.1470703125], + [19.98046875, -24.7767578125], + [19.97734375, -22.0001953125], + [20.9794921875, -21.9619140625], + [20.97412109375, -18.31884765625], + [23.2193359375, -17.99970703125], + [23.59970703125, -18.4599609375], + [24.2439453125, -18.0234375], + [24.53056640625, -18.052734375], + [24.90908203125, -17.82138671875], + [25.2587890625, -17.7935546875] + ] + ] + }, + "properties": { + "name": "Botswana", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.86005859375, 10.919677734375], + [23.6462890625, 9.82290039062499], + [23.62265625, 9.340625], + [23.46826171875, 9.11474609375], + [23.5373046875, 8.81582031249999], + [24.14736328125, 8.665625], + [24.29140625, 8.29140625], + [24.8533203125, 8.13754882812499], + [25.200390625, 7.80791015624999], + [25.18134765625, 7.55722656249999], + [25.27890625, 7.427490234375], + [26.36181640625, 6.63530273437499], + [26.30859375, 6.455322265625], + [26.5142578125, 6.06923828124999], + [27.1439453125, 5.72294921874999], + [27.4033203125, 5.10917968749999], + [27.071875, 5.19975585937499], + [26.8220703125, 5.06240234374999], + [25.52509765625, 5.31210937499999], + [25.065234375, 4.96743164062499], + [24.31982421875, 4.994140625], + [23.4171875, 4.66313476562499], + [22.86455078125, 4.723876953125], + [22.42216796875, 4.1349609375], + [20.55810546875, 4.46269531249999], + [20.2263671875, 4.82963867187499], + [19.80654296875, 5.089306640625], + [19.5009765625, 5.12749023437499], + [19.0685546875, 4.89140624999999], + [18.594140625, 4.34624023437499], + [18.6103515625, 3.47841796874999], + [18.4744140625, 3.622998046875], + [18.1609375, 3.49980468749999], + [17.4916015625, 3.68730468749999], + [16.6107421875, 3.50537109375], + [16.4685546875, 2.83173828125], + [16.1833984375, 2.27006835937499], + [16.0634765625, 2.90859375], + [15.1287109375, 3.826904296875], + [15.06357421875, 4.28486328125], + [14.73125, 4.60239257812499], + [14.56298828125, 5.27993164062499], + [14.61689453125, 5.86513671874999], + [14.43115234375, 6.03872070312499], + [14.7392578125, 6.27978515625], + [15.20673828125, 7.20615234374999], + [15.480078125, 7.52377929687499], + [15.9576171875, 7.507568359375], + [16.37890625, 7.683544921875], + [16.5453125, 7.865478515625], + [16.784765625, 7.5509765625], + [17.6494140625, 7.98359375], + [18.56416015625, 8.0458984375], + [19.10869140625, 8.65615234374999], + [18.88603515625, 8.83603515624999], + [18.95625, 8.93886718749999], + [20.34208984375, 9.12709960937499], + [20.7732421875, 9.40566406249999], + [21.68271484375, 10.28984375], + [21.771484375, 10.642822265625], + [22.49384765625, 10.996240234375], + [22.86005859375, 10.919677734375] + ] + ] + }, + "properties": { + "name": "Central African Republic", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-59.78759765625, 43.939599609375], + [-60.11748046875, 43.9533691406251], + [-59.7271484375, 44.00283203125], + [-59.78759765625, 43.939599609375] + ] + ], + [ + [ + [-66.7625, 44.681787109375], + [-66.8970703125, 44.62890625], + [-66.8021484374999, 44.80537109375], + [-66.7625, 44.681787109375] + ] + ], + [ + [ + [-60.961572265625, 45.48994140625], + [-61.0817382812499, 45.5578125], + [-60.912451171875, 45.5672851562501], + [-60.961572265625, 45.48994140625] + ] + ], + [ + [ + [-73.6953125, 45.585498046875], + [-73.85771484375, 45.573583984375], + [-73.57236328125, 45.694482421875], + [-73.6953125, 45.585498046875] + ] + ], + [ + [ + [-73.56650390625, 45.469091796875], + [-73.960546875, 45.44140625], + [-73.687451171875, 45.56142578125], + [-73.47607421875, 45.704736328125], + [-73.56650390625, 45.469091796875] + ] + ], + [ + [ + [-61.10517578125, 45.9447265625], + [-60.865234375, 45.98349609375], + [-61.059033203125, 45.703369140625], + [-60.737890625, 45.751416015625], + [-60.4605957031249, 45.968701171875], + [-60.73330078125, 45.956591796875], + [-60.29794921875, 46.31123046875], + [-60.2264648437499, 46.1955566406251], + [-59.8650390624999, 46.159521484375], + [-59.8421875, 45.941552734375], + [-60.67294921875, 45.5908203125001], + [-61.2836914062499, 45.573876953125], + [-61.4498046875, 45.7162109375], + [-61.408642578125, 46.170361328125], + [-60.870166015625, 46.79677734375], + [-60.408203125, 47.003515625], + [-60.33291015625, 46.73701171875], + [-60.49453125, 46.270263671875], + [-61.10517578125, 45.9447265625] + ] + ], + [ + [ + [-63.811279296875, 46.468701171875], + [-63.6814453124999, 46.5619140625], + [-63.12939453125, 46.422216796875], + [-62.02373046875, 46.42158203125], + [-62.52607421875, 46.202880859375], + [-62.53134765625, 45.977294921875], + [-63.0220703125, 46.0666015625], + [-62.89453125, 46.123583984375], + [-63.05634765625, 46.22392578125], + [-62.978466796875, 46.316357421875], + [-63.2134765625, 46.15986328125], + [-63.641015625, 46.23046875], + [-63.758642578125, 46.397607421875], + [-64.11083984375, 46.425439453125], + [-64.13603515625, 46.5997070312501], + [-64.388037109375, 46.640869140625], + [-63.9935546875, 47.061572265625], + [-64.087890625, 46.775439453125], + [-63.811279296875, 46.468701171875] + ] + ], + [ + [ + [-61.914111328125, 47.284521484375], + [-61.77255859375, 47.259814453125], + [-62.0083007812499, 47.23427734375], + [-61.92470703125, 47.425146484375], + [-61.3955078125, 47.637646484375], + [-61.914111328125, 47.284521484375] + ] + ], + [ + [ + [-54.2271484375, 47.441357421875], + [-54.3259765625, 47.40810546875], + [-54.1281738281249, 47.646826171875], + [-54.2271484375, 47.441357421875] + ] + ], + [ + [ + [-74.70888671875, 45.0038574218751], + [-73.55810546875, 45.42509765625], + [-73.1595703125, 46.01005859375], + [-72.10927734375, 46.551220703125], + [-71.261181640625, 46.75625], + [-70.519482421875, 47.03251953125], + [-69.471044921875, 47.9672851562501], + [-68.2381835937499, 48.626416015625], + [-66.1781738281249, 49.213134765625], + [-64.8363281249999, 49.191748046875], + [-64.2162109375, 48.8736328125], + [-64.5137207031249, 48.84111328125], + [-64.2460937499999, 48.69111328125], + [-64.348828125, 48.423193359375], + [-65.259423828125, 48.021240234375], + [-65.926708984375, 48.1888671875], + [-66.70439453125, 48.0224609375], + [-66.3596191406249, 48.0606445312501], + [-65.8494140625, 47.9110351562501], + [-65.6072265625, 47.6700195312501], + [-65.00166015625, 47.846826171875], + [-64.70322265625, 47.724853515625], + [-64.91220703125, 47.36865234375], + [-65.318896484375, 47.101220703125], + [-64.831396484375, 47.060791015625], + [-64.8825195312499, 46.8228515625], + [-64.54150390625, 46.24033203125], + [-63.91591796875, 46.1658203125], + [-63.83193359375, 46.107177734375], + [-64.056396484375, 46.021337890625], + [-63.7028808593749, 45.8580078125], + [-62.70068359375, 45.740576171875], + [-62.75009765625, 45.6482421875], + [-62.483056640625, 45.6218261718751], + [-61.955517578125, 45.8681640625], + [-61.776513671875, 45.655615234375], + [-61.49228515625, 45.68701171875], + [-61.35048828125, 45.573681640625], + [-61.2819824218749, 45.441064453125], + [-61.460986328125, 45.36669921875], + [-61.03154296875, 45.2917480468751], + [-63.306298828125, 44.642578125], + [-63.60400390625, 44.6832031250001], + [-63.609765625, 44.4799804687501], + [-63.9997070312499, 44.644921875], + [-64.1008789062499, 44.487451171875], + [-64.1669921875, 44.586669921875], + [-64.2860839843749, 44.550341796875], + [-64.2756835937499, 44.33408203125], + [-65.481689453125, 43.51806640625], + [-65.738134765625, 43.5607421875], + [-65.8869140625, 43.79521484375], + [-66.125732421875, 43.813818359375], + [-66.19306640625, 44.14384765625], + [-65.868017578125, 44.568798828125], + [-66.14638671875, 44.4359375000001], + [-66.090625, 44.504931640625], + [-64.44814453125, 45.337451171875], + [-64.135498046875, 45.023046875], + [-64.0931640625, 45.21708984375], + [-63.368017578125, 45.364794921875], + [-64.87314453125, 45.3545898437501], + [-64.3146484375, 45.835693359375], + [-64.4822265625, 45.80634765625], + [-64.63271484375, 45.9466308593751], + [-64.778515625, 45.638427734375], + [-65.88447265625, 45.2229003906251], + [-66.109765625, 45.3166015625], + [-66.0265625, 45.417578125], + [-66.4398437499999, 45.0958984375], + [-66.8724609375, 45.06728515625], + [-67.124853515625, 45.16943359375], + [-67.366943359375, 45.173779296875], + [-67.432666015625, 45.603125], + [-67.8022460937499, 45.7275390625], + [-67.806787109375, 47.0828125], + [-68.235498046875, 47.345947265625], + [-68.93720703125, 47.21123046875], + [-69.0501953125, 47.426611328125], + [-69.24287109375, 47.46298828125], + [-70.00771484375, 46.708935546875], + [-70.296240234375, 45.9061035156251], + [-70.8650390625, 45.270703125], + [-71.327294921875, 45.290087890625], + [-71.517529296875, 45.007568359375], + [-74.663232421875, 45.00390625], + [-74.70888671875, 45.0038574218751] + ] + ], + [ + [ + [-126.09208984375, 49.35400390625], + [-126.064013671875, 49.263623046875], + [-126.229638671875, 49.2956542968751], + [-126.09208984375, 49.35400390625] + ] + ], + [ + [ + [-54.55439453125, 49.5888671875], + [-54.7865234375, 49.496142578125], + [-54.86357421875, 49.57607421875], + [-54.55439453125, 49.5888671875] + ] + ], + [ + [ + [-54.093701171875, 49.74443359375], + [-53.9806640625, 49.661962890625], + [-54.2861328125, 49.595361328125], + [-54.27763671875, 49.711474609375], + [-54.093701171875, 49.74443359375] + ] + ], + [ + [ + [-126.6412109375, 49.605810546875], + [-126.93857421875, 49.71845703125], + [-126.925830078125, 49.837744140625], + [-126.738134765625, 49.8436523437501], + [-126.6412109375, 49.605810546875] + ] + ], + [ + [ + [-61.801123046875, 49.093896484375], + [-63.0415039062499, 49.224951171875], + [-64.485205078125, 49.886962890625], + [-64.1314453125, 49.941650390625], + [-62.858544921875, 49.7054687500001], + [-61.817138671875, 49.283544921875], + [-61.696142578125, 49.139013671875], + [-61.801123046875, 49.093896484375] + ] + ], + [ + [ + [-125.184130859375, 50.097119140625], + [-125.301171875, 50.4140625], + [-125.0740234375, 50.220654296875], + [-125.184130859375, 50.097119140625] + ] + ], + [ + [ + [-127.197314453125, 50.640380859375], + [-125.482080078125, 50.316796875], + [-124.830615234375, 49.530078125], + [-123.99580078125, 49.2240234375], + [-123.497021484375, 48.582080078125], + [-123.389892578125, 48.67021484375], + [-123.31064453125, 48.41103515625], + [-123.57314453125, 48.322802734375], + [-123.916943359375, 48.386572265625], + [-125.120703125, 48.760791015625], + [-124.849658203125, 49.028271484375], + [-124.812646484375, 49.212646484375], + [-124.92734375, 49.014208984375], + [-125.489453125, 48.9337890625], + [-125.828515625, 49.091845703125], + [-125.64423828125, 49.1857910156251], + [-125.95166015625, 49.248046875], + [-125.935400390625, 49.40146484375], + [-126.519140625, 49.39677734375], + [-126.54189453125, 49.590478515625], + [-126.13408203125, 49.672314453125], + [-126.525244140625, 49.719580078125], + [-126.9033203125, 49.944140625], + [-127.114306640625, 49.879736328125], + [-127.2498046875, 50.13798828125], + [-127.3494140625, 50.051953125], + [-127.467138671875, 50.163427734375], + [-127.863916015625, 50.127734375], + [-127.905859375, 50.44521484375], + [-127.4865234375, 50.404638671875], + [-127.46591796875, 50.5831054687501], + [-128.058349609375, 50.498486328125], + [-128.346044921875, 50.74423828125], + [-127.91806640625, 50.860546875], + [-127.197314453125, 50.640380859375] + ] + ], + [ + [ + [-55.4587402343749, 51.5365234375001], + [-55.5833984374999, 51.38857421875], + [-56.031103515625, 51.328369140625], + [-55.8, 51.03330078125], + [-56.73232421875, 50.00771484375], + [-56.82216796875, 49.6134765625], + [-56.17939453125, 50.114990234375], + [-56.161279296875, 49.94013671875], + [-55.5029296875, 49.983154296875], + [-56.140185546875, 49.6191406250001], + [-55.86982421875, 49.6701660156251], + [-56.0873046875, 49.451953125], + [-55.375927734375, 49.48974609375], + [-55.34384765625, 49.3729003906251], + [-55.229541015625, 49.508154296875], + [-55.353173828125, 49.0794433593751], + [-54.502197265625, 49.52734375], + [-54.4482421875, 49.329443359375], + [-53.95771484375, 49.441845703125], + [-53.61943359375, 49.321630859375], + [-53.5734375, 49.1412109375], + [-54.1612792968749, 48.7876953125], + [-53.852880859375, 48.811328125], + [-53.966015625, 48.7066894531251], + [-53.70634765625, 48.655517578125], + [-54.114453125, 48.393603515625], + [-53.027587890625, 48.634716796875], + [-53.1357421875, 48.40185546875], + [-53.609765625, 48.20771484375], + [-53.56943359375, 48.0880859375], + [-53.8695800781249, 48.019677734375], + [-53.638232421875, 48.0146484375], + [-53.863671875, 47.78701171875], + [-53.67236328125, 47.6482421875], + [-53.28271484375, 47.9978515625], + [-52.8660156249999, 48.11298828125], + [-53.16982421875, 47.5121093750001], + [-52.94501953125, 47.55283203125], + [-52.782421875, 47.76943359375], + [-52.653662109375, 47.5494140625], + [-53.11484375, 46.655810546875], + [-53.323046875, 46.718359375], + [-53.589794921875, 46.6388671875], + [-53.59736328125, 47.14599609375], + [-54.0095703124999, 46.839599609375], + [-54.17373046875, 46.88037109375], + [-53.84951171875, 47.44033203125], + [-53.989013671875, 47.756201171875], + [-54.191845703125, 47.859814453125], + [-54.488134765625, 47.403857421875], + [-54.47392578125, 47.5470703125], + [-54.856640625, 47.385009765625], + [-55.3157226562499, 46.905712890625], + [-55.788525390625, 46.867236328125], + [-55.91923828125, 47.01689453125], + [-55.49150390625, 47.16064453125], + [-54.784619140625, 47.66474609375], + [-55.36630859375, 47.661083984375], + [-55.576123046875, 47.465234375], + [-56.12724609375, 47.50283203125], + [-55.86708984375, 47.592333984375], + [-55.85791015625, 47.819189453125], + [-56.77412109375, 47.564990234375], + [-58.336865234375, 47.730859375], + [-59.1169433593749, 47.570703125], + [-59.320654296875, 47.7369140625], + [-59.2720703125, 47.995556640625], + [-58.330224609375, 48.522119140625], + [-59.16767578125, 48.55849609375], + [-58.841796875, 48.746435546875], + [-58.9064453125, 48.6501953125], + [-58.716455078125, 48.598046875], + [-58.403662109375, 49.084326171875], + [-57.99052734375, 48.987939453125], + [-58.0989257812499, 49.07744140625], + [-57.980078125, 49.229638671875], + [-58.19091796875, 49.258740234375], + [-58.21337890625, 49.386669921875], + [-58.0158203125, 49.54248046875], + [-57.79130859375, 49.489990234375], + [-57.926171875, 49.700830078125], + [-57.4326171875, 50.505810546875], + [-57.17958984375, 50.61484375], + [-57.297998046875, 50.69873046875], + [-57.0359375, 51.01083984375], + [-56.682421875, 51.332763671875], + [-56.0255859375, 51.5683593750001], + [-55.6904296875, 51.471337890625], + [-55.66640625, 51.57890625], + [-55.4587402343749, 51.5365234375001] + ] + ], + [ + [ + [-127.924658203125, 51.473876953125], + [-128.148779296875, 51.626708984375], + [-128.03173828125, 51.7083984375], + [-127.924658203125, 51.473876953125] + ] + ], + [ + [ + [-79.38427734375, 51.951953125], + [-79.64375, 52.01005859375], + [-79.2712890625, 52.08681640625], + [-79.38427734375, 51.951953125] + ] + ], + [ + [ + [-128.36875, 52.40087890625], + [-128.439794921875, 52.69638671875], + [-128.247265625, 52.784375], + [-128.36875, 52.40087890625] + ] + ], + [ + [ + [-80.7316894531249, 52.747265625], + [-82.0392578125, 53.04990234375], + [-81.8473144531249, 53.186279296875], + [-81.135595703125, 53.205810546875], + [-80.7316894531249, 52.747265625] + ] + ], + [ + [ + [-131.7537109375, 53.195556640625], + [-131.63466796875, 52.92216796875], + [-131.97177734375, 52.879833984375], + [-131.455224609375, 52.701708984375], + [-131.590576171875, 52.57822265625], + [-131.259716796875, 52.41591796875], + [-131.319921875, 52.303076171875], + [-131.142626953125, 52.29111328125], + [-131.221533203125, 52.15361328125], + [-132.165087890625, 52.78330078125], + [-132.14375, 52.99931640625], + [-132.54677734375, 53.1375], + [-131.7537109375, 53.195556640625] + ] + ], + [ + [ + [-128.55244140625, 52.93974609375], + [-128.509912109375, 52.518603515625], + [-128.678955078125, 52.2896484375], + [-128.746337890625, 52.76337890625], + [-128.8998046875, 52.673828125], + [-129.175927734375, 52.96494140625], + [-129.033251953125, 53.2799316406251], + [-128.632666015625, 53.1125], + [-128.55244140625, 52.93974609375] + ] + ], + [ + [ + [-129.167724609375, 53.11787109375], + [-129.323876953125, 53.142138671875], + [-129.23818359375, 53.3300781250001], + [-129.167724609375, 53.11787109375] + ] + ], + [ + [ + [-129.848583984375, 53.167919921875], + [-130.517578125, 53.54423828125], + [-130.452001953125, 53.63115234375], + [-129.9447265625, 53.436376953125], + [-129.754833984375, 53.244775390625], + [-129.848583984375, 53.167919921875] + ] + ], + [ + [ + [-130.236279296875, 53.958544921875], + [-130.384228515625, 53.8439453125], + [-130.703173828125, 53.892236328125], + [-130.447998046875, 54.089013671875], + [-130.236279296875, 53.958544921875] + ] + ], + [ + [ + [-132.655517578125, 54.127490234375], + [-132.303369140625, 54.098876953125], + [-132.16611328125, 53.9552246093751], + [-132.53466796875, 53.651708984375], + [-132.186962890625, 53.684814453125], + [-132.134423828125, 54.03427734375], + [-131.667626953125, 54.141357421875], + [-131.957421875, 53.30869140625], + [-132.347265625, 53.189208984375], + [-132.747509765625, 53.310498046875], + [-132.425, 53.336962890625], + [-132.84501953125, 53.50771484375], + [-133.0794921875, 53.83701171875], + [-133.048388671875, 54.158935546875], + [-132.655517578125, 54.127490234375] + ] + ], + [ + [ + [-130.9271484375, 54.479052734375], + [-130.9068359375, 54.631787109375], + [-130.7580078125, 54.61376953125], + [-130.9271484375, 54.479052734375] + ] + ], + [ + [ + [-130.575341796875, 54.769677734375], + [-130.2140625, 55.02587890625], + [-130.3494140625, 54.81455078125], + [-130.575341796875, 54.769677734375] + ] + ], + [ + [ + [-79.977587890625, 56.2070312500001], + [-80.057470703125, 56.287353515625], + [-79.579736328125, 56.466357421875], + [-79.977587890625, 56.2070312500001] + ] + ], + [ + [ + [-78.935595703125, 56.266064453125], + [-79.17548828125, 55.88505859375], + [-79.18212890625, 56.212158203125], + [-79.4951171875, 55.874755859375], + [-79.76474609375, 55.8067871093751], + [-79.5447265625, 56.128369140625], + [-79.9875, 55.892138671875], + [-79.45888671875, 56.53974609375], + [-79.536328125, 56.180078125], + [-79.2724121093749, 56.600439453125], + [-78.935595703125, 56.266064453125] + ] + ], + [ + [ + [-61.743603515625, 57.5545898437501], + [-61.6375, 57.416064453125], + [-62.01123046875, 57.5484863281251], + [-61.743603515625, 57.5545898437501] + ] + ], + [ + [ + [-79.71650390625, 57.51552734375], + [-79.808447265625, 57.442431640625], + [-79.742578125, 57.607958984375], + [-79.71650390625, 57.51552734375] + ] + ], + [ + [ + [-69.16005859375, 59.040234375], + [-69.35283203125, 58.9607421875], + [-69.30322265625, 59.144873046875], + [-69.16005859375, 59.040234375] + ] + ], + [ + [ + [-64.40703125, 60.36708984375], + [-64.441943359375, 60.2978515625], + [-64.737939453125, 60.375634765625], + [-64.83642578125, 60.501025390625], + [-64.40703125, 60.36708984375] + ] + ], + [ + [ + [-68.2337890625, 60.24091796875], + [-68.36787109375, 60.31474609375], + [-68.08759765625, 60.587841796875], + [-67.8188476562499, 60.4495117187501], + [-68.2337890625, 60.24091796875] + ] + ], + [ + [ + [-78.531640625, 60.728564453125], + [-78.668896484375, 60.71689453125], + [-78.24169921875, 60.81865234375], + [-78.531640625, 60.728564453125] + ] + ], + [ + [ + [-64.8326171875, 61.366064453125], + [-65.43212890625, 61.64951171875], + [-64.7896484375, 61.66220703125], + [-64.8326171875, 61.366064453125] + ] + ], + [ + [ + [-65.03056640625, 61.879052734375], + [-64.89658203125, 61.7333007812501], + [-65.2353515625, 61.8977050781251], + [-65.03056640625, 61.879052734375] + ] + ], + [ + [ + [-79.5453125, 62.4117187500001], + [-79.286474609375, 62.24765625], + [-79.32392578125, 62.02607421875], + [-79.81611328125, 61.59462890625], + [-80.265185546875, 61.818212890625], + [-80.26005859375, 62.109033203125], + [-79.9267578125, 62.39287109375], + [-79.5453125, 62.4117187500001] + ] + ], + [ + [ + [-64.823828125, 62.558740234375], + [-64.4650390625, 62.5359375], + [-64.4783203125, 62.41787109375], + [-64.901220703125, 62.421044921875], + [-64.823828125, 62.558740234375] + ] + ], + [ + [ + [-70.337060546875, 62.54873046875], + [-70.766064453125, 62.596875], + [-71.2201171875, 62.87392578125], + [-70.442626953125, 62.7337890625], + [-70.337060546875, 62.54873046875] + ] + ], + [ + [ + [-82.00048828125, 62.95419921875], + [-82.025830078125, 62.730078125], + [-82.56826171875, 62.40322265625], + [-83.0158203125, 62.209912109375], + [-83.698876953125, 62.16025390625], + [-83.910498046875, 62.454150390625], + [-83.376416015625, 62.904931640625], + [-82.00048828125, 62.95419921875] + ] + ], + [ + [ + [-77.876708984375, 63.470556640625], + [-77.53271484375, 63.233642578125], + [-77.942431640625, 63.114404296875], + [-78.536767578125, 63.42373046875], + [-77.876708984375, 63.470556640625] + ] + ], + [ + [ + [-76.677587890625, 63.3939453125], + [-77.3647460937499, 63.588330078125], + [-77.13369140625, 63.68203125], + [-76.65244140625, 63.503564453125], + [-76.677587890625, 63.3939453125] + ] + ], + [ + [ + [-84.91962890625, 65.261083984375], + [-84.501123046875, 65.458447265625], + [-84.08486328125, 65.217822265625], + [-82.05, 64.6442871093751], + [-81.676123046875, 64.212646484375], + [-81.887109375, 64.01640625], + [-80.828955078125, 64.08994140625], + [-80.30205078125, 63.76220703125], + [-81.04638671875, 63.461572265625], + [-82.378125, 63.706787109375], + [-82.46708984375, 63.926953125], + [-83.303955078125, 64.1437988281251], + [-84.63291015625, 63.309228515625], + [-85.392626953125, 63.119677734375], + [-85.7689453125, 63.700341796875], + [-87.151904296875, 63.58564453125], + [-86.93203125, 63.90166015625], + [-86.252099609375, 64.136865234375], + [-86.374267578125, 64.5658203125], + [-86.074609375, 65.533837890625], + [-85.5546875, 65.91865234375], + [-85.176220703125, 65.746875], + [-85.2399414062499, 65.510302734375], + [-84.91962890625, 65.261083984375] + ] + ], + [ + [ + [-84.674755859375, 65.575], + [-85.096337890625, 65.756201171875], + [-85.149609375, 66.0153808593751], + [-84.757373046875, 65.8589355468751], + [-84.674755859375, 65.575] + ] + ], + [ + [ + [-83.7259765625, 65.796728515625], + [-83.233740234375, 65.7150390625], + [-83.332421875, 65.6310546875], + [-84.11826171875, 65.7717773437501], + [-84.407177734375, 66.131005859375], + [-83.786962890625, 65.965771484375], + [-83.7259765625, 65.796728515625] + ] + ], + [ + [ + [-108.092724609375, 67.00517578125], + [-107.805517578125, 66.9985839843751], + [-107.9439453125, 66.8578125], + [-108.092724609375, 67.00517578125] + ] + ], + [ + [ + [-62.68154296875, 67.056298828125], + [-62.871630859375, 67.0625976562501], + [-62.416796875, 67.1884765625], + [-62.68154296875, 67.056298828125] + ] + ], + [ + [ + [-107.899853515625, 67.401806640625], + [-107.950244140625, 67.318212890625], + [-108.15224609375, 67.429443359375], + [-108.048974609375, 67.664892578125], + [-107.899853515625, 67.401806640625] + ] + ], + [ + [ + [-73.621728515625, 67.783837890625], + [-74.573388671875, 67.8286621093751], + [-74.70654296875, 68.06708984375], + [-73.49375, 68.000634765625], + [-73.407177734375, 67.79306640625], + [-73.621728515625, 67.783837890625] + ] + ], + [ + [ + [-86.595556640625, 67.7359375], + [-86.892529296875, 67.836572265625], + [-86.959814453125, 68.100244140625], + [-86.702099609375, 68.305615234375], + [-86.421142578125, 68.183447265625], + [-86.595556640625, 67.7359375] + ] + ], + [ + [ + [-75.67587890625, 68.3225097656251], + [-75.078125, 68.17314453125], + [-75.201953125, 67.4591796875], + [-75.780078125, 67.283544921875], + [-76.944189453125, 67.25029296875], + [-77.30439453125, 67.6851074218751], + [-77.12587890625, 67.9470703125], + [-76.59580078125, 68.278955078125], + [-75.67587890625, 68.3225097656251] + ] + ], + [ + [ + [-78.98271484375, 68.192822265625], + [-79.1747558593749, 68.264453125], + [-78.952587890625, 68.3530273437501], + [-78.98271484375, 68.192822265625] + ] + ], + [ + [ + [-104.540673828125, 68.405908203125], + [-105.0513671875, 68.559033203125], + [-104.602001953125, 68.5615234375], + [-104.540673828125, 68.405908203125] + ] + ], + [ + [ + [-74.880859375, 68.3486816406251], + [-75.400244140625, 68.52548828125], + [-75.28740234375, 68.687744140625], + [-74.983642578125, 68.647607421875], + [-74.880859375, 68.3486816406251] + ] + ], + [ + [ + [-101.8458984375, 68.586328125], + [-102.308154296875, 68.681982421875], + [-102.01337890625, 68.825390625], + [-101.732958984375, 68.75341796875], + [-101.8458984375, 68.586328125] + ] + ], + [ + [ + [-100.217236328125, 68.806689453125], + [-100.596533203125, 68.7664062500001], + [-100.565478515625, 69.026806640625], + [-100.217236328125, 68.806689453125] + ] + ], + [ + [ + [-99.994677734375, 69.013525390625], + [-100.195703125, 68.991455078125], + [-100.153125, 69.1294921875], + [-99.994677734375, 69.013525390625] + ] + ], + [ + [ + [-79.21064453125, 68.845458984375], + [-79.24267578125, 69.049267578125], + [-78.332568359375, 69.38603515625], + [-78.77919921875, 68.95048828125], + [-79.21064453125, 68.845458984375] + ] + ], + [ + [ + [-90.1998046875, 69.419091796875], + [-90.3302734374999, 69.252197265625], + [-90.492041015625, 69.369873046875], + [-90.1998046875, 69.419091796875] + ] + ], + [ + [ + [-76.995361328125, 69.14375], + [-77.37939453125, 69.2740234375], + [-77.187548828125, 69.440087890625], + [-76.66884765625, 69.366162109375], + [-76.995361328125, 69.14375] + ] + ], + [ + [ + [-101.171728515625, 69.3970703125], + [-101.312890625, 69.57607421875], + [-101.000634765625, 69.4619140625], + [-101.171728515625, 69.3970703125] + ] + ], + [ + [ + [-95.513671875, 69.5736328125], + [-95.437451171875, 69.3784667968751], + [-95.730126953125, 69.34755859375], + [-95.806201171875, 69.560498046875], + [-95.89345703125, 69.3517578125], + [-95.875830078125, 69.6060058593751], + [-95.513671875, 69.5736328125] + ] + ], + [ + [ + [-67.9146972656249, 69.540966796875], + [-68.22138671875, 69.616748046875], + [-67.908837890625, 69.6818359375], + [-67.9146972656249, 69.540966796875] + ] + ], + [ + [ + [-78.0291015624999, 69.714892578125], + [-78.039990234375, 69.6083984375], + [-78.848193359375, 69.4828125], + [-78.0291015624999, 69.714892578125] + ] + ], + [ + [ + [-79.4306640625, 69.78779296875], + [-79.55283203125, 69.6308593750001], + [-80.047509765625, 69.6343261718751], + [-79.9778320312499, 69.50966796875], + [-80.794775390625, 69.6892578125001], + [-80.42421875, 69.797607421875], + [-79.4306640625, 69.78779296875] + ] + ], + [ + [ + [-97.439453125, 69.6426757812501], + [-96.2999511718749, 69.3443847656251], + [-95.7513671875, 68.89765625], + [-95.2677734375, 68.82607421875], + [-96.4015625, 68.470703125], + [-97.472021484375, 68.543701171875], + [-98.320556640625, 68.842724609375], + [-98.7038085937499, 68.802783203125], + [-98.9044921875, 68.9324218750001], + [-99.25400390625, 68.86318359375], + [-99.4946777343749, 68.9595703125], + [-99.455712890625, 69.131201171875], + [-98.45595703125, 69.33466796875], + [-98.54599609375, 69.572900390625], + [-98.041357421875, 69.456640625], + [-98.20048828125, 69.7969726562501], + [-97.79072265625, 69.86162109375], + [-97.439453125, 69.6426757812501] + ] + ], + [ + [ + [-86.913037109375, 70.113232421875], + [-86.557666015625, 69.9953125], + [-87.3232421875, 70.080126953125], + [-86.913037109375, 70.113232421875] + ] + ], + [ + [ + [-74.70888671875, 45.0038574218751], + [-74.7624511718749, 44.999072265625], + [-74.996142578125, 44.9701171875], + [-75.40126953125, 44.772265625], + [-75.8193359375, 44.468017578125], + [-76.185791015625, 44.242236328125], + [-76.819970703125, 43.6288085937501], + [-77.5965332031249, 43.6286132812501], + [-78.458251953125, 43.6314941406251], + [-78.7204101562499, 43.624951171875], + [-78.8455566406249, 43.5833496093751], + [-79.171875, 43.4665527343751], + [-79.0830566406249, 43.3313964843751], + [-79.0592285156249, 43.2780761718751], + [-79.066064453125, 43.106103515625], + [-79.026171875, 43.0173339843751], + [-78.9807617187499, 42.980615234375], + [-78.915087890625, 42.909130859375], + [-79.17373046875, 42.74853515625], + [-80.2475585937499, 42.366015625], + [-81.02822265625, 42.24716796875], + [-81.50732421875, 42.103466796875], + [-81.974169921875, 41.888720703125], + [-82.4390624999999, 41.6748535156251], + [-82.6900390625, 41.6751953125], + [-83.141943359375, 41.97587890625], + [-83.109521484375, 42.25068359375], + [-82.5453125, 42.62470703125], + [-82.190380859375, 43.474072265625], + [-82.137841796875, 43.5708984375], + [-82.4850585937499, 45.083740234375], + [-82.5510742187499, 45.3473632812501], + [-82.9193359374999, 45.51796875], + [-83.59267578125, 45.8171386718751], + [-83.469482421875, 45.994677734375], + [-83.615966796875, 46.116845703125], + [-83.9777832031249, 46.0849121093751], + [-84.123193359375, 46.5029296875], + [-84.440478515625, 46.4981445312501], + [-84.665771484375, 46.54326171875], + [-84.8759765624999, 46.89990234375], + [-85.070068359375, 46.979931640625], + [-85.65224609375, 47.219970703125], + [-86.67216796875, 47.63642578125], + [-87.2080078125, 47.848486328125], + [-87.743896484375, 48.060546875], + [-88.378173828125, 48.3030761718751], + [-89.4556640624999, 47.9962402343751], + [-90.797314453125, 48.1310546875], + [-91.0434570312499, 48.193701171875], + [-91.38720703125, 48.058544921875], + [-92.00517578125, 48.30185546875], + [-92.3484375, 48.276611328125], + [-92.4145996093749, 48.276611328125], + [-92.5005859375, 48.4353515625], + [-92.83671875, 48.5677734375], + [-93.257958984375, 48.628857421875], + [-93.377880859375, 48.616552734375], + [-93.70771484375, 48.5254394531251], + [-93.851611328125, 48.607275390625], + [-94.6208984374999, 48.7426269531251], + [-94.71279296875, 48.863427734375], + [-94.803466796875, 49.0029296875], + [-94.8604003906249, 49.25859375], + [-94.854345703125, 49.30458984375], + [-95.1552734375, 49.3696777343751], + [-95.1620605468749, 48.991748046875], + [-95.3979003906249, 48.9931640625], + [-96.2506835937499, 48.9931640625], + [-96.6770507812499, 48.9931640625], + [-97.5298339843749, 48.9931640625], + [-98.808984375, 48.9931640625], + [-104.7783203125, 48.9931152343751], + [-110.74765625, 48.9930664062501], + [-116.717041015625, 48.9930664062501], + [-118.84892578125, 48.9930664062501], + [-119.275341796875, 48.9930664062501], + [-119.701708984375, 48.993017578125], + [-120.980859375, 48.993017578125], + [-122.78876953125, 48.993017578125], + [-122.826708984375, 49.02841796875], + [-122.924169921875, 49.074658203125], + [-122.9626953125, 49.0746093750001], + [-123.06328125, 48.977734375], + [-123.229443359375, 49.2604980468751], + [-122.8791015625, 49.39892578125], + [-123.2767578125, 49.3439453125], + [-123.1875, 49.680322265625], + [-123.53056640625, 49.3973144531251], + [-124.02861328125, 49.602880859375], + [-123.992626953125, 49.736181640625], + [-123.8171875, 49.5865722656251], + [-123.582470703125, 49.68125], + [-123.8744140625, 49.7368164062501], + [-123.825439453125, 50.14423828125], + [-123.9458984375, 50.1839355468751], + [-123.984912109375, 49.8755859375], + [-124.28125, 49.772119140625], + [-124.782373046875, 50.0201171874999], + [-125.056689453125, 50.4186523437501], + [-124.85986328125, 50.872412109375], + [-125.0587890625, 50.5138671875], + [-125.476318359375, 50.49716796875], + [-125.53935546875, 50.6490234375], + [-125.64130859375, 50.4662109375001], + [-126.0943359375, 50.497607421875], + [-126.4474609375, 50.5877441406249], + [-125.9041015625, 50.704931640625], + [-126.51435546875, 50.6793945312501], + [-126.374609375, 50.837353515625], + [-126.52177734375, 50.866064453125], + [-126.517333984375, 51.0568359375001], + [-126.631787109375, 50.91513671875], + [-127.057568359375, 50.8675292968751], + [-127.70810546875, 51.151171875], + [-127.419677734375, 51.6080566406251], + [-126.691455078125, 51.70341796875], + [-127.338720703125, 51.707373046875], + [-127.668701171875, 51.477587890625], + [-127.850537109375, 51.6731933593751], + [-127.795361328125, 52.1910156250001], + [-127.437939453125, 52.3561523437501], + [-127.242236328125, 52.3951171875001], + [-126.71396484375, 52.060693359375], + [-127.193994140625, 52.457666015625], + [-126.9513671875, 52.7510253906251], + [-127.0193359375, 52.8424804687501], + [-127.0662109375, 52.652685546875], + [-127.79189453125, 52.28935546875], + [-128.10224609375, 51.788427734375], + [-128.3576171875, 52.1588867187501], + [-128.0375, 52.3181640625], + [-127.940234375, 52.5451660156251], + [-128.271533203125, 52.3629882812501], + [-128.053271484375, 52.910693359375], + [-128.3650390625, 52.8257812500001], + [-128.52470703125, 53.1406738281251], + [-129.080908203125, 53.3672851562501], + [-129.17158203125, 53.53359375], + [-128.85458984375, 53.704541015625], + [-128.905615234375, 53.5593261718751], + [-128.542138671875, 53.4206542968751], + [-128.13271484375, 53.4177734375], + [-127.92783203125, 53.27470703125], + [-128.2072265625, 53.4832031250001], + [-128.675537109375, 53.5545898437501], + [-128.763671875, 53.746875], + [-128.53212890625, 53.8581054687501], + [-128.959375, 53.8414550781251], + [-129.257861328125, 53.4179687500001], + [-129.563720703125, 53.2514648437501], + [-130.33525390625, 53.7239257812501], + [-130.043310546875, 54.133544921875], + [-129.626025390625, 54.2302734375], + [-130.084228515625, 54.181396484375], + [-130.4302734375, 54.42099609375], + [-129.56064453125, 55.4625488281251], + [-129.795166015625, 55.5595703125001], + [-130.048486328125, 55.0572753906251], + [-130.0140625, 55.950537109375], + [-130.0978515625, 56.10927734375], + [-130.413134765625, 56.1225097656251], + [-130.477099609375, 56.23056640625], + [-130.649072265625, 56.263671875], + [-131.471875, 56.5567382812501], + [-131.824267578125, 56.5899902343751], + [-131.866162109375, 56.792822265625], + [-132.104296875, 56.8567871093751], + [-132.062890625, 56.953369140625], + [-132.33798828125, 57.079443359375], + [-132.27939453125, 57.1453613281251], + [-132.232177734375, 57.1985351562501], + [-132.30166015625, 57.2763183593751], + [-132.44248046875, 57.40673828125], + [-132.55048828125, 57.49990234375], + [-133.001416015625, 57.948974609375], + [-133.27529296875, 58.2228515625], + [-133.54638671875, 58.503466796875], + [-134.218505859375, 58.84990234375], + [-134.329638671875, 58.9396972656251], + [-134.39306640625, 59.0091796875], + [-134.67724609375, 59.199267578125], + [-134.94375, 59.28828125], + [-135.051025390625, 59.578662109375], + [-135.36787109375, 59.743310546875], + [-135.702587890625, 59.7287597656251], + [-136.321826171875, 59.604833984375], + [-136.277978515625, 59.4803222656251], + [-136.466357421875, 59.45908203125], + [-136.578759765625, 59.15224609375], + [-136.81328125, 59.1500488281251], + [-137.126220703125, 59.0409667968751], + [-137.2775390625, 58.98818359375], + [-137.43857421875, 58.903125], + [-137.5208984375, 58.9153808593751], + [-137.593310546875, 59.22626953125], + [-138.317626953125, 59.6111328125001], + [-138.86875, 59.945751953125], + [-139.18515625, 60.08359375], + [-139.136962890625, 60.1727050781251], + [-139.079248046875, 60.2794433593751], + [-139.079248046875, 60.3437011718751], + [-139.234765625, 60.33974609375], + [-139.676318359375, 60.3283203125], + [-139.973291015625, 60.1831542968751], + [-140.45283203125, 60.29970703125], + [-140.525439453125, 60.218359375], + [-140.762744140625, 60.2591308593751], + [-141.0021484375, 60.3002441406251], + [-141.0021484375, 60.88466796875], + [-141.0021484375, 61.761279296875], + [-141.0021484375, 63.222265625], + [-141.0021484375, 64.0988769531251], + [-141.0021484375, 65.559912109375], + [-141.0021484375, 66.4365234375001], + [-141.0021484375, 67.89755859375], + [-141.0021484375, 68.7741699218751], + [-141.0021484375, 69.6507812500001], + [-139.18154296875, 69.5155273437501], + [-137.2599609375, 68.964111328125], + [-136.12236328125, 68.8822265625], + [-135.258837890625, 68.684326171875], + [-135.939013671875, 68.9741699218751], + [-135.575537109375, 69.026953125], + [-135.910205078125, 69.111474609375], + [-135.691455078125, 69.311181640625], + [-135.292822265625, 69.3078613281251], + [-135.1408203125, 69.467822265625], + [-134.4568359375, 69.47763671875], + [-134.408935546875, 69.681787109375], + [-133.87978515625, 69.5077148437501], + [-134.17431640625, 69.2528320312501], + [-133.163134765625, 69.43388671875], + [-132.91533203125, 69.6296386718751], + [-132.40390625, 69.658740234375], + [-132.4884765625, 69.7380859375], + [-132.163427734375, 69.7049804687501], + [-131.136376953125, 69.9068847656251], + [-130.665478515625, 70.12705078125], + [-129.944970703125, 70.0909179687501], + [-129.675634765625, 70.1929687500001], + [-129.648291015625, 69.9977539062501], + [-130.832080078125, 69.6514648437501], + [-131.93779296875, 69.5347167968751], + [-132.81748046875, 69.20576171875], + [-133.418310546875, 68.8442871093749], + [-133.138037109375, 68.7465820312501], + [-133.336669921875, 68.8352539062501], + [-132.57763671875, 68.8478027343751], + [-132.7189453125, 69.07919921875], + [-131.78837890625, 69.431982421875], + [-131.32470703125, 69.3611816406251], + [-131.063427734375, 69.45068359375], + [-130.970654296875, 69.20908203125], + [-130.117626953125, 69.720068359375], + [-128.89892578125, 69.9661621093751], + [-129.15791015625, 69.80009765625], + [-129.054345703125, 69.7010742187501], + [-128.85302734375, 69.7510253906251], + [-127.6837890625, 70.2603515625], + [-128.1701171875, 70.41845703125], + [-127.991015625, 70.573828125], + [-127.2259765625, 70.296142578125], + [-126.250439453125, 69.5452636718749], + [-125.524951171875, 69.3515625000001], + [-125.171875, 69.427978515625], + [-125.35693359375, 69.6259765625], + [-124.767919921875, 69.9900390625], + [-124.990380859375, 70.0266113281251], + [-124.555029296875, 70.1512207031251], + [-124.40693359375, 69.7674316406251], + [-124.124609375, 69.6899902343751], + [-124.3380859375, 69.36484375], + [-123.52841796875, 69.38935546875], + [-123.02578125, 69.810009765625], + [-122.070068359375, 69.8161621093751], + [-120.962451171875, 69.6604003906251], + [-120.139990234375, 69.3805664062501], + [-117.226953125, 68.913427734375], + [-116.05947265625, 68.8370117187501], + [-116.243408203125, 68.9740722656251], + [-115.44228515625, 68.9409179687501], + [-114.620166015625, 68.74609375], + [-113.964404296875, 68.399072265625], + [-114.095947265625, 68.2667968750001], + [-114.765283203125, 68.27021484375], + [-115.12705078125, 68.13203125], + [-115.43447265625, 67.9023437500001], + [-115.133203125, 67.819189453125], + [-112.50302734375, 67.6819335937501], + [-110.9900390625, 67.7908203125001], + [-110.07392578125, 67.9929199218751], + [-109.63037109375, 67.73271484375], + [-109.038037109375, 67.691162109375], + [-108.852001953125, 67.4219726562501], + [-108.613330078125, 67.5980468750001], + [-107.988720703125, 67.2563964843751], + [-107.99130859375, 67.0951660156251], + [-108.496044921875, 67.0922851562501], + [-107.25947265625, 66.39853515625], + [-107.7103515625, 66.7400390625001], + [-107.72509765625, 66.9841308593751], + [-107.156494140625, 66.88173828125], + [-107.9583984375, 67.8186035156251], + [-107.798291015625, 68.0369140625], + [-106.424267578125, 68.2005859375001], + [-105.7501953125, 68.5922851562501], + [-106.458056640625, 68.516455078125], + [-106.60849609375, 68.357373046875], + [-107.6193359375, 68.3310546875], + [-107.7341796875, 68.1737304687501], + [-108.322802734375, 68.1541015625], + [-108.718115234375, 68.2974609375001], + [-108.3134765625, 68.610791015625], + [-106.164453125, 68.9198730468751], + [-105.685595703125, 68.8281738281251], + [-105.37744140625, 68.413818359375], + [-104.653173828125, 68.230078125], + [-104.48681640625, 68.06318359375], + [-103.47412109375, 68.1150390625001], + [-102.320361328125, 67.7356445312501], + [-101.55498046875, 67.6931640625001], + [-100.212939453125, 67.83857421875], + [-98.920458984375, 67.72578125], + [-98.4121093749999, 67.8071777343751], + [-98.63154296875, 68.0725585937501], + [-97.4549316406249, 67.6169921875], + [-97.2065429687499, 67.855078125], + [-97.739111328125, 67.9781738281251], + [-98.1925292968749, 67.922998046875], + [-98.6504882812499, 68.3635253906251], + [-98.2185546875, 68.3174316406251], + [-97.7942382812499, 68.38759765625], + [-97.9250976562499, 68.523681640625], + [-97.4103515624999, 68.496533203125], + [-96.976708984375, 68.2554199218751], + [-96.4306640624999, 68.3105957031251], + [-96.7220703125001, 68.03876953125], + [-95.9703125, 68.24912109375], + [-96.3691406249999, 67.509765625], + [-96.1414550781249, 67.271826171875], + [-95.719921875, 67.3167968750001], + [-95.777685546875, 67.1846191406251], + [-95.4159179687501, 67.15556640625], + [-95.418896484375, 67.0132324218749], + [-96.42255859375, 67.0517578125], + [-95.7875488281249, 66.616796875], + [-96.0368652343749, 66.9375], + [-95.399658203125, 66.9494628906251], + [-95.2587402343749, 67.2625488281249], + [-95.6504882812499, 67.7374511718751], + [-95.460693359375, 68.02138671875], + [-94.7444335937499, 68.0708984375], + [-93.44892578125, 68.618896484375], + [-93.8524414062499, 69.000341796875], + [-94.064892578125, 68.7847656250001], + [-94.600439453125, 68.8032226562501], + [-94.083642578125, 69.1230957031251], + [-94.254736328125, 69.31376953125], + [-93.6194824218749, 69.4169921875001], + [-93.7485351562499, 69.2261230468751], + [-93.5322753906249, 69.480908203125], + [-94.2708007812499, 69.4551269531251], + [-94.633837890625, 69.6496582031251], + [-94.8225097656249, 69.577783203125], + [-95.9649414062499, 69.802783203125], + [-96.5513671875, 70.2103027343751], + [-96.2977050781249, 70.5113769531251], + [-95.87861328125, 70.5489746093751], + [-95.8863281249999, 70.6942871093751], + [-96.2580078124999, 70.6422851562501], + [-96.54892578125, 70.8087402343751], + [-96.44658203125, 71.239892578125], + [-96.06201171875, 71.4138671874999], + [-95.5642578124999, 71.336767578125], + [-95.40625, 71.491650390625], + [-95.8723144531249, 71.5731445312501], + [-94.7348632812499, 71.9829589843751], + [-94.3083496093749, 71.7648925781251], + [-93.7462890625, 71.742822265625], + [-92.9486816406249, 71.2621093750001], + [-92.9814453124999, 70.8522460937501], + [-91.5640625, 70.1782714843751], + [-92.3205078125, 70.2353515625], + [-92.5118652343749, 70.103857421875], + [-91.976708984375, 70.0386718750001], + [-92.8877929687499, 69.6682128906251], + [-92.3116699218749, 69.672900390625], + [-91.911962890625, 69.53125], + [-91.2018066406249, 69.6447753906249], + [-91.43994140625, 69.52568359375], + [-90.4155761718749, 69.4569824218751], + [-90.89228515625, 69.26728515625], + [-91.2372070312501, 69.2855468750001], + [-90.4790039062499, 68.88115234375], + [-90.5736328125001, 68.47470703125], + [-90.20478515625, 68.2574707031251], + [-89.2795410156249, 69.25546875], + [-88.22353515625, 68.9150390625], + [-87.8135742187499, 68.345703125], + [-87.89267578125, 68.24814453125], + [-88.3469726562499, 68.28828125], + [-88.313818359375, 67.9503417968751], + [-87.359375, 67.17724609375], + [-86.5607910156249, 67.4821289062501], + [-85.6431640624999, 68.69970703125], + [-84.8675781249999, 68.7733398437501], + [-85.106640625, 68.8440429687501], + [-84.86220703125, 69.073974609375], + [-85.3867675781249, 69.231884765625], + [-85.5073730468749, 69.8452636718749], + [-82.6183593749999, 69.6910644531251], + [-82.3902343749999, 69.6008789062501], + [-82.7548339843749, 69.4943847656251], + [-82.30986328125, 69.4100097656251], + [-82.2275390625, 69.248876953125], + [-81.3778320312501, 69.18564453125], + [-81.9579101562499, 68.883642578125], + [-81.380908203125, 68.850048828125], + [-81.2815429687499, 68.6572265625], + [-81.9148437499999, 68.4587890625001], + [-82.552685546875, 68.4464843750001], + [-82.2224121093749, 68.145263671875], + [-82.0125, 68.193896484375], + [-81.97646484375, 67.86201171875], + [-81.2943359375, 67.497412109375], + [-81.467578125, 67.0698730468751], + [-83.4064453125, 66.3712402343751], + [-84.5384765624999, 66.9728027343751], + [-84.845751953125, 67.0287109375001], + [-85.113720703125, 66.9069335937501], + [-84.737744140625, 66.9335937500001], + [-84.223046875, 66.6824707031251], + [-83.86904296875, 66.2135742187501], + [-84.29306640625, 66.2917968750001], + [-84.628076171875, 66.20771484375], + [-85.603857421875, 66.5682617187501], + [-86.708154296875, 66.5230468750001], + [-86.685107421875, 66.360400390625], + [-85.9587402343749, 66.11904296875], + [-87.452880859375, 65.3389648437501], + [-87.969970703125, 65.34892578125], + [-89.7494140625, 65.9360351562501], + [-89.8896972656249, 65.8685546875], + [-91.4272460937499, 65.947900390625], + [-91.0411132812499, 65.8298339843751], + [-90.983447265625, 65.91923828125], + [-89.924072265625, 65.7802734375001], + [-88.9740234374999, 65.348291015625], + [-87.0275390625, 65.198095703125], + [-88.105615234375, 64.18330078125], + [-88.8177246093749, 63.992236328125], + [-89.2006347656249, 64.1137695312501], + [-89.13154296875, 63.9685058593749], + [-89.6158203125, 64.030615234375], + [-89.8113281249999, 64.18056640625], + [-90.0416503906249, 64.1408691406251], + [-89.855712890625, 63.9569824218751], + [-90.1681640625, 63.9787597656251], + [-90.154736328125, 63.6896484375], + [-90.8119140624999, 63.580908203125], + [-91.9822265625, 63.822412109375], + [-92.338427734375, 63.787646484375], + [-93.6963378906249, 64.1471679687501], + [-93.5598144531249, 63.8652832031251], + [-93.27021484375, 63.8408691406251], + [-93.3785156249999, 63.948486328125], + [-92.1568847656249, 63.69169921875], + [-92.4650878906249, 63.5550781250001], + [-91.841845703125, 63.69755859375], + [-90.9700683593749, 63.4427734375001], + [-90.6985839843749, 63.0638671875001], + [-91.448974609375, 62.804052734375], + [-92.3612792968749, 62.819384765625], + [-91.9358398437499, 62.5923828125001], + [-92.5514160156249, 62.546728515625], + [-92.7659667968749, 62.3499511718751], + [-92.5279785156249, 62.168408203125], + [-93.2053710937499, 62.3649414062501], + [-92.905517578125, 62.21513671875], + [-93.3330566406249, 61.93291015625], + [-93.5817871093749, 61.9420410156251], + [-93.31201171875, 61.76728515625], + [-93.912744140625, 61.4814453125001], + [-94.509375, 60.6045410156249], + [-94.7617187499999, 60.4982421875001], + [-94.78828125, 59.2678710937499], + [-94.95732421875, 59.0688476562501], + [-94.2870605468749, 58.7160156250001], + [-94.3322265625, 58.2973632812501], + [-94.1231933593749, 58.7367187500001], + [-93.1787597656249, 58.725634765625], + [-92.4328124999999, 57.3203125], + [-92.7981445312499, 56.92197265625], + [-90.8974609375, 57.2569335937501], + [-88.9484863281249, 56.851318359375], + [-88.07509765625, 56.4672851562499], + [-87.4824218749999, 56.0212890625], + [-85.5593261718749, 55.5401855468751], + [-85.2180175781249, 55.348974609375], + [-85.3652832031249, 55.079296875], + [-85.0609375, 55.2856445312501], + [-83.9105957031249, 55.3146484375], + [-82.39326171875, 55.0678222656251], + [-82.219384765625, 54.8134765625], + [-82.4241699218749, 54.2445800781251], + [-82.1414550781249, 53.817626953125], + [-82.291552734375, 53.0307128906251], + [-81.5994140624999, 52.4326171875001], + [-81.8278808593749, 52.2242187500001], + [-81.4662109374999, 52.2044921875001], + [-80.588037109375, 51.6672363281251], + [-80.4433105468749, 51.38857421875], + [-80.851220703125, 51.125], + [-80.4783203124999, 51.30732421875], + [-80.1035644531249, 51.2828613281251], + [-79.3479003906249, 50.762646484375], + [-79.737451171875, 51.186279296875], + [-79.338671875, 51.628173828125], + [-79.04052734375, 51.4637695312501], + [-78.903173828125, 51.20029296875], + [-78.7313476562499, 51.4974609375], + [-78.9816406249999, 51.7745605468751], + [-78.448095703125, 52.261376953125], + [-78.7441406249999, 52.65537109375], + [-79.100341796875, 53.6566406250001], + [-78.9960449218749, 54.002490234375], + [-79.241796875, 54.0988769531251], + [-79.1467285156249, 54.16923828125], + [-79.712353515625, 54.6718261718751], + [-77.7752929687499, 55.291259765625], + [-76.604052734375, 56.199560546875], + [-76.5255859375, 56.8917968750001], + [-76.809814453125, 57.6579589843751], + [-77.156787109375, 58.018896484375], + [-78.5150878906249, 58.682373046875], + [-77.760693359375, 59.3800292968751], + [-77.726171875, 59.6758789062499], + [-77.349072265625, 59.5789550781251], + [-77.4853027343749, 59.6845703125001], + [-77.2892089843749, 60.0220214843751], + [-77.585888671875, 60.0881835937501], + [-77.452880859375, 60.1458007812501], + [-77.6814453124999, 60.427099609375], + [-77.503564453125, 60.542724609375], + [-77.7908203124999, 60.63984375], + [-77.5895507812499, 60.8085937500001], + [-78.18134765625, 60.819140625], + [-77.51435546875, 61.5562988281251], + [-78.02138671875, 61.8320800781251], + [-78.1333984374999, 62.282275390625], + [-77.372412109375, 62.5725097656251], + [-75.8168945312499, 62.3158691406251], + [-75.7898437499999, 62.17958984375], + [-75.3412109375, 62.312109375], + [-74.632568359375, 62.1156738281251], + [-74.6458007812499, 62.2111328125], + [-73.7050781249999, 62.4731445312499], + [-72.686962890625, 62.124560546875], + [-72.771630859375, 61.8404296875], + [-72.50556640625, 61.9226562500001], + [-72.2261230468749, 61.831591796875], + [-72.0400390624999, 61.6802734375001], + [-72.215869140625, 61.587255859375], + [-71.86611328125, 61.688525390625], + [-71.63828125, 61.6171875], + [-71.8543945312499, 61.4397949218749], + [-71.4227050781249, 61.1589355468751], + [-70.2792968749999, 61.06865234375], + [-69.9924316406249, 60.8564941406251], + [-69.5033203124999, 61.0404296875001], + [-69.4047363281249, 60.8467773437501], + [-69.75947265625, 60.440234375], + [-69.6737304687499, 60.0758789062501], + [-70.654833984375, 60.0262207031251], + [-69.7339355468749, 59.918017578125], + [-69.6818847656249, 59.3417480468751], + [-69.3440429687499, 59.303076171875], + [-69.5316406249999, 58.8692382812501], + [-69.6483886718749, 58.82080078125], + [-69.7841796874999, 58.9557128906251], + [-70.154345703125, 58.760595703125], + [-69.7898925781249, 58.689306640625], + [-69.2710937499999, 58.8839355468751], + [-68.698193359375, 58.904541015625], + [-68.3811523437499, 58.7435058593751], + [-68.2293945312499, 58.4845703125001], + [-68.3565429687499, 58.1632324218751], + [-69.0408203125, 57.9024902343751], + [-68.41357421875, 58.0517578125], + [-68.0210449218749, 58.485302734375], + [-67.8882812499999, 58.295751953125], + [-68.0638671875001, 58.13896484375], + [-67.7559570312499, 58.4045898437501], + [-67.6782714843749, 57.9911132812501], + [-67.5696289062499, 58.2134765625001], + [-66.7221679687499, 58.491015625], + [-66.3624023437499, 58.791162109375], + [-66.0023925781249, 58.431201171875], + [-66.04306640625, 58.820654296875], + [-65.72099609375, 59.023779296875], + [-65.3835449218749, 59.0602050781251], + [-65.7, 59.213330078125], + [-65.4117187499999, 59.314990234375], + [-65.4750976562499, 59.4703125], + [-65.0382324218749, 59.3878906250001], + [-65.4074218749999, 59.53935546875], + [-65.4333984374999, 59.776513671875], + [-65.028173828125, 59.7707031250001], + [-65.1717285156249, 59.9080078125], + [-64.817333984375, 60.3310546875], + [-64.4994140625001, 60.26826171875], + [-64.4195800781249, 60.17138671875], + [-64.76845703125, 60.0121093750001], + [-64.2834960937499, 60.0640625], + [-64.2263183593749, 59.7412109375001], + [-64.0560546875001, 59.82255859375], + [-63.7501953124999, 59.5125976562501], + [-63.945458984375, 59.3801757812501], + [-63.7758789062499, 59.2771484375], + [-63.5398925781249, 59.332861328125], + [-63.41513671875, 59.1943847656251], + [-63.971142578125, 59.05380859375], + [-63.2484374999999, 59.068310546875], + [-63.2821289062499, 58.8673828125001], + [-63.05029296875, 58.8781738281249], + [-62.8738769531249, 58.6724609375], + [-63.5370605468749, 58.329931640625], + [-63.2099609374999, 58.466943359375], + [-62.5938476562499, 58.4740234375001], + [-62.812060546875, 58.2003906250001], + [-63.2615234374999, 58.0146972656251], + [-62.48623046875, 58.1540527343751], + [-62.3056640625, 57.972265625], + [-61.9586425781251, 57.9117675781251], + [-61.9679687499999, 57.6119140625001], + [-62.4955566406249, 57.4892089843751], + [-61.921142578125, 57.4208007812501], + [-61.97744140625, 57.24794921875], + [-61.3337402343749, 57.010595703125], + [-61.371630859375, 56.6808105468751], + [-62.4972656249999, 56.801708984375], + [-61.737744140625, 56.526025390625], + [-61.9404296874999, 56.4235839843751], + [-61.4252929687499, 56.3606445312501], + [-61.7130859375, 56.2309570312501], + [-61.3646972656249, 56.2160156250001], + [-61.301123046875, 56.04716796875], + [-61.4495117187499, 55.995703125], + [-61.08935546875, 55.8663574218751], + [-60.7432617187499, 55.9414550781249], + [-60.562109375, 55.7270019531251], + [-60.3410156249999, 55.78466796875], + [-60.40830078125, 55.649560546875], + [-60.1923828124999, 55.4809082031251], + [-60.617138671875, 55.060205078125], + [-59.7587890625, 55.3095703125], + [-59.6890624999999, 55.196337890625], + [-59.4378906250001, 55.1759277343751], + [-59.83779296875, 54.8139648437501], + [-59.2595703125, 55.1999511718751], + [-58.997119140625, 55.1494628906251], + [-58.78017578125, 54.8383789062501], + [-58.39814453125, 54.77412109375], + [-57.9624511718749, 54.8757324218751], + [-57.4044921875, 54.590869140625], + [-57.699267578125, 54.3865722656251], + [-58.435205078125, 54.228125], + [-58.633203125, 54.049560546875], + [-59.8230468749999, 53.834423828125], + [-60.1449218749999, 53.596142578125], + [-60.39541015625, 53.6533203125001], + [-60.1002929687499, 53.4869628906251], + [-60.3294921875, 53.2661132812501], + [-58.6520507812499, 53.977880859375], + [-57.935986328125, 54.0911621093749], + [-58.3174804687499, 54.1144531250001], + [-58.1920898437499, 54.2281738281251], + [-57.4160644531249, 54.1627441406251], + [-57.1349609374999, 53.7918457031251], + [-57.524072265625, 53.6114257812501], + [-57.33173828125, 53.469091796875], + [-56.840869140625, 53.739453125], + [-56.4649902343751, 53.7650390625001], + [-55.96611328125, 53.4711425781251], + [-55.79794921875, 53.211962890625], + [-55.8028320312499, 52.6431640625], + [-56.3249023437499, 52.54453125], + [-55.7464843749999, 52.4745605468751], + [-55.7771484374999, 52.3642578125], + [-56.01171875, 52.3944824218751], + [-55.69521484375, 52.1377929687501], + [-56.9759765625001, 51.4576660156251], + [-58.5103515625, 51.2950683593751], + [-59.8863281249999, 50.3164062500001], + [-61.724853515625, 50.104052734375], + [-61.9195312499999, 50.2328613281251], + [-62.7154296875, 50.3016601562501], + [-66.4955078124999, 50.2118652343751], + [-66.941162109375, 49.993701171875], + [-67.372021484375, 49.3484375], + [-68.28193359375, 49.1971679687501], + [-69.673876953125, 48.199169921875], + [-71.0182617187499, 48.455615234375], + [-69.8655273437499, 48.1722656250001], + [-69.775, 48.098095703125], + [-69.9944335937499, 47.7398925781251], + [-70.705859375, 47.1397949218751], + [-71.2677734375, 46.795947265625], + [-71.87958984375, 46.68681640625], + [-72.9810058593749, 46.2097167968751], + [-73.4766113281249, 45.738232421875], + [-74.0378417968749, 45.5018554687501], + [-74.3150878906249, 45.5310546875], + [-73.973828125, 45.3451171875], + [-74.70888671875, 45.0038574218751] + ] + ], + [ + [ + [-96.78232421875, 72.93662109375], + [-97.0927734375, 72.996923828125], + [-96.86240234375, 73.1888183593751], + [-96.78232421875, 72.93662109375] + ] + ], + [ + [ + [-114.521533203125, 72.592919921875], + [-113.578076171875, 72.6520996093751], + [-113.2923828125, 72.9498046875], + [-112.75361328125, 72.98603515625], + [-111.2697265625, 72.713720703125], + [-111.895166015625, 72.356103515625], + [-111.67509765625, 72.300146484375], + [-110.205126953125, 72.661279296875], + [-110.66083984375, 73.008203125], + [-110.008447265625, 72.983642578125], + [-108.75498046875, 72.55107421875], + [-108.188232421875, 71.723779296875], + [-107.812841796875, 71.626171875], + [-107.306005859375, 71.894677734375], + [-108.23740234375, 73.14990234375], + [-108.029052734375, 73.34873046875], + [-106.48212890625, 73.19619140625], + [-105.41513671875, 72.788330078125], + [-104.3859375, 71.5769531250001], + [-104.514794921875, 71.0642578125001], + [-103.5845703125, 70.630859375], + [-103.077197265625, 70.5088378906251], + [-103.049560546875, 70.655078125], + [-101.676318359375, 70.278271484375], + [-101.56240234375, 70.135009765625], + [-101.04267578125, 70.110791015625], + [-100.982373046875, 69.6798828125], + [-101.483837890625, 69.8501953125001], + [-101.64765625, 69.6985351562501], + [-102.18212890625, 69.845947265625], + [-102.5958984375, 69.717919921875], + [-102.62109375, 69.5515136718751], + [-103.464892578125, 69.644482421875], + [-103.04892578125, 69.4717773437501], + [-103.12021484375, 69.20458984375], + [-102.44677734375, 69.476318359375], + [-102.045947265625, 69.46484375], + [-101.85712890625, 69.0239746093751], + [-102.895068359375, 68.8236328125], + [-104.571435546875, 68.872119140625], + [-105.105859375, 68.92041015625], + [-105.019580078125, 69.08125], + [-106.270166015625, 69.194580078125], + [-106.65908203125, 69.439599609375], + [-107.439892578125, 69.0021484375], + [-108.364990234375, 68.934765625], + [-109.472119140625, 68.676708984375], + [-113.127734375, 68.494140625], + [-113.616845703125, 68.8384765625], + [-113.694140625, 69.19501953125], + [-115.618115234375, 69.2829589843751], + [-116.5134765625, 69.4246093750001], + [-117.19541015625, 70.054052734375], + [-114.592333984375, 70.312451171875], + [-112.637890625, 70.225244140625], + [-111.632568359375, 70.308837890625], + [-113.757275390625, 70.6907226562501], + [-115.99091796875, 70.586279296875], + [-117.587060546875, 70.629541015625], + [-118.2640625, 70.888330078125], + [-118.269091796875, 71.0347167968751], + [-115.30341796875, 71.4937011718751], + [-117.93564453125, 71.39208984375], + [-118.22646484375, 71.4670898437501], + [-117.742333984375, 71.659326171875], + [-118.5830078125, 71.6490234375], + [-118.9876953125, 71.7642578125], + [-118.94462890625, 71.985546875], + [-118.2134765625, 72.262890625], + [-118.481298828125, 72.427685546875], + [-118.13310546875, 72.6328125], + [-114.638232421875, 73.37265625], + [-114.206396484375, 73.297802734375], + [-114.051708984375, 73.07099609375], + [-114.521533203125, 72.592919921875] + ] + ], + [ + [ + [-105.288916015625, 72.919921875], + [-106.921533203125, 73.479833984375], + [-106.61396484375, 73.69560546875], + [-105.31796875, 73.767138671875], + [-104.5875, 73.578076171875], + [-104.621728515625, 73.3111328125], + [-105.288916015625, 72.919921875] + ] + ], + [ + [ + [-79.5373046875, 73.6544921875], + [-78.2865234375, 73.6658203125001], + [-77.20654296875, 73.4995605468751], + [-76.1833984375, 72.8430664062501], + [-77.8359375, 72.896826171875], + [-79.3193359375, 72.75771484375], + [-79.820703125, 72.826318359375], + [-80.18330078125, 73.224658203125], + [-80.776416015625, 73.3341796875], + [-80.848876953125, 73.721240234375], + [-79.5373046875, 73.6544921875] + ] + ], + [ + [ + [-86.58935546875, 71.0107910156251], + [-85.64384765625, 71.15244140625], + [-85.094873046875, 71.1519531250001], + [-84.82373046875, 71.0286132812501], + [-84.6994140625, 71.6314453125], + [-85.3390625, 71.697265625], + [-85.91162109375, 71.9865234375], + [-85.321875, 72.2331542968751], + [-84.283740234375, 72.044482421875], + [-84.8419921875, 72.3081542968751], + [-84.623046875, 72.3765625], + [-85.3411132812499, 72.421533203125], + [-85.64990234375, 72.72216796875], + [-85.262109375, 72.95400390625], + [-84.256640625, 72.796728515625], + [-85.454736328125, 73.10546875], + [-84.416064453125, 73.456494140625], + [-83.781884765625, 73.41689453125], + [-83.729833984375, 73.57587890625], + [-81.946142578125, 73.7298339843751], + [-81.40615234375, 73.634521484375], + [-80.27724609375, 72.770166015625], + [-81.229345703125, 72.31171875], + [-80.611474609375, 72.450830078125], + [-80.925146484375, 71.907666015625], + [-80.18193359375, 72.2087890625001], + [-79.884375, 72.177197265625], + [-80.108935546875, 72.332177734375], + [-79.831298828125, 72.4462890625], + [-79.000244140625, 72.2720214843751], + [-79.0078125, 72.042919921875], + [-78.585107421875, 71.880615234375], + [-78.862744140625, 72.100830078125], + [-78.699267578125, 72.351416015625], + [-77.51650390625, 72.1777832031251], + [-78.4842773437499, 72.47060546875], + [-77.75322265625, 72.724755859375], + [-75.704296875, 72.571533203125], + [-75.0526855468749, 72.2263671875], + [-75.922802734375, 71.717236328125], + [-74.903173828125, 72.10048828125], + [-74.209326171875, 71.978662109375], + [-74.31572265625, 71.84267578125], + [-75.20478515625, 71.709130859375], + [-74.70078125, 71.6755859375001], + [-74.99619140625, 71.218115234375], + [-74.4880859375, 71.648388671875], + [-73.8140625, 71.771435546875], + [-74.197265625, 71.404150390625], + [-73.712841796875, 71.58759765625], + [-73.180615234375, 71.282861328125], + [-73.27822265625, 71.53798828125], + [-72.901953125, 71.6777832031251], + [-71.640673828125, 71.516259765625], + [-71.22939453125, 71.33876953125], + [-71.49501953125, 71.105126953125], + [-71.937939453125, 71.094287109375], + [-72.6327148437499, 70.83076171875], + [-71.742529296875, 71.046875], + [-71.370849609375, 70.975146484375], + [-70.8260742187499, 71.108740234375], + [-70.67265625, 71.052197265625], + [-70.76171875, 70.792236328125], + [-71.890185546875, 70.43154296875], + [-71.27587890625, 70.50029296875], + [-71.429443359375, 70.127783203125], + [-70.97978515625, 70.5810546875], + [-69.9498046875, 70.8450195312501], + [-68.495751953125, 70.61025390625], + [-68.363525390625, 70.48125], + [-70.05771484375, 70.042626953125], + [-68.77822265625, 70.203564453125], + [-69.00830078125, 69.978955078125], + [-68.74404296875, 69.94140625], + [-68.05908203125, 70.317236328125], + [-67.3636718749999, 70.034423828125], + [-67.221630859375, 69.7307128906251], + [-68.02041015625, 69.770068359375], + [-69.25078125, 69.5119140625], + [-68.513037109375, 69.577294921875], + [-67.236962890625, 69.460107421875], + [-66.716748046875, 69.311865234375], + [-66.707421875, 69.168212890625], + [-68.406298828125, 69.2322265625], + [-69.040625, 69.097998046875], + [-68.41552734375, 69.1720703125], + [-67.8326171875, 69.065966796875], + [-67.883203125, 68.783984375], + [-69.319091796875, 68.8569824218751], + [-68.210400390625, 68.702978515625], + [-67.9384765625, 68.524169921875], + [-66.742724609375, 68.457763671875], + [-67.032958984375, 68.32607421875], + [-66.923095703125, 68.0657226562501], + [-66.72900390625, 68.1290039062501], + [-66.6626953125, 68.034423828125], + [-66.63095703125, 68.21064453125], + [-66.21240234375, 68.280419921875], + [-66.4439453125, 67.8338378906251], + [-65.9423828125, 68.0709472656251], + [-65.86435546875, 67.9228515625], + [-65.50908203125, 67.96826171875], + [-65.40126953125, 67.674853515625], + [-65.41533203125, 67.879248046875], + [-64.922314453125, 68.031640625], + [-65.02109375, 67.787548828125], + [-64.63779296875, 67.840234375], + [-63.8501953125, 67.566064453125], + [-64.007958984375, 67.347314453125], + [-64.6999511718749, 67.350537109375], + [-63.8362304687499, 67.264111328125], + [-63.5916015625, 67.3775390625], + [-63.04013671875, 67.235009765625], + [-63.7015624999999, 66.82236328125], + [-62.9623046875, 66.9492675781251], + [-62.379736328125, 66.90537109375], + [-62.123583984375, 67.046728515625], + [-61.3534179687499, 66.689208984375], + [-61.5278320312499, 66.55810546875], + [-62.1233398437499, 66.64306640625], + [-61.57080078125, 66.3729003906251], + [-61.9563476562499, 66.309326171875], + [-62.553125, 66.4068359375], + [-62.5335937499999, 66.227001953125], + [-61.9916015625, 66.035302734375], + [-62.62412109375, 66.0162597656251], + [-62.381982421875, 65.83330078125], + [-62.65888671875, 65.63994140625], + [-63.1689453125, 65.65732421875], + [-63.4587402343749, 65.85302734375], + [-63.4208984375, 65.70859375], + [-63.65107421875, 65.6609863281251], + [-63.3374511718749, 65.616748046875], + [-63.36337890625, 65.229736328125], + [-63.606591796875, 64.928076171875], + [-64.345703125, 65.172412109375], + [-64.269677734375, 65.40078125], + [-64.555078125, 65.1166015625], + [-65.401611328125, 65.764013671875], + [-64.445361328125, 66.317138671875], + [-65.0044921875, 66.077734375], + [-65.825732421875, 65.996923828125], + [-65.65634765625, 66.204736328125], + [-66.063720703125, 66.13271484375], + [-66.986328125, 66.6274902343751], + [-67.07685546875, 66.5254882812501], + [-67.3073242187499, 66.5697265625], + [-67.2253906249999, 66.31025390625], + [-67.8833984375, 66.467431640625], + [-67.183203125, 66.034423828125], + [-67.350439453125, 65.929736328125], + [-67.82802734375, 65.965185546875], + [-68.459912109375, 66.249267578125], + [-68.74892578125, 66.200048828125], + [-68.2171875, 66.078857421875], + [-68.1867187499999, 65.87099609375], + [-67.866455078125, 65.773681640625], + [-67.936767578125, 65.564892578125], + [-67.56962890625, 65.6435546875], + [-67.11796875, 65.440380859375], + [-67.3365234375, 65.3465820312501], + [-66.697412109375, 64.8151855468751], + [-66.635498046875, 65.000341796875], + [-66.2146484375, 64.722412109375], + [-65.938525390625, 64.8857421875], + [-65.2748046875, 64.63154296875], + [-65.529345703125, 64.50478515625], + [-65.074609375, 64.436669921875], + [-65.21298828125, 64.303271484375], + [-65.580322265625, 64.29384765625], + [-65.169873046875, 64.028173828125], + [-64.678466796875, 64.027978515625], + [-64.79814453125, 63.915966796875], + [-64.4109375, 63.70634765625], + [-64.6646484375, 63.245361328125], + [-65.191845703125, 63.7642578125], + [-65.0689453125, 63.2634765625], + [-64.67236328125, 62.92197265625], + [-65.16279296875, 62.9326171875], + [-65.10849609375, 62.62646484375], + [-66.2240234374999, 63.107177734375], + [-66.228662109375, 62.990966796875], + [-66.414453125, 63.027197265625], + [-66.65498046875, 63.26474609375], + [-66.6974609374999, 63.06953125], + [-67.8932617187499, 63.733740234375], + [-67.72255859375, 63.42275390625], + [-68.49375, 63.72548828125], + [-68.911083984375, 63.70322265625], + [-68.141259765625, 63.172314453125], + [-67.6759765625, 63.0935546875], + [-67.736962890625, 63.0095703125], + [-65.98017578125, 62.20888671875], + [-66.123876953125, 61.89306640625], + [-68.535888671875, 62.2556152343751], + [-69.1255859375, 62.423974609375], + [-69.604736328125, 62.767724609375], + [-70.2361328125, 62.76337890625], + [-70.801416015625, 62.9104980468751], + [-71.10576171875, 63.00224609375], + [-70.946044921875, 63.120703125], + [-71.347265625, 63.06611328125], + [-71.9922363281249, 63.4161621093751], + [-71.380859375, 63.580322265625], + [-72.29013671875, 63.727978515625], + [-72.174267578125, 63.893408203125], + [-72.4984374999999, 63.823486328125], + [-73.454541015625, 64.399267578125], + [-73.2712890625, 64.58251953125], + [-73.9103515625, 64.578125], + [-74.064794921875, 64.424658203125], + [-74.13046875, 64.6078125], + [-74.46123046875, 64.6446777343751], + [-74.681396484375, 64.8306640625], + [-74.91943359375, 64.76552734375], + [-74.6947265625, 64.49658203125], + [-75.7150390625, 64.524365234375], + [-75.76669921875, 64.391943359375], + [-76.85615234375, 64.237646484375], + [-77.760498046875, 64.36015625], + [-78.0452148437499, 64.499267578125], + [-78.09560546875, 64.9392578125], + [-77.360888671875, 65.196533203125], + [-77.3267089843749, 65.453125], + [-75.8283203124999, 65.22705078125], + [-75.452099609375, 64.8416015625], + [-75.35712890625, 65.008740234375], + [-75.798681640625, 65.297509765625], + [-75.16630859375, 65.283935546875], + [-74.1384765625, 65.503466796875], + [-73.55078125, 65.4852539062501], + [-74.41640625, 66.16708984375], + [-73.033251953125, 66.7281738281251], + [-72.7888183593749, 67.030615234375], + [-72.22001953125, 67.254296875], + [-73.2844726562499, 68.3569824218751], + [-73.8205078125, 68.362939453125], + [-73.822119140625, 68.685986328125], + [-74.11796875, 68.7009277343751], + [-73.9892578125, 68.5486328125], + [-74.2701171875, 68.5412109375], + [-74.89296875, 68.8081542968751], + [-74.71669921875, 69.0455078125], + [-76.58505859375, 68.69873046875], + [-76.5572265625, 69.00947265625], + [-75.9537109375, 69.030810546875], + [-75.64775390625, 69.212548828125], + [-76.46494140625, 69.46943359375], + [-76.23408203125, 69.662109375], + [-76.742333984375, 69.572900390625], + [-77.08994140625, 69.635107421875], + [-76.85859375, 69.775390625], + [-77.591650390625, 69.84560546875], + [-77.7740234375, 70.238525390625], + [-78.2828125, 70.229150390625], + [-79.06640625, 70.6035644531251], + [-79.405224609375, 70.400732421875], + [-78.862841796875, 70.24189453125], + [-78.8896484375, 69.977490234375], + [-79.5154296875, 69.8875976562501], + [-81.651953125, 70.09462890625], + [-80.921728515625, 69.730908203125], + [-81.564697265625, 69.942724609375], + [-82.29384765625, 69.8369140625], + [-83.1499511718749, 70.00908203125], + [-83.85908203125, 69.962744140625], + [-85.432373046875, 70.1113769531251], + [-85.780029296875, 70.0366699218751], + [-86.322021484375, 70.14541015625], + [-86.396875, 70.46533203125], + [-87.838134765625, 70.24658203125], + [-88.78271484375, 70.494482421875], + [-89.455908203125, 71.06171875], + [-87.844921875, 70.9443847656251], + [-87.140087890625, 71.01162109375], + [-89.8053710937499, 71.4623046875001], + [-89.8615234375, 72.4119140625001], + [-88.70517578125, 73.403271484375], + [-87.719775390625, 73.722900390625], + [-85.95078125, 73.8501464843751], + [-84.94677734375, 73.721630859375], + [-86.000537109375, 73.3125488281251], + [-86.656298828125, 72.7240234375001], + [-86.21845703125, 71.89912109375], + [-85.023388671875, 71.35322265625], + [-86.58935546875, 71.0107910156251] + ] + ], + [ + [ + [-100.001904296875, 73.9458984375], + [-99.157958984375, 73.731591796875], + [-97.669970703125, 73.887744140625], + [-97.1705078125, 73.824853515625], + [-97.001708984375, 73.66650390625], + [-97.62587890625, 73.502294921875], + [-97.272509765625, 73.38681640625], + [-98.42177734375, 72.941015625], + [-97.636328125, 73.02763671875], + [-97.128125, 72.627587890625], + [-96.59208984375, 72.71025390625], + [-96.44560546875, 72.55244140625], + [-96.80146484375, 72.322412109375], + [-96.6134277343749, 71.8338378906251], + [-97.582275390625, 71.6296875000001], + [-98.18134765625, 71.662451171875], + [-98.322705078125, 71.85234375], + [-98.1986328124999, 71.440869140625], + [-98.6628906249999, 71.302099609375], + [-99.2236328125, 71.387109375], + [-100.594482421875, 72.15234375], + [-101.208544921875, 72.3169921875], + [-101.72392578125, 72.314892578125], + [-102.708740234375, 72.764501953125], + [-102.20400390625, 73.077294921875], + [-101.273193359375, 72.7216796875], + [-100.484765625, 72.77294921875], + [-100.395703125, 72.977001953125], + [-100.128125, 72.906689453125], + [-100.536376953125, 73.1978515625], + [-99.825146484375, 73.2138671875], + [-100.36611328125, 73.359033203125], + [-100.88935546875, 73.275341796875], + [-101.523193359375, 73.486376953125], + [-100.97578125, 73.599755859375], + [-100.5216796875, 73.44931640625], + [-100.96298828125, 73.79140625], + [-99.99111328125, 73.795166015625], + [-100.001904296875, 73.9458984375] + ] + ], + [ + [ + [-98.270361328125, 73.868505859375], + [-98.97392578125, 73.812060546875], + [-99.4169921875, 73.89541015625], + [-97.6982421875, 74.1086914062501], + [-98.270361328125, 73.868505859375] + ] + ], + [ + [ + [-93.170849609375, 74.1609863281251], + [-92.222705078125, 73.97236328125], + [-90.62744140625, 73.9517089843751], + [-90.381396484375, 73.824755859375], + [-92.117919921875, 72.75380859375], + [-94.211328125, 72.75693359375], + [-93.770556640625, 72.6682128906251], + [-93.5551757812499, 72.421142578125], + [-94.037548828125, 72.028759765625], + [-95.007861328125, 72.01279296875], + [-95.6021484375, 72.88447265625], + [-95.63291015625, 73.695458984375], + [-94.697607421875, 73.66357421875], + [-95.134130859375, 73.88125], + [-94.97353515625, 74.04140625], + [-93.170849609375, 74.1609863281251] + ] + ], + [ + [ + [-119.736328125, 74.112646484375], + [-119.20595703125, 74.197998046875], + [-119.11796875, 74.01552734375], + [-118.543994140625, 74.24462890625], + [-117.51484375, 74.23173828125], + [-115.510693359375, 73.61875], + [-115.446875, 73.4388671875], + [-118.961572265625, 72.684130859375], + [-119.512841796875, 72.302685546875], + [-120.1798828125, 72.2126464843751], + [-120.6193359375, 71.50576171875], + [-121.47216796875, 71.389013671875], + [-121.749365234375, 71.444775390625], + [-123.095654296875, 71.093798828125], + [-124.007763671875, 71.67744140625], + [-125.2966796875, 71.973046875], + [-125.8453125, 71.978662109375], + [-123.797265625, 73.7681640625], + [-124.696240234375, 74.348193359375], + [-121.504150390625, 74.5451171875], + [-119.562646484375, 74.2328125], + [-119.736328125, 74.112646484375] + ] + ], + [ + [ + [-97.355517578125, 74.526318359375], + [-97.75, 74.5105468750001], + [-97.4165039062499, 74.6265625], + [-97.355517578125, 74.526318359375] + ] + ], + [ + [ + [-95.306640625, 74.5054199218751], + [-95.850732421875, 74.582470703125], + [-95.510205078125, 74.636767578125], + [-95.306640625, 74.5054199218751] + ] + ], + [ + [ + [-104.119921875, 75.036328125], + [-104.88740234375, 75.14775390625], + [-104.34619140625, 75.429931640625], + [-103.643505859375, 75.186572265625], + [-104.119921875, 75.036328125] + ] + ], + [ + [ + [-93.542578125, 75.0279296875], + [-93.573095703125, 74.6688476562501], + [-94.534521484375, 74.63671875], + [-96.599609375, 75.031787109375], + [-95.9546386718749, 75.443798828125], + [-94.878173828125, 75.630029296875], + [-93.90908203125, 75.422509765625], + [-93.542578125, 75.0279296875] + ] + ], + [ + [ + [-96.078564453125, 75.510107421875], + [-96.91513671875, 75.3796875], + [-96.9828125, 75.5098144531251], + [-96.367822265625, 75.6546386718751], + [-96.078564453125, 75.510107421875] + ] + ], + [ + [ + [-94.5265625, 75.74931640625], + [-94.901220703125, 75.93076171875], + [-94.537890625, 75.9964355468751], + [-94.5265625, 75.74931640625] + ] + ], + [ + [ + [-118.328125, 75.5796875], + [-118.817138671875, 75.522119140625], + [-119.394580078125, 75.617333984375], + [-117.63369140625, 76.115087890625], + [-118.328125, 75.5796875] + ] + ], + [ + [ + [-79.0630859375, 75.92587890625], + [-79.63876953125, 75.8429199218751], + [-79.009326171875, 76.1458984375001], + [-79.0630859375, 75.92587890625] + ] + ], + [ + [ + [-102.22734375, 76.014892578125], + [-102.0080078125, 75.939404296875], + [-102.57958984375, 75.780224609375], + [-103.31474609375, 75.764208984375], + [-103.04150390625, 75.91884765625], + [-103.98525390625, 75.93310546875], + [-103.80078125, 76.03701171875], + [-104.24248046875, 76.0469726562501], + [-104.350634765625, 76.18232421875], + [-102.72802734375, 76.30703125], + [-102.22734375, 76.014892578125] + ] + ], + [ + [ + [-104.0228515625, 76.58310546875], + [-103.051318359375, 76.449853515625], + [-103.311376953125, 76.34755859375], + [-104.35751953125, 76.334619140625], + [-104.585693359375, 76.606494140625], + [-104.07451171875, 76.66611328125], + [-104.0228515625, 76.58310546875] + ] + ], + [ + [ + [-97.700927734375, 76.46650390625], + [-97.89052734375, 75.7603515625], + [-97.40751953125, 75.672509765625], + [-97.33603515625, 75.41982421875], + [-97.6533203125, 75.507763671875], + [-97.87822265625, 75.41611328125], + [-97.67431640625, 75.127294921875], + [-98.0453125, 75.200830078125], + [-98.120947265625, 75.03271484375], + [-100.234375, 75.00771484375], + [-100.48349609375, 75.188427734375], + [-100.145703125, 75.2461425781251], + [-100.7119140625, 75.40634765625], + [-99.194580078125, 75.698388671875], + [-102.58740234375, 75.513671875], + [-102.797509765625, 75.5996582031251], + [-102.1447265625, 75.875048828125], + [-100.972802734375, 75.7984375], + [-101.414990234375, 75.845849609375], + [-101.872119140625, 76.08310546875], + [-101.528955078125, 76.21728515625], + [-102.1046875, 76.3312011718751], + [-101.415185546875, 76.42490234375], + [-99.865478515625, 75.92421875], + [-100.112841796875, 76.1172363281251], + [-99.541064453125, 76.1462890625001], + [-100.414208984375, 76.242529296875], + [-99.977734375, 76.312451171875], + [-100.829736328125, 76.523876953125], + [-99.8140625, 76.6322265625], + [-98.89033203125, 76.465576171875], + [-98.7108398437499, 76.69384765625], + [-97.700927734375, 76.46650390625] + ] + ], + [ + [ + [-101.226123046875, 76.579345703125], + [-101.6130859375, 76.6045898437501], + [-100.269140625, 76.734130859375], + [-101.226123046875, 76.579345703125] + ] + ], + [ + [ + [-108.2923828125, 76.05712890625], + [-107.723486328125, 75.99541015625], + [-108.020703125, 75.80478515625], + [-107.2162109375, 75.891552734375], + [-106.913525390625, 75.679638671875], + [-106.677001953125, 76.02373046875], + [-105.632666015625, 75.9453613281251], + [-105.519482421875, 75.6323730468751], + [-106.092626953125, 75.089453125], + [-107.15341796875, 74.9271484375], + [-108.474755859375, 74.947216796875], + [-108.831298828125, 75.064892578125], + [-112.5193359375, 74.416845703125], + [-113.67158203125, 74.4530273437501], + [-114.3126953125, 74.7150878906251], + [-112.835986328125, 74.9755859375], + [-111.67109375, 75.01943359375], + [-111.09345703125, 75.256298828125], + [-113.711767578125, 75.068603515625], + [-113.8533203125, 75.259375], + [-113.46708984375, 75.41611328125], + [-114.01650390625, 75.43427734375], + [-114.16845703125, 75.239501953125], + [-114.513818359375, 75.27548828125], + [-114.4517578125, 75.087890625], + [-115.0201171875, 74.976171875], + [-115.41318359375, 75.114990234375], + [-115.728857421875, 74.968115234375], + [-116.47607421875, 75.17177734375], + [-117.565234375, 75.233349609375], + [-117.2576171875, 75.459521484375], + [-116.0771484375, 75.49296875], + [-115.141845703125, 75.6785156250001], + [-116.425634765625, 75.5853515625], + [-117.163623046875, 75.644873046875], + [-116.8021484375, 75.77158203125], + [-114.99150390625, 75.896337890625], + [-116.66455078125, 75.9575683593751], + [-116.20986328125, 76.19443359375], + [-114.77861328125, 76.172607421875], + [-115.82216796875, 76.27001953125], + [-114.998486328125, 76.4974609375], + [-114.1939453125, 76.4514648437501], + [-113.823486328125, 76.2068359375], + [-112.697607421875, 76.2017089843751], + [-111.052685546875, 75.54853515625], + [-108.94716796875, 75.541796875], + [-108.944775390625, 75.698974609375], + [-109.8705078125, 75.929052734375], + [-109.48681640625, 76.144677734375], + [-110.314453125, 76.369384765625], + [-109.0982421875, 76.811865234375], + [-108.4669921875, 76.7375976562501], + [-108.2923828125, 76.05712890625] + ] + ], + [ + [ + [-89.7264648437499, 76.507421875], + [-90.55625, 76.7345703125], + [-90.136328125, 76.8369628906251], + [-89.69541015625, 76.741162109375], + [-89.7264648437499, 76.507421875] + ] + ], + [ + [ + [-113.560693359375, 76.74326171875], + [-114.83525390625, 76.794677734375], + [-113.891650390625, 76.894873046875], + [-113.560693359375, 76.74326171875] + ] + ], + [ + [ + [-94.2949707031249, 76.912451171875], + [-93.230029296875, 76.770263671875], + [-93.5345703125, 76.447705078125], + [-92.9953613281249, 76.62041015625], + [-91.305029296875, 76.68076171875], + [-90.5426269531249, 76.495751953125], + [-91.415087890625, 76.4558593750001], + [-89.284521484375, 76.3016113281251], + [-89.406591796875, 76.18916015625], + [-91.40732421875, 76.2200683593751], + [-89.277587890625, 75.795068359375], + [-89.646044921875, 75.5650390625], + [-88.91669921875, 75.453955078125], + [-88.644970703125, 75.658447265625], + [-88.201318359375, 75.5120117187501], + [-87.729736328125, 75.575634765625], + [-87.539111328125, 75.48486328125], + [-87.25693359375, 75.617724609375], + [-85.9514648437499, 75.39501953125], + [-85.972998046875, 75.5287109375], + [-83.931982421875, 75.8189453125], + [-83.2371093749999, 75.750830078125], + [-82.153662109375, 75.8310546875], + [-80.32197265625, 75.6291015625], + [-79.50908203125, 75.259814453125], + [-80.3819824218749, 75.0341796875], + [-79.401416015625, 74.917626953125], + [-79.944482421875, 74.8336425781251], + [-80.34775390625, 74.9029785156251], + [-80.262744140625, 74.58447265625], + [-81.9401855468749, 74.4727050781251], + [-82.735791015625, 74.5302734375], + [-83.5220703125, 74.90146484375], + [-83.5318847656249, 74.585693359375], + [-84.425537109375, 74.5081054687501], + [-85.06142578125, 74.60693359375], + [-85.133447265625, 74.517431640625], + [-85.442333984375, 74.6005859375], + [-85.8080078124999, 74.498974609375], + [-88.423046875, 74.494140625], + [-88.5349609374999, 74.83173828125], + [-89.55869140625, 74.5547363281251], + [-90.553271484375, 74.612744140625], + [-90.880224609375, 74.8177734375], + [-91.1345703125, 74.649853515625], + [-91.54912109375, 74.65556640625], + [-92.3892578125, 75.263330078125], + [-92.185107421875, 75.846533203125], + [-93.091748046875, 76.35400390625], + [-95.273876953125, 76.264404296875], + [-96.0396972656249, 76.48671875], + [-95.6509765625, 76.58466796875], + [-96.880712890625, 76.7383300781251], + [-96.4015625, 76.797216796875], + [-96.75830078125, 76.97177734375], + [-95.84951171875, 77.0662109375001], + [-94.2949707031249, 76.912451171875] + ] + ], + [ + [ + [-115.55126953125, 77.36328125], + [-116.32919921875, 77.137060546875], + [-115.81005859375, 76.939111328125], + [-116.252734375, 76.9014160156251], + [-115.9462890625, 76.711279296875], + [-116.99921875, 76.531591796875], + [-117.23359375, 76.2815429687501], + [-117.99296875, 76.4058105468751], + [-117.880810546875, 76.8050781250001], + [-118.79140625, 76.5129882812501], + [-119.080712890625, 76.1240722656251], + [-119.58037109375, 76.326513671875], + [-119.526123046875, 75.9972167968751], + [-119.912890625, 75.858837890625], + [-120.40888671875, 75.825634765625], + [-120.848388671875, 76.182666015625], + [-121.2134765625, 75.9836914062501], + [-122.533056640625, 75.950927734375], + [-122.592724609375, 76.162060546875], + [-122.902783203125, 76.134716796875], + [-122.519384765625, 76.353173828125], + [-121.5611328125, 76.453466796875], + [-119.090185546875, 77.305078125], + [-116.8435546875, 77.33955078125], + [-117.03974609375, 77.4651367187501], + [-116.511328125, 77.547607421875], + [-115.55126953125, 77.36328125] + ] + ], + [ + [ + [-89.833251953125, 77.2676269531251], + [-90.228271484375, 77.212451171875], + [-90.993212890625, 77.3294921875], + [-91.01904296875, 77.643896484375], + [-89.83896484375, 77.49140625], + [-89.833251953125, 77.2676269531251] + ] + ], + [ + [ + [-104.558154296875, 77.141748046875], + [-105.215087890625, 77.182080078125], + [-106.035595703125, 77.7398437500001], + [-105.587890625, 77.735986328125], + [-104.542236328125, 77.337744140625], + [-104.558154296875, 77.141748046875] + ] + ], + [ + [ + [-95.484375, 77.7919921875], + [-93.3009765625, 77.7397949218751], + [-93.5439453125, 77.466650390625], + [-95.987060546875, 77.484130859375], + [-96.194580078125, 77.700537109375], + [-95.484375, 77.7919921875] + ] + ], + [ + [ + [-101.6935546875, 77.6965820312501], + [-102.37783203125, 77.728125], + [-102.447705078125, 77.8806152343751], + [-101.193212890625, 77.82978515625], + [-101.00205078125, 77.735107421875], + [-101.6935546875, 77.6965820312501] + ] + ], + [ + [ + [-113.832470703125, 77.7546386718751], + [-114.28720703125, 77.7214843750001], + [-114.980419921875, 77.9154296875], + [-114.33037109375, 78.0775390625], + [-113.832470703125, 77.7546386718751] + ] + ], + [ + [ + [-110.458056640625, 78.10322265625], + [-109.622265625, 78.074755859375], + [-110.865625, 77.834130859375], + [-110.152734375, 77.7629394531251], + [-110.198486328125, 77.52451171875], + [-112.37265625, 77.364111328125], + [-113.16435546875, 77.5302734375], + [-113.215185546875, 77.903515625], + [-110.458056640625, 78.10322265625] + ] + ], + [ + [ + [-109.815966796875, 78.650390625], + [-109.48447265625, 78.31640625], + [-111.169189453125, 78.3862792968751], + [-111.51748046875, 78.2747070312501], + [-112.13125, 78.366064453125], + [-113.223046875, 78.2979003906251], + [-112.855859375, 78.466845703125], + [-110.877587890625, 78.73505859375], + [-109.815966796875, 78.650390625] + ] + ], + [ + [ + [-96.2044921874999, 78.531298828125], + [-94.915380859375, 78.39052734375], + [-95.329248046875, 78.225048828125], + [-94.93427734375, 78.075634765625], + [-96.9896484374999, 77.806005859375], + [-97.658154296875, 78.090625], + [-96.944677734375, 78.15185546875], + [-98.04951171875, 78.325927734375], + [-98.3326171875, 78.7735351562501], + [-97.38232421875, 78.78291015625], + [-96.2044921874999, 78.531298828125] + ] + ], + [ + [ + [-103.426025390625, 79.315625], + [-102.576171875, 78.87939453125], + [-101.703662109375, 79.07890625], + [-101.128125, 78.80166015625], + [-100.435498046875, 78.8203125], + [-99.609423828125, 78.5830566406251], + [-99.16640625, 77.85693359375], + [-100.274658203125, 77.83271484375], + [-101.07412109375, 78.19384765625], + [-102.606982421875, 78.24892578125], + [-102.73134765625, 78.371044921875], + [-103.94658203125, 78.260009765625], + [-104.76357421875, 78.35166015625], + [-104.909619140625, 78.55263671875], + [-103.5705078125, 78.5398437500001], + [-104.020849609375, 78.634912109375], + [-103.37158203125, 78.736328125], + [-104.185009765625, 78.7812988281251], + [-104.151953125, 78.989892578125], + [-104.8955078125, 78.808154296875], + [-104.74677734375, 79.027099609375], + [-105.53564453125, 79.0325195312501], + [-105.51455078125, 79.24248046875], + [-105.3876953125, 79.323583984375], + [-103.426025390625, 79.315625] + ] + ], + [ + [ + [-98.7916015625, 79.9811035156251], + [-98.94521484375, 79.724072265625], + [-100.0568359375, 79.8982421875001], + [-100.053271484375, 80.093359375], + [-99.15322265625, 80.12421875], + [-98.7916015625, 79.9811035156251] + ] + ], + [ + [ + [-91.885546875, 81.1328613281251], + [-90.643017578125, 80.593701171875], + [-89.2355957031249, 80.51064453125], + [-88.85732421875, 80.1662109375], + [-88.19990234375, 80.111474609375], + [-88.5248046875, 80.4180175781251], + [-87.675, 80.3721191406251], + [-87.922314453125, 80.097705078125], + [-86.977197265625, 79.89423828125], + [-87.2951660156249, 79.58017578125], + [-86.336962890625, 79.6349609375], + [-86.00703125, 79.479443359375], + [-85.6478515625, 79.6114257812501], + [-85.042138671875, 79.2845703125], + [-86.957177734375, 78.9749023437501], + [-87.6173828125, 78.6763183593751], + [-88.0401855468749, 78.9953125], + [-87.982861328125, 78.537060546875], + [-88.7416015625, 78.584033203125], + [-88.822412109375, 78.185888671875], + [-90.037109375, 78.6068359375], + [-89.52568359375, 78.159619140625], + [-90.297216796875, 78.32802734375], + [-90.614404296875, 78.149853515625], + [-92.35126953125, 78.312890625], + [-92.8482421875, 78.460107421875], + [-91.86689453125, 78.54267578125], + [-93.2666015625, 78.60830078125], + [-93.634423828125, 78.750927734375], + [-93.15986328125, 78.775634765625], + [-94.114599609375, 78.92890625], + [-92.547216796875, 79.2826171875], + [-91.29990234375, 79.372705078125], + [-92.821923828125, 79.44990234375], + [-93.933154296875, 79.29072265625], + [-94.110302734375, 79.4015625], + [-95.103173828125, 79.289892578125], + [-95.662890625, 79.52734375], + [-94.40185546875, 79.736328125], + [-95.73935546875, 79.66015625], + [-96.5890625, 79.916650390625], + [-96.7732421875, 80.135791015625], + [-94.6458984374999, 80.04873046875], + [-94.26259765625, 80.194873046875], + [-95.405078125, 80.1350097656251], + [-96.3940917968749, 80.3150390625], + [-95.549072265625, 80.3666015625], + [-95.926953125, 80.720654296875], + [-93.9279296875, 80.5591796875], + [-95.51474609375, 80.838134765625], + [-94.980517578125, 81.049658203125], + [-93.28671875, 81.10029296875], + [-94.2201171875, 81.33076171875], + [-93.03466796875, 81.3462890625], + [-91.885546875, 81.1328613281251] + ] + ], + [ + [ + [-69.4888671875, 83.016796875], + [-66.42255859375, 82.92685546875], + [-68.4693359375, 82.653369140625], + [-65.2990234375, 82.7996093750001], + [-64.98388671875, 82.902294921875], + [-64.50400390625, 82.77841796875], + [-63.641015625, 82.81259765625], + [-63.2467773437499, 82.4501953125], + [-62.4751953125, 82.519580078125], + [-61.39248046875, 82.44189453125], + [-61.615380859375, 82.184423828125], + [-64.435791015625, 81.742626953125], + [-66.625732421875, 81.61640625], + [-68.6885253906249, 81.293310546875], + [-64.7800781249999, 81.49287109375], + [-69.55068359375, 80.383251953125], + [-70.71259765625, 80.5395996093751], + [-70.264892578125, 80.23359375], + [-72.05595703125, 80.1232421875], + [-70.5684082031249, 80.093701171875], + [-71.387841796875, 79.7617675781251], + [-72.4365234375, 79.694384765625], + [-74.394482421875, 79.874072265625], + [-73.4724609375, 79.7564453125], + [-73.3615234375, 79.50400390625], + [-75.50341796875, 79.41416015625], + [-76.898828125, 79.5123046875], + [-75.602734375, 79.2395507812501], + [-74.481201171875, 79.2294921875001], + [-74.64091796875, 79.035546875], + [-78.581640625, 79.075], + [-77.882763671875, 78.9423828125], + [-76.255859375, 79.0068359375], + [-74.486328125, 78.75009765625], + [-74.87861328125, 78.54482421875], + [-76.41611328125, 78.5115234375001], + [-75.19345703125, 78.327734375], + [-75.865966796875, 78.009814453125], + [-78.01259765625, 77.9460449218751], + [-78.076171875, 77.51904296875], + [-78.70849609375, 77.342138671875], + [-80.573046875, 77.3147949218751], + [-81.65908203125, 77.525439453125], + [-81.3013671875, 77.3440429687501], + [-82.056787109375, 77.296533203125], + [-81.75634765625, 77.2040039062501], + [-79.497265625, 77.1960937500001], + [-78.97919921875, 76.89287109375], + [-78.2888671875, 76.977978515625], + [-77.9833007812499, 76.7549804687501], + [-78.284326171875, 76.571240234375], + [-80.79970703125, 76.173583984375], + [-80.9745117187499, 76.470068359375], + [-81.7173828125, 76.494970703125], + [-82.529833984375, 76.723291015625], + [-82.2331542968749, 76.4658203125], + [-83.885693359375, 76.453125], + [-84.223779296875, 76.675341796875], + [-84.275341796875, 76.3565429687501], + [-85.141259765625, 76.3045898437501], + [-86.4537109375, 76.58486328125], + [-86.680224609375, 76.376611328125], + [-87.35419921875, 76.4480468750001], + [-87.489794921875, 76.58583984375], + [-87.49755859375, 76.386279296875], + [-88.39599609375, 76.4052734375], + [-88.495849609375, 76.7728515625], + [-88.54580078125, 76.4208984375], + [-89.36962890625, 76.474462890625], + [-89.499755859375, 76.826806640625], + [-88.39814453125, 77.103955078125], + [-86.812255859375, 77.184912109375], + [-87.6814453125, 77.436376953125], + [-88.0169921875, 77.7847167968751], + [-86.755078125, 77.863720703125], + [-85.5884765625, 77.4611328125], + [-84.738671875, 77.36103515625], + [-83.7212890625, 77.414208984375], + [-82.7103515625, 77.84951171875], + [-82.5953125, 77.992138671875], + [-83.77939453125, 77.5326171875], + [-85.28935546875, 77.559033203125], + [-85.54755859375, 77.927685546875], + [-84.6154296875, 78.195703125], + [-84.222705078125, 78.176025390625], + [-84.9103515624999, 78.239697265625], + [-84.783203125, 78.5275878906251], + [-85.5859375, 78.1095703125], + [-86.2177734375, 78.081201171875], + [-85.9200683593749, 78.34287109375], + [-86.9132324218749, 78.126806640625], + [-87.5517578125, 78.176611328125], + [-86.80791015625, 78.774365234375], + [-85.003759765625, 78.912255859375], + [-83.271435546875, 78.7703125], + [-81.75009765625, 78.97578125], + [-82.43876953125, 78.903662109375], + [-84.41201171875, 78.99658203125], + [-84.38359375, 79.1185546875], + [-83.57587890625, 79.053662109375], + [-86.420751953125, 79.84521484375], + [-86.49853515625, 80.258251953125], + [-83.7236328125, 80.228955078125], + [-81.68837890625, 79.685791015625], + [-80.475927734375, 79.60625], + [-80.124462890625, 79.6694824218751], + [-81.01015625, 79.693115234375], + [-82.98701171875, 80.322607421875], + [-76.86298828125, 80.8647949218751], + [-78.7162109374999, 80.95166015625], + [-76.885107421875, 81.4302734375001], + [-81.00703125, 80.6548828125], + [-82.884326171875, 80.5775390625], + [-82.22236328125, 80.772314453125], + [-84.417822265625, 80.5267578125], + [-86.250341796875, 80.5657714843751], + [-86.603076171875, 80.664013671875], + [-85.6393066406249, 80.9246093750001], + [-83.288818359375, 81.14794921875], + [-85.780859375, 81.03505859375], + [-87.3298828125, 80.669775390625], + [-88.003662109375, 80.675390625], + [-89.16689453125, 80.94130859375], + [-86.4767578124999, 81.0357421875001], + [-84.9412109375, 81.28623046875], + [-87.27509765625, 81.080810546875], + [-89.623046875, 81.032470703125], + [-89.947314453125, 81.1726562500001], + [-89.20869140625, 81.25009765625], + [-89.673681640625, 81.32861328125], + [-87.597021484375, 81.525830078125], + [-88.479052734375, 81.5646484375], + [-90.41630859375, 81.40537109375], + [-89.8216796875, 81.63486328125], + [-91.2923828125, 81.571240234375], + [-91.64755859375, 81.683837890625], + [-88.06318359375, 82.0964843750001], + [-87.018212890625, 81.958740234375], + [-86.626806640625, 82.051025390625], + [-85.04482421875, 81.9828125], + [-86.615625, 82.2185546875001], + [-84.896826171875, 82.4494140625], + [-82.63369140625, 82.077294921875], + [-82.5369140625, 82.247265625], + [-79.465625, 81.851123046875], + [-82.4475585937499, 82.39501953125], + [-81.68115234375, 82.51865234375], + [-82.116845703125, 82.628662109375], + [-80.8625, 82.571533203125], + [-81.01015625, 82.779052734375], + [-78.748779296875, 82.67939453125], + [-80.154931640625, 82.9111328125], + [-77.61806640625, 82.895849609375], + [-76.009375, 82.53515625], + [-75.565625, 82.608544921875], + [-77.1249023437499, 83.008544921875], + [-74.41416015625, 83.013134765625], + [-72.65869140625, 82.721630859375], + [-73.4418945312499, 82.904833984375], + [-72.811669921875, 83.081201171875], + [-71.983203125, 83.101416015625], + [-70.940380859375, 82.90224609375], + [-71.084814453125, 83.082666015625], + [-69.969921875, 83.1161132812501], + [-69.4888671875, 83.016796875] + ] + ] + ] + }, + "properties": { + "name": "Canada", + "childNum": 110 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.52765819747012, 47.2702698977367], + [9.46249431093294, 47.1985896225458], + [9.46249431093294, 47.0901074796886], + [9.40945859664723, 47.0201967654029], + [9.57997913393674, 47.0585638862931], + [9.58027343750001, 47.057373046875], + [10.13349609375, 46.851513671875], + [10.3494140625, 46.984765625], + [10.41494140625, 46.964404296875], + [10.45458984375, 46.8994140625], + [10.45283203125, 46.86494140625], + [10.4060546875, 46.73486328125], + [10.39794921875, 46.6650390625], + [10.4306640625, 46.550048828125], + [10.1955078125, 46.62109375], + [10.1375, 46.61435546875], + [10.08701171875, 46.59990234375], + [10.06123046875, 46.54677734375], + [10.03828125, 46.483203125], + [10.04560546875, 46.447900390625], + [10.08193359375, 46.420751953125], + [10.10966796875, 46.362841796875], + [10.1283203125, 46.238232421875], + [10.08056640625, 46.227978515625], + [10.041015625, 46.2380859375], + [9.93925781250002, 46.36181640625], + [9.88447265625001, 46.3677734375], + [9.78779296875001, 46.346044921875], + [9.63945312500002, 46.2958984375], + [9.57958984375, 46.29609375], + [9.52871093750002, 46.306201171875], + [9.42763671875002, 46.48232421875], + [9.39931640625002, 46.4806640625], + [9.30439453125001, 46.495556640625], + [9.20341796875002, 46.21923828125], + [9.11874162946429, 46.014892578125], + [8.97551618303573, 45.8167745535714], + [8.74961495535715, 46.0224637276786], + [8.81855468750001, 46.0771484375], + [8.45839843750002, 46.2458984375], + [8.370703125, 46.4451171875], + [8.29853515625001, 46.40341796875], + [8.23193359375, 46.3412109375], + [8.08154296875, 46.256005859375], + [7.9931640625, 46.01591796875], + [7.32792968750002, 45.912353515625], + [7.12900390625001, 45.880419921875], + [7.05576171875001, 45.90380859375], + [7.02109375, 45.92578125], + [6.95371093750001, 46.017138671875], + [6.89726562500002, 46.0517578125], + [6.77207031250001, 46.16513671875], + [6.75810546875002, 46.415771484375], + [6.57822265625001, 46.437353515625], + [6.42890625000001, 46.430517578125], + [6.321875, 46.393701171875], + [6.23466796875002, 46.3326171875], + [6.19941406250001, 46.19306640625], + [6.08662109375001, 46.147021484375], + [6.00664062500002, 46.142333984375], + [5.97148437500002, 46.151220703125], + [5.97001953125002, 46.214697265625], + [6.0361328125, 46.2380859375], + [6.09589843750001, 46.27939453125], + [6.12968750000002, 46.5669921875], + [6.41015625, 46.755419921875], + [6.42900390625002, 46.832275390625], + [6.45625, 46.94833984375], + [6.62480468750002, 47.004345703125], + [6.66689453125002, 47.026513671875], + [6.68808593750001, 47.058251953125], + [6.82070312500002, 47.16318359375], + [6.95205078125002, 47.2671875], + [6.978515625, 47.30205078125], + [7.00058593750001, 47.322509765625], + [7.00058593750001, 47.339453125], + [6.900390625, 47.39423828125], + [6.968359375, 47.45322265625], + [7.13603515625002, 47.48984375], + [7.34316406250002, 47.43310546875], + [7.615625, 47.592724609375], + [8.45400390625002, 47.59619140625], + [8.55947265625002, 47.6240234375], + [8.57050781250001, 47.63779296875], + [8.56708984375001, 47.651904296875], + [8.55234375, 47.659130859375], + [8.45175781250001, 47.651806640625], + [8.41328125000001, 47.6626953125], + [8.40341796875001, 47.68779296875], + [8.43574218750001, 47.73134765625], + [8.57265625000002, 47.775634765625], + [9.52402343750001, 47.52421875], + [9.62587890625002, 47.467041015625], + [9.52753906250001, 47.270751953125], + [9.52765819747012, 47.2702698977367] + ] + ] + }, + "properties": { + "name": "Switzerland", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-67.2888671875, -55.77685546875], + [-67.5599609375, -55.7248046875], + [-67.39736328125, -55.58515625], + [-67.2888671875, -55.77685546875] + ] + ], + [ + [ + [-67.079931640625, -55.15380859375], + [-67.339697265625, -55.292578125], + [-67.4947265625, -55.17744140625], + [-68.07001953125, -55.22109375], + [-68.3013671875, -54.9806640625], + [-67.245263671875, -54.97763671875], + [-67.079931640625, -55.15380859375] + ] + ], + [ + [ + [-69.702978515625, -54.91904296875], + [-68.90078125, -55.0177734375], + [-68.4580078125, -54.95966796875], + [-68.61328125, -55.15556640625], + [-68.282666015625, -55.25517578125], + [-68.04833984375, -55.6431640625], + [-68.867041015625, -55.4501953125], + [-68.890087890625, -55.2412109375], + [-69.192626953125, -55.171875], + [-69.359228515625, -55.3006835937499], + [-69.180859375, -55.4748046875], + [-69.41181640625, -55.44423828125], + [-69.97978515625, -55.1474609375], + [-69.8844238281249, -54.88203125], + [-69.702978515625, -54.91904296875] + ] + ], + [ + [ + [-70.9916015625, -54.86796875], + [-70.804833984375, -54.96767578125], + [-70.4175292968749, -54.90888671875], + [-70.2978515625, -55.11376953125], + [-70.4755859374999, -55.17705078125], + [-71.43720703125, -54.8892578125], + [-70.9916015625, -54.86796875] + ] + ], + [ + [ + [-71.390478515625, -54.0328125], + [-71.021923828125, -54.11181640625], + [-71.14326171875, -54.3740234375], + [-71.473291015625, -54.23115234375], + [-71.94853515625, -54.30087890625], + [-72.21044921875, -54.04775390625], + [-71.996484375, -53.88486328125], + [-71.390478515625, -54.0328125] + ] + ], + [ + [ + [-72.9232421875, -53.481640625], + [-72.8822265625, -53.5783203125], + [-72.482275390625, -53.5880859375], + [-72.205419921875, -53.807421875], + [-72.408544921875, -54.00380859375], + [-72.87099609375, -54.1265625], + [-72.76376953125, -53.86484375], + [-73.0394531249999, -53.8328125], + [-73.08076171875, -53.998046875], + [-73.21064453125, -53.98583984375], + [-73.31435546875, -53.72919921875], + [-73.845458984375, -53.54580078125], + [-73.4470703124999, -53.41005859375], + [-72.9232421875, -53.481640625] + ] + ], + [ + [ + [-74.3857421874999, -52.92236328125], + [-73.65400390625, -53.06982421875], + [-73.135205078125, -53.35390625], + [-73.56728515625, -53.3068359375], + [-73.8669433593749, -53.096875], + [-74.27021484375, -53.08154296875], + [-74.71201171875, -52.74873046875], + [-74.3857421874999, -52.92236328125] + ] + ], + [ + [ + [-68.629931640625, -52.65263671875], + [-68.6532226562499, -54.85361328125], + [-69.4862792968749, -54.85888671875], + [-69.7234375, -54.712109375], + [-70.49716796875, -54.8095703125], + [-71.83154296875, -54.626171875], + [-71.927734375, -54.5287109375], + [-71.800146484375, -54.4339843749999], + [-71.079931640625, -54.44423828125], + [-70.797265625, -54.32724609375], + [-70.701123046875, -54.48544921875], + [-70.310986328125, -54.528515625], + [-70.8630859374999, -54.11044921875], + [-70.867724609375, -53.8841796875], + [-70.531298828125, -53.62734375], + [-70.379736328125, -53.98671875], + [-70.6298339843749, -54.00556640625], + [-70.5353027343749, -54.1361328125], + [-70.168994140625, -54.379296875], + [-69.7418457031249, -54.3058593750001], + [-69.2531738281249, -54.557421875], + [-69.0443359375, -54.40673828125], + [-69.988134765625, -54.10908203125], + [-70.151123046875, -53.8880859375], + [-70.09111328125, -53.72177734375], + [-69.35595703125, -53.41630859375], + [-69.63701171875, -53.33408203125], + [-70.329296875, -53.37763671875], + [-70.4433593749999, -53.085546875], + [-70.130615234375, -52.9427734375], + [-70.3801269531249, -52.751953125], + [-69.93544921875, -52.82109375], + [-69.4140625, -52.48623046875], + [-69.167041015625, -52.667578125], + [-68.789794921875, -52.5767578125], + [-68.629931640625, -52.65263671875] + ] + ], + [ + [ + [-74.8229492187499, -51.63017578125], + [-74.53681640625, -51.96513671875], + [-74.694482421875, -52.27919921875], + [-74.8518066406249, -52.270703125], + [-75.10537109375, -51.7888671875], + [-74.8229492187499, -51.63017578125] + ] + ], + [ + [ + [-74.558642578125, -51.27705078125], + [-74.620361328125, -51.395703125], + [-75.04736328125, -51.39833984375], + [-75.289111328125, -51.625390625], + [-75.153662109375, -51.27880859375], + [-74.736669921875, -51.2076171875], + [-74.558642578125, -51.27705078125] + ] + ], + [ + [ + [-75.302001953125, -50.6799804687501], + [-75.411376953125, -50.76435546875], + [-75.42763671875, -50.48056640625], + [-75.11533203125, -50.51044921875], + [-75.302001953125, -50.6799804687501] + ] + ], + [ + [ + [-75.05478515625, -50.29609375], + [-75.44912109375, -50.343359375], + [-75.32666015625, -50.01181640625], + [-74.8759765625, -50.1099609375], + [-75.05478515625, -50.29609375] + ] + ], + [ + [ + [-75.106689453125, -48.8365234375], + [-75.38994140625, -49.1591796875], + [-75.641162109375, -49.19541015625], + [-75.487646484375, -49.082421875], + [-75.58310546875, -48.85888671875], + [-75.106689453125, -48.8365234375] + ] + ], + [ + [ + [-74.476171875, -49.1478515625], + [-74.5947265625, -50.006640625], + [-74.76298828125, -50.01142578125], + [-74.880419921875, -49.72587890625], + [-74.723828125, -49.423828125], + [-74.960107421875, -49.5330078125], + [-75.066015625, -49.85234375], + [-75.5498046874999, -49.79130859375], + [-75.305859375, -49.49404296875], + [-75.46748046875, -49.35888671875], + [-75.08603515625, -49.27021484375], + [-75.21015625, -49.148046875], + [-74.94921875, -48.96015625], + [-74.896240234375, -48.733203125], + [-74.5460937499999, -48.76689453125], + [-74.476171875, -49.1478515625] + ] + ], + [ + [ + [-75.51025390625, -48.7634765625001], + [-75.650927734375, -48.586328125], + [-75.5714843749999, -48.0958984375], + [-75.39140625, -48.0197265625], + [-75.15849609375, -48.62265625], + [-75.51025390625, -48.7634765625001] + ] + ], + [ + [ + [-74.56728515625, -48.5919921875], + [-74.923046875, -48.62646484375], + [-75.212890625, -48.14169921875], + [-75.198291015625, -47.974609375], + [-74.895654296875, -47.83935546875], + [-74.56728515625, -48.5919921875] + ] + ], + [ + [ + [-75.11220703125, -47.8376953125], + [-75.26103515625, -47.7638671875], + [-74.92646484375, -47.72314453125], + [-75.11220703125, -47.8376953125] + ] + ], + [ + [ + [-74.312890625, -45.69150390625], + [-74.46552734375, -45.7572265625], + [-74.68984375, -45.66259765625], + [-74.310546875, -45.17265625], + [-74.312890625, -45.69150390625] + ] + ], + [ + [ + [-73.632177734375, -44.821484375], + [-73.81845703125, -44.6521484375], + [-73.7239257812499, -44.54423828125], + [-73.632177734375, -44.821484375] + ] + ], + [ + [ + [-72.9861328125, -44.780078125], + [-73.228466796875, -44.8599609375], + [-73.3970703125, -44.77431640625], + [-73.445068359375, -44.641015625], + [-73.2077148437499, -44.3349609375], + [-72.7763671875, -44.50859375], + [-72.9861328125, -44.780078125] + ] + ], + [ + [ + [-73.7353515625, -44.39453125], + [-74.00205078125, -44.59091796875], + [-73.728173828125, -45.1958984375], + [-74.016259765625, -45.344921875], + [-74.6177734375, -44.64794921875], + [-74.501806640625, -44.47353515625], + [-74.097216796875, -44.38935546875], + [-73.994921875, -44.140234375], + [-73.70322265625, -44.27412109375], + [-73.7353515625, -44.39453125] + ] + ], + [ + [ + [-73.81064453125, -43.82724609375], + [-73.9556640625, -43.92197265625], + [-74.14296875, -43.87216796875], + [-73.81064453125, -43.82724609375] + ] + ], + [ + [ + [-73.773388671875, -43.3458984375], + [-74.114404296875, -43.35791015625], + [-74.387353515625, -43.231640625], + [-74.036669921875, -41.7955078125], + [-73.52783203125, -41.8962890625], + [-73.422900390625, -42.19287109375], + [-73.47080078125, -42.46630859375], + [-73.7892578124999, -42.5857421875], + [-73.436328125, -42.9365234375], + [-73.7496582031249, -43.15908203125], + [-73.773388671875, -43.3458984375] + ] + ], + [ + [ + [-78.804150390625, -33.646484375], + [-78.9894531249999, -33.66171875], + [-78.87744140625, -33.5751953125], + [-78.804150390625, -33.646484375] + ] + ], + [ + [ + [-109.27998046875, -27.1404296875], + [-109.434130859375, -27.1712890625], + [-109.390478515625, -27.068359375], + [-109.27998046875, -27.1404296875] + ] + ], + [ + [ + [-67.1948730468749, -22.8216796875], + [-67.0087890624999, -23.0013671875001], + [-67.356201171875, -24.0337890625], + [-68.25029296875, -24.3919921875], + [-68.56201171875, -24.74736328125], + [-68.384228515625, -25.09189453125], + [-68.59208984375, -25.42001953125], + [-68.414501953125, -26.1537109375], + [-68.5916015625, -26.47041015625], + [-68.31865234375, -26.9732421875], + [-68.59208984375, -27.1400390625], + [-68.8463378906249, -27.1537109375], + [-69.1744140625, -27.92470703125], + [-69.65693359375, -28.41357421875], + [-69.827880859375, -29.10322265625], + [-70.026806640625, -29.3240234375], + [-69.9599609375, -30.0783203125], + [-69.8442871093749, -30.175], + [-69.95634765625, -30.358203125], + [-70.15322265625, -30.3609375], + [-70.3090820312499, -31.02265625], + [-70.5195800781249, -31.1484375], + [-70.585205078125, -31.56943359375], + [-70.25439453125, -31.95771484375], + [-70.36376953125, -32.08349609375], + [-70.02197265625, -32.8845703125], + [-70.08486328125, -33.2017578125], + [-69.81962890625, -33.2837890625], + [-69.85244140625, -34.22431640625], + [-70.05205078125, -34.30078125], + [-70.3931640625, -35.146875], + [-70.55517578125, -35.246875], + [-70.41572265625, -35.523046875], + [-70.40478515625, -36.06171875], + [-71.055517578125, -36.52373046875], + [-71.1921875, -36.84365234375], + [-71.167578125, -37.7623046875], + [-70.858642578125, -38.6044921875], + [-71.4015625, -38.93505859375], + [-71.539453125, -39.60244140625], + [-71.719921875, -39.63525390625], + [-71.659765625, -40.02080078125], + [-71.8183105468749, -40.17666015625], + [-71.708984375, -40.38173828125], + [-71.9321289062499, -40.69169921875], + [-71.911279296875, -41.650390625], + [-71.75, -42.04677734375], + [-72.1082031249999, -42.25185546875], + [-72.146435546875, -42.9900390625], + [-71.750634765625, -43.2373046875], + [-71.90498046875, -43.34755859375], + [-71.680078125, -43.92958984375], + [-71.8200195312499, -44.38310546875], + [-71.21259765625, -44.4412109375], + [-71.159716796875, -44.56025390625], + [-71.2611328125, -44.7630859375], + [-72.063720703125, -44.771875], + [-72.04169921875, -44.90419921875], + [-71.5962890625, -44.97919921875], + [-71.34931640625, -45.33193359375], + [-71.74619140625, -45.57890625], + [-71.63154296875, -45.9537109375], + [-71.87568359375, -46.160546875], + [-71.699658203125, -46.6513671875], + [-71.940234375, -46.83125], + [-71.90498046875, -47.20166015625], + [-72.345947265625, -47.49267578125], + [-72.517919921875, -47.8763671875], + [-72.3283203125, -48.11005859375], + [-72.354736328125, -48.3658203125001], + [-72.582861328125, -48.475390625], + [-72.65126953125, -48.8416015625], + [-73.033642578125, -49.01435546875], + [-73.13525390625, -49.30068359375], + [-73.461572265625, -49.3138671875], + [-73.55419921875, -49.4638671875], + [-73.50126953125, -50.12529296875], + [-73.1529296875, -50.73828125], + [-72.509814453125, -50.60751953125], + [-72.340234375, -50.6818359375], + [-72.407666015625, -51.5408203125], + [-71.91865234375, -51.98955078125], + [-69.9602539062499, -52.008203125], + [-68.443359375, -52.356640625], + [-69.241015625, -52.20546875], + [-69.6203125, -52.46474609375], + [-70.7951171875, -52.76875], + [-70.995849609375, -53.779296875], + [-71.29775390625, -53.8833984375], + [-72.1744140625, -53.63232421875], + [-72.412890625, -53.3501953125], + [-71.9416992187499, -53.23408203125], + [-71.89169921875, -53.52353515625], + [-71.791455078125, -53.4845703125], + [-71.74052734375, -53.2326171875], + [-71.28896484375, -53.03369140625], + [-71.2271484375, -52.81064453125], + [-71.387744140625, -52.7642578125], + [-72.27802734375, -53.13232421875], + [-72.54892578125, -53.4607421875], + [-73.052734375, -53.2434570312501], + [-72.727685546875, -52.7623046875], + [-72.453466796875, -52.814453125], + [-72.117578125, -52.65], + [-71.511279296875, -52.60537109375], + [-72.22568359375, -52.52099609375], + [-72.4376953125, -52.62578125], + [-72.712109375, -52.535546875], + [-73.1224609375, -53.07392578125], + [-73.64521484375, -52.83701171875], + [-73.2408203125, -52.70712890625], + [-73.12392578125, -52.48798828125], + [-73.244140625, -52.6240234375], + [-73.585693359375, -52.6857421875], + [-74.014453125, -52.63935546875], + [-74.2649414062499, -52.1048828125], + [-73.83447265625, -52.233984375], + [-73.6843261718749, -52.077734375], + [-73.2604492187499, -52.1578125], + [-72.79501953125, -51.9495117187501], + [-72.570849609375, -52.2000976562499], + [-72.67705078125, -52.38466796875], + [-72.52333984375, -52.25546875], + [-72.624609375, -51.946484375], + [-72.4896484375, -51.763671875], + [-72.76123046875, -51.5732421875], + [-73.16875, -51.45390625], + [-72.600048828125, -51.79912109375], + [-73.5181640625, -52.041015625], + [-73.7526367187499, -51.7955078125], + [-74.1966796875, -51.68056640625], + [-73.92978515625, -51.61787109375], + [-73.939501953125, -51.2663085937501], + [-74.81474609375, -51.062890625], + [-75.094677734375, -50.68125], + [-74.6857421875, -50.6620117187499], + [-74.77587890625, -50.469921875], + [-74.644482421875, -50.3609375], + [-74.365576171875, -50.487890625], + [-74.139404296875, -50.8177734375], + [-73.80654296875, -50.93837890625], + [-73.654443359375, -50.49267578125], + [-73.97802734375, -50.82705078125], + [-74.1855957031249, -50.4853515625], + [-73.950341796875, -50.510546875], + [-74.62958984375, -50.19404296875], + [-74.333740234375, -49.974609375], + [-73.95859375, -49.9947265625], + [-74.32392578125, -49.7833984375], + [-74.2908203125, -49.6041015625], + [-73.8363769531249, -49.609375], + [-74.0944335937499, -49.4296875], + [-73.9349609374999, -49.0208984375], + [-74.2212890625, -49.5005859375], + [-74.366552734375, -49.40048828125], + [-74.341015625, -48.595703125], + [-74.00908203125, -48.475], + [-74.4744140625, -48.46396484375], + [-74.58466796875, -47.9990234375], + [-73.391064453125, -48.1458984375], + [-73.609912109375, -47.9939453125], + [-73.715869140625, -47.65546875], + [-73.940869140625, -47.92939453125], + [-74.2270507812499, -47.9689453125], + [-74.654931640625, -47.70224609375], + [-74.5337890625, -47.56767578125], + [-74.24296875, -47.679296875], + [-74.13408203125, -47.5908203125], + [-74.482666015625, -47.43046875], + [-74.1583984375, -47.18251953125], + [-74.31357421875, -46.78818359375], + [-74.45419921875, -46.766796875], + [-74.512255859375, -46.88515625], + [-75.00595703125, -46.74111328125], + [-74.9841796875, -46.512109375], + [-75.54033203125, -46.69873046875], + [-75.43037109375, -46.9345703125], + [-75.706396484375, -46.7052734375], + [-74.924462890625, -46.15966796875], + [-75.0666992187499, -45.87490234375], + [-74.157861328125, -45.7671875], + [-74.122705078125, -45.49619140625], + [-73.9571777343749, -45.40439453125], + [-73.825, -45.446875], + [-74.019921875, -46.055859375], + [-74.39296875, -46.2173828125001], + [-73.967578125, -46.1541015625], + [-73.8787109374999, -45.846875], + [-73.7352539062499, -45.81171875], + [-73.708154296875, -46.0703125], + [-73.9486328125, -46.53310546875], + [-73.845361328125, -46.566015625], + [-73.5918457031249, -45.89912109375], + [-73.73076171875, -45.47998046875], + [-73.2662109375, -45.34619140625], + [-72.933837890625, -45.45234375], + [-73.444970703125, -45.23818359375], + [-73.362451171875, -44.97822265625], + [-72.73896484375, -44.7341796875], + [-72.680078125, -44.5939453125], + [-72.6638671875, -44.43642578125], + [-73.265087890625, -44.16865234375], + [-73.224462890625, -43.89794921875], + [-73.068798828125, -43.86201171875], + [-72.99658203125, -43.63154296875], + [-73.0759765625, -43.3236328125], + [-72.7580078125, -43.039453125], + [-72.848046875, -42.669140625], + [-72.77392578125, -42.50517578125], + [-72.6318359375, -42.50966796875], + [-72.7732421875, -42.25771484375], + [-72.6310546875, -42.1998046875], + [-72.412353515625, -42.38818359375], + [-72.4994140625, -41.980859375], + [-72.824072265625, -41.9087890625], + [-72.360400390625, -41.64912109375], + [-72.31826171875, -41.4990234375], + [-72.5423828125, -41.690625], + [-72.95283203125, -41.51474609375], + [-73.241796875, -41.780859375], + [-73.6240234375, -41.7736328125], + [-73.73515625, -41.74248046875], + [-73.62392578125, -41.58134765625], + [-73.8107421875, -41.51748046875], + [-73.9658691406249, -41.11826171875], + [-73.67099609375, -39.96318359375], + [-73.410400390625, -39.78916015625], + [-73.22646484375, -39.2244140625], + [-73.52021484375, -38.509375], + [-73.464794921875, -38.04033203125], + [-73.66181640625, -37.69853515625], + [-73.66240234375, -37.341015625], + [-73.60166015625, -37.1884765625], + [-73.215966796875, -37.16689453125], + [-73.11806640625, -36.68837890625], + [-72.5873535156249, -35.75966796875], + [-72.62392578125, -35.5857421875], + [-72.2237792968749, -35.09619140625], + [-72.00283203125, -34.16533203125], + [-71.66435546875, -33.65263671875], + [-71.74296875, -33.0951171875], + [-71.45224609375, -32.6595703125], + [-71.708935546875, -30.62802734375], + [-71.669482421875, -30.33037109375], + [-71.400390625, -30.14296875], + [-71.31572265625, -29.64970703125], + [-71.5192382812499, -28.92646484375], + [-71.30673828125, -28.6724609375], + [-71.0865234375, -27.814453125], + [-70.92578125, -27.588671875], + [-70.64658203125, -26.32939453125], + [-70.713720703125, -25.7841796875], + [-70.445361328125, -25.17265625], + [-70.5741210937499, -24.6443359375], + [-70.3923339843749, -23.56591796875], + [-70.593359375, -23.25546875], + [-70.56318359375, -23.05703125], + [-70.3316894531249, -22.8486328125], + [-70.080029296875, -21.3568359375], + [-70.1970214843749, -20.725390625], + [-70.157421875, -19.705859375], + [-70.41826171875, -18.34560546875], + [-69.9263671875, -18.2060546875], + [-69.802587890625, -17.990234375], + [-69.8520996093749, -17.70380859375], + [-69.684765625, -17.6498046875], + [-69.58642578125, -17.5732421875], + [-69.5109375, -17.5060546875], + [-69.31337890625, -17.9431640625], + [-69.28232421875, -17.96484375], + [-69.0939453124999, -18.05048828125], + [-69.145458984375, -18.14404296875], + [-69.0922851562499, -18.282421875], + [-69.0268066406249, -18.65625], + [-68.978857421875, -18.81298828125], + [-68.968310546875, -18.96796875], + [-68.857958984375, -19.0933593750001], + [-68.620556640625, -19.2966796875], + [-68.5478515625, -19.34111328125], + [-68.4919921875, -19.38193359375], + [-68.470166015625, -19.4099609375], + [-68.462890625, -19.4328125], + [-68.57529296875, -19.56015625], + [-68.698291015625, -19.72109375], + [-68.69619140625, -19.74072265625], + [-68.5782714843749, -19.85654296875], + [-68.559375, -19.90234375], + [-68.560693359375, -19.96708984375], + [-68.759326171875, -20.11552734375], + [-68.7451660156249, -20.45859375], + [-68.484326171875, -20.62841796875], + [-68.558251953125, -20.901953125], + [-68.197021484375, -21.30029296875], + [-68.18642578125, -21.6185546875], + [-67.88173828125, -22.493359375], + [-67.879443359375, -22.82294921875], + [-67.579931640625, -22.89169921875], + [-67.3622558593749, -22.85517578125], + [-67.1948730468749, -22.8216796875] + ] + ] + ] + }, + "properties": { + "name": "Chile", + "childNum": 26 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [88.582763671875, 28.0719803017799], + [88.692626953125, 28.0525908233398], + [88.79150390625, 28.023500048883], + [88.9013671875, 27.8487904598621], + [88.857421875, 27.7127102608875], + [88.79150390625, 27.5861978576927], + [88.79150390625, 27.4497903297842], + [88.890380859375, 27.371767300523], + [88.9892578125, 27.3229749472457], + [88.978271484375, 27.4985267227983], + [89.088134765625, 27.6154060133996], + [89.219970703125, 27.7516076875494], + [89.351806640625, 27.8779283336795], + [89.47265625, 28.0041018303687], + [89.593505859375, 28.1204386871011], + [89.703369140625, 28.2076085953274], + [89.769287109375, 28.2366494440145], + [89.901123046875, 28.2172897559571], + [90.0439453125, 28.1591896340467], + [90.186767578125, 28.1688751800633], + [90.3515625, 28.1204386871011], + [90.494384765625, 28.0913662814069], + [90.626220703125, 28.0816737290443], + [90.7470703125, 28.0816737290443], + [90.94482421875, 28.0622859998122], + [91.07666015625, 28.023500048883], + [91.20849609375, 28.023500048883], + [91.263427734375, 28.0622859998122], + [91.505126953125, 28.0138013763807], + [91.60400390625, 27.926474039865], + [91.60400390625, 27.8390760947778], + [91.593017578125, 27.6640689653845], + [91.614990234375, 27.5764600762627], + [91.702880859375, 27.508271413876], + [91.900634765625, 27.4985267227983], + [92.054443359375, 27.4497903297842], + [92.13134765625, 27.3229749472457], + [92.109375, 27.2155562090297], + [92.010498046875, 27.1764691318989], + [92.076416015625, 27.0591257843741], + [92.164306640625, 26.8730809659384], + [92.4169921875, 26.9024768862798], + [92.724609375, 27.0101964319315], + [93.087158203125, 27.0004080035218], + [93.18603515625, 26.9514530834983], + [93.3837890625, 26.9710376062556], + [93.603515625, 26.9906187229647], + [93.724365234375, 27.0004080035218], + [93.84521484375, 27.1862421856087], + [93.955078125, 27.3034519910345], + [94.1748046875, 27.4595393327179], + [94.295654296875, 27.5667214304097], + [94.4384765625, 27.6154060133996], + [95.009765625, 27.8293608597898], + [95.16357421875, 27.8779283336795], + [95.3173828125, 27.9847001186127], + [95.4931640625, 28.1398159127545], + [95.679931640625, 28.2366494440145], + [95.8447265625, 28.2850332946407], + [96.031494140625, 28.2076085953274], + [96.119384765625, 28.2172897559571], + [96.1962890625, 28.2172897559571], + [96.35009765625, 28.1688751800633], + [96.492919921875, 28.0913662814069], + [96.65771484375, 28.0041018303687], + [96.778564453125, 27.9361805667694], + [96.8994140625, 27.8876392171365], + [96.9873046875, 27.8099277809084], + [97.196044921875, 27.8585039548412], + [97.3828125, 27.926474039865], + [97.36083984375, 28.1591896340467], + [97.415771484375, 28.323724553546], + [97.591552734375, 28.5362745129899], + [97.745361328125, 28.459033019728], + [97.855224609375, 28.3527337602378], + [97.998046875, 28.323724553546], + [98.074951171875, 28.1979265572262], + [98.140869140625, 28.0428947725616], + [98.173828125, 27.8487904598621], + [98.23974609375, 27.7029837355259], + [98.37158203125, 27.469287473692], + [98.492431640625, 27.6543381066919], + [98.712158203125, 27.5472415462533], + [98.7451171875, 27.410785702577], + [98.778076171875, 27.1862421856087], + [98.7451171875, 26.9024768862798], + [98.7451171875, 26.745610382199], + [98.778076171875, 26.6179967221168], + [98.72314453125, 26.391869671769], + [98.67919921875, 26.2244469456343], + [98.72314453125, 26.1455762075923], + [98.624267578125, 26.0863881493949], + [98.5693359375, 26.0074241568022], + [98.61328125, 25.9284070326941], + [98.624267578125, 25.8493368917076], + [98.514404296875, 25.7899995628736], + [98.404541015625, 25.6415263730658], + [98.3056640625, 25.5523536521655], + [98.184814453125, 25.5919941802547], + [98.140869140625, 25.5027845487554], + [98.0859375, 25.393660521998], + [97.998046875, 25.2546326197495], + [97.921142578125, 25.1950004243075], + [97.84423828125, 25.244695951306], + [97.767333984375, 25.0855988970648], + [97.745361328125, 24.9760994936954], + [97.80029296875, 24.8565343393107], + [97.6025390625, 24.7867345419889], + [97.525634765625, 24.7168954558593], + [97.525634765625, 24.5371293990799], + [97.569580078125, 24.427145340082], + [97.66845703125, 24.417142025372], + [97.679443359375, 24.3270765400186], + [97.745361328125, 24.2369470039175], + [97.66845703125, 24.1066471792018], + [97.547607421875, 23.966175871265], + [97.53662109375, 23.9059269273147], + [97.635498046875, 23.8556980097512], + [97.833251953125, 23.9561363339693], + [98.06396484375, 24.0564964907685], + [98.294677734375, 24.1166749617513], + [98.50341796875, 24.1267019586817], + [98.701171875, 24.1267019586817], + [98.865966796875, 24.1267019586817], + [98.843994140625, 24.0364307246674], + [98.701171875, 23.966175871265], + [98.72314453125, 23.835600986621], + [98.85498046875, 23.7551817661126], + [98.843994140625, 23.6042618470702], + [98.7890625, 23.4934766609609], + [98.876953125, 23.4330090774203], + [98.887939453125, 23.2110582764882], + [99.0087890625, 23.1706638271022], + [99.107666015625, 23.1403599878861], + [99.228515625, 23.0999442125314], + [99.47021484375, 23.0797317624499], + [99.580078125, 23.019076187293], + [99.55810546875, 22.8875622151745], + [99.42626953125, 22.9280416656518], + [99.305419921875, 22.7761815050865], + [99.3603515625, 22.5835825377339], + [99.261474609375, 22.339914425562], + [99.140625, 22.1772317928213], + [99.1845703125, 22.1059987997506], + [99.459228515625, 22.0856399016503], + [99.700927734375, 22.0652780677658], + [99.931640625, 22.0143606531032], + [99.986572265625, 21.8716946351427], + [100.01953125, 21.6982654968525], + [100.118408203125, 21.6676386067816], + [100.118408203125, 21.5041855007784], + [100.283203125, 21.5041855007784], + [100.458984375, 21.5246272205453], + [100.601806640625, 21.4939635630645], + [100.8544921875, 21.6267926347994], + [100.96435546875, 21.7288858739515], + [101.085205078125, 21.7901070598079], + [101.14013671875, 21.6574281973707], + [101.173095703125, 21.5144067200303], + [101.195068359375, 21.2996106049456], + [101.282958984375, 21.2074587304826], + [101.53564453125, 21.2177006731323], + [101.722412109375, 21.1869727141238], + [101.788330078125, 21.2688997199677], + [101.77734375, 21.4632934418993], + [101.71142578125, 21.7186798057032], + [101.590576171875, 21.993988560906], + [101.524658203125, 22.197577453351], + [101.57958984375, 22.3500758061249], + [101.66748046875, 22.4516488191262], + [101.77734375, 22.461802035334], + [101.942138671875, 22.461802035334], + [102.073974609375, 22.4719545077392], + [102.227783203125, 22.461802035334], + [102.45849609375, 22.6849841428721], + [102.557373046875, 22.7660514691269], + [102.733154296875, 22.6849841428721], + [102.886962890625, 22.5734382645724], + [102.974853515625, 22.5024074594978], + [103.07373046875, 22.5125569540515], + [103.172607421875, 22.6342926937935], + [103.282470703125, 22.7457891424259], + [103.359375, 22.8065671002715], + [103.4912109375, 22.6342926937935], + [103.612060546875, 22.7255238110894], + [103.699951171875, 22.7863107891043], + [103.897705078125, 22.5632932447078], + [104.0185546875, 22.5430009659219], + [104.08447265625, 22.7356568522065], + [104.161376953125, 22.8166941268998], + [104.43603515625, 22.7153900193359], + [104.578857421875, 22.8369459209439], + [104.732666015625, 22.9078034510584], + [104.83154296875, 22.9988515941429], + [104.83154296875, 23.0999442125314], + [105.05126953125, 23.2211549818466], + [105.205078125, 23.3019011241889], + [105.303955078125, 23.3523425975811], + [105.413818359375, 23.2716270539183], + [105.567626953125, 23.1807635831294], + [105.633544921875, 23.1100492973567], + [105.8203125, 23.0089642696731], + [105.897216796875, 22.9381596393164], + [106.116943359375, 22.9887381609607], + [106.28173828125, 22.8774404648971], + [106.54541015625, 22.9280416656518], + [106.798095703125, 22.8571947009696], + [106.710205078125, 22.6241521580904], + [106.58935546875, 22.5937260639293], + [106.54541015625, 22.3907139168386], + [106.69921875, 22.2585967409757], + [106.710205078125, 22.0856399016503], + [106.72119140625, 21.9838014173847], + [106.951904296875, 21.9532356003645], + [107.07275390625, 21.9124709526803], + [107.138671875, 21.820707853875], + [107.259521484375, 21.7288858739515], + [107.33642578125, 21.7288858739515], + [107.413330078125, 21.5757189324585], + [107.523193359375, 21.6370052111063], + [107.73193359375, 21.6063653172034], + [107.8857421875, 21.6267926347994], + [108.017578125, 21.5655020297453], + [108.25927734375, 21.6267926347994], + [108.5009765625, 21.6370052111063], + [108.52294921875, 21.8003080509726], + [108.577880859375, 21.7799053425296], + [108.6767578125, 21.6778482933475], + [108.78662109375, 21.6472170653878], + [108.907470703125, 21.6676386067816], + [109.09423828125, 21.5348470020488], + [109.09423828125, 21.4326168644774], + [109.193115234375, 21.4121622297254], + [109.35791015625, 21.4530686330868], + [109.48974609375, 21.4939635630645], + [109.57763671875, 21.6063653172034], + [109.6875, 21.6063653172034], + [109.84130859375, 21.4428431071877], + [109.9072265625, 21.4223899052314], + [109.75341796875, 21.2791373941087], + [109.676513671875, 21.1767286409708], + [109.632568359375, 21.0332372344673], + [109.676513671875, 20.8690777320185], + [109.742431640625, 20.7663868125152], + [109.79736328125, 20.6533461480761], + [109.852294921875, 20.468189222641], + [109.951171875, 20.3343256168355], + [110.159912109375, 20.2828086913301], + [110.4345703125, 20.2828086913301], + [110.5224609375, 20.4476023975942], + [110.423583984375, 20.6430655467265], + [110.3466796875, 20.7663868125152], + [110.23681640625, 20.8690777320185], + [110.269775390625, 20.9511799939762], + [110.41259765625, 21.0024710543567], + [110.5224609375, 20.8998713470764], + [110.577392578125, 20.9819567428323], + [110.577392578125, 21.1050002753821], + [110.72021484375, 21.2996106049456], + [110.8740234375, 21.4019338382352], + [111.0498046875, 21.4428431071877], + [111.181640625, 21.4530686330868], + [111.368408203125, 21.4735175333499], + [111.62109375, 21.5246272205453], + [111.763916015625, 21.5961505764614], + [111.961669921875, 21.5961505764614], + [112.005615234375, 21.6778482933475], + [111.983642578125, 21.7697028994097], + [112.1044921875, 21.820707853875], + [112.17041015625, 21.7799053425296], + [112.25830078125, 21.7288858739515], + [112.401123046875, 21.7390912177186], + [112.47802734375, 21.7799053425296], + [112.587890625, 21.7697028994097], + [112.796630859375, 21.9022779666686], + [112.840576171875, 21.820707853875], + [112.950439453125, 21.8309066650698], + [113.038330078125, 21.9532356003645], + [113.060302734375, 22.0347298170442], + [113.203125, 21.9226632093259], + [113.280029296875, 21.8818898076293], + [113.44482421875, 22.0245456012403], + [113.57666015625, 22.1874049913988], + [113.70849609375, 22.2992614997412], + [113.829345703125, 22.217920166311], + [113.994140625, 22.2382599295643], + [114.071044921875, 22.2280904167845], + [114.27978515625, 22.1874049913988], + [114.2138671875, 22.3805555014215], + [114.3017578125, 22.5227057034825], + [114.41162109375, 22.5125569540515], + [114.58740234375, 22.4719545077392], + [114.58740234375, 22.5937260639293], + [114.598388671875, 22.7052554772075], + [114.708251953125, 22.6038688428957], + [114.85107421875, 22.6241521580904], + [114.9169921875, 22.7052554772075], + [115.13671875, 22.8470706878391], + [115.3125, 22.7255238110894], + [115.499267578125, 22.6647098101768], + [115.631103515625, 22.6748473511885], + [115.6201171875, 22.8369459209439], + [115.828857421875, 22.7964393209195], + [116.092529296875, 22.826820400544], + [116.224365234375, 22.8976832106481], + [116.400146484375, 22.9786239703849], + [116.54296875, 23.0291873467446], + [116.60888671875, 23.1706638271022], + [116.7626953125, 23.2615341676518], + [116.806640625, 23.392681978613], + [117.1142578125, 23.402764905408], + [117.0703125, 23.5237000588241], + [117.158203125, 23.6042618470702], + [117.344970703125, 23.5438451365058], + [117.48779296875, 23.6747128366088], + [117.5537109375, 23.8456498876594], + [117.586669921875, 23.7551817661126], + [117.7294921875, 23.9159703705102], + [117.916259765625, 24.0564964907685], + [118.10302734375, 24.206889622398], + [118.19091796875, 24.3270765400186], + [118.0810546875, 24.4471495897308], + [118.201904296875, 24.4371478616156], + [118.421630859375, 24.417142025372], + [118.5205078125, 24.5271348225978], + [118.663330078125, 24.5970801370964], + [118.817138671875, 24.7667845228745], + [118.828125, 24.8764699108315], + [118.9599609375, 24.9760994936954], + [119.02587890625, 25.0955485396043], + [119.15771484375, 25.1054973730147], + [119.300537109375, 25.2049411535691], + [119.366455078125, 25.3043037644036], + [119.234619140625, 25.3837352547069], + [119.366455078125, 25.4432746123057], + [119.4873046875, 25.373809171544], + [119.6630859375, 25.393660521998], + [119.849853515625, 25.5127000076205], + [119.761962890625, 25.6316215772585], + [119.696044921875, 25.7801071184222], + [119.72900390625, 26.0271701404974], + [119.674072265625, 26.1751589901781], + [119.805908203125, 26.3229601989254], + [119.937744140625, 26.4902404588696], + [120.179443359375, 26.7357990204317], + [120.234375, 26.961245770527], + [120.41015625, 27.1764691318989], + [120.618896484375, 27.3132138985683], + [120.728759765625, 27.5569819203383], + [120.7177734375, 27.6835280837878], + [120.87158203125, 27.8779283336795], + [121.036376953125, 27.8876392171365], + [121.168212890625, 27.8585039548412], + [121.146240234375, 27.9847001186127], + [121.04736328125, 28.0816737290443], + [121.190185546875, 28.023500048883], + [121.278076171875, 28.1204386871011], + [121.365966796875, 28.2172897559571], + [121.453857421875, 28.3043806829628], + [121.5966796875, 28.2850332946407], + [121.673583984375, 28.4397138170279], + [121.57470703125, 28.6713109158808], + [121.6845703125, 28.6905876542507], + [121.6845703125, 28.8061735088548], + [121.695556640625, 28.9889223719041], + [121.66259765625, 29.1329701308786], + [121.717529296875, 29.1233732108192], + [121.871337890625, 29.0753751795583], + [121.9921875, 29.200123477645], + [121.981201171875, 29.410890376109], + [121.915283203125, 29.6116701151974], + [122.047119140625, 29.7166812872311], + [122.49755859375, 29.7071393481341], + [122.486572265625, 29.9549345496561], + [122.420654296875, 30.2021136790972], + [122.530517578125, 30.4865508425885], + [122.32177734375, 30.5622609504994], + [122.135009765625, 30.4581443510181], + [122.047119140625, 30.2970178833721], + [121.7724609375, 30.0976132772171], + [121.695556640625, 30.1831218421955], + [121.541748046875, 30.3349538819886], + [121.343994140625, 30.4107817908459], + [121.168212890625, 30.524413269924], + [121.212158203125, 30.6757154041677], + [121.53076171875, 30.8079106813665], + [121.739501953125, 30.8456474201826], + [121.981201171875, 30.6379120283411], + [122.135009765625, 30.6284588747536], + [122.080078125, 30.8739402378876], + [121.981201171875, 31.0717559028201], + [122.080078125, 31.3067151550752], + [122.025146484375, 31.5785354264734], + [121.959228515625, 31.7748776185074], + [121.61865234375, 32.0732655510424], + [121.5087890625, 32.1477110659557], + [121.475830078125, 32.2964197989691], + [121.22314453125, 32.4356130411628], + [121.014404296875, 32.5931059742654], + [120.926513671875, 32.7318408968657], + [120.95947265625, 32.9164853473144], + [120.838623046875, 33.1375511923461], + [120.706787109375, 33.4039312002347], + [120.5859375, 33.6694969727955], + [120.41015625, 33.9798087287246], + [120.322265625, 34.2163446884346], + [120.201416015625, 34.3343644870263], + [120.003662109375, 34.4431586745058], + [119.783935546875, 34.5789524103695], + [119.5751953125, 34.6964611727235], + [119.322509765625, 34.8138033171132], + [119.212646484375, 34.8859309407532], + [119.234619140625, 35.0389920467808], + [119.37744140625, 35.1019340572461], + [119.443359375, 35.2456190942068], + [119.564208984375, 35.406960932702], + [119.6630859375, 35.5858515932324], + [119.937744140625, 35.6929946320988], + [120.16845703125, 35.7732575910373], + [120.311279296875, 35.9691150757748], + [120.498046875, 36.1023764487364], + [120.76171875, 36.2885631983624], + [120.82763671875, 36.4477991295848], + [121.04736328125, 36.5802466014987], + [121.409912109375, 36.7300795070784], + [121.61865234375, 36.8092847020594], + [121.893310546875, 36.8884080431382], + [122.047119140625, 36.9586711315303], + [122.16796875, 36.8708321556463], + [122.40966796875, 36.8268747428773], + [122.574462890625, 36.976226784641], + [122.4755859375, 37.0902398030721], + [122.640380859375, 37.2653099556188], + [122.662353515625, 37.4486965859104], + [122.376708984375, 37.483576550427], + [122.2119140625, 37.5358659779204], + [121.92626953125, 37.5097258429375], + [121.640625, 37.474858084971], + [121.387939453125, 37.5707052423312], + [121.2451171875, 37.6664292120906], + [121.014404296875, 37.7533440131066], + [120.87158203125, 37.7967631768216], + [120.7177734375, 37.7880813841205], + [120.498046875, 37.6838203266938], + [120.25634765625, 37.5358659779204], + [120.091552734375, 37.4399740522706], + [119.915771484375, 37.3963461331892], + [119.915771484375, 37.2653099556188], + [119.630126953125, 37.1428034437168], + [119.55322265625, 37.1252862849668], + [119.3115234375, 37.2040815558985], + [119.15771484375, 37.2303283876039], + [119.102783203125, 37.2827946491105], + [119.00390625, 37.483576550427], + [119.02587890625, 37.6490340215787], + [119.168701171875, 37.7012073647414], + [119.278564453125, 37.7880813841205], + [119.278564453125, 37.857507156252], + [119.11376953125, 37.8835249808713], + [119.02587890625, 38.0307856938229], + [118.817138671875, 38.1518374030068], + [118.58642578125, 38.0740414594196], + [118.3447265625, 38.1086276643213], + [118.048095703125, 38.1950215579558], + [117.784423828125, 38.3588878586668], + [117.630615234375, 38.5395726720391], + [117.696533203125, 38.7626503383342], + [117.762451171875, 38.8739285392363], + [117.8173828125, 39.1044888094405], + [117.97119140625, 39.1896908210968], + [118.092041015625, 39.1896908210968], + [118.157958984375, 39.0533181067413], + [118.32275390625, 38.9764924855394], + [118.54248046875, 38.95086540092], + [118.5205078125, 39.0789080970648], + [118.6962890625, 39.1300602421351], + [118.98193359375, 39.1896908210968], + [119.168701171875, 39.2832938689385], + [119.234619140625, 39.410733055085], + [119.300537109375, 39.5802902744087], + [119.410400390625, 39.7916548352534], + [119.652099609375, 39.9518589266301], + [119.8828125, 40.0192013076868], + [120.05859375, 40.0864772938088], + [120.399169921875, 40.178873314347], + [120.640869140625, 40.3465441211801], + [120.684814453125, 40.5388515253547], + [120.78369140625, 40.6389673438172], + [121.014404296875, 40.8054938438942], + [121.2451171875, 40.89690577586], + [121.563720703125, 40.89690577586], + [121.717529296875, 40.9135125761276], + [121.937255859375, 40.7971774151877], + [122.047119140625, 40.7222826728315], + [122.244873046875, 40.572240117769], + [122.27783203125, 40.3883968738836], + [122.069091796875, 40.2795256688129], + [121.893310546875, 40.1284910568541], + [121.673583984375, 39.9939556939733], + [121.5087890625, 39.8000959563484], + [121.519775390625, 39.6564560481283], + [121.365966796875, 39.6056881783208], + [121.234130859375, 39.5464119196867], + [121.300048828125, 39.4531611280739], + [121.46484375, 39.410733055085], + [121.563720703125, 39.317300373271], + [121.673583984375, 39.3767719966164], + [121.57470703125, 39.2237427413913], + [121.640625, 39.1300602421351], + [121.497802734375, 39.0618491342915], + [121.35498046875, 38.9764924855394], + [121.11328125, 38.9166815363751], + [121.09130859375, 38.7969083034843], + [121.168212890625, 38.6940850475683], + [121.563720703125, 38.7797813780492], + [121.695556640625, 38.8824811975508], + [121.695556640625, 38.9850327869591], + [121.8603515625, 38.95086540092], + [122.047119140625, 39.0789080970648], + [122.16796875, 39.2152313091049], + [122.27783203125, 39.3342974298073], + [122.3876953125, 39.3937545922435], + [122.816162109375, 39.5718222373437], + [122.969970703125, 39.6649137374913], + [123.211669921875, 39.7071866568265], + [123.50830078125, 39.7916548352534], + [123.837890625, 39.81697509049], + [124.090576171875, 39.7916548352534], + [124.244384765625, 39.8928799002948], + [124.4091796875, 40.0612565814047], + [124.56298828125, 40.2292181887012], + [124.8046875, 40.3465441211801], + [125.057373046875, 40.5054462840521], + [125.299072265625, 40.6389673438172], + [125.44189453125, 40.6972990086368], + [125.66162109375, 40.7888599444948], + [125.826416015625, 40.9052096972736], + [126.14501953125, 41.079351149469], + [126.353759765625, 41.1786539723317], + [126.463623046875, 41.3273263203662], + [126.551513671875, 41.4180150360802], + [126.661376953125, 41.6236553906864], + [126.881103515625, 41.8122671435998], + [127.056884765625, 41.7958880981914], + [127.08984375, 41.5825796014303], + [127.188720703125, 41.4921208396878], + [127.41943359375, 41.4427263776721], + [127.628173828125, 41.4262531950727], + [127.9248046875, 41.4509614012039], + [128.023681640625, 41.4180150360802], + [128.155517578125, 41.4180150360802], + [128.232421875, 41.5414776667903], + [128.243408203125, 41.6811175629065], + [128.12255859375, 41.7713116797641], + [128.089599609375, 41.951319946797], + [128.232421875, 42.0411340094081], + [128.4521484375, 42.0329743324414], + [128.73779296875, 42.0248136078178], + [128.836669921875, 42.0248136078178], + [129.0234375, 42.1308213018881], + [129.210205078125, 42.2122451628858], + [129.287109375, 42.39912215986], + [129.364013671875, 42.4477814346225], + [129.462890625, 42.4072346615519], + [129.61669921875, 42.4396741781494], + [129.70458984375, 42.4558876419717], + [129.79248046875, 42.5935326256499], + [129.79248046875, 42.7470121731807], + [129.90234375, 42.9001126552533], + [129.96826171875, 42.9644625738713], + [130.1220703125, 42.972501586026], + [130.220947265625, 42.8195807157959], + [130.308837890625, 42.6662807056493], + [130.40771484375, 42.5935326256499], + [130.484619140625, 42.5773548395579], + [130.5615234375, 42.6258756025914], + [130.550537109375, 42.4964029409371], + [130.67138671875, 42.3016903282445], + [130.594482421875, 42.5126017157367], + [130.45166015625, 42.7550795450721], + [130.572509765625, 42.8437513262902], + [130.80322265625, 42.8920641880734], + [131.055908203125, 42.9001126552533], + [131.209716796875, 42.9242517538707], + [131.209716796875, 43.0528339176279], + [131.253662109375, 43.2131833007389], + [131.319580078125, 43.3810975872786], + [131.253662109375, 43.5565103750476], + [131.253662109375, 43.7155347262051], + [131.253662109375, 43.8899753738369], + [131.319580078125, 44.0639066080178], + [131.055908203125, 44.7935309047441], + [130.95703125, 44.8714427501659], + [131.209716796875, 44.9725706822406], + [131.473388671875, 44.9803423808497], + [131.63818359375, 45.0735206067097], + [131.72607421875, 45.2052634561624], + [131.923828125, 45.3289786621856], + [131.94580078125, 45.2748864370489], + [132.86865234375, 45.0735206067097], + [132.945556640625, 45.0114186422773], + [133.077392578125, 45.0967914639474], + [133.154296875, 45.2207426025537], + [133.121337890625, 45.3367019099681], + [133.209228515625, 45.4447167915956], + [133.39599609375, 45.5832897560063], + [133.472900390625, 45.6831580325331], + [133.52783203125, 45.8287992519213], + [133.61572265625, 45.8976545343469], + [133.692626953125, 46.0198533728763], + [133.70361328125, 46.1189415061071], + [133.780517578125, 46.2026463806102], + [133.857421875, 46.2558468184803], + [133.92333984375, 46.3620930120499], + [133.868408203125, 46.4605655457854], + [133.9013671875, 46.5437496027386], + [134.022216796875, 46.6946673077731], + [134.044189453125, 46.890231573594], + [134.09912109375, 47.0476686404608], + [134.18701171875, 47.1224758166411], + [134.176025390625, 47.2568640440887], + [134.208984375, 47.3537106195136], + [134.4287109375, 47.4355191531953], + [134.67041015625, 47.53203824676], + [134.769287109375, 47.6653873563265], + [134.747314453125, 47.7836346352638], + [134.62646484375, 47.8647739557922], + [134.560546875, 47.9825684192141], + [134.593505859375, 48.1074311884804], + [134.681396484375, 48.2319913432096], + [134.75830078125, 48.3781454697624], + [134.637451171875, 48.4364899559442], + [134.395751953125, 48.4219101094288], + [134.241943359375, 48.3854421911548], + [134.01123046875, 48.3489481240138], + [133.802490234375, 48.2393089902491], + [133.857421875, 48.1734124865808], + [133.692626953125, 48.1953874083334], + [133.582763671875, 48.1880634812114], + [133.472900390625, 48.1147666318763], + [133.275146484375, 48.1000946979738], + [133.077392578125, 48.1000946979738], + [132.86865234375, 48.026672195436], + [132.78076171875, 47.9531449501559], + [132.6708984375, 47.9605023889151], + [132.626953125, 47.8057761193681], + [132.5830078125, 47.746711194756], + [132.330322265625, 47.7245445490997], + [132.1875, 47.7023684665737], + [131.912841796875, 47.6801829464841], + [131.605224609375, 47.7023684665737], + [131.077880859375, 47.7393233613686], + [130.836181640625, 47.7910161782626], + [130.75927734375, 47.9678587799925], + [130.660400390625, 48.0780789434986], + [130.693359375, 48.2246726495652], + [130.80322265625, 48.3781454697624], + [130.7373046875, 48.4947675153073], + [130.572509765625, 48.5747899109289], + [130.49560546875, 48.7054628957905], + [130.6494140625, 48.8647147618028], + [130.462646484375, 48.9080593996501], + [130.198974609375, 48.8791671489602], + [130.01220703125, 48.9946359835341], + [129.759521484375, 49.217597105176], + [129.627685546875, 49.2678045506375], + [129.539794921875, 49.4109731996958], + [129.429931640625, 49.4467002969547], + [129.35302734375, 49.3609115471262], + [129.22119140625, 49.3895244515822], + [128.8916015625, 49.475263243038], + [128.792724609375, 49.5679778589272], + [128.638916015625, 49.6107099380742], + [128.38623046875, 49.5751024717232], + [128.14453125, 49.5608522061919], + [127.891845703125, 49.6249456465015], + [127.650146484375, 49.724479188713], + [127.55126953125, 49.85215166777], + [127.518310546875, 49.9936154625411], + [127.606201171875, 50.1698617460073], + [127.44140625, 50.2893392532918], + [127.342529296875, 50.3875078030031], + [127.320556640625, 50.5064398321055], + [127.320556640625, 50.6111317133236], + [127.232666015625, 50.7434077402921], + [127.1337890625, 50.9030328311126], + [126.97998046875, 51.0483011333122], + [126.9580078125, 51.227527905265], + [126.968994140625, 51.3443386605992], + [126.837158203125, 51.4471603469801], + [126.80419921875, 51.5770695372257], + [126.661376953125, 51.7338326727411], + [126.485595703125, 51.9713458088517], + [126.54052734375, 52.0930076396382], + [126.397705078125, 52.2748801306805], + [126.298828125, 52.476089041239], + [126.112060546875, 52.6030475337285], + [125.9912109375, 52.7495937267411], + [125.6396484375, 53.0412130407565], + [125.474853515625, 53.1006208792143], + [125.3759765625, 53.1204052831066], + [124.969482421875, 53.2257684357902], + [124.87060546875, 53.1599467884681], + [124.716796875, 53.1994519028316], + [124.43115234375, 53.2783530175318], + [124.2333984375, 53.3374334371297], + [124.112548828125, 53.3898807515603], + [123.870849609375, 53.4749699995486], + [123.629150390625, 53.5141845207711], + [123.486328125, 53.5598889724546], + [123.343505859375, 53.5468355919001], + [123.255615234375, 53.5272479701025], + [123.123779296875, 53.5272479701025], + [122.969970703125, 53.5011170429432], + [122.750244140625, 53.4749699995486], + [122.5634765625, 53.4749699995486], + [122.332763671875, 53.4488068354276], + [122.27783203125, 53.4945817931672], + [122.1240234375, 53.4422635250086], + [121.937255859375, 53.396432127096], + [121.6845703125, 53.3833283675716], + [121.46484375, 53.3243115198272], + [121.365966796875, 53.2914890653002], + [121.212158203125, 53.2849215461962], + [121.11328125, 53.3111855659391], + [120.91552734375, 53.2914890653002], + [120.794677734375, 53.2520688058941], + [120.6298828125, 53.153359065124], + [120.56396484375, 53.0874262193726], + [120.377197265625, 52.9817232239068], + [120.30029296875, 52.9155272204414], + [120.1025390625, 52.8027614154197], + [120.003662109375, 52.7628917375837], + [119.981689453125, 52.6430634366589], + [120.069580078125, 52.5830258614165], + [120.311279296875, 52.5897007687178], + [120.498046875, 52.6230600582296], + [120.684814453125, 52.5696729969008], + [120.69580078125, 52.5095347703273], + [120.60791015625, 52.4024188739733], + [120.618896484375, 52.3084786236634], + [120.728759765625, 52.2345282942136], + [120.76171875, 52.0862573323384], + [120.673828125, 51.9916457721973], + [120.5419921875, 51.8764909706148], + [120.3662109375, 51.8221981833694], + [120.245361328125, 51.7270281570477], + [120.05859375, 51.5975476577146], + [120.0146484375, 51.5429188223739], + [119.915771484375, 51.3443386605992], + [119.794921875, 51.1999998341207], + [119.72900390625, 51.1104199102926], + [119.50927734375, 50.8614441105892], + [119.432373046875, 50.7155911334338], + [119.300537109375, 50.5832366148059], + [119.15771484375, 50.3734961443035], + [119.24560546875, 50.3454604086048], + [119.344482421875, 50.3384488872547], + [119.3115234375, 50.2050332649433], + [119.190673828125, 50.0430297438006], + [118.970947265625, 49.9865521305062], + [118.85009765625, 49.9582884280697], + [118.6083984375, 49.9370797569753], + [118.45458984375, 49.8733977031892], + [118.32275390625, 49.7812640581783], + [118.01513671875, 49.6249456465015], + [117.9052734375, 49.5822260446217], + [117.79541015625, 49.5679778589272], + [117.53173828125, 49.6035905243487], + [117.26806640625, 49.6605167252267], + [117.0263671875, 49.7457813061557], + [116.751708984375, 49.85215166777], + [116.03759765625, 48.8647147618028], + [116.070556640625, 48.7923901964641], + [115.99365234375, 48.7417008797654], + [115.77392578125, 48.5093264497663], + [115.784912109375, 48.261255652041], + [115.51025390625, 48.1880634812114], + [115.55419921875, 47.9310663475098], + [115.916748046875, 47.6727856757654], + [116.12548828125, 47.8205318674605], + [116.224365234375, 47.886880851069], + [116.422119140625, 47.8426576281654], + [116.641845703125, 47.8795129339705], + [116.78466796875, 47.8721439688873], + [116.883544921875, 47.8352834227526], + [117.037353515625, 47.7836346352638], + [117.169189453125, 47.7393233613686], + [117.322998046875, 47.6283800274471], + [117.44384765625, 47.6801829464841], + [117.608642578125, 47.8500307854583], + [117.75146484375, 47.9678587799925], + [117.850341796875, 48.01197512671], + [118.026123046875, 47.9972738680447], + [118.135986328125, 48.026672195436], + [118.289794921875, 48.0193241848012], + [118.45458984375, 47.9678587799925], + [118.63037109375, 47.886880851069], + [118.729248046875, 47.7614837161667], + [118.828125, 47.7097615426664], + [119.15771484375, 47.6209754151585], + [119.2236328125, 47.5172006978394], + [119.35546875, 47.4578085307503], + [119.3994140625, 47.346267182053], + [119.53125, 47.2643200802548], + [119.739990234375, 47.1075227853425], + [119.7509765625, 47.0401821448067], + [119.937744140625, 46.897739085507], + [119.937744140625, 46.7774927637683], + [119.871826171875, 46.6494361633502], + [119.674072265625, 46.5890690830918], + [119.11376953125, 46.6041671629318], + [118.98193359375, 46.6569773162161], + [118.85009765625, 46.7323310128679], + [118.729248046875, 46.6871314124441], + [118.49853515625, 46.6946673077731], + [118.23486328125, 46.7022021516435], + [118.14697265625, 46.6795944656402], + [117.92724609375, 46.6192610361715], + [117.7734375, 46.5664140756859], + [117.696533203125, 46.5361926748986], + [117.564697265625, 46.5739667965278], + [117.410888671875, 46.581518465658], + [117.44384765625, 46.4983922585976], + [117.388916015625, 46.4529970474829], + [117.344970703125, 46.4075639663007], + [116.982421875, 46.3545108373652], + [116.87255859375, 46.3924111898146], + [116.729736328125, 46.3620930120499], + [116.553955078125, 46.2482499128917], + [116.43310546875, 46.111325657298], + [116.356201171875, 46.0122238406324], + [116.268310546875, 45.9358706211905], + [116.268310546875, 45.8211434007947], + [116.136474609375, 45.7291910612999], + [115.982666015625, 45.6601273027219], + [115.850830078125, 45.5525252513401], + [115.77392578125, 45.4832435086822], + [115.64208984375, 45.4215881232909], + [115.433349609375, 45.3907351542489], + [115.169677734375, 45.3289786621856], + [114.993896484375, 45.3444241045224], + [114.686279296875, 45.3598653339597], + [114.54345703125, 45.3675843688498], + [114.312744140625, 45.089035564831], + [114.049072265625, 44.9570241251212], + [113.873291015625, 44.840290651398], + [113.653564453125, 44.7545354841601], + [113.302001953125, 44.7545354841601], + [112.96142578125, 44.8169155178286], + [112.620849609375, 44.887012479813], + [112.489013671875, 44.9958826181655], + [112.159423828125, 45.0580014353983], + [111.97265625, 45.0812786124187], + [111.8408203125, 45.0191850743818], + [111.741943359375, 44.8792281416352], + [111.64306640625, 44.7857339271659], + [111.533203125, 44.6998976584032], + [111.37939453125, 44.4102404129601], + [111.4013671875, 44.3238480725069], + [111.55517578125, 44.1427978281806], + [111.697998046875, 44.0007178342828], + [111.8408203125, 43.9374616903166], + [111.917724609375, 43.794889072266], + [111.8408203125, 43.6678716101175], + [111.5771484375, 43.5326204268101], + [111.37939453125, 43.4688676148293], + [111.15966796875, 43.4289879234416], + [110.91796875, 43.2692062491496], + [110.7861328125, 43.1811470593997], + [110.63232421875, 42.972501586026], + [110.489501953125, 42.8679124839153], + [110.159912109375, 42.7066595635104], + [110.0390625, 42.6339587226731], + [109.786376953125, 42.5530802889558], + [109.456787109375, 42.4964029409371], + [109.27001953125, 42.4477814346225], + [109.0283203125, 42.4153461142536], + [108.8525390625, 42.4477814346225], + [108.6328125, 42.4558876419717], + [108.446044921875, 42.4396741781494], + [108.226318359375, 42.4558876419717], + [108.028564453125, 42.4396741781494], + [107.830810546875, 42.3666616637327], + [107.666015625, 42.391008609205], + [107.523193359375, 42.4801999690121], + [107.347412109375, 42.4477814346225], + [107.149658203125, 42.3585439174971], + [106.842041015625, 42.3016903282445], + [106.600341796875, 42.2691794924351], + [106.402587890625, 42.1959687762918], + [106.1279296875, 42.1063737057932], + [105.743408203125, 41.9349765005466], + [105.479736328125, 41.8286420018605], + [105.325927734375, 41.7631174470059], + [105.128173828125, 41.7139300733713], + [104.996337890625, 41.6400783846789], + [104.798583984375, 41.6482883125953], + [104.490966796875, 41.6893222599704], + [104.512939453125, 41.8695608269946], + [104.359130859375, 41.8859210281474], + [104.007568359375, 41.8122671435998], + [103.7548828125, 41.8122671435998], + [103.568115234375, 41.8531964377668], + [103.3154296875, 41.894099558114], + [103.24951171875, 41.951319946797], + [103.1396484375, 42.0003251483162], + [102.864990234375, 42.0819166783063], + [102.568359375, 42.1796881966596], + [102.3046875, 42.147114459221], + [102.117919921875, 42.2773087742371], + [101.920166015625, 42.391008609205], + [101.689453125, 42.4883019796023], + [101.634521484375, 42.5773548395579], + [101.282958984375, 42.6258756025914], + [100.83251953125, 42.7066595635104], + [100.513916015625, 42.7228037573273], + [100.294189453125, 42.7066595635104], + [100.21728515625, 42.6420407930443], + [99.942626953125, 42.6824353983862], + [99.349365234375, 42.6258756025914], + [99.07470703125, 42.6420407930443], + [98.7451171875, 42.6662807056493], + [98.23974609375, 42.6824353983862], + [97.965087890625, 42.6662807056493], + [97.84423828125, 42.7308742792849], + [97.53662109375, 42.7712111386259], + [97.294921875, 42.8034617241708], + [97.05322265625, 42.8034617241708], + [96.5478515625, 42.7470121731807], + [96.39404296875, 42.7631458668949], + [96.383056640625, 42.8920641880734], + [96.119384765625, 43.0528339176279], + [95.987548828125, 43.1971672825013], + [95.855712890625, 43.2772053221202], + [95.8447265625, 43.3890819391175], + [95.73486328125, 43.5565103750476], + [95.657958984375, 43.7155347262051], + [95.55908203125, 43.8741381814747], + [95.4931640625, 43.9928145004899], + [95.394287109375, 44.0323206427508], + [95.33935546875, 44.2373283182254], + [95.38330078125, 44.3002644115815], + [95.240478515625, 44.3081266848861], + [95.07568359375, 44.2924010852901], + [94.910888671875, 44.2924010852901], + [94.76806640625, 44.3709869629717], + [94.54833984375, 44.4573098013193], + [94.427490234375, 44.5121761710711], + [94.28466796875, 44.6061127451739], + [94.119873046875, 44.7233201889583], + [93.955078125, 44.7935309047441], + [93.790283203125, 44.8247082823002], + [93.702392578125, 44.9025779962889], + [93.515625, 44.9570241251212], + [93.372802734375, 45.0036511568719], + [93.043212890625, 45.0269504531855], + [92.757568359375, 45.0580014353983], + [92.43896484375, 45.0657615477031], + [92.26318359375, 45.0347147786886], + [92.04345703125, 45.0735206067097], + [91.64794921875, 45.1123001022961], + [91.483154296875, 45.0967914639474], + [91.29638671875, 45.166547157856], + [91.0986328125, 45.1975223030568], + [90.90087890625, 45.2594220363517], + [90.802001953125, 45.3598653339597], + [90.714111328125, 45.4755402715859], + [90.692138671875, 45.629404920645], + [90.7470703125, 45.7828483519768], + [90.845947265625, 45.905299857248], + [90.966796875, 46.0503609756163], + [90.98876953125, 46.217851767403], + [90.90087890625, 46.3848332234928], + [91.021728515625, 46.4983922585976], + [91.03271484375, 46.7022021516435], + [91.0107421875, 46.8526782485311], + [90.845947265625, 47.0850853599539], + [90.714111328125, 47.1523692744639], + [90.516357421875, 47.4429499951795], + [90.450439453125, 47.5172006978394], + [90.406494140625, 47.6431861054366], + [90.263671875, 47.7393233613686], + [90.142822265625, 47.8426576281654], + [90.02197265625, 47.9089783147287], + [89.879150390625, 47.8647739557922], + [89.659423828125, 47.8574028946583], + [89.593505859375, 47.9605023889151], + [89.45068359375, 48.0413650744503], + [89.296875, 48.026672195436], + [89.09912109375, 48.026672195436], + [88.890380859375, 48.1147666318763], + [88.65966796875, 48.2027102886997], + [88.57177734375, 48.275881527435], + [88.48388671875, 48.3635488889869], + [88.231201171875, 48.4583518828087], + [88.033447265625, 48.5820584028382], + [88.033447265625, 48.7054628957905], + [88.011474609375, 48.7561887628055], + [87.747802734375, 48.9152798534438], + [87.8466796875, 49.0306652257167], + [87.73681640625, 49.1673386062911], + [87.5830078125, 49.1529696561704], + [87.484130859375, 49.1314084139986], + [87.044677734375, 49.1745215180678], + [86.8798828125, 49.1242192485914], + [86.748046875, 49.0018439179785], + [86.781005859375, 48.9008379023409], + [86.737060546875, 48.7417008797654], + [86.66015625, 48.6183851868849], + [86.55029296875, 48.5457054918475], + [86.41845703125, 48.5238812025934], + [86.30859375, 48.5238812025934], + [86.24267578125, 48.4729212724878], + [86.044921875, 48.4292005555684], + [85.869140625, 48.4146186174932], + [85.67138671875, 48.3708477023837], + [85.58349609375, 48.1880634812114], + [85.49560546875, 48.0560537639813], + [85.550537109375, 47.9531449501559], + [85.517578125, 47.7910161782626], + [85.528564453125, 47.6505875711873], + [85.5615234375, 47.5617007545197], + [85.638427734375, 47.4652362243836], + [85.682373046875, 47.3834738721015], + [85.693359375, 47.2941337250102], + [85.693359375, 47.2121057756224], + [85.58349609375, 47.1224758166411], + [85.517578125, 47.0626384799543], + [85.330810546875, 47.0476686404608], + [85.2099609375, 47.0326945985214], + [85.1220703125, 46.9652594003493], + [85.001220703125, 46.8677027317281], + [84.814453125, 46.9577613466887], + [84.70458984375, 46.9877472564657], + [84.539794921875, 46.9727564031864], + [84.44091796875, 46.9802523552188], + [83.95751953125, 46.9952411069459], + [83.8037109375, 47.0252060015854], + [83.69384765625, 47.0776041171596], + [83.4521484375, 47.1149998262077], + [83.309326171875, 47.1598400130443], + [83.16650390625, 47.2568640440887], + [83.056640625, 47.2270293988673], + [82.99072265625, 47.1598400130443], + [82.891845703125, 46.890231573594], + [82.77099609375, 46.8376495609375], + [82.72705078125, 46.6795944656402], + [82.672119140625, 46.5135155805974], + [82.584228515625, 46.3696741346237], + [82.50732421875, 46.217851767403], + [82.353515625, 45.9282295093362], + [82.3095703125, 45.8287992519213], + [82.276611328125, 45.6601273027219], + [82.254638671875, 45.5679096098613], + [82.353515625, 45.4524242413431], + [82.55126953125, 45.3907351542489], + [82.562255859375, 45.2439534226232], + [82.50732421875, 45.1897800966753], + [82.320556640625, 45.1820368370159], + [82.11181640625, 45.1742925240767], + [81.9580078125, 45.2748864370489], + [81.80419921875, 45.3521452458518], + [81.54052734375, 45.298075138708], + [81.375732421875, 45.236217535866], + [81.23291015625, 45.2207426025537], + [80.914306640625, 45.1123001022961], + [80.738525390625, 45.1355551601254], + [80.606689453125, 45.1045463097687], + [80.17822265625, 45.0502402697946], + [79.991455078125, 44.9958826181655], + [79.892578125, 44.8636563054061], + [80.068359375, 44.7701368121972], + [80.189208984375, 44.7779358963162], + [80.3759765625, 44.6686528722732], + [80.44189453125, 44.5748174046703], + [80.364990234375, 44.4416242175881], + [80.39794921875, 44.2058350010418], + [80.419921875, 44.0796932742571], + [80.452880859375, 43.9453723924421], + [80.48583984375, 43.7631599615726], + [80.606689453125, 43.6360751559658], + [80.716552734375, 43.5007524356904], + [80.7275390625, 43.3171849156671], + [80.738525390625, 43.2772053221202], + [80.782470703125, 43.1571088409533], + [80.61767578125, 43.0849374270759], + [80.4638671875, 43.0448054130437], + [80.419921875, 42.9805395475164], + [80.595703125, 42.8840146704425], + [80.452880859375, 42.8759641023826], + [80.255126953125, 42.7470121731807], + [80.167236328125, 42.6420407930443], + [80.211181640625, 42.5530802889558], + [80.211181640625, 42.4072346615519], + [80.277099609375, 42.2610491621139], + [80.068359375, 42.1389684045809], + [80.167236328125, 42.0737622400872], + [80.00244140625, 42.0248136078178], + [79.881591796875, 42.0492926386868], + [79.8046875, 41.9268032064879], + [79.6728515625, 41.8777414510968], + [79.508056640625, 41.8040781442723], + [79.398193359375, 41.8286420018605], + [79.27734375, 41.754922167663], + [79.024658203125, 41.6647050300921], + [78.8818359375, 41.5990130548302], + [78.695068359375, 41.5414776667903], + [78.563232421875, 41.4427263776721], + [78.387451171875, 41.4097758320096], + [78.167724609375, 41.3850519497068], + [78.123779296875, 41.2860623874983], + [78.046875, 41.2282490151853], + [77.904052734375, 41.1538423571145], + [77.80517578125, 41.079351149469], + [77.7392578125, 41.0130657870063], + [77.574462890625, 40.9964840143779], + [77.376708984375, 41.0130657870063], + [77.135009765625, 41.021355108666], + [76.9921875, 41.0296433871664], + [76.83837890625, 40.938414956898], + [76.717529296875, 40.8553705319249], + [76.651611328125, 40.713955826286], + [76.57470703125, 40.5638945306651], + [76.475830078125, 40.4469470596005], + [76.322021484375, 40.4302236345086], + [76.201171875, 40.4302236345086], + [76.00341796875, 40.396764305572], + [75.882568359375, 40.3465441211801], + [75.706787109375, 40.3214199959344], + [75.684814453125, 40.4385858670433], + [75.673828125, 40.5972706344202], + [75.60791015625, 40.6639728763869], + [75.069580078125, 40.4803814290817], + [74.871826171875, 40.5388515253547], + [74.794921875, 40.4469470596005], + [74.871826171875, 40.3800284025118], + [74.783935546875, 40.3716588915061], + [74.608154296875, 40.2627606643718], + [74.454345703125, 40.1368906953459], + [74.278564453125, 40.111688665596], + [74.11376953125, 40.0864772938088], + [73.9599609375, 40.0360265298117], + [73.80615234375, 39.8928799002948], + [73.93798828125, 39.7409863558836], + [73.948974609375, 39.6395375643667], + [73.817138671875, 39.4786055689221], + [73.6083984375, 39.4361929993141], + [73.487548828125, 39.3852638109977], + [73.564453125, 39.2577781502834], + [73.80615234375, 39.0362529596366], + [73.828125, 38.9594087924542], + [73.729248046875, 38.9081329959671], + [73.76220703125, 38.7797813780492], + [73.839111328125, 38.6082859285056], + [74.0478515625, 38.5739375155759], + [74.102783203125, 38.6597777307125], + [74.278564453125, 38.6683561015151], + [74.476318359375, 38.6340364529192], + [74.564208984375, 38.5911137761474], + [74.718017578125, 38.5223840902008], + [74.805908203125, 38.4707937112038], + [74.805908203125, 38.376115424036], + [74.783935546875, 38.2640629683396], + [74.805908203125, 38.1431975016677], + [74.8388671875, 38.0394388918217], + [74.90478515625, 37.8661807852967], + [74.94873046875, 37.7098993548551], + [75.025634765625, 37.5445773208558], + [75.1025390625, 37.4399740522706], + [75.025634765625, 37.2827946491105], + [74.827880859375, 37.2478212015543], + [74.59716796875, 37.2478212015543], + [74.498291015625, 37.1515605022367], + [74.5751953125, 37.0639443005669], + [74.81689453125, 37.0288694469647], + [74.9267578125, 36.985003092856], + [75.05859375, 37.0200982013681], + [75.1904296875, 36.985003092856], + [75.38818359375, 36.9235476810893], + [75.443115234375, 36.774092494642], + [75.509033203125, 36.7388841243943], + [75.6298828125, 36.7652919171162], + [75.73974609375, 36.6948509415623], + [75.860595703125, 36.6067088864182], + [75.992431640625, 36.5184659896759], + [76.014404296875, 36.4654718867981], + [76.22314453125, 36.4301223455158], + [76.322021484375, 36.3505270054276], + [76.39892578125, 36.2265501474709], + [76.585693359375, 36.1556178338185], + [76.673583984375, 36.1290016556965], + [76.75048828125, 35.9957853864203], + [76.8603515625, 35.871246850028], + [77.0361328125, 35.8089040440686], + [77.200927734375, 35.7643434796672], + [77.398681640625, 35.6572962480963], + [77.486572265625, 35.5947856654872], + [77.530517578125, 35.5143431343182], + [77.6513671875, 35.4875110238538], + [77.772216796875, 35.4785649953573], + [77.926025390625, 35.5054000934413], + [77.98095703125, 35.4964560565842], + [78.06884765625, 35.5054000934413], + [78.101806640625, 35.4517209363447], + [78.0029296875, 35.3084014016916], + [78.046875, 35.1648275060503], + [78.15673828125, 35.0749648539896], + [78.1787109375, 34.9399851515604], + [78.22265625, 34.7596661246625], + [78.2666015625, 34.6783937401165], + [78.431396484375, 34.5789524103695], + [78.585205078125, 34.5427623872348], + [78.782958984375, 34.4431586745058], + [79.002685546875, 34.3797125804622], + [78.892822265625, 34.1527269801182], + [78.717041015625, 34.0890613158499], + [78.7060546875, 34.0253477381479], + [78.77197265625, 33.8065380250961], + [78.651123046875, 33.6146192923338], + [78.848876953125, 33.4314413355753], + [79.024658203125, 33.2846199688877], + [79.156494140625, 33.1927309419069], + [79.200439453125, 33.0178760185549], + [79.222412109375, 32.8611323228109], + [79.25537109375, 32.7503226078097], + [79.266357421875, 32.6116164031703], + [79.134521484375, 32.4726950220615], + [79.046630859375, 32.389239109859], + [78.85986328125, 32.4263401615464], + [78.739013671875, 32.7225986040441], + [78.343505859375, 32.5282893648253], + [78.475341796875, 32.2964197989691], + [78.64013671875, 32.1384086967725], + [78.739013671875, 31.6346755495413], + [78.85986328125, 31.5317261445172], + [78.826904296875, 31.4192881242884], + [79.03564453125, 31.2785508589465], + [79.07958984375, 31.4192881242884], + [79.2333984375, 31.3442544556681], + [79.354248046875, 31.156408414557], + [79.4970703125, 30.9681892967942], + [79.65087890625, 30.8927974775082], + [79.837646484375, 30.8645102262584], + [80.101318359375, 30.8173462564921], + [80.15625, 30.6757154041677], + [80.321044921875, 30.524413269924], + [80.44189453125, 30.4676141022579], + [80.738525390625, 30.3349538819886], + [80.83740234375, 30.2685562490477], + [80.936279296875, 30.2305945649322], + [81.046142578125, 30.154627220776], + [81.090087890625, 30.0881077533673], + [81.177978515625, 30.0405664305846], + [81.27685546875, 30.1166215828194], + [81.353759765625, 30.221101852486], + [81.5185546875, 30.4581443510181], + [81.683349609375, 30.4581443510181], + [82.012939453125, 30.353916372297], + [82.122802734375, 30.2116082238169], + [82.177734375, 30.1071178870924], + [82.276611328125, 30.0595856997082], + [82.430419921875, 29.9834867184747], + [82.540283203125, 29.9073293768515], + [82.63916015625, 29.8406438998344], + [82.77099609375, 29.7357624444491], + [83.265380859375, 29.5447877961995], + [83.3642578125, 29.4778611958168], + [83.4521484375, 29.2959805587157], + [83.551025390625, 29.200123477645], + [83.660888671875, 29.1905328322946], + [83.902587890625, 29.3151411931873], + [84.00146484375, 29.3151411931873], + [84.08935546875, 29.2672328652009], + [84.166259765625, 29.1425661551071], + [84.26513671875, 28.9697008086942], + [84.57275390625, 28.680949728555], + [84.70458984375, 28.6327467992259], + [84.803466796875, 28.5652254906547], + [84.957275390625, 28.6134594240044], + [85.155029296875, 28.6327467992259], + [85.111083984375, 28.459033019728], + [85.18798828125, 28.3333951691965], + [85.31982421875, 28.2753582818171], + [85.4736328125, 28.2656823901465], + [85.572509765625, 28.256005619825], + [85.6494140625, 28.323724553546], + [85.792236328125, 28.1591896340467], + [85.946044921875, 27.9555910046426], + [86.06689453125, 27.9944014110461], + [86.11083984375, 28.0816737290443], + [86.15478515625, 28.1398159127545], + [86.231689453125, 27.9652949152111], + [86.341552734375, 27.8973492296843], + [86.46240234375, 27.907058371122], + [86.572265625, 28.0428947725616], + [86.693115234375, 28.0816737290443], + [86.846923828125, 28.0331978476764], + [87.03369140625, 27.926474039865], + [87.154541015625, 27.8682165795141], + [87.242431640625, 27.8293608597898], + [87.4072265625, 27.8002099374183], + [87.659912109375, 27.8196447550994], + [87.95654296875, 27.8390760947778], + [87.967529296875, 27.8973492296843], + [88.154296875, 27.9167666412491], + [88.297119140625, 27.9458862217619], + [88.39599609375, 27.9749979532678], + [88.538818359375, 28.0138013763807], + [88.582763671875, 28.0719803017799] + ] + ], + [ + [ + [122.51865306, 23.46078502], + [122.79861399, 24.57367379], + [122.79889322, 24.57678999], + [122.79819583, 24.57983997], + [122.79659008, 24.58252516], + [122.79423315, 24.58458272], + [122.79135575, 24.58581125], + [122.78823955, 24.58609049], + [122.78518957, 24.5853931], + [122.78250438, 24.58378734], + [122.78044682, 24.58143041], + [122.77921829, 24.57855302], + [122.49925737, 23.46566424], + [122.49897813, 23.46254804], + [122.49967552, 23.45949807], + [122.50128127, 23.45681287], + [122.5036382, 23.45475531], + [122.5065156, 23.45352678], + [122.50963181, 23.45324755], + [122.51268178, 23.45394494], + [122.51536697, 23.45555069], + [122.51742454, 23.45790762], + [122.51865306, 23.46078502] + ] + ], + [ + [ + [121.17202617, 20.8054593], + [121.90938804, 21.68743347], + [121.9109946, 21.69011818], + [121.91169291, 21.69316794], + [121.91141462, 21.69628423], + [121.91018696, 21.699162], + [121.9081301, 21.70151955], + [121.9054454, 21.70312611], + [121.90239563, 21.70382443], + [121.89927934, 21.70354613], + [121.89640158, 21.70231847], + [121.89404403, 21.70026162], + [121.15668216, 20.81828744], + [121.1550756, 20.81560273], + [121.15437729, 20.81255297], + [121.15465558, 20.80943668], + [121.15588324, 20.80655891], + [121.1579401, 20.80420136], + [121.1606248, 20.8025948], + [121.16367457, 20.80189649], + [121.16679085, 20.80217478], + [121.16966862, 20.80340244], + [121.17202617, 20.8054593] + ] + ], + [ + [ + [119.47366172, 18.00707291], + [120.02569734, 19.02403788], + [120.02674143, 19.02698721], + [120.02682302, 19.03011484], + [120.02593412, 19.0331146], + [120.02416175, 19.03569286], + [120.02167941, 19.03759723], + [120.01873007, 19.03864132], + [120.01560245, 19.03872291], + [120.01260269, 19.03783401], + [120.01002443, 19.03606165], + [120.00812005, 19.0335793], + [119.45608443, 18.01661433], + [119.45504035, 18.01366499], + [119.45495876, 18.01053737], + [119.45584765, 18.00753761], + [119.45762002, 18.00495935], + [119.46010237, 18.00305497], + [119.4630517, 18.00201089], + [119.46617933, 18.0019293], + [119.46917909, 18.0028182], + [119.47175735, 18.00459056], + [119.47366172, 18.00707291] + ] + ], + [ + [ + [119.0726757, 15.04098494], + [119.0726757, 16.04388528], + [119.07218626, 16.04697545], + [119.07076587, 16.04976313], + [119.06855355, 16.05197545], + [119.06576587, 16.05339584], + [119.0626757, 16.05388528], + [119.05958553, 16.05339584], + [119.05679784, 16.05197545], + [119.05458553, 16.04976313], + [119.05316513, 16.04697545], + [119.0526757, 16.04388528], + [119.0526757, 15.04105889], + [119.0521839, 15.00781004], + [119.05262758, 15.00471297], + [119.05400659, 15.00190458], + [119.05618595, 14.99965979], + [119.05895232, 14.99819832], + [119.06203491, 14.99766324], + [119.06513198, 14.99810691], + [119.06794036, 14.99948592], + [119.07018516, 15.00166528], + [119.07164663, 15.00443165], + [119.07218171, 15.00751424], + [119.0726746, 15.04083704], + [119.0726757, 15.04098494] + ] + ], + [ + [ + [118.68646749, 11.18959191], + [118.52518702, 10.91547751], + [118.52404181, 10.91256595], + [118.52385237, 10.909443], + [118.52463726, 10.90641436], + [118.52631962, 10.9037765], + [118.5287348, 10.90178762], + [118.53164636, 10.90064241], + [118.53476931, 10.90045298], + [118.53779795, 10.90123786], + [118.54043581, 10.90292022], + [118.54242469, 10.9053354], + [118.70409227, 11.18010771], + [118.70476212, 11.18147468], + [118.87431591, 11.606662], + [118.87459939, 11.60747236], + [118.98894963, 11.98573108], + [118.98937534, 11.98883067], + [118.9888224, 11.99191011], + [118.98734492, 11.99466796], + [118.98508753, 11.99683427], + [118.98227119, 11.99819697], + [118.9791716, 11.99862269], + [118.97609216, 11.99806975], + [118.97333431, 11.99659227], + [118.97116801, 11.99433487], + [118.9698053, 11.99151854], + [118.85557939, 11.6136711], + [118.68646749, 11.18959191] + ] + ], + [ + [ + [115.54466883, 7.14672265], + [116.2504858, 7.979279], + [116.25211077, 7.98195261], + [116.25283001, 7.9849975], + [116.25257312, 7.98811563], + [116.25136525, 7.99100176], + [116.24932463, 7.99337338], + [116.24665102, 7.99499834], + [116.24360613, 7.99571758], + [116.240488, 7.99546069], + [116.23760187, 7.99425282], + [116.23523025, 7.99221221], + [115.52941328, 7.15965587], + [115.52778832, 7.15698226], + [115.52706908, 7.15393736], + [115.52732596, 7.15081924], + [115.52853383, 7.1479331], + [115.53057445, 7.14556148], + [115.53324806, 7.14393652], + [115.53629295, 7.14321728], + [115.53941108, 7.14347417], + [115.54229721, 7.14468204], + [115.54466883, 7.14672265] + ] + ], + [ + [ + [112.30705249, 3.53487257], + [111.78690114, 3.41687263], + [111.78399583, 3.41571167], + [111.78159146, 3.41370973], + [111.77992341, 3.41106279], + [111.77915495, 3.40802995], + [111.77936129, 3.40490807], + [111.78052226, 3.40200275], + [111.78252419, 3.39959839], + [111.78517113, 3.39793033], + [111.78820398, 3.39716187], + [111.79132585, 3.39736822], + [112.31181658, 3.51544515], + [112.31248917, 3.51562254], + [112.52147408, 3.5785908], + [112.52281386, 3.57910186], + [112.85206367, 3.73256867], + [112.85465776, 3.7343178], + [112.85658437, 3.73678292], + [112.85765492, 3.73972276], + [112.85776462, 3.74284952], + [112.85690272, 3.74585715], + [112.8551536, 3.74845124], + [112.85268847, 3.75037785], + [112.84974864, 3.7514484], + [112.84662187, 3.75155809], + [112.84361424, 3.7506962], + [112.51501594, 3.59753306], + [112.30705249, 3.53487257] + ] + ], + [ + [ + [108.26055972, 6.08912451], + [108.29013305, 6.01266273], + [108.29170425, 6.00995718], + [108.29403462, 6.00786957], + [108.29689603, 6.00660426], + [108.3000084, 6.00628511], + [108.30306706, 6.00694335], + [108.30577262, 6.00851455], + [108.30786022, 6.01084492], + [108.30912553, 6.01370633], + [108.30944469, 6.0168187], + [108.30878645, 6.01987736], + [108.279563, 6.09543449], + [108.25611734, 6.22752625], + [108.21679964, 6.53816468], + [108.21876335, 6.94964057], + [108.24419535, 7.07390742], + [108.24433543, 7.07703297], + [108.24350281, 7.08004883], + [108.24177899, 7.0826598], + [108.2393327, 7.08461028], + [108.23640341, 7.08570936], + [108.23327786, 7.08584944], + [108.230262, 7.08501682], + [108.22765103, 7.083293], + [108.22570055, 7.08084671], + [108.22460147, 7.07791743], + [108.19897125, 6.95268198], + [108.1987683, 6.95072469], + [108.19679674, 6.53760583], + [108.19687578, 6.53630242], + [108.23630689, 6.22476797], + [108.23638164, 6.22427602], + [108.26004031, 6.09098419], + [108.26055972, 6.08912451] + ] + ], + [ + [ + [110.12822847, 11.36894451], + [110.05553696, 11.25335394], + [110.05430621, 11.25047749], + [110.05402458, 11.2473615], + [110.05471962, 11.24431099], + [110.05632331, 11.24162456], + [110.05867865, 11.23956519], + [110.0615551, 11.23833444], + [110.06467109, 11.23805281], + [110.0677216, 11.23874785], + [110.07040803, 11.24035153], + [110.07246741, 11.24270688], + [110.14541497, 11.35870461], + [110.14588682, 11.35954163], + [110.20700505, 11.48128846], + [110.20728377, 11.48189306], + [110.25854422, 11.60358735], + [110.25901765, 11.60499559], + [110.30436343, 11.7826124], + [110.30456934, 11.78364161], + [110.32822801, 11.94571326], + [110.32832827, 11.94685414], + [110.33424294, 12.14159753], + [110.33424553, 12.14210167], + [110.33227398, 12.24038351], + [110.33172267, 12.24346324], + [110.33024665, 12.24622187], + [110.3279904, 12.24838938], + [110.32517479, 12.24975358], + [110.32207543, 12.25018094], + [110.3189957, 12.24962962], + [110.31623706, 12.2481536], + [110.31406956, 12.24589736], + [110.31270536, 12.24308175], + [110.312278, 12.23998238], + [110.3142445, 12.14195265], + [110.3083549, 11.94803461], + [110.28485499, 11.78705054], + [110.23982347, 11.61066468], + [110.18898148, 11.48996382], + [110.12822847, 11.36894451] + ] + ], + [ + [ + [109.82951587, 15.22896754], + [109.84522534, 15.15316562], + [109.84633168, 15.15023907], + [109.84828823, 15.14779763], + [109.85090347, 15.14608029], + [109.85392139, 15.14525516], + [109.85704658, 15.145403], + [109.85997314, 15.14650935], + [109.86241457, 15.1484659], + [109.86413191, 15.15108113], + [109.86495704, 15.15409906], + [109.8648092, 15.15722425], + [109.84903675, 15.23333003], + [109.84889209, 15.23393326], + [109.78974541, 15.45068337], + [109.7892391, 15.45210582], + [109.69066131, 15.67432448], + [109.6900529, 15.67548445], + [109.59147511, 15.83677407], + [109.59116145, 15.8372556], + [109.53201478, 15.92259221], + [109.53166592, 15.92306523], + [109.30888011, 16.20725797], + [109.30658844, 16.20938798], + [109.30375073, 16.21070558], + [109.30064474, 16.21108179], + [109.29757451, 16.21047978], + [109.29484059, 16.20895848], + [109.29271057, 16.20666681], + [109.29139298, 16.2038291], + [109.29101677, 16.20072311], + [109.29161878, 16.19765288], + [109.29314007, 16.19491896], + [109.51574449, 15.91095759], + [109.57455994, 15.82609887], + [109.67264555, 15.66561455], + [109.77065019, 15.44468789], + [109.82951587, 15.22896754] + ] + ], + [ + [ + [120.443706, 22.441432], + [120.517619, 22.408793], + [120.569973, 22.361757], + [120.640806, 22.241605], + [120.659285, 22.154056], + [120.661748, 22.067007], + [120.651277, 22.033171], + [120.667908, 21.983235], + [120.701784, 21.927174], + [120.743052, 21.915515], + [120.781857, 21.923843], + [120.854537, 21.883309], + [120.873016, 21.897191], + [120.86624, 21.984345], + [120.907508, 22.033171], + [120.912436, 22.086418], + [120.903197, 22.12634], + [120.914899, 22.302525], + [120.981421, 22.528248], + [121.014682, 22.584069], + [121.03316, 22.650914], + [121.078739, 22.669691], + [121.170514, 22.723247], + [121.21055, 22.770711], + [121.237652, 22.836362], + [121.276456, 22.877171], + [121.324499, 22.945526], + [121.35468, 23.00999], + [121.370695, 23.084334], + [121.409499, 23.1025], + [121.430441, 23.137175], + [121.415042, 23.196047], + [121.440296, 23.271937], + [121.479716, 23.322507], + [121.497578, 23.419744], + [121.5216, 23.483431], + [121.522832, 23.538858], + [121.587505, 23.760878], + [121.621382, 23.920718], + [121.65957, 24.007125], + [121.63986, 24.064514], + [121.643556, 24.097843], + [121.678048, 24.133895], + [121.689135, 24.174303], + [121.809243, 24.339083], + [121.82649, 24.423572], + [121.867758, 24.47914], + [121.88562, 24.529784], + [121.892395, 24.617953], + [121.86283, 24.671261], + [121.841272, 24.734329], + [121.844968, 24.836476], + [121.933047, 24.938539], + [122.012503, 25.001471], + [121.98109, 25.030757], + [121.947214, 25.031841], + [121.917033, 25.138076], + [121.841888, 25.135367], + [121.782142, 25.160287], + [121.745186, 25.161912], + [121.707613, 25.191701], + [121.700222, 25.226896], + [121.655259, 25.242054], + [121.62323, 25.29455], + [121.585041, 25.309159], + [121.53515, 25.307535], + [121.444607, 25.27074], + [121.413194, 25.238806], + [121.371926, 25.159746], + [121.319572, 25.140785], + [121.209318, 25.12724], + [121.132942, 25.078466], + [121.102145, 25.075214], + [121.024537, 25.040517], + [121.009754, 24.993878], + [120.961095, 24.940167], + [120.914899, 24.864715], + [120.89211, 24.767482], + [120.82374, 24.688118], + [120.762147, 24.658208], + [120.68885, 24.600542], + [120.642654, 24.490033], + [120.589068, 24.43229], + [120.546568, 24.370159], + [120.520698, 24.311816], + [120.470807, 24.242533], + [120.451713, 24.182493], + [120.391967, 24.118055], + [120.316206, 23.984708], + [120.278018, 23.92783], + [120.245989, 23.840276], + [120.175156, 23.807427], + [120.102476, 23.701162], + [120.095084, 23.58768], + [120.12157, 23.504836], + [120.108019, 23.341191], + [120.081534, 23.291728], + [120.018708, 23.073322], + [120.029795, 23.048544], + [120.133272, 23.000625], + [120.149287, 22.896468], + [120.20041, 22.721039], + [120.274323, 22.560307], + [120.297112, 22.531565], + [120.443706, 22.441432] + ] + ], + [ + [ + [124.542782, 25.903886], + [124.584666, 25.908731], + [124.566804, 25.941563], + [124.542782, 25.903886] + ] + ], + [ + [ + [123.445178, 25.726102], + [123.469816, 25.712623], + [123.50862, 25.722867], + [123.512316, 25.755212], + [123.479055, 25.768687], + [123.445794, 25.749822], + [123.445178, 25.726102] + ] + ], + [ + [ + [119.646064, 23.550928], + [119.691028, 23.547087], + [119.678093, 23.600294], + [119.61034, 23.604132], + [119.601717, 23.575613], + [119.566608, 23.584937], + [119.562297, 23.530627], + [119.578927, 23.502641], + [119.609108, 23.503738], + [119.646064, 23.550928] + ] + ], + [ + [ + [123.666916, 25.914114], + [123.706952, 25.91519], + [123.689706, 25.939949], + [123.666916, 25.914114] + ] + ], + [ + [ + [119.506246, 23.625518], + [119.506246, 23.577259], + [119.47237, 23.556962], + [119.519181, 23.559705], + [119.52534, 23.62497], + [119.506246, 23.625518] + ] + ], + [ + [ + [119.497623, 23.38679], + [119.495159, 23.349982], + [119.516717, 23.349982], + [119.497623, 23.38679] + ] + ], + [ + [ + [119.557369, 23.666634], + [119.608492, 23.620035], + [119.615268, 23.661153], + [119.586318, 23.675952], + [119.557369, 23.666634] + ] + ], + [ + [ + [122.066706, 25.6247], + [122.087032, 25.61067], + [122.092575, 25.639268], + [122.066706, 25.6247] + ] + ], + [ + [ + [121.468013, 22.67687], + [121.474788, 22.643734], + [121.513592, 22.631582], + [121.514824, 22.676318], + [121.468013, 22.67687] + ] + ], + [ + [ + [121.510513, 22.086972], + [121.507433, 22.048704], + [121.533918, 22.022076], + [121.594281, 21.995443], + [121.604752, 22.022631], + [121.575186, 22.037055], + [121.575802, 22.0842], + [121.510513, 22.086972] + ] + ], + [ + [ + [122.097503, 25.499987], + [122.110438, 25.465952], + [122.122141, 25.495666], + [122.097503, 25.499987] + ] + ], + [ + [ + [119.421247, 23.216949], + [119.436029, 23.186146], + [119.453275, 23.216399], + [119.421247, 23.216949] + ] + ], + [ + [ + [120.355011, 22.327439], + [120.395663, 22.342385], + [120.383344, 22.355669], + [120.355011, 22.327439] + ] + ], + [ + [ + [110.106396, 20.026812], + [110.042339, 19.991384], + [109.997375, 19.980136], + [109.965346, 19.993634], + [109.898825, 19.994196], + [109.855093, 19.984073], + [109.814441, 19.993072], + [109.76147, 19.981261], + [109.712195, 20.017253], + [109.657993, 20.01163], + [109.585312, 19.98801], + [109.526797, 19.943573], + [109.498464, 19.873236], + [109.411001, 19.895184], + [109.349407, 19.898561], + [109.300748, 19.917693], + [109.25948, 19.898561], + [109.255784, 19.867045], + [109.231147, 19.863105], + [109.159082, 19.79048], + [109.169553, 19.736411], + [109.147379, 19.704863], + [109.093792, 19.68965], + [109.048829, 19.619764], + [108.993394, 19.587065], + [108.92872, 19.524468], + [108.855424, 19.469182], + [108.806148, 19.450561], + [108.765496, 19.400894], + [108.694047, 19.387346], + [108.644772, 19.349518], + [108.609048, 19.276661], + [108.591186, 19.141592], + [108.598577, 19.055633], + [108.630606, 19.003017], + [108.637997, 18.924346], + [108.595497, 18.872256], + [108.593033, 18.809386], + [108.65278, 18.740258], + [108.663866, 18.67337], + [108.641077, 18.565614], + [108.644772, 18.486738], + [108.68912, 18.447571], + [108.776583, 18.441894], + [108.881293, 18.416344], + [108.905315, 18.389087], + [108.944735, 18.314107], + [109.006329, 18.323198], + [109.108575, 18.323766], + [109.138756, 18.268081], + [109.17448, 18.260125], + [109.287813, 18.264671], + [109.355566, 18.215221], + [109.441182, 18.199303], + [109.467051, 18.173718], + [109.527413, 18.169169], + [109.584696, 18.143579], + [109.661688, 18.175424], + [109.726362, 18.177698], + [109.749767, 18.193618], + [109.785492, 18.339672], + [109.919767, 18.375457], + [110.022629, 18.360121], + [110.070672, 18.376025], + [110.090382, 18.399309], + [110.116867, 18.506602], + [110.214186, 18.578662], + [110.246215, 18.609859], + [110.329366, 18.642185], + [110.367555, 18.631977], + [110.499366, 18.651824], + [110.499366, 18.751592], + [110.578206, 18.784458], + [110.590525, 18.838841], + [110.585597, 18.88075], + [110.619474, 19.152334], + [110.676756, 19.286264], + [110.706321, 19.320153], + [110.729727, 19.378878], + [110.787009, 19.399765], + [110.844292, 19.449996], + [110.888023, 19.518827], + [110.920668, 19.552668], + [111.008747, 19.60398], + [111.061718, 19.612436], + [111.071573, 19.628784], + [111.043856, 19.763448], + [111.013675, 19.850159], + [110.966248, 20.018377], + [110.940994, 20.028499], + [110.871393, 20.01163], + [110.808567, 20.035808], + [110.778386, 20.068415], + [110.744509, 20.074036], + [110.717408, 20.148778], + [110.687843, 20.163947], + [110.655814, 20.134169], + [110.562191, 20.110006], + [110.526467, 20.07516], + [110.495054, 20.077408], + [110.387265, 20.113378], + [110.318279, 20.108882], + [110.28933, 20.056047], + [110.243135, 20.077408], + [110.144585, 20.074598], + [110.106396, 20.026812] + ] + ], + [ + [ + [112.208597, 3.876129], + [112.241858, 3.845677], + [112.280046, 3.86777], + [112.260336, 3.917925], + [112.219068, 3.908969], + [112.208597, 3.876129] + ] + ], + [ + [ + [113.266165, 8.125929], + [113.311129, 8.177469], + [113.343157, 8.193463], + [113.288955, 8.119412], + [113.349933, 8.172137], + [113.386273, 8.238479], + [113.386273, 8.289412], + [113.354244, 8.304217], + [113.353628, 8.237887], + [113.293882, 8.176284], + [113.266165, 8.125929] + ] + ], + [ + [ + [111.99733, 3.848065], + [112.015192, 3.823583], + [112.064467, 3.830152], + [112.073707, 3.865979], + [112.03367, 3.892251], + [111.99733, 3.848065] + ] + ], + [ + [ + [111.463311, 17.077491], + [111.536607, 17.104949], + [111.4861, 17.058039], + [111.559397, 17.087788], + [111.542151, 17.11982], + [111.452224, 17.092936], + [111.463311, 17.077491] + ] + ], + [ + [ + [117.708319, 15.182712], + [117.712631, 15.118592], + [117.726798, 15.105303], + [117.827812, 15.111659], + [117.72495, 15.131302], + [117.720638, 15.195418], + [117.74466, 15.217941], + [117.784696, 15.16885], + [117.838899, 15.15903], + [117.782848, 15.187333], + [117.748355, 15.230068], + [117.715095, 15.222561], + [117.708319, 15.182712] + ] + ], + [ + [ + [112.241858, 3.942404], + [112.292365, 3.946583], + [112.288053, 3.97345], + [112.254177, 3.97942], + [112.241858, 3.942404] + ] + ], + [ + [ + [111.734324, 16.19732], + [111.779903, 16.19732], + [111.81686, 16.224329], + [111.813164, 16.261676], + [111.782367, 16.273741], + [111.716462, 16.249036], + [111.789758, 16.250186], + [111.790374, 16.220307], + [111.734324, 16.19732] + ] + ], + [ + [ + [111.649324, 16.255931], + [111.577875, 16.208239], + [111.56802, 16.162834], + [111.611136, 16.156511], + [111.690592, 16.211112], + [111.606825, 16.177779], + [111.598817, 16.198469], + [111.681353, 16.262251], + [111.649324, 16.255931] + ] + ], + [ + [ + [113.896887, 7.607204], + [113.919677, 7.566865], + [113.98743, 7.536014], + [114.058879, 7.537794], + [114.157429, 7.561525], + [114.289856, 7.617288], + [114.368696, 7.638642], + [114.407501, 7.683126], + [114.419819, 7.765557], + [114.464167, 7.814771], + [114.540543, 7.862201], + [114.555326, 7.891249], + [114.540543, 7.945783], + [114.511594, 7.966527], + [114.47279, 7.968898], + [114.414892, 7.952895], + [114.268298, 7.870501], + [114.211632, 7.786904], + [114.095219, 7.721082], + [114.029314, 7.670078], + [113.921524, 7.639235], + [113.896887, 7.607204] + ] + ], + [ + [ + [113.976959, 8.872888], + [114.013299, 8.836817], + [114.035473, 8.783591], + [114.060111, 8.816119], + [114.041017, 8.843913], + [113.989894, 8.878801], + [113.976959, 8.872888] + ] + ], + [ + [ + [113.956017, 8.840365], + [113.975111, 8.793054], + [114.012068, 8.798376], + [113.977575, 8.841548], + [113.956017, 8.840365] + ] + ], + [ + [ + [111.97454, 16.323715], + [112.002258, 16.306484], + [112.07617, 16.323715], + [112.074938, 16.349558], + [112.047221, 16.360469], + [112.002874, 16.350707], + [111.97454, 16.323715] + ] + ], + [ + [ + [111.739251, 16.452898], + [111.766969, 16.470116], + [111.786679, 16.520039], + [111.759577, 16.545857], + [111.765737, 16.495366], + [111.739251, 16.452898] + ] + ], + [ + [ + [112.216604, 8.866383], + [112.206133, 8.88767], + [112.180264, 8.862244], + [112.216604, 8.866383] + ] + ], + [ + [ + [113.792177, 7.373422], + [113.828518, 7.362145], + [113.829134, 7.383511], + [113.792177, 7.373422] + ] + ], + [ + [ + [114.194386, 8.764664], + [114.201161, 8.727991], + [114.248588, 8.724442], + [114.222103, 8.784773], + [114.194386, 8.764664] + ] + ], + [ + [ + [112.232619, 16.996239], + [112.207981, 16.987081], + [112.222764, 16.960751], + [112.292981, 16.96762], + [112.266496, 16.993949], + [112.232619, 16.996239] + ] + ], + [ + [ + [114.689601, 10.345648], + [114.702536, 10.312677], + [114.725941, 10.319154], + [114.747499, 10.37214], + [114.717318, 10.380381], + [114.689601, 10.345648] + ] + ], + [ + [ + [115.837712, 9.709775], + [115.861117, 9.694438], + [115.867277, 9.650191], + [115.901153, 9.67084], + [115.925791, 9.781734], + [115.901153, 9.795888], + [115.870972, 9.778785], + [115.837712, 9.709775] + ] + ], + [ + [ + [114.617536, 9.965688], + [114.642173, 9.917351], + [114.672355, 9.927963], + [114.685905, 9.979245], + [114.617536, 9.965688] + ] + ], + [ + [ + [113.769387, 7.636862], + [113.773699, 7.601865], + [113.814967, 7.603051], + [113.831597, 7.644573], + [113.769387, 7.636862] + ] + ], + [ + [ + [109.463972, 7.344339], + [109.463972, 7.315254], + [109.513247, 7.320002], + [109.571761, 7.373422], + [109.654297, 7.479648], + [109.709115, 7.511095], + [109.791651, 7.524742], + [109.938861, 7.504569], + [109.948716, 7.522962], + [109.904984, 7.55144], + [109.816289, 7.572797], + [109.72205, 7.575763], + [109.653065, 7.559745], + [109.536037, 7.448792], + [109.463972, 7.344339] + ] + ], + [ + [ + [116.273181, 8.879392], + [116.294123, 8.858105], + [116.332311, 8.901269], + [116.305826, 8.917233], + [116.273181, 8.879392] + ] + ], + [ + [ + [112.476531, 16.001247], + [112.570154, 16.011027], + [112.612037, 16.039212], + [112.588016, 16.070844], + [112.462364, 16.043813], + [112.448814, 16.005274], + [112.476531, 16.001247] + ] + ], + [ + [ + [112.537509, 8.846278], + [112.57077, 8.815527], + [112.639755, 8.818484], + [112.598487, 8.859288], + [112.537509, 8.846278] + ] + ], + [ + [ + [114.469095, 10.836261], + [114.475254, 10.814512], + [114.513442, 10.848605], + [114.565181, 10.836261], + [114.593514, 10.856245], + [114.587355, 10.909138], + [114.55471, 10.900911], + [114.469095, 10.836261] + ] + ], + [ + [ + [112.409393, 16.294996], + [112.383524, 16.265698], + [112.411241, 16.2634], + [112.475915, 16.288677], + [112.531349, 16.285805], + [112.536893, 16.312228], + [112.509176, 16.317397], + [112.409393, 16.294996] + ] + ], + [ + [ + [116.48876, 10.395686], + [116.461658, 10.34918], + [116.467202, 10.309144], + [116.511549, 10.297957], + [116.566368, 10.304434], + [116.644592, 10.335051], + [116.637817, 10.365076], + [116.514629, 10.34918], + [116.542346, 10.41982], + [116.526332, 10.426883], + [116.48876, 10.395686] + ] + ], + [ + [ + [112.349031, 16.912088], + [112.360734, 16.925257], + [112.334249, 16.962469], + [112.30222, 16.963041], + [112.349031, 16.912088] + ] + ], + [ + [ + [111.500267, 16.45175], + [111.49534, 16.4374], + [111.545847, 16.43453], + [111.538455, 16.461507], + [111.500267, 16.45175] + ] + ], + [ + [ + [115.500177, 9.897897], + [115.54822, 9.869007], + [115.585177, 9.896128], + [115.581481, 9.917351], + [115.518039, 9.933857], + [115.500177, 9.897897] + ] + ], + [ + [ + [114.669891, 8.210048], + [114.691449, 8.18517], + [114.74134, 8.189316], + [114.726557, 8.21064], + [114.669891, 8.210048] + ] + ], + [ + [ + [114.507899, 8.120004], + [114.530073, 8.103415], + [114.595978, 8.120596], + [114.624311, 8.149626], + [114.595978, 8.15792], + [114.507899, 8.120004] + ] + ], + [ + [ + [115.16757, 8.386523], + [115.18112, 8.345668], + [115.235939, 8.321982], + [115.285214, 8.314876], + [115.315395, 8.356326], + [115.299381, 8.370537], + [115.202678, 8.395403], + [115.16757, 8.386523] + ] + ], + [ + [ + [113.895039, 8.00505], + [113.904894, 7.963564], + [113.9708, 7.944597], + [113.969568, 7.974825], + [113.940003, 8.018088], + [113.895039, 8.00505] + ] + ], + [ + [ + [115.436119, 9.393447], + [115.450286, 9.345028], + [115.469996, 9.3592], + [115.456445, 9.417064], + [115.436119, 9.393447] + ] + ], + [ + [ + [116.457347, 9.174326], + [116.477057, 9.137103], + [116.500462, 9.164282], + [116.457347, 9.174326] + ] + ], + [ + [ + [113.638192, 8.976942], + [113.654823, 8.962163], + [113.730583, 9.004133], + [113.719496, 9.020092], + [113.644968, 8.989355], + [113.638192, 8.976942] + ] + ], + [ + [ + [114.696992, 11.004322], + [114.710543, 11.001972], + [114.793079, 11.07657], + [114.799854, 11.10476], + [114.766593, 11.110045], + [114.710543, 11.039567], + [114.696992, 11.004322] + ] + ], + [ + [ + [114.62, 11.432264], + [114.652644, 11.436957], + [114.661884, 11.522584], + [114.621232, 11.518479], + [114.62, 11.432264] + ] + ], + [ + [ + [114.910723, 10.863298], + [114.931049, 10.841551], + [114.959998, 10.902087], + [114.934129, 10.902674], + [114.910723, 10.863298] + ] + ], + [ + [ + [111.572948, 16.470116], + [111.578491, 16.447158], + [111.614216, 16.44027], + [111.592658, 16.490775], + [111.572948, 16.470116] + ] + ], + [ + [ + [113.939387, 8.875253], + [113.912285, 8.888853], + [113.893807, 8.862836], + [113.916597, 8.837999], + [113.939387, 8.875253] + ] + ], + [ + [ + [109.936397, 7.848566], + [109.936397, 7.823665], + [109.988136, 7.8124], + [110.050346, 7.846194], + [110.082991, 7.896584], + [110.078063, 7.949339], + [110.0331, 7.944597], + [109.953027, 7.888878], + [109.936397, 7.848566] + ] + ], + [ + [ + [116.727128, 11.501473], + [116.765316, 11.430504], + [116.772092, 11.445755], + [116.738215, 11.514961], + [116.727128, 11.501473] + ] + ], + [ + [ + [111.690592, 16.587731], + [111.724469, 16.560198], + [111.717078, 16.59404], + [111.690592, 16.587731] + ] + ], + [ + [ + [112.507328, 16.466098], + [112.586784, 16.525777], + [112.575081, 16.537251], + [112.499321, 16.493645], + [112.507328, 16.466098] + ] + ], + [ + [ + [111.761425, 16.061642], + [111.791606, 16.028859], + [111.828563, 16.049565], + [111.829795, 16.070844], + [111.761425, 16.061642] + ] + ], + [ + [ + [113.845764, 10.018733], + [113.865474, 10.00341], + [113.872249, 10.123029], + [113.856851, 10.12185], + [113.845764, 10.018733] + ] + ], + [ + [ + [114.791847, 8.160882], + [114.777064, 8.114079], + [114.812173, 8.110524], + [114.818332, 8.141332], + [114.791847, 8.160882] + ] + ], + [ + [ + [116.557129, 9.745167], + [116.566368, 9.718623], + [116.593469, 9.723932], + [116.557129, 9.745167] + ] + ], + [ + [ + [115.28275, 10.191951], + [115.288294, 10.172513], + [115.333257, 10.200198], + [115.28891, 10.211388], + [115.28275, 10.191951] + ] + ], + [ + [ + [116.832454, 10.476908], + [116.855243, 10.468669], + [116.868794, 10.495739], + [116.832454, 10.476908] + ] + ], + [ + [ + [114.703151, 16.170307], + [114.816484, 16.198469], + [114.802934, 16.215135], + [114.704383, 16.199044], + [114.703151, 16.170307] + ] + ], + [ + [ + [115.97753, 9.321997], + [115.926407, 9.311366], + [115.943037, 9.269433], + [115.976298, 9.268252], + [115.999088, 9.293649], + [115.97753, 9.321997] + ] + ], + [ + [ + [113.660366, 9.231039], + [113.676997, 9.202683], + [113.697323, 9.225722], + [113.660366, 9.231039] + ] + ], + [ + [ + [114.665579, 7.590001], + [114.671739, 7.563898], + [114.72163, 7.59178], + [114.703767, 7.614915], + [114.665579, 7.590001] + ] + ], + [ + [ + [114.493116, 10.717504], + [114.513442, 10.722208], + [114.562717, 10.778064], + [114.539312, 10.793349], + [114.493116, 10.717504] + ] + ], + [ + [ + [117.770529, 10.773361], + [117.798862, 10.753371], + [117.835819, 10.803931], + [117.831507, 10.838612], + [117.801942, 10.839788], + [117.775457, 10.809222], + [117.770529, 10.773361] + ] + ], + [ + [ + [114.242429, 10.242014], + [114.263371, 10.239658], + [114.326197, 10.284414], + [114.312646, 10.300901], + [114.265219, 10.275581], + [114.242429, 10.242014] + ] + ], + [ + [ + [114.688985, 11.469217], + [114.722246, 11.429331], + [114.737644, 11.463938], + [114.720398, 11.49209], + [114.688985, 11.469217] + ] + ], + [ + [ + [116.638433, 10.503977], + [116.653215, 10.491031], + [116.70865, 10.492797], + [116.699411, 10.517511], + [116.638433, 10.503977] + ] + ], + [ + [ + [110.459946, 8.116449], + [110.471032, 8.072012], + [110.554184, 8.093935], + [110.599764, 8.156735], + [110.568351, 8.17273], + [110.461793, 8.128298], + [110.459946, 8.116449] + ] + ], + [ + [ + [111.463311, 8.52504], + [111.497187, 8.523857], + [111.509506, 8.550489], + [111.463311, 8.52504] + ] + ], + [ + [ + [115.258113, 8.509652], + [115.271048, 8.477098], + [115.296301, 8.510836], + [115.258113, 8.509652] + ] + ], + [ + [ + [113.221817, 8.073789], + [113.235984, 8.068456], + [113.283411, 8.111117], + [113.269861, 8.120004], + [113.221817, 8.073789] + ] + ], + [ + [ + [114.074893, 10.929118], + [114.064422, 10.904437], + [114.110002, 10.918541], + [114.096451, 10.947921], + [114.074893, 10.929118] + ] + ], + [ + [ + [117.258068, 10.320331], + [117.299336, 10.313855], + [117.299952, 10.343293], + [117.274698, 10.358011], + [117.258068, 10.320331] + ] + ], + [ + [ + [114.212864, 16.040937], + [114.31203, 16.034611], + [114.306487, 16.057616], + [114.268914, 16.059342], + [114.212864, 16.040937] + ] + ], + [ + [ + [110.609003, 8.010976], + [110.642879, 7.989049], + [110.641648, 8.031125], + [110.622553, 8.041199], + [110.609003, 8.010976] + ] + ], + [ + [ + [115.509416, 8.490712], + [115.521735, 8.460523], + [115.55438, 8.461115], + [115.569162, 8.49012], + [115.558691, 8.523265], + [115.514344, 8.519122], + [115.509416, 8.490712] + ] + ], + [ + [ + [111.539071, 7.54432], + [111.542767, 7.524742], + [111.583419, 7.543134], + [111.612368, 7.592374], + [111.566788, 7.606017], + [111.539071, 7.54432] + ] + ], + [ + [ + [111.657947, 8.672974], + [111.665955, 8.622683], + [111.717694, 8.6499], + [111.697368, 8.67889], + [111.657947, 8.672974] + ] + ], + [ + [ + [110.460561, 7.799948], + [110.487663, 7.783346], + [110.511684, 7.805878], + [110.485199, 7.827815], + [110.460561, 7.799948] + ] + ], + [ + [ + [112.345952, 8.926101], + [112.392763, 8.919598], + [112.384756, 8.946793], + [112.345952, 8.926101] + ] + ], + [ + [ + [116.469665, 9.810041], + [116.47952, 9.785272], + [116.50847, 9.79117], + [116.490607, 9.821246], + [116.469665, 9.810041] + ] + ], + [ + [ + [111.925265, 8.070827], + [111.949287, 8.05068], + [111.994866, 8.047125], + [112.018888, 8.065494], + [112.013344, 8.093342], + [111.95483, 8.106377], + [111.925265, 8.070827] + ] + ], + [ + [ + [114.457392, 15.599305], + [114.466631, 15.576823], + [114.491884, 15.59354], + [114.457392, 15.599305] + ] + ], + [ + [ + [114.985252, 11.078332], + [115.013585, 11.063062], + [115.021592, 11.085967], + [114.985252, 11.078332] + ] + ], + [ + [ + [114.10569, 16.004124], + [114.110618, 15.978235], + [114.132176, 16.007575], + [114.10569, 16.004124] + ] + ], + [ + [ + [116.045283, 10.095338], + [116.067457, 10.065876], + [116.09579, 10.09357], + [116.070537, 10.12892], + [116.045283, 10.095338] + ] + ], + [ + [ + [117.266691, 10.69163], + [117.348611, 10.672811], + [117.404661, 10.671047], + [117.418212, 10.702803], + [117.369553, 10.7422], + [117.293176, 10.735144], + [117.266691, 10.69163] + ] + ], + [ + [ + [114.854057, 7.244611], + [114.819564, 7.192957], + [114.869455, 7.198895], + [114.854057, 7.244611] + ] + ], + [ + [ + [112.823305, 8.910729], + [112.859645, 8.889444], + [112.873196, 8.908364], + [112.823305, 8.910729] + ] + ], + [ + [ + [111.670266, 7.651098], + [111.707223, 7.648725], + [111.749722, 7.703884], + [111.726317, 7.729977], + [111.691208, 7.711593], + [111.670266, 7.651098] + ] + ], + [ + [ + [112.207981, 8.835634], + [112.235699, 8.827355], + [112.241242, 8.852783], + [112.207981, 8.835634] + ] + ], + [ + [ + [112.527654, 5.79444], + [112.531965, 5.766455], + [112.562762, 5.75931], + [112.562146, 5.820637], + [112.527654, 5.79444] + ] + ], + [ + [ + [114.599058, 8.846278], + [114.645869, 8.844504], + [114.68221, 8.881166], + [114.665579, 8.900087], + [114.61692, 8.881166], + [114.599058, 8.846278] + ] + ], + [ + [ + [114.868223, 7.983715], + [114.907643, 7.951117], + [114.914419, 8.00742], + [114.883006, 8.011569], + [114.868223, 7.983715] + ] + ], + [ + [ + [112.945261, 8.410204], + [112.985297, 8.429149], + [112.949572, 8.432701], + [112.945261, 8.410204] + ] + ], + [ + [ + [113.600004, 6.961929], + [113.580294, 6.920344], + [113.62341, 6.942325], + [113.600004, 6.961929] + ] + ], + [ + [ + [116.695099, 16.345538], + [116.708034, 16.299591], + [116.738831, 16.303612], + [116.747454, 16.360469], + [116.717889, 16.373676], + [116.695099, 16.345538] + ] + ], + [ + [ + [117.347995, 10.090624], + [117.354154, 10.06293], + [117.385567, 10.063519], + [117.373864, 10.106532], + [117.347995, 10.090624] + ] + ], + [ + [ + [112.993304, 19.472003], + [113.038883, 19.480466], + [113.048123, 19.506417], + [113.029028, 19.52898], + [112.993304, 19.52616], + [112.980369, 19.496263], + [112.993304, 19.472003] + ] + ], + [ + [ + [114.448153, 16.034035], + [114.485109, 16.034611], + [114.521449, 16.056466], + [114.465399, 16.067393], + [114.448153, 16.034035] + ] + ], + [ + [ + [113.832213, 19.158552], + [113.874097, 19.151203], + [113.914749, 19.172119], + [113.920293, 19.223551], + [113.875945, 19.237113], + [113.80696, 19.222986], + [113.799568, 19.19925], + [113.832213, 19.158552] + ] + ], + [ + [ + [112.650842, 5.106941], + [112.655769, 5.055676], + [112.682871, 5.048522], + [112.719211, 5.075944], + [112.678559, 5.121247], + [112.650842, 5.106941] + ] + ], + [ + [ + [111.638853, 7.907254], + [111.665339, 7.887099], + [111.712766, 7.887099], + [111.713382, 7.927408], + [111.651788, 7.932743], + [111.638853, 7.907254] + ] + ], + [ + [ + [112.244322, 8.874662], + [112.281278, 8.855148], + [112.288669, 8.885896], + [112.244322, 8.874662] + ] + ], + [ + [ + [112.89229, 7.844416], + [112.929862, 7.827815], + [112.93171, 7.867537], + [112.89229, 7.844416] + ] + ], + [ + [ + [112.583088, 5.56159], + [112.606494, 5.51751], + [112.614501, 5.465683], + [112.642834, 5.489512], + [112.616349, 5.568737], + [112.583088, 5.56159] + ] + ], + [ + [ + [112.523342, 5.656289], + [112.5449, 5.616386], + [112.565842, 5.63068], + [112.56153, 5.677133], + [112.528886, 5.687257], + [112.523342, 5.656289] + ] + ], + [ + [ + [115.361591, 13.948985], + [115.397315, 13.92517], + [115.438583, 13.943757], + [115.423185, 13.977443], + [115.377605, 13.968732], + [115.361591, 13.948985] + ] + ], + [ + [ + [113.596924, 10.240836], + [113.617866, 10.22199], + [113.638192, 10.243192], + [113.596924, 10.240836] + ] + ], + [ + [ + [113.860546, 15.477068], + [113.893807, 15.463802], + [113.890112, 15.490909], + [113.860546, 15.477068] + ] + ], + [ + [ + [112.907072, 4.993079], + [112.943413, 4.991887], + [112.952652, 5.047926], + [112.910768, 5.038388], + [112.907072, 4.993079] + ] + ], + [ + [ + [112.557219, 5.109326], + [112.568922, 5.071771], + [112.610806, 5.091443], + [112.601567, 5.120055], + [112.557219, 5.109326] + ] + ], + [ + [ + [112.350263, 5.621747], + [112.385988, 5.615791], + [112.385372, 5.643187], + [112.350263, 5.621747] + ] + ], + [ + [ + [112.226459, 16.759147], + [112.254177, 16.751698], + [112.262184, 16.778057], + [112.211061, 16.795819], + [112.226459, 16.759147] + ] + ], + [ + [ + [112.233851, 15.69612], + [112.25972, 15.734718], + [112.240626, 15.741055], + [112.20367, 15.71398], + [112.233851, 15.69612] + ] + ], + [ + [ + [112.612037, 5.367973], + [112.640371, 5.347715], + [112.685334, 5.371548], + [112.690878, 5.406702], + [112.62374, 5.401935], + [112.612037, 5.367973] + ] + ], + [ + [ + [112.472219, 5.73966], + [112.496857, 5.736683], + [112.498089, 5.775387], + [112.472219, 5.73966] + ] + ], + [ + [ + [113.217506, 6.306249], + [113.230441, 6.285429], + [113.243991, 6.325878], + [113.217506, 6.306249] + ] + ], + [ + [ + [116.152457, 9.579384], + [116.189413, 9.565221], + [116.187565, 9.595317], + [116.152457, 9.579384] + ] + ], + [ + [ + [114.948911, 7.508722], + [114.960614, 7.484988], + [115.012353, 7.484988], + [115.013585, 7.525928], + [114.948911, 7.508722] + ] + ], + [ + [ + [111.553854, 7.807656], + [111.585267, 7.771487], + [111.619759, 7.840265], + [111.603745, 7.861608], + [111.553854, 7.807656] + ] + ], + [ + [ + [113.938771, 15.8355], + [113.973263, 15.805558], + [113.9708, 15.83953], + [113.938771, 15.8355] + ] + ], + [ + [ + [114.926122, 16.036911], + [114.895325, 16.036336], + [114.910723, 16.001823], + [114.926122, 16.036911] + ] + ], + [ + [ + [116.749302, 9.056736], + [116.699411, 9.049053], + [116.70865, 9.024229], + [116.740679, 9.028367], + [116.749302, 9.056736] + ] + ], + [ + [ + [112.64653, 16.385733], + [112.681639, 16.400661], + [112.660081, 16.426494], + [112.64653, 16.385733] + ] + ], + [ + [ + [111.203384, 19.92557], + [111.203384, 19.925007], + [111.204, 19.92557], + [111.204, 19.926132], + [111.203384, 19.92557] + ] + ], + [ + [ + [115.758256, 10.461018], + [115.776118, 10.434534], + [115.801987, 10.463372], + [115.758256, 10.461018] + ] + ], + [ + [ + [117.21372, 10.735144], + [117.187235, 10.741612], + [117.206945, 10.707507], + [117.21372, 10.735144] + ] + ], + [ + [ + [112.671784, 16.331755], + [112.701349, 16.331755], + [112.677943, 16.35932], + [112.671784, 16.331755] + ] + ], + [ + [ + [115.782277, 10.541046], + [115.795212, 10.499858], + [115.805067, 10.524571], + [115.782277, 10.541046] + ] + ], + [ + [ + [112.512255, 9.544566], + [112.50856, 9.525679], + [112.568922, 9.516826], + [112.567074, 9.554008], + [112.512255, 9.544566] + ] + ], + [ + [ + [114.610145, 15.649447], + [114.581195, 15.625242], + [114.610761, 15.615444], + [114.610145, 15.649447] + ] + ], + [ + [ + [117.299336, 11.077745], + [117.264227, 11.063062], + [117.284553, 11.02547], + [117.304263, 11.027232], + [117.299336, 11.077745] + ] + ], + [ + [ + [117.691073, 11.048965], + [117.653501, 11.046029], + [117.655965, 11.024882], + [117.690457, 11.016658], + [117.691073, 11.048965] + ] + ], + [ + [ + [114.166668, 9.38459], + [114.175291, 9.342075], + [114.195617, 9.350933], + [114.194386, 9.391676], + [114.166668, 9.38459] + ] + ], + [ + [ + [114.714854, 9.736909], + [114.693296, 9.741038], + [114.680978, 9.707416], + [114.704999, 9.700337], + [114.714854, 9.736909] + ] + ], + [ + [ + [112.554139, 5.97839], + [112.553523, 5.942676], + [112.575697, 5.971247], + [112.554139, 5.97839] + ] + ] + ] + }, + "properties": { + "name": "China", + "childNum": 15 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-5.26230468749998, 10.319677734375], + [-4.72177734374992, 9.75654296875003], + [-4.62583007812501, 9.71357421874997], + [-4.52661132812494, 9.72348632812503], + [-4.40620117187493, 9.64799804687503], + [-4.33222656249996, 9.645703125], + [-4.18115234375, 9.78173828125], + [-3.790625, 9.91718749999998], + [-3.58115234374998, 9.92431640625001], + [-3.28969726562502, 9.88222656250005], + [-3.22353515624994, 9.895458984375], + [-3.16069335937493, 9.84916992187497], + [-3.09580078124995, 9.75209960937501], + [-3.04262695312494, 9.72089843750004], + [-2.98828124999997, 9.68735351562496], + [-2.90087890624994, 9.53461914062503], + [-2.87514648437494, 9.500927734375], + [-2.81674804687495, 9.42583007812497], + [-2.76660156249994, 9.42470703125001], + [-2.7171875, 9.45712890625005], + [-2.69584960937499, 9.48134765625001], + [-2.68613281249998, 9.43173828125002], + [-2.70576171874998, 9.35136718749999], + [-2.74692382812492, 9.04511718750004], + [-2.68989257812496, 9.02509765625004], + [-2.64921875000002, 8.95659179687503], + [-2.60039062500002, 8.80043945312502], + [-2.50585937500003, 8.208740234375], + [-2.53828124999996, 8.17163085937499], + [-2.61171875, 8.14755859374996], + [-2.61997070312501, 8.12109375], + [-2.60097656249994, 8.08222656249998], + [-2.61337890624998, 8.04667968750002], + [-2.66884765624999, 8.02221679687501], + [-2.78974609374996, 7.93193359375], + [-2.95908203124998, 7.454541015625], + [-3.22714843749998, 6.74912109374999], + [-2.99829101562497, 5.71132812500005], + [-2.79365234374996, 5.60009765625003], + [-2.75498046874998, 5.43251953124999], + [-2.815673828125, 5.15302734375], + [-3.16870117187497, 5.20302734374997], + [-3.19995117187494, 5.3544921875], + [-3.34755859374999, 5.13066406249996], + [-4.12016601562502, 5.30971679687502], + [-4.60888671875, 5.235888671875], + [-4.03720703124998, 5.23012695312498], + [-4.89970703124993, 5.13833007812502], + [-5.28237304687499, 5.21025390625002], + [-5.36752929687492, 5.15078125], + [-5.06181640624999, 5.13066406249996], + [-5.91376953124993, 5.0109375], + [-7.54497070312499, 4.351318359375], + [-7.57465820312498, 4.57231445312499], + [-7.58505859374998, 4.916748046875], + [-7.39990234375, 5.55058593749999], + [-7.45439453124999, 5.84130859374997], + [-7.63613281249999, 5.90771484375], + [-7.73037109374999, 5.91904296874999], + [-7.80092773437499, 6.03891601562499], + [-7.833251953125, 6.07636718749998], + [-7.85551757812502, 6.150146484375], + [-7.88862304687501, 6.23486328125003], + [-7.98159179687494, 6.2861328125], + [-8.287109375, 6.31904296875004], + [-8.587890625, 6.49052734374999], + [-8.32451171874999, 6.92001953124999], + [-8.40874023437499, 7.41181640625], + [-8.42998046874999, 7.60185546874999], + [-8.35175781249993, 7.590576171875], + [-8.23188476562496, 7.55673828125003], + [-8.20595703124999, 7.59023437500002], + [-8.11542968749993, 7.76074218750003], + [-8.12685546874994, 7.86772460937497], + [-8.00986328124992, 8.07851562500002], + [-8.048583984375, 8.16972656250005], + [-8.140625, 8.18144531250003], + [-8.21713867187495, 8.21967773437501], + [-8.256103515625, 8.25371093750002], + [-8.24414062499994, 8.40791015624998], + [-8.23696289062499, 8.45566406250003], + [-7.953125, 8.477734375], + [-7.82358398437498, 8.46767578124999], + [-7.73896484374998, 8.37524414062499], + [-7.69609374999993, 8.37558593749998], + [-7.71958007812492, 8.64301757812501], + [-7.95097656249999, 8.78681640625], + [-7.93818359374998, 8.97978515624996], + [-7.902099609375, 9.01708984375001], + [-7.77797851562494, 9.08085937500003], + [-7.79980468749994, 9.11503906249999], + [-7.83940429687502, 9.15161132812497], + [-7.91806640624995, 9.18852539062503], + [-7.89619140624996, 9.41586914062499], + [-8.13696289062497, 9.49570312499999], + [-8.15517578124994, 9.97319335937502], + [-7.990625, 10.1625], + [-7.66113281250003, 10.42744140625], + [-7.38505859374999, 10.34013671875], + [-7.01708984375, 10.14326171875], + [-6.95034179687499, 10.342333984375], + [-6.69326171875002, 10.349462890625], + [-6.66933593749994, 10.3921875], + [-6.69199218749992, 10.51201171875], + [-6.68613281249998, 10.5780273437501], + [-6.67636718749995, 10.6337890625], + [-6.65415039062495, 10.6564453125], + [-6.48261718749998, 10.56123046875], + [-6.250244140625, 10.717919921875], + [-6.19067382812494, 10.40029296875], + [-6.19262695312497, 10.36943359375], + [-6.24130859374995, 10.27919921875], + [-6.23837890624998, 10.26162109375], + [-6.11718749999997, 10.201904296875], + [-6.03457031249994, 10.1948242187501], + [-5.90756835937501, 10.3072265625], + [-5.89619140624998, 10.354736328125], + [-5.84384765624998, 10.38955078125], + [-5.69428710937498, 10.433203125], + [-5.55659179687498, 10.43994140625], + [-5.38227539062501, 10.314013671875], + [-5.26230468749998, 10.319677734375] + ] + ] + }, + "properties": { + "name": "Ivory Coast", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [15.480078125, 7.52377929687499], + [15.20673828125, 7.20615234374999], + [14.7392578125, 6.27978515625], + [14.43115234375, 6.03872070312499], + [14.61689453125, 5.86513671874999], + [14.56298828125, 5.27993164062499], + [14.73125, 4.60239257812499], + [15.06357421875, 4.28486328125], + [15.1287109375, 3.826904296875], + [16.0634765625, 2.90859375], + [16.1833984375, 2.27006835937499], + [16.059375, 1.676220703125], + [15.7416015625, 1.914990234375], + [14.90244140625, 2.01230468749999], + [14.57890625, 2.19912109374999], + [13.2935546875, 2.161572265625], + [13.2203125, 2.25644531249999], + [11.558984375, 2.302197265625], + [11.3484375, 2.29970703124999], + [11.3287109375, 2.167431640625], + [11.09658203125, 2.16748046875], + [10.79091796875, 2.16757812499999], + [9.97988281250002, 2.16777343749999], + [9.8701171875, 2.21328125], + [9.8369140625, 2.2423828125], + [9.83037109375002, 2.27548828124999], + [9.826171875, 2.297802734375], + [9.80078125, 2.304443359375], + [9.82177734375, 2.5392578125], + [9.94843750000001, 3.079052734375], + [9.67207031250001, 3.53759765625], + [9.76572265625001, 3.62382812499999], + [9.64238281250002, 3.611767578125], + [9.55615234375, 3.798046875], + [9.73964843750002, 3.85292968749999], + [9.63994140625002, 3.96533203125], + [9.68886718750002, 4.056396484375], + [9.48369140625002, 4.06611328125], + [9.42529296875, 3.922314453125], + [9.00009765625001, 4.09160156249999], + [8.91826171875002, 4.55375976562499], + [8.66035156250001, 4.67099609374999], + [8.65625, 4.516357421875], + [8.53955078125, 4.571875], + [8.715625, 5.046875], + [8.99716796875001, 5.917724609375], + [9.490234375, 6.41865234375], + [9.77988281250001, 6.76015625], + [9.82070312500002, 6.783935546875], + [9.87421875000001, 6.80327148437499], + [10.0388671875, 6.92138671875], + [10.1435546875, 6.99643554687499], + [10.1677734375, 6.9591796875], + [10.185546875, 6.91279296875], + [10.20546875, 6.8916015625], + [10.29306640625, 6.87675781249999], + [10.41318359375, 6.87773437499999], + [10.60625, 7.06308593749999], + [10.95419921875, 6.7765625], + [11.03251953125, 6.69790039062499], + [11.1064453125, 6.45771484375], + [11.1533203125, 6.437939453125], + [11.2373046875, 6.45053710937499], + [11.4017578125, 6.533935546875], + [11.55166015625, 6.697265625], + [11.580078125, 6.8888671875], + [11.65751953125, 6.9515625], + [11.86142578125, 7.11640625], + [11.7673828125, 7.27226562499999], + [11.8091796875, 7.34506835937499], + [12.016015625, 7.58974609374999], + [12.2333984375, 8.28232421874999], + [12.403515625, 8.59555664062499], + [12.58271484375, 8.62412109374999], + [12.6515625, 8.66777343749999], + [12.7822265625, 8.81787109375], + [12.80654296875, 8.88662109374999], + [12.87568359375, 9.30351562499999], + [12.9294921875, 9.42626953125], + [13.19873046875, 9.56376953124999], + [13.269921875, 10.036181640625], + [13.41455078125, 10.171435546875], + [13.5353515625, 10.605078125], + [13.69990234375, 10.87314453125], + [13.89208984375, 11.140087890625], + [13.9814453125, 11.211865234375], + [14.05673828125, 11.24501953125], + [14.14326171875, 11.24853515625], + [14.20234375, 11.2681640625], + [14.559765625, 11.49228515625], + [14.6197265625, 12.1509765625], + [14.5189453125, 12.2982421875], + [14.2728515625, 12.356494140625], + [14.18486328125, 12.447216796875], + [14.06396484375, 13.078515625], + [14.24482421875, 13.07734375], + [14.46171875, 13.02177734375], + [14.8470703125, 12.502099609375], + [15.08125, 11.8455078125], + [15.0298828125, 11.113671875], + [15.1322265625, 10.648486328125], + [15.27607421875, 10.357373046875], + [15.6548828125, 10.0078125], + [14.24326171875, 9.979736328125], + [13.97724609375, 9.69155273437499], + [14.33232421875, 9.20351562499999], + [15.1162109375, 8.55732421875], + [15.5498046875, 7.78789062499999], + [15.480078125, 7.52377929687499] + ] + ] + }, + "properties": { + "name": "Cameroon", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [27.4033203125, 5.10917968749999], + [27.7880859375, 4.64467773437499], + [28.19208984375, 4.35024414062499], + [28.4275390625, 4.324169921875], + [28.72705078125, 4.50498046874999], + [29.22490234375, 4.39189453124999], + [29.46962890625, 4.61181640625], + [29.67685546875, 4.5869140625], + [30.194921875, 3.98193359375], + [30.50830078125, 3.835693359375], + [30.58671875, 3.62421875], + [30.7572265625, 3.62421875], + [30.83857421875, 3.49072265625], + [30.9064453125, 3.408935546875], + [30.75400390625, 3.04179687499999], + [30.8466796875, 2.84702148437499], + [30.72861328125, 2.45537109374999], + [31.1763671875, 2.27006835937499], + [31.252734375, 2.04458007812499], + [29.94287109375, 0.819238281249994], + [29.93447265625, 0.4990234375], + [29.71767578125, 0.098339843749997], + [29.576953125, -1.38789062500001], + [29.19658203125, -1.71992187500001], + [29.13154296875, -2.1951171875], + [28.8763671875, -2.40029296875001], + [28.8939453125, -2.63505859375], + [29.01435546875, -2.72021484375], + [29.2244140625, -3.053515625], + [29.21181640625, -3.8337890625], + [29.40322265625, -4.44931640625001], + [29.40419921875, -4.49667968750001], + [29.32568359375, -4.83564453125001], + [29.3234375, -4.898828125], + [29.3427734375, -4.98310546875001], + [29.5423828125, -5.4998046875], + [29.594140625, -5.65078125], + [29.60703125, -5.72265625], + [29.59638671875, -5.77597656250001], + [29.4908203125, -5.96542968750001], + [29.480078125, -6.025], + [29.50625, -6.17207031250001], + [29.5408203125, -6.31386718750001], + [29.590625, -6.39443359375001], + [29.70966796875, -6.61689453125001], + [29.79814453125, -6.69189453125], + [29.96181640625, -6.803125], + [30.10625, -6.9150390625], + [30.2126953125, -7.037890625], + [30.31318359375, -7.20371093750001], + [30.40673828125, -7.46064453125001], + [30.751171875, -8.19365234375], + [28.89814453125, -8.48544921875001], + [28.86953125, -8.78583984375001], + [28.40068359375, -9.22480468750001], + [28.60419921875, -9.67880859375001], + [28.6455078125, -10.5501953125], + [28.3833984375, -11.56669921875], + [28.48251953125, -11.812109375], + [29.06435546875, -12.348828125], + [29.485546875, -12.41845703125], + [29.508203125, -12.22822265625], + [29.7951171875, -12.15546875], + [29.7751953125, -13.4380859375], + [29.55419921875, -13.24892578125], + [29.20185546875, -13.39833984375], + [29.0142578125, -13.36884765625], + [28.730078125, -12.92548828125], + [28.55087890625, -12.8361328125], + [28.412890625, -12.51806640625], + [27.573828125, -12.22705078125], + [27.1591796875, -11.57919921875], + [26.8240234375, -11.965234375], + [26.0259765625, -11.89013671875], + [25.3494140625, -11.623046875], + [25.28876953125, -11.21240234375], + [24.3779296875, -11.41708984375], + [24.36572265625, -11.1298828125], + [23.96650390625, -10.87177734375], + [23.901171875, -10.983203125], + [23.83388671875, -11.013671875], + [23.46396484375, -10.9693359375], + [23.07626953125, -11.087890625], + [22.81474609375, -11.0802734375], + [22.56103515625, -11.055859375], + [22.4861328125, -11.08671875], + [22.39296875, -11.15947265625], + [22.31494140625, -11.1986328125], + [22.27880859375, -11.194140625], + [22.226171875, -11.12197265625], + [22.203515625, -10.8294921875], + [22.30703125, -10.69130859375], + [22.19775390625, -10.040625], + [21.81318359375, -9.46875], + [21.90537109375, -8.693359375], + [21.8060546875, -7.32861328125], + [21.75107421875, -7.30546875], + [21.19033203125, -7.2849609375], + [20.9109375, -7.28144531250001], + [20.6078125, -7.277734375], + [20.5583984375, -7.24443359375], + [20.53583984375, -7.18281250000001], + [20.5369140625, -7.12177734375001], + [20.59873046875, -6.93515625], + [20.5900390625, -6.919921875], + [20.4822265625, -6.9158203125], + [20.1900390625, -6.9462890625], + [19.9974609375, -6.97646484375001], + [19.8751953125, -6.986328125], + [19.52763671875, -7.14443359375001], + [19.4837890625, -7.27949218750001], + [19.4798828125, -7.47216796875], + [19.3716796875, -7.655078125], + [19.369921875, -7.70654296875], + [19.3408203125, -7.9666015625], + [19.14267578125, -8.00146484375], + [18.94443359375, -8.00146484375], + [18.5626953125, -7.9359375], + [18.0087890625, -8.10761718750001], + [17.643359375, -8.09072265625001], + [17.57958984375, -8.09902343750001], + [16.984765625, -7.257421875], + [16.91943359375, -6.933984375], + [16.8130859375, -6.77255859375001], + [16.74296875, -6.61845703125], + [16.697265625, -6.16425781250001], + [16.537109375, -5.9658203125], + [16.4314453125, -5.9001953125], + [16.315234375, -5.865625], + [13.978515625, -5.8572265625], + [13.346484375, -5.86337890625001], + [13.184375, -5.85625], + [12.4529296875, -6.00048828125], + [12.213671875, -5.75869140625001], + [12.4845703125, -5.71875], + [12.45146484375, -5.07148437500001], + [12.502734375, -5.0369140625], + [12.57353515625, -4.99658203125], + [12.59619140625, -4.97841796875001], + [12.8296875, -4.73662109375], + [12.9474609375, -4.6953125], + [13.05732421875, -4.65107421875001], + [13.07275390625, -4.634765625], + [13.08740234375, -4.601953125], + [13.13662109375, -4.604296875], + [13.41494140625, -4.83740234375], + [13.6595703125, -4.721484375], + [13.71708984375, -4.45449218750001], + [13.94091796875, -4.48466796875], + [14.35830078125, -4.29941406250001], + [14.4498046875, -4.44951171875], + [14.3654296875, -4.585546875], + [14.4107421875, -4.83125], + [14.70791015625, -4.88173828125001], + [15.9900390625, -3.76621093750001], + [16.2173828125, -3.0302734375], + [16.21533203125, -2.17783203125001], + [16.54072265625, -1.84013671875], + [16.8798828125, -1.22587890625], + [17.75283203125, -0.549023437500011], + [18.07216796875, 2.01328125], + [18.49091796875, 2.92441406249999], + [18.6103515625, 3.47841796874999], + [18.594140625, 4.34624023437499], + [19.0685546875, 4.89140624999999], + [19.5009765625, 5.12749023437499], + [19.80654296875, 5.089306640625], + [20.2263671875, 4.82963867187499], + [20.55810546875, 4.46269531249999], + [22.42216796875, 4.1349609375], + [22.86455078125, 4.723876953125], + [23.4171875, 4.66313476562499], + [24.31982421875, 4.994140625], + [25.065234375, 4.96743164062499], + [25.52509765625, 5.31210937499999], + [26.8220703125, 5.06240234374999], + [27.071875, 5.19975585937499], + [27.4033203125, 5.10917968749999] + ] + ] + }, + "properties": { + "name": "Democratic Republic of the Congo", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.6103515625, 3.47841796874999], + [18.49091796875, 2.92441406249999], + [18.07216796875, 2.01328125], + [17.75283203125, -0.549023437500011], + [16.8798828125, -1.22587890625], + [16.54072265625, -1.84013671875], + [16.21533203125, -2.17783203125001], + [16.2173828125, -3.0302734375], + [15.9900390625, -3.76621093750001], + [14.70791015625, -4.88173828125001], + [14.4107421875, -4.83125], + [14.3654296875, -4.585546875], + [14.4498046875, -4.44951171875], + [14.35830078125, -4.29941406250001], + [13.94091796875, -4.48466796875], + [13.71708984375, -4.45449218750001], + [13.6595703125, -4.721484375], + [13.41494140625, -4.83740234375], + [13.13662109375, -4.604296875], + [13.08740234375, -4.601953125], + [13.07275390625, -4.634765625], + [13.048046875, -4.61923828125001], + [12.97138671875, -4.5517578125], + [12.8810546875, -4.4451171875], + [12.84814453125, -4.42890625000001], + [12.50146484375, -4.5875], + [12.018359375, -5.004296875], + [11.7775390625, -4.56582031250001], + [11.13017578125, -3.91630859375], + [11.23447265625, -3.69082031250001], + [11.504296875, -3.5203125], + [11.6857421875, -3.68203125], + [11.8798828125, -3.66591796875001], + [11.9341796875, -3.31855468750001], + [11.7154296875, -3.17695312500001], + [11.76015625, -2.98310546875001], + [11.53779296875, -2.83671875], + [11.60546875, -2.342578125], + [12.064453125, -2.41259765625], + [12.44638671875, -2.32998046875001], + [12.43212890625, -1.92890625000001], + [12.5904296875, -1.82685546875001], + [12.7935546875, -1.93183593750001], + [12.9919921875, -2.31337890625001], + [13.46494140625, -2.39541015625001], + [13.7337890625, -2.1384765625], + [13.8869140625, -2.46542968750001], + [13.99384765625, -2.490625], + [14.1998046875, -2.35419921875001], + [14.162890625, -2.217578125], + [14.383984375, -1.89003906250001], + [14.47412109375, -0.573437500000011], + [13.86005859375, -0.203320312500011], + [13.949609375, 0.353808593749989], + [14.32421875, 0.62421875], + [14.4298828125, 0.901464843749991], + [14.180859375, 1.37021484374999], + [13.8513671875, 1.41875], + [13.21630859375, 1.2484375], + [13.17216796875, 1.78857421875], + [13.2935546875, 2.161572265625], + [14.57890625, 2.19912109374999], + [14.90244140625, 2.01230468749999], + [15.7416015625, 1.914990234375], + [16.059375, 1.676220703125], + [16.1833984375, 2.27006835937499], + [16.4685546875, 2.83173828125], + [16.6107421875, 3.50537109375], + [17.4916015625, 3.68730468749999], + [18.1609375, 3.49980468749999], + [18.4744140625, 3.622998046875], + [18.6103515625, 3.47841796874999] + ] + ] + }, + "properties": { + "name": "Congo", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-71.3197265625, 11.8619140625], + [-71.95810546875, 11.66640625], + [-72.248486328125, 11.196435546875], + [-72.690087890625, 10.83583984375], + [-72.8693359375, 10.491259765625], + [-73.00654296875, 9.78916015625001], + [-73.3662109375, 9.19414062500002], + [-73.0583984375, 9.25957031250003], + [-72.79638671875, 9.10898437499999], + [-72.6654296874999, 8.62758789062498], + [-72.39033203125, 8.28706054687497], + [-72.47197265625, 7.52426757812499], + [-72.20771484375, 7.37026367187498], + [-72.0066406249999, 7.03261718750002], + [-71.1286132812499, 6.98671875], + [-70.737158203125, 7.0900390625], + [-70.12919921875, 6.95361328125], + [-69.4271484375, 6.123974609375], + [-68.47177734375, 6.15654296874997], + [-67.8591796875, 6.28989257812496], + [-67.481982421875, 6.18027343750002], + [-67.473876953125, 5.92998046875], + [-67.82490234375, 5.27045898437503], + [-67.8552734375, 4.50688476562499], + [-67.66162109375, 3.86425781249999], + [-67.3111328125, 3.41586914062502], + [-67.85908203125, 2.79360351562499], + [-67.618701171875, 2.79360351562499], + [-67.21083984375, 2.39013671875004], + [-66.876025390625, 1.22304687500004], + [-67.082275390625, 1.18540039062501], + [-67.11923828125, 1.70361328124999], + [-67.400439453125, 2.11669921875003], + [-67.93623046875, 1.74848632812497], + [-68.193798828125, 1.98701171874998], + [-68.25595703125, 1.84550781250002], + [-68.1765625, 1.71982421874999], + [-69.8485839843749, 1.70874023437504], + [-69.8521484375, 1.05952148437504], + [-69.31181640625, 1.05048828124997], + [-69.1533203124999, 0.65878906250002], + [-69.472119140625, 0.72993164062504], + [-70.0539062499999, 0.578613281250028], + [-70.0705078124999, -0.13886718750004], + [-69.633984375, -0.50927734375], + [-69.400244140625, -1.19492187499998], + [-69.66904296875, -2.66767578125], + [-69.948193359375, -4.20058593750001], + [-69.96591796875, -4.2359375], + [-70.167529296875, -4.05019531250001], + [-70.240283203125, -3.88271484374999], + [-70.2984375, -3.84423828124997], + [-70.339501953125, -3.81435546875001], + [-70.735107421875, -3.78154296874999], + [-70.0958496093749, -2.65820312500001], + [-70.16474609375, -2.63984375000001], + [-70.24443359375, -2.60654296874998], + [-70.29462890625, -2.55253906249999], + [-70.57587890625, -2.41826171874999], + [-70.647998046875, -2.40576171875001], + [-70.70537109375, -2.34199218749998], + [-70.91455078125, -2.21855468749997], + [-70.9685546875, -2.20683593749999], + [-71.027294921875, -2.22578125000003], + [-71.11337890625, -2.24541015625003], + [-71.19638671875, -2.31308593749996], + [-71.39697265625, -2.33408203124998], + [-71.55947265625, -2.22421874999998], + [-71.7525390625, -2.15273437499998], + [-71.802734375, -2.16630859374999], + [-71.86728515625, -2.22773437499998], + [-71.932470703125, -2.28867187499996], + [-71.98427734375, -2.32656249999995], + [-72.21845703125, -2.40048828125001], + [-72.94111328125, -2.39404296875003], + [-72.9896484375, -2.33974609374998], + [-73.1544921874999, -2.27822265624997], + [-73.19697265625, -1.83027343750001], + [-73.4962890624999, -1.69306640625004], + [-73.664306640625, -1.24882812499995], + [-73.86318359375, -1.19667968749998], + [-73.926953125, -1.12519531249998], + [-73.98681640625, -1.09814453124999], + [-74.05439453125, -1.02861328125003], + [-74.18076171875, -0.997753906249955], + [-74.24638671875, -0.970605468750023], + [-74.28388671875, -0.927832031250006], + [-74.334423828125, -0.85087890624996], + [-74.41787109375, -0.580664062499977], + [-74.465185546875, -0.517675781250034], + [-74.5138671874999, -0.470117187500023], + [-74.555078125, -0.429882812499997], + [-74.6163574218749, -0.370019531249966], + [-74.691650390625, -0.335253906249989], + [-74.75537109375, -0.298632812499989], + [-74.78046875, -0.24453125], + [-74.8017578125, -0.200097656249994], + [-75.13837890625, -0.050488281249969], + [-75.28447265625, -0.10654296875002], + [-75.77666015625, 0.08925781249998], + [-76.27060546875, 0.439404296874997], + [-76.49462890625, 0.23544921875002], + [-77.396337890625, 0.393896484374963], + [-77.46767578125, 0.636523437500017], + [-77.702880859375, 0.837841796874997], + [-78.1806640625, 0.968554687499974], + [-78.85966796875, 1.45537109375003], + [-79.025439453125, 1.62368164062504], + [-78.7929687499999, 1.84873046874996], + [-78.576904296875, 1.77377929687498], + [-78.59169921875, 2.35664062499997], + [-78.41689453125, 2.48349609374996], + [-78.0666503906249, 2.50913085937503], + [-77.81357421875, 2.71635742187497], + [-77.076806640625, 3.91328125000003], + [-77.263525390625, 3.89321289062502], + [-77.27802734375, 4.05849609375002], + [-77.358203125, 3.94472656250004], + [-77.408740234375, 4.24775390625004], + [-77.5207031249999, 4.21279296875002], + [-77.353515625, 4.39829101562498], + [-77.286328125, 4.72172851562496], + [-77.373291015625, 5.323974609375], + [-77.534423828125, 5.53710937499999], + [-77.249267578125, 5.78017578125004], + [-77.46943359375, 6.17675781250001], + [-77.368798828125, 6.57558593749999], + [-77.901171875, 7.22934570312505], + [-77.7619140625, 7.69882812500003], + [-77.53828125, 7.56625976562502], + [-77.19599609375, 7.9724609375], + [-77.4785156249999, 8.49843750000004], + [-77.3742187499999, 8.65830078125002], + [-76.85185546875, 8.09047851562498], + [-76.924658203125, 7.97319335937497], + [-76.7865722656249, 7.93159179687503], + [-76.7720703125, 8.31054687500004], + [-76.920458984375, 8.57373046875001], + [-76.27685546875, 8.98911132812499], + [-76.02724609375, 9.36577148437499], + [-75.63935546875, 9.45043945312501], + [-75.680029296875, 9.72978515624999], + [-75.53857421875, 10.20517578125], + [-75.708349609375, 10.143408203125], + [-75.44599609375, 10.610888671875], + [-74.844580078125, 11.109716796875], + [-74.330224609375, 10.9966796875], + [-74.516259765625, 10.8625], + [-74.40087890625, 10.765234375], + [-74.142919921875, 11.320849609375], + [-73.31337890625, 11.295751953125], + [-72.275, 11.8892578125], + [-72.1357421874999, 12.18857421875], + [-71.7145507812499, 12.419970703125], + [-71.262109375, 12.335302734375], + [-71.1373046875, 12.046337890625], + [-71.3197265625, 11.8619140625] + ] + ] + }, + "properties": { + "name": "Colombia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [43.788671875, -12.30703125], + [43.8589843750001, -12.36826171875], + [43.6636718750001, -12.3428710937499], + [43.63134765625, -12.2470703125], + [43.788671875, -12.30703125] + ] + ], + [ + [ + [44.4763671875001, -12.08154296875], + [44.50498046875, -12.35654296875], + [44.2201171875, -12.17138671875], + [44.4763671875001, -12.08154296875] + ] + ], + [ + [ + [43.4658203125, -11.90126953125], + [43.22666015625, -11.75185546875], + [43.2990234375001, -11.37451171875], + [43.3929687500001, -11.40859375], + [43.4658203125, -11.90126953125] + ] + ] + ] + }, + "properties": { + "name": "Comoros", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-24.308251953125, 14.856298828125], + [-24.4405273437499, 14.834814453125], + [-24.496875, 14.9802734375], + [-24.3294921874999, 15.019482421875], + [-24.308251953125, 14.856298828125] + ] + ], + [ + [ + [-23.18212890625, 15.136767578125], + [-23.21025390625, 15.3235351562501], + [-23.1193359375, 15.268408203125], + [-23.18212890625, 15.136767578125] + ] + ], + [ + [ + [-23.44423828125, 15.007958984375], + [-23.5046875, 14.91611328125], + [-23.70537109375, 14.961328125], + [-23.748095703125, 15.328515625], + [-23.44423828125, 15.007958984375] + ] + ], + [ + [ + [-22.917724609375, 16.237255859375], + [-22.692626953125, 16.16904296875], + [-22.710107421875, 16.043359375], + [-22.95927734375, 16.0451171875], + [-22.917724609375, 16.237255859375] + ] + ], + [ + [ + [-24.0876953125, 16.622509765625], + [-24.03271484375, 16.572021484375], + [-24.24306640625, 16.5994140625], + [-24.3223632812499, 16.493115234375], + [-24.398095703125, 16.618408203125], + [-24.0876953125, 16.622509765625] + ] + ], + [ + [ + [-22.888330078125, 16.65908203125], + [-22.9806152343749, 16.70087890625], + [-22.93291015625, 16.841015625], + [-22.888330078125, 16.65908203125] + ] + ], + [ + [ + [-24.887060546875, 16.818115234375], + [-25.09306640625, 16.83251953125], + [-24.936474609375, 16.922119140625], + [-24.887060546875, 16.818115234375] + ] + ], + [ + [ + [-25.16982421875, 16.946484375], + [-25.30830078125, 16.93583984375], + [-25.337109375, 17.091015625], + [-25.03466796875, 17.17646484375], + [-24.9796875, 17.0947265625], + [-25.16982421875, 16.946484375] + ] + ] + ] + }, + "properties": { + "name": "Cape Verde", + "childNum": 8 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-83.6419921875, 10.917236328125], + [-83.346826171875, 10.315380859375], + [-82.77841796875, 9.66953125], + [-82.56357421875, 9.57666015625], + [-82.56923828125, 9.55820312499999], + [-82.5865234375, 9.538818359375], + [-82.644091796875, 9.505859375], + [-82.801025390625, 9.591796875], + [-82.843994140625, 9.57080078125], + [-82.86015625, 9.511474609375], + [-82.88896484375, 9.48100585937499], + [-82.925048828125, 9.46904296874999], + [-82.93984375, 9.449169921875], + [-82.94033203125, 9.06010742187499], + [-82.88134765625, 9.055859375], + [-82.783056640625, 8.99028320312499], + [-82.741162109375, 8.95170898437499], + [-82.72783203125, 8.91606445312499], + [-82.917041015625, 8.74033203124999], + [-82.855712890625, 8.63530273437499], + [-82.844775390625, 8.48935546874999], + [-82.86162109375, 8.45351562499999], + [-83.02734375, 8.33774414062499], + [-82.879345703125, 8.07065429687499], + [-83.12333984375, 8.35307617187499], + [-83.16240234375, 8.58818359374999], + [-83.4697265625, 8.70683593749999], + [-83.29150390625, 8.406005859375], + [-83.54375, 8.44584960937499], + [-83.73408203125, 8.614453125], + [-83.613720703125, 8.80405273437499], + [-83.7369140625, 9.15029296874999], + [-84.581591796875, 9.568359375], + [-84.71494140625, 9.8994140625], + [-85.23564453125, 10.24208984375], + [-85.2365234375, 10.107373046875], + [-84.88642578125, 9.82094726562499], + [-85.07705078125, 9.60195312499999], + [-85.31455078125, 9.8109375], + [-85.624853515625, 9.90244140624999], + [-85.849658203125, 10.292041015625], + [-85.667236328125, 10.74501953125], + [-85.9080078125, 10.89755859375], + [-85.7443359375, 11.062109375], + [-85.5841796875, 11.189453125], + [-84.9091796875, 10.9453125], + [-84.6341796875, 11.04560546875], + [-83.919287109375, 10.7353515625], + [-83.712939453125, 10.785888671875], + [-83.6419921875, 10.917236328125] + ] + ] + }, + "properties": { + "name": "Costa Rica", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-82.561767578125, 21.5716796875], + [-82.959619140625, 21.44130859375], + [-83.1837890625, 21.59345703125], + [-82.973583984375, 21.5922851562501], + [-83.08251953125, 21.79140625], + [-82.9912109375, 21.942724609375], + [-82.71455078125, 21.890283203125], + [-82.561767578125, 21.5716796875] + ] + ], + [ + [ + [-77.6689941406249, 21.951953125], + [-77.9185546875, 22.0880859375], + [-77.6336914062499, 22.0540039062501], + [-77.6689941406249, 21.951953125] + ] + ], + [ + [ + [-77.87939453125, 22.1275390625], + [-78.041650390625, 22.20126953125], + [-77.99921875, 22.29873046875], + [-77.87939453125, 22.1275390625] + ] + ], + [ + [ + [-81.837451171875, 23.163037109375], + [-81.262353515625, 23.1568359375], + [-81.14462890625, 23.0549316406251], + [-80.6501464843749, 23.103076171875], + [-80.364892578125, 22.9434082031251], + [-79.820263671875, 22.88701171875], + [-79.27568359375, 22.4076171875], + [-78.6864746093749, 22.366845703125], + [-77.63681640625, 21.79736328125], + [-77.497119140625, 21.788330078125], + [-77.583154296875, 21.8892578125], + [-77.497265625, 21.871630859375], + [-77.144140625, 21.643603515625], + [-77.366162109375, 21.612646484375], + [-77.252880859375, 21.48349609375], + [-77.0986328125, 21.589013671875], + [-76.867431640625, 21.330419921875], + [-75.72294921875, 21.11103515625], + [-75.59580078125, 20.994677734375], + [-75.7245605468749, 20.71455078125], + [-74.882568359375, 20.650634765625], + [-74.513134765625, 20.3845703125], + [-74.16748046875, 20.2921875], + [-74.1537109375, 20.1685546875], + [-75.11640625, 19.901416015625], + [-75.151611328125, 20.008349609375], + [-75.290478515625, 19.893115234375], + [-76.158447265625, 19.98974609375], + [-77.715087890625, 19.85546875], + [-77.10380859375, 20.40751953125], + [-77.22958984375, 20.64375], + [-78.116357421875, 20.761865234375], + [-78.4907714843749, 21.0537109375], + [-78.727685546875, 21.592724609375], + [-79.357421875, 21.58515625], + [-80.23134765625, 21.8721679687501], + [-80.48544921875, 22.1234375], + [-81.03564453125, 22.0735839843751], + [-81.185498046875, 22.2679687500001], + [-81.284375, 22.1094238281251], + [-81.8494140624999, 22.213671875], + [-82.077734375, 22.3876953125], + [-81.7103515625, 22.4966796875], + [-81.838818359375, 22.6724609375], + [-82.738037109375, 22.6892578125001], + [-83.379638671875, 22.222998046875], + [-83.900732421875, 22.1701171875], + [-84.0309570312499, 21.943115234375], + [-84.502587890625, 21.776171875], + [-84.5013671875, 21.9302734375], + [-84.88720703125, 21.8569824218751], + [-84.3263671875, 22.07431640625], + [-84.361279296875, 22.37890625], + [-84.044921875, 22.6660156250001], + [-83.2578125, 22.967578125], + [-81.837451171875, 23.163037109375] + ] + ] + ] + }, + "properties": { + "name": "Cuba", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-68.75107421875, 12.059765625], + [-68.9951171875, 12.141845703125], + [-69.15888671875, 12.3802734375], + [-68.75107421875, 12.059765625] + ] + ] + }, + "properties": { + "name": "Curaçao", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-81.36953125, 19.348876953125], + [-81.10712890625, 19.3051757812501], + [-81.4047851562499, 19.27841796875], + [-81.36953125, 19.348876953125] + ] + ], + [ + [ + [-79.823388671875, 19.7119140625001], + [-79.906201171875, 19.7025390625], + [-79.74228515625, 19.75712890625], + [-79.823388671875, 19.7119140625001] + ] + ] + ] + }, + "properties": { + "name": "Cayman Is.", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.0044921875, 35.065234375], + [33.47578125, 35.000341796875], + [33.3837890625, 35.1626953125], + [32.91953125, 35.087841796875], + [32.7126953125, 35.171044921875], + [32.8798828125, 35.18056640625], + [32.9416015625, 35.3904296875], + [33.6076171875, 35.354150390625], + [34.5560546875, 35.662060546875], + [33.9419921875, 35.292041015625], + [34.0044921875, 35.065234375] + ] + ] + }, + "properties": { + "name": "N. Cyprus", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [32.7126953125, 35.171044921875], + [32.91953125, 35.087841796875], + [33.3837890625, 35.1626953125], + [33.47578125, 35.000341796875], + [34.0044921875, 35.065234375], + [34.0501953125, 34.98837890625], + [33.6994140625, 34.969873046875], + [33.00791015625, 34.569580078125], + [32.4490234375, 34.729443359375], + [32.3171875, 34.9533203125], + [32.3009765625, 35.082958984375], + [32.7126953125, 35.171044921875] + ] + ] + }, + "properties": { + "name": "Cyprus", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [14.809375, 50.858984375], + [14.89580078125, 50.861376953125], + [14.98291015625, 50.886572265625], + [14.99375, 51.01435546875], + [16.0072265625, 50.61162109375], + [16.2822265625, 50.655615234375], + [16.4197265625, 50.5736328125], + [16.2103515625, 50.42373046875], + [16.63916015625, 50.1021484375], + [16.9896484375, 50.2369140625], + [16.880078125, 50.42705078125], + [17.415234375, 50.25478515625], + [17.70224609375, 50.307177734375], + [17.62705078125, 50.11640625], + [17.8748046875, 49.972265625], + [18.0283203125, 50.03525390625], + [18.56240234375, 49.879345703125], + [18.8322265625, 49.510791015625], + [18.1609375, 49.257373046875], + [18.0859375, 49.06513671875], + [17.75849609375, 48.888134765625], + [17.13564453125, 48.841064453125], + [16.953125, 48.598828125], + [16.5435546875, 48.796240234375], + [16.0572265625, 48.75478515625], + [15.066796875, 48.9978515625], + [14.69130859375, 48.59921875], + [14.04912109375, 48.602490234375], + [13.81474609375, 48.766943359375], + [13.769921875, 48.815966796875], + [13.6849609375, 48.876708984375], + [13.54765625, 48.95966796875], + [13.44072265625, 48.95556640625], + [13.401171875, 48.977587890625], + [12.91669921875, 49.33046875], + [12.68115234375, 49.414501953125], + [12.39052734375, 49.7396484375], + [12.5125, 49.87744140625], + [12.09921875, 50.310986328125], + [12.13486328125, 50.3109375], + [12.1748046875, 50.28837890625], + [12.23115234375, 50.244873046875], + [12.27734375, 50.1814453125], + [12.3056640625, 50.205712890625], + [12.5490234375, 50.393408203125], + [13.01640625, 50.490380859375], + [13.18115234375, 50.510498046875], + [14.36904296875, 50.89873046875], + [14.3197265625, 51.03779296875], + [14.545703125, 50.9939453125], + [14.55966796875, 50.954931640625], + [14.59521484375, 50.918603515625], + [14.623828125, 50.91474609375], + [14.61357421875, 50.85556640625], + [14.658203125, 50.8326171875], + [14.72333984375, 50.814697265625], + [14.76650390625, 50.818310546875], + [14.7974609375, 50.842333984375], + [14.809375, 50.858984375] + ] + ] + }, + "properties": { + "name": "Czech Republic", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [14.1982421875, 53.91904296875], + [13.92578125, 53.879052734375], + [13.827734375, 54.12724609375], + [14.1982421875, 53.91904296875] + ] + ], + [ + [ + [13.7091796875, 54.38271484375], + [13.7073242187501, 54.28115234375], + [13.1900390625, 54.325634765625], + [13.33681640625, 54.697119140625], + [13.6576171875001, 54.5595703125], + [13.7091796875, 54.38271484375] + ] + ], + [ + [ + [9.73974609375003, 54.825537109375], + [10.02216796875, 54.67392578125], + [9.86865234375, 54.4724609375], + [10.73154296875, 54.3162597656251], + [11.0133789062501, 54.379150390625], + [11.0085937500001, 54.18115234375], + [10.8107421875001, 54.075146484375], + [10.9177734375, 53.9953125], + [11.399609375, 53.94462890625], + [12.111328125, 54.168310546875], + [12.575390625, 54.4673828125], + [13.02861328125, 54.41103515625], + [13.448046875, 54.140869140625], + [13.7242187500001, 54.15322265625], + [13.8655273437501, 53.853369140625], + [14.25888671875, 53.729638671875], + [14.2987304687501, 53.5564453125], + [14.41455078125, 53.28349609375], + [14.4123046875, 53.216748046875], + [14.4109375000001, 53.1990234375], + [14.3685546875001, 53.10556640625], + [14.2931640625001, 53.0267578125], + [14.1388671875001, 52.932861328125], + [14.12861328125, 52.87822265625], + [14.2537109375, 52.78251953125], + [14.5140625, 52.64560546875], + [14.61943359375, 52.528515625], + [14.5697265625, 52.431103515625], + [14.55458984375, 52.35966796875], + [14.5739257812501, 52.31416015625], + [14.615625, 52.27763671875], + [14.6798828125001, 52.25], + [14.7525390625, 52.0818359375], + [14.60166015625, 51.832373046875], + [14.7386718750001, 51.6271484375], + [14.7109375, 51.544921875], + [14.7247070312501, 51.523876953125], + [14.90595703125, 51.463330078125], + [14.935546875, 51.4353515625], + [14.9638671875, 51.0951171875], + [14.9174804687501, 51.008740234375], + [14.8142578125, 50.871630859375], + [14.809375, 50.858984375], + [14.7974609375, 50.842333984375], + [14.7665039062501, 50.818310546875], + [14.72333984375, 50.814697265625], + [14.658203125, 50.8326171875], + [14.61357421875, 50.8555664062501], + [14.623828125, 50.91474609375], + [14.5952148437501, 50.918603515625], + [14.55966796875, 50.954931640625], + [14.545703125, 50.9939453125], + [14.3197265625001, 51.03779296875], + [14.3690429687501, 50.89873046875], + [13.18115234375, 50.510498046875], + [13.01640625, 50.490380859375], + [12.5490234375, 50.393408203125], + [12.3056640625, 50.205712890625], + [12.27734375, 50.1814453125], + [12.23115234375, 50.244873046875], + [12.1748046875001, 50.28837890625], + [12.13486328125, 50.3109375], + [12.09921875, 50.310986328125], + [12.08984375, 50.3017578125], + [12.0897460937501, 50.2685546875], + [12.2945982142858, 50.1360811941964], + [12.5125, 49.87744140625], + [12.3905273437501, 49.7396484375], + [12.68115234375, 49.414501953125], + [12.91669921875, 49.33046875], + [13.4011718750001, 48.977587890625], + [13.44072265625, 48.95556640625], + [13.5476562500001, 48.95966796875], + [13.6849609375001, 48.8767089843751], + [13.7699218750001, 48.815966796875], + [13.81474609375, 48.766943359375], + [13.8029296875, 48.747509765625], + [13.798828125, 48.6216796875001], + [13.7853515625, 48.587451171875], + [13.4866210937501, 48.5818359375], + [13.4716796875, 48.571826171875], + [13.45986328125, 48.56455078125], + [13.409375, 48.3941406250001], + [13.3228515625, 48.33125], + [13.215234375, 48.301904296875], + [12.7603515625001, 48.106982421875], + [12.9535156250001, 47.890625], + [12.8976562500001, 47.721875], + [13.0541015625001, 47.655126953125], + [13.04794921875, 47.579150390625], + [13.0315429687501, 47.5080078125], + [13.01435546875, 47.478076171875], + [12.96806640625, 47.47568359375], + [12.8789062500001, 47.5064453125], + [12.809375, 47.5421875], + [12.7828125, 47.56416015625], + [12.7811523437501, 47.5904296875], + [12.79619140625, 47.60703125], + [12.77138671875, 47.639404296875], + [12.6858398437501, 47.6693359375], + [12.2092773437501, 47.71826171875], + [12.196875, 47.70908203125], + [12.20380859375, 47.646728515625], + [12.1856445312501, 47.61953125], + [11.0419921875, 47.393115234375], + [10.980859375, 47.39814453125], + [10.8939453125001, 47.470458984375], + [10.87060546875, 47.50078125], + [10.873046875, 47.52021484375], + [10.7416015625, 47.52412109375], + [10.65869140625, 47.547216796875], + [10.4828125000001, 47.541796875], + [10.439453125, 47.5515625], + [10.4039062500001, 47.4169921875], + [10.369140625, 47.366064453125], + [10.1830078125001, 47.27880859375], + [10.2002929687501, 47.3634277343751], + [10.06630859375, 47.393359375], + [10.0645758928572, 47.4236941964286], + [10.05986328125, 47.449072265625], + [10.03408203125, 47.473583984375], + [9.97158203124999, 47.505322265625], + [9.83916015625002, 47.552294921875], + [9.74892578125002, 47.575537109375], + [9.52402343750003, 47.52421875], + [8.57265625000002, 47.775634765625], + [8.43574218750001, 47.73134765625], + [8.40341796875001, 47.68779296875], + [8.41328125000007, 47.6626953125], + [8.45175781250001, 47.651806640625], + [8.55234375000006, 47.659130859375], + [8.56708984375004, 47.651904296875], + [8.57050781250004, 47.63779296875], + [8.55947265625008, 47.6240234375], + [8.47763671875003, 47.6126953125], + [8.45400390624999, 47.59619140625], + [7.615625, 47.592724609375], + [7.61660156250002, 48.156787109375], + [8.13486328125001, 48.973583984375], + [7.45058593750005, 49.152197265625], + [6.73544921875001, 49.160595703125], + [6.34433593750001, 49.452734375], + [6.4873046875, 49.798486328125], + [6.20488281250002, 49.91513671875], + [6.13818359375, 49.97431640625], + [6.10976562500008, 50.034375], + [6.11650390625005, 50.12099609375], + [6.34091796875001, 50.4517578125], + [5.99394531250002, 50.750439453125], + [6.04843750000003, 50.9048828125001], + [5.85751953125003, 51.030126953125], + [6.12998046875003, 51.147412109375], + [6.19882812500003, 51.45], + [5.94873046875006, 51.802685546875], + [6.800390625, 51.9673828125], + [6.72451171874999, 52.080224609375], + [7.03515625000006, 52.380224609375], + [6.74882812500007, 52.464013671875], + [6.71074218750005, 52.61787109375], + [7.03300781250005, 52.6513671875], + [7.19726562500003, 53.282275390625], + [7.07431640625003, 53.47763671875], + [7.28525390625003, 53.68134765625], + [8.00927734375, 53.69072265625], + [8.10849609375006, 53.46767578125], + [8.24521484375001, 53.4453125], + [8.33388671875005, 53.606201171875], + [8.49521484375006, 53.39423828125], + [8.61894531250005, 53.875], + [9.20556640625, 53.85595703125], + [9.78398437500007, 53.554638671875], + [9.31201171875, 53.859130859375], + [8.92041015625, 53.9653320312501], + [8.90664062500002, 54.260791015625], + [8.62578125000002, 54.353955078125], + [8.95185546875001, 54.467578125], + [8.67031250000002, 54.90341796875], + [9.73974609375003, 54.825537109375] + ] + ], + [ + [ + [8.30771484375003, 54.786962890625], + [8.45146484375002, 55.05537109375], + [8.3798828125, 54.899853515625], + [8.62958984375007, 54.891748046875], + [8.30771484375003, 54.786962890625] + ] + ] + ] + }, + "properties": { + "name": "Germany", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [43.24599609375, 11.4998046875], + [42.92275390625, 10.99931640625], + [42.55771484375, 11.08076171875], + [41.7982421875, 10.98046875], + [41.79267578125, 11.68603515625], + [42.378515625, 12.46640625], + [42.40859375, 12.494384765625], + [42.45, 12.521337890625], + [42.47939453125, 12.513623046875], + [42.7037109375, 12.380322265625], + [42.76748046875, 12.4228515625], + [42.82529296875, 12.5693359375], + [42.86591796875, 12.622802734375], + [42.88330078125, 12.6212890625], + [43.0056640625, 12.6623046875], + [43.11669921875, 12.70859375], + [43.353515625, 12.367041015625], + [43.3802734375, 12.091259765625], + [42.6400390625, 11.560107421875], + [42.52177734375, 11.57216796875], + [42.5837890625, 11.49677734375], + [43.0427734375, 11.5884765625], + [43.24599609375, 11.4998046875] + ] + ] + }, + "properties": { + "name": "Djibouti", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.281689453125, 15.2490234375], + [-61.375390625, 15.227294921875], + [-61.45810546875, 15.63310546875], + [-61.27724609375, 15.526708984375], + [-61.281689453125, 15.2490234375] + ] + ] + }, + "properties": { + "name": "Dominica", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [11.36142578125, 54.891650390625], + [11.73955078125, 54.807421875], + [11.7659179687501, 54.6794433593751], + [11.457421875, 54.628857421875], + [11.0355468750001, 54.7730957031251], + [11.05859375, 54.940576171875], + [11.36142578125, 54.891650390625] + ] + ], + [ + [ + [12.5492187500001, 54.965771484375], + [12.11884765625, 54.9144042968751], + [12.2740234375, 55.064111328125], + [12.5492187500001, 54.965771484375] + ] + ], + [ + [ + [10.0612304687501, 54.886376953125], + [9.80625, 54.906005859375], + [9.78125, 55.06904296875], + [10.0612304687501, 54.886376953125] + ] + ], + [ + [ + [10.73408203125, 54.750732421875], + [10.6216796875, 54.851416015625], + [10.9510742187501, 55.156201171875], + [10.73408203125, 54.750732421875] + ] + ], + [ + [ + [15.0876953125, 55.021875], + [14.6841796875001, 55.10224609375], + [14.7653320312501, 55.296728515625], + [15.1326171875, 55.14453125], + [15.0876953125, 55.021875] + ] + ], + [ + [ + [10.6451171875, 55.609814453125], + [10.78525390625, 55.1333984375], + [10.4427734375001, 55.048779296875], + [9.98876953125003, 55.16318359375], + [9.86064453125005, 55.515478515625], + [10.6451171875, 55.609814453125] + ] + ], + [ + [ + [12.6657226562501, 55.596533203125], + [12.55087890625, 55.55625], + [12.59921875, 55.680224609375], + [12.6657226562501, 55.596533203125] + ] + ], + [ + [ + [12.56875, 55.78505859375], + [12.2150390625, 55.46650390625], + [12.4130859375, 55.286181640625], + [12.08994140625, 55.1881347656251], + [12.050390625, 54.81533203125], + [11.8623046875, 54.772607421875], + [11.6538085937501, 55.1869140625], + [11.2863281250001, 55.204443359375], + [10.9789062500001, 55.721533203125], + [11.322265625, 55.7525390625], + [11.6277343750001, 55.956884765625], + [11.8197265625, 55.69765625], + [11.86640625, 55.9681640625], + [12.2189453125, 56.11865234375], + [12.5787109375, 56.0640625000001], + [12.56875, 55.78505859375] + ] + ], + [ + [ + [11.0521484375001, 57.2525390625001], + [10.873828125, 57.262255859375], + [11.17451171875, 57.322900390625], + [11.0521484375001, 57.2525390625001] + ] + ], + [ + [ + [9.73974609375003, 54.825537109375], + [8.67031250000002, 54.90341796875], + [8.61591796875004, 55.418212890625], + [8.13212890625007, 55.5998046875], + [8.16396484375008, 56.606884765625], + [8.67167968750005, 56.495654296875], + [8.88808593750008, 56.73505859375], + [9.06708984375004, 56.7938476562501], + [9.19638671875001, 56.70166015625], + [9.2548828125, 57.01171875], + [8.99277343749998, 57.01611328125], + [8.77197265625003, 56.72529296875], + [8.468359375, 56.66455078125], + [8.28408203125002, 56.85234375], + [8.61855468750005, 57.111279296875], + [9.43359375, 57.17431640625], + [9.96230468750008, 57.58095703125], + [10.6099609375, 57.7369140625], + [10.2827148437501, 56.6205078125], + [10.9261718750001, 56.44326171875], + [10.75341796875, 56.2419921875], + [10.31875, 56.212890625], + [10.1830078125001, 55.865185546875], + [9.90371093750002, 55.842822265625], + [10.0236328125, 55.76142578125], + [9.59111328125002, 55.493212890625], + [9.67099609375006, 55.26640625], + [9.45371093750001, 55.0395507812501], + [9.73232421875002, 54.9680175781251], + [9.73974609375003, 54.825537109375] + ] + ] + ] + }, + "properties": { + "name": "Denmark", + "childNum": 10, + "cp": [10.2768332, 56.1773879] + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-71.647216796875, 19.195947265625], + [-71.746484375, 19.28583984375], + [-71.711474609375, 19.486572265625], + [-71.757421875, 19.68818359375], + [-71.779248046875, 19.7181640625], + [-71.6673828125, 19.8486328125], + [-70.954150390625, 19.91396484375], + [-70.19384765625, 19.638037109375], + [-69.9568359375, 19.671875], + [-69.739404296875, 19.29921875], + [-69.232470703125, 19.271826171875], + [-69.60595703125, 19.206494140625], + [-69.6236328125, 19.117822265625], + [-68.684765625, 18.90478515625], + [-68.33916015625, 18.6115234375], + [-68.68740234375, 18.21494140625], + [-68.9349609375, 18.4080078125], + [-69.27451171875, 18.43984375], + [-69.770654296875, 18.4435546875], + [-70.479931640625, 18.21728515625], + [-70.644677734375, 18.33623046875], + [-71.02783203125, 18.273193359375], + [-71.43896484375, 17.635595703125], + [-71.63173828125, 17.7736328125], + [-71.768310546875, 18.03916015625], + [-71.76376953125, 18.203955078125], + [-71.737255859375, 18.27080078125], + [-71.7619140625, 18.34130859375], + [-71.87255859375, 18.4162109375], + [-71.940380859375, 18.51259765625], + [-72.000390625, 18.597900390625], + [-71.986865234375, 18.6103515625], + [-71.86650390625, 18.61416015625], + [-71.743212890625, 18.73291015625], + [-71.72705078125, 18.80322265625], + [-71.733642578125, 18.856396484375], + [-71.80712890625, 18.98701171875], + [-71.647216796875, 19.195947265625] + ] + ] + }, + "properties": { + "name": "Dominican Republic", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [8.20761718750001, 36.5189453125], + [8.34873046875001, 36.36796875], + [8.31806640625001, 35.654931640625], + [8.31640625, 35.403125], + [8.35986328125, 35.299609375], + [8.39423828125001, 35.203857421875], + [8.312109375, 35.084619140625], + [8.27685546875, 34.9794921875], + [8.24560546875, 34.73408203125], + [7.51386718750001, 34.080517578125], + [7.534375, 33.717919921875], + [7.87724609375002, 33.172119140625], + [8.1125, 33.055322265625], + [8.33339843750002, 32.543603515625], + [9.04404296875001, 32.07236328125], + [9.16025390625001, 31.621337890625], + [9.22402343750002, 31.373681640625], + [9.51875, 30.22939453125], + [9.31025390625001, 30.115234375], + [9.80527343750001, 29.176953125], + [9.916015625, 27.785693359375], + [9.74755859375, 27.330859375], + [9.88320312500002, 26.630810546875], + [9.49140625000001, 26.333740234375], + [9.4482421875, 26.067138671875], + [10.00068359375, 25.332080078125], + [10.255859375, 24.591015625], + [10.3958984375, 24.485595703125], + [10.6861328125, 24.5513671875], + [11.5076171875, 24.31435546875], + [11.96787109375, 23.51787109375], + [7.48173828125002, 20.873095703125], + [5.83662109375001, 19.479150390625], + [4.22763671875001, 19.1427734375], + [3.3564453125, 18.98662109375], + [3.11972656250001, 19.103173828125], + [3.255859375, 19.4109375], + [3.13027343750002, 19.8501953125], + [1.68544921875002, 20.378369140625], + [1.61064453125002, 20.55556640625], + [1.16572265625001, 20.817431640625], + [1.1455078125, 21.10224609375], + [-1.94790039062499, 23.1248046875], + [-4.82260742187498, 24.99560546875], + [-8.683349609375, 27.2859375], + [-8.683349609375, 27.6564453125], + [-8.683349609375, 27.900390625], + [-8.659912109375, 28.718603515625], + [-7.48574218749999, 29.392236328125], + [-7.42768554687498, 29.425], + [-7.14243164062498, 29.619580078125], + [-6.85556640624998, 29.601611328125], + [-6.755126953125, 29.583837890625], + [-6.63535156249998, 29.568798828125], + [-6.59775390624998, 29.578955078125], + [-6.52055664062499, 29.65986328125], + [-6.479736328125, 29.820361328125], + [-6.00429687499999, 29.83125], + [-5.44877929687499, 29.95693359375], + [-5.29365234374998, 30.058642578125], + [-5.18012695312498, 30.166162109375], + [-4.96826171875, 30.465380859375], + [-4.77851562499998, 30.552392578125], + [-4.52915039062498, 30.625537109375], + [-4.32285156249998, 30.698876953125], + [-4.14877929687498, 30.8095703125], + [-3.62690429687498, 31.000927734375], + [-3.83339843749999, 31.197802734375], + [-3.83710937499998, 31.512353515625], + [-3.76816406249998, 31.68955078125], + [-3.70024414062499, 31.70009765625], + [-3.60458984374998, 31.686767578125], + [-3.43979492187498, 31.704541015625], + [-3.01738281249999, 31.83427734375], + [-2.98823242187498, 31.87421875], + [-2.93085937499998, 32.042529296875], + [-2.86342773437499, 32.07470703125], + [-1.27534179687498, 32.089013671875], + [-1.16259765625, 32.399169921875], + [-1.11103515624998, 32.552294921875], + [-1.188232421875, 32.60849609375], + [-1.29638671875, 32.67568359375], + [-1.35214843749998, 32.703369140625], + [-1.45, 32.784814453125], + [-1.510009765625, 32.87763671875], + [-1.55073242187498, 33.073583984375], + [-1.67919921875, 33.31865234375], + [-1.79560546874998, 34.751904296875], + [-2.13178710937498, 34.970849609375], + [-2.19077148437498, 35.02978515625], + [-2.21962890624999, 35.10419921875], + [-1.67363281249999, 35.18310546875], + [-0.426123046874977, 35.8615234375], + [-0.048242187499994, 35.8328125], + [0.312207031250011, 36.162353515625], + [0.9716796875, 36.4439453125], + [2.593359375, 36.60068359375], + [2.97285156250001, 36.78447265625], + [3.77900390625001, 36.89619140625], + [4.75810546875002, 36.896337890625], + [5.29541015625, 36.6482421875], + [6.48652343750001, 37.0857421875], + [6.92753906250002, 36.91943359375], + [7.23847656250001, 36.968505859375], + [7.20429687500001, 37.0923828125], + [7.91044921875002, 36.85634765625], + [8.57656250000002, 36.93720703125], + [8.60126953125001, 36.833935546875], + [8.20761718750001, 36.5189453125] + ] + ] + }, + "properties": { + "name": "Algeria", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-80.131591796875, -2.97314453124996], + [-80.27294921875, -2.99589843749997], + [-80.223681640625, -2.753125], + [-80.08076171875, -2.66884765624997], + [-79.909033203125, -2.72558593749997], + [-80.131591796875, -2.97314453124996] + ] + ], + [ + [ + [-90.42392578125, -1.33994140625003], + [-90.5195312499999, -1.29912109374997], + [-90.4771972656249, -1.22099609374996], + [-90.42392578125, -1.33994140625003] + ] + ], + [ + [ + [-89.418896484375, -0.911035156249966], + [-89.60859375, -0.888574218750009], + [-89.287841796875, -0.689843750000023], + [-89.418896484375, -0.911035156249966] + ] + ], + [ + [ + [-90.33486328125, -0.771582031249977], + [-90.542138671875, -0.676464843749955], + [-90.5316894531249, -0.581445312499966], + [-90.269384765625, -0.48466796874996], + [-90.192724609375, -0.658789062500006], + [-90.33486328125, -0.771582031249977] + ] + ], + [ + [ + [-91.4259765625, -0.460839843749994], + [-91.6107421874999, -0.44394531250002], + [-91.6466796875, -0.284472656249946], + [-91.46015625, -0.255664062500031], + [-91.4259765625, -0.460839843749994] + ] + ], + [ + [ + [-90.5739257812499, -0.333984375], + [-90.8677734375, -0.271386718750037], + [-90.78037109375, -0.160449218749989], + [-90.5739257812499, -0.333984375] + ] + ], + [ + [ + [-91.27216796875, 0.025146484374986], + [-90.799658203125, -0.752050781249991], + [-90.905517578125, -0.94052734375002], + [-91.1310546875, -1.01962890624998], + [-91.41904296875, -0.996679687500006], + [-91.49541015625, -0.860937499999977], + [-91.120947265625, -0.559082031250028], + [-91.3691894531249, -0.287207031249977], + [-91.428857421875, -0.023388671874955], + [-91.596826171875, 0.002099609374994], + [-91.361376953125, 0.125830078124977], + [-91.27216796875, 0.025146484374986] + ] + ], + [ + [ + [-78.909228515625, 1.25278320312498], + [-78.99169921875, 1.29321289062504], + [-78.8998046875, 1.359765625], + [-78.909228515625, 1.25278320312498] + ] + ], + [ + [ + [-75.28447265625, -0.10654296875002], + [-75.62626953125, -0.122851562499974], + [-75.63203125, -0.157617187500037], + [-75.560595703125, -0.200097656249994], + [-75.491064453125, -0.24833984374996], + [-75.42470703125, -0.408886718749983], + [-75.259375, -0.59013671874996], + [-75.249609375, -0.951855468750026], + [-75.348193359375, -0.966796874999957], + [-75.380126953125, -0.94023437499996], + [-75.408056640625, -0.92431640625], + [-75.42041015625, -0.962207031250003], + [-75.570556640625, -1.53125], + [-76.089794921875, -2.13310546874997], + [-76.6791015625, -2.56259765624999], + [-77.860595703125, -2.98164062500001], + [-78.240380859375, -3.47255859375001], + [-78.345361328125, -3.39736328124997], + [-78.647998046875, -4.24814453125001], + [-78.68603515625, -4.56240234374999], + [-78.8615234375, -4.66503906249994], + [-78.9076171875, -4.71445312499998], + [-78.92578125, -4.77070312499998], + [-78.914208984375, -4.81865234374997], + [-78.919189453125, -4.85839843749999], + [-78.975390625, -4.8732421875], + [-78.995263671875, -4.90800781249997], + [-79.03330078125, -4.96914062499999], + [-79.07626953125, -4.990625], + [-79.186669921875, -4.95820312499998], + [-79.2681152343749, -4.95761718749995], + [-79.33095703125, -4.92783203125002], + [-79.3994140625, -4.84003906249998], + [-79.45576171875, -4.76621093749995], + [-79.501904296875, -4.67060546875001], + [-79.5161621093749, -4.53916015624996], + [-79.577685546875, -4.50058593750002], + [-79.638525390625, -4.45488281250003], + [-79.710986328125, -4.46757812499995], + [-79.797265625, -4.47636718749996], + [-79.8451171875, -4.44589843749998], + [-79.962890625, -4.39033203125003], + [-80.063525390625, -4.32753906250002], + [-80.13955078125, -4.29609375000001], + [-80.1974609375, -4.31103515624994], + [-80.293359375, -4.416796875], + [-80.38349609375, -4.46367187499996], + [-80.424169921875, -4.46142578125003], + [-80.478564453125, -4.43007812500004], + [-80.4884765625, -4.39365234374999], + [-80.44384765625, -4.33583984375002], + [-80.352880859375, -4.20849609375001], + [-80.453759765625, -4.20517578124996], + [-80.4884765625, -4.16552734374997], + [-80.49345703125, -4.11914062500001], + [-80.510009765625, -4.06953125000004], + [-80.4901367187499, -4.01005859375], + [-80.43720703125, -3.97861328124999], + [-80.303271484375, -4.00507812499997], + [-80.2668945312499, -3.94882812499996], + [-80.230517578125, -3.92402343749997], + [-80.194140625, -3.905859375], + [-80.24375, -3.57675781250001], + [-80.324658203125, -3.387890625], + [-79.963330078125, -3.15771484375], + [-79.7298828125, -2.57910156249997], + [-79.842138671875, -2.0673828125], + [-79.9255859375, -2.54853515624997], + [-80.0301757812499, -2.55673828124995], + [-80.0066406249999, -2.35380859375], + [-80.284716796875, -2.70673828124996], + [-80.9321777343749, -2.26914062499998], + [-80.760595703125, -1.93457031250003], + [-80.902392578125, -1.07890624999997], + [-80.55390625, -0.847949218749989], + [-80.45546875, -0.585449218749986], + [-80.282373046875, -0.620507812500023], + [-80.482275390625, -0.368261718749963], + [-80.046142578125, 0.155371093750048], + [-80.08828125, 0.78476562500002], + [-78.899658203125, 1.20625], + [-78.85966796875, 1.45537109375003], + [-78.1806640625, 0.968554687499974], + [-77.702880859375, 0.837841796874997], + [-77.46767578125, 0.636523437500017], + [-77.396337890625, 0.393896484374963], + [-76.49462890625, 0.23544921875002], + [-76.27060546875, 0.439404296874997], + [-75.77666015625, 0.08925781249998], + [-75.28447265625, -0.10654296875002] + ] + ] + ] + }, + "properties": { + "name": "Ecuador", + "childNum": 9 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.2453125, 31.20830078125], + [34.904296875, 29.47734375], + [34.73642578125, 29.27060546875], + [34.39970703125, 28.016015625], + [34.2201171875, 27.764306640625], + [33.76025390625, 28.04765625], + [33.24775390625, 28.567724609375], + [32.56572265625, 29.973974609375], + [32.359765625, 29.6306640625], + [32.8982421875, 28.565234375], + [33.5470703125, 27.89814453125], + [33.5498046875, 27.607373046875], + [33.84931640625, 27.184912109375], + [33.95908203125, 26.6490234375], + [35.194140625, 24.475146484375], + [35.78388671875, 23.93779296875], + [35.5408203125, 23.920654296875], + [35.50439453125, 23.779296875], + [35.6978515625, 22.94619140625], + [36.2296875, 22.62880859375], + [36.87138671875, 21.996728515625], + [31.43447265625, 21.995849609375], + [31.4861328125, 22.147802734375], + [31.40029296875, 22.20244140625], + [31.26064453125, 22.002294921875], + [31.09267578125, 21.994873046875], + [28.03642578125, 21.995361328125], + [24.9802734375, 21.995849609375], + [24.9802734375, 25.5888671875], + [24.9802734375, 29.181884765625], + [24.70322265625, 30.20107421875], + [24.96142578125, 30.678515625], + [24.852734375, 31.334814453125], + [25.15048828125, 31.65498046875], + [25.3822265625, 31.51279296875], + [25.89326171875, 31.6208984375], + [27.248046875, 31.377880859375], + [27.5400390625, 31.2126953125], + [28.51484375, 31.050439453125], + [29.0720703125, 30.8302734375], + [29.92978515625, 31.227490234375], + [30.22265625, 31.2583984375], + [30.3951171875, 31.4576171875], + [30.92353515625, 31.566845703125], + [30.56298828125, 31.4169921875], + [31.0017578125, 31.46279296875], + [31.08291015625, 31.6033203125], + [31.5244140625, 31.458251953125], + [31.88896484375, 31.54140625], + [32.13603515625, 31.341064453125], + [31.8921875, 31.482470703125], + [31.77109375, 31.292578125], + [32.1017578125, 31.092822265625], + [32.2818359375, 31.20087890625], + [32.2162109375, 31.29375], + [32.6033203125, 31.06875], + [33.66650390625, 31.130419921875], + [34.19814453125, 31.322607421875], + [34.2453125, 31.20830078125] + ] + ] + }, + "properties": { + "name": "Egypt", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [40.1412109375, 15.696142578125], + [40.3990234375, 15.5798828125], + [39.9751953125, 15.612451171875], + [39.9474609375, 15.696142578125], + [40.0705078125, 15.676611328125], + [39.93994140625, 15.74453125], + [39.9567382812501, 15.8894042968751], + [40.1412109375, 15.696142578125] + ] + ], + [ + [ + [40.07646484375, 16.082421875], + [40.11005859375, 15.9857421875001], + [39.99609375, 16.04267578125], + [40.07646484375, 16.082421875] + ] + ], + [ + [ + [40.93857421875, 13.98310546875], + [40.8201171875, 14.111669921875], + [40.221484375, 14.43115234375], + [39.5318359375, 14.53671875], + [39.1980468750001, 14.47939453125], + [39.1354492187501, 14.581884765625], + [39.07421875, 14.62822265625], + [39.023828125, 14.62822265625], + [38.9957031250001, 14.586865234375], + [38.81201171875, 14.48232421875], + [38.50439453125, 14.4244140625], + [38.4314453125, 14.42861328125], + [38.2214843750001, 14.649658203125], + [38.0025390625, 14.737109375], + [37.9434570312501, 14.810546875], + [37.8841796875, 14.852294921875], + [37.8203125, 14.70849609375], + [37.7083984375001, 14.4572265625], + [37.6484375, 14.3225585937501], + [37.57119140625, 14.149072265625], + [37.54677734375, 14.14384765625], + [37.5072265625, 14.156396484375], + [37.2572265625, 14.4537597656251], + [37.02451171875, 14.2719726562501], + [36.8119140625001, 14.3150390625], + [36.6791015625001, 14.307568359375], + [36.5423828125, 14.258203125], + [36.5243164062501, 14.2568359375], + [36.49228515625, 14.5443359375], + [36.47080078125, 14.736474609375], + [36.44814453125, 14.940087890625], + [36.4267578125, 15.132080078125], + [36.566015625, 15.362109375], + [36.9137695312501, 16.29619140625], + [36.88779296875, 16.624658203125], + [36.9787109375001, 16.8005859375], + [36.9757812500001, 16.866552734375], + [36.9952148437501, 17.020556640625], + [37.008984375, 17.05888671875], + [37.0615234375, 17.0612792968751], + [37.1695312500001, 17.04140625], + [37.4110351562501, 17.06171875], + [37.4529296875001, 17.10869140625], + [37.51015625, 17.288134765625], + [37.5474609375001, 17.3241210937501], + [37.782421875, 17.4580078125001], + [38.253515625, 17.584765625], + [38.26728515625, 17.6166992187501], + [38.28984375, 17.63701171875], + [38.34736328125, 17.68359375], + [38.37373046875, 17.717333984375], + [38.4224609375001, 17.82392578125], + [38.6094726562501, 18.005078125], + [39.03447265625, 17.085546875], + [39.29892578125, 15.92109375], + [39.785546875, 15.124853515625], + [39.86376953125, 15.4703125], + [40.2041015625, 15.014111328125], + [41.17646484375, 14.6203125000001], + [41.658203125, 13.983056640625], + [42.2451171875, 13.587646484375], + [42.3993164062501, 13.21259765625], + [42.5228515625, 13.221484375], + [42.7961914062501, 12.8642578125001], + [42.96953125, 12.808349609375], + [42.9990234375, 12.89951171875], + [43.0829101562501, 12.824609375], + [43.11669921875, 12.70859375], + [43.0056640625, 12.6623046875], + [42.88330078125, 12.6212890625], + [42.86591796875, 12.622802734375], + [42.8252929687501, 12.5693359375], + [42.76748046875, 12.4228515625], + [42.7037109375001, 12.3803222656251], + [42.47939453125, 12.513623046875], + [42.45, 12.521337890625], + [42.40859375, 12.494384765625], + [42.3785156250001, 12.46640625], + [42.2899414062501, 12.57021484375], + [42.225, 12.661962890625], + [42.13427734375, 12.771435546875], + [41.9521484375, 12.88232421875], + [41.8595703125, 13.02587890625], + [41.7650390625001, 13.183935546875], + [41.362890625, 13.4998046875], + [40.93857421875, 13.98310546875] + ] + ] + ] + }, + "properties": { + "name": "Eritrea", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-17.887939453125, 27.8095703125001], + [-17.984765625, 27.64638671875], + [-18.1605468749999, 27.761474609375], + [-17.887939453125, 27.8095703125001] + ] + ], + [ + [ + [-15.4005859375, 28.14736328125], + [-15.436767578125, 27.810693359375], + [-15.7103027343749, 27.78408203125], + [-15.80947265625, 27.994482421875], + [-15.682763671875, 28.154052734375], + [-15.4005859375, 28.14736328125] + ] + ], + [ + [ + [-17.18466796875, 28.02197265625], + [-17.32490234375, 28.11767578125], + [-17.25859375, 28.203173828125], + [-17.1037597656249, 28.1111328125], + [-17.18466796875, 28.02197265625] + ] + ], + [ + [ + [-16.33447265625, 28.379931640625], + [-16.418212890625, 28.151416015625], + [-16.6580078125, 28.007177734375], + [-16.905322265625, 28.339599609375], + [-16.1236328124999, 28.5759765625], + [-16.33447265625, 28.379931640625] + ] + ], + [ + [ + [-14.1967773437499, 28.1692871093751], + [-14.3326171875, 28.056005859375], + [-14.4917968749999, 28.100927734375], + [-14.231982421875, 28.2158203125], + [-14.003369140625, 28.706689453125], + [-13.8572265625, 28.738037109375], + [-13.92802734375, 28.253466796875], + [-14.1967773437499, 28.1692871093751] + ] + ], + [ + [ + [-17.83427734375, 28.493212890625], + [-18.00078125, 28.758251953125], + [-17.92880859375, 28.8445800781251], + [-17.7265625, 28.724462890625], + [-17.83427734375, 28.493212890625] + ] + ], + [ + [ + [-13.715966796875, 28.91123046875], + [-13.859912109375, 28.869091796875], + [-13.8236328125, 29.013330078125], + [-13.46357421875, 29.23720703125], + [-13.4779296875, 29.006591796875], + [-13.715966796875, 28.91123046875] + ] + ], + [ + [ + [1.59394531250007, 38.6720703125], + [1.40576171875, 38.67099609375], + [1.43632812500002, 38.768212890625], + [1.59394531250007, 38.6720703125] + ] + ], + [ + [ + [1.44521484375005, 38.918701171875], + [1.22333984375007, 38.903857421875], + [1.3486328125, 39.080810546875], + [1.564453125, 39.121044921875], + [1.62363281249998, 39.038818359375], + [1.44521484375005, 38.918701171875] + ] + ], + [ + [ + [3.14531250000002, 39.790087890625], + [3.46181640625002, 39.69775390625], + [3.07285156250001, 39.30126953125], + [2.79980468750006, 39.38505859375], + [2.70058593750002, 39.542138671875], + [2.49951171875, 39.477880859375], + [2.37001953125008, 39.5720703125], + [3.15869140625, 39.9705078125], + [3.14531250000002, 39.790087890625] + ] + ], + [ + [ + [4.29365234375001, 39.841845703125], + [3.8671875, 39.958740234375], + [3.85341796875005, 40.063037109375], + [4.22578125000004, 40.032373046875], + [4.29365234375001, 39.841845703125] + ] + ], + [ + [ + [-1.79404296874995, 43.40732421875], + [-1.41069335937493, 43.240087890625], + [-1.46083984374994, 43.0517578125001], + [-1.30004882812494, 43.1009765625], + [-0.586425781249943, 42.798974609375], + [0.631640625000045, 42.689599609375], + [0.696875, 42.8451171875001], + [1.42832031249998, 42.5958984375], + [1.41484375000007, 42.548388671875], + [1.44882812499998, 42.437451171875], + [1.53408203125005, 42.44169921875], + [1.7060546875, 42.5033203125001], + [1.85976562500005, 42.457080078125], + [1.92792968750007, 42.426318359375], + [2.03271484375003, 42.353515625], + [3.21142578125, 42.43115234375], + [3.248046875, 41.94423828125], + [3.0048828125, 41.7674316406251], + [2.08261718750006, 41.28740234375], + [1.03291015625007, 41.062060546875], + [0.714648437500074, 40.8228515625], + [0.891113281250057, 40.72236328125], + [0.59609375000008, 40.614501953125], + [-0.327001953124949, 39.519873046875], + [-0.204931640624949, 39.06259765625], + [0.20156250000008, 38.7591796875], + [-0.520800781249989, 38.31728515625], + [-0.814648437500011, 37.769921875], + [-0.721582031249966, 37.6310546875], + [-1.32753906249994, 37.5611328125], + [-1.64096679687495, 37.386962890625], + [-2.11152343749998, 36.77666015625], + [-4.36684570312499, 36.7181152343751], + [-4.67412109374996, 36.5064453125], + [-5.17148437499995, 36.423779296875], + [-5.3609375, 36.134912109375], + [-5.62548828125, 36.025927734375], + [-6.04067382812494, 36.188427734375], + [-6.38413085937492, 36.63701171875], + [-6.21679687500003, 36.91357421875], + [-6.39619140624998, 36.831640625], + [-6.86376953125003, 37.27890625], + [-7.40615234374994, 37.179443359375], + [-7.44394531249992, 37.728271484375], + [-6.95756835937493, 38.187890625], + [-7.10639648437498, 38.181005859375], + [-7.34301757812494, 38.457421875], + [-6.99794921874999, 39.0564453125], + [-7.53569335937496, 39.661572265625], + [-7.11767578124997, 39.681689453125], + [-6.97539062499993, 39.798388671875], + [-6.89609374999995, 40.0218261718751], + [-7.03261718749997, 40.167919921875], + [-6.8101562499999, 40.343115234375], + [-6.92846679687497, 41.009130859375], + [-6.2125, 41.53203125], + [-6.54218749999996, 41.672509765625], + [-6.61826171874992, 41.9423828125], + [-7.14711914062502, 41.98115234375], + [-7.40361328124996, 41.83369140625], + [-8.15249023437494, 41.811962890625], + [-8.26606445312498, 42.13740234375], + [-8.77714843750002, 41.941064453125], + [-8.88720703124994, 42.1052734375], + [-8.69091796874994, 42.274169921875], + [-8.81582031249997, 42.28525390625], + [-8.73002929687499, 42.41171875], + [-8.8115234375, 42.64033203125], + [-9.03310546875002, 42.59384765625], + [-8.92719726562493, 42.798583984375], + [-9.23520507812498, 42.976904296875], + [-9.17807617187498, 43.1740234375], + [-8.24892578124994, 43.439404296875], + [-8.25673828124994, 43.5798828125], + [-8.00468749999993, 43.694384765625], + [-7.50361328124998, 43.73994140625], + [-7.06098632812496, 43.553955078125], + [-5.84667968749994, 43.645068359375], + [-4.52304687499992, 43.41572265625], + [-3.60463867187497, 43.519482421875], + [-3.04560546874993, 43.37158203125], + [-2.87504882812502, 43.454443359375], + [-2.33710937499993, 43.32802734375], + [-1.79404296874995, 43.40732421875] + ] + ] + ] + }, + "properties": { + "name": "Spain", + "childNum": 12, + "cp": [-2.9366964, 40.3438963] + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [22.6173828125, 58.621240234375], + [23.3232421875001, 58.450830078125], + [22.7302734375, 58.2306640625], + [22.3716796875, 58.217138671875], + [21.996875, 57.93134765625], + [22.1876953125001, 58.154345703125], + [21.88212890625, 58.262353515625], + [21.8623046875001, 58.49716796875], + [22.6173828125, 58.621240234375] + ] + ], + [ + [ + [23.3435546875, 58.550341796875], + [23.10908203125, 58.659228515625], + [23.3328125, 58.648583984375], + [23.3435546875, 58.550341796875] + ] + ], + [ + [ + [22.92373046875, 58.826904296875], + [22.5421875, 58.689990234375], + [22.41103515625, 58.86337890625], + [22.05625, 58.9436035156251], + [22.6494140625, 59.087109375], + [22.90986328125, 58.9912109375], + [22.92373046875, 58.826904296875] + ] + ], + [ + [ + [28.0125, 59.48427734375], + [28.15107421875, 59.3744140625], + [27.4341796875, 58.787255859375], + [27.5024414062501, 58.221337890625], + [27.7785156250001, 57.8707031250001], + [27.5420898437501, 57.7994140625], + [27.4, 57.666796875], + [27.3519531250001, 57.528125], + [26.966015625, 57.6091308593751], + [26.5326171875, 57.531005859375], + [26.298046875, 57.60107421875], + [25.66015625, 57.920166015625], + [25.27265625, 58.009375], + [25.11103515625, 58.063427734375], + [24.4588867187501, 57.907861328125], + [24.3625, 57.866162109375], + [24.3225585937501, 57.87060546875], + [24.5291015625, 58.354248046875], + [24.11484375, 58.2661132812501], + [23.7675781250001, 58.36083984375], + [23.50927734375, 58.658544921875], + [23.6807617187501, 58.7871582031251], + [23.43203125, 58.920654296875], + [23.49443359375, 59.195654296875], + [24.0833984375, 59.2918945312501], + [24.38037109375, 59.47265625], + [25.44375, 59.521142578125], + [25.50927734375, 59.6390136718751], + [26.97470703125, 59.450634765625], + [28.0125, 59.48427734375] + ] + ] + ] + }, + "properties": { + "name": "Estonia", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [38.4314453125, 14.42861328125], + [38.50439453125, 14.4244140625], + [38.81201171875, 14.48232421875], + [38.995703125, 14.586865234375], + [39.023828125, 14.62822265625], + [39.07421875, 14.62822265625], + [39.13544921875, 14.581884765625], + [39.198046875, 14.47939453125], + [39.5318359375, 14.53671875], + [40.221484375, 14.43115234375], + [40.8201171875, 14.111669921875], + [40.93857421875, 13.98310546875], + [41.362890625, 13.4998046875], + [41.7650390625, 13.183935546875], + [41.8595703125, 13.02587890625], + [41.9521484375, 12.88232421875], + [42.13427734375, 12.771435546875], + [42.225, 12.661962890625], + [42.28994140625, 12.57021484375], + [42.378515625, 12.46640625], + [41.79267578125, 11.68603515625], + [41.7982421875, 10.98046875], + [42.55771484375, 11.08076171875], + [42.92275390625, 10.99931640625], + [42.6564453125, 10.6], + [42.8416015625, 10.203076171875], + [43.181640625, 9.87998046874999], + [43.48251953125, 9.37949218749999], + [43.9837890625, 9.00883789062499], + [46.97822265625, 7.9970703125], + [47.97822265625, 7.9970703125], + [44.94052734375, 4.91201171874999], + [43.9888671875, 4.95053710937499], + [43.58349609375, 4.85498046875], + [43.12568359375, 4.644482421875], + [42.856640625, 4.32421875], + [42.02412109375, 4.137939453125], + [41.91533203125, 4.03129882812499], + [41.883984375, 3.977734375], + [41.7376953125, 3.97905273437499], + [41.48193359375, 3.96328125], + [41.3724609375, 3.94619140624999], + [41.2208984375, 3.9435546875], + [41.02080078125, 4.05747070312499], + [40.765234375, 4.27304687499999], + [39.8421875, 3.85146484374999], + [39.79033203125, 3.75424804687499], + [39.65751953125, 3.57783203125], + [39.49443359375, 3.45610351562499], + [38.6080078125, 3.60009765625], + [38.4515625, 3.60483398437499], + [38.22529296875, 3.61899414062499], + [38.0861328125, 3.64882812499999], + [37.15458984375, 4.25454101562499], + [36.90556640625, 4.41147460937499], + [36.02197265625, 4.46811523437499], + [35.7630859375, 4.80800781249999], + [35.75615234375, 4.95048828124999], + [35.779296875, 5.10556640624999], + [35.80029296875, 5.15693359375], + [35.74501953125, 5.343994140625], + [35.32529296875, 5.36489257812499], + [35.2646484375, 5.412060546875], + [35.2638671875, 5.45791015624999], + [35.268359375, 5.49228515624999], + [34.98359375, 5.85830078124999], + [34.71064453125, 6.66030273437499], + [34.0642578125, 7.22573242187499], + [33.90244140625, 7.509521484375], + [32.99892578125, 7.89951171874999], + [33.2810546875, 8.437255859375], + [33.9533203125, 8.44350585937499], + [34.07275390625, 8.54526367187499], + [34.078125, 9.46152343749999], + [34.31123046875, 10.190869140625], + [34.3439453125, 10.658642578125], + [34.571875, 10.88017578125], + [34.7712890625, 10.74619140625], + [34.9314453125, 10.864794921875], + [35.1123046875, 11.816552734375], + [35.67021484375, 12.62373046875], + [36.1251953125, 12.75703125], + [36.52431640625, 14.2568359375], + [36.5423828125, 14.258203125], + [36.6791015625, 14.307568359375], + [36.8119140625, 14.3150390625], + [37.02451171875, 14.27197265625], + [37.2572265625, 14.453759765625], + [37.5072265625, 14.156396484375], + [37.54677734375, 14.14384765625], + [37.57119140625, 14.149072265625], + [37.6484375, 14.32255859375], + [37.7083984375, 14.4572265625], + [37.8203125, 14.70849609375], + [37.8841796875, 14.852294921875], + [37.94345703125, 14.810546875], + [38.0025390625, 14.737109375], + [38.221484375, 14.649658203125], + [38.4314453125, 14.42861328125] + ] + ] + }, + "properties": { + "name": "Ethiopia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [22.17509765625, 60.370751953125], + [22.41552734375, 60.3033691406251], + [22.360546875, 60.165576171875], + [22.0771484375, 60.286328125], + [22.17509765625, 60.370751953125] + ] + ], + [ + [ + [21.4508789062501, 60.52958984375], + [21.3, 60.47978515625], + [21.22470703125, 60.62060546875], + [21.4508789062501, 60.52958984375] + ] + ], + [ + [ + [21.2177734375, 63.24130859375], + [21.415625, 63.1973632812501], + [21.25341796875, 63.152001953125], + [21.0838867187501, 63.2775390625], + [21.2177734375, 63.24130859375] + ] + ], + [ + [ + [24.8482421875, 64.991015625], + [24.5765625, 65.04287109375], + [24.97060546875, 65.055322265625], + [24.8482421875, 64.991015625] + ] + ], + [ + [ + [28.9658203125, 69.02197265625], + [28.4140625000001, 68.9041503906251], + [28.7728515625001, 68.8400390625], + [28.4707031250001, 68.48837890625], + [28.68515625, 68.189794921875], + [29.34384765625, 68.0618652343751], + [29.9880859375, 67.66826171875], + [29.0662109375, 66.891748046875], + [30.1027343750001, 65.72626953125], + [29.7159179687501, 65.624560546875], + [29.6080078125, 65.248681640625], + [29.826953125, 65.145068359375], + [29.60419921875, 64.968408203125], + [30.0728515625001, 64.7650390625001], + [30.0418945312501, 64.443359375], + [30.51376953125, 64.2], + [30.50390625, 64.02060546875], + [29.9915039062501, 63.73515625], + [31.1808593750001, 63.2083007812501], + [31.533984375, 62.885400390625], + [31.18671875, 62.481396484375], + [29.69013671875, 61.54609375], + [27.7976562500001, 60.5361328125], + [26.53466796875, 60.4128906250001], + [26.5693359375, 60.624560546875], + [26.3777343750001, 60.424072265625], + [25.95595703125, 60.47421875], + [26.03583984375, 60.34150390625], + [25.7580078125, 60.267529296875], + [25.6564453125, 60.333203125], + [24.44560546875, 60.0212890625], + [23.46357421875, 59.98623046875], + [23.0212890625001, 59.8160156250001], + [23.1984375, 60.021826171875], + [22.9117187500001, 60.209716796875], + [22.7498046875, 60.057275390625], + [22.4626953125, 60.02919921875], + [22.5849609375, 60.38056640625], + [21.4360351562501, 60.59638671875], + [21.6059570312501, 61.591552734375], + [21.2559570312501, 61.9896484375001], + [21.14384765625, 62.7399902343751], + [21.6509765625001, 63.039306640625], + [21.5451171875, 63.204296875], + [22.3197265625001, 63.31044921875], + [22.53232421875, 63.6478515625], + [23.5989257812501, 64.04091796875], + [24.55791015625, 64.801025390625], + [25.2881835937501, 64.8603515625], + [25.3478515625, 65.479248046875], + [24.67490234375, 65.670703125], + [24.62802734375, 65.8591796875], + [24.15546875, 65.8052734375001], + [23.70029296875, 66.25263671875], + [23.98857421875, 66.810546875], + [23.6415039062501, 67.12939453125], + [23.7335937500001, 67.422900390625], + [23.4548828125, 67.4602539062501], + [23.6388671875, 67.95439453125], + [22.8541015625, 68.367333984375], + [21.9974609375001, 68.52060546875], + [20.62216796875, 69.036865234375], + [21.06572265625, 69.041748046875], + [21.06611328125, 69.214111328125], + [21.59375, 69.273583984375], + [22.4109375000001, 68.719873046875], + [23.3240234375, 68.648974609375], + [23.85400390625, 68.805908203125], + [24.94140625, 68.5932617187501], + [25.74833984375, 68.99013671875], + [26.0724609375, 69.691552734375], + [26.5253906250001, 69.9150390625], + [27.1275390625001, 69.906494140625], + [27.7478515625, 70.06484375], + [29.1416015625, 69.6714355468751], + [29.3333984375001, 69.472998046875], + [28.8462890625, 69.176904296875], + [28.9658203125, 69.02197265625] + ] + ] + ] + }, + "properties": { + "name": "Finland", + "childNum": 5 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [178.487890625, -18.97412109375], + [177.95869140625, -19.12158203125], + [178.33427734375, -18.93447265625], + [178.487890625, -18.97412109375] + ] + ], + [ + [ + [179.34931640625, -18.10234375], + [179.253515625, -18.03056640625], + [179.3064453125, -17.94404296875], + [179.34931640625, -18.10234375] + ] + ], + [ + [ + [178.28017578125, -17.37197265625], + [178.5916015625, -17.65146484375], + [178.66767578125, -18.080859375], + [177.95546875, -18.2640625], + [177.32138671875, -18.0775390625], + [177.26396484375, -17.8634765625], + [177.5044921875, -17.53955078125], + [177.81796875, -17.3884765625], + [178.28017578125, -17.37197265625] + ] + ], + [ + [ + [180, -16.9630859375], + [179.89697265625, -16.9640625], + [180, -16.7857421875], + [180, -16.9630859375] + ] + ], + [ + [ + [-179.97490234375, -16.9248046875], + [-180, -16.96298828125], + [-180, -16.9078125], + [-180, -16.82431640625], + [-180, -16.785546875], + [-179.860986328125, -16.68828125], + [-179.97490234375, -16.9248046875] + ] + ], + [ + [ + [-179.929443359375, -16.50283203125], + [-179.999951171875, -16.5400390625], + [-179.900927734375, -16.43154296875], + [-179.929443359375, -16.50283203125] + ] + ], + [ + [ + [179.99921875, -16.1685546875], + [179.56416015625, -16.6369140625], + [179.5681640625, -16.7474609375], + [179.93037109375, -16.5194335937501], + [179.9279296875, -16.74443359375], + [179.4193359375, -16.80654296875], + [179.20234375, -16.7126953125], + [179.0068359375, -16.9001953125], + [178.706640625, -16.976171875], + [178.4974609375, -16.787890625], + [178.58359375, -16.621875], + [178.805078125, -16.6314453125], + [179.5517578125, -16.24990234375], + [180, -16.1529296875], + [179.99921875, -16.1685546875] + ] + ] + ] + }, + "properties": { + "name": "Fiji", + "childNum": 7 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-61.01875, -51.7857421875], + [-60.8759765625, -51.79423828125], + [-60.94755859375, -51.9462890625], + [-61.14501953125, -51.839453125], + [-61.01875, -51.7857421875] + ] + ], + [ + [ + [-60.28623046875, -51.4619140625], + [-59.38759765625, -51.3599609375], + [-59.26806640625, -51.4275390625], + [-59.92138671875, -51.96953125], + [-60.246337890625, -51.98642578125], + [-60.353466796875, -52.13994140625], + [-60.686376953125, -52.18837890625], + [-60.96142578125, -52.05732421875], + [-60.2384765625, -51.77197265625], + [-60.58251953125, -51.7126953125], + [-60.2451660156249, -51.6388671875], + [-60.56845703125, -51.3578124999999], + [-60.28623046875, -51.4619140625] + ] + ], + [ + [ + [-60.11171875, -51.3958984375], + [-60.275341796875, -51.28056640625], + [-60.06982421875, -51.30791015625], + [-60.11171875, -51.3958984375] + ] + ], + [ + [ + [-58.8501953125, -51.269921875], + [-58.425830078125, -51.32421875], + [-58.508935546875, -51.48359375], + [-58.27158203125, -51.57470703125], + [-58.259228515625, -51.41708984375], + [-57.976513671875, -51.384375], + [-57.80849609375, -51.51796875], + [-57.96044921875, -51.583203125], + [-57.791796875, -51.6361328125], + [-58.68349609375, -51.93623046875], + [-58.652783203125, -52.09921875], + [-59.195849609375, -52.01767578125], + [-59.068017578125, -52.173046875], + [-59.34150390625, -52.19599609375], + [-59.395654296875, -52.3080078125], + [-59.64873046875, -52.134375], + [-59.5708007812499, -51.925390625], + [-59.059521484375, -51.68544921875], + [-59.096630859375, -51.49140625], + [-58.8501953125, -51.269921875] + ] + ] + ] + }, + "properties": { + "name": "Falkland Is.", + "childNum": 4 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [55.79736328125, -21.33935546875], + [55.3626953125001, -21.2736328125], + [55.2328125000001, -21.0583984375], + [55.3113281250001, -20.9041015625], + [55.6619140625001, -20.90625], + [55.8390625000001, -21.13857421875], + [55.79736328125, -21.33935546875] + ] + ], + [ + [ + [45.1802734375, -12.9767578125], + [45.06943359375, -12.89560546875], + [45.0923828125001, -12.65302734375], + [45.22314453125, -12.7521484375], + [45.1802734375, -12.9767578125] + ] + ], + [ + [ + [-51.6525390625, 4.06127929687497], + [-52.327880859375, 3.18173828125002], + [-52.5830078125, 2.52890624999998], + [-52.903466796875, 2.21152343749998], + [-53.7677734375, 2.35483398437505], + [-54.130078125, 2.12104492187503], + [-54.43310546875, 2.20751953125006], + [-54.515087890625, 2.24545898437496], + [-54.55048828125, 2.29306640624999], + [-54.591943359375, 2.31376953125003], + [-54.616259765625, 2.32675781250001], + [-54.604736328125, 2.33579101562499], + [-54.568408203125, 2.34257812500003], + [-54.5359375, 2.343310546875], + [-54.485546875, 2.41611328125001], + [-54.402001953125, 2.46152343750002], + [-54.25673828125, 2.71372070312498], + [-54.1955078125, 2.81787109375006], + [-54.170703125, 2.99360351562497], + [-54.203125, 3.13818359375003], + [-54.188037109375, 3.17875976562503], + [-54.06318359375, 3.35332031249999], + [-54.0095703124999, 3.44853515625002], + [-54.034228515625, 3.62939453125], + [-54.350732421875, 4.05410156250002], + [-54.4796875, 4.83652343749999], + [-53.919921875, 5.76899414062498], + [-52.89931640625, 5.42504882812499], + [-52.29052734375, 4.94218750000003], + [-52.324609375, 4.77089843750004], + [-52.2199707031249, 4.86279296875001], + [-52.05810546875, 4.71738281249996], + [-52.0029296875, 4.35229492187501], + [-51.8275390625, 4.63569335937503], + [-51.6525390625, 4.06127929687497] + ] + ], + [ + [ + [-60.82626953125, 14.494482421875], + [-61.063720703125, 14.46708984375], + [-61.011328125, 14.601904296875], + [-61.213330078125, 14.848583984375], + [-60.9271484375, 14.75517578125], + [-60.82626953125, 14.494482421875] + ] + ], + [ + [ + [-61.23046875, 15.8899414062501], + [-61.3107421875, 15.894677734375], + [-61.25, 16.006298828125], + [-61.23046875, 15.8899414062501] + ] + ], + [ + [ + [-61.58955078125, 16.00693359375], + [-61.759423828125, 16.062060546875], + [-61.748046875, 16.3552734375], + [-61.55234375, 16.2708984375], + [-61.58955078125, 16.00693359375] + ] + ], + [ + [ + [-61.3271484375, 16.230419921875], + [-61.52216796875, 16.22802734375], + [-61.4711914062499, 16.506640625], + [-61.172607421875, 16.256103515625], + [-61.3271484375, 16.230419921875] + ] + ], + [ + [ + [9.48037109375002, 42.805419921875], + [9.55068359375005, 42.1297363281251], + [9.18613281250003, 41.384912109375], + [8.80751953125008, 41.58837890625], + [8.88681640624998, 41.70068359375], + [8.621875, 41.930712890625], + [8.70097656250005, 42.09560546875], + [8.565625, 42.35771484375], + [8.81484375000008, 42.60791015625], + [9.31337890625002, 42.71318359375], + [9.36318359375005, 43.0173828125], + [9.48037109375002, 42.805419921875] + ] + ], + [ + [ + [-1.17832031249992, 45.904052734375], + [-1.21357421875001, 45.8166015625], + [-1.38867187499997, 46.0503906250001], + [-1.17832031249992, 45.904052734375] + ] + ], + [ + [ + [5.78974609374998, 49.53828125], + [5.82343750000001, 49.505078125], + [5.9013671875, 49.48974609375], + [5.92890625000001, 49.4775390625], + [5.95947265625003, 49.454638671875], + [6.01142578125004, 49.445458984375], + [6.07412109375002, 49.454638671875], + [6.11992187500002, 49.485205078125], + [6.18105468750005, 49.49892578125], + [6.34433593750001, 49.452734375], + [6.73544921875001, 49.160595703125], + [7.45058593750005, 49.152197265625], + [8.13486328125001, 48.973583984375], + [7.61660156250002, 48.156787109375], + [7.615625, 47.592724609375], + [7.34316406249999, 47.43310546875], + [7.13603515624999, 47.48984375], + [6.96835937500003, 47.45322265625], + [6.90039062500003, 47.39423828125], + [7.00058593750003, 47.339453125], + [7.00058593750003, 47.3225097656251], + [6.97851562500006, 47.30205078125], + [6.95205078125008, 47.2671875000001], + [6.82070312500005, 47.16318359375], + [6.68808593750003, 47.0582519531251], + [6.66689453125008, 47.026513671875], + [6.62480468750002, 47.004345703125], + [6.45625, 46.94833984375], + [6.43864676339287, 46.7744182477679], + [6.12968750000005, 46.5669921875001], + [6.11811104910718, 46.4474595424107], + [6.09589843750001, 46.27939453125], + [5.97001953125005, 46.214697265625], + [5.97148437500007, 46.151220703125], + [6.00664062500005, 46.1423339843751], + [6.08662109375007, 46.147021484375], + [6.19941406250004, 46.19306640625], + [6.23466796875005, 46.3326171875], + [6.321875, 46.393701171875], + [6.42890625000001, 46.4305175781251], + [6.57822265625003, 46.437353515625], + [6.75810546875002, 46.415771484375], + [6.77207031250001, 46.16513671875], + [6.89726562500002, 46.0517578125], + [6.95371093750006, 46.017138671875], + [7.00390625, 45.9588378906251], + [7.02109375000003, 45.92578125], + [6.79091796875002, 45.740869140625], + [7.14638671875005, 45.38173828125], + [7.07832031250004, 45.23994140625], + [6.63476562500003, 45.0681640625], + [6.99267578125, 44.827294921875], + [6.90019531249999, 44.3357421875], + [7.31855468750007, 44.13798828125], + [7.63720703125006, 44.16484375], + [7.4931640625, 43.767138671875], + [6.57021484375002, 43.199072265625], + [6.11591796875001, 43.07236328125], + [5.40654296875007, 43.228515625], + [5.05976562500004, 43.44453125], + [4.71210937500001, 43.373291015625], + [3.91083984375001, 43.5630859375], + [3.25888671875006, 43.193212890625], + [3.05175781250006, 42.91513671875], + [3.21142578125, 42.43115234375], + [2.03271484375003, 42.353515625], + [1.92792968750007, 42.426318359375], + [1.85976562500005, 42.457080078125], + [1.7060546875, 42.5033203125001], + [1.70986328125005, 42.604443359375], + [1.56816406250005, 42.6350097656251], + [1.50136718750002, 42.642724609375], + [1.42832031249998, 42.5958984375], + [0.696875, 42.8451171875001], + [0.631640625000045, 42.689599609375], + [-0.586425781249943, 42.798974609375], + [-1.30004882812494, 43.1009765625], + [-1.46083984374994, 43.0517578125001], + [-1.41069335937493, 43.240087890625], + [-1.79404296874995, 43.40732421875], + [-1.48486328124994, 43.56376953125], + [-1.24550781249994, 44.55986328125], + [-1.07695312499996, 44.68984375], + [-1.15288085937499, 44.764013671875], + [-1.24521484374998, 44.66669921875], + [-1.08100585937498, 45.532421875], + [-0.548486328124966, 45.0005859375001], + [-0.790771484375028, 45.468017578125], + [-1.19599609374998, 45.714453125], + [-1.03173828125, 45.741064453125], + [-1.14628906249996, 46.311376953125], + [-1.78652343749994, 46.51484375], + [-2.059375, 46.810302734375], + [-2.01889648437492, 47.037646484375], + [-2.19707031249999, 47.1629394531251], + [-2.02758789062503, 47.273583984375], + [-1.74252929687495, 47.215966796875], + [-1.97539062499996, 47.3106933593751], + [-2.503125, 47.312060546875], + [-2.42768554687498, 47.4708984375], + [-2.77031249999999, 47.5138671875], + [-2.78720703124995, 47.625537109375], + [-4.31210937499995, 47.822900390625], + [-4.67880859374995, 48.039501953125], + [-4.32944335937492, 48.169970703125], + [-4.57714843749994, 48.2900390625], + [-4.24140624999993, 48.303662109375], + [-4.71938476562497, 48.363134765625], + [-4.7625, 48.450244140625], + [-4.53120117187498, 48.6199707031251], + [-3.23144531249997, 48.8408203125], + [-2.69233398437498, 48.53681640625], + [-2.44619140624994, 48.6482910156251], + [-2.00371093749996, 48.582080078125], + [-1.90571289062496, 48.6971191406251], + [-1.37646484374997, 48.652587890625], + [-1.56547851562493, 48.805517578125], + [-1.58310546874998, 49.2023925781251], + [-1.85644531249997, 49.6837890625], + [-1.25864257812495, 49.6801757812501], + [-1.13852539062498, 49.387890625], + [-0.163476562499937, 49.29677734375], + [0.41689453125008, 49.448388671875], + [0.129394531250028, 49.508447265625], + [0.186718749999983, 49.70302734375], + [1.24550781250005, 49.9982421875], + [1.5927734375, 50.2521972656251], + [1.67226562500002, 50.885009765625], + [2.52490234375, 51.097119140625], + [2.759375, 50.750634765625], + [3.10683593750008, 50.779443359375], + [3.27333984375008, 50.53154296875], + [3.59541015625007, 50.47734375], + [3.68935546875002, 50.3060546875], + [4.17460937500002, 50.2464843750001], + [4.14931640625002, 49.97158203125], + [4.54501953125006, 49.96025390625], + [4.81865234375005, 50.153173828125], + [4.86757812500005, 49.788134765625], + [5.50732421875, 49.510888671875], + [5.78974609374998, 49.53828125] + ] + ] + ] + }, + "properties": { + "name": "France", + "childNum": 10, + "cp": [2.8719426, 46.8222422] + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-7.18686523437495, 62.139306640625], + [-7.11679687499998, 62.046826171875], + [-7.37910156249993, 62.0748046875], + [-7.18686523437495, 62.139306640625] + ] + ], + [ + [ + [-6.63105468749996, 62.227880859375], + [-6.65581054687493, 62.093603515625], + [-6.84052734374998, 62.119287109375], + [-6.72519531249995, 61.95146484375], + [-7.17216796874996, 62.285595703125], + [-6.63105468749996, 62.227880859375] + ] + ], + [ + [ + [-6.40605468749993, 62.258642578125], + [-6.54414062499993, 62.205615234375], + [-6.55458984374999, 62.3556640625], + [-6.40605468749993, 62.258642578125] + ] + ] + ] + }, + "properties": { + "name": "Faeroe Is.", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [158.31484375, 6.813671875], + [158.1833984375, 6.80126953125006], + [158.134765625, 6.94482421874999], + [158.29462890625, 6.95107421875002], + [158.31484375, 6.813671875] + ] + ], + [ + [ + [138.14267578125, 9.50068359375004], + [138.06708984375, 9.41904296875001], + [138.18583984375, 9.59331054687499], + [138.14267578125, 9.50068359375004] + ] + ] + ] + }, + "properties": { + "name": "Micronesia", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [13.2935546875, 2.161572265625], + [13.17216796875, 1.78857421875], + [13.21630859375, 1.2484375], + [13.8513671875, 1.41875], + [14.180859375, 1.37021484374999], + [14.4298828125, 0.901464843749991], + [14.32421875, 0.62421875], + [13.949609375, 0.353808593749989], + [13.86005859375, -0.203320312500011], + [14.47412109375, -0.573437500000011], + [14.383984375, -1.89003906250001], + [14.162890625, -2.217578125], + [14.1998046875, -2.35419921875001], + [13.99384765625, -2.490625], + [13.8869140625, -2.46542968750001], + [13.7337890625, -2.1384765625], + [13.46494140625, -2.39541015625001], + [12.9919921875, -2.31337890625001], + [12.7935546875, -1.93183593750001], + [12.5904296875, -1.82685546875001], + [12.43212890625, -1.92890625000001], + [12.44638671875, -2.32998046875001], + [12.064453125, -2.41259765625], + [11.60546875, -2.342578125], + [11.53779296875, -2.83671875], + [11.76015625, -2.98310546875001], + [11.7154296875, -3.17695312500001], + [11.9341796875, -3.31855468750001], + [11.8798828125, -3.66591796875001], + [11.6857421875, -3.68203125], + [11.504296875, -3.5203125], + [11.23447265625, -3.69082031250001], + [11.13017578125, -3.91630859375], + [10.34765625, -3.01308593750001], + [9.72207031250002, -2.467578125], + [10.06201171875, -2.54990234375001], + [9.624609375, -2.36708984375001], + [9.29892578125001, -1.90302734375001], + [9.48320312500002, -1.89462890625001], + [9.265625, -1.82509765625001], + [9.03632812500001, -1.30888671875], + [9.31884765625, -1.63203125000001], + [9.50107421875001, -1.55517578125], + [9.29580078125002, -1.515234375], + [9.3466796875, -1.325], + [9.20380859375001, -1.382421875], + [9.06464843750001, -1.29833984375], + [8.703125, -0.591015625000011], + [8.94638671875001, -0.688769531250003], + [9.29667968750002, -0.351269531250011], + [9.35488281250002, 0.343603515624991], + [9.46816406250002, 0.15976562499999], + [9.79677734375002, 0.044238281249989], + [10.00146484375, 0.194970703124994], + [9.546484375, 0.295947265624989], + [9.32480468750001, 0.552099609374991], + [9.49531250000001, 0.664843749999989], + [9.61796875000002, 0.576513671874991], + [9.5908203125, 1.031982421875], + [9.63613281250002, 1.04667968749999], + [9.67646484375001, 1.07470703125], + [9.70458984375, 1.07998046874999], + [9.76054687500002, 1.07470703125], + [9.788671875, 1.02568359374999], + [9.80390625000001, 0.998730468749997], + [9.90673828125, 0.960107421874994], + [11.3353515625, 0.999707031249997], + [11.33232421875, 1.52836914062499], + [11.3287109375, 2.167431640625], + [11.3484375, 2.29970703124999], + [11.558984375, 2.302197265625], + [13.2203125, 2.25644531249999], + [13.2935546875, 2.161572265625] + ] + ] + }, + "properties": { + "name": "Gabon", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-1.06557617187497, 50.690234375], + [-1.25146484375, 50.588818359375], + [-1.56342773437496, 50.66611328125], + [-1.31279296874996, 50.773486328125], + [-1.06557617187497, 50.690234375] + ] + ], + [ + [ + [-4.19677734374997, 53.321435546875], + [-4.04936523437496, 53.30576171875], + [-4.373046875, 53.1341796875], + [-4.56787109375, 53.386474609375], + [-4.31508789062502, 53.417236328125], + [-4.19677734374997, 53.321435546875] + ] + ], + [ + [ + [-6.218017578125, 54.0887207031251], + [-6.64980468749994, 54.058642578125], + [-7.00771484374994, 54.406689453125], + [-7.32451171875002, 54.133447265625], + [-7.60654296875001, 54.14384765625], + [-8.11826171874998, 54.4142578125], + [-7.75439453125, 54.594921875], + [-7.91059570312496, 54.69833984375], + [-7.55039062499992, 54.76796875], + [-7.21865234374994, 55.0919921875], + [-6.47504882812496, 55.241015625], + [-6.03579101562499, 55.14453125], + [-5.71684570312496, 54.81748046875], + [-5.87861328124996, 54.64130859375], + [-5.58251953124994, 54.663427734375], + [-5.47041015624993, 54.5001953125], + [-5.67109374999996, 54.549755859375], + [-5.60678710937492, 54.27255859375], + [-6.01904296874997, 54.05126953125], + [-6.218017578125, 54.0887207031251] + ] + ], + [ + [ + [-5.10541992187501, 55.448828125], + [-5.33149414062496, 55.4810546875], + [-5.318115234375, 55.7091796875], + [-5.10541992187501, 55.448828125] + ] + ], + [ + [ + [-6.12890624999997, 55.93056640625], + [-6.05532226562499, 55.6953125], + [-6.30507812499997, 55.60693359375], + [-6.28642578124999, 55.772509765625], + [-6.49135742187499, 55.697314453125], + [-6.46284179687496, 55.808251953125], + [-6.12890624999997, 55.93056640625] + ] + ], + [ + [ + [-5.97006835937495, 55.81455078125], + [-6.07197265625001, 55.893115234375], + [-5.72514648437496, 56.1185546875], + [-5.97006835937495, 55.81455078125] + ] + ], + [ + [ + [-5.77788085937496, 56.3443359375], + [-6.31342773437498, 56.29365234375], + [-6.13886718749996, 56.490625], + [-6.28632812499998, 56.611865234375], + [-6.10273437499996, 56.645654296875], + [-5.76083984374995, 56.490673828125], + [-5.77788085937496, 56.3443359375] + ] + ], + [ + [ + [-7.24985351562498, 57.11533203125], + [-7.41054687499994, 57.3811035156251], + [-7.26713867187496, 57.37177734375], + [-7.24985351562498, 57.11533203125] + ] + ], + [ + [ + [-6.14472656249998, 57.50498046875], + [-6.13554687499999, 57.3142578125], + [-5.67246093749998, 57.252685546875], + [-5.94907226562492, 57.045166015625], + [-6.034375, 57.201220703125], + [-6.32270507812493, 57.202490234375], + [-6.76113281249999, 57.4423828125], + [-6.30595703124999, 57.67197265625], + [-6.14472656249998, 57.50498046875] + ] + ], + [ + [ + [-7.20556640625003, 57.682958984375], + [-7.18261718749997, 57.5333007812501], + [-7.51474609374995, 57.601953125], + [-7.20556640625003, 57.682958984375] + ] + ], + [ + [ + [-6.19868164062498, 58.36328125], + [-6.55458984374999, 58.09287109375], + [-6.42519531249994, 58.0212890625], + [-6.98310546874998, 57.75], + [-7.08344726562493, 57.81376953125], + [-6.85683593749994, 57.92353515625], + [-7.08525390624993, 58.182177734375], + [-6.72646484374994, 58.189404296875], + [-6.77646484375001, 58.301513671875], + [-6.23745117187497, 58.5028320312501], + [-6.19868164062498, 58.36328125] + ] + ], + [ + [ + [-3.10966796874993, 58.515478515625], + [-3.21235351562498, 58.321240234375], + [-3.99003906249996, 57.959033203125], + [-4.03559570312493, 57.852001953125], + [-3.85712890624998, 57.8185546875], + [-4.134521484375, 57.5777343750001], + [-3.40278320312496, 57.708251953125], + [-2.07407226562498, 57.7023925781251], + [-1.78066406249999, 57.4740234375], + [-2.59267578124994, 56.561572265625], + [-3.30996093749997, 56.3634765625], + [-2.88515624999994, 56.397509765625], + [-2.67426757812496, 56.25341796875], + [-3.36225585937496, 56.02763671875], + [-3.78906249999997, 56.09521484375], + [-3.04873046874994, 55.951953125], + [-2.59931640624996, 56.027294921875], + [-2.14707031249992, 55.902978515625], + [-1.65537109374995, 55.570361328125], + [-1.23242187499994, 54.7037109375], + [-0.084375, 54.11806640625], + [-0.20556640625, 54.021728515625], + [0.115332031250006, 53.60927734375], + [-0.270019531249972, 53.736767578125], + [-0.659912109375, 53.7240234375], + [-0.293701171875, 53.692333984375], + [0.270996093750028, 53.335498046875], + [0.355761718750045, 53.1599609375], + [0.0458984375, 52.905615234375], + [0.279785156250028, 52.8086914062501], + [0.55878906250004, 52.9669433593751], + [1.05556640625008, 52.958984375], + [1.65673828124997, 52.7537109375], + [1.74658203125, 52.468994140625], + [1.59140625, 52.119775390625], + [1.23242187500006, 51.971240234375], + [1.18847656250006, 51.803369140625], + [0.752246093750017, 51.72958984375], + [0.890917968750017, 51.571435546875], + [0.42451171875004, 51.465625], + [1.41494140625002, 51.36328125], + [1.39755859375003, 51.18203125], + [0.960156250000011, 50.92587890625], + [0.299707031249994, 50.7759765625], + [-0.785253906249949, 50.7654296875], + [-1.41645507812496, 50.896875], + [-1.33447265624994, 50.82080078125], + [-1.51674804687494, 50.7474609375], + [-2.03105468749993, 50.725390625], + [-2.03583984374993, 50.603076171875], + [-2.99941406249994, 50.7166015625], + [-3.40458984374996, 50.632421875], + [-3.67978515625001, 50.23994140625], + [-4.19458007812497, 50.393310546875], + [-4.72797851562493, 50.290478515625], + [-5.11850585937492, 50.038330078125], + [-5.62211914062493, 50.05068359375], + [-4.18818359374993, 51.188525390625], + [-3.13598632812497, 51.205029296875], + [-2.43305664062493, 51.74072265625], + [-3.29311523437499, 51.3904296875], + [-3.89077148437499, 51.591650390625], + [-4.23457031249996, 51.569091796875], + [-4.09101562499993, 51.6599121093751], + [-4.38627929687496, 51.7410644531251], + [-4.90229492187493, 51.62626953125], + [-5.16835937499994, 51.74072265625], + [-5.18334960937497, 51.949658203125], + [-4.21772460937498, 52.27744140625], + [-3.98032226562495, 52.541748046875], + [-4.10146484375002, 52.915478515625], + [-4.68305664062493, 52.80615234375], + [-4.26855468749994, 53.14453125], + [-3.42773437499997, 53.340673828125], + [-3.09755859374994, 53.260302734375], + [-3.06474609374993, 53.42685546875], + [-2.74951171875, 53.310205078125], + [-3.06459960937499, 53.512841796875], + [-2.84648437499996, 54.135302734375], + [-3.16596679687496, 54.1279296875001], + [-3.56938476562496, 54.467578125], + [-3.46459960937494, 54.7730957031251], + [-3.03623046874998, 54.953076171875], + [-3.55043945312494, 54.947412109375], + [-3.95791015624999, 54.78095703125], + [-4.81806640624998, 54.846142578125], + [-4.91123046874995, 54.6894531250001], + [-5.03232421874995, 54.7613769531251], + [-5.17270507812495, 54.985888671875], + [-4.67675781249997, 55.501318359375], + [-4.87167968749998, 55.8739257812501], + [-4.58408203124992, 55.938671875], + [-4.84409179687495, 56.051171875], + [-4.80029296875, 56.158349609375], + [-5.22822265624998, 55.886328125], + [-5.08432617187498, 56.1974609375], + [-5.41044921874996, 55.995361328125], + [-5.55644531249996, 55.389599609375], + [-5.73066406249993, 55.334130859375], + [-5.50449218749995, 55.802392578125], + [-5.60957031249996, 56.0552734375], + [-5.18837890624994, 56.758056640625], + [-5.65244140624998, 56.531982421875], + [-6.13369140624997, 56.706689453125], + [-5.73061523437499, 56.853076171875], + [-5.86142578124992, 56.902685546875], + [-5.56191406249999, 57.23271484375], + [-5.79492187499997, 57.37880859375], + [-5.58178710937497, 57.54677734375], + [-5.74492187499999, 57.668310546875], + [-5.60834960937496, 57.88134765625], + [-5.15722656249997, 57.88134765625], + [-5.41318359375001, 58.0697265625], + [-5.33828125000002, 58.238720703125], + [-5.00830078125003, 58.262646484375], + [-5.01674804687497, 58.566552734375], + [-4.43325195312494, 58.5128417968751], + [-3.25913085937492, 58.65], + [-3.05307617187495, 58.634814453125], + [-3.10966796874993, 58.515478515625] + ] + ], + [ + [ + [-3.05742187499993, 59.029638671875], + [-2.79301757812499, 58.90693359375], + [-3.33164062499995, 58.971240234375], + [-3.31035156249996, 59.130810546875], + [-3.05742187499993, 59.029638671875] + ] + ], + [ + [ + [-1.30810546875, 60.5375], + [-1.05244140624996, 60.444482421875], + [-1.29946289062499, 59.878662109375], + [-1.29091796874994, 60.153466796875], + [-1.66376953124998, 60.2825195312501], + [-1.37460937499995, 60.33291015625], + [-1.57177734374997, 60.4944335937501], + [-1.36396484375001, 60.6095703125], + [-1.30810546875, 60.5375] + ] + ] + ] + }, + "properties": { + "name": "United Kingdom", + "childNum": 14, + "cp": [-2.5830348, 54.4598409] + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [46.30546875, 41.50771484375], + [46.6189453125, 41.34375], + [46.67255859375, 41.28681640625], + [46.66240234375, 41.2455078125], + [46.6263671875, 41.15966796875], + [46.534375, 41.08857421875], + [46.43095703125, 41.07705078125], + [46.0865234375, 41.183837890625], + [45.28095703125, 41.449560546875], + [45.2171875, 41.423193359375], + [45.0013671875, 41.290966796875], + [44.97587890625, 41.277490234375], + [44.811328125, 41.259375], + [44.07724609375, 41.18251953125], + [43.4333984375, 41.155517578125], + [43.20546875, 41.199169921875], + [43.15283203125, 41.23642578125], + [43.141015625, 41.26484375], + [43.1712890625, 41.287939453125], + [43.1490234375, 41.30712890625], + [43.05712890625, 41.35283203125], + [42.90673828125, 41.466845703125], + [42.8216796875, 41.4923828125], + [42.787890625, 41.563720703125], + [42.7541015625, 41.57890625], + [42.682421875, 41.5857421875], + [42.6068359375, 41.57880859375], + [42.5904296875, 41.570703125], + [42.5673828125, 41.55927734375], + [42.46640625, 41.43984375], + [41.92578125, 41.495654296875], + [41.82353515625, 41.432373046875], + [41.77939453125, 41.44052734375], + [41.7017578125, 41.47158203125], + [41.5765625, 41.497314453125], + [41.51005859375, 41.51748046875], + [41.7017578125, 41.705419921875], + [41.76298828125, 41.97001953125], + [41.48876953125, 42.659326171875], + [40.83662109375, 43.0634765625], + [40.462109375, 43.145703125], + [39.9783203125, 43.41982421875], + [40.02373046875, 43.48486328125], + [40.0845703125, 43.553125], + [40.648046875, 43.53388671875], + [40.9419921875, 43.41806640625], + [41.08310546875, 43.374462890625], + [41.358203125, 43.3333984375], + [41.4607421875, 43.276318359375], + [41.58056640625, 43.21923828125], + [42.76064453125, 43.169580078125], + [42.9916015625, 43.09150390625], + [43.0001953125, 43.049658203125], + [43.08916015625, 42.9890625], + [43.5578125, 42.844482421875], + [43.623046875, 42.80771484375], + [43.7826171875, 42.747021484375], + [43.79873046875, 42.727783203125], + [43.79541015625, 42.702978515625], + [43.74990234375, 42.65751953125], + [43.73837890625, 42.6169921875], + [43.75986328125, 42.59384765625], + [43.8259765625, 42.571533203125], + [43.957421875, 42.566552734375], + [44.0046875, 42.59560546875], + [44.102734375, 42.616357421875], + [44.3294921875, 42.703515625], + [44.505859375, 42.7486328125], + [44.77109375, 42.616796875], + [44.85048828125, 42.746826171875], + [44.87099609375, 42.756396484375], + [44.943359375, 42.7302734375], + [45.07158203125, 42.694140625], + [45.16025390625, 42.675], + [45.34375, 42.52978515625], + [45.562890625, 42.5357421875], + [45.7052734375, 42.498095703125], + [45.7275390625, 42.475048828125], + [45.63427734375, 42.234716796875], + [45.63857421875, 42.205078125], + [46.2126953125, 41.989892578125], + [46.4298828125, 41.890966796875], + [46.18427734375, 41.7021484375], + [46.30546875, 41.50771484375] + ] + ] + }, + "properties": { + "name": "Georgia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-0.068603515625, 11.115625], + [0.009423828125023, 11.02099609375], + [-0.08632812499999, 10.673046875], + [0.380859375, 10.291845703125], + [0.264550781250023, 9.6447265625], + [0.342578125000017, 9.60415039062499], + [0.2333984375, 9.46352539062499], + [0.525683593750017, 9.39848632812499], + [0.48876953125, 8.85146484374999], + [0.37255859375, 8.75927734375], + [0.686328125000017, 8.35488281249999], + [0.5, 7.546875], + [0.634765625, 7.35366210937499], + [0.525585937500011, 6.85092773437499], + [0.736914062500006, 6.452587890625], + [1.18720703125001, 6.08940429687499], + [0.94970703125, 5.81025390625], + [0.259667968750023, 5.75732421875], + [-2.00185546874999, 4.762451171875], + [-3.114013671875, 5.08867187499999], + [-2.815673828125, 5.15302734375], + [-2.75498046874998, 5.43251953124999], + [-2.79365234374998, 5.60009765625], + [-2.998291015625, 5.71132812499999], + [-3.22714843749998, 6.74912109374999], + [-2.95908203124998, 7.454541015625], + [-2.78974609374998, 7.93193359374999], + [-2.66884765624999, 8.022216796875], + [-2.61337890624998, 8.04667968749999], + [-2.60097656249999, 8.0822265625], + [-2.61997070312498, 8.12109375], + [-2.61171875, 8.14755859374999], + [-2.53828124999998, 8.171630859375], + [-2.505859375, 8.208740234375], + [-2.60039062499999, 8.80043945312499], + [-2.64921874999999, 8.95659179687499], + [-2.68989257812498, 9.02509765625], + [-2.74692382812498, 9.0451171875], + [-2.70576171874998, 9.35136718749999], + [-2.69584960937499, 9.48134765624999], + [-2.70620117187499, 9.533935546875], + [-2.76596679687498, 9.65805664062499], + [-2.780517578125, 9.745849609375], + [-2.79116210937499, 10.432421875], + [-2.91489257812498, 10.592333984375], + [-2.82993164062498, 10.998388671875], + [-1.04248046875, 11.01005859375], + [-0.627148437499983, 10.927392578125], + [-0.299462890624994, 11.16689453125], + [-0.068603515625, 11.115625] + ] + ] + }, + "properties": { + "name": "Ghana", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-11.389404296875, 12.40439453125], + [-11.502197265625, 12.1986328125], + [-11.30517578125, 12.0154296875], + [-10.933203125, 12.20517578125], + [-10.709228515625, 11.89873046875], + [-10.274853515625, 12.212646484375], + [-9.75400390624998, 12.029931640625], + [-9.35810546874998, 12.255419921875], + [-9.39536132812498, 12.4646484375], + [-9.04306640624998, 12.40234375], + [-8.81831054687498, 11.922509765625], + [-8.822021484375, 11.6732421875], + [-8.39853515624998, 11.366552734375], + [-8.66669921874998, 11.00947265625], + [-8.33740234375, 10.990625], + [-8.26665039062499, 10.485986328125], + [-8.00727539062498, 10.321875], + [-7.990625, 10.1625], + [-8.15517578124999, 9.97319335937499], + [-8.136962890625, 9.49570312499999], + [-7.89619140624998, 9.41586914062499], + [-7.91806640624998, 9.18852539062499], + [-7.83940429687499, 9.151611328125], + [-7.7998046875, 9.11503906249999], + [-7.77797851562499, 9.08085937499999], + [-7.902099609375, 9.01708984375], + [-7.93818359374998, 8.97978515624999], + [-7.95097656249999, 8.78681640625], + [-7.71958007812498, 8.643017578125], + [-7.69609374999999, 8.37558593749999], + [-7.82358398437498, 8.46767578124999], + [-7.953125, 8.477734375], + [-8.23696289062499, 8.45566406249999], + [-8.244140625, 8.40791015625], + [-8.256103515625, 8.25371093749999], + [-8.21713867187498, 8.219677734375], + [-8.140625, 8.18144531249999], + [-8.048583984375, 8.16972656249999], + [-8.00986328124998, 8.07851562499999], + [-8.12685546874999, 7.86772460937499], + [-8.11542968749998, 7.7607421875], + [-8.20595703124999, 7.59023437499999], + [-8.23188476562498, 7.55673828124999], + [-8.42998046874999, 7.60185546874999], + [-8.48642578124998, 7.55849609374999], + [-8.65976562499998, 7.68837890624999], + [-8.8896484375, 7.2626953125], + [-9.11757812499999, 7.21591796874999], + [-9.46381835937498, 7.41586914062499], + [-9.369140625, 7.70380859375], + [-9.51826171874998, 8.34609375], + [-9.781982421875, 8.53769531249999], + [-10.06435546875, 8.4298828125], + [-10.147412109375, 8.5197265625], + [-10.233056640625, 8.48881835937499], + [-10.283203125, 8.48515624999999], + [-10.36005859375, 8.49550781249999], + [-10.39443359375, 8.48095703125], + [-10.496435546875, 8.36210937499999], + [-10.55771484375, 8.315673828125], + [-10.686962890625, 8.32167968749999], + [-10.712109375, 8.33525390624999], + [-10.67734375, 8.4005859375], + [-10.500537109375, 8.68754882812499], + [-10.615966796875, 9.05917968749999], + [-10.72685546875, 9.08168945312499], + [-10.747021484375, 9.09526367187499], + [-10.749951171875, 9.12236328124999], + [-10.687646484375, 9.26113281249999], + [-10.68271484375, 9.28935546874999], + [-10.75859375, 9.38535156249999], + [-11.0474609375, 9.786328125], + [-11.180859375, 9.92534179687499], + [-11.2056640625, 9.977734375], + [-11.2736328125, 9.996533203125], + [-11.911083984375, 9.99301757812499], + [-12.142333984375, 9.87539062499999], + [-12.427978515625, 9.89814453125], + [-12.557861328125, 9.70498046874999], + [-12.755859375, 9.37358398437499], + [-12.9587890625, 9.26333007812499], + [-13.077294921875, 9.06962890624999], + [-13.29267578125, 9.04921875], + [-13.436279296875, 9.4203125], + [-13.691357421875, 9.53579101562499], + [-13.689794921875, 9.92778320312499], + [-13.8201171875, 9.88720703125], + [-14.04501953125, 10.141259765625], + [-14.426904296875, 10.24833984375], + [-14.6095703125, 10.549853515625], + [-14.593505859375, 10.76669921875], + [-14.67734375, 10.68896484375], + [-14.775927734375, 10.931640625], + [-14.88671875, 10.96806640625], + [-14.975, 10.80341796875], + [-15.051220703125, 10.8345703125], + [-15.043017578125, 10.94013671875], + [-14.9990234375, 10.9921875], + [-14.94443359375, 11.07216796875], + [-14.779296875, 11.405517578125], + [-14.720263671875, 11.48193359375], + [-14.682958984375, 11.50849609375], + [-14.60478515625, 11.51162109375], + [-14.45244140625, 11.556201171875], + [-14.32783203125, 11.62978515625], + [-14.265576171875, 11.659912109375], + [-14.122314453125, 11.651953125], + [-13.95322265625, 11.664599609375], + [-13.732763671875, 11.73603515625], + [-13.7306640625, 11.95986328125], + [-13.73798828125, 12.00966796875], + [-13.81630859375, 12.0544921875], + [-13.948876953125, 12.178173828125], + [-13.8875, 12.246875], + [-13.759765625, 12.262353515625], + [-13.67353515625, 12.478515625], + [-13.7326171875, 12.592822265625], + [-13.729248046875, 12.67392578125], + [-13.08291015625, 12.633544921875], + [-13.061279296875, 12.489990234375], + [-12.930712890625, 12.532275390625], + [-12.399072265625, 12.340087890625], + [-11.389404296875, 12.40439453125] + ] + ] + }, + "properties": { + "name": "Guinea", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-16.763330078125, 13.06416015625], + [-16.8248046875, 13.341064453125], + [-16.6693359375, 13.475], + [-16.41337890625, 13.2697265625], + [-15.427490234375, 13.468359375], + [-16.13544921875, 13.4482421875], + [-16.351806640625, 13.343359375], + [-16.5623046875, 13.5873046875], + [-15.50966796875, 13.58623046875], + [-15.42685546875, 13.727001953125], + [-15.108349609375, 13.812109375], + [-14.40546875, 13.5037109375], + [-13.977392578125, 13.54345703125], + [-13.826708984375, 13.4078125], + [-14.24677734375, 13.23583984375], + [-15.151123046875, 13.556494140625], + [-15.28623046875, 13.39599609375], + [-15.814404296875, 13.325146484375], + [-15.83427734375, 13.1564453125], + [-16.648779296875, 13.154150390625], + [-16.763330078125, 13.06416015625] + ] + ] + }, + "properties": { + "name": "Gambia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-15.8958984375, 11.082470703125], + [-15.96396484375, 11.058984375], + [-15.9376953125, 11.1927734375], + [-15.8958984375, 11.082470703125] + ] + ], + [ + [ + [-16.114501953125, 11.059423828125], + [-16.23642578125, 11.113427734375], + [-16.067333984375, 11.197216796875], + [-16.114501953125, 11.059423828125] + ] + ], + [ + [ + [-15.9018066406249, 11.4658203125], + [-16.023193359375, 11.4771484375], + [-15.9645507812499, 11.598291015625], + [-15.9018066406249, 11.4658203125] + ] + ], + [ + [ + [-15.9864257812499, 11.88203125], + [-16.0383300781249, 11.759716796875], + [-16.1524414062499, 11.876806640625], + [-15.9864257812499, 11.88203125] + ] + ], + [ + [ + [-13.759765625, 12.262353515625], + [-13.8875, 12.246875], + [-13.948876953125, 12.178173828125], + [-13.73798828125, 12.00966796875], + [-13.7306640624999, 11.95986328125], + [-13.7327636718749, 11.73603515625], + [-13.95322265625, 11.664599609375], + [-14.2655761718749, 11.659912109375], + [-14.32783203125, 11.62978515625], + [-14.45244140625, 11.556201171875], + [-14.6047851562499, 11.51162109375], + [-14.6829589843749, 11.50849609375], + [-14.720263671875, 11.48193359375], + [-14.779296875, 11.4055175781251], + [-14.9444335937499, 11.07216796875], + [-14.9990234375, 10.9921875], + [-15.043017578125, 10.94013671875], + [-15.09375, 11.01103515625], + [-15.05458984375, 11.141943359375], + [-15.2221191406249, 11.030908203125], + [-15.21669921875, 11.15625], + [-15.393115234375, 11.217236328125], + [-15.3546875, 11.396337890625], + [-15.4794921875, 11.410302734375], + [-15.0726562499999, 11.597802734375], + [-15.23037109375, 11.686767578125], + [-15.41298828125, 11.615234375], + [-15.501904296875, 11.723779296875], + [-15.4671874999999, 11.842822265625], + [-15.0782714843749, 11.968994140625], + [-15.941748046875, 11.78662109375], + [-15.92021484375, 11.93779296875], + [-16.138427734375, 11.91728515625], + [-16.328076171875, 12.051611328125], + [-16.244580078125, 12.237109375], + [-16.43681640625, 12.204150390625], + [-16.7118164062499, 12.354833984375], + [-16.65693359375, 12.36435546875], + [-16.521337890625, 12.3486328125], + [-16.41630859375, 12.3676757812501], + [-16.24150390625, 12.443310546875], + [-16.1441894531249, 12.457421875], + [-15.83955078125, 12.437890625], + [-15.5748046874999, 12.490380859375], + [-15.19609375, 12.679931640625], + [-14.3492187499999, 12.676416015625], + [-14.06484375, 12.67529296875], + [-13.729248046875, 12.67392578125], + [-13.7326171875, 12.592822265625], + [-13.6735351562499, 12.478515625], + [-13.759765625, 12.262353515625] + ] + ] + ] + }, + "properties": { + "name": "Guinea-Bissau", + "childNum": 5 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [11.33232421875, 1.52836914062499], + [11.3353515625, 0.999707031250011], + [9.90673828125003, 0.960107421875037], + [9.80390625000004, 0.998730468749997], + [9.78867187500003, 1.02568359374997], + [9.76054687499999, 1.07470703125001], + [9.70458984375006, 1.07998046875002], + [9.67646484375001, 1.07470703125001], + [9.63613281250005, 1.04667968749999], + [9.59082031250006, 1.03198242187501], + [9.59941406250005, 1.05444335937497], + [9.50986328125001, 1.11479492187502], + [9.38593750000007, 1.13925781250002], + [9.80703125000005, 1.92749023437503], + [9.77968750000008, 2.06821289062501], + [9.80078125000003, 2.304443359375], + [9.82617187500006, 2.29780273437497], + [9.8369140625, 2.24238281250005], + [9.87011718750003, 2.21328125], + [9.97988281249999, 2.16777343750005], + [10.79091796875, 2.167578125], + [11.0965820312501, 2.16748046874999], + [11.3287109375, 2.16743164062497], + [11.33232421875, 1.52836914062499] + ] + ], + [ + [ + [8.73574218750002, 3.75830078124997], + [8.91005859375002, 3.75820312500005], + [8.94609375000007, 3.62753906249998], + [8.70400390625005, 3.22363281250003], + [8.47490234374999, 3.26464843750004], + [8.46464843750005, 3.45058593749999], + [8.73574218750002, 3.75830078124997] + ] + ] + ] + }, + "properties": { + "name": "Eq. Guinea", + "childNum": 2 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [23.85224609375, 35.53544921875], + [24.1660156250001, 35.59521484375], + [24.108984375, 35.49580078125], + [24.35400390625, 35.35947265625], + [25.73017578125, 35.348583984375], + [25.7913085937501, 35.1228515625], + [26.3202148437501, 35.31513671875], + [26.165625, 35.018603515625], + [24.7998046875, 34.93447265625], + [24.7088867187501, 35.0890625], + [24.463671875, 35.1603515625], + [23.5927734375, 35.2572265625], + [23.56982421875, 35.534765625], + [23.67265625, 35.5139160156251], + [23.7369140625, 35.655517578125], + [23.85224609375, 35.53544921875] + ] + ], + [ + [ + [27.17607421875, 35.465283203125], + [27.070703125, 35.59775390625], + [27.22314453125, 35.820458984375], + [27.17607421875, 35.465283203125] + ] + ], + [ + [ + [23.05380859375, 36.189794921875], + [22.91083984375, 36.22099609375], + [22.95048828125, 36.383935546875], + [23.05380859375, 36.189794921875] + ] + ], + [ + [ + [27.8427734375, 35.929296875], + [27.71552734375, 35.95732421875], + [27.71630859375, 36.17158203125], + [28.2318359375001, 36.433642578125], + [28.08779296875, 36.06533203125], + [27.8427734375, 35.929296875] + ] + ], + [ + [ + [25.482421875, 36.392626953125], + [25.3705078125001, 36.358935546875], + [25.4089843750001, 36.47373046875], + [25.482421875, 36.392626953125] + ] + ], + [ + [ + [26.46064453125, 36.585400390625], + [26.2700195312501, 36.546923828125], + [26.37001953125, 36.63857421875], + [26.46064453125, 36.585400390625] + ] + ], + [ + [ + [26.9496093750001, 36.727099609375], + [27.21494140625, 36.8986328125], + [27.3521484375, 36.8688964843751], + [26.9496093750001, 36.727099609375] + ] + ], + [ + [ + [25.859375, 36.7904296875001], + [25.7431640625, 36.78974609375], + [26.064453125, 36.902734375], + [25.859375, 36.7904296875001] + ] + ], + [ + [ + [27.0197265625, 36.959033203125], + [26.919921875, 36.9452148437501], + [26.888671875, 37.087255859375], + [27.0197265625, 36.959033203125] + ] + ], + [ + [ + [25.27890625, 37.068408203125], + [25.1054687500001, 37.0349609375], + [25.2350585937501, 37.14853515625], + [25.27890625, 37.068408203125] + ] + ], + [ + [ + [25.5458984375, 36.967578125], + [25.45673828125, 36.9296875], + [25.3619140625001, 37.07041015625], + [25.5252929687501, 37.1963867187501], + [25.5458984375, 36.967578125] + ] + ], + [ + [ + [24.5235351562501, 37.12509765625], + [24.4248046875, 37.131982421875], + [24.4837890625001, 37.210205078125], + [24.5235351562501, 37.12509765625] + ] + ], + [ + [ + [25.402734375, 37.419140625], + [25.3126953125001, 37.489306640625], + [25.4629882812501, 37.47109375], + [25.402734375, 37.419140625] + ] + ], + [ + [ + [26.0292968750001, 37.52939453125], + [26.086328125, 37.6349121093751], + [26.3513671875, 37.67431640625], + [26.0292968750001, 37.52939453125] + ] + ], + [ + [ + [25.2558593750001, 37.5996093750001], + [25.15634765625, 37.5450683593751], + [24.9964843750001, 37.676904296875], + [25.2558593750001, 37.5996093750001] + ] + ], + [ + [ + [24.35595703125, 37.57685546875], + [24.2889648437501, 37.528271484375], + [24.3791015625, 37.68271484375], + [24.35595703125, 37.57685546875] + ] + ], + [ + [ + [26.8244140625, 37.8114257812501], + [27.0550781250001, 37.70927734375], + [26.844921875, 37.6447265625], + [26.5810546875, 37.72373046875], + [26.8244140625, 37.8114257812501] + ] + ], + [ + [ + [20.8884765625001, 37.80537109375], + [20.9939453125001, 37.7080078125], + [20.8185546875, 37.66474609375], + [20.6195312500001, 37.855029296875], + [20.69150390625, 37.929541015625], + [20.8884765625001, 37.80537109375] + ] + ], + [ + [ + [24.9916992187501, 37.7596191406251], + [24.9622070312501, 37.6923828125], + [24.7001953125, 37.961669921875], + [24.95634765625, 37.9047851562501], + [24.9916992187501, 37.7596191406251] + ] + ], + [ + [ + [20.6123046875, 38.383349609375], + [20.761328125, 38.070556640625], + [20.5235351562501, 38.106640625], + [20.4521484375, 38.2341796875], + [20.3525390625, 38.1798828125], + [20.5631835937501, 38.474951171875], + [20.6123046875, 38.383349609375] + ] + ], + [ + [ + [26.09404296875, 38.21806640625], + [25.89189453125, 38.243310546875], + [25.9914062500001, 38.353515625], + [25.84609375, 38.5740234375], + [26.1603515625, 38.54072265625], + [26.09404296875, 38.21806640625] + ] + ], + [ + [ + [20.68671875, 38.60869140625], + [20.5546875, 38.582568359375], + [20.694140625, 38.84423828125], + [20.68671875, 38.60869140625] + ] + ], + [ + [ + [24.6747070312501, 38.809228515625], + [24.541015625, 38.788671875], + [24.4856445312501, 38.9802734375], + [24.6747070312501, 38.809228515625] + ] + ], + [ + [ + [23.4154296875001, 38.958642578125], + [23.525, 38.8134765625], + [24.1275390625, 38.648486328125], + [24.2757812500001, 38.22001953125], + [24.58837890625, 38.123974609375], + [24.5365234375001, 37.9797363281251], + [24.21201171875, 38.1175292968751], + [24.04013671875, 38.389990234375], + [23.6507812500001, 38.44306640625], + [23.2521484375, 38.801220703125], + [22.8703125000001, 38.8705078125], + [23.258203125, 39.0313476562501], + [23.4154296875001, 38.958642578125] + ] + ], + [ + [ + [26.41015625, 39.329443359375], + [26.5956054687501, 39.048828125], + [26.488671875, 39.0748046875], + [26.46875, 38.972802734375], + [26.10791015625, 39.0810546875], + [26.27314453125, 39.19755859375], + [26.07236328125, 39.09560546875], + [25.8441406250001, 39.2000488281251], + [26.1654296875001, 39.3735351562501], + [26.41015625, 39.329443359375] + ] + ], + [ + [ + [20.0779296875, 39.43271484375], + [19.8839843750001, 39.4615234375], + [19.646484375, 39.76708984375], + [19.92607421875, 39.77373046875], + [19.8466796875, 39.668115234375], + [20.0779296875, 39.43271484375] + ] + ], + [ + [ + [25.4376953125, 39.98330078125], + [25.3570312500001, 39.80810546875], + [25.2494140625001, 39.8941406250001], + [25.06220703125, 39.852392578125], + [25.0580078125001, 39.999658203125], + [25.4376953125, 39.98330078125] + ] + ], + [ + [ + [24.7742187500001, 40.615185546875], + [24.51552734375, 40.647021484375], + [24.62333984375, 40.792919921875], + [24.7742187500001, 40.615185546875] + ] + ], + [ + [ + [26.0389648437501, 40.7267578125], + [25.1044921875, 40.9947265625], + [24.7929687500001, 40.85751953125], + [24.47705078125, 40.94775390625], + [24.0823242187501, 40.724072265625], + [23.7627929687501, 40.747802734375], + [23.866796875, 40.4185546875001], + [24.2127929687501, 40.327783203125], + [24.343359375, 40.147705078125], + [23.9131835937501, 40.3587890625001], + [23.7279296875001, 40.329736328125], + [23.96748046875, 40.11455078125], + [23.9470703125, 39.9655761718751], + [23.66455078125, 40.223828125], + [23.42626953125, 40.26396484375], + [23.62734375, 39.924072265625], + [22.8964843750001, 40.39990234375], + [22.9222656250001, 40.590869140625], + [22.6294921875, 40.495556640625], + [22.5921875000001, 40.0369140625], + [23.327734375, 39.17490234375], + [23.1546875000001, 39.1014648437501], + [23.16171875, 39.257763671875], + [22.92138671875, 39.30634765625], + [22.8860351562501, 39.169970703125], + [23.06669921875, 39.037939453125], + [22.5691406250001, 38.86748046875], + [23.2529296875, 38.6612304687501], + [23.6839843750001, 38.35244140625], + [23.9669921875, 38.275], + [24.02451171875, 38.139794921875], + [24.0197265625, 37.677734375], + [23.5017578125, 38.03486328125], + [23.036328125, 37.878369140625], + [23.4892578125, 37.440185546875], + [23.1615234375001, 37.333837890625], + [22.725390625, 37.542138671875], + [23.16015625, 36.448095703125], + [22.7171875, 36.7939453125001], + [22.427734375, 36.47578125], + [22.0804687500001, 37.028955078125], + [21.95556640625, 36.990087890625], + [21.8923828125, 36.7373046875], + [21.5829101562501, 37.08095703125], + [21.6789062500001, 37.38720703125], + [21.1247070312501, 37.8916015625], + [21.4037109375001, 38.1966796875], + [21.6583984375001, 38.17509765625], + [21.82470703125, 38.328125], + [22.8463867187501, 37.967578125], + [23.1834960937501, 38.13369140625], + [22.4216796875, 38.438525390625], + [22.319921875, 38.3568359375001], + [21.96533203125, 38.412451171875], + [21.4725585937501, 38.32138671875], + [21.3310546875, 38.4873046875], + [21.3033203125, 38.37392578125], + [21.11318359375, 38.38466796875], + [20.7685546875001, 38.8744140625], + [21.11162109375, 38.8962890625], + [21.118359375, 39.02998046875], + [20.71337890625, 39.03515625], + [20.3007812500001, 39.327099609375], + [20.19140625, 39.54580078125], + [20.0994140625001, 39.641259765625], + [20.0012695312501, 39.709423828125], + [20.0225585937501, 39.710693359375], + [20.059765625, 39.69912109375], + [20.1310546875, 39.66162109375], + [20.2068359375, 39.653515625], + [20.382421875, 39.80263671875], + [20.381640625, 39.8417968750001], + [20.3113281250001, 39.9507812500001], + [20.3111328125, 39.979443359375], + [20.3384765625, 39.991064453125], + [20.3836914062501, 40.0171875], + [20.4080078125001, 40.049462890625], + [20.4560546875, 40.065576171875], + [20.6574218750001, 40.1173828125], + [20.881640625, 40.467919921875], + [21.030859375, 40.6224609375], + [20.95576171875, 40.77529296875], + [20.9642578125001, 40.84990234375], + [21.57578125, 40.8689453125], + [21.6275390625, 40.896337890625], + [21.7794921875, 40.9504394531251], + [21.993359375, 41.1309570312501], + [22.1844726562501, 41.158642578125], + [22.4935546875001, 41.118505859375], + [22.60361328125, 41.140185546875], + [22.7248046875001, 41.178515625], + [22.78388671875, 41.331982421875], + [23.1559570312501, 41.3220703125], + [23.23984375, 41.3849609375], + [23.3720703125001, 41.3896484375], + [23.4333984375, 41.39873046875], + [23.53583984375, 41.38603515625], + [23.6351562500001, 41.386767578125], + [24.011328125, 41.46005859375], + [24.03291015625, 41.469091796875], + [24.0560546875001, 41.52724609375], + [24.38671875, 41.52353515625], + [24.487890625, 41.555224609375], + [24.5182617187501, 41.5525390625], + [24.77373046875, 41.356103515625], + [24.9935546875001, 41.364990234375], + [25.1333984375001, 41.3157714843751], + [25.2511718750001, 41.2435546875], + [25.9233398437501, 41.3119140625], + [26.0664062500001, 41.3506835937501], + [26.1353515625, 41.3857421875], + [26.15517578125, 41.43486328125], + [26.1435546875001, 41.521533203125], + [26.0855468750001, 41.704150390625], + [26.107421875, 41.72568359375], + [26.2005859375001, 41.743798828125], + [26.3208984375, 41.716552734375], + [26.5813476562501, 41.60126953125], + [26.6249023437501, 41.4017578125], + [26.3306640625, 41.23876953125], + [26.3310546875001, 40.9544921875], + [26.0389648437501, 40.7267578125] + ] + ] + ] + }, + "properties": { + "name": "Greece", + "childNum": 29 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.71552734375, 12.012646484375], + [-61.714990234375, 12.18515625], + [-61.60703125, 12.223291015625], + [-61.71552734375, 12.012646484375] + ] + ] + }, + "properties": { + "name": "Grenada", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-46.26669921875, 60.781396484375], + [-46.38154296875, 60.660302734375], + [-46.7880859375, 60.7583984375], + [-46.205224609375, 60.943505859375], + [-46.26669921875, 60.781396484375] + ] + ], + [ + [ + [-37.03125, 65.531982421875], + [-37.2384277343749, 65.60986328125], + [-37.047509765625, 65.722265625], + [-37.03125, 65.531982421875] + ] + ], + [ + [ + [-51.0136718749999, 69.552490234375], + [-51.20205078125, 69.525], + [-51.3388671874999, 69.7320312500001], + [-51.094580078125, 69.924169921875], + [-50.67900390625, 69.84853515625], + [-51.0136718749999, 69.552490234375] + ] + ], + [ + [ + [-52.73115234375, 69.9447265625001], + [-52.0453125, 69.8072265625], + [-51.9001953125, 69.6047851562501], + [-53.57841796875, 69.256640625], + [-54.18271484375, 69.403515625], + [-53.65830078125, 69.4651367187501], + [-53.825, 69.54033203125], + [-54.919140625, 69.713623046875], + [-54.787890625, 69.949853515625], + [-54.322607421875, 69.94189453125], + [-54.83076171875, 70.132958984375], + [-54.371630859375, 70.31728515625], + [-53.296728515625, 70.20537109375], + [-52.73115234375, 69.9447265625001] + ] + ], + [ + [ + [-51.675146484375, 70.855224609375], + [-52.119384765625, 70.870654296875], + [-52.10673828125, 70.968017578125], + [-51.675146484375, 70.855224609375] + ] + ], + [ + [ + [-25.43232421875, 70.921337890625], + [-25.40224609375, 70.652685546875], + [-26.21787109375, 70.454052734375], + [-26.6046874999999, 70.553369140625], + [-28.03525390625, 70.48681640625], + [-27.617236328125, 70.91376953125], + [-26.62177734375, 70.875634765625], + [-25.818896484375, 71.04365234375], + [-25.43232421875, 70.921337890625] + ] + ], + [ + [ + [-53.5352050781249, 71.0408203125001], + [-53.9578125, 71.127734375], + [-53.58447265625, 71.2970703125], + [-53.5352050781249, 71.0408203125001] + ] + ], + [ + [ + [-55.01689453125, 72.79111328125], + [-55.5666015625, 72.56435546875], + [-56.214794921875, 72.719189453125], + [-55.01689453125, 72.79111328125] + ] + ], + [ + [ + [-18.0005371093749, 75.40732421875], + [-17.3919921874999, 75.0369140625001], + [-18.67080078125, 75.00166015625], + [-18.8560546875, 75.319140625], + [-18.0005371093749, 75.40732421875] + ] + ], + [ + [ + [-18.5826171875, 76.042333984375], + [-19.0853515625, 76.43037109375], + [-18.8824707031249, 76.70380859375], + [-18.5826171875, 76.042333984375] + ] + ], + [ + [ + [-71.667333984375, 77.32529296875], + [-72.48955078125, 77.431640625], + [-71.433447265625, 77.394384765625], + [-71.667333984375, 77.32529296875] + ] + ], + [ + [ + [-17.6125, 79.82587890625], + [-18.66201171875, 79.7200195312501], + [-19.13828125, 79.85234375], + [-17.98291015625, 80.05517578125], + [-17.47138671875, 80.0287109375], + [-17.6125, 79.82587890625] + ] + ], + [ + [ + [-44.86455078125, 82.083642578125], + [-46.751904296875, 82.348193359375], + [-47.272265625, 82.65693359375], + [-46.399169921875, 82.692138671875], + [-44.91748046875, 82.4805175781251], + [-44.86455078125, 82.083642578125] + ] + ], + [ + [ + [-29.952880859375, 83.56484375], + [-25.795068359375, 83.260986328125], + [-31.99267578125, 83.0853515625], + [-32.03271484375, 82.983447265625], + [-25.123388671875, 83.159619140625], + [-24.4703125, 82.877392578125], + [-21.5825195312499, 82.6341796875], + [-23.11806640625, 82.32470703125], + [-29.57939453125, 82.161181640625], + [-29.88740234375, 82.054833984375], + [-29.54384765625, 81.93994140625], + [-27.839501953125, 82.0488769531251], + [-25.148828125, 82.001123046875], + [-24.29306640625, 81.7009765625001], + [-23.1037109375, 82.01181640625], + [-21.33798828125, 82.068701171875], + [-21.230517578125, 81.6013671875], + [-23.117724609375, 80.778173828125], + [-19.629931640625, 81.639892578125], + [-17.4560546874999, 81.397705078125], + [-16.120703125, 81.776611328125], + [-14.2419921875, 81.8138671875001], + [-12.434423828125, 81.68251953125], + [-11.4306640625, 81.4568359375001], + [-13.126220703125, 81.08779296875], + [-14.45234375, 80.993115234375], + [-14.503564453125, 80.7632812500001], + [-16.7605957031249, 80.573388671875], + [-15.937255859375, 80.42763671875], + [-16.48876953125, 80.251953125], + [-18.070947265625, 80.1720703125], + [-19.4291992187499, 80.25771484375], + [-20.150146484375, 80.01123046875], + [-18.9919921875, 79.178369140625], + [-21.1337402343749, 78.658642578125], + [-21.72958984375, 77.708544921875], + [-20.8625976562499, 77.911865234375], + [-19.4904296875, 77.718896484375], + [-19.467529296875, 77.5658203125001], + [-20.1620605468749, 77.68984375], + [-20.680810546875, 77.618994140625], + [-20.23193359375, 77.368408203125], + [-19.30029296875, 77.22236328125], + [-18.4426269531249, 77.259375], + [-18.510302734375, 76.778173828125], + [-20.48671875, 76.92080078125], + [-21.6146972656249, 76.687890625], + [-22.18525390625, 76.794091796875], + [-22.609326171875, 76.704296875], + [-21.87734375, 76.573486328125], + [-21.4882324218749, 76.271875], + [-20.1036132812499, 76.219091796875], + [-19.5089843749999, 75.75751953125], + [-19.5263671875, 75.1802246093751], + [-20.4849609375, 75.3142578125], + [-21.64931640625, 75.0234375], + [-22.2328613281249, 75.1197265625], + [-21.6951171875, 74.964453125], + [-20.985791015625, 75.074365234375], + [-20.861572265625, 74.6359375], + [-20.41708984375, 74.9751953125], + [-19.984912109375, 74.9751953125], + [-19.28701171875, 74.5463867187501], + [-19.369140625, 74.284033203125], + [-20.2564453125, 74.2828125], + [-20.653125, 74.137353515625], + [-21.954931640625, 74.244287109375], + [-21.9429199218749, 74.56572265625], + [-22.32158203125, 74.3025390625], + [-22.1348144531249, 73.990478515625], + [-20.3672851562499, 73.8482421875], + [-20.50966796875, 73.49287109375], + [-22.346875, 73.26923828125], + [-23.233203125, 73.397705078125], + [-24.1577148437499, 73.764453125], + [-24.67724609375, 73.602197265625], + [-25.5212890625, 73.851611328125], + [-24.791259765625, 73.511279296875], + [-26.0623046875, 73.25302734375], + [-27.27041015625, 73.436279296875], + [-26.541845703125, 73.248974609375], + [-27.56162109375, 73.1384765625], + [-27.348046875, 73.067822265625], + [-25.05703125, 73.396484375], + [-24.132666015625, 73.409375], + [-22.036328125, 72.9184570312501], + [-22.293212890625, 72.11953125], + [-24.06904296875, 72.49873046875], + [-24.62998046875, 73.037646484375], + [-26.6576171875, 72.7158203125], + [-24.8133300781249, 72.901513671875], + [-24.65, 72.58251953125], + [-25.11787109375, 72.3469726562501], + [-24.6668457031249, 72.437353515625], + [-21.95966796875, 71.744677734375], + [-22.4796386718749, 71.383447265625], + [-22.417578125, 71.2486816406251], + [-22.2990234375, 71.43232421875], + [-21.75224609375, 71.4783203125], + [-21.5226562499999, 70.526220703125], + [-22.3841308593749, 70.46240234375], + [-22.4370117187499, 70.860009765625], + [-22.6906738281249, 70.4373046875], + [-23.32783203125, 70.4509765625001], + [-23.97138671875, 70.649462890625], + [-24.5622070312499, 71.22353515625], + [-25.88515625, 71.571923828125], + [-27.08720703125, 71.6265625], + [-27.10703125, 71.532666015625], + [-25.842724609375, 71.48017578125], + [-25.742236328125, 71.18359375], + [-26.717919921875, 70.9504882812501], + [-28.3984375, 70.992919921875], + [-27.9921875, 70.89521484375], + [-28.069873046875, 70.6990234375001], + [-29.0720703125, 70.444970703125], + [-26.62177734375, 70.46337890625], + [-26.576806640625, 70.357080078125], + [-27.5608398437499, 70.124462890625], + [-27.3841796875, 69.9916015625], + [-27.027734375, 70.201220703125], + [-25.5298828125, 70.353173828125], + [-23.667333984375, 70.139306640625], + [-22.28447265625, 70.125830078125], + [-22.287060546875, 70.0333984375], + [-23.033642578125, 69.900830078125], + [-23.049560546875, 69.792724609375], + [-23.86572265625, 69.73671875], + [-23.739404296875, 69.588623046875], + [-24.2966796875, 69.5855468750001], + [-24.295556640625, 69.439306640625], + [-25.18857421875, 69.260546875], + [-25.0924316406249, 69.165185546875], + [-25.6979980468749, 68.889892578125], + [-26.48291015625, 68.675927734375], + [-29.24951171875, 68.298779296875], + [-29.868505859375, 68.3115722656251], + [-30.318115234375, 68.193310546875], + [-30.72001953125, 68.251171875], + [-30.6107421875, 68.117919921875], + [-30.978564453125, 68.0613281250001], + [-32.32744140625, 68.4373046875], + [-32.16455078125, 67.99111328125], + [-33.156982421875, 67.6267089843751], + [-34.1982421875, 66.655078125], + [-35.18857421875, 66.25029296875], + [-35.867236328125, 66.44140625], + [-35.6300781249999, 66.13994140625], + [-36.37919921875, 65.830810546875], + [-36.52724609375, 66.00771484375], + [-36.665185546875, 65.7900878906251], + [-37.06279296875, 65.871435546875], + [-37.41005859375, 65.65634765625], + [-37.95478515625, 65.6335937500001], + [-37.2787109375, 66.30439453125], + [-38.156640625, 66.385595703125], + [-37.75234375, 66.2615234375], + [-38.13994140625, 65.903515625], + [-38.520361328125, 66.00966796875], + [-38.203369140625, 65.71171875], + [-40.17353515625, 65.55615234375], + [-39.5779296875, 65.340771484375], + [-39.937255859375, 65.1416015625], + [-40.253125, 65.0488769531251], + [-41.084423828125, 65.100830078125], + [-40.966015625, 64.86884765625], + [-40.6554687499999, 64.91533203125], + [-40.1822265625, 64.479931640625], + [-40.78173828125, 64.22177734375], + [-41.5810058593749, 64.29833984375], + [-41.03056640625, 64.121044921875], + [-40.6177734375, 64.13173828125], + [-40.550390625, 63.7252441406251], + [-40.7751953125, 63.533642578125], + [-41.04873046875, 63.5138183593751], + [-41.3878906249999, 63.061865234375], + [-41.844482421875, 63.070263671875], + [-42.17451171875, 63.2087890625], + [-41.63447265625, 62.9724609375001], + [-41.908984375, 62.737109375], + [-42.941650390625, 62.72021484375], + [-42.152978515625, 62.56845703125], + [-42.321484375, 62.1527343750001], + [-42.110205078125, 61.8572265625001], + [-42.585302734375, 61.71748046875], + [-42.34736328125, 61.617431640625], + [-42.717041015625, 60.76748046875], + [-43.044091796875, 60.523681640625], + [-43.922705078125, 60.595361328125], + [-43.21298828125, 60.3906738281251], + [-43.122900390625, 60.06123046875], + [-43.3201171874999, 59.928125], + [-43.955029296875, 60.02548828125], + [-43.65791015625, 59.858642578125], + [-43.90654296875, 59.815478515625], + [-44.1169921875, 59.83193359375], + [-44.065478515625, 59.9248046875], + [-44.412939453125, 59.922607421875], + [-44.2243652343749, 60.27353515625], + [-44.61328125, 60.016650390625], + [-45.379248046875, 60.2029296875], + [-45.3677734375, 60.37294921875], + [-44.97470703125, 60.4572265625], + [-44.75673828125, 60.664599609375], + [-45.3805175781249, 60.444921875], + [-46.046630859375, 60.61572265625], + [-46.141943359375, 60.776513671875], + [-45.87021484375, 61.218310546875], + [-46.874462890625, 60.81640625], + [-48.180810546875, 60.76923828125], + [-47.7703125, 60.99775390625], + [-48.3864257812499, 61.004736328125], + [-48.428173828125, 61.18740234375], + [-48.9220703125, 61.27744140625], + [-49.2890625, 61.5899414062501], + [-49.3802734375, 61.890185546875], + [-48.8287109375, 62.0796875], + [-49.6237792968749, 61.998583984375], + [-49.553466796875, 62.23271484375], + [-50.31923828125, 62.473193359375], + [-50.29873046875, 62.72197265625], + [-49.793115234375, 63.04462890625], + [-50.390087890625, 62.822021484375], + [-51.46884765625, 63.64228515625], + [-51.547509765625, 64.006103515625], + [-50.260693359375, 64.2142578125], + [-50.48662109375, 64.20888671875], + [-50.437060546875, 64.312841796875], + [-51.584912109375, 64.103173828125], + [-51.707861328125, 64.205078125], + [-51.4037597656249, 64.46318359375], + [-50.49208984375, 64.6931640625001], + [-50.008984375, 64.447265625], + [-50.1216308593749, 64.703759765625], + [-50.5169921875, 64.76650390625], + [-50.96064453125, 65.201123046875], + [-50.72158203125, 64.797607421875], + [-51.22060546875, 64.628466796875], + [-51.25537109375, 64.7581054687501], + [-51.922607421875, 64.21875], + [-52.259033203125, 65.154931640625], + [-52.5376953125, 65.32880859375], + [-51.619140625, 65.71318359375], + [-51.09189453125, 65.77578125], + [-51.7234375, 65.723486328125], + [-52.55126953125, 65.461376953125], + [-52.7609374999999, 65.5908203125], + [-53.198974609375, 65.59404296875], + [-53.10634765625, 65.9771484375], + [-53.392041015625, 66.04833984375], + [-51.225, 66.88154296875], + [-53.035791015625, 66.201416015625], + [-53.53876953125, 66.13935546875], + [-53.41875, 66.64853515625], + [-53.03828125, 66.826806640625], + [-52.386865234375, 66.8811523437501], + [-53.443603515625, 66.924658203125], + [-53.884423828125, 67.135546875], + [-53.7985839843749, 67.4181640625], + [-52.666455078125, 67.74970703125], + [-50.6134765625, 67.5279296875], + [-51.171044921875, 67.693603515625], + [-50.96884765625, 67.806640625], + [-51.765234375, 67.7378417968751], + [-52.34482421875, 67.8369140625], + [-53.735205078125, 67.5490234375], + [-53.1515624999999, 68.207763671875], + [-51.7799804687499, 68.05673828125], + [-51.4564941406249, 68.116064453125], + [-51.21015625, 68.419921875], + [-52.1985351562499, 68.22080078125], + [-53.383154296875, 68.29736328125], + [-53.039453125, 68.610888671875], + [-52.60458984375, 68.708740234375], + [-51.62314453125, 68.5348144531251], + [-50.945703125, 68.6826660156251], + [-50.80771484375, 68.8169921875], + [-51.2494140625, 68.73994140625], + [-51.08486328125, 69.128271484375], + [-50.2973632812499, 69.17060546875], + [-51.076953125, 69.20947265625], + [-50.29169921875, 70.0144531250001], + [-52.254638671875, 70.058935546875], + [-53.023046875, 70.301904296875], + [-54.014453125, 70.4216796875001], + [-54.53076171875, 70.699267578125], + [-54.1658203125, 70.8201171875001], + [-52.801953125, 70.7505859375], + [-50.8723632812499, 70.364892578125], + [-50.66328125, 70.417578125], + [-51.3228515625, 70.58876953125], + [-51.256591796875, 70.852685546875], + [-51.77431640625, 71.01044921875], + [-51.0189453125, 71.001318359375], + [-51.37666015625, 71.11904296875], + [-53.007568359375, 71.17998046875], + [-52.891845703125, 71.457666015625], + [-51.769921875, 71.671728515625], + [-53.440087890625, 71.57900390625], + [-53.14453125, 71.807421875], + [-53.6521484375, 72.3626464843751], + [-53.927734375, 72.318798828125], + [-53.477587890625, 71.8499511718751], + [-54.019921875, 71.657861328125], + [-53.96298828125, 71.458984375], + [-54.6890625, 71.3672363281251], + [-55.59404296875, 71.5535156250001], + [-55.315576171875, 72.110693359375], + [-54.84013671875, 72.356103515625], + [-55.5814453125, 72.178857421875], + [-55.63583984375, 72.300439453125], + [-55.295703125, 72.35439453125], + [-55.6017089843749, 72.453466796875], + [-54.924951171875, 72.57197265625], + [-54.737939453125, 72.872509765625], + [-55.073095703125, 73.01513671875], + [-55.288916015625, 72.933203125], + [-55.6685546875, 73.00791015625], + [-55.28828125, 73.327099609375], + [-56.104052734375, 73.558154296875], + [-55.83828125, 73.759716796875], + [-56.225390625, 74.1291015625], + [-57.23056640625, 74.1252929687501], + [-56.70634765625, 74.219189453125], + [-56.71767578125, 74.429248046875], + [-56.25546875, 74.526806640625], + [-58.56552734375, 75.352734375], + [-58.249658203125, 75.506689453125], + [-58.5162109375, 75.6890625000001], + [-61.1882324218749, 76.157861328125], + [-63.29130859375, 76.35205078125], + [-63.84306640625, 76.217138671875], + [-64.307275390625, 76.31650390625], + [-65.3699218749999, 76.13056640625], + [-65.8757324218749, 76.2383300781251], + [-66.465771484375, 76.13916015625], + [-66.992578125, 76.212939453125], + [-66.6748046875, 75.977392578125], + [-68.14873046875, 76.067041015625], + [-69.48408203125, 76.399169921875], + [-68.1142578125, 76.650634765625], + [-69.6738281249999, 76.7358886718751], + [-69.69423828125, 76.989453125], + [-70.613134765625, 76.821826171875], + [-71.141455078125, 77.028662109375], + [-70.862841796875, 77.175439453125], + [-68.9783203125, 77.1953125000001], + [-68.135546875, 77.37958984375], + [-66.389453125, 77.2802734375], + [-66.6912109375, 77.681201171875], + [-67.6880859375, 77.523779296875], + [-68.621533203125, 77.60185546875], + [-69.3513671875, 77.467138671875], + [-70.535400390625, 77.699560546875], + [-70.114453125, 77.8413574218751], + [-71.2716308593749, 77.813134765625], + [-72.81806640625, 78.1943359375], + [-72.472509765625, 78.48203125], + [-71.6513183593749, 78.62314453125], + [-68.99345703125, 78.857421875], + [-68.37705078125, 79.037841796875], + [-65.825537109375, 79.17373046875], + [-64.7922851562499, 80.000634765625], + [-64.179150390625, 80.099267578125], + [-66.84365234375, 80.0762207031251], + [-67.050634765625, 80.384521484375], + [-64.51552734375, 81], + [-63.7219726562499, 81.05732421875], + [-63.028662109375, 80.88955078125], + [-62.903369140625, 81.218359375], + [-61.435986328125, 81.13359375], + [-60.84287109375, 81.85537109375], + [-59.28193359375, 81.884033203125], + [-56.61513671875, 81.362890625], + [-59.26181640625, 82.0066406250001], + [-54.548876953125, 82.3506347656251], + [-53.671337890625, 82.1640625], + [-53.5556640625, 81.653271484375], + [-53.02255859375, 82.321728515625], + [-50.89443359375, 81.89521484375], + [-49.541064453125, 81.91806640625], + [-50.935546875, 82.3828125], + [-50.0371093749999, 82.472412109375], + [-44.7294921875, 81.7798339843751], + [-44.2388671875, 82.3681640625], + [-45.55654296875, 82.747021484375], + [-41.87646484375, 82.680322265625], + [-41.36962890625, 82.75], + [-46.13681640625, 82.858837890625], + [-46.16904296875, 83.0638671875], + [-45.414599609375, 83.01767578125], + [-43.00927734375, 83.264599609375], + [-41.300146484375, 83.10078125], + [-40.3568359375, 83.332177734375], + [-38.15625, 82.9986328125], + [-38.749560546875, 83.370849609375], + [-37.72333984375, 83.49775390625], + [-29.952880859375, 83.56484375] + ] + ] + ] + }, + "properties": { + "name": "Greenland", + "childNum": 14 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-89.2328125, 15.888671875], + [-88.89404296875, 15.890625], + [-88.603369140625, 15.76416015625], + [-88.5939453125, 15.95029296875], + [-88.2283203125, 15.72900390625], + [-88.271435546875, 15.694873046875], + [-88.36455078125, 15.616015625], + [-88.68447265625, 15.360498046875], + [-88.960986328125, 15.15244140625], + [-89.142578125, 15.072314453125], + [-89.22236328125, 14.866064453125], + [-89.16220703125, 14.66923828125], + [-89.17177734375, 14.606884765625], + [-89.28671875, 14.52998046875], + [-89.36259765625, 14.416015625], + [-89.5736328125, 14.390087890625], + [-89.54716796875, 14.241259765625], + [-90.04814453125, 13.904052734375], + [-90.09521484375, 13.7365234375], + [-90.60693359375, 13.92900390625], + [-91.37734375, 13.990185546875], + [-92.23515625, 14.54541015625], + [-92.158544921875, 14.96357421875], + [-92.14423828125, 15.001953125], + [-92.09873046875, 15.0267578125], + [-92.0748046875, 15.07421875], + [-92.187158203125, 15.3208984375], + [-92.08212890625, 15.495556640625], + [-91.9572265625, 15.70322265625], + [-91.736572265625, 16.070166015625], + [-91.433984375, 16.070458984375], + [-90.97958984375, 16.07080078125], + [-90.70322265625, 16.071044921875], + [-90.52197265625, 16.07119140625], + [-90.44716796875, 16.072705078125], + [-90.45986328125, 16.162353515625], + [-90.450146484375, 16.261376953125], + [-90.4169921875, 16.351318359375], + [-90.4169921875, 16.391015625], + [-90.47109375, 16.43955078125], + [-90.57578125, 16.467822265625], + [-90.63408203125, 16.5107421875], + [-90.634375, 16.56513671875], + [-90.6599609375, 16.630908203125], + [-90.710693359375, 16.70810546875], + [-90.975830078125, 16.867822265625], + [-91.409619140625, 17.255859375], + [-91.1955078125, 17.2541015625], + [-90.99296875, 17.25244140625], + [-90.98916015625, 17.81640625], + [-89.161474609375, 17.81484375], + [-89.2328125, 15.888671875] + ] + ] + }, + "properties": { + "name": "Guatemala", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [144.741796875, 13.25927734375], + [144.64931640625, 13.4287109375], + [144.875390625, 13.6146484375], + [144.9408203125, 13.5703125], + [144.741796875, 13.25927734375] + ] + ] + }, + "properties": { + "name": "Guam", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-57.194775390625, 5.5484375], + [-57.3185546875, 5.33535156249999], + [-57.209814453125, 5.19541015624999], + [-57.331005859375, 5.02016601562499], + [-57.711083984375, 4.99106445312499], + [-57.917041015625, 4.82041015624999], + [-57.84599609375, 4.6681640625], + [-58.054296875, 4.10166015624999], + [-57.646728515625, 3.39453125], + [-57.303662109375, 3.37709960937499], + [-57.19736328125, 2.853271484375], + [-56.704345703125, 2.03647460937499], + [-56.4828125, 1.942138671875], + [-56.96953125, 1.91640625], + [-57.03759765625, 1.936474609375], + [-57.09267578125, 2.005810546875], + [-57.118896484375, 2.01396484374999], + [-57.31748046875, 1.96347656249999], + [-57.4126953125, 1.908935546875], + [-57.500439453125, 1.77382812499999], + [-57.545751953125, 1.72607421875], + [-57.59443359375, 1.7041015625], + [-57.795654296875, 1.7], + [-57.8734375, 1.66728515624999], + [-57.9828125, 1.6484375], + [-58.03466796875, 1.520263671875], + [-58.340673828125, 1.58754882812499], + [-58.38037109375, 1.530224609375], + [-58.39580078125, 1.48173828124999], + [-58.5060546875, 1.438671875], + [-58.511865234375, 1.28466796875], + [-58.684619140625, 1.28105468749999], + [-58.730322265625, 1.247509765625], + [-58.78720703125, 1.20849609375], + [-58.82177734375, 1.20122070312499], + [-59.231201171875, 1.37602539062499], + [-59.535693359375, 1.7], + [-59.6666015625, 1.7462890625], + [-59.668505859375, 1.84233398437499], + [-59.74072265625, 1.87416992187499], + [-59.756201171875, 1.900634765625], + [-59.755224609375, 2.27412109375], + [-59.8896484375, 2.36293945312499], + [-59.9943359375, 2.68999023437499], + [-59.85439453125, 3.5875], + [-59.551123046875, 3.933544921875], + [-59.557763671875, 3.96000976562499], + [-59.62021484375, 4.02314453125], + [-59.73857421875, 4.2267578125], + [-59.69970703125, 4.353515625], + [-60.1486328125, 4.53325195312499], + [-59.990673828125, 5.08286132812499], + [-60.142041015625, 5.23881835937499], + [-60.241650390625, 5.25795898437499], + [-60.335205078125, 5.19931640624999], + [-60.459521484375, 5.18808593749999], + [-60.6513671875, 5.221142578125], + [-60.742138671875, 5.20205078124999], + [-61.376806640625, 5.906982421875], + [-61.3908203125, 5.93876953124999], + [-61.303125, 6.04951171875], + [-61.224951171875, 6.12919921874999], + [-61.15947265625, 6.17441406249999], + [-61.1287109375, 6.214306640625], + [-61.152294921875, 6.38510742187499], + [-61.151025390625, 6.446533203125], + [-61.181591796875, 6.51337890625], + [-61.20361328125, 6.58837890625], + [-61.14560546875, 6.69453125], + [-60.717919921875, 6.768310546875], + [-60.352099609375, 7.002880859375], + [-60.3220703125, 7.092041015625], + [-60.32548828125, 7.133984375], + [-60.345068359375, 7.15], + [-60.46494140625, 7.16655273437499], + [-60.523193359375, 7.14370117187499], + [-60.583203125, 7.156201171875], + [-60.63330078125, 7.21108398437499], + [-60.71865234375, 7.53593749999999], + [-60.513623046875, 7.81318359375], + [-60.032421875, 8.05356445312499], + [-59.99072265625, 8.16201171874999], + [-59.96484375, 8.1916015625], + [-59.849072265625, 8.24868164062499], + [-59.831640625, 8.30595703124999], + [-60.017529296875, 8.54931640625], + [-59.200244140625, 8.07460937499999], + [-58.511083984375, 7.39804687499999], + [-58.48056640625, 7.03813476562499], + [-58.67294921875, 6.39077148437499], + [-58.414990234375, 6.85117187499999], + [-57.982568359375, 6.785888671875], + [-57.54013671875, 6.33154296875], + [-57.2275390625, 6.17841796875], + [-57.194775390625, 5.5484375] + ] + ] + }, + "properties": { + "name": "Guyana", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [73.707421875, -53.137109375], + [73.46513671875, -53.1841796875], + [73.251171875, -52.97578125], + [73.83779296875, -53.11279296875], + [73.707421875, -53.137109375] + ] + ] + }, + "properties": { + "name": "Heard I. and McDonald Is.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-83.635498046875, 14.876416015625], + [-84.537646484375, 14.6333984375], + [-84.645947265625, 14.661083984375], + [-84.86044921875, 14.809765625], + [-84.98515625, 14.75244140625], + [-85.059375, 14.582958984375], + [-85.208349609375, 14.31181640625], + [-85.733935546875, 13.8586914062501], + [-85.75341796875, 13.85205078125], + [-85.78671875, 13.84443359375], + [-85.9837890625, 13.965673828125], + [-86.040380859375, 14.050146484375], + [-86.33173828125, 13.770068359375], + [-86.376953125, 13.7556640625], + [-86.61025390625, 13.774853515625], + [-86.7336425781249, 13.7634765625], + [-86.758984375, 13.746142578125], + [-86.77060546875, 13.69873046875], + [-86.763525390625, 13.63525390625], + [-86.72958984375, 13.4072265625], + [-86.710693359375, 13.31337890625], + [-86.729296875, 13.284375], + [-86.792138671875, 13.27978515625], + [-86.8735351562499, 13.26650390625], + [-86.918212890625, 13.223583984375], + [-87.009326171875, 13.0078125], + [-87.0591796875, 12.991455078125], + [-87.337255859375, 12.979248046875], + [-87.489111328125, 13.3529296875001], + [-87.814208984375, 13.3991699218751], + [-87.781884765625, 13.52138671875], + [-87.71533203125, 13.8126953125], + [-87.7314453125, 13.841064453125], + [-87.80224609375, 13.889990234375], + [-87.8919921875, 13.894970703125], + [-87.991015625, 13.879638671875], + [-88.151025390625, 13.987353515625], + [-88.4491210937499, 13.8509765625], + [-88.482666015625, 13.854248046875], + [-88.49765625, 13.904541015625], + [-88.504345703125, 13.964208984375], + [-88.512548828125, 13.978955078125], + [-89.1205078124999, 14.37021484375], + [-89.36259765625, 14.416015625], + [-89.17177734375, 14.606884765625], + [-89.16220703125, 14.66923828125], + [-89.22236328125, 14.866064453125], + [-89.142578125, 15.072314453125], + [-88.960986328125, 15.15244140625], + [-88.68447265625, 15.360498046875], + [-88.36455078125, 15.616015625], + [-88.271435546875, 15.694873046875], + [-88.2283203125, 15.72900390625], + [-88.131103515625, 15.701025390625], + [-87.874951171875, 15.879345703125], + [-86.356640625, 15.783203125], + [-85.936279296875, 15.95341796875], + [-85.98564453125, 16.024169921875], + [-85.48369140625, 15.89951171875], + [-84.97373046875, 15.989892578125], + [-84.55966796875, 15.802001953125], + [-84.26142578125, 15.822607421875], + [-83.765283203125, 15.4054687500001], + [-83.972802734375, 15.51962890625], + [-84.111328125, 15.492431640625], + [-84.095068359375, 15.400927734375], + [-83.92744140625, 15.39404296875], + [-83.76044921875, 15.220361328125], + [-83.49794921875, 15.222119140625], + [-83.64638671875, 15.368408203125], + [-83.3691894531249, 15.239990234375], + [-83.290869140625, 15.07890625], + [-83.2255859375, 15.04228515625], + [-83.15751953125, 14.99306640625], + [-83.4150390624999, 15.008056640625], + [-83.5365234375, 14.977001953125], + [-83.635498046875, 14.876416015625] + ] + ] + }, + "properties": { + "name": "Honduras", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [17.6078125000001, 42.76904296875], + [17.7442382812501, 42.7003417968751], + [17.3441406250001, 42.790380859375], + [17.6078125000001, 42.76904296875] + ] + ], + [ + [ + [16.65068359375, 42.99658203125], + [17.18828125, 42.917041015625], + [16.85068359375, 42.8955078125], + [16.65068359375, 42.99658203125] + ] + ], + [ + [ + [17.6675781250001, 42.897119140625], + [18.436328125, 42.559716796875], + [18.51748046875, 42.43291015625], + [17.823828125, 42.797412109375], + [17.0454101562501, 43.014892578125], + [17.6675781250001, 42.897119140625] + ] + ], + [ + [ + [16.78525390625, 43.270654296875], + [16.49033203125, 43.286181640625], + [16.44892578125, 43.3870605468751], + [16.89130859375, 43.3146484375], + [16.78525390625, 43.270654296875] + ] + ], + [ + [ + [15.3713867187501, 43.973828125], + [15.4372070312501, 43.89951171875], + [15.27001953125, 44.0107421875], + [15.3713867187501, 43.973828125] + ] + ], + [ + [ + [14.4880859375001, 44.6600585937501], + [14.3124023437501, 44.900390625], + [14.33125, 45.164990234375], + [14.4880859375001, 44.6600585937501] + ] + ], + [ + [ + [14.8102539062501, 44.97705078125], + [14.450390625, 45.07919921875], + [14.57109375, 45.224755859375], + [14.8102539062501, 44.97705078125] + ] + ], + [ + [ + [18.90537109375, 45.93173828125], + [18.8390625, 45.8357421875], + [19.0642578125, 45.5149902343751], + [19.0046875000001, 45.3995117187501], + [19.4, 45.2125], + [19.062890625, 45.13720703125], + [19.00712890625, 44.869189453125], + [18.83642578125, 44.883251953125], + [18.66259765625, 45.07744140625], + [17.8127929687501, 45.078125], + [16.91865234375, 45.2765625], + [16.5306640625001, 45.21669921875], + [16.2933593750001, 45.008837890625], + [16.0283203125001, 45.189599609375], + [15.7880859375001, 45.178955078125], + [15.73662109375, 44.7658203125], + [16.1034179687501, 44.5209960937501], + [16.30009765625, 44.12451171875], + [17.2738281250001, 43.445751953125], + [17.6504882812501, 43.006591796875], + [17.5851562500001, 42.9383789062501], + [16.903125, 43.392431640625], + [16.3939453125, 43.543359375], + [15.9855468750001, 43.519775390625], + [15.18583984375, 44.172119140625], + [15.12294921875, 44.256787109375], + [15.47099609375, 44.27197265625], + [14.98134765625, 44.6029296875001], + [14.85458984375, 45.081005859375], + [14.55048828125, 45.297705078125], + [14.3126953125, 45.33779296875], + [13.8607421875001, 44.83740234375], + [13.5171875000001, 45.481787109375], + [13.8787109375, 45.428369140625], + [14.3699218750001, 45.4814453125001], + [14.42734375, 45.50576171875], + [14.56884765625, 45.6572265625], + [14.5917968750001, 45.65126953125], + [14.64951171875, 45.571484375], + [14.79306640625, 45.47822265625], + [14.95458984375, 45.49990234375], + [15.11044921875, 45.45078125], + [15.24208984375, 45.44140625], + [15.3394531250001, 45.4670410156251], + [15.32666015625, 45.502294921875], + [15.2912109375, 45.541552734375], + [15.2835937500001, 45.5796875], + [15.3537109375, 45.659912109375], + [15.27705078125, 45.7326171875], + [15.6521484375001, 45.862158203125], + [15.6755859375, 45.98369140625], + [15.6662109375, 46.048486328125], + [15.596875, 46.1092285156251], + [15.592578125, 46.139990234375], + [15.608984375, 46.171923828125], + [16.1064453125, 46.3822265625], + [16.3211914062501, 46.534619140625], + [16.4276367187501, 46.5244140625], + [16.5162109375, 46.49990234375], + [16.569921875, 46.4850097656251], + [16.7480468750001, 46.41640625], + [16.8714843750001, 46.339306640625], + [17.31064453125, 45.996142578125], + [17.80712890625, 45.7904296875], + [18.35830078125, 45.7530273437501], + [18.53359375, 45.796142578125], + [18.5646484375, 45.81328125], + [18.666015625, 45.907470703125], + [18.90537109375, 45.93173828125] + ] + ] + ] + }, + "properties": { + "name": "Croatia", + "childNum": 8 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-72.80458984375, 18.7776855468751], + [-72.822216796875, 18.70712890625], + [-73.077978515625, 18.79091796875], + [-73.276416015625, 18.954052734375], + [-72.80458984375, 18.7776855468751] + ] + ], + [ + [ + [-71.647216796875, 19.195947265625], + [-71.80712890625, 18.98701171875], + [-71.733642578125, 18.856396484375], + [-71.72705078125, 18.80322265625], + [-71.743212890625, 18.73291015625], + [-71.86650390625, 18.6141601562501], + [-71.986865234375, 18.6103515625], + [-72.000390625, 18.597900390625], + [-71.9403808593749, 18.5125976562501], + [-71.87255859375, 18.4162109375], + [-71.7619140625, 18.34130859375], + [-71.737255859375, 18.27080078125], + [-71.768310546875, 18.0391601562501], + [-71.8529296875, 18.119140625], + [-71.94609375, 18.186083984375], + [-72.0598632812499, 18.228564453125], + [-72.87666015625, 18.1517578125], + [-73.38515625, 18.251171875], + [-73.747314453125, 18.190234375], + [-73.8849609375, 18.04189453125], + [-74.478125, 18.45], + [-74.3875, 18.62470703125], + [-74.227734375, 18.6626953125], + [-72.78935546875, 18.434814453125], + [-72.37607421875, 18.574462890625], + [-72.3476562499999, 18.674951171875], + [-72.811083984375, 19.0715820312501], + [-72.70322265625, 19.441064453125], + [-73.4383789062499, 19.722119140625], + [-73.2177734375, 19.8836914062501], + [-72.63701171875, 19.90087890625], + [-72.21982421875, 19.7446289062501], + [-71.834716796875, 19.696728515625], + [-71.779248046875, 19.7181640625], + [-71.757421875, 19.68818359375], + [-71.7114746093749, 19.4865722656251], + [-71.746484375, 19.28583984375], + [-71.647216796875, 19.195947265625] + ] + ] + ] + }, + "properties": { + "name": "Haiti", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.1318359375, 48.405322265625], + [22.2537109375, 48.407373046875], + [22.582421875, 48.134033203125], + [22.769140625, 48.109619140625], + [22.87666015625, 47.947265625], + [21.99970703125, 47.505029296875], + [21.1216796875, 46.282421875], + [20.76025390625, 46.246240234375], + [20.613671875, 46.13349609375], + [20.50810546875, 46.166943359375], + [20.28095703125, 46.1330078125], + [20.241796875, 46.10859375], + [20.21015625, 46.126025390625], + [20.16142578125, 46.14189453125], + [19.93408203125, 46.161474609375], + [19.84443359375, 46.1458984375], + [19.6134765625, 46.169189453125], + [19.4212890625, 46.064453125], + [18.666015625, 45.907470703125], + [18.5646484375, 45.81328125], + [18.53359375, 45.796142578125], + [18.35830078125, 45.75302734375], + [17.80712890625, 45.7904296875], + [17.31064453125, 45.996142578125], + [16.871484375, 46.339306640625], + [16.748046875, 46.41640625], + [16.569921875, 46.485009765625], + [16.5162109375, 46.49990234375], + [16.28359375, 46.857275390625], + [16.09306640625, 46.86328125], + [16.45341796875, 47.006787109375], + [16.44287109375, 47.39951171875], + [16.6765625, 47.53603515625], + [16.4212890625, 47.674462890625], + [17.0666015625, 47.707568359375], + [17.14736328125, 48.00595703125], + [17.7619140625, 47.770166015625], + [18.72421875, 47.787158203125], + [18.79189453125, 48.00029296875], + [19.625390625, 48.223095703125], + [19.950390625, 48.146630859375], + [20.3337890625, 48.295556640625], + [20.4900390625, 48.526904296875], + [21.4513671875, 48.55224609375], + [21.7669921875, 48.3380859375], + [22.1318359375, 48.405322265625] + ] + ] + }, + "properties": { + "name": "Hungary", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [122.94892578125, -10.90927734375], + [122.826171875, -10.89912109375], + [122.845703125, -10.76181640625], + [123.37109375, -10.47490234375], + [123.4181640625, -10.65126953125], + [122.94892578125, -10.90927734375] + ] + ], + [ + [ + [121.8830078125, -10.59033203125], + [121.7046875, -10.5556640625], + [121.99833984375, -10.44697265625], + [121.8830078125, -10.59033203125] + ] + ], + [ + [ + [123.4162109375, -10.30263671875], + [123.3255859375, -10.2641601562499], + [123.4587890625, -10.13994140625], + [123.4162109375, -10.30263671875] + ] + ], + [ + [ + [120.0125, -9.37470703125003], + [120.78447265625, -9.95703125], + [120.8326171875, -10.0375], + [120.698046875, -10.2066406249999], + [120.43916015625, -10.29404296875], + [120.14482421875, -10.20009765625], + [119.60107421875, -9.77353515625001], + [119.08544921875, -9.70693359375002], + [118.9587890625, -9.5193359375], + [119.2958984375, -9.3671875], + [119.94208984375, -9.30146484375003], + [120.0125, -9.37470703125003] + ] + ], + [ + [ + [125.0681640625, -9.5119140625], + [124.4275390625, -10.1486328125], + [123.747265625, -10.34716796875], + [123.60478515625, -10.2701171875], + [123.71640625, -10.07861328125], + [123.5892578125, -9.96679687500003], + [123.709375, -9.61484375], + [124.036328125, -9.34160156250003], + [124.28232421875, -9.42792968750003], + [124.44443359375, -9.19033203125002], + [124.922265625, -8.94248046874998], + [124.93681640625, -9.05341796875003], + [125.1490234375, -9.04257812500003], + [125.10048828125, -9.18984375000002], + [124.96015625, -9.21376953125001], + [125.0681640625, -9.5119140625] + ] + ], + [ + [ + [115.6099609375, -8.76982421874997], + [115.48046875, -8.71542968750001], + [115.56142578125, -8.66992187499997], + [115.6099609375, -8.76982421874997] + ] + ], + [ + [ + [122.97734375, -8.54521484374996], + [122.88779296875, -8.58730468750001], + [123.010546875, -8.44833984375003], + [123.153125, -8.47578125000003], + [122.97734375, -8.54521484374996] + ] + ], + [ + [ + [119.4640625, -8.74101562499997], + [119.385546875, -8.73603515625003], + [119.446484375, -8.42919921874996], + [119.5572265625, -8.51884765625], + [119.4640625, -8.74101562499997] + ] + ], + [ + [ + [123.31748046875, -8.35478515624997], + [123.025, -8.39550781250001], + [123.21708984375, -8.23544921875001], + [123.33603515625, -8.26904296875001], + [123.31748046875, -8.35478515624997] + ] + ], + [ + [ + [116.6408203125, -8.61386718750001], + [116.5142578125, -8.82099609375001], + [116.5865234375, -8.88613281249997], + [116.23935546875, -8.91210937500001], + [115.85732421875, -8.78789062500002], + [116.07646484375, -8.74492187499997], + [116.0611328125, -8.43740234375002], + [116.4015625, -8.20419921875003], + [116.7189453125, -8.33603515624998], + [116.6408203125, -8.61386718750001] + ] + ], + [ + [ + [124.28662109375, -8.32949218749998], + [124.1466796875, -8.5314453125], + [123.927734375, -8.44892578124997], + [124.23955078125, -8.20341796874996], + [124.28662109375, -8.32949218749998] + ] + ], + [ + [ + [123.9248046875, -8.2724609375], + [123.55302734375, -8.566796875], + [123.230078125, -8.53066406250002], + [123.47587890625, -8.32226562500001], + [123.3912109375, -8.28046875000003], + [123.7759765625, -8.19042968749999], + [123.9248046875, -8.2724609375] + ] + ], + [ + [ + [138.8951171875, -8.38867187499996], + [138.56337890625, -8.30908203125], + [138.79619140625, -8.17363281250002], + [138.8951171875, -8.38867187499996] + ] + ], + [ + [ + [117.55634765625, -8.36728515624995], + [117.49052734375, -8.18339843749997], + [117.6650390625, -8.1482421875], + [117.55634765625, -8.36728515624995] + ] + ], + [ + [ + [124.5755859375, -8.1408203125], + [125.05029296875, -8.17958984374999], + [125.13173828125, -8.32646484374999], + [124.3806640625, -8.41513671875002], + [124.4306640625, -8.18320312500002], + [124.5755859375, -8.1408203125] + ] + ], + [ + [ + [127.8234375, -8.09882812499997], + [128.11923828125, -8.17070312499996], + [128.02353515625, -8.25537109374997], + [127.8208984375, -8.19023437500003], + [127.8234375, -8.09882812499997] + ] + ], + [ + [ + [122.78291015625, -8.61171875], + [121.6513671875, -8.89873046874995], + [121.4146484375, -8.81484375], + [121.3283203125, -8.91689453125001], + [121.03525390625, -8.93544921874997], + [120.55048828125, -8.80185546875002], + [119.909375, -8.85761718750001], + [119.80791015625, -8.69765625000002], + [119.8748046875, -8.41982421874999], + [120.61025390625, -8.24042968750004], + [121.44453125, -8.57783203125004], + [121.96650390625, -8.45517578125001], + [122.3232421875, -8.62832031250002], + [122.85048828125, -8.30439453125001], + [122.919140625, -8.221875], + [122.75859375, -8.18593749999995], + [122.9169921875, -8.10556640625001], + [123.00595703125, -8.32910156249999], + [122.78291015625, -8.61171875] + ] + ], + [ + [ + [130.86220703125, -8.31875], + [130.7751953125, -8.34990234374996], + [131.0201171875, -8.09130859374994], + [131.1763671875, -8.13076171874999], + [130.86220703125, -8.31875] + ] + ], + [ + [ + [118.2423828125, -8.31777343749999], + [118.6119140625, -8.28066406249998], + [118.7138671875, -8.41494140624998], + [118.926171875, -8.29765624999997], + [119.1296875, -8.66816406249997], + [118.7458984375, -8.73544921874999], + [118.8326171875, -8.83339843749997], + [118.47861328125, -8.85644531249996], + [118.37890625, -8.67460937500003], + [118.18994140625, -8.84052734375], + [117.061328125, -9.09902343749999], + [116.7884765625, -9.00634765625003], + [116.83505859375, -8.53242187500003], + [117.16484375, -8.36718750000001], + [117.56708984375, -8.42636718749999], + [117.8060546875, -8.71113281250001], + [117.96953125, -8.72802734374999], + [118.23486328125, -8.59189453124996], + [117.81484375, -8.34208984374997], + [117.7552734375, -8.14951171874999], + [118.11748046875, -8.12226562500004], + [118.2423828125, -8.31777343749999] + ] + ], + [ + [ + [115.4478515625, -8.15517578124999], + [115.704296875, -8.40712890624998], + [115.144921875, -8.84902343750004], + [115.055078125, -8.57304687499995], + [114.61318359375, -8.37832031249998], + [114.467578125, -8.16630859374995], + [114.9384765625, -8.18710937500002], + [115.15400390625, -8.06572265624997], + [115.4478515625, -8.15517578124999] + ] + ], + [ + [ + [129.8388671875, -7.95458984374999], + [129.7134765625, -8.04072265625004], + [129.608984375, -7.80341796875001], + [129.81298828125, -7.81972656249995], + [129.8388671875, -7.95458984374999] + ] + ], + [ + [ + [126.8009765625, -7.66787109375001], + [126.4720703125, -7.95039062500001], + [126.0400390625, -7.88583984375001], + [125.7982421875, -7.98457031249997], + [125.97529296875, -7.66337890624999], + [126.213671875, -7.70673828125003], + [126.6095703125, -7.57177734374997], + [126.8009765625, -7.66787109375001] + ] + ], + [ + [ + [127.41943359375, -7.62304687500003], + [127.370703125, -7.51279296874995], + [127.4751953125, -7.53105468750003], + [127.41943359375, -7.62304687500003] + ] + ], + [ + [ + [138.5353515625, -8.27363281249997], + [138.2962890625, -8.40517578125004], + [137.650390625, -8.38613281249997], + [138.0818359375, -7.5662109375], + [138.2955078125, -7.4384765625], + [138.76982421875, -7.39042968749997], + [138.9890625, -7.69609374999999], + [138.5353515625, -8.27363281249997] + ] + ], + [ + [ + [131.3255859375, -7.99951171874999], + [131.11376953125, -7.99736328124999], + [131.13779296875, -7.68486328125002], + [131.64345703125, -7.11279296875], + [131.7361328125, -7.19707031250002], + [131.64384765625, -7.26689453124995], + [131.6244140625, -7.62617187499996], + [131.3255859375, -7.99951171874999] + ] + ], + [ + [ + [131.98203125, -7.20205078124997], + [131.75078125, -7.116796875], + [131.922265625, -7.10449218749999], + [131.98203125, -7.20205078124997] + ] + ], + [ + [ + [128.6701171875, -7.18330078124997], + [128.52978515625, -7.13457031249999], + [128.627734375, -7.06875], + [128.6701171875, -7.18330078124997] + ] + ], + [ + [ + [120.7744140625, -7.1189453125], + [120.6408203125, -7.11582031249999], + [120.6333984375, -7.01826171875001], + [120.7744140625, -7.1189453125] + ] + ], + [ + [ + [113.84453125, -7.10537109374999], + [113.126953125, -7.22412109375003], + [112.72587890625, -7.07275390625001], + [112.86806640625, -6.89990234374997], + [113.0673828125, -6.87998046874999], + [113.97470703125, -6.873046875], + [114.0736328125, -6.96015624999998], + [113.84453125, -7.10537109374999] + ] + ], + [ + [ + [115.37705078125, -6.97080078125002], + [115.2203125, -6.95253906250004], + [115.24052734375, -6.86123046874999], + [115.54609375, -6.93867187499996], + [115.37705078125, -6.97080078125002] + ] + ], + [ + [ + [105.25283203125, -6.64042968749995], + [105.12138671875, -6.61494140625], + [105.260546875, -6.52392578125001], + [105.25283203125, -6.64042968749995] + ] + ], + [ + [ + [134.53681640625, -6.44228515624999], + [134.32275390625, -6.84873046875002], + [134.0908203125, -6.8337890625], + [134.10703125, -6.47158203125001], + [134.19462890625, -6.459765625], + [134.1146484375, -6.19082031250001], + [134.53681640625, -6.44228515624999] + ] + ], + [ + [ + [107.37392578125, -6.00761718749999], + [107.666796875, -6.21582031249996], + [108.33017578125, -6.28603515624997], + [108.67783203125, -6.79052734374997], + [110.42626953125, -6.94726562500003], + [110.834765625, -6.42421874999995], + [110.972265625, -6.43564453124998], + [111.18154296875, -6.68671874999997], + [111.54033203125, -6.64824218750003], + [112.0873046875, -6.89335937499996], + [112.5392578125, -6.92646484374996], + [112.64873046875, -7.22128906249998], + [112.7943359375, -7.30449218749997], + [112.79453125, -7.55244140625004], + [113.01357421875, -7.65771484374999], + [113.49765625, -7.72382812499996], + [114.070703125, -7.63300781250001], + [114.40927734375, -7.79248046875], + [114.3869140625, -8.40517578125004], + [114.5837890625, -8.76962890625003], + [113.2533203125, -8.28671874999996], + [112.67880859375, -8.40917968749996], + [111.5099609375, -8.30507812499998], + [110.6072265625, -8.14941406249997], + [109.281640625, -7.7048828125], + [108.7412109375, -7.66708984375003], + [108.4517578125, -7.79697265625002], + [107.91748046875, -7.72412109375001], + [107.2849609375, -7.47167968750001], + [106.4552734375, -7.36865234374999], + [106.5197265625, -7.05371093749994], + [106.1982421875, -6.92783203124998], + [105.25546875, -6.83525390625003], + [105.3708984375, -6.66435546875003], + [105.48369140625, -6.78154296875002], + [105.655078125, -6.46953124999995], + [105.7869140625, -6.45693359374997], + [105.86826171875, -6.11640625000004], + [106.075, -5.91416015624996], + [106.8251953125, -6.09824218749998], + [107.0462890625, -5.90419921874998], + [107.37392578125, -6.00761718749999] + ] + ], + [ + [ + [120.5283203125, -6.2984375], + [120.4873046875, -6.46484374999997], + [120.47734375, -5.77529296875001], + [120.5283203125, -6.2984375] + ] + ], + [ + [ + [112.71943359375, -5.81103515625], + [112.58603515625, -5.80361328124999], + [112.6900390625, -5.72617187500003], + [112.71943359375, -5.81103515625] + ] + ], + [ + [ + [132.80712890625, -5.85078125000001], + [132.6814453125, -5.91259765625], + [132.63017578125, -5.60703125], + [132.80712890625, -5.85078125000001] + ] + ], + [ + [ + [134.74697265625, -5.70703124999996], + [134.71416015625, -6.29511718750004], + [134.44111328125, -6.33486328124997], + [134.1548828125, -6.06289062499998], + [134.301953125, -6.00976562499999], + [134.34306640625, -5.83300781249994], + [134.20537109375, -5.7072265625], + [134.34130859375, -5.71289062499999], + [134.57080078125, -5.42734375], + [134.74697265625, -5.70703124999996] + ] + ], + [ + [ + [132.92626953125, -5.90205078124998], + [132.84501953125, -5.98798828125], + [133.1384765625, -5.31787109374999], + [133.11962890625, -5.57597656249999], + [132.92626953125, -5.90205078124998] + ] + ], + [ + [ + [102.3671875, -5.47871093749998], + [102.1107421875, -5.32255859374996], + [102.37177734375, -5.36640625000001], + [102.3671875, -5.47871093749998] + ] + ], + [ + [ + [123.6267578125, -5.27158203124996], + [123.5826171875, -5.36738281250004], + [123.5427734375, -5.27109374999996], + [123.6267578125, -5.27158203124996] + ] + ], + [ + [ + [122.04296875, -5.43798828125003], + [121.80849609375, -5.25615234375002], + [121.913671875, -5.07226562499996], + [122.041015625, -5.15878906249999], + [122.04296875, -5.43798828125003] + ] + ], + [ + [ + [122.6451171875, -5.26943359374998], + [122.5638671875, -5.3875], + [122.28310546875, -5.31953124999997], + [122.3962890625, -5.06982421874999], + [122.3689453125, -4.76718749999998], + [122.701953125, -4.61865234375], + [122.75986328125, -4.93388671875], + [122.6140625, -5.13867187499999], + [122.6451171875, -5.26943359374998] + ] + ], + [ + [ + [123.17978515625, -4.55117187500002], + [123.195703125, -4.82265625], + [123.05517578125, -4.74824218750003], + [122.9716796875, -5.13847656250003], + [123.1873046875, -5.33300781249996], + [122.96875, -5.40576171874994], + [122.812109375, -5.67128906249995], + [122.64501953125, -5.66337890625003], + [122.58642578125, -5.48886718750001], + [122.76650390625, -5.21015624999998], + [122.8533203125, -4.61835937500003], + [123.074609375, -4.38691406250004], + [123.17978515625, -4.55117187500002] + ] + ], + [ + [ + [133.57080078125, -4.2458984375], + [133.621875, -4.29931640624996], + [133.3208984375, -4.11103515624997], + [133.57080078125, -4.2458984375] + ] + ], + [ + [ + [123.2423828125, -4.11298828125001], + [123.076171875, -4.22714843749999], + [122.96904296875, -4.02998046874997], + [123.2119140625, -3.99755859375003], + [123.2423828125, -4.11298828125001] + ] + ], + [ + [ + [128.56259765625, -3.58544921875], + [128.3916015625, -3.63789062500003], + [128.4515625, -3.51474609374999], + [128.56259765625, -3.58544921875] + ] + ], + [ + [ + [128.2755859375, -3.67460937499996], + [127.97802734375, -3.77099609374997], + [127.925, -3.69931640625002], + [128.3291015625, -3.51591796874996], + [128.2755859375, -3.67460937499996] + ] + ], + [ + [ + [116.42412109375, -3.46445312499996], + [116.38779296875, -3.63671874999997], + [116.3265625, -3.53906249999997], + [116.42412109375, -3.46445312499996] + ] + ], + [ + [ + [116.3033203125, -3.86816406249996], + [116.0587890625, -4.00693359374999], + [116.06357421875, -3.45791015624995], + [116.2697265625, -3.25107421875001], + [116.3033203125, -3.86816406249996] + ] + ], + [ + [ + [126.8611328125, -3.08789062499999], + [127.22734375, -3.391015625], + [127.22958984375, -3.63300781250001], + [126.686328125, -3.82363281250004], + [126.21455078125, -3.60517578125003], + [126.05654296875, -3.42099609374999], + [126.08828125, -3.10546875000001], + [126.8611328125, -3.08789062499999] + ] + ], + [ + [ + [106.88642578125, -3.00527343750002], + [106.74287109375, -2.93281250000001], + [106.91064453125, -2.93398437499998], + [106.88642578125, -3.00527343750002] + ] + ], + [ + [ + [129.7546875, -2.86582031250003], + [130.3791015625, -2.98935546874998], + [130.569921875, -3.13085937500003], + [130.8599609375, -3.57031250000003], + [130.805078125, -3.85771484374996], + [129.844140625, -3.32714843749996], + [129.51171875, -3.32851562499998], + [129.46767578125, -3.45322265624998], + [128.8625, -3.23496093750001], + [128.5166015625, -3.44912109375004], + [128.13203125, -3.15742187500003], + [127.90234375, -3.49628906249996], + [127.8779296875, -3.22207031249997], + [128.19853515625, -2.86591796874997], + [128.99111328125, -2.82851562499998], + [129.1744140625, -2.93349609374997], + [129.4841796875, -2.78574218749998], + [129.7546875, -2.86582031250003] + ] + ], + [ + [ + [100.42509765625, -3.18291015624997], + [100.46513671875, -3.32851562499998], + [100.204296875, -2.98681640625], + [100.19853515625, -2.78554687500002], + [100.45458984375, -3.00195312499997], + [100.42509765625, -3.18291015624997] + ] + ], + [ + [ + [108.2072265625, -2.99765624999998], + [108.0552734375, -3.22685546874996], + [107.858203125, -3.08632812500002], + [107.614453125, -3.209375], + [107.5634765625, -2.9201171875], + [107.66630859375, -2.56630859375004], + [107.83779296875, -2.53027343749997], + [108.21513671875, -2.69697265625001], + [108.290625, -2.82998046875002], + [108.2072265625, -2.99765624999998] + ] + ], + [ + [ + [100.2041015625, -2.74101562500002], + [100.01494140625, -2.81972656249997], + [99.9878906250001, -2.52539062499996], + [100.2041015625, -2.74101562500002] + ] + ], + [ + [ + [99.8430664062501, -2.34306640625003], + [99.6070312500001, -2.25751953125001], + [99.5721679687501, -2.02578124999997], + [99.8430664062501, -2.34306640625003] + ] + ], + [ + [ + [126.055078125, -2.45126953124996], + [125.862890625, -2.07714843749994], + [125.92275390625, -1.97480468749997], + [126.055078125, -2.45126953124996] + ] + ], + [ + [ + [126.02421875, -1.78974609375001], + [126.33173828125, -1.82285156250001], + [125.47919921875, -1.94003906249999], + [125.38720703125, -1.84306640624995], + [126.02421875, -1.78974609375001] + ] + ], + [ + [ + [130.3533203125, -1.69052734374996], + [130.41884765625, -1.97128906249996], + [130.248046875, -2.04775390624999], + [129.7376953125, -1.86689453125001], + [130.3533203125, -1.69052734374996] + ] + ], + [ + [ + [124.96953125, -1.70546875], + [125.187890625, -1.71289062499999], + [125.3140625, -1.87714843749997], + [124.4177734375, -2.00517578125003], + [124.3296875, -1.85888671874997], + [124.417578125, -1.65927734374999], + [124.96953125, -1.70546875] + ] + ], + [ + [ + [135.47421875, -1.59179687500001], + [136.892578125, -1.79970703124999], + [136.228125, -1.89365234374995], + [135.47421875, -1.59179687500001] + ] + ], + [ + [ + [108.953125, -1.61962890625], + [108.837890625, -1.66162109375003], + [108.8037109375, -1.56777343749999], + [108.953125, -1.61962890625] + ] + ], + [ + [ + [106.045703125, -1.66943359375001], + [106.36591796875, -2.46484374999997], + [106.81845703125, -2.57333984374996], + [106.61201171875, -2.89550781249996], + [106.6671875, -3.07177734374999], + [105.99873046875, -2.82490234374996], + [105.78583984375, -2.18134765625004], + [105.1333984375, -2.042578125], + [105.4595703125, -1.57470703124999], + [105.58544921875, -1.52675781249999], + [105.70087890625, -1.73105468749996], + [105.72041015625, -1.53388671875003], + [105.91005859375, -1.50498046874999], + [106.045703125, -1.66943359375001] + ] + ], + [ + [ + [123.59755859375, -1.70429687500001], + [123.48251953125, -1.68144531249997], + [123.528515625, -1.50283203125001], + [123.59755859375, -1.70429687500001] + ] + ], + [ + [ + [128.15302734375, -1.66054687499998], + [127.56162109375, -1.72851562499997], + [127.39501953125, -1.58984374999997], + [127.6466796875, -1.332421875], + [128.15302734375, -1.66054687499998] + ] + ], + [ + [ + [123.2123046875, -1.17128906249997], + [123.23779296875, -1.38935546874998], + [123.434765625, -1.23681640624999], + [123.547265625, -1.33740234374996], + [123.5119140625, -1.44736328124998], + [123.27490234375, -1.43720703124996], + [123.17294921875, -1.61601562499997], + [123.150390625, -1.3044921875], + [122.8904296875, -1.58720703124996], + [122.81083984375, -1.43212890624999], + [122.9080078125, -1.18222656249996], + [123.2123046875, -1.17128906249997] + ] + ], + [ + [ + [109.71025390625, -1.1806640625], + [109.463671875, -1.27753906250003], + [109.4759765625, -0.9853515625], + [109.743359375, -1.03935546874999], + [109.71025390625, -1.1806640625] + ] + ], + [ + [ + [134.96533203125, -1.11601562499997], + [134.86171875, -1.11416015624995], + [134.8279296875, -0.978808593750003], + [134.9962890625, -1.03408203124998], + [134.96533203125, -1.11601562499997] + ] + ], + [ + [ + [99.1638671875001, -1.77792968750001], + [98.8277343750001, -1.60996093749998], + [98.6017578125, -1.19785156249995], + [98.6760742187501, -0.970507812500003], + [98.9326171875, -0.954003906250009], + [99.2672851562501, -1.62773437499996], + [99.1638671875001, -1.77792968750001] + ] + ], + [ + [ + [131.00185546875, -1.31552734375003], + [130.78232421875, -1.25546874999996], + [130.67294921875, -0.959765625000031], + [131.0330078125, -0.917578124999963], + [131.00185546875, -1.31552734375003] + ] + ], + [ + [ + [135.3830078125, -0.6513671875], + [135.8935546875, -0.725781249999969], + [136.37529296875, -1.09404296875003], + [136.16474609375, -1.21474609375002], + [135.9150390625, -1.17841796875], + [135.7470703125, -0.823046874999974], + [135.645703125, -0.881933593749991], + [135.3830078125, -0.6513671875] + ] + ], + [ + [ + [127.300390625, -0.780957031250026], + [127.1564453125, -0.760937500000026], + [127.20908203125, -0.619335937499955], + [127.300390625, -0.780957031250026] + ] + ], + [ + [ + [130.62666015625, -0.528710937499966], + [130.4654296875, -0.486523437499983], + [130.61591796875, -0.417285156250003], + [130.62666015625, -0.528710937499966] + ] + ], + [ + [ + [121.86435546875, -0.406835937500006], + [121.88125, -0.502636718749983], + [121.6552734375, -0.526171874999989], + [121.86435546875, -0.406835937500006] + ] + ], + [ + [ + [140.9734375, -2.609765625], + [140.97353515625, -2.80341796875003], + [140.975, -6.34609375000002], + [140.8623046875, -6.74003906249999], + [140.9751953125, -6.90537109375002], + [140.976171875, -9.11875], + [140.0029296875, -8.19550781250004], + [140.1169921875, -7.92373046875001], + [139.934765625, -8.101171875], + [139.38564453125, -8.18906249999996], + [139.248828125, -7.98242187499997], + [138.890625, -8.23779296874994], + [139.08798828125, -7.58720703125002], + [138.74794921875, -7.25146484375], + [139.17685546875, -7.1904296875], + [138.845703125, -7.13632812499999], + [138.6013671875, -6.93652343749997], + [138.86455078125, -6.85839843749994], + [138.438671875, -6.343359375], + [138.2962890625, -5.94902343749996], + [138.374609375, -5.84365234374998], + [138.199609375, -5.80703125], + [138.3396484375, -5.67568359374997], + [138.087109375, -5.70917968750004], + [138.06083984375, -5.46523437499998], + [137.27978515625, -4.94541015624995], + [136.61884765625, -4.81875], + [135.9796875, -4.53085937499996], + [135.19560546875, -4.45068359374997], + [134.6796875, -4.07910156249994], + [134.70654296875, -3.95478515625003], + [134.8865234375, -3.93847656249999], + [134.2662109375, -3.94580078124997], + [134.1470703125, -3.79677734374998], + [133.973828125, -3.81796875000003], + [133.6783203125, -3.4794921875], + [133.84150390625, -3.05478515624999], + [133.700390625, -3.0875], + [133.653125, -3.36435546874999], + [133.5181640625, -3.4119140625], + [133.40087890625, -3.89902343750003], + [133.24873046875, -4.06230468749999], + [132.914453125, -4.05693359374996], + [132.75390625, -3.70361328125001], + [132.8697265625, -3.5509765625], + [132.7513671875, -3.29462890625], + [131.97119140625, -2.78857421875001], + [132.2306640625, -2.68037109375], + [132.725, -2.78906250000003], + [133.191015625, -2.43779296874996], + [133.70009765625, -2.624609375], + [133.7533203125, -2.45068359375001], + [133.9048828125, -2.39091796875], + [133.791015625, -2.29365234375], + [133.92158203125, -2.10205078124996], + [132.96279296875, -2.27255859374996], + [132.3076171875, -2.24228515625002], + [132.0234375, -1.99033203125002], + [131.93037109375, -1.55966796875003], + [131.29375, -1.39345703125001], + [130.9958984375, -1.42470703124998], + [131.1908203125, -1.1658203125], + [131.2572265625, -0.855468750000014], + [131.804296875, -0.703808593750026], + [132.39375, -0.355468750000028], + [132.8564453125, -0.417382812500023], + [133.47265625, -0.726171874999963], + [133.97451171875, -0.744335937500026], + [134.1115234375, -0.84677734375002], + [134.07197265625, -1.00185546874999], + [134.2595703125, -1.36298828125003], + [134.105859375, -1.72099609374995], + [134.19482421875, -2.30908203124994], + [134.4599609375, -2.83232421874996], + [134.48330078125, -2.58300781249997], + [134.62744140625, -2.53671874999996], + [134.7021484375, -2.93359374999999], + [134.843359375, -2.90917968749999], + [134.88681640625, -3.20986328124997], + [135.2515625, -3.36855468749997], + [135.48662109375, -3.34511718749998], + [135.8591796875, -2.99531250000004], + [136.38994140625, -2.27333984375004], + [137.0720703125, -2.10507812499995], + [137.17109375, -2.02548828124999], + [137.1234375, -1.84091796874996], + [137.80625, -1.483203125], + [139.78955078125, -2.34824218750002], + [140.62255859375, -2.44580078125], + [140.7474609375, -2.60712890625], + [140.9734375, -2.609765625] + ] + ], + [ + [ + [104.47421875, -0.334667968749955], + [104.59013671875, -0.466601562500017], + [104.36318359375, -0.658593749999966], + [104.25712890625, -0.463281249999966], + [104.47421875, -0.334667968749955] + ] + ], + [ + [ + [127.5669921875, -0.318945312499949], + [127.682421875, -0.46835937500002], + [127.60498046875, -0.610156249999946], + [127.88017578125, -0.808691406249991], + [127.7611328125, -0.883691406249994], + [127.623828125, -0.76601562499999], + [127.4626953125, -0.80595703124996], + [127.46865234375, -0.64296875], + [127.3, -0.500292968749946], + [127.32509765625, -0.335839843750023], + [127.45517578125, -0.406347656249991], + [127.5669921875, -0.318945312499949] + ] + ], + [ + [ + [127.24990234375, -0.4953125], + [127.119140625, -0.520507812499986], + [127.12646484375, -0.278613281250003], + [127.2900390625, -0.284375], + [127.24990234375, -0.4953125] + ] + ], + [ + [ + [103.7365234375, -0.347949218750003], + [103.461328125, -0.357617187500011], + [103.54892578125, -0.227539062499986], + [103.7365234375, -0.347949218750003] + ] + ], + [ + [ + [130.81328125, -0.004101562500026], + [131.27685546875, -0.149804687499952], + [131.33974609375, -0.290332031249989], + [131.00537109375, -0.360742187500037], + [130.62216796875, -0.0859375], + [130.89921875, -0.344433593749997], + [130.7501953125, -0.44384765625], + [130.688671875, -0.296582031250011], + [130.55078125, -0.366406250000026], + [130.23662109375, -0.209667968749983], + [130.3625, -0.072851562500006], + [130.81328125, -0.004101562500026] + ] + ], + [ + [ + [98.4592773437501, -0.530468749999969], + [98.3096679687501, -0.531835937499977], + [98.4271484375, -0.226464843750037], + [98.3229492187501, -0.000781249999974], + [98.544140625, -0.257617187499989], + [98.4592773437501, -0.530468749999969] + ] + ], + [ + [ + [104.77861328125, -0.175976562499955], + [105.00537109375, -0.282812499999963], + [104.4470703125, -0.189160156249983], + [104.54267578125, 0.01772460937498], + [104.77861328125, -0.175976562499955] + ] + ], + [ + [ + [103.28447265625, 0.541943359375011], + [103.13955078125, 0.549072265625043], + [103.18740234375, 0.699755859375017], + [103.28447265625, 0.541943359375011] + ] + ], + [ + [ + [103.0275390625, 0.746630859374974], + [102.4904296875, 0.856640625], + [102.506640625, 1.08876953125004], + [103.00244140625, 0.859277343750009], + [103.0275390625, 0.746630859374974] + ] + ], + [ + [ + [103.42392578125, 1.04833984374997], + [103.3154296875, 1.07128906250003], + [103.37998046875, 1.13364257812503], + [103.42392578125, 1.04833984374997] + ] + ], + [ + [ + [103.16640625, 0.870166015625003], + [102.70185546875, 1.0537109375], + [102.7255859375, 1.15883789062502], + [102.9994140625, 1.06777343750002], + [103.16640625, 0.870166015625003] + ] + ], + [ + [ + [104.0248046875, 1.18056640625001], + [104.13984375, 1.16557617187497], + [104.06611328125, 0.989550781249989], + [103.9322265625, 1.07138671874996], + [104.0248046875, 1.18056640625001] + ] + ], + [ + [ + [104.5853515625, 1.21611328124996], + [104.662890625, 1.04951171875004], + [104.5751953125, 0.831933593750037], + [104.4392578125, 1.05043945312505], + [104.251953125, 1.014892578125], + [104.36181640625, 1.18149414062502], + [104.5853515625, 1.21611328124996] + ] + ], + [ + [ + [102.4271484375, 0.990136718750023], + [102.27958984375, 1.07568359375004], + [102.25634765625, 1.39707031249996], + [102.44287109375, 1.23422851562501], + [102.4271484375, 0.990136718750023] + ] + ], + [ + [ + [97.4815429687501, 1.46508789062497], + [97.93193359375, 0.973925781250003], + [97.8204101562501, 0.564453124999986], + [97.683984375, 0.596093750000037], + [97.6039062500001, 0.83388671874998], + [97.4053710937501, 0.946972656250026], + [97.0791992187501, 1.42548828124998], + [97.35595703125, 1.53974609375], + [97.4815429687501, 1.46508789062497] + ] + ], + [ + [ + [102.49189453125, 1.45917968750001], + [102.4994140625, 1.33090820312499], + [102.0240234375, 1.60795898437503], + [102.49189453125, 1.45917968750001] + ] + ], + [ + [ + [124.8888671875, 0.995312500000011], + [124.4275390625, 0.470605468750051], + [123.75380859375, 0.305517578124991], + [123.2654296875, 0.326611328125026], + [122.996875, 0.493505859375006], + [121.01298828125, 0.441699218750017], + [120.57900390625, 0.5283203125], + [120.19228515625, 0.268505859374997], + [120.01328125, -0.196191406249994], + [120.062890625, -0.555566406250023], + [120.240625, -0.868261718749949], + [120.517578125, -1.039453125], + [120.6673828125, -1.37011718749997], + [121.14853515625, -1.33945312500002], + [121.5755859375, -0.828515625000023], + [121.96962890625, -0.933300781249969], + [122.27998046875, -0.757031250000026], + [122.88876953125, -0.755175781250003], + [122.8294921875, -0.658886718750026], + [123.171484375, -0.57070312499999], + [123.3796875, -0.648535156249949], + [123.4341796875, -0.778222656249994], + [123.3779296875, -1.00410156250001], + [122.90283203125, -0.900976562499963], + [122.25068359375, -1.55527343750003], + [121.85859375, -1.69326171874998], + [121.6509765625, -1.89541015624995], + [121.35546875, -1.87822265625], + [122.29169921875, -2.90761718750002], + [122.3990234375, -3.20087890625], + [122.2529296875, -3.62041015625002], + [122.6896484375, -4.08447265624997], + [122.84794921875, -4.06455078125001], + [122.872265625, -4.39199218750001], + [122.7197265625, -4.34072265624995], + [122.1142578125, -4.54023437500001], + [122.0380859375, -4.83242187500002], + [121.588671875, -4.75957031250002], + [121.4865234375, -4.58105468749997], + [121.61806640625, -4.09267578124995], + [120.891796875, -3.52060546875003], + [121.054296875, -3.16708984374995], + [121.0521484375, -2.75166015624996], + [120.87939453125, -2.64560546875002], + [120.65361328125, -2.66757812499998], + [120.26103515625, -2.94931640624999], + [120.43662109375, -3.70732421874996], + [120.4201171875, -4.61738281250001], + [120.279296875, -5.14609374999998], + [120.43037109375, -5.59101562500003], + [119.9515625, -5.57763671874997], + [119.71728515625, -5.69335937500001], + [119.557421875, -5.61103515625003], + [119.3603515625, -5.31416015625003], + [119.59404296875, -4.52314453125], + [119.6236328125, -4.034375], + [119.46748046875, -3.51298828124999], + [118.99462890625, -3.53759765625003], + [118.86767578125, -3.39804687500002], + [118.78330078125, -2.72080078124998], + [119.0921875, -2.48291015625001], + [119.321875, -1.92968750000001], + [119.308984375, -1.408203125], + [119.508203125, -0.906738281249972], + [119.711328125, -0.680761718750034], + [119.8443359375, -0.861914062499991], + [119.721875, -0.088476562499991], + [119.865625, 0.040087890625003], + [119.80927734375, 0.238671875000051], + [119.91328125, 0.445068359375], + [120.26953125, 0.970800781249991], + [120.6025390625, 0.854394531249994], + [120.86796875, 1.25283203124998], + [121.08173828125, 1.32763671875003], + [121.4041015625, 1.24360351562497], + [121.591796875, 1.06796874999998], + [122.43662109375, 1.01806640625003], + [122.83828125, 0.845703125], + [123.06650390625, 0.941796875000037], + [123.93076171875, 0.850439453124977], + [124.53369140625, 1.23046875000004], + [124.9470703125, 1.67216796874997], + [125.1109375, 1.68569335937497], + [125.2337890625, 1.50229492187501], + [124.8888671875, 0.995312500000011] + ] + ], + [ + [ + [101.70810546875, 2.07841796875005], + [101.71943359375, 1.78916015625001], + [101.50078125, 1.73320312499997], + [101.40966796875, 2.02167968750003], + [101.70810546875, 2.07841796875005] + ] + ], + [ + [ + [127.73271484375, 0.848144531250043], + [127.8810546875, 0.832128906249977], + [127.96728515625, 1.04257812500005], + [128.1607421875, 1.1578125], + [128.2224609375, 1.40063476562499], + [128.68837890625, 1.57255859375002], + [128.70263671875, 1.106396484375], + [128.298828125, 0.87680664062502], + [128.26064453125, 0.733789062500023], + [128.61123046875, 0.549951171875051], + [128.899609375, 0.216259765625011], + [127.98310546875, 0.471875], + [127.88740234375, 0.298339843750043], + [127.97783203125, -0.24833984374996], + [128.42548828125, -0.892675781249949], + [128.04638671875, -0.706054687499943], + [127.6916015625, -0.241894531249983], + [127.70869140625, 0.288085937499986], + [127.537109375, 0.610888671875031], + [127.6080078125, 0.848242187499977], + [127.428515625, 1.13999023437499], + [127.63173828125, 1.84370117187501], + [128.03642578125, 2.19902343750002], + [127.88681640625, 1.83295898437504], + [128.0109375, 1.70122070312503], + [128.01171875, 1.33173828124998], + [127.65283203125, 1.01386718749997], + [127.73271484375, 0.848144531250043] + ] + ], + [ + [ + [97.3341796875001, 2.07563476562501], + [97.10830078125, 2.21689453125001], + [97.29140625, 2.20083007812502], + [97.3341796875001, 2.07563476562501] + ] + ], + [ + [ + [128.45390625, 2.05175781250003], + [128.2958984375, 2.03471679687502], + [128.21796875, 2.29746093749999], + [128.6021484375, 2.59760742187504], + [128.6884765625, 2.47368164062502], + [128.6232421875, 2.22441406250003], + [128.45390625, 2.05175781250003] + ] + ], + [ + [ + [96.463671875, 2.36000976562504], + [95.80859375, 2.65561523437503], + [95.7171875, 2.82597656250002], + [95.8958007812501, 2.8890625], + [96.4172851562501, 2.51518554687503], + [96.463671875, 2.36000976562504] + ] + ], + [ + [ + [108.8875, 2.90541992187504], + [108.7865234375, 2.88564453125001], + [108.8857421875, 2.998974609375], + [108.8875, 2.90541992187504] + ] + ], + [ + [ + [105.7603515625, 2.86303710937501], + [105.6921875, 3.0625], + [105.83671875, 2.97651367187504], + [105.7603515625, 2.86303710937501] + ] + ], + [ + [ + [106.28525390625, 3.15712890624998], + [106.28369140625, 3.08823242187498], + [106.2009765625, 3.20488281250003], + [106.28525390625, 3.15712890624998] + ] + ], + [ + [ + [117.6583984375, 3.28051757812499], + [117.5478515625, 3.43198242187502], + [117.680859375, 3.40751953125002], + [117.6583984375, 3.28051757812499] + ] + ], + [ + [ + [125.65810546875, 3.43603515625004], + [125.5115234375, 3.46113281250001], + [125.46884765625, 3.73325195312502], + [125.65810546875, 3.43603515625004] + ] + ], + [ + [ + [117.884765625, 4.18613281250001], + [117.9228515625, 4.05429687499998], + [117.73681640625, 4.00400390625003], + [117.6490234375, 4.16899414062497], + [117.884765625, 4.18613281250001] + ] + ], + [ + [ + [108.316015625, 3.68964843750003], + [108.100390625, 3.70454101562504], + [108.24326171875, 3.81035156250002], + [108.00234375, 3.98286132812498], + [108.24833984375, 4.21713867187502], + [108.39287109375, 3.98618164062503], + [108.316015625, 3.68964843750003] + ] + ], + [ + [ + [117.5744140625, 4.17060546875004], + [117.46533203125, 4.07607421874997], + [117.77724609375, 3.68925781250003], + [117.05595703125, 3.62265624999996], + [117.3462890625, 3.42661132812499], + [117.35244140625, 3.19375], + [117.61064453125, 3.06435546874999], + [117.569140625, 2.92929687500002], + [117.69765625, 2.88730468749999], + [117.6388671875, 2.82529296874996], + [118.0666015625, 2.31782226562497], + [117.7892578125, 2.02685546875001], + [118.9849609375, 0.982128906249983], + [118.534765625, 0.813525390625017], + [118.19609375, 0.874365234374977], + [117.91162109375, 1.09868164062502], + [117.9642578125, 0.889550781250051], + [117.7451171875, 0.72963867187498], + [117.52216796875, 0.235888671875017], + [117.462890625, -0.323730468749957], + [117.5625, -0.770898437500009], + [116.91396484375, -1.22363281249997], + [116.73984375, -1.04423828125002], + [116.75341796875, -1.32734374999996], + [116.27548828125, -1.78486328125], + [116.42431640625, -1.78486328125], + [116.451953125, -1.92314453125002], + [116.31396484375, -2.13984375000001], + [116.5654296875, -2.29970703124999], + [116.529296875, -2.51054687499996], + [116.316796875, -2.55185546875002], + [116.3306640625, -2.90214843749997], + [116.16630859375, -2.93457031250001], + [116.2572265625, -3.12636718750001], + [115.95615234375, -3.59501953125], + [114.6935546875, -4.16972656250002], + [114.5255859375, -3.37666015625001], + [114.44599609375, -3.48183593750004], + [114.3443359375, -3.44443359374996], + [114.3443359375, -3.23515625], + [114.236328125, -3.36113281249996], + [114.0822265625, -3.27890625], + [113.705078125, -3.45527343750004], + [113.61005859375, -3.195703125], + [113.3431640625, -3.24648437499997], + [113.033984375, -2.93349609374997], + [112.971484375, -3.18710937500003], + [112.7580078125, -3.32216796875001], + [112.60029296875, -3.40048828124998], + [112.2849609375, -3.32099609375004], + [111.85810546875, -3.55185546875001], + [111.823046875, -3.05722656249995], + [111.6947265625, -2.88945312499996], + [110.930078125, -3.07109375000002], + [110.8296875, -2.9951171875], + [110.89931640625, -2.90859374999995], + [110.703125, -3.02089843750001], + [110.5740234375, -2.89140625], + [110.2560546875, -2.96611328124995], + [110.09658203125, -2.00136718749997], + [109.95986328125, -1.86279296874997], + [109.98330078125, -1.27480468749999], + [109.78740234375, -1.01132812499996], + [109.2587890625, -0.807421874999989], + [109.37275390625, -0.638183593749972], + [109.12109375, -0.39091796874996], + [109.25751953125, 0.031152343750051], + [108.94453125, 0.355664062499997], + [108.916796875, 0.912646484375045], + [108.95859375, 1.13461914062496], + [109.13154296875, 1.25385742187501], + [109.01025390625, 1.23964843750005], + [109.07587890625, 1.49589843750003], + [109.378515625, 1.92270507812503], + [109.62890625, 2.02753906249998], + [109.53896484375, 1.89619140625004], + [109.65400390625, 1.61489257812502], + [110.50576171875, 0.861962890625023], + [111.1013671875, 1.05053710937499], + [111.808984375, 1.01166992187497], + [112.078515625, 1.14335937499997], + [112.1857421875, 1.4390625], + [112.476171875, 1.55908203125003], + [112.94296875, 1.56699218750003], + [113.00654296875, 1.43388671875], + [113.622265625, 1.2359375], + [113.90234375, 1.43427734375], + [114.5125, 1.45200195312496], + [114.83056640625, 1.98002929687499], + [114.78642578125, 2.25048828125001], + [115.1791015625, 2.52319335937497], + [115.08076171875, 2.63422851562504], + [115.117578125, 2.89487304687502], + [115.24697265625, 3.02592773437499], + [115.45439453125, 3.03432617187501], + [115.67880859375, 4.19301757812499], + [115.8607421875, 4.34804687500004], + [116.51474609375, 4.37080078124997], + [117.1005859375, 4.33706054687502], + [117.5744140625, 4.17060546875004] + ] + ], + [ + [ + [126.8166015625, 4.03349609375], + [126.7044921875, 4.07099609375], + [126.81357421875, 4.25849609375001], + [126.7220703125, 4.34418945312497], + [126.75732421875, 4.54790039062499], + [126.92109375, 4.29101562499997], + [126.8166015625, 4.03349609375] + ] + ], + [ + [ + [96.4925781250001, 5.22934570312499], + [97.54716796875, 5.205859375], + [98.2484375, 4.41455078125], + [98.3073242187501, 4.09287109375002], + [99.7323242187501, 3.18305664062503], + [100.523828125, 2.18916015625004], + [100.887890625, 1.94824218749999], + [100.82822265625, 2.242578125], + [101.04619140625, 2.25747070312502], + [101.47666015625, 1.69306640625005], + [102.019921875, 1.442138671875], + [102.38994140625, 0.84199218750004], + [103.0318359375, 0.57890625], + [103.00751953125, 0.415332031249974], + [102.55, 0.216455078124966], + [103.33896484375, 0.513720703125045], + [103.67265625, 0.288916015624977], + [103.78671875, 0.046972656249991], + [103.428515625, -0.19179687499998], + [103.40517578125, -0.36220703124998], + [103.5091796875, -0.465527343749969], + [103.43857421875, -0.575585937500009], + [103.72109375, -0.886718749999986], + [104.360546875, -1.03837890624997], + [104.51591796875, -1.81943359375002], + [104.84521484375, -2.09296874999997], + [104.65078125, -2.59521484374997], + [104.97080078125, -2.37089843750002], + [105.39697265625, -2.38017578124995], + [106.0443359375, -3.10625], + [105.84375, -3.61367187499998], + [105.93046875, -3.83300781249999], + [105.8314453125, -4.16289062499996], + [105.88720703125, -5.00957031249997], + [105.74833984375, -5.81826171874997], + [105.3494140625, -5.54951171875001], + [105.08134765625, -5.74550781249998], + [104.63955078125, -5.52041015625004], + [104.683984375, -5.89267578125002], + [104.6015625, -5.90458984374996], + [103.8314453125, -5.07958984375003], + [102.5376953125, -4.15214843749999], + [102.1275390625, -3.59921874999996], + [101.57861328125, -3.16699218750001], + [100.88955078125, -2.24853515624996], + [100.8552734375, -1.93417968749995], + [100.308203125, -0.82666015625], + [99.6698242187501, 0.045068359375037], + [99.1591796875, 0.351757812499997], + [98.5953125000001, 1.86459960937501], + [97.7007812500001, 2.35854492187501], + [97.5908203125, 2.84658203125004], + [97.3913085937501, 2.97529296874997], + [96.9689453125001, 3.57514648437497], + [96.4447265625001, 3.81630859374998], + [95.57861328125, 4.66196289062505], + [95.2066406250001, 5.28403320312503], + [95.22783203125, 5.56479492187503], + [95.62890625, 5.60908203125], + [96.13330078125, 5.29428710937499], + [96.4925781250001, 5.22934570312499] + ] + ] + ] + }, + "properties": { + "name": "Indonesia", + "childNum": 107 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-4.41206054687498, 54.1853515625], + [-4.78535156249998, 54.073046875], + [-4.42470703124999, 54.407177734375], + [-4.41206054687498, 54.1853515625] + ] + ] + }, + "properties": { + "name": "Isle of Man", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [75.3222134823302, 32.2851635667897], + [75.6249687111602, 32.2851635667897], + [75.7358599768872, 32.7841742625609], + [76.3272800607642, 32.8765836506667], + [76.6229901027026, 33.3201487135744], + [77.0665551656104, 33.3016668359532], + [77.7134208823508, 32.6917648744551], + [78.1015403123951, 32.8765836506667], + [78.4919425088534, 32.531227861492], + [78.3896484375, 32.519873046875], + [78.41748046875, 32.46669921875], + [78.4552734375001, 32.300341796875], + [78.4958984375, 32.215771484375], + [78.7255859375001, 31.9837890625], + [78.7197265625001, 31.887646484375], + [78.6934570312501, 31.740380859375], + [78.7550781250001, 31.55029296875], + [78.7435546875001, 31.323779296875], + [79.10712890625, 31.4026367187501], + [79.3884765625001, 31.0642089843751], + [79.6642578125, 30.965234375], + [79.92451171875, 30.88876953125], + [80.2071289062501, 30.683740234375], + [80.1912109375, 30.568408203125], + [80.87353515625, 30.290576171875], + [80.9854492187501, 30.237109375], + [81.0102539062501, 30.1645019531251], + [80.96611328125, 30.1800292968751], + [80.9076171875001, 30.171923828125], + [80.8481445312501, 30.13974609375], + [80.8199218750001, 30.1193359375], + [80.6840820312501, 29.9943359375001], + [80.5490234375002, 29.8998046875], + [80.40185546875, 29.7302734375001], + [80.3168945312501, 29.5720703125], + [80.2548828125001, 29.4233398437501], + [80.2559570312501, 29.3180175781251], + [80.2330078125001, 29.19462890625], + [80.1695312500001, 29.1243164062501], + [80.1304687500001, 29.100390625], + [80.0845703125, 28.9941894531251], + [80.05166015625, 28.8703125000001], + [80.0707031250001, 28.8301757812501], + [80.2265625, 28.7233398437501], + [80.3248046875001, 28.6664062500001], + [80.4185546875, 28.61201171875], + [80.4791015625001, 28.6048828125], + [80.4958007812502, 28.6357910156251], + [80.51787109375, 28.665185546875], + [80.5870117187501, 28.649609375], + [81.1689453125001, 28.3350097656251], + [81.8526367187502, 27.8670898437501], + [81.8968750000001, 27.874462890625], + [81.9452148437501, 27.899267578125], + [81.9876953125002, 27.91376953125], + [82.03701171875, 27.9005859375], + [82.1119140625001, 27.86494140625], + [82.2876953125002, 27.75654296875], + [82.4513671875, 27.671826171875], + [82.6298828125, 27.687060546875], + [82.6773437500001, 27.6734375], + [82.7108398437501, 27.5966796875001], + [82.7333984375, 27.5189941406251], + [83.28974609375, 27.3709960937501], + [83.36943359375, 27.41025390625], + [83.383984375, 27.4448242187501], + [83.4471679687501, 27.46533203125], + [83.5516601562501, 27.4563476562499], + [83.7469726562501, 27.3959472656251], + [83.8288085937501, 27.3778320312501], + [84.0910156249999, 27.4913574218751], + [84.2297851562501, 27.42783203125], + [84.4808593750001, 27.3481933593751], + [84.61015625, 27.298681640625], + [84.6407226562501, 27.249853515625], + [84.6547851562501, 27.203662109375], + [84.6538085937501, 27.0916992187501], + [84.6853515625001, 27.0410156250001], + [85.1917968750001, 26.7665527343751], + [85.2929687500001, 26.741015625], + [85.5684570312501, 26.8398437500001], + [85.6484375, 26.82900390625], + [85.69990234375, 26.781640625], + [85.7373046875, 26.63974609375], + [85.7945312500001, 26.6041503906251], + [86.0073242187501, 26.649365234375], + [86.7013671875002, 26.4350585937501], + [87.01640625, 26.5554199218751], + [87.2874023437499, 26.3603027343751], + [87.4135742187501, 26.4229492187501], + [87.8492187500001, 26.4369140625001], + [87.9951171875001, 26.382373046875], + [88.0269531250002, 26.3950195312501], + [88.0548828125, 26.4300292968749], + [88.1115234375, 26.58642578125], + [88.1615234375, 26.7248046875001], + [88.1572265625001, 26.8073242187501], + [88.1110351562501, 26.9284667968751], + [87.9931640625001, 27.086083984375], + [87.984375, 27.133935546875], + [88.1469726562501, 27.7492187500001], + [88.1502929687501, 27.8433105468751], + [88.1097656250001, 27.87060546875], + [88.108984375, 27.9330078125001], + [88.14111328125, 27.9489257812501], + [88.2751953125001, 27.9688476562501], + [88.4259765625002, 28.0116699218751], + [88.5779296875, 28.093359375], + [88.8037109375, 28.00693359375], + [88.7490234375, 27.5218750000001], + [88.7648437500001, 27.4298828125001], + [88.83251953125, 27.3628417968751], + [88.89140625, 27.3160644531251], + [88.8816406250001, 27.2974609375001], + [88.7603515625001, 27.2181152343751], + [88.7387695312501, 27.1755859374999], + [88.8576171875002, 26.961474609375], + [89.1482421875, 26.8161621093751], + [89.3321289062502, 26.8486328125001], + [89.5861328125, 26.7789550781251], + [89.6099609375001, 26.7194335937501], + [89.7109375000001, 26.713916015625], + [89.7638671875, 26.7015625], + [89.9431640625001, 26.7239257812499], + [90.1229492187501, 26.75458984375], + [90.2060546875, 26.8475097656251], + [90.3458984375, 26.8903320312501], + [90.7396484375001, 26.7716796875001], + [91.2865234375, 26.7899414062501], + [91.4267578125, 26.86708984375], + [91.4558593750001, 26.8668945312501], + [91.5175781250001, 26.8073242187501], + [91.6715820312499, 26.802001953125], + [91.8420898437501, 26.8529785156251], + [91.94375, 26.8608398437501], + [91.9983398437501, 26.85498046875], + [92.0497070312502, 26.874853515625], + [92.7315550748968, 26.8336978628616], + [93.309753761595, 26.7849505226506], + [93.6104704367925, 27.322394351885], + [94.0697900148445, 27.5894071585848], + [95.1080093732192, 27.7496368811537], + [95.7400074083836, 28.1168504327223], + [96.1957759404259, 28.0429159770098], + [96.96279296875, 27.698291015625], + [96.8835937500001, 27.5148437500001], + [96.9019531250001, 27.4395996093751], + [97.1037109374999, 27.1633300781251], + [97.10205078125, 27.1154296875001], + [96.9534179687501, 27.13330078125], + [96.7978515625, 27.29619140625], + [96.1908203125001, 27.261279296875], + [95.2014648437501, 26.64140625], + [95.0597656250002, 26.473974609375], + [95.0689453125001, 26.1911132812501], + [95.1083984375001, 26.09140625], + [95.1292968750001, 26.07041015625], + [95.1324218750001, 26.0412597656249], + [94.9919921875, 25.770458984375], + [94.6677734375001, 25.45888671875], + [94.5530273437501, 25.21572265625], + [94.7037109375001, 25.0978515625], + [94.4931640625, 24.637646484375], + [94.37724609375, 24.47373046875], + [94.2930664062501, 24.321875], + [94.0748046875001, 23.8720703125], + [93.6833984375001, 24.00654296875], + [93.4521484375, 23.98740234375], + [93.3262695312501, 24.0642089843751], + [93.3660156250001, 23.13251953125], + [93.3494140625001, 23.0849609375], + [93.20390625, 23.0370117187501], + [93.0787109375002, 22.7182128906251], + [93.16201171875, 22.360205078125], + [93.07060546875, 22.209423828125], + [92.9645507812502, 22.003759765625], + [92.9094726562501, 21.988916015625], + [92.854296875, 22.0101562500001], + [92.77138671875, 22.10478515625], + [92.6889648437501, 22.13095703125], + [92.6303710937501, 22.011328125], + [92.5749023437499, 21.978076171875], + [92.5612304687501, 22.048046875], + [92.49140625, 22.685400390625], + [92.4644531250001, 22.734423828125], + [92.36162109375, 22.9290039062501], + [92.3337890625, 23.2423828125], + [92.24609375, 23.68359375], + [92.0440429687501, 23.677783203125], + [91.978515625, 23.6919921875001], + [91.9295898437501, 23.6859863281251], + [91.9294921875002, 23.5982421875], + [91.9378906250001, 23.5046875000001], + [91.7541992187501, 23.2873046875], + [91.7509765625, 23.053515625], + [91.5535156250001, 22.991552734375], + [91.43623046875, 23.19990234375], + [91.359375, 23.068359375], + [91.1604492187502, 23.6606445312501], + [91.3501953125001, 24.060498046875], + [91.7265625, 24.205078125], + [91.84619140625, 24.1752929687499], + [92.06416015625, 24.374365234375], + [92.11748046875, 24.4939453125], + [92.2266601562501, 24.77099609375], + [92.2283203125, 24.8813476562501], + [92.2512695312499, 24.895068359375], + [92.3849609375, 24.848779296875], + [92.4683593750002, 24.9441406250001], + [92.0497070312502, 25.169482421875], + [90.6130859375, 25.167724609375], + [90.11962890625, 25.219970703125], + [89.8663085937501, 25.2931640625], + [89.8140625000001, 25.30537109375], + [89.8008789062501, 25.3361328125], + [89.82490234375, 25.56015625], + [89.8229492187502, 25.94140625], + [89.6708984375001, 26.2138183593751], + [89.57275390625, 26.13232421875], + [89.5499023437501, 26.0052734375001], + [89.2892578125002, 26.0375976562501], + [89.0186523437501, 26.41025390625], + [88.951953125, 26.412109375], + [88.97041015625, 26.25087890625], + [88.94072265625, 26.245361328125], + [88.6828125, 26.29169921875], + [88.51826171875, 26.5177734375], + [88.369921875, 26.5641113281251], + [88.3514648437501, 26.482568359375], + [88.38623046875, 26.471533203125], + [88.4404296875, 26.369482421875], + [88.333984375, 26.25751953125], + [88.1507812500001, 26.0871582031251], + [88.1066406250001, 25.84111328125], + [88.1474609375, 25.81142578125], + [88.5024414062501, 25.5370117187501], + [88.7691406250001, 25.490478515625], + [88.85478515625, 25.333544921875], + [88.944140625, 25.290771484375], + [88.9297851562501, 25.2229980468751], + [88.5738281250001, 25.187890625], + [88.45625, 25.1884277343751], + [88.3729492187502, 24.9615234375001], + [88.3133789062501, 24.8818359375], + [88.2794921875002, 24.88193359375], + [88.1888671875002, 24.9206054687501], + [88.1498046875001, 24.9146484375], + [88.0451171875002, 24.7130371093751], + [88.0302734375001, 24.6644531250001], + [88.0234375, 24.6278320312501], + [88.0791015625001, 24.5499023437501], + [88.1455078125, 24.485791015625], + [88.225, 24.46064453125], + [88.3375, 24.453857421875], + [88.49853515625, 24.346630859375], + [88.6422851562502, 24.3259765625001], + [88.7235351562501, 24.27490234375], + [88.7335937500001, 24.2309082031251], + [88.7265625000001, 24.18623046875], + [88.7137695312502, 24.0696289062501], + [88.6998046875001, 24.0025390624999], + [88.5673828125001, 23.6744140625], + [88.6357421875, 23.55], + [88.69765625, 23.493017578125], + [88.7244140625, 23.25498046875], + [88.8970703125002, 23.210400390625], + [88.9281250000001, 23.18662109375], + [88.89970703125, 22.8435058593751], + [88.920703125, 22.63203125], + [89.05, 22.274609375], + [89.0279296875002, 21.93720703125], + [88.9493164062502, 21.9379394531251], + [89.05166015625, 21.6541015625], + [88.8575195312501, 21.744677734375], + [88.7450195312501, 21.584375], + [88.740234375, 22.005419921875], + [88.6416015625, 22.1219726562501], + [88.5846679687502, 21.6597167968749], + [88.44599609375, 21.6142578125001], + [88.2875000000002, 21.7582031250001], + [88.2537109375, 21.6223144531249], + [88.0568359375001, 21.694140625], + [88.1962890625, 22.13955078125], + [87.94140625, 22.37431640625], + [88.1592773437502, 22.1217285156251], + [87.82373046875, 21.72734375], + [87.2006835937501, 21.544873046875], + [86.9541015625001, 21.36533203125], + [86.8422851562501, 21.10634765625], + [86.9754882812501, 20.700146484375], + [86.7503906250001, 20.3132324218751], + [86.3765625000001, 20.00673828125], + [86.2452148437501, 20.05302734375], + [86.2794921875002, 19.9194335937499], + [85.575, 19.692919921875], + [85.496875, 19.6969238281251], + [85.5041015625, 19.8876953125001], + [85.2486328125001, 19.757666015625], + [85.1807617187502, 19.5948730468751], + [85.4416015624999, 19.6265625], + [84.7709960937501, 19.125390625], + [84.1041015625002, 18.29267578125], + [82.3595703125, 17.09619140625], + [82.2587890625001, 16.55986328125], + [81.7619140625002, 16.3294921875001], + [81.2861328125, 16.337060546875], + [80.9787109375, 15.7583496093751], + [80.6465820312501, 15.89501953125], + [80.2934570312501, 15.7107421875], + [80.0534179687501, 15.0740234374999], + [80.1787109375, 14.4783203125001], + [80.1117187500001, 14.21220703125], + [80.3065429687502, 13.4850585937501], + [80.15625, 13.7137695312501], + [80.0621093750001, 13.60625], + [80.3423828125001, 13.3613281250001], + [80.2291015625002, 12.69033203125], + [79.8584960937502, 11.98876953125], + [79.6931640625001, 11.3125488281249], + [79.7990234375, 11.3386718749999], + [79.8486328125001, 11.196875], + [79.83818359375, 10.32255859375], + [79.3145507812502, 10.2566894531249], + [78.9399414062501, 9.56577148437506], + [79.0199218750001, 9.33334960937496], + [79.41142578125, 9.19238281250001], + [78.9795898437502, 9.26855468750009], + [78.4214843750001, 9.10502929687499], + [78.19248046875, 8.89086914062506], + [78.0601562500001, 8.38457031249993], + [77.517578125, 8.07832031250007], + [77.06591796875, 8.31591796874999], + [76.5534179687501, 8.902783203125], + [76.3246093750002, 9.452099609375], + [76.2423828125, 9.92709960937495], + [76.3755859375001, 9.53989257812494], + [76.4587890625001, 9.53623046875008], + [76.346484375, 9.922119140625], + [76.19560546875, 10.0861328125], + [75.7238281250002, 11.361767578125], + [74.9455078125, 12.5645507812499], + [74.3822265625001, 14.4947265625], + [73.9492187500001, 15.0747558593751], + [73.8007812500001, 15.39697265625], + [73.9319335937501, 15.39697265625], + [73.7717773437501, 15.573046875], + [73.8328125000001, 15.659375], + [73.6798828125002, 15.7088867187501], + [73.47607421875, 16.054248046875], + [72.87548828125, 18.6428222656251], + [72.9720703125001, 19.1533203125], + [72.8346679687501, 18.9755859375001], + [72.8030273437501, 19.079296875], + [72.81162109375, 19.29892578125], + [72.98720703125, 19.2774414062501], + [72.7878906250001, 19.3629882812501], + [72.6677734375002, 19.8309570312501], + [72.89375, 20.6727539062501], + [72.8138671875001, 21.1171875000001], + [72.623828125, 21.3719726562501], + [72.7347656250002, 21.47080078125], + [72.6132812500001, 21.4618164062501], + [73.1125, 21.7504394531251], + [72.54306640625, 21.69658203125], + [72.7001953125, 21.9719238281249], + [72.5222656250001, 21.9762207031251], + [72.5530273437501, 22.1599609375001], + [72.8091796875, 22.2333007812501], + [72.1828125000002, 22.2697265625], + [72.3064453125, 22.189208984375], + [72.2744140625001, 22.08974609375], + [72.0372070312501, 21.823046875], + [72.2103515625, 21.72822265625], + [72.2540039062501, 21.531005859375], + [72.0152343750001, 21.1557128906251], + [71.0246093750001, 20.7388671875001], + [70.7193359375001, 20.7404296875001], + [70.12734375, 21.0946777343751], + [68.9699218750002, 22.290283203125], + [69.0516601562502, 22.4373046875001], + [69.2765625, 22.2854980468751], + [70.1772460937501, 22.57275390625], + [70.4892578125001, 23.0895019531251], + [70.3394531250001, 22.9397460937499], + [69.6646484375001, 22.7590820312501], + [69.2359375, 22.84853515625], + [68.6407226562501, 23.1899414062501], + [68.4174804687501, 23.571484375], + [68.7767578125, 23.852099609375], + [68.2349609375, 23.5969726562501], + [68.1650390625001, 23.85732421875], + [68.2825195312501, 23.927978515625], + [68.3812500000002, 23.9508789062501], + [68.4886718750001, 23.967236328125], + [68.5866210937501, 23.9666015625001], + [68.72412109375, 23.964697265625], + [68.7281250000001, 24.265625], + [68.7396484375002, 24.2919921875001], + [68.7589843749999, 24.3072265625], + [68.7811523437501, 24.3137207031251], + [68.8, 24.30908203125], + [68.8283203125, 24.2640136718751], + [68.8634765625002, 24.2665039062501], + [68.9007812500001, 24.292431640625], + [68.9845703125002, 24.273095703125], + [69.0515625000001, 24.286328125], + [69.1195312500001, 24.26865234375], + [69.2350585937499, 24.2682617187501], + [69.44345703125, 24.2753906250001], + [69.5591796875001, 24.273095703125], + [69.8051757812501, 24.165234375], + [70.0982421875, 24.2875], + [70.2890625000001, 24.3562988281251], + [70.54677734375, 24.4183105468751], + [70.5650390625001, 24.385791015625], + [70.5558593750002, 24.3311035156251], + [70.5792968750002, 24.2790527343749], + [70.6594726562501, 24.24609375], + [70.7163085937501, 24.2379882812501], + [70.7672851562501, 24.24541015625], + [70.8050781250001, 24.261962890625], + [70.8862304687501, 24.34375], + [70.9281250000002, 24.362353515625], + [70.9828125000001, 24.3610351562501], + [71.0440429687501, 24.4000976562501], + [71.0453125000001, 24.42998046875], + [70.9698242187501, 24.571875], + [70.9763671875001, 24.61875], + [71.0023437500002, 24.6539062499999], + [71.0478515625, 24.6877441406251], + [71.0207031250002, 24.7576660156249], + [70.9508789062502, 24.8916015625], + [70.8777343750002, 25.06298828125], + [70.65205078125, 25.4229003906251], + [70.6484375, 25.6669433593751], + [70.5695312500001, 25.70595703125], + [70.5058593750001, 25.6853027343751], + [70.4485351562501, 25.68134765625], + [70.2646484375001, 25.70654296875], + [70.1001953125001, 25.9100585937501], + [70.14921875, 26.34755859375], + [70.1146484375002, 26.548046875], + [69.47001953125, 26.804443359375], + [69.56796875, 27.1746093750001], + [69.8962890625001, 27.4736328125001], + [70.0498046875001, 27.6947265625], + [70.14453125, 27.8490234375], + [70.1939453125001, 27.8948730468749], + [70.2443359375, 27.9341308593751], + [70.4037109375, 28.025048828125], + [70.4885742187501, 28.0231445312501], + [70.6291015625002, 27.9374511718751], + [70.6916015625001, 27.768994140625], + [70.7979492187501, 27.709619140625], + [70.8749023437502, 27.714453125], + [71.184765625, 27.831640625], + [71.54296875, 27.869873046875], + [71.8703125000001, 27.9625], + [71.8888671875, 28.0474609374999], + [71.948046875, 28.1772949218751], + [72.1285156250001, 28.3463378906251], + [72.2919921875, 28.697265625], + [72.3418945312501, 28.7519042968751], + [72.9033203125, 29.028759765625], + [73.3816406250001, 29.934375], + [73.8091796875, 30.093359375], + [73.8865234375001, 30.1620117187501], + [73.9333984375, 30.2220703125001], + [73.9246093750001, 30.281640625], + [73.88271484375, 30.3521484375], + [73.89931640625, 30.4353515625], + [74.008984375, 30.519677734375], + [74.33935546875, 30.8935546874999], + [74.38037109375, 30.8934082031251], + [74.5097656250001, 30.9596679687501], + [74.6328125000001, 31.0346679687501], + [74.62578125, 31.0687500000001], + [74.6103515625001, 31.112841796875], + [74.5176757812501, 31.1855957031249], + [74.5349609375001, 31.2613769531251], + [74.5939453124999, 31.4653808593751], + [74.5818359375001, 31.5239257812501], + [74.5099609375002, 31.7129394531251], + [74.5259765625, 31.7651367187501], + [74.5555664062501, 31.8185546875001], + [74.6357421875, 31.88974609375], + [74.7394531250002, 31.948828125], + [75.0714843750002, 32.08935546875], + [75.13876953125, 32.10478515625], + [75.2541015625, 32.1403320312501], + [75.33349609375, 32.27919921875], + [75.3222134823302, 32.2851635667897] + ] + ] + ] + }, + "properties": { + "name": "India", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [72.4919921875, -7.37744140625], + [72.4291015625, -7.4353515625], + [72.34970703125, -7.26337890625001], + [72.447265625, -7.39570312500001], + [72.44560546875, -7.22041015625001], + [72.4919921875, -7.37744140625] + ] + ] + }, + "properties": { + "name": "Br. Indian Ocean Ter.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-9.94819335937493, 53.913134765625], + [-10.2657226562499, 53.977685546875], + [-9.99638671874996, 54.00361328125], + [-9.94819335937493, 53.913134765625] + ] + ], + [ + [ + [-6.218017578125, 54.0887207031251], + [-6.34760742187493, 53.9413085937501], + [-6.02739257812499, 52.927099609375], + [-6.46318359374993, 52.345361328125], + [-6.325, 52.2466796875], + [-6.890234375, 52.159228515625], + [-6.96577148437493, 52.24951171875], + [-8.05781249999993, 51.8255859375001], + [-8.4091796875, 51.88876953125], + [-8.34912109374994, 51.739306640625], + [-8.81342773437493, 51.584912109375], + [-9.73730468749994, 51.47373046875], + [-9.52490234375003, 51.681103515625], + [-10.120751953125, 51.6006835937501], + [-9.59882812499998, 51.8744140625001], + [-10.3410644531249, 51.79892578125], + [-9.90966796874997, 52.12294921875], + [-10.3902343749999, 52.134912109375], + [-10.356689453125, 52.20693359375], + [-9.77211914062494, 52.25009765625], + [-9.90605468749996, 52.4037109375], + [-9.63222656249994, 52.546923828125], + [-8.78344726562494, 52.679638671875], + [-8.99028320312499, 52.755419921875], + [-9.17539062499995, 52.634912109375], + [-9.91660156249998, 52.5697265625001], + [-9.46489257812496, 52.823193359375], + [-9.29921874999997, 53.09755859375], + [-8.93012695312498, 53.207080078125], + [-9.51420898437496, 53.238232421875], + [-10.0912597656249, 53.412841796875], + [-10.1169921874999, 53.54853515625], + [-9.72065429687493, 53.6044921875], + [-9.90161132812494, 53.727197265625], + [-9.57822265624995, 53.805419921875], + [-9.578857421875, 53.879833984375], + [-9.9140625, 53.863720703125], + [-9.85644531249997, 54.095361328125], + [-10.09267578125, 54.15576171875], + [-10.0563964843749, 54.2578125000001], + [-8.54555664062499, 54.2412109375], + [-8.62314453124998, 54.346875], + [-8.13344726562497, 54.6408203125], + [-8.76391601562497, 54.681201171875], + [-8.37729492187498, 54.889453125], + [-8.27460937499996, 55.1462890625], + [-7.66708984374998, 55.256494140625], + [-7.65874023437496, 54.970947265625], + [-7.30878906250001, 55.3658203125], + [-6.96166992187497, 55.2378906250001], + [-7.21865234374994, 55.0919921875], + [-7.55039062499992, 54.76796875], + [-7.91059570312496, 54.69833984375], + [-7.75439453125, 54.594921875], + [-8.11826171874998, 54.4142578125], + [-7.60654296875001, 54.14384765625], + [-7.32451171875002, 54.133447265625], + [-7.00771484374994, 54.406689453125], + [-6.64980468749994, 54.058642578125], + [-6.218017578125, 54.0887207031251] + ] + ] + ] + }, + "properties": { + "name": "Ireland", + "childNum": 2 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [56.18798828125, 26.921142578125], + [55.954296875, 26.701123046875], + [55.3115234375, 26.592626953125], + [55.7625976562501, 26.811962890625], + [55.7576171875, 26.9476562500001], + [56.27939453125, 26.952099609375], + [56.18798828125, 26.921142578125] + ] + ], + [ + [ + [46.1144531250001, 38.877783203125], + [46.490625, 38.906689453125], + [47.9958984375001, 39.683935546875], + [48.32216796875, 39.399072265625], + [48.1043945312501, 39.24111328125], + [48.29208984375, 39.01884765625], + [47.996484375, 38.853759765625], + [48.5926757812501, 38.411083984375], + [48.86875, 38.435498046875], + [48.9599609375, 37.89013671875], + [49.1711914062501, 37.6005859375], + [50.13046875, 37.40712890625], + [50.533203125, 37.0136718750001], + [51.1185546875001, 36.742578125], + [52.19013671875, 36.6217285156251], + [53.7676757812501, 36.930322265625], + [53.9154296875001, 36.930322265625], + [53.6794921875, 36.853125], + [53.9701171875, 36.818310546875], + [53.9141601562501, 37.3435546875], + [54.6994140625001, 37.470166015625], + [54.90009765625, 37.7779296875001], + [55.380859375, 38.051123046875], + [56.2720703125, 38.080419921875], + [56.440625, 38.2494140625], + [57.1935546875001, 38.21640625], + [57.3537109375, 37.97333984375], + [58.26162109375, 37.6658203125], + [58.8154296875, 37.68349609375], + [59.3017578125, 37.5106445312501], + [59.45498046875, 37.25283203125], + [60.06279296875, 36.962890625], + [60.34130859375, 36.637646484375], + [61.11962890625, 36.642578125], + [61.21201171875, 36.19052734375], + [61.1529296875001, 35.9767578125], + [61.2521484375, 35.867626953125], + [61.26201171875, 35.619580078125], + [61.2818359375001, 35.55341796875], + [61.2785156250001, 35.51376953125], + [61.2455078125, 35.474072265625], + [61.1892578125, 35.31201171875], + [61.1, 35.272314453125], + [61.080078125, 34.8556152343751], + [60.951171875, 34.653857421875], + [60.91474609375, 34.633984375], + [60.8023437500001, 34.554638671875], + [60.739453125, 34.5447265625], + [60.7262695312501, 34.51826171875], + [60.7361328125001, 34.491796875], + [60.7625976562501, 34.475244140625], + [60.889453125, 34.3194335937501], + [60.64267578125, 34.307177734375], + [60.4857421875001, 34.094775390625], + [60.4859375, 33.7119140625], + [60.5738281250001, 33.588330078125], + [60.9169921875, 33.505224609375], + [60.560546875, 33.137841796875], + [60.5765625, 32.994873046875], + [60.71044921875, 32.6], + [60.829296875, 32.2494140625001], + [60.8272460937501, 32.16796875], + [60.78994140625, 31.987109375], + [60.7875, 31.877197265625], + [60.7916015625, 31.660595703125], + [60.820703125, 31.495166015625], + [60.8541015625, 31.483251953125], + [61.1107421875, 31.451123046875], + [61.3464843750001, 31.421630859375], + [61.66015625, 31.382421875], + [61.7550781250001, 31.285302734375], + [61.8142578125001, 31.07255859375], + [61.8108398437501, 30.91328125], + [61.7841796875, 30.83193359375], + [61.5594726562501, 30.599365234375], + [61.3316406250001, 30.363720703125], + [60.8433593750001, 29.85869140625], + [61.0341796875, 29.663427734375], + [61.1521484375, 29.542724609375], + [61.8898437500001, 28.546533203125], + [62.7625, 28.20205078125], + [62.78232421875, 27.800537109375], + [62.752734375, 27.265625], + [63.166796875, 27.252490234375], + [63.19609375, 27.2439453125], + [63.25625, 27.2079101562501], + [63.3015625, 27.15146484375], + [63.30517578125, 27.124560546875], + [63.24208984375, 27.077685546875], + [63.250390625, 26.8792480468751], + [63.2416015625001, 26.86474609375], + [63.1861328125001, 26.83759765625], + [63.16806640625, 26.665576171875], + [62.3123046875, 26.490869140625], + [62.2393554687501, 26.35703125], + [62.1259765625, 26.368994140625], + [61.8423828125, 26.225927734375], + [61.8099609375, 26.165283203125], + [61.78076171875, 25.995849609375], + [61.75439453125, 25.8433593750001], + [61.7376953125, 25.82109375], + [61.66865234375, 25.768994140625], + [61.6618164062501, 25.75126953125], + [61.67138671875, 25.6923828125], + [61.64013671875, 25.584619140625], + [61.6154296875, 25.2861328125], + [61.587890625, 25.20234375], + [61.53310546875, 25.1955078125], + [61.4122070312501, 25.102099609375], + [60.6638671875, 25.2822265625], + [60.510546875, 25.437060546875], + [60.4001953125, 25.3115722656251], + [59.4560546875, 25.481494140625], + [59.0460937500001, 25.41728515625], + [58.7978515625, 25.55458984375], + [57.3345703125, 25.7915527343751], + [57.0360351562501, 26.8006835937501], + [56.728125, 27.1276855468751], + [56.11806640625, 27.143115234375], + [54.75927734375, 26.505078125], + [54.2470703125, 26.696630859375], + [53.70576171875, 26.7255859375], + [52.6916015625, 27.323388671875], + [52.4758789062501, 27.61650390625], + [52.03076171875, 27.8244140625], + [51.5890625, 27.864208984375], + [51.27890625, 28.13134765625], + [51.06201171875, 28.726123046875], + [50.8669921875, 28.870166015625], + [50.87578125, 29.0626953125], + [50.6751953125001, 29.14658203125], + [50.649609375, 29.420068359375], + [50.1689453125, 29.921240234375], + [50.0715820312501, 30.19853515625], + [49.5548828125, 30.028955078125], + [49.028125, 30.333447265625], + [49.22451171875, 30.472314453125], + [49.001953125, 30.50654296875], + [48.919140625, 30.1208984375], + [48.5464843750001, 29.962353515625], + [48.478515625, 30.00380859375], + [48.4345703125, 30.03759765625], + [48.3310546875, 30.28544921875], + [48.01494140625, 30.465625], + [48.0106445312501, 30.989794921875], + [47.6794921875001, 31.002392578125], + [47.6794921875001, 31.4005859375], + [47.75390625, 31.6013671875], + [47.82998046875, 31.79443359375], + [47.71455078125, 31.93642578125], + [47.5915039062501, 32.08798828125], + [47.5119140625, 32.150830078125], + [47.3297851562501, 32.455517578125], + [47.28515625, 32.4740234375], + [47.1213867187501, 32.4666015625], + [46.569921875, 32.833935546875], + [46.3770507812501, 32.929248046875], + [46.2982421875001, 32.950244140625], + [46.11279296875, 32.957666015625], + [46.09306640625, 32.97587890625], + [46.08046875, 33.02822265625], + [46.0807617187501, 33.0865234375001], + [46.14111328125, 33.1744140625], + [46.1458984375, 33.229638671875], + [46.0199218750001, 33.41572265625], + [45.3970703125001, 33.970849609375], + [45.5427734375001, 34.21552734375], + [45.459375, 34.470361328125], + [45.50078125, 34.581591796875], + [45.6375, 34.573828125], + [45.678125, 34.7984375], + [45.9208984375, 35.028515625], + [46.041796875, 35.0801757812501], + [46.1337890625, 35.12763671875], + [46.1546875000001, 35.196728515625], + [46.1121093750001, 35.3216796875001], + [45.9710937500001, 35.524169921875], + [46.03740234375, 35.67314453125], + [46.1809570312501, 35.711376953125], + [46.2625, 35.7441406250001], + [46.2734375, 35.7732421875], + [46.16748046875, 35.820556640625], + [45.7763671875, 35.821826171875], + [45.36162109375, 36.01533203125], + [45.24111328125, 36.35595703125], + [45.20654296875, 36.39716796875], + [45.1552734375, 36.407373046875], + [45.1124023437501, 36.40927734375], + [45.053125, 36.471630859375], + [44.76513671875, 37.142431640625], + [44.794140625, 37.290380859375], + [44.5740234375001, 37.435400390625], + [44.58994140625, 37.7103515625], + [44.211328125, 37.908056640625], + [44.4499023437501, 38.3342285156251], + [44.2985351562501, 38.386279296875], + [44.2716796875, 38.8360351562501], + [44.0232421875, 39.3774414062501], + [44.3893554687501, 39.422119140625], + [44.587109375, 39.7685546875001], + [44.8171875, 39.650439453125], + [45.4796875000001, 39.00625], + [46.1144531250001, 38.877783203125] + ] + ] + ] + }, + "properties": { + "name": "Iran", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [45.6375, 34.573828125], + [45.50078125, 34.581591796875], + [45.459375, 34.470361328125], + [45.5427734375, 34.21552734375], + [45.3970703125, 33.970849609375], + [46.019921875, 33.41572265625], + [46.1458984375, 33.229638671875], + [46.14111328125, 33.1744140625], + [46.08076171875, 33.0865234375], + [46.08046875, 33.02822265625], + [46.09306640625, 32.97587890625], + [46.11279296875, 32.957666015625], + [46.37705078125, 32.929248046875], + [46.569921875, 32.833935546875], + [47.12138671875, 32.4666015625], + [47.28515625, 32.4740234375], + [47.32978515625, 32.455517578125], + [47.5119140625, 32.150830078125], + [47.59150390625, 32.08798828125], + [47.71455078125, 31.93642578125], + [47.82998046875, 31.79443359375], + [47.75390625, 31.6013671875], + [47.6794921875, 31.4005859375], + [47.6794921875, 31.002392578125], + [48.01064453125, 30.989794921875], + [48.01494140625, 30.465625], + [48.3310546875, 30.28544921875], + [48.546484375, 29.962353515625], + [48.45419921875, 29.9384765625], + [48.35458984375, 29.95673828125], + [48.14169921875, 30.04091796875], + [47.98251953125, 30.011328125], + [47.9787109375, 29.9828125], + [47.64375, 30.097314453125], + [47.1482421875, 30.0009765625], + [46.905859375, 29.5375], + [46.7693359375, 29.3474609375], + [46.69375, 29.25966796875], + [46.5314453125, 29.096240234375], + [46.3564453125, 29.063671875], + [44.71650390625, 29.193603515625], + [43.77373046875, 29.84921875], + [42.0744140625, 31.08037109375], + [40.47890625, 31.893359375], + [40.3693359375, 31.93896484375], + [40.02783203125, 31.99501953125], + [39.7041015625, 32.042529296875], + [39.14541015625, 32.12451171875], + [39.2927734375, 32.24384765625], + [39.2474609375, 32.3509765625], + [39.04140625, 32.3056640625], + [38.77353515625, 33.372216796875], + [40.98701171875, 34.429052734375], + [41.1947265625, 34.768994140625], + [41.3541015625, 35.6404296875], + [41.29599609375, 36.383349609375], + [41.416796875, 36.5146484375], + [41.78857421875, 36.59716796875], + [42.358984375, 37.10859375], + [42.455859375, 37.1287109375], + [42.63544921875, 37.249267578125], + [42.74111328125, 37.3619140625], + [42.774609375, 37.371875], + [42.869140625, 37.334912109375], + [42.93662109375, 37.324755859375], + [43.09248046875, 37.3673828125], + [43.67578125, 37.22724609375], + [43.83642578125, 37.22353515625], + [44.01318359375, 37.313525390625], + [44.114453125, 37.30185546875], + [44.15625, 37.282958984375], + [44.191796875, 37.249853515625], + [44.2083984375, 37.20263671875], + [44.20166015625, 37.051806640625], + [44.2818359375, 36.97802734375], + [44.3255859375, 37.0107421875], + [44.401953125, 37.05849609375], + [44.60595703125, 37.176025390625], + [44.6693359375, 37.173583984375], + [44.73095703125, 37.165283203125], + [44.76513671875, 37.142431640625], + [45.053125, 36.471630859375], + [45.11240234375, 36.40927734375], + [45.1552734375, 36.407373046875], + [45.20654296875, 36.39716796875], + [45.24111328125, 36.35595703125], + [45.36162109375, 36.01533203125], + [45.7763671875, 35.821826171875], + [46.16748046875, 35.820556640625], + [46.2734375, 35.7732421875], + [46.2625, 35.744140625], + [46.18095703125, 35.711376953125], + [46.03740234375, 35.67314453125], + [45.97109375, 35.524169921875], + [46.112109375, 35.3216796875], + [46.1546875, 35.196728515625], + [46.1337890625, 35.12763671875], + [46.041796875, 35.08017578125], + [45.9208984375, 35.028515625], + [45.678125, 34.7984375], + [45.6375, 34.573828125] + ] + ] + }, + "properties": { + "name": "Iraq", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-15.543115234375, 66.228515625], + [-14.595849609375, 66.38154296875], + [-15.1173828125, 66.125634765625], + [-14.698193359375, 66.02021484375], + [-14.827099609375, 65.7642578125], + [-14.391845703125, 65.78740234375], + [-14.473388671875, 65.575341796875], + [-14.166943359375, 65.64228515625], + [-13.61787109375, 65.5193359375], + [-13.80478515625, 65.35478515625], + [-13.59931640625, 65.0359375], + [-14.04443359375, 64.74189453125], + [-14.385107421875, 64.74521484375], + [-14.475390625, 64.493994140625], + [-14.927392578125, 64.319677734375], + [-15.83291015625, 64.17666015625], + [-16.64033203125, 63.865478515625], + [-17.81572265625, 63.71298828125], + [-17.946923828125, 63.5357421875], + [-18.65361328125, 63.406689453125], + [-20.19814453125, 63.555810546875], + [-20.49404296875, 63.687353515625], + [-20.41396484375, 63.80517578125], + [-20.650927734375, 63.73740234375], + [-21.152392578125, 63.94453125], + [-22.652197265625, 63.827734375], + [-22.701171875, 64.083203125], + [-22.51005859375, 63.991455078125], + [-22.18759765625, 64.039208984375], + [-21.463330078125, 64.379150390625], + [-22.053369140625, 64.313916015625], + [-21.950341796875, 64.514990234375], + [-21.590625, 64.6263671875], + [-22.106005859375, 64.533056640625], + [-22.467041015625, 64.794970703125], + [-23.818994140625, 64.73916015625], + [-24.026171875, 64.863427734375], + [-22.7880859375, 65.046484375], + [-21.892138671875, 65.048779296875], + [-21.77998046875, 65.1876953125], + [-22.50908203125, 65.19677734375], + [-21.844384765625, 65.44736328125], + [-22.902490234375, 65.58046875], + [-23.89990234375, 65.407568359375], + [-24.47568359375, 65.5251953125], + [-24.24892578125, 65.614990234375], + [-23.85673828125, 65.53837890625], + [-24.092626953125, 65.77646484375], + [-23.61591796875, 65.67958984375], + [-23.2853515625, 65.75], + [-23.8326171875, 65.84921875], + [-23.524951171875, 65.880029296875], + [-23.77734375, 66.017578125], + [-23.43447265625, 66.02421875], + [-23.4525390625, 66.181005859375], + [-23.018994140625, 65.98212890625], + [-22.65986328125, 66.025927734375], + [-22.616015625, 65.86748046875], + [-22.44169921875, 65.90830078125], + [-22.4453125, 66.07001953125], + [-22.947900390625, 66.212744140625], + [-22.484423828125, 66.26630859375], + [-23.116943359375, 66.338720703125], + [-22.9443359375, 66.429443359375], + [-22.426123046875, 66.430126953125], + [-21.406884765625, 66.0255859375], + [-21.37490234375, 65.74189453125], + [-21.658447265625, 65.723583984375], + [-21.1296875, 65.2666015625], + [-20.804345703125, 65.63642578125], + [-20.454833984375, 65.571044921875], + [-20.20751953125, 66.10009765625], + [-19.489697265625, 65.76806640625], + [-19.382958984375, 66.07568359375], + [-18.8458984375, 66.183935546875], + [-18.141943359375, 65.73408203125], + [-18.29716796875, 66.157421875], + [-17.906982421875, 66.143310546875], + [-17.550439453125, 65.964404296875], + [-17.15302734375, 66.20283203125], + [-16.838037109375, 66.125244140625], + [-16.485009765625, 66.195947265625], + [-16.540673828125, 66.446728515625], + [-16.24931640625, 66.522900390625], + [-15.985400390625, 66.5146484375], + [-15.543115234375, 66.228515625] + ] + ] + }, + "properties": { + "name": "Iceland", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [35.7873046875, 32.734912109375], + [35.5728515625, 32.640869140625], + [35.56904296875, 32.619873046875], + [35.55146484375, 32.3955078125], + [35.484375, 32.40166015625], + [35.40263671875, 32.450634765625], + [35.38671875, 32.493017578125], + [35.30380859375, 32.512939453125], + [35.19326171875, 32.534423828125], + [35.0650390625, 32.46044921875], + [35.010546875, 32.33818359375], + [34.95595703125, 32.1609375], + [34.98974609375, 31.91328125], + [34.9783203125, 31.86640625], + [34.95380859375, 31.841259765625], + [34.9611328125, 31.82333984375], + [34.9830078125, 31.816796875], + [35.05322265625, 31.837939453125], + [35.1271484375, 31.816748046875], + [35.2037109375, 31.75], + [34.9509765625, 31.602294921875], + [34.88046875, 31.3681640625], + [35.4505859375, 31.479296875], + [34.9734375, 29.555029296875], + [34.904296875, 29.47734375], + [34.2453125, 31.20830078125], + [34.34833984375, 31.292919921875], + [34.3501953125, 31.362744140625], + [34.5255859375, 31.525634765625], + [34.47734375, 31.58486328125], + [34.483984375, 31.59228515625], + [34.67841796875, 31.895703125], + [35.10859375, 33.08369140625], + [35.41123046875, 33.07568359375], + [35.869140625, 33.43173828125], + [35.9134765625, 32.949609375], + [35.7873046875, 32.734912109375] + ] + ] + }, + "properties": { + "name": "Israel", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [15.5765625000001, 38.2203125], + [15.09951171875, 37.45859375], + [15.295703125, 37.05517578125], + [15.11259765625, 36.687841796875], + [14.50185546875, 36.798681640625], + [14.14296875, 37.103662109375], + [13.90546875, 37.100634765625], + [13.169921875, 37.479296875], + [12.640234375, 37.5943359375], + [12.435546875, 37.819775390625], + [12.734375, 38.183056640625], + [12.902734375, 38.03486328125], + [13.29111328125, 38.191455078125], + [13.7888671875, 37.981201171875], + [15.11875, 38.152734375], + [15.49873046875, 38.290869140625], + [15.5765625000001, 38.2203125] + ] + ], + [ + [ + [8.47890625000002, 39.067529296875], + [8.42148437500003, 38.96865234375], + [8.366796875, 39.11591796875], + [8.47890625000002, 39.067529296875] + ] + ], + [ + [ + [8.28603515625008, 41.03984375], + [8.20566406250003, 40.9974609375001], + [8.32021484375002, 41.121875], + [8.28603515625008, 41.03984375] + ] + ], + [ + [ + [9.63203125000001, 40.88203125], + [9.80527343750006, 40.499560546875], + [9.64296875000002, 40.268408203125], + [9.5625, 39.1660156250001], + [9.05634765625007, 39.23916015625], + [8.96660156250007, 38.963720703125], + [8.64853515625003, 38.9265625], + [8.41816406250007, 39.205712890625], + [8.54775390625002, 39.8392089843751], + [8.4078125, 39.917236328125], + [8.47128906250006, 40.29267578125], + [8.18994140625003, 40.651611328125], + [8.22421875, 40.913330078125], + [8.571875, 40.8501953125001], + [9.22841796875002, 41.257080078125], + [9.61533203124998, 41.01728515625], + [9.63203125000001, 40.88203125] + ] + ], + [ + [ + [10.3951171875, 42.858154296875], + [10.4193359375, 42.71318359375], + [10.13125, 42.742041015625], + [10.3951171875, 42.858154296875] + ] + ], + [ + [ + [13.42099609375, 46.2123046875], + [13.63251953125, 46.17705078125], + [13.6349609375, 46.157763671875], + [13.6166015625001, 46.13310546875], + [13.548046875, 46.089111328125], + [13.48642578125, 46.03955078125], + [13.4802734375, 46.009228515625], + [13.4876953125, 45.987109375], + [13.5091796875001, 45.973779296875], + [13.6005859375, 45.97978515625], + [13.6634765625, 45.7919921875], + [13.83115234375, 45.680419921875], + [13.7198242187501, 45.58759765625], + [13.6283203125001, 45.770947265625], + [13.2063476562501, 45.77138671875], + [12.2743164062501, 45.446044921875], + [12.22568359375, 45.24150390625], + [12.5234375, 44.96796875], + [12.24833984375, 44.722509765625], + [12.3962890625001, 44.223876953125], + [13.56416015625, 43.5712890625], + [14.01044921875, 42.6895507812501], + [14.54072265625, 42.244287109375], + [15.16875, 41.934033203125], + [16.1646484375, 41.89619140625], + [15.90048828125, 41.512060546875], + [17.95498046875, 40.65517578125], + [18.46064453125, 40.221044921875], + [18.34375, 39.82138671875], + [18.0779296875, 39.936962890625], + [17.8650390625001, 40.28017578125], + [17.39580078125, 40.340234375], + [17.17998046875, 40.502783203125], + [16.92822265625, 40.458056640625], + [16.521875, 39.74755859375], + [17.11455078125, 39.380615234375], + [17.174609375, 38.998095703125], + [16.61669921875, 38.800146484375], + [16.54560546875, 38.40908203125], + [16.0568359375, 37.941845703125], + [15.7245117187501, 37.939111328125], + [15.64580078125, 38.034228515625], + [15.87890625, 38.613916015625], + [16.19677734375, 38.759228515625], + [16.2099609375, 38.94111328125], + [15.6927734375, 39.990185546875], + [14.95087890625, 40.239013671875], + [14.9476562500001, 40.4693359375], + [14.7657226562501, 40.668408203125], + [14.33994140625, 40.598828125], + [14.4605468750001, 40.7287109375], + [14.0443359375001, 40.8122558593751], + [13.7333984375001, 41.23564453125], + [13.0886718750001, 41.24384765625], + [12.630859375, 41.469677734375], + [11.6373046875001, 42.287548828125], + [11.1412109375, 42.389892578125], + [11.1677734375001, 42.5351562500001], + [10.7083984375, 42.936328125], + [10.51484375, 42.967529296875], + [10.1880859375001, 43.947509765625], + [8.76582031250004, 44.422314453125], + [8.00498046875001, 43.8767578125], + [7.4931640625, 43.767138671875], + [7.63720703125006, 44.16484375], + [7.31855468750007, 44.13798828125], + [6.90019531249999, 44.3357421875], + [6.99267578125, 44.827294921875], + [6.63476562500003, 45.0681640625], + [7.07832031250004, 45.23994140625], + [7.14638671875005, 45.38173828125], + [6.79091796875002, 45.740869140625], + [7.02109375000003, 45.92578125], + [7.05576171874998, 45.90380859375], + [7.12900390624998, 45.880419921875], + [7.32792968750002, 45.912353515625], + [7.9931640625, 46.01591796875], + [8.08154296875006, 46.256005859375], + [8.23193359375006, 46.3412109375], + [8.29853515625004, 46.40341796875], + [8.370703125, 46.4451171875], + [8.45839843750002, 46.2458984375], + [8.81855468750001, 46.0771484375], + [8.82675781250001, 46.06103515625], + [8.77802734375004, 45.99619140625], + [8.95371093750003, 45.830029296875], + [9.02373046875007, 45.845703125], + [9.20341796875002, 46.21923828125], + [9.30439453125007, 46.495556640625], + [9.39931640625002, 46.4806640625], + [9.42763671875002, 46.48232421875], + [9.52871093750002, 46.306201171875], + [9.57958984375, 46.29609375], + [9.63945312500002, 46.2958984375], + [9.78779296875004, 46.346044921875], + [9.88447265625001, 46.3677734375001], + [9.93925781250007, 46.36181640625], + [10.041015625, 46.2380859375], + [10.08056640625, 46.227978515625], + [10.1283203125001, 46.238232421875], + [10.1096679687501, 46.362841796875], + [10.08193359375, 46.420751953125], + [10.0456054687501, 46.4479003906251], + [10.03828125, 46.483203125], + [10.0612304687501, 46.54677734375], + [10.0870117187501, 46.59990234375], + [10.1375, 46.61435546875], + [10.1955078125001, 46.62109375], + [10.4306640625, 46.550048828125], + [10.4093526785715, 46.6092047991071], + [10.39794921875, 46.6650390625001], + [10.4060546875, 46.73486328125], + [10.45283203125, 46.86494140625], + [10.4793945312501, 46.8551269531251], + [10.57978515625, 46.8537109375], + [10.6892578125, 46.84638671875], + [10.759765625, 46.793310546875], + [10.82890625, 46.775244140625], + [10.92734375, 46.769482421875], + [10.99326171875, 46.777001953125], + [11.02509765625, 46.79697265625], + [11.0634765625001, 46.859130859375], + [11.13388671875, 46.9361816406251], + [11.24443359375, 46.97568359375], + [11.4332031250001, 46.983056640625], + [11.5275390625, 46.997412109375], + [11.77568359375, 46.986083984375], + [12.16943359375, 47.08212890625], + [12.1971679687501, 47.075], + [12.20126953125, 47.060888671875], + [12.16552734375, 47.028173828125], + [12.1307617187501, 46.984765625], + [12.1541015625, 46.93525390625], + [12.26796875, 46.835888671875], + [12.330078125, 46.759814453125], + [12.38828125, 46.70263671875], + [12.47919921875, 46.672509765625], + [13.16875, 46.57265625], + [13.3515625, 46.55791015625], + [13.4900390625, 46.55556640625], + [13.7, 46.520263671875], + [13.6796875000001, 46.462890625], + [13.6371093750001, 46.44853515625], + [13.56328125, 46.415087890625], + [13.39951171875, 46.317529296875], + [13.42099609375, 46.2123046875] + ] + ] + ] + }, + "properties": { + "name": "Italy", + "childNum": 6 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-77.261474609375, 18.457421875], + [-76.349853515625, 18.15185546875], + [-76.210791015625, 17.913525390625], + [-76.524609375, 17.8662109375], + [-76.85322265625, 17.97373046875], + [-76.944140625, 17.848779296875], + [-77.119482421875, 17.880078125], + [-77.20498046875, 17.71494140625], + [-77.36142578125, 17.83369140625], + [-77.7681640625, 17.877392578125], + [-78.044482421875, 18.173828125], + [-78.339501953125, 18.28720703125], + [-78.21669921875, 18.448095703125], + [-77.8734375, 18.522216796875], + [-77.261474609375, 18.457421875] + ] + ] + }, + "properties": { + "name": "Jamaica", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-2.01865234374998, 49.23125], + [-2.23583984375, 49.1763671875], + [-2.22050781249999, 49.266357421875], + [-2.01865234374998, 49.23125] + ] + ] + }, + "properties": { + "name": "Jersey", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [39.14541015625, 32.12451171875], + [38.9970703125, 32.007470703125], + [38.9623046875, 31.994921875], + [38.37548828125, 31.8474609375], + [38.11142578125, 31.78115234375], + [37.493359375, 31.62587890625], + [37.215625, 31.556103515625], + [36.95859375, 31.49150390625], + [37.980078125, 30.5], + [37.862890625, 30.442626953125], + [37.6697265625, 30.34814453125], + [37.64990234375, 30.33095703125], + [37.63359375, 30.31328125], + [37.55361328125, 30.144580078125], + [37.49072265625, 30.01171875], + [37.46923828125, 29.995068359375], + [36.7552734375, 29.866015625], + [36.70390625, 29.831640625], + [36.591796875, 29.66611328125], + [36.47607421875, 29.4951171875], + [36.2828125, 29.35537109375], + [36.06845703125, 29.200537109375], + [34.95078125, 29.353515625], + [34.9734375, 29.555029296875], + [35.4505859375, 31.479296875], + [35.5720703125, 32.237890625], + [35.55146484375, 32.3955078125], + [35.56904296875, 32.619873046875], + [35.5728515625, 32.640869140625], + [35.7873046875, 32.734912109375], + [36.3720703125, 32.3869140625], + [36.818359375, 32.31728515625], + [38.77353515625, 33.372216796875], + [39.04140625, 32.3056640625], + [39.2474609375, 32.3509765625], + [39.2927734375, 32.24384765625], + [39.14541015625, 32.12451171875] + ] + ] + }, + "properties": { + "name": "Jordan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [123.888671875, 24.280126953125], + [123.67978515625, 24.3177734375], + [123.771484375, 24.414453125], + [123.93486328125, 24.36201171875], + [123.888671875, 24.280126953125] + ] + ], + [ + [ + [124.2931640625, 24.5159179687501], + [124.1357421875, 24.347607421875], + [124.084765625, 24.43583984375], + [124.301953125, 24.587109375], + [124.2931640625, 24.5159179687501] + ] + ], + [ + [ + [125.444140625, 24.7431640625], + [125.2689453125, 24.7325195312501], + [125.28359375, 24.871923828125], + [125.444140625, 24.7431640625] + ] + ], + [ + [ + [128.2587890625, 26.652783203125], + [127.86708984375, 26.44248046875], + [127.80361328125, 26.1525390625], + [127.653125, 26.0947265625], + [127.9072265625, 26.693603515625], + [128.09765625, 26.6677734375], + [128.2548828125, 26.881884765625], + [128.2587890625, 26.652783203125] + ] + ], + [ + [ + [128.99814453125, 27.72080078125], + [128.9, 27.727783203125], + [128.9076171875, 27.897998046875], + [128.99814453125, 27.72080078125] + ] + ], + [ + [ + [129.4525390625, 28.208984375], + [129.36640625, 28.127734375], + [129.1646484375, 28.249755859375], + [129.68955078125, 28.51748046875], + [129.4525390625, 28.208984375] + ] + ], + [ + [ + [130.62275390625, 30.26298828125], + [130.44560546875, 30.264697265625], + [130.3880859375, 30.38818359375], + [130.49716796875, 30.46552734375], + [130.6435546875, 30.38896484375], + [130.62275390625, 30.26298828125] + ] + ], + [ + [ + [130.959765625, 30.396923828125], + [130.8703125, 30.44423828125], + [131.0603515625, 30.828466796875], + [130.959765625, 30.396923828125] + ] + ], + [ + [ + [130.3810546875, 32.42373046875], + [130.24169921875, 32.46279296875], + [130.46142578125, 32.51572265625], + [130.3810546875, 32.42373046875] + ] + ], + [ + [ + [130.08251953125, 32.2296875], + [129.96015625, 32.24375], + [130.009765625, 32.521630859375], + [130.1677734375, 32.5412109375], + [130.19951171875, 32.3405761718751], + [130.08251953125, 32.2296875] + ] + ], + [ + [ + [128.66533203125, 32.78388671875], + [128.89453125, 32.6521484375], + [128.69296875, 32.6047363281251], + [128.66533203125, 32.78388671875] + ] + ], + [ + [ + [129.076953125, 32.840283203125], + [128.997265625, 32.95185546875], + [129.109765625, 33.132568359375], + [129.18193359375, 32.993115234375], + [129.076953125, 32.840283203125] + ] + ], + [ + [ + [129.491796875, 33.223046875], + [129.37041015625, 33.176025390625], + [129.569921875, 33.36103515625], + [129.491796875, 33.223046875] + ] + ], + [ + [ + [129.795703125, 33.748828125], + [129.6748046875, 33.739697265625], + [129.71728515625, 33.8583984375], + [129.795703125, 33.748828125] + ] + ], + [ + [ + [131.174609375, 33.602587890625], + [131.6962890625, 33.60283203125], + [131.53740234375, 33.274072265625], + [131.89658203125, 33.25458984375], + [131.8478515625, 33.11806640625], + [132.0021484375, 32.882373046875], + [131.6603515625, 32.465625], + [131.33720703125, 31.4046875], + [131.07080078125, 31.436865234375], + [131.0984375, 31.25615234375], + [130.6857421875, 31.01513671875], + [130.77626953125, 31.706298828125], + [130.655078125, 31.7184082031251], + [130.5560546875, 31.5630859375], + [130.58876953125, 31.178515625], + [130.20068359375, 31.29189453125], + [130.147265625, 31.40849609375], + [130.294140625, 31.45068359375], + [130.32197265625, 31.60146484375], + [130.187890625, 31.76884765625], + [130.19443359375, 32.090771484375], + [130.64052734375, 32.61923828125], + [130.4978515625, 32.65693359375], + [130.547265625, 32.831591796875], + [130.2375, 33.17763671875], + [130.12685546875, 33.1048339843751], + [130.175, 32.851318359375], + [130.32646484375, 32.85263671875], + [130.3404296875, 32.70185546875], + [130.0541015625, 32.77080078125], + [129.7685546875, 32.57099609375], + [129.8267578125, 32.725341796875], + [129.6791015625, 33.0599609375], + [129.99169921875, 32.8515625], + [129.580078125, 33.236279296875], + [129.61015625, 33.3436523437501], + [129.844140625, 33.32177734375], + [129.82568359375, 33.4370117187501], + [130.3650390625, 33.63447265625], + [130.4837890625, 33.834619140625], + [130.715625, 33.927783203125], + [130.953125, 33.872021484375], + [131.174609375, 33.602587890625] + ] + ], + [ + [ + [132.266015625, 33.945166015625], + [132.444921875, 33.91318359375], + [132.2087890625, 33.8728515625], + [132.266015625, 33.945166015625] + ] + ], + [ + [ + [129.2794921875, 34.123388671875], + [129.18642578125, 34.1450195312501], + [129.21484375, 34.320654296875], + [129.337109375, 34.284765625], + [129.2794921875, 34.123388671875] + ] + ], + [ + [ + [134.357421875, 34.25634765625], + [134.6375, 34.226611328125], + [134.7388671875, 33.8205078125], + [134.37705078125, 33.6083984375], + [134.181640625, 33.247216796875], + [133.95869140625, 33.4483398437501], + [133.63203125, 33.510986328125], + [133.2859375, 33.3599609375], + [132.97724609375, 32.8419921875], + [132.804296875, 32.752001953125], + [132.641796875, 32.762451171875], + [132.708984375, 32.9024902343751], + [132.4951171875, 32.9166015625], + [132.41279296875, 33.43046875], + [132.0326171875, 33.339990234375], + [132.64306640625, 33.68994140625], + [132.93515625, 34.0953125000001], + [133.19306640625, 33.933203125], + [133.58203125, 34.017138671875], + [133.60263671875, 34.24384765625], + [133.94833984375, 34.348046875], + [134.357421875, 34.25634765625] + ] + ], + [ + [ + [134.35185546875, 34.483642578125], + [134.25185546875, 34.423046875], + [134.18212890625, 34.51923828125], + [134.35185546875, 34.483642578125] + ] + ], + [ + [ + [134.9328125, 34.288134765625], + [134.8244140625, 34.2029296875], + [134.66787109375, 34.294140625], + [135.0046875, 34.54404296875], + [134.9328125, 34.288134765625] + ] + ], + [ + [ + [129.38564453125, 34.353662109375], + [129.26669921875, 34.3704589843751], + [129.45107421875, 34.686572265625], + [129.38564453125, 34.353662109375] + ] + ], + [ + [ + [133.3705078125, 36.203857421875], + [133.2392578125, 36.178759765625], + [133.20615234375, 36.293408203125], + [133.295703125, 36.34013671875], + [133.3705078125, 36.203857421875] + ] + ], + [ + [ + [138.34404296875, 37.822119140625], + [138.2251953125, 37.82939453125], + [138.25, 38.078466796875], + [138.50361328125, 38.3159179687501], + [138.45361328125, 38.0756835937501], + [138.5751953125, 38.06552734375], + [138.34404296875, 37.822119140625] + ] + ], + [ + [ + [141.229296875, 41.37265625], + [141.45546875, 41.404736328125], + [141.43046875, 40.72333984375], + [141.7970703125, 40.291162109375], + [141.976953125, 39.42880859375], + [141.90078125, 39.111328125], + [141.5462890625, 38.762841796875], + [141.46748046875, 38.404150390625], + [141.1083984375, 38.337939453125], + [140.962109375, 38.148876953125], + [141.00166015625, 37.1146484375], + [140.57353515625, 36.23134765625], + [140.8740234375, 35.7249511718751], + [140.457421875, 35.51025390625], + [140.3546875, 35.1814453125], + [139.8439453125, 34.914892578125], + [139.82646484375, 35.2966796875], + [140.096875, 35.58515625], + [139.834765625, 35.658056640625], + [139.65, 35.409130859375], + [139.675, 35.149267578125], + [139.4744140625, 35.29853515625], + [139.2494140625, 35.27802734375], + [139.08603515625, 34.83916015625], + [138.8375, 34.61923828125], + [138.802734375, 34.9748046875], + [138.90361328125, 35.0252441406251], + [138.71962890625, 35.124072265625], + [138.1890625, 34.596337890625], + [137.543359375, 34.6642089843751], + [137.06171875, 34.5828125], + [137.2751953125, 34.772509765625], + [136.96328125, 34.834912109375], + [136.8712890625, 34.73310546875], + [136.8970703125, 35.035546875], + [136.80419921875, 35.05029296875], + [136.5330078125, 34.678369140625], + [136.8802734375, 34.4335937500001], + [136.8537109375, 34.324072265625], + [136.3298828125, 34.1768554687501], + [135.9162109375, 33.56171875], + [135.6953125, 33.486962890625], + [135.45283203125, 33.5533691406251], + [135.1279296875, 34.006982421875], + [135.10009765625, 34.28837890625], + [135.41591796875, 34.61748046875], + [134.7400390625, 34.765234375], + [134.246875, 34.7138671875], + [133.96826171875, 34.527294921875], + [133.1423828125, 34.30244140625], + [132.65654296875, 34.24609375], + [132.31259765625, 34.324951171875], + [132.146484375, 33.83876953125], + [131.74052734375, 34.05205078125], + [130.91884765625, 33.975732421875], + [130.8892578125, 34.26181640625], + [131.00419921875, 34.392578125], + [131.35439453125, 34.4131835937501], + [132.92294921875, 35.511279296875], + [133.98125, 35.5072265625], + [135.17431640625, 35.7470703125], + [135.326953125, 35.525537109375], + [135.6802734375, 35.503125], + [135.903125, 35.606884765625], + [136.0953125, 35.767626953125], + [136.06748046875, 36.1168457031251], + [136.69814453125, 36.742041015625], + [136.84345703125, 37.38212890625], + [137.32265625, 37.5220703125], + [136.89990234375, 37.11767578125], + [137.01669921875, 36.83720703125], + [137.2462890625, 36.753173828125], + [137.5140625, 36.9515625], + [138.319921875, 37.218408203125], + [138.88505859375, 37.8439453125], + [139.3638671875, 38.0990234375], + [139.801953125, 38.881591796875], + [140.06474609375, 39.6244140625], + [139.9947265625, 39.855078125], + [139.74150390625, 39.920849609375], + [140.0111328125, 40.2603515625001], + [139.9228515625, 40.5984375], + [140.28125, 40.84609375], + [140.34443359375, 41.2033203125], + [140.62763671875, 41.19541015625], + [140.7486328125, 40.830322265625], + [140.93603515625, 40.940771484375], + [141.1185546875, 40.882275390625], + [141.24423828125, 41.205615234375], + [140.8005859375, 41.138818359375], + [140.80185546875, 41.253662109375], + [140.9369140625, 41.50556640625], + [141.229296875, 41.37265625] + ] + ], + [ + [ + [139.48125, 42.081005859375], + [139.43134765625, 42.199560546875], + [139.5583984375, 42.235205078125], + [139.48125, 42.081005859375] + ] + ], + [ + [ + [141.29541015625, 45.1193359375], + [141.1453125, 45.15390625], + [141.19375, 45.2478515625], + [141.29541015625, 45.1193359375] + ] + ], + [ + [ + [141.07275390625, 45.332861328125], + [141.033984375, 45.2693359375], + [140.9716796875, 45.465478515625], + [141.07275390625, 45.332861328125] + ] + ], + [ + [ + [143.82431640625, 44.1169921875], + [144.715234375, 43.927978515625], + [145.36953125, 44.3273925781251], + [145.1396484375, 43.6625], + [145.3408203125, 43.3025390625], + [145.8330078125, 43.3859375], + [144.92138671875, 43.000927734375], + [143.9693359375, 42.881396484375], + [143.4294921875, 42.418896484375], + [143.2365234375, 42.0001953125], + [141.8513671875, 42.579052734375], + [141.406640625, 42.546923828125], + [140.9861328125, 42.342138671875], + [140.709765625, 42.555615234375], + [140.48046875, 42.559375], + [140.32666015625, 42.293359375], + [141.1509765625, 41.805078125], + [140.99951171875, 41.7374023437501], + [140.65986328125, 41.815576171875], + [140.3849609375, 41.519287109375], + [140.08515625, 41.43408203125], + [139.9953125, 41.576416015625], + [140.1083984375, 41.912939453125], + [139.83544921875, 42.278076171875], + [139.86015625, 42.58173828125], + [140.4322265625, 42.9541015625001], + [140.3923828125, 43.303125], + [141.13818359375, 43.1799316406251], + [141.37412109375, 43.279638671875], + [141.7609375, 44.48251953125], + [141.5830078125, 45.15595703125], + [141.66796875, 45.40126953125], + [141.9376953125, 45.509521484375], + [142.884765625, 44.6701171875], + [143.82431640625, 44.1169921875] + ] + ] + ] + }, + "properties": { + "name": "Japan", + "childNum": 28 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [77.0486328125, 35.109912109375], + [76.927734375, 35.346630859375], + [76.8822265625, 35.4357421875], + [76.81279296875, 35.571826171875], + [76.76689453125, 35.66171875], + [76.87890625, 35.61328125], + [77.0900390625, 35.55205078125], + [77.29482421875, 35.508154296875], + [77.446484375, 35.4755859375], + [77.57255859375, 35.471826171875], + [77.7240234375, 35.48056640625], + [77.7994140625, 35.4958984375], + [77.4234375, 35.302587890625], + [77.1685546875, 35.171533203125], + [77.0486328125, 35.109912109375] + ] + ] + }, + "properties": { + "name": "Siachen Glacier", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [50.18447265625, 44.854638671875], + [49.9951171875, 44.936962890625], + [50.10986328125, 45.08193359375], + [50.0388671875001, 44.94912109375], + [50.18447265625, 44.854638671875] + ] + ], + [ + [ + [87.3228515625001, 49.085791015625], + [86.8083007812501, 49.04970703125], + [86.5494140625001, 48.52861328125], + [85.7494140625, 48.38505859375], + [85.5259765625001, 47.915625], + [85.6566406250001, 47.254638671875], + [85.484765625, 47.063525390625], + [84.7861328125, 46.8307128906251], + [84.6666015625001, 46.97236328125], + [84.016015625, 46.9705078125], + [83.0294921875, 47.1859375], + [82.315234375, 45.594921875], + [82.6116210937501, 45.424267578125], + [82.521484375, 45.12548828125], + [82.2666015625, 45.219091796875], + [81.9449218750001, 45.16083984375], + [81.6919921875001, 45.349365234375], + [80.0591796875001, 45.0064453125], + [79.871875, 44.8837890625], + [80.4815429687501, 44.7146484375], + [80.3552734375, 44.0972656250001], + [80.7857421875001, 43.161572265625], + [80.3902343750001, 43.043115234375], + [80.5389648437501, 42.873486328125], + [80.2022460937501, 42.73447265625], + [80.209375, 42.1900390625], + [80.0712890625, 42.302978515625], + [79.92109375, 42.413134765625], + [79.49013671875, 42.457568359375], + [79.42822265625, 42.48349609375], + [79.2030273437501, 42.666015625], + [79.1648437500001, 42.759033203125], + [79.1266601562501, 42.775732421875], + [76.9880859375001, 42.973583984375], + [76.646484375, 42.92880859375], + [76.5091796875001, 42.918896484375], + [75.9322265625, 42.928515625], + [75.84033203125, 42.9375], + [75.78955078125, 42.93291015625], + [75.68173828125, 42.83046875], + [75.0476562500001, 42.90439453125], + [74.2090820312501, 43.240380859375], + [73.88603515625, 43.132568359375], + [73.55625, 43.002783203125], + [73.4501953125, 42.70302734375], + [73.421875, 42.593505859375], + [73.4929687500001, 42.409033203125], + [73.41162109375, 42.419775390625], + [73.316015625, 42.4669921875], + [73.2829101562501, 42.5041015625], + [72.8550781250001, 42.5611328125], + [72.7529296875, 42.637890625], + [72.5431640625, 42.6777343750001], + [72.27578125, 42.757666015625], + [71.760546875, 42.821484375], + [71.5142578125, 42.766943359375], + [71.4220703125, 42.783154296875], + [71.256640625, 42.733544921875], + [70.8928710937501, 42.339990234375], + [70.94677734375, 42.2486816406251], + [69.15361328125, 41.425244140625], + [68.58408203125, 40.87626953125], + [68.57265625, 40.62265625], + [68.29189453125, 40.656103515625], + [68.0476562500001, 40.80927734375], + [68.1130859375001, 41.02861328125], + [67.9357421875001, 41.19658203125], + [66.70966796875, 41.179150390625], + [66.4986328125001, 41.994873046875], + [66.0095703125001, 42.0048828125], + [66.1002929687501, 42.9908203125], + [65.80302734375, 42.8769531250001], + [65.49619140625, 43.310546875], + [64.9054687500001, 43.714697265625], + [64.4431640625001, 43.551171875], + [63.20703125, 43.627978515625], + [61.990234375, 43.492138671875], + [61.00791015625, 44.393798828125], + [58.5552734375, 45.55537109375], + [55.9756835937501, 44.994921875], + [55.9774414062501, 41.322216796875], + [55.434375, 41.2962890625], + [54.85380859375, 41.965185546875], + [54.12099609375, 42.335205078125], + [53.0558593750001, 42.14775390625], + [52.4938476562501, 41.78037109375], + [52.5965820312501, 42.76015625], + [51.8982421875001, 42.86962890625], + [51.616015625, 43.158447265625], + [51.29541015625, 43.17412109375], + [51.3017578125, 43.482373046875], + [50.8307617187501, 44.1927734375], + [50.33115234375, 44.32548828125], + [50.2529296875, 44.4615234375], + [50.4094726562501, 44.6240234375], + [51.5435546875, 44.5310058593751], + [51.009375, 44.921826171875], + [51.4157226562501, 45.357861328125], + [53.200390625, 45.331982421875], + [52.773828125, 45.57275390625], + [53.13525390625, 46.191650390625], + [53.06943359375, 46.8560546875001], + [52.483203125, 46.990673828125], + [52.13828125, 46.82861328125], + [51.1780273437501, 47.11015625], + [49.886328125, 46.595654296875], + [49.3474609375001, 46.519140625], + [49.2322265625001, 46.337158203125], + [48.5412109375, 46.605615234375], + [48.5583984375001, 46.75712890625], + [48.959375, 46.774609375], + [48.1669921875, 47.7087890625], + [47.48193359375, 47.80390625], + [47.2923828125, 47.74091796875], + [47.0646484375, 48.232470703125], + [46.6609375000001, 48.412255859375], + [46.70263671875, 48.80556640625], + [47.03134765625, 49.15029296875], + [46.80205078125, 49.36708984375], + [46.88955078125, 49.69697265625], + [47.42919921875, 50.357958984375], + [47.7057617187501, 50.377978515625], + [48.3349609375, 49.858251953125], + [48.7589843750001, 49.9283203125001], + [48.62509765625, 50.6126953125001], + [49.3234375, 50.851708984375], + [49.498046875, 51.0835937500001], + [50.246875, 51.289501953125], + [50.7939453125, 51.72919921875], + [51.1634765625001, 51.6474609375], + [51.3445312500001, 51.475341796875], + [52.219140625, 51.709375], + [52.5711914062501, 51.481640625], + [53.3380859375, 51.482373046875], + [54.13974609375, 51.040771484375], + [54.5552734375, 50.535791015625], + [54.6416015625, 51.011572265625], + [55.68623046875, 50.582861328125], + [56.49140625, 51.01953125], + [57.01171875, 51.065185546875], + [57.4421875, 50.8888671875], + [57.8388671875, 51.091650390625], + [58.3591796875001, 51.063818359375], + [58.8836914062501, 50.69443359375], + [59.4523437500001, 50.62041015625], + [59.523046875, 50.49287109375], + [59.81240234375, 50.58203125], + [60.05859375, 50.85029296875], + [60.4248046875, 50.679150390625], + [60.9422851562501, 50.6955078125], + [61.389453125, 50.86103515625], + [61.5546875, 51.3246093750001], + [60.46474609375, 51.651171875], + [60.0302734375, 51.9332519531251], + [60.9945312500001, 52.336865234375], + [60.7744140625, 52.67578125], + [61.0474609375, 52.9724609375], + [62.08271484375, 53.005419921875], + [61.65986328125, 53.228466796875], + [61.19921875, 53.287158203125], + [61.22890625, 53.4458984375], + [61.5349609375, 53.5232910156251], + [60.9794921875, 53.6217285156251], + [61.2310546875, 54.019482421875], + [61.9287109375, 53.946484375], + [64.46123046875, 54.3841796875], + [65.08837890625, 54.340185546875], + [65.476953125, 54.623291015625], + [68.1558593750001, 54.9767089843751], + [68.20625, 55.1609375], + [68.9772460937501, 55.389599609375], + [70.182421875, 55.162451171875], + [70.7380859375001, 55.30517578125], + [71.185546875, 54.59931640625], + [71.0931640625001, 54.21220703125], + [72.0044921875001, 54.2056640625], + [72.18603515625, 54.325634765625], + [72.44677734375, 53.941845703125], + [72.622265625, 54.134326171875], + [73.2298828125001, 53.9578125], + [73.71240234375, 54.0423828125], + [73.3056640625, 53.7072265625], + [73.40693359375, 53.44755859375], + [73.8589843750001, 53.6197265625], + [74.3515625, 53.487646484375], + [74.4519531250001, 53.647265625], + [75.22021484375, 53.8937988281251], + [75.43720703125, 54.0896484375], + [76.8373046875, 54.4423828125], + [76.6545898437501, 54.145263671875], + [76.4216796875001, 54.151513671875], + [76.4847656250001, 54.02255859375], + [77.8599609375001, 53.269189453125], + [79.98623046875, 50.774560546875], + [80.4236328125, 50.9462890625], + [80.448046875, 51.183349609375], + [80.73525390625, 51.293408203125], + [81.12724609375, 51.191064453125], + [81.0714843750001, 50.96875], + [81.3882812500001, 50.956494140625], + [81.4659179687501, 50.73984375], + [82.4939453125001, 50.727587890625], + [82.7608398437501, 50.893359375], + [83.3573242187501, 50.994580078125], + [83.9451171875001, 50.774658203125], + [84.3232421875, 50.23916015625], + [84.9894531250001, 50.06142578125], + [85.2326171875001, 49.6158203125], + [86.1808593750001, 49.49931640625], + [86.67548828125, 49.777294921875], + [86.62646484375, 49.5626953125], + [87.3228515625001, 49.085791015625] + ] + ] + ] + }, + "properties": { + "name": "Kazakhstan", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [35.32529296875, 5.36489257812499], + [35.74501953125, 5.343994140625], + [35.80029296875, 5.15693359374998], + [35.779296875, 5.10556640625001], + [35.7561523437501, 4.95048828125003], + [35.7630859375001, 4.80800781250005], + [36.02197265625, 4.46811523437499], + [36.90556640625, 4.41147460937499], + [37.15458984375, 4.25454101562499], + [37.944921875, 3.74672851562502], + [38.0861328125001, 3.64882812499997], + [38.22529296875, 3.61899414062502], + [38.4515625000001, 3.60483398437498], + [38.6080078125, 3.60009765624999], + [39.49443359375, 3.45610351562496], + [39.65751953125, 3.57783203124998], + [39.79033203125, 3.75424804687503], + [39.8421875, 3.85146484375004], + [40.765234375, 4.27304687500003], + [41.02080078125, 4.05747070312499], + [41.2208984375, 3.94355468749997], + [41.3724609375, 3.94619140624998], + [41.48193359375, 3.96328125], + [41.7376953125, 3.979052734375], + [41.883984375, 3.97773437500001], + [41.6134765625001, 3.59047851562498], + [41.341796875, 3.20166015625], + [40.964453125, 2.81464843750003], + [40.9787109375001, -0.870312500000011], + [41.2498046875001, -1.22050781249995], + [41.4269531250001, -1.44951171874997], + [41.521875, -1.57226562500003], + [41.53271484375, -1.69531249999996], + [41.2674804687501, -1.94501953125003], + [40.88974609375, -2.02353515625003], + [40.8982421875, -2.26992187499997], + [40.6441406250001, -2.53945312499998], + [40.2224609375, -2.68837890625004], + [40.1154296875001, -3.25058593749999], + [39.8609375, -3.57675781250001], + [39.49091796875, -4.47841796875002], + [39.22177734375, -4.69238281250001], + [37.6082031250001, -3.49707031250003], + [37.6438476562501, -3.04541015625003], + [33.9032226562501, -1.00205078125003], + [33.9431640625, 0.173779296874969], + [34.1609375000001, 0.605175781250026], + [34.4108398437501, 0.867285156250034], + [34.48173828125, 1.04213867187505], + [34.7986328125, 1.24453125], + [34.97646484375, 1.71962890625005], + [34.9775390625, 1.86191406249999], + [34.9640625000001, 2.06240234374998], + [34.8830078125001, 2.41791992187503], + [34.90576171875, 2.4796875], + [34.4478515625001, 3.16347656250004], + [34.4072265625, 3.35751953125003], + [34.3994140625, 3.41269531250001], + [34.441796875, 3.60625], + [34.4376953125, 3.65058593749997], + [34.3928710937501, 3.69150390625005], + [34.26708984375, 3.733154296875], + [34.1650390625, 3.81298828125001], + [34.1857421875, 3.86977539062504], + [34.13203125, 3.88916015624999], + [33.97607421875, 4.22021484375003], + [34.17685546875, 4.41909179687504], + [34.38017578125, 4.62065429687497], + [34.6398437500001, 4.87548828125003], + [34.8783203125, 5.10957031250003], + [35.08447265625, 5.31186523437502], + [35.2683593750001, 5.49228515625001], + [35.32529296875, 5.36489257812499] + ] + ] + }, + "properties": { + "name": "Kenya", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [72.63994140625, 39.385986328125], + [72.22998046875, 39.20751953125], + [72.14736328125, 39.2607421875], + [72.0841796875, 39.31064453125], + [72.0427734375, 39.3521484375], + [71.77861328125, 39.277978515625], + [71.7322265625, 39.422998046875], + [71.5033203125, 39.47880859375], + [71.5173828125, 39.553857421875], + [71.50302734375, 39.582177734375], + [71.4703125, 39.603662109375], + [70.79931640625, 39.3947265625], + [70.501171875, 39.587353515625], + [69.29765625, 39.5248046875], + [69.2447265625, 39.827099609375], + [69.27880859375, 39.9177734375], + [69.3072265625, 39.9685546875], + [69.3654296875, 39.9470703125], + [69.43193359375, 39.909765625], + [69.47626953125, 39.9197265625], + [69.47099609375, 39.990625], + [69.46875, 40.020751953125], + [69.966796875, 40.20224609375], + [70.59921875, 39.97451171875], + [70.990625, 40.2548828125], + [71.3046875, 40.2869140625], + [71.69248046875, 40.15234375], + [72.13125, 40.438623046875], + [72.3892578125, 40.427392578125], + [72.40205078125, 40.578076171875], + [72.6041015625, 40.525439453125], + [73.13212890625, 40.828515625], + [72.65830078125, 40.869921875], + [72.3640625, 41.04345703125], + [72.294921875, 41.03994140625], + [72.2130859375, 41.0142578125], + [72.1873046875, 41.025927734375], + [72.18095703125, 41.11845703125], + [72.1642578125, 41.17373046875], + [72.1154296875, 41.186572265625], + [72.05244140625, 41.16474609375], + [71.95849609375, 41.187060546875], + [71.87861328125, 41.19501953125], + [71.8580078125, 41.311376953125], + [71.79248046875, 41.413134765625], + [71.75771484375, 41.42802734375], + [71.70068359375, 41.45400390625], + [71.66494140625, 41.5412109375], + [71.6375, 41.5341796875], + [71.60224609375, 41.503271484375], + [71.60625, 41.367431640625], + [71.54560546875, 41.308056640625], + [71.5, 41.307470703125], + [71.4208984375, 41.34189453125], + [71.4083984375, 41.13603515625], + [71.39306640625, 41.123388671875], + [71.1107421875, 41.15263671875], + [70.86044921875, 41.22490234375], + [70.734375, 41.400537109375], + [70.18095703125, 41.571435546875], + [70.856640625, 42.030810546875], + [71.0322265625, 42.077783203125], + [71.228515625, 42.162890625], + [71.23232421875, 42.186279296875], + [71.2126953125, 42.2064453125], + [71.12998046875, 42.25], + [71.03603515625, 42.28466796875], + [70.97900390625, 42.266552734375], + [70.94677734375, 42.248681640625], + [70.89287109375, 42.339990234375], + [71.256640625, 42.733544921875], + [71.4220703125, 42.783154296875], + [71.5142578125, 42.766943359375], + [71.760546875, 42.821484375], + [72.16181640625, 42.760693359375], + [72.27578125, 42.757666015625], + [72.5431640625, 42.677734375], + [72.7529296875, 42.637890625], + [72.855078125, 42.5611328125], + [73.28291015625, 42.5041015625], + [73.316015625, 42.4669921875], + [73.41162109375, 42.419775390625], + [73.49296875, 42.409033203125], + [73.421875, 42.593505859375], + [73.4501953125, 42.70302734375], + [73.55625, 43.002783203125], + [73.88603515625, 43.132568359375], + [74.20908203125, 43.240380859375], + [75.04765625, 42.90439453125], + [75.68173828125, 42.83046875], + [75.78955078125, 42.93291015625], + [75.84033203125, 42.9375], + [75.9322265625, 42.928515625], + [76.5091796875, 42.918896484375], + [76.646484375, 42.92880859375], + [76.9880859375, 42.973583984375], + [79.12666015625, 42.775732421875], + [79.20302734375, 42.666015625], + [79.2955078125, 42.604833984375], + [79.3677734375, 42.547216796875], + [79.42822265625, 42.48349609375], + [79.92109375, 42.413134765625], + [80.0712890625, 42.302978515625], + [80.209375, 42.1900390625], + [80.24619140625, 42.059814453125], + [80.23515625, 42.04345703125], + [80.2162109375, 42.032421875], + [79.90966796875, 42.014990234375], + [79.8404296875, 41.995751953125], + [79.76611328125, 41.898876953125], + [78.742578125, 41.56005859375], + [78.5431640625, 41.4595703125], + [78.44287109375, 41.417529296875], + [78.36240234375, 41.371630859375], + [78.3462890625, 41.2814453125], + [78.1234375, 41.075634765625], + [77.9564453125, 41.05068359375], + [77.815234375, 41.055615234375], + [77.7193359375, 41.02431640625], + [77.58173828125, 40.9927734375], + [76.98662109375, 41.03916015625], + [76.90771484375, 41.024169921875], + [76.8240234375, 40.98232421875], + [76.7083984375, 40.818115234375], + [76.6611328125, 40.779638671875], + [76.63984375, 40.742236328125], + [76.62216796875, 40.662353515625], + [76.5779296875, 40.577880859375], + [76.48017578125, 40.44951171875], + [76.39638671875, 40.389794921875], + [76.3185546875, 40.35224609375], + [76.25830078125, 40.43076171875], + [75.87197265625, 40.30322265625], + [75.6771484375, 40.305810546875], + [75.55556640625, 40.6251953125], + [75.52080078125, 40.6275390625], + [75.241015625, 40.4802734375], + [75.111328125, 40.4541015625], + [75.0044921875, 40.44951171875], + [74.865625, 40.493505859375], + [74.80126953125, 40.428515625], + [74.83046875, 40.328515625], + [74.4119140625, 40.13720703125], + [74.24267578125, 40.092041015625], + [74.08515625, 40.07431640625], + [73.9916015625, 40.043115234375], + [73.93876953125, 39.97880859375], + [73.8845703125, 39.8779296875], + [73.85625, 39.828662109375], + [73.8353515625, 39.800146484375], + [73.83974609375, 39.762841796875], + [73.88251953125, 39.71455078125], + [73.9146484375, 39.606494140625], + [73.90712890625, 39.578515625], + [73.87275390625, 39.53330078125], + [73.82294921875, 39.48896484375], + [73.71572265625, 39.462255859375], + [73.631640625, 39.448876953125], + [73.47041015625, 39.460595703125], + [73.38740234375, 39.442724609375], + [73.3361328125, 39.412353515625], + [73.2349609375, 39.374560546875], + [73.10927734375, 39.3619140625], + [72.63994140625, 39.385986328125] + ], + [ + [70.66416015625, 39.85546875], + [70.56708984375, 39.8666015625], + [70.49775390625, 39.882421875], + [70.4828125, 39.88271484375], + [70.4892578125, 39.863037109375], + [70.5595703125, 39.79091796875], + [70.612109375, 39.786767578125], + [70.70166015625, 39.82529296875], + [70.66416015625, 39.85546875] + ], + [ + [71.20615234375, 39.892578125], + [71.2287109375, 40.04814453125], + [71.08037109375, 40.0798828125], + [71.02412109375, 40.149169921875], + [71.00546875, 40.152294921875], + [70.96064453125, 40.08798828125], + [71.04482421875, 39.992529296875], + [71.04365234375, 39.976318359375], + [71.01171875, 39.8951171875], + [71.0642578125, 39.884912109375], + [71.15625, 39.883447265625], + [71.20615234375, 39.892578125] + ] + ] + }, + "properties": { + "name": "Kyrgyzstan", + "childNum": 3 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [104.4263671875, 10.41123046875], + [103.8705078125, 10.655126953125], + [103.587109375, 10.552197265625], + [103.5404296875, 10.668701171875], + [103.721875, 10.89013671875], + [103.532421875, 11.1466796875], + [103.35361328125, 10.9215820312501], + [103.15283203125, 10.9137207031251], + [103.12548828125, 11.46064453125], + [102.9486328125, 11.773486328125], + [102.93388671875, 11.706689453125], + [102.73662109375, 12.089794921875], + [102.7556640625, 12.42626953125], + [102.499609375, 12.669970703125], + [102.336328125, 13.560302734375], + [102.546875, 13.585693359375], + [102.90927734375, 14.13671875], + [103.1994140625, 14.3326171875], + [104.77900390625, 14.42783203125], + [105.07412109375, 14.22744140625], + [105.1259765625, 14.28095703125], + [105.169140625, 14.336083984375], + [105.18330078125, 14.346240234375], + [105.185546875, 14.319091796875], + [105.20703125, 14.259375], + [105.245703125, 14.200537109375], + [105.3501953125, 14.1095703125], + [105.53154296875, 14.15615234375], + [105.73974609375, 14.0849609375001], + [105.8314453125, 13.976611328125], + [105.9044921875, 13.9245117187501], + [106.066796875, 13.92119140625], + [106.12470703125, 14.04912109375], + [106.0966796875, 14.127099609375], + [106.0041015625, 14.262890625], + [105.97890625, 14.343017578125], + [106.0083984375, 14.357177734375], + [106.165234375, 14.37236328125], + [106.19072265625, 14.388134765625], + [106.225390625, 14.476220703125], + [106.26796875, 14.4662109375], + [106.35498046875, 14.45478515625], + [106.44697265625, 14.5150390625], + [106.50146484375, 14.57822265625], + [106.53115234375, 14.5494140625], + [106.563671875, 14.505078125], + [106.59921875, 14.47939453125], + [106.6654296875, 14.44130859375], + [106.73818359375, 14.387744140625], + [106.78349609375, 14.335107421875], + [106.819921875, 14.3146972656251], + [106.91318359375, 14.32939453125], + [106.9380859375, 14.3273437500001], + [106.9921875, 14.391015625], + [107.03017578125, 14.42568359375], + [107.06240234375, 14.415771484375], + [107.109375, 14.4166992187501], + [107.29267578125, 14.5923828125], + [107.3798828125, 14.5553222656251], + [107.41474609375, 14.562890625], + [107.51943359375, 14.705078125], + [107.3314453125, 14.126611328125], + [107.60546875, 13.43779296875], + [107.475390625, 13.03037109375], + [107.5064453125, 12.36455078125], + [107.393359375, 12.260498046875], + [107.212109375, 12.30400390625], + [106.70009765625, 11.979296875], + [106.4138671875, 11.9484375], + [106.39921875, 11.68701171875], + [106.0060546875, 11.7580078125], + [105.85146484375, 11.635009765625], + [105.8560546875, 11.294287109375], + [106.1609375, 11.0371093750001], + [106.16396484375, 10.794921875], + [105.8533203125, 10.86357421875], + [105.755078125, 10.989990234375], + [105.40576171875, 10.951611328125], + [105.3146484375, 10.845166015625], + [105.045703125, 10.911376953125], + [105.04638671875, 10.70166015625], + [104.8505859375, 10.53447265625], + [104.4263671875, 10.41123046875] + ] + ] + }, + "properties": { + "name": "Cambodia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-157.342138671875, 1.85556640625003], + [-157.17578125, 1.73984375], + [-157.578955078125, 1.90205078125], + [-157.43583984375, 1.84726562500002], + [-157.365185546875, 1.94609375], + [-157.44189453125, 2.02504882812501], + [-157.321875, 1.96855468750005], + [-157.342138671875, 1.85556640625003] + ] + ], + [ + [ + [-159.3390625, 3.92353515624998], + [-159.274755859375, 3.79658203125005], + [-159.409033203125, 3.87324218750004], + [-159.3390625, 3.92353515624998] + ] + ] + ] + }, + "properties": { + "name": "Kiribati", + "childNum": 2 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [126.326953125, 33.2236328125], + [126.165625, 33.31201171875], + [126.3376953125, 33.460400390625], + [126.901171875, 33.51513671875], + [126.8728515625, 33.341162109375], + [126.326953125, 33.2236328125] + ] + ], + [ + [ + [126.23369140625, 34.3705078125], + [126.1228515625, 34.4439453125], + [126.34384765625, 34.544921875], + [126.23369140625, 34.3705078125] + ] + ], + [ + [ + [126.17197265625, 34.73115234375], + [126.00751953125, 34.86748046875], + [126.07841796875, 34.91484375], + [126.17197265625, 34.73115234375] + ] + ], + [ + [ + [128.0658203125, 34.805859375], + [128.0546875, 34.708056640625], + [127.8734375, 34.7349609375], + [127.8322265625, 34.87451171875], + [128.0658203125, 34.805859375] + ] + ], + [ + [ + [128.741015625, 34.79853515625], + [128.6466796875, 34.736865234375], + [128.4892578125, 34.865283203125], + [128.66796875, 35.0087890625], + [128.741015625, 34.79853515625] + ] + ], + [ + [ + [126.520703125, 37.73681640625], + [126.516015625, 37.6046875], + [126.42333984375, 37.6236328125001], + [126.41162109375, 37.82265625], + [126.520703125, 37.73681640625] + ] + ], + [ + [ + [128.374609375, 38.6234375], + [129.41826171875, 37.059033203125], + [129.403515625, 36.0521484375], + [129.5728515625, 36.050537109375], + [129.419140625, 35.4978515625], + [129.0767578125, 35.122705078125], + [128.5109375, 35.1009765625], + [128.4439453125, 34.870361328125], + [128.03623046875, 35.02197265625], + [127.71484375, 34.9546875], + [127.7154296875, 34.721044921875], + [127.404296875, 34.823095703125], + [127.4791015625, 34.625244140625], + [127.324609375, 34.46328125], + [127.1734375, 34.546142578125], + [127.2470703125, 34.755126953125], + [126.8974609375, 34.4388671875], + [126.75478515625, 34.511865234375], + [126.5314453125, 34.3142578125], + [126.264453125, 34.6732421875], + [126.52451171875, 34.697900390625], + [126.593359375, 34.824365234375], + [126.420703125, 34.823388671875], + [126.29111328125, 35.154150390625], + [126.6140625, 35.57099609375], + [126.4884765625, 35.6470703125], + [126.75302734375, 35.87197265625], + [126.5404296875, 36.166162109375], + [126.4876953125, 36.693798828125], + [126.180859375, 36.6916015625], + [126.160546875, 36.771923828125], + [126.48701171875, 37.007470703125], + [126.78447265625, 36.9484375], + [126.8720703125, 36.8244628906251], + [126.97685546875, 36.939404296875], + [126.74638671875, 37.1935546875], + [126.63388671875, 37.7818359375001], + [127.09033203125, 38.28388671875], + [128.03896484375, 38.308544921875], + [128.374609375, 38.6234375] + ] + ] + ] + }, + "properties": { + "name": "South Korea", + "childNum": 7 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [48.275390625, 29.62431640625], + [48.1796875, 29.6114257812501], + [48.0814453125, 29.7989257812501], + [48.1847656250001, 29.978857421875], + [48.3482421875, 29.782666015625], + [48.275390625, 29.62431640625] + ] + ], + [ + [ + [48.44248046875, 28.542919921875], + [47.6712890625, 28.533154296875], + [47.433203125, 28.98955078125], + [46.5314453125, 29.096240234375], + [46.69375, 29.25966796875], + [46.7693359375, 29.3474609375], + [46.9058593750001, 29.5375], + [47.1482421875, 30.0009765625], + [47.64375, 30.097314453125], + [47.75390625, 30.076611328125], + [47.9787109375, 29.9828125000001], + [48.0056640625, 29.835791015625], + [48.14345703125, 29.5724609375], + [47.9696289062501, 29.61669921875], + [47.72265625, 29.393017578125], + [48.0514648437501, 29.35537109375], + [48.44248046875, 28.542919921875] + ] + ] + ] + }, + "properties": { + "name": "Kuwait", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [102.12744140625, 22.37919921875], + [102.58251953125, 21.9042968750001], + [102.66201171875, 21.6760253906251], + [102.73857421875, 21.6779296875001], + [102.77109375, 21.70966796875], + [102.7982421875, 21.79794921875], + [102.81591796875, 21.807373046875], + [102.949609375, 21.6813476562501], + [102.851171875, 21.26591796875], + [102.8837890625, 21.2025878906251], + [103.1044921875, 20.891650390625], + [103.2107421875, 20.840625], + [103.46357421875, 20.7798339843751], + [103.63505859375, 20.6970703125001], + [104.1013671875, 20.9455078125001], + [104.1953125, 20.9139648437501], + [104.349609375, 20.82109375], + [104.583203125, 20.6466796875], + [104.53271484375, 20.5548828125001], + [104.47861328125, 20.5295898437501], + [104.4078125, 20.4857421875], + [104.3677734375, 20.4414062500001], + [104.3921875, 20.4247558593751], + [104.49619140625, 20.4136718749999], + [104.61884765625, 20.3745117187501], + [104.6564453125, 20.328515625], + [104.6619140625, 20.2890136718751], + [104.676953125, 20.22470703125], + [104.69873046875, 20.2053222656251], + [104.8478515625, 20.20244140625], + [104.888671875, 20.169091796875], + [104.92919921875, 20.0828125], + [104.9279296875, 20.018115234375], + [104.81513671875, 19.90400390625], + [104.8017578125, 19.8361328125001], + [104.7431640625, 19.754736328125], + [104.587890625, 19.61875], + [104.5462890625, 19.6105468750001], + [104.25986328125, 19.6854980468751], + [104.06279296875, 19.6784179687501], + [104.03203125, 19.6751464843749], + [104.0134765625, 19.6464843749999], + [104.0515625, 19.5641601562501], + [104.062890625, 19.4825683593751], + [104.0275390625, 19.4204589843751], + [103.93203125, 19.366064453125], + [103.89638671875, 19.339990234375], + [103.8916015625, 19.30498046875], + [105.146484375, 18.6509765625], + [105.14541015625, 18.616796875], + [105.08701171875, 18.4962402343751], + [105.11455078125, 18.4052734375001], + [105.458203125, 18.1542968750001], + [105.5185546875, 18.07744140625], + [105.5884765625, 17.9836914062499], + [105.69140625, 17.7378417968749], + [106.00625, 17.4152832031249], + [106.26953125, 17.2167968750001], + [106.3333984375, 17.1437011718751], + [106.4259765625, 17.0025390625001], + [106.50224609375, 16.9541015625], + [106.5259765625, 16.876611328125], + [106.53369140625, 16.8210449218751], + [106.54619140625, 16.650732421875], + [106.6564453125, 16.4926269531251], + [106.73955078125, 16.4525390625001], + [106.7916015625, 16.49033203125], + [106.832421875, 16.52626953125], + [106.85107421875, 16.515625], + [106.8927734375, 16.3965332031251], + [106.9306640625, 16.353125], + [107.39638671875, 16.043017578125], + [107.3919921875, 15.9516601562501], + [107.36064453125, 15.921728515625], + [107.1888671875, 15.8386230468751], + [107.16591796875, 15.802490234375], + [107.27939453125, 15.618701171875], + [107.33876953125, 15.5604980468751], + [107.5642578125, 15.3916015625], + [107.6216796875, 15.30986328125], + [107.653125, 15.2552246093751], + [107.63369140625, 15.1898437500001], + [107.5896484375, 15.1184570312501], + [107.5552734375, 15.05703125], + [107.48037109375, 14.9798828125001], + [107.5046875, 14.9159179687501], + [107.52451171875, 14.8718261718749], + [107.51376953125, 14.8173828125001], + [107.51943359375, 14.7050781250001], + [107.46513671875, 14.6649902343751], + [107.41474609375, 14.5628906250001], + [107.3798828125, 14.5553222656251], + [107.29267578125, 14.5923828125], + [107.109375, 14.41669921875], + [107.06240234375, 14.4157714843749], + [107.03017578125, 14.42568359375], + [106.9921875, 14.3910156250001], + [106.9380859375, 14.3273437500001], + [106.91318359375, 14.3293945312499], + [106.819921875, 14.3146972656249], + [106.78349609375, 14.335107421875], + [106.73818359375, 14.3877441406251], + [106.6654296875, 14.44130859375], + [106.59921875, 14.4793945312501], + [106.563671875, 14.505078125], + [106.53115234375, 14.5494140625], + [106.50146484375, 14.57822265625], + [106.225390625, 14.476220703125], + [106.19072265625, 14.388134765625], + [106.165234375, 14.37236328125], + [106.0083984375, 14.3571777343751], + [105.97890625, 14.3430175781251], + [106.0041015625, 14.2628906250001], + [106.0966796875, 14.1270996093751], + [106.12470703125, 14.04912109375], + [106.066796875, 13.9211914062501], + [105.9044921875, 13.9245117187501], + [105.8314453125, 13.976611328125], + [105.73974609375, 14.0849609375001], + [105.53154296875, 14.15615234375], + [105.3501953125, 14.1095703125001], + [105.245703125, 14.200537109375], + [105.20703125, 14.259375], + [105.185546875, 14.319091796875], + [105.18330078125, 14.346240234375], + [105.24365234375, 14.36787109375], + [105.3421875, 14.41669921875], + [105.42265625, 14.471630859375], + [105.4755859375, 14.530126953125], + [105.49736328125, 14.590673828125], + [105.523046875, 14.843310546875], + [105.5466796875, 14.932470703125], + [105.5333984375, 15.0416015625001], + [105.4904296875, 15.127587890625], + [105.4904296875, 15.256591796875], + [105.615625, 15.4882812499999], + [105.6388671875, 15.5859374999999], + [105.641015625, 15.6565429687499], + [105.6220703125, 15.6999511718751], + [105.39892578125, 15.8298828125001], + [105.40625, 15.987451171875], + [105.3306640625, 16.037890625], + [105.14873046875, 16.0935546875], + [105.04716796875, 16.1602539062501], + [104.8193359375, 16.4660644531251], + [104.7505859375, 16.64755859375], + [104.7435546875, 16.884375], + [104.758984375, 17.0771484375], + [104.816015625, 17.30029296875], + [104.7396484375, 17.461669921875], + [104.428125, 17.6989746093751], + [104.32265625, 17.8158203125], + [104.19619140625, 17.98837890625], + [104.04873046875, 18.21669921875], + [103.949609375, 18.318994140625], + [103.898828125, 18.2953125], + [103.79228515625, 18.3165039062501], + [103.6296875, 18.3825683593751], + [103.48798828125, 18.4181640625], + [103.3669921875, 18.42333984375], + [103.28828125, 18.4083984375], + [103.2517578125, 18.3734863281251], + [103.24892578125, 18.33896484375], + [103.27958984375, 18.30498046875], + [103.26318359375, 18.2784667968751], + [103.19970703125, 18.25947265625], + [103.14853515625, 18.2217285156249], + [103.0912109375, 18.138232421875], + [103.0513671875, 18.028515625], + [102.807421875, 17.945556640625], + [102.717578125, 17.8922363281251], + [102.6751953125, 17.8517578125001], + [102.680078125, 17.8241210937501], + [102.66064453125, 17.8179687499999], + [102.616796875, 17.833349609375], + [102.5982421875, 17.9267578125001], + [102.5525390625, 17.9650878906251], + [102.4587890625, 17.9846191406249], + [102.35185546875, 18.045947265625], + [102.1482421875, 18.2038574218751], + [102.10146484375, 18.21064453125], + [102.0345703125, 18.16982421875], + [101.9474609375, 18.081494140625], + [101.87548828125, 18.0464355468749], + [101.81865234375, 18.0646484375001], + [101.7748046875, 18.0333984375001], + [101.6875, 17.8894042968751], + [101.563671875, 17.8205078125001], + [101.555078125, 17.812353515625], + [101.413671875, 17.71875], + [101.16748046875, 17.4990234375], + [101.10517578125, 17.4795410156251], + [100.90849609375, 17.58388671875], + [101.1439453125, 18.142626953125], + [101.1375, 18.2868652343751], + [101.0505859375, 18.40703125], + [101.04697265625, 18.4419921875], + [101.286328125, 18.9771484375], + [101.19755859375, 19.3279296875], + [101.22080078125, 19.48662109375], + [101.2119140625, 19.5483398437501], + [100.51357421875, 19.553466796875], + [100.39765625, 19.7561035156251], + [100.51953125, 20.1779296875001], + [100.31796875, 20.3858886718751], + [100.21806640625, 20.3395996093751], + [100.13974609375, 20.2454101562501], + [100.11494140625, 20.2576660156249], + [100.1224609375, 20.3166503906251], + [100.1296875, 20.372216796875], + [100.18388671875, 20.5891113281249], + [100.24931640625, 20.7302734374999], + [100.32607421875, 20.7957031249999], + [100.407421875, 20.8232421875001], + [100.56513671875, 20.8250976562501], + [100.62294921875, 20.8595703125], + [100.61767578125, 20.8792480468751], + [100.54931640625, 20.8842285156251], + [100.522265625, 20.9219238281251], + [100.5361328125, 20.9923828125001], + [100.703125, 21.2513671875001], + [101.08037109375, 21.4686523437501], + [101.1388671875, 21.56748046875], + [101.1966796875, 21.5220703125], + [101.175390625, 21.4075195312501], + [101.219921875, 21.3424316406251], + [101.21181640625, 21.27822265625], + [101.2244140625, 21.2237304687499], + [101.2478515625, 21.197314453125], + [101.2814453125, 21.184130859375], + [101.4435546875, 21.230810546875], + [101.5423828125, 21.2342773437501], + [101.70478515625, 21.1501464843751], + [101.728125, 21.1563964843751], + [101.78349609375, 21.204150390625], + [101.8005859375, 21.21259765625], + [101.72294921875, 21.3149414062501], + [101.747265625, 21.60576171875], + [101.7439453125, 21.7779785156251], + [101.7365234375, 21.826513671875], + [101.52451171875, 22.253662109375], + [101.56787109375, 22.2763671875], + [101.619921875, 22.3274414062501], + [101.671484375, 22.4623046875], + [101.70751953125, 22.486572265625], + [101.73876953125, 22.495263671875], + [101.7599609375, 22.49033203125], + [101.841796875, 22.3884765625001], + [102.0244140625, 22.4392089843751], + [102.09150390625, 22.4122558593751], + [102.12744140625, 22.37919921875] + ] + ] + }, + "properties": { + "name": "Laos", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [35.869140625, 33.43173828125], + [35.41123046875, 33.07568359375], + [35.10859375, 33.08369140625], + [35.6478515625, 34.2482421875], + [35.97626953125, 34.62919921875], + [36.38388671875, 34.65791015625], + [36.3298828125, 34.499609375], + [36.50439453125, 34.432373046875], + [36.5849609375, 34.221240234375], + [36.27783203125, 33.92529296875], + [36.3650390625, 33.83935546875], + [35.9861328125, 33.75263671875], + [36.03447265625, 33.58505859375], + [35.869140625, 33.43173828125] + ] + ] + }, + "properties": { + "name": "Lebanon", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-8.48642578124998, 7.55849609374999], + [-8.40874023437499, 7.41181640625], + [-8.32451171874999, 6.92001953124999], + [-8.587890625, 6.49052734374999], + [-8.287109375, 6.31904296875], + [-7.98159179687499, 6.2861328125], + [-7.88862304687498, 6.23486328125], + [-7.80092773437499, 6.03891601562499], + [-7.73037109374999, 5.91904296874999], + [-7.63613281249999, 5.90771484375], + [-7.45439453124999, 5.84130859375], + [-7.39990234375, 5.55058593749999], + [-7.58505859374998, 4.916748046875], + [-7.57465820312498, 4.57231445312499], + [-7.54497070312499, 4.351318359375], + [-8.259033203125, 4.58999023437499], + [-9.13217773437498, 5.054638671875], + [-10.2763671875, 6.07763671875], + [-11.2916015625, 6.688232421875], + [-11.50751953125, 6.90654296874999], + [-11.26767578125, 7.2326171875], + [-10.878076171875, 7.53823242187499], + [-10.6474609375, 7.759375], + [-10.570849609375, 8.07114257812499], + [-10.516748046875, 8.12529296874999], + [-10.359814453125, 8.187939453125], + [-10.283203125, 8.48515624999999], + [-10.233056640625, 8.48881835937499], + [-10.147412109375, 8.5197265625], + [-10.06435546875, 8.4298828125], + [-9.781982421875, 8.53769531249999], + [-9.51826171874998, 8.34609375], + [-9.369140625, 7.70380859375], + [-9.46381835937498, 7.41586914062499], + [-9.11757812499999, 7.21591796874999], + [-8.8896484375, 7.2626953125], + [-8.65976562499998, 7.68837890624999], + [-8.48642578124998, 7.55849609374999] + ] + ] + }, + "properties": { + "name": "Liberia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [25.15048828125, 31.65498046875], + [24.852734375, 31.334814453125], + [24.96142578125, 30.678515625], + [24.70322265625, 30.20107421875], + [24.9802734375, 29.181884765625], + [24.9802734375, 25.5888671875], + [24.9802734375, 21.995849609375], + [24.9794921875, 20.002587890625], + [23.9802734375, 19.995947265625], + [23.9802734375, 19.496630859375], + [20.14765625, 21.3892578125], + [15.98408203125, 23.44521484375], + [14.97900390625, 22.99619140625], + [14.21552734375, 22.619677734375], + [13.48125, 23.18017578125], + [11.96787109375, 23.51787109375], + [11.5076171875, 24.31435546875], + [10.6861328125, 24.5513671875], + [10.3958984375, 24.485595703125], + [10.255859375, 24.591015625], + [10.00068359375, 25.332080078125], + [9.4482421875, 26.067138671875], + [9.49140625000001, 26.333740234375], + [9.88320312500002, 26.630810546875], + [9.74755859375, 27.330859375], + [9.916015625, 27.785693359375], + [9.80527343750001, 29.176953125], + [9.31025390625001, 30.115234375], + [9.51875, 30.22939453125], + [9.89501953125, 30.3873046875], + [9.93251953125002, 30.425341796875], + [10.059765625, 30.580078125], + [10.21640625, 30.783203125], + [10.11494140625, 31.46376953125], + [10.274609375, 31.6849609375], + [10.47578125, 31.73603515625], + [10.60888671875, 31.929541015625], + [10.8263671875, 32.0806640625], + [11.00517578125, 32.172705078125], + [11.16826171875, 32.25673828125], + [11.3580078125, 32.34521484375], + [11.50498046875, 32.413671875], + [11.5359375, 32.47333984375], + [11.5337890625, 32.524951171875], + [11.45390625, 32.642578125], + [11.45390625, 32.781689453125], + [11.4591796875, 32.89736328125], + [11.4671875, 32.96572265625], + [11.50458984375, 33.18193359375], + [11.65712890625, 33.118896484375], + [11.8134765625, 33.093701171875], + [12.2798828125, 32.858544921875], + [12.753515625, 32.80107421875], + [13.28349609375, 32.9146484375], + [15.1765625, 32.391162109375], + [15.70595703125, 31.426416015625], + [17.83046875, 30.927587890625], + [18.66982421875, 30.415673828125], + [19.12373046875, 30.26611328125], + [19.71328125, 30.48837890625], + [20.1115234375, 30.963720703125], + [19.9263671875, 31.817529296875], + [20.121484375, 32.21875], + [20.62109375, 32.58017578125], + [21.6359375, 32.9373046875], + [22.18740234375, 32.91826171875], + [23.090625, 32.61875], + [23.10625, 32.3314453125], + [23.286328125, 32.213818359375], + [24.1296875, 32.009228515625], + [24.878515625, 31.98427734375], + [25.15048828125, 31.65498046875] + ] + ] + }, + "properties": { + "name": "Libya", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-60.89521484375, 13.82197265625], + [-60.951416015625, 13.717578125], + [-61.07314453125, 13.865576171875], + [-60.90810546875, 14.093359375], + [-60.89521484375, 13.82197265625] + ] + ] + }, + "properties": { + "name": "Saint Lucia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [79.8748046875, 9.05073242187503], + [79.9037109375001, 8.975], + [79.7476562500001, 9.10458984374999], + [79.8748046875, 9.05073242187503] + ] + ], + [ + [ + [79.98232421875, 9.81269531250001], + [80.2528320312501, 9.79633789062505], + [80.7111328125, 9.36635742187502], + [81.226953125, 8.50551757812498], + [81.3728515625, 8.43144531249999], + [81.4221679687501, 8.14785156250002], + [81.8741210937501, 7.28833007812499], + [81.8614257812501, 6.90126953124999], + [81.63740234375, 6.42514648437499], + [80.72412109375, 5.97905273437496], + [80.2673828125001, 6.009765625], + [80.0953125000001, 6.15317382812501], + [79.859375, 6.82929687499998], + [79.7129882812501, 8.18232421875004], + [79.7498046875001, 8.29423828125], + [79.7834960937501, 8.01845703125005], + [79.92890625, 8.89921874999997], + [80.099609375, 9.20996093750004], + [80.0863281250001, 9.57783203125003], + [80.4283203125001, 9.48095703125001], + [80.0458007812501, 9.64990234374997], + [79.98232421875, 9.81269531250001] + ] + ] + ] + }, + "properties": { + "name": "Sri Lanka", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.646875, -30.1265625], + [28.39208984375, -30.14755859375], + [28.1287109375, -30.52509765625], + [28.0568359375, -30.6310546875], + [27.753125, -30.6], + [27.3640625, -30.27919921875], + [27.1935546875, -29.94130859375], + [27.05693359375, -29.6255859375], + [27.29453125, -29.5193359375], + [27.735546875, -28.9400390625], + [27.95986328125, -28.87333984375], + [28.084375, -28.77998046875], + [28.2326171875, -28.70126953125], + [28.471875, -28.6158203125], + [28.5833984375, -28.594140625], + [28.62578125, -28.58173828125], + [29.3013671875, -29.08984375], + [29.38671875, -29.3197265625], + [29.348828125, -29.4419921875], + [29.2935546875, -29.56689453125], + [29.1421875, -29.7009765625], + [29.098046875, -29.91904296875], + [28.646875, -30.1265625] + ] + ] + }, + "properties": { + "name": "Lesotho", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [20.9578125000001, 55.2789062500001], + [20.8998046875001, 55.286669921875], + [21.11484375, 55.61650390625], + [20.9578125000001, 55.2789062500001] + ] + ], + [ + [ + [25.573046875, 54.139892578125], + [25.49736328125, 54.175244140625], + [25.52734375, 54.21513671875], + [25.5056640625, 54.26494140625], + [25.4611328125, 54.2927734375], + [25.1794921875, 54.2142578125], + [25.11142578125, 54.1549316406251], + [25.04609375, 54.133056640625], + [24.86953125, 54.145166015625], + [24.82568359375, 54.118994140625], + [24.7892578125, 53.9982421875], + [24.7681640625, 53.974658203125], + [24.31796875, 53.89296875], + [24.23662109375, 53.919970703125], + [24.1913085937501, 53.950439453125], + [23.5590820312501, 53.91982421875], + [23.4846679687501, 53.939794921875], + [23.4536132812501, 54.14345703125], + [23.3701171875, 54.20048828125], + [23.2823242187501, 54.24033203125], + [23.1703125000001, 54.2814453125], + [23.0875, 54.299462890625], + [23.0421875000001, 54.30419921875], + [23.0155273437501, 54.34833984375], + [22.9767578125001, 54.3663574218751], + [22.8939453125001, 54.39052734375], + [22.82373046875, 54.39580078125], + [22.7662109375, 54.356787109375], + [22.6798828125001, 54.493017578125], + [22.68447265625, 54.562939453125], + [22.82470703125, 54.8712890625], + [22.5672851562501, 55.059130859375], + [22.07236328125, 55.063671875], + [21.2357421875, 55.264111328125], + [21.237890625, 55.455029296875], + [21.0619140625001, 55.813427734375], + [21.05380859375, 56.02294921875], + [21.04609375, 56.070068359375], + [21.3146484375, 56.188134765625], + [21.653515625, 56.31455078125], + [22.0845703125, 56.4067382812501], + [22.8755859375001, 56.396435546875], + [22.96826171875, 56.380419921875], + [23.0429687500001, 56.324072265625], + [23.11982421875, 56.3306640625], + [23.1958984375, 56.367138671875], + [24.1207031250001, 56.2642578125], + [24.90302734375, 56.398193359375], + [25.069921875, 56.200390625], + [25.6631835937501, 56.104833984375], + [26.5935546875001, 55.667529296875], + [26.5908203125001, 55.62265625], + [26.5666015625, 55.546484375], + [26.51923828125, 55.44814453125], + [26.46953125, 55.371923828125], + [26.4576171875, 55.34248046875], + [26.4953125, 55.318017578125], + [26.68125, 55.3064453125], + [26.7601562500001, 55.293359375], + [26.77568359375, 55.273095703125], + [26.601171875, 55.13017578125], + [26.2917968750001, 55.139599609375], + [26.25078125, 55.1245117187501], + [26.1751953125, 55.003271484375], + [26.0929687500001, 54.9623046875001], + [25.964453125, 54.94716796875], + [25.8592773437501, 54.919287109375], + [25.7224609375001, 54.71787109375], + [25.7316406250001, 54.590380859375], + [25.7248046875, 54.5642578125], + [25.68515625, 54.535791015625], + [25.6203125, 54.460400390625], + [25.567578125, 54.37705078125], + [25.54736328125, 54.3318359375], + [25.5575195312501, 54.310693359375], + [25.7025390625, 54.29296875], + [25.765234375, 54.17978515625], + [25.573046875, 54.139892578125] + ] + ] + ] + }, + "properties": { + "name": "Lithuania", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.4873046875, 49.798486328125], + [6.34433593750001, 49.452734375], + [6.18105468750002, 49.49892578125], + [6.11992187500002, 49.485205078125], + [6.07412109375002, 49.454638671875], + [6.01142578125001, 49.445458984375], + [5.95947265625, 49.454638671875], + [5.92890625000001, 49.4775390625], + [5.9013671875, 49.48974609375], + [5.82343750000001, 49.505078125], + [5.78974609375001, 49.53828125], + [5.77671037946429, 49.6399539620536], + [5.74404296875002, 49.91962890625], + [5.7880859375, 49.96123046875], + [5.8173828125, 50.0126953125], + [5.86689453125001, 50.0828125], + [5.97626953125001, 50.1671875], + [6.08906250000001, 50.15458984375], + [6.11005859375001, 50.123779296875], + [6.11650390625002, 50.12099609375], + [6.10976562500002, 50.034375], + [6.13818359375, 49.97431640625], + [6.20488281250002, 49.91513671875], + [6.27232700892858, 49.8872349330357], + [6.4873046875, 49.798486328125] + ] + ] + }, + "properties": { + "name": "Luxembourg", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.14794921875, 56.142919921875], + [27.5767578125, 55.798779296875], + [27.0525390625, 55.83056640625], + [26.5935546875, 55.667529296875], + [25.66318359375, 56.104833984375], + [25.069921875, 56.200390625], + [24.90302734375, 56.398193359375], + [24.120703125, 56.2642578125], + [23.8126953125, 56.329248046875], + [23.1958984375, 56.367138671875], + [23.11982421875, 56.3306640625], + [23.04296875, 56.324072265625], + [22.8755859375, 56.396435546875], + [22.0845703125, 56.40673828125], + [21.73056640625, 56.3259765625], + [21.653515625, 56.31455078125], + [21.3146484375, 56.188134765625], + [21.04609375, 56.070068359375], + [21.0712890625, 56.82373046875], + [21.7287109375, 57.57099609375], + [22.55458984375, 57.724267578125], + [23.2873046875, 57.08974609375], + [23.64775390625, 56.971044921875], + [24.3826171875, 57.250048828125], + [24.32255859375, 57.87060546875], + [24.3625, 57.866162109375], + [24.45888671875, 57.907861328125], + [25.11103515625, 58.063427734375], + [25.27265625, 58.009375], + [25.66015625, 57.920166015625], + [26.298046875, 57.60107421875], + [26.5326171875, 57.531005859375], + [26.966015625, 57.609130859375], + [27.187109375, 57.538330078125], + [27.3265625, 57.52548828125], + [27.4697265625, 57.5240234375], + [27.538671875, 57.42978515625], + [27.796875, 57.316943359375], + [27.82861328125, 57.293310546875], + [27.83828125, 57.247705078125], + [27.8302734375, 57.194482421875], + [27.639453125, 56.845654296875], + [27.8060546875, 56.86708984375], + [27.8486328125, 56.85341796875], + [27.89208984375, 56.741064453125], + [28.00751953125, 56.599853515625], + [28.103125, 56.545703125], + [28.11083984375, 56.510693359375], + [28.16923828125, 56.386865234375], + [28.19169921875, 56.315576171875], + [28.20205078125, 56.260400390625], + [28.14794921875, 56.142919921875] + ] + ] + }, + "properties": { + "name": "Latvia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.2125, 45.450439453125], + [28.07470703125, 45.598974609375], + [28.239453125, 46.6408203125], + [28.07177734375, 46.97841796875], + [27.6140625, 47.34052734375], + [26.98076171875, 48.155029296875], + [26.6189453125, 48.25986328125], + [26.6404296875, 48.294140625], + [26.8470703125, 48.387158203125], + [26.9005859375, 48.371923828125], + [27.228515625, 48.371435546875], + [27.54921875, 48.477734375], + [28.34052734375, 48.14443359375], + [28.423046875, 48.146875], + [29.125390625, 47.96455078125], + [29.13486328125, 47.489697265625], + [29.4556640625, 47.292626953125], + [29.57197265625, 46.964013671875], + [29.7197265625, 46.88291015625], + [29.87783203125, 46.82890625], + [29.94248046875, 46.723779296875], + [29.934765625, 46.625], + [29.92431640625, 46.5388671875], + [30.1310546875, 46.423095703125], + [30.07568359375, 46.37783203125], + [29.87802734375, 46.360205078125], + [29.837890625, 46.350537109375], + [29.4587890625, 46.453759765625], + [29.3048828125, 46.4666015625], + [29.223828125, 46.376953125], + [29.20458984375, 46.379345703125], + [29.20078125, 46.50498046875], + [29.18623046875, 46.523974609375], + [29.1462890625, 46.526904296875], + [28.9583984375, 46.45849609375], + [28.92744140625, 46.42412109375], + [28.93056640625, 46.362255859375], + [28.94375, 46.288427734375], + [29.00625, 46.17646484375], + [28.971875, 46.12763671875], + [28.94775390625, 46.049951171875], + [28.84951171875, 45.978662109375], + [28.73876953125, 45.937158203125], + [28.729296875, 45.852001953125], + [28.667578125, 45.79384765625], + [28.5623046875, 45.735791015625], + [28.4916015625, 45.665771484375], + [28.4990234375, 45.517724609375], + [28.3103515625, 45.498583984375], + [28.26484375, 45.48388671875], + [28.2125, 45.450439453125] + ] + ] + }, + "properties": { + "name": "Moldova", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [49.93642578125, -16.9029296875], + [49.8240234375, -17.0865234375], + [50.0230468750001, -16.6953125], + [49.93642578125, -16.9029296875] + ] + ], + [ + [ + [48.3421875, -13.3638671875], + [48.2119140625, -13.38525390625], + [48.1912109375001, -13.2599609375], + [48.3088867187501, -13.1982421875], + [48.3421875, -13.3638671875] + ] + ], + [ + [ + [49.53828125, -12.43212890625], + [49.9375, -13.072265625], + [50.2353515625, -14.73203125], + [50.4827148437501, -15.38564453125], + [50.208984375, -15.96044921875], + [50.0204101562501, -15.8017578125], + [49.892578125, -15.45771484375], + [49.6643554687501, -15.52158203125], + [49.8390625, -16.4865234375], + [49.7671875000001, -16.81513671875], + [49.4493164062501, -17.240625], + [49.4778320312501, -17.89853515625], + [49.362890625, -18.336328125], + [47.93447265625, -22.3939453125], + [47.5580078125001, -23.874609375], + [47.17734375, -24.78720703125], + [46.728515625, -25.14990234375], + [46.15869140625, -25.23037109375], + [45.5080078125001, -25.56318359375], + [45.2057617187501, -25.5705078125], + [44.0353515625001, -24.995703125], + [43.67001953125, -24.30029296875], + [43.722265625, -23.5296875], + [43.2648437500001, -22.38359375], + [43.29052734375, -21.93251953125], + [43.5018554687501, -21.3564453125], + [43.8001953125, -21.17919921875], + [44.4046875000001, -19.9220703125], + [44.4488281250001, -19.4287109375], + [44.23876953125, -19.0751953125], + [44.23310546875, -18.740625], + [44.0400390625, -18.2884765625], + [43.97939453125, -17.3916015625], + [44.42138671875, -16.70263671875], + [44.476171875, -16.21728515625], + [44.9091796875, -16.17451171875], + [45.2228515625001, -15.95048828125], + [45.3421875, -16.03671875], + [45.5982421875, -15.992578125], + [45.7001953125, -15.81376953125], + [46.1575195312501, -15.73828125], + [46.3996093750001, -15.924609375], + [46.3314453125, -15.713671875], + [46.47509765625, -15.5134765625], + [46.94228515625, -15.21904296875], + [47.09921875, -15.4341796875], + [47.0925781250001, -15.15009765625], + [47.3519531250001, -14.76611328125], + [47.4647460937501, -14.71328125], + [47.4783203125, -15.009375], + [47.7740234375001, -14.63671875], + [47.9641601562501, -14.67255859375], + [47.77333984375, -14.369921875], + [47.9955078125, -13.96044921875], + [47.88359375, -13.80751953125], + [47.9410156250001, -13.66240234375], + [48.03984375, -13.5962890625], + [48.2552734375001, -13.7193359375], + [48.796484375, -13.26748046875], + [48.91943359375, -12.8390625], + [48.786328125, -12.4708984375], + [48.93173828125, -12.4390625], + [49.20703125, -12.07958984375], + [49.53828125, -12.43212890625] + ] + ] + ] + }, + "properties": { + "name": "Madagascar", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-91.68369140625, 18.67734375], + [-91.81611328125, 18.67587890625], + [-91.53671875, 18.760009765625], + [-91.68369140625, 18.67734375] + ] + ], + [ + [ + [-86.9396484375, 20.3033203125], + [-86.977978515625, 20.4897949218751], + [-86.76328125, 20.579052734375], + [-86.9396484375, 20.3033203125] + ] + ], + [ + [ + [-106.50224609375, 21.61083984375], + [-106.60703125, 21.561474609375], + [-106.63935546875, 21.6978515625], + [-106.50224609375, 21.61083984375] + ] + ], + [ + [ + [-110.5673828125, 25.003466796875], + [-110.5388671875, 24.891552734375], + [-110.699267578125, 25.0814453125], + [-110.5673828125, 25.003466796875] + ] + ], + [ + [ + [-112.057275390625, 24.545703125], + [-112.29677734375, 24.7896484375001], + [-112.159423828125, 25.28564453125], + [-112.19501953125, 24.8410644531251], + [-112.057275390625, 24.545703125] + ] + ], + [ + [ + [-111.10029296875, 26.02060546875], + [-111.224658203125, 25.835888671875], + [-111.18291015625, 26.040625], + [-111.10029296875, 26.02060546875] + ] + ], + [ + [ + [-115.17060546875, 28.069384765625], + [-115.3529296875, 28.103955078125], + [-115.233544921875, 28.368359375], + [-115.17060546875, 28.069384765625] + ] + ], + [ + [ + [-112.203076171875, 29.005322265625], + [-112.27841796875, 28.7693359375], + [-112.5140625, 28.847607421875], + [-112.42353515625, 29.203662109375], + [-112.28505859375, 29.2404296875], + [-112.203076171875, 29.005322265625] + ] + ], + [ + [ + [-113.155615234375, 29.05224609375], + [-113.496337890625, 29.3076171875], + [-113.58720703125, 29.573046875], + [-113.2021484375, 29.30185546875], + [-113.155615234375, 29.05224609375] + ] + ], + [ + [ + [-97.1462402343749, 25.961474609375], + [-97.66767578125, 24.389990234375], + [-97.84248046875, 22.510302734375], + [-97.76328125, 22.105859375], + [-97.314501953125, 21.564208984375], + [-97.4091796875, 21.27255859375], + [-97.383447265625, 21.56669921875], + [-97.75380859375, 22.02666015625], + [-97.186328125, 20.717041015625], + [-96.4560546874999, 19.869775390625], + [-96.2895507812499, 19.34375], + [-95.778125, 18.805517578125], + [-95.920361328125, 18.819580078125], + [-95.626806640625, 18.690576171875], + [-95.71982421875, 18.768359375], + [-95.1818359375, 18.700732421875], + [-94.79814453125, 18.514599609375], + [-94.4597656249999, 18.166650390625], + [-93.55234375, 18.43046875], + [-92.884765625, 18.46865234375], + [-92.441015625, 18.67529296875], + [-91.973779296875, 18.7158691406251], + [-91.91357421875, 18.528515625], + [-91.5339843749999, 18.45654296875], + [-91.275244140625, 18.624462890625], + [-91.34306640625, 18.9005859375], + [-91.436669921875, 18.889794921875], + [-90.7392578124999, 19.35224609375], + [-90.6931640625, 19.7298828125], + [-90.49169921875, 19.94677734375], + [-90.353125, 21.009423828125], + [-89.819775390625, 21.274609375], + [-88.46669921875, 21.569384765625], + [-88.0068359375, 21.604052734375], + [-87.25087890625, 21.44697265625], + [-87.1882812499999, 21.546435546875], + [-87.368505859375, 21.57373046875], + [-87.034765625, 21.592236328125], + [-86.824072265625, 21.4216796875], + [-86.77177734375, 21.150537109375], + [-86.9262207031249, 20.786474609375], + [-87.42138671875, 20.231396484375], + [-87.441748046875, 19.8615234375], + [-87.6876953125, 19.637109375], + [-87.6453125, 19.55390625], + [-87.424755859375, 19.5833496093751], + [-87.65869140625, 19.3523437500001], + [-87.65576171875, 19.257861328125], + [-87.50107421875, 19.28779296875], + [-87.76181640625, 18.446142578125], + [-87.881982421875, 18.273876953125], + [-88.0564453125, 18.5244628906251], + [-88.03173828125, 18.838916015625], + [-88.2956542968749, 18.472412109375], + [-88.522998046875, 18.4458984375001], + [-88.80634765625, 17.96552734375], + [-89.133544921875, 17.97080078125], + [-89.161474609375, 17.81484375], + [-90.98916015625, 17.81640625], + [-90.9929687499999, 17.25244140625], + [-91.1955078125, 17.2541015625], + [-91.409619140625, 17.255859375], + [-90.975830078125, 16.867822265625], + [-90.710693359375, 16.70810546875], + [-90.6599609375, 16.630908203125], + [-90.634375, 16.56513671875], + [-90.63408203125, 16.5107421875], + [-90.57578125, 16.467822265625], + [-90.4710937499999, 16.43955078125], + [-90.4169921875, 16.391015625], + [-90.4169921875, 16.351318359375], + [-90.4501464843749, 16.261376953125], + [-90.45986328125, 16.162353515625], + [-90.4471679687499, 16.072705078125], + [-90.52197265625, 16.0711914062501], + [-90.70322265625, 16.071044921875], + [-90.97958984375, 16.07080078125], + [-91.433984375, 16.070458984375], + [-91.736572265625, 16.070166015625], + [-91.9572265625, 15.70322265625], + [-92.08212890625, 15.495556640625], + [-92.187158203125, 15.3208984375], + [-92.0748046875, 15.07421875], + [-92.09873046875, 15.0267578125], + [-92.14423828125, 15.001953125], + [-92.158544921875, 14.96357421875], + [-92.23515625, 14.54541015625], + [-93.9160644531249, 16.053564453125], + [-94.374169921875, 16.284765625], + [-94.426416015625, 16.22626953125], + [-94.00126953125, 16.0189453125], + [-94.6615234375, 16.201904296875], + [-94.587109375, 16.3158203125], + [-94.7908203125, 16.287158203125], + [-94.85869140625, 16.4197265625], + [-95.020849609375, 16.27763671875], + [-94.7994140625, 16.20966796875], + [-95.134375, 16.176953125], + [-96.2135742187499, 15.69306640625], + [-96.807958984375, 15.726416015625], + [-97.18466796875, 15.90927734375], + [-97.7547851562499, 15.966845703125], + [-98.5203124999999, 16.3048339843751], + [-98.76220703125, 16.534765625], + [-99.690673828125, 16.71962890625], + [-100.847802734375, 17.20048828125], + [-101.918701171875, 17.959765625], + [-102.699560546875, 18.062841796875], + [-103.4416015625, 18.325390625], + [-103.912451171875, 18.828466796875], + [-104.9384765625, 19.309375], + [-105.482080078125, 19.97607421875], + [-105.66943359375, 20.385595703125], + [-105.26015625, 20.579052734375], + [-105.32705078125, 20.752978515625], + [-105.51083984375, 20.808740234375], + [-105.237060546875, 21.119189453125], + [-105.20869140625, 21.4908203125], + [-105.4314453125, 21.61826171875], + [-105.64912109375, 21.9880859375], + [-105.6455078125, 22.326904296875], + [-105.791796875, 22.627490234375], + [-106.935498046875, 23.88125], + [-107.76494140625, 24.471923828125], + [-107.52724609375, 24.36005859375], + [-107.5119140625, 24.48916015625], + [-107.951171875, 24.614892578125], + [-108.28076171875, 25.08154296875], + [-108.05146484375, 25.067041015625], + [-108.69638671875, 25.38291015625], + [-108.787255859375, 25.538037109375], + [-109.02880859375, 25.48046875], + [-108.886572265625, 25.733447265625], + [-109.196484375, 25.592529296875], + [-109.3849609375, 25.7271484375], + [-109.425634765625, 26.0325683593751], + [-109.19970703125, 26.305224609375], + [-109.11669921875, 26.252734375], + [-109.27626953125, 26.53388671875], + [-109.482861328125, 26.7103515625], + [-109.75478515625, 26.7029296875], + [-109.943994140625, 27.0793457031251], + [-110.377294921875, 27.23330078125], + [-110.59267578125, 27.5443359375], + [-110.5298828125, 27.864208984375], + [-111.12138671875, 27.9669921875], + [-112.161767578125, 29.018896484375], + [-113.057666015625, 30.651025390625], + [-113.046728515625, 31.179248046875], + [-113.623486328125, 31.3458984375], + [-113.759423828125, 31.557763671875], + [-113.94775390625, 31.629345703125], + [-114.14931640625, 31.507373046875], + [-114.93359375, 31.900732421875], + [-114.789892578125, 31.647119140625], + [-114.881884765625, 31.156396484375], + [-114.55048828125, 30.022265625], + [-113.75546875, 29.36748046875], + [-113.49970703125, 28.926708984375], + [-113.20556640625, 28.798779296875], + [-113.09365234375, 28.511767578125], + [-112.870849609375, 28.4242187500001], + [-112.734033203125, 27.8259765625], + [-112.32919921875, 27.5234375], + [-111.862646484375, 26.678515625], + [-111.6994140625, 26.5809570312501], + [-111.795263671875, 26.8796875], + [-111.569677734375, 26.7076171875], + [-111.2916015625, 25.789794921875], + [-110.686767578125, 24.8676757812501], + [-110.659326171875, 24.3414550781251], + [-110.367431640625, 24.10048828125], + [-110.303759765625, 24.339453125], + [-110.022802734375, 24.174609375], + [-109.6765625, 23.661572265625], + [-109.420849609375, 23.480126953125], + [-109.495703125, 23.159814453125], + [-110.00625, 22.8940429687501], + [-110.3626953125, 23.604931640625], + [-111.68291015625, 24.555810546875], + [-111.802490234375, 24.5425292968751], + [-112.07255859375, 24.8400390625], + [-112.069873046875, 25.5728515625], + [-112.37724609375, 26.213916015625], + [-113.020751953125, 26.583251953125], + [-113.155810546875, 26.946240234375], + [-113.272265625, 26.790966796875], + [-113.59853515625, 26.7212890625], + [-113.840966796875, 26.96650390625], + [-114.445263671875, 27.2181640625], + [-114.539892578125, 27.431103515625], + [-114.993505859375, 27.73603515625], + [-115.036474609375, 27.841845703125], + [-114.57001953125, 27.783935546875], + [-114.3005859375, 27.872998046875], + [-114.30224609375, 27.775732421875], + [-114.0693359375, 27.6756835937501], + [-114.1583984375, 27.919677734375], + [-114.265869140625, 27.93447265625], + [-114.048486328125, 28.426171875], + [-114.9373046875, 29.351611328125], + [-115.673828125, 29.756396484375], + [-116.062158203125, 30.804150390625], + [-116.2962890625, 30.9705078125], + [-116.333447265625, 31.202783203125], + [-116.662158203125, 31.564892578125], + [-116.7220703125, 31.7345703125], + [-116.62080078125, 31.85107421875], + [-116.847998046875, 31.99736328125], + [-117.128271484375, 32.533349609375], + [-114.724755859375, 32.71533203125], + [-114.8359375, 32.50830078125], + [-111.0419921875, 31.32421875], + [-108.214453125, 31.329443359375], + [-108.21181640625, 31.779345703125], + [-106.44541015625, 31.768408203125], + [-106.148046875, 31.450927734375], + [-104.97880859375, 30.645947265625], + [-104.50400390625, 29.677685546875], + [-104.110595703125, 29.3861328125], + [-103.168310546875, 28.998193359375], + [-102.8919921875, 29.21640625], + [-102.61494140625, 29.75234375], + [-102.2689453125, 29.87119140625], + [-101.440380859375, 29.77685546875], + [-100.75458984375, 29.18251953125], + [-100.296044921875, 28.327685546875], + [-99.505322265625, 27.54833984375], + [-99.45654296875, 27.056689453125], + [-99.107763671875, 26.446923828125], + [-97.375634765625, 25.871826171875], + [-97.1462402343749, 25.961474609375] + ] + ] + ] + }, + "properties": { + "name": "Mexico", + "childNum": 10 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.34404296875, 42.31396484375], + [22.83681640625, 41.993603515625], + [23.00361328125, 41.73984375], + [22.916015625, 41.336279296875], + [22.78388671875, 41.331982421875], + [22.7248046875, 41.178515625], + [22.60361328125, 41.140185546875], + [22.4935546875, 41.118505859375], + [22.18447265625, 41.158642578125], + [21.993359375, 41.13095703125], + [21.7794921875, 40.950439453125], + [21.6275390625, 40.896337890625], + [21.57578125, 40.8689453125], + [20.9642578125, 40.84990234375], + [20.70927734375, 40.928369140625], + [20.48896484375, 41.272607421875], + [20.5662109375, 41.873681640625], + [20.725, 41.87353515625], + [20.778125, 42.071044921875], + [21.059765625, 42.1712890625], + [21.28662109375, 42.100390625], + [21.38955078125, 42.21982421875], + [21.56083984375, 42.24765625], + [21.5625, 42.247509765625], + [21.8146484375, 42.303125], + [22.34404296875, 42.31396484375] + ] + ] + }, + "properties": { + "name": "Macedonia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [4.22763671875001, 19.1427734375], + [4.23466796875002, 16.99638671875], + [4.12128906250001, 16.35771484375], + [3.84296875000001, 15.701708984375], + [3.5205078125, 15.48310546875], + [3.50429687500002, 15.35634765625], + [3.06015625, 15.427197265625], + [3.00107421875001, 15.340966796875], + [1.30019531250002, 15.272265625], + [0.947460937500011, 14.98212890625], + [0.217480468750011, 14.911474609375], + [-0.235888671874989, 15.059423828125], + [-0.760449218749983, 15.04775390625], + [-1.049560546875, 14.81953125], + [-1.97304687499999, 14.45654296875], + [-2.11323242187498, 14.16845703125], + [-2.58671874999999, 14.227587890625], + [-2.87392578124999, 13.950732421875], + [-2.95083007812499, 13.6484375], + [-3.24863281249998, 13.658349609375], + [-3.3017578125, 13.28076171875], + [-3.52763671874999, 13.18271484375], + [-3.94731445312499, 13.402197265625], + [-4.15102539062499, 13.306201171875], + [-4.32871093749998, 13.11904296875], + [-4.22709960937499, 12.793701171875], + [-4.48061523437499, 12.672216796875], + [-4.4287109375, 12.33759765625], + [-4.69931640624998, 12.076171875], + [-5.28813476562499, 11.8279296875], + [-5.250244140625, 11.37578125], + [-5.490478515625, 11.0423828125], + [-5.52353515624998, 10.426025390625], + [-5.55659179687498, 10.43994140625], + [-5.69428710937498, 10.433203125], + [-5.84384765624998, 10.38955078125], + [-5.89619140624998, 10.354736328125], + [-5.90756835937498, 10.3072265625], + [-6.03457031249999, 10.19482421875], + [-6.1171875, 10.201904296875], + [-6.23837890624998, 10.26162109375], + [-6.24130859374998, 10.27919921875], + [-6.192626953125, 10.36943359375], + [-6.190673828125, 10.40029296875], + [-6.250244140625, 10.717919921875], + [-6.48261718749998, 10.56123046875], + [-6.56459960937499, 10.58642578125], + [-6.65415039062498, 10.6564453125], + [-6.67636718749998, 10.6337890625], + [-6.68613281249998, 10.57802734375], + [-6.69199218749998, 10.51201171875], + [-6.66933593749999, 10.3921875], + [-6.69326171874999, 10.349462890625], + [-6.95034179687499, 10.342333984375], + [-7.01708984375, 10.14326171875], + [-7.38505859374999, 10.34013671875], + [-7.6611328125, 10.42744140625], + [-7.990625, 10.1625], + [-8.00727539062498, 10.321875], + [-8.26665039062499, 10.485986328125], + [-8.33740234375, 10.990625], + [-8.66669921874998, 11.00947265625], + [-8.39853515624998, 11.366552734375], + [-8.822021484375, 11.6732421875], + [-8.81831054687498, 11.922509765625], + [-9.04306640624998, 12.40234375], + [-9.39536132812498, 12.4646484375], + [-9.35810546874998, 12.255419921875], + [-9.75400390624998, 12.029931640625], + [-10.274853515625, 12.212646484375], + [-10.709228515625, 11.89873046875], + [-10.933203125, 12.20517578125], + [-11.30517578125, 12.0154296875], + [-11.502197265625, 12.1986328125], + [-11.389404296875, 12.40439453125], + [-11.390380859375, 12.9419921875], + [-11.6349609375, 13.369873046875], + [-11.831689453125, 13.3158203125], + [-12.05419921875, 13.633056640625], + [-11.960888671875, 13.87529296875], + [-12.019189453125, 14.206494140625], + [-12.22841796875, 14.45859375], + [-12.280615234375, 14.809033203125], + [-12.1046875, 14.745361328125], + [-12.08154296875, 14.766357421875], + [-12.02158203125, 14.804931640625], + [-11.76015625, 15.425537109375], + [-11.67587890625, 15.512060546875], + [-11.502685546875, 15.63681640625], + [-11.455224609375, 15.625390625], + [-10.9482421875, 15.151123046875], + [-10.69658203125, 15.42265625], + [-9.94140625, 15.373779296875], + [-9.44692382812499, 15.458203125], + [-9.44770507812498, 15.574853515625], + [-9.42656249999999, 15.623046875], + [-9.3505859375, 15.677392578125], + [-9.33544921875, 15.52568359375], + [-9.293701171875, 15.50283203125], + [-5.5125, 15.4962890625], + [-5.35991210937499, 16.282861328125], + [-5.50961914062498, 16.442041015625], + [-5.628662109375, 16.56865234375], + [-5.65625, 16.8095703125], + [-5.68476562499998, 17.058251953125], + [-5.71318359374999, 17.306884765625], + [-5.74169921875, 17.55556640625], + [-5.82709960937498, 18.3015625], + [-6.02641601562499, 20.0421875], + [-6.39658203124998, 23.2748046875], + [-6.48203124999998, 24.02080078125], + [-6.53896484374999, 24.5181640625], + [-6.5673828125, 24.766796875], + [-6.59409179687498, 24.99462890625], + [-6.28720703124998, 24.99482421875], + [-5.95981445312498, 24.994970703125], + [-5.64077148437499, 24.995166015625], + [-4.82260742187498, 24.99560546875], + [-1.94790039062499, 23.1248046875], + [1.1455078125, 21.10224609375], + [1.16572265625001, 20.817431640625], + [1.61064453125002, 20.55556640625], + [1.68544921875002, 20.378369140625], + [3.13027343750002, 19.8501953125], + [3.255859375, 19.4109375], + [3.11972656250001, 19.103173828125], + [3.3564453125, 18.98662109375], + [4.22763671875001, 19.1427734375] + ] + ] + }, + "properties": { + "name": "Mali", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [14.5662109375, 35.852734375], + [14.43642578125, 35.8216796875001], + [14.35126953125, 35.97841796875], + [14.5662109375, 35.852734375] + ] + ] + }, + "properties": { + "name": "Malta", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [98.1826171875, 9.93344726562501], + [98.11806640625, 9.87788085937505], + [98.2916992187501, 10.051318359375], + [98.1826171875, 9.93344726562501] + ] + ], + [ + [ + [98.209765625, 10.952734375], + [98.271484375, 10.739892578125], + [98.0804687500001, 10.88662109375], + [98.209765625, 10.952734375] + ] + ], + [ + [ + [98.5538085937501, 11.744873046875], + [98.5284179687501, 11.538671875], + [98.434765625, 11.56708984375], + [98.37646484375, 11.79150390625], + [98.5538085937501, 11.744873046875] + ] + ], + [ + [ + [98.516015625, 11.905029296875], + [98.4662109375001, 12.08427734375], + [98.6095703125, 11.956640625], + [98.516015625, 11.905029296875] + ] + ], + [ + [ + [98.06611328125, 12.389794921875], + [98.0023437500001, 12.27900390625], + [97.938671875, 12.34609375], + [98.06611328125, 12.389794921875] + ] + ], + [ + [ + [98.4139648437501, 12.59794921875], + [98.45947265625, 12.47373046875], + [98.3138671875, 12.335986328125], + [98.3121093750001, 12.678173828125], + [98.4139648437501, 12.59794921875] + ] + ], + [ + [ + [98.3154296875, 13.099072265625], + [98.3091796875001, 12.934716796875], + [98.26533203125, 13.20224609375], + [98.3154296875, 13.099072265625] + ] + ], + [ + [ + [94.8048828125, 15.8193359375], + [94.7334960937501, 15.823046875], + [94.8280273437501, 15.9330078125], + [94.8048828125, 15.8193359375] + ] + ], + [ + [ + [94.4767578125, 15.945947265625], + [94.4119140625001, 15.8483886718751], + [94.3878906250001, 15.994140625], + [94.60126953125, 16.205517578125], + [94.4767578125, 15.945947265625] + ] + ], + [ + [ + [97.575, 16.25322265625], + [97.48037109375, 16.305712890625], + [97.5419921875, 16.505078125], + [97.575, 16.25322265625] + ] + ], + [ + [ + [93.6908203125, 18.68427734375], + [93.4875, 18.8675292968751], + [93.7447265625001, 18.86552734375], + [93.6908203125, 18.68427734375] + ] + ], + [ + [ + [93.71484375, 19.558251953125], + [93.9457031250001, 19.42861328125], + [93.9019531250001, 19.33203125], + [93.755859375, 19.3256835937501], + [93.64404296875, 19.495068359375], + [93.71484375, 19.558251953125] + ] + ], + [ + [ + [93.4917968750001, 19.892578125], + [93.5132812500001, 19.75478515625], + [93.412890625, 19.950341796875], + [93.4917968750001, 19.892578125] + ] + ], + [ + [ + [93.0101562500001, 19.92392578125], + [93.0232421875001, 19.828857421875], + [92.9146484375001, 20.086474609375], + [93.0101562500001, 19.92392578125] + ] + ], + [ + [ + [101.1388671875, 21.56748046875], + [101.08037109375, 21.46865234375], + [100.703125, 21.2513671875], + [100.613671875, 21.059326171875], + [100.5666015625, 21.0381835937501], + [100.5361328125, 20.9923828125], + [100.522265625, 20.921923828125], + [100.54931640625, 20.884228515625], + [100.61767578125, 20.879248046875], + [100.62294921875, 20.8595703125], + [100.56513671875, 20.82509765625], + [100.407421875, 20.8232421875001], + [100.32607421875, 20.795703125], + [100.24931640625, 20.7302734375], + [100.18388671875, 20.5891113281251], + [100.1296875, 20.372216796875], + [100.1224609375, 20.3166503906251], + [100.00361328125, 20.37958984375], + [99.9542968750001, 20.4154296875], + [99.8903320312501, 20.4244140625], + [99.7201171875001, 20.325439453125], + [99.4588867187501, 20.363037109375], + [99.4859375000001, 20.149853515625], + [99.07421875, 20.099365234375], + [98.9166992187501, 19.772900390625], + [98.3712890625, 19.68916015625], + [98.0150390625001, 19.74951171875], + [97.816796875, 19.4599609375001], + [97.7458984375, 18.58818359375], + [97.37392578125, 18.51796875], + [97.6322265625001, 18.2903320312501], + [97.7064453125, 17.797119140625], + [98.4388671875, 16.97568359375], + [98.6607421875001, 16.330419921875], + [98.83544921875, 16.417578125], + [98.8882812500001, 16.351904296875], + [98.8179687500001, 16.180810546875], + [98.5923828125001, 16.0506835937501], + [98.5569335937501, 15.36767578125], + [98.1910156250001, 15.2041015625], + [98.2021484375, 14.975927734375], + [98.57001953125, 14.359912109375], + [99.1368164062501, 13.71669921875], + [99.12392578125, 13.03076171875], + [99.405078125, 12.547900390625], + [99.61474609375, 11.781201171875], + [99.1901367187501, 11.1052734375], + [98.7572265625, 10.6609375], + [98.7025390625001, 10.190380859375], + [98.5625976562501, 10.0349609375], + [98.4649414062501, 10.675830078125], + [98.6755859375001, 10.9869140625], + [98.74140625, 11.59169921875], + [98.8759765625, 11.7197265625], + [98.6363281250001, 11.73837890625], + [98.6962890625, 12.225244140625], + [98.6002929687501, 12.2453125], + [98.6787109375, 12.348486328125], + [98.5759765625, 13.1619140625], + [98.200390625, 13.98017578125], + [98.1495117187501, 13.647607421875], + [98.1106445312501, 13.712890625], + [98.1001953125001, 14.1615234375], + [97.9097656250001, 14.652685546875], + [98.01875, 14.6525878906251], + [97.8123046875001, 14.858935546875], + [97.7103515625, 15.8755371093751], + [97.5842773437501, 16.019580078125], + [97.7259765625001, 16.5685546875], + [97.3758789062501, 16.52294921875], + [97.2001953125, 17.09541015625], + [96.8514648437501, 17.401025390625], + [96.9085937500001, 17.03095703125], + [96.7654296875, 16.7103515625], + [96.43115234375, 16.504931640625], + [96.1890625000001, 16.7683105468751], + [96.3243164062501, 16.4444335937501], + [95.7632812500001, 16.16904296875], + [95.3895507812501, 15.72275390625], + [95.30146484375, 15.75615234375], + [95.3467773437501, 16.097607421875], + [95.176953125, 15.82568359375], + [94.9425781250001, 15.81826171875], + [94.8931640625001, 16.1828125], + [94.6615234375001, 15.90439453125], + [94.7033203125, 16.5119140625], + [94.4416015625001, 16.094384765625], + [94.223828125, 16.016455078125], + [94.5889648437501, 17.5693359375], + [94.1707031250001, 18.732421875], + [94.2457031250001, 18.741162109375], + [94.07001953125, 18.893408203125], + [94.044921875, 19.2874023437501], + [93.92919921875, 18.899658203125], + [93.7054687500001, 19.026904296875], + [93.4930664062501, 19.369482421875], + [93.82490234375, 19.2384765625], + [93.9981445312501, 19.440869140625], + [93.6117187500001, 19.77607421875], + [93.70703125, 19.9121582031251], + [93.25, 20.0701171875], + [93.1294921875001, 19.8580078125001], + [93.001953125, 20.074853515625], + [93.0667968750001, 20.37763671875], + [92.8283203125, 20.1775878906251], + [92.89111328125, 20.34033203125], + [92.7356445312501, 20.5626953125], + [92.7228515625, 20.29560546875], + [92.32412109375, 20.7918457031251], + [92.1795898437501, 21.293115234375], + [92.33056640625, 21.439794921875], + [92.631640625, 21.306201171875], + [92.5934570312501, 21.467333984375], + [92.5828125, 21.94033203125], + [92.57490234375, 21.978076171875], + [92.68896484375, 22.13095703125], + [92.72099609375, 22.1324218750001], + [92.77138671875, 22.10478515625], + [92.9645507812501, 22.003759765625], + [93.07060546875, 22.209423828125], + [93.16201171875, 22.360205078125], + [93.0787109375001, 22.718212890625], + [93.20390625, 23.0370117187501], + [93.3494140625001, 23.0849609375], + [93.3660156250001, 23.13251953125], + [93.3262695312501, 24.0642089843751], + [93.4521484375, 23.98740234375], + [93.6833984375001, 24.00654296875], + [94.0748046875001, 23.8720703125], + [94.2930664062501, 24.321875], + [94.37724609375, 24.47373046875], + [94.4931640625, 24.637646484375], + [94.7037109375001, 25.0978515625], + [94.5530273437501, 25.21572265625], + [94.6677734375001, 25.45888671875], + [94.9919921875, 25.770458984375], + [95.0152343750001, 25.912939453125], + [95.0929687500001, 25.9873046875], + [95.1324218750001, 26.0412597656251], + [95.1292968750001, 26.07041015625], + [95.1083984375, 26.09140625], + [95.0689453125001, 26.19111328125], + [95.0597656250001, 26.473974609375], + [95.2014648437501, 26.64140625], + [96.1908203125001, 27.261279296875], + [96.7978515625, 27.29619140625], + [96.95341796875, 27.13330078125], + [97.10205078125, 27.1154296875], + [97.1037109375, 27.163330078125], + [96.9019531250001, 27.439599609375], + [96.88359375, 27.51484375], + [96.96279296875, 27.698291015625], + [97.0497070312501, 27.760009765625], + [97.3435546875, 27.98232421875], + [97.302734375, 28.085986328125], + [97.3224609375001, 28.21796875], + [97.3564453125, 28.2544921875], + [97.4314453125, 28.35390625], + [97.537890625, 28.510205078125], + [97.5992187500001, 28.517041015625], + [98.0616210937501, 28.185888671875], + [98.298828125, 27.55009765625], + [98.4525390625, 27.6572265625], + [98.6511718750001, 27.5724609375], + [98.7384765625001, 26.7857421875], + [98.685546875, 26.18935546875], + [98.5640625000001, 26.072412109375], + [98.65625, 25.86357421875], + [98.3337890625001, 25.586767578125], + [98.1428710937501, 25.57109375], + [98.0107421875, 25.292529296875], + [97.8195312500001, 25.25185546875], + [97.7378906250001, 24.8698730468751], + [97.58330078125, 24.7748046875001], + [97.5314453125, 24.49169921875], + [97.7082031250001, 24.228759765625], + [97.5645507812501, 23.91103515625], + [98.2125, 24.11064453125], + [98.8350585937501, 24.12119140625], + [98.6767578125, 23.905078125], + [98.8322265625001, 23.624365234375], + [98.86376953125, 23.191259765625], + [99.4180664062501, 23.06923828125], + [99.50712890625, 22.959130859375], + [99.1929687500001, 22.1259765625], + [99.9176757812501, 22.02802734375], + [99.9407226562501, 21.758740234375], + [100.14765625, 21.480517578125], + [100.60458984375, 21.47177734375], + [101.07978515625, 21.755859375], + [101.1388671875, 21.56748046875] + ] + ] + ] + }, + "properties": { + "name": "Myanmar", + "childNum": 15 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.21875, 43.449951171875], + [19.67099609375, 43.16396484375], + [20.3443359375, 42.8279296875], + [20.054296875, 42.76005859375], + [20.06396484375, 42.547265625], + [19.78828125, 42.476171875], + [19.6544921875, 42.628564453125], + [19.2806640625, 42.17255859375], + [19.3423828125, 41.869091796875], + [18.436328125, 42.559716796875], + [18.5458984375, 42.6416015625], + [18.466015625, 42.77724609375], + [18.44384765625, 42.96845703125], + [18.46015625, 42.997900390625], + [18.4884765625, 43.012158203125], + [18.6236328125, 43.027685546875], + [18.621875, 43.124609375], + [18.67421875, 43.230810546875], + [18.74921875, 43.283544921875], + [18.85107421875, 43.346337890625], + [18.93466796875, 43.339453125], + [18.9787109375, 43.285400390625], + [19.02666015625, 43.292431640625], + [19.03671875, 43.35732421875], + [18.940234375, 43.496728515625], + [18.95068359375, 43.52666015625], + [18.97421875, 43.542333984375], + [19.0283203125, 43.53251953125], + [19.080078125, 43.517724609375], + [19.11279296875, 43.527734375], + [19.16435546875, 43.53544921875], + [19.1943359375, 43.53330078125], + [19.21875, 43.449951171875] + ] + ] + }, + "properties": { + "name": "Montenegro", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [111.878125, 43.68017578125], + [111.0072265625, 43.34140625], + [110.400390625, 42.773681640625], + [109.4431640625, 42.45595703125], + [109.33984375, 42.43837890625], + [108.6873046875, 42.41611328125], + [108.17119140625, 42.447314453125], + [106.77001953125, 42.288720703125], + [105.867578125, 41.993994140625], + [105.31435546875, 41.7708984375], + [105.1970703125, 41.738037109375], + [105.1154296875, 41.66328125], + [105.0505859375, 41.61591796875], + [104.98203125, 41.5955078125], + [104.4982421875, 41.65869140625], + [104.4982421875, 41.877001953125], + [104.30517578125, 41.846142578125], + [103.997265625, 41.79697265625], + [103.7111328125, 41.751318359375], + [103.0728515625, 42.00595703125], + [102.5751953125, 42.09208984375], + [102.156640625, 42.15810546875], + [101.97294921875, 42.215869140625], + [101.6599609375, 42.500048828125], + [101.5791015625, 42.52353515625], + [101.4953125, 42.53876953125], + [101.0919921875, 42.551318359375], + [100.51904296875, 42.616796875], + [100.086328125, 42.670751953125], + [99.9837890625, 42.67734375], + [99.46787109375, 42.568212890625], + [97.2056640625, 42.789794921875], + [96.38544921875, 42.720361328125], + [95.8595703125, 43.2759765625], + [95.5255859375, 43.953955078125], + [95.3255859375, 44.03935546875], + [95.35029296875, 44.278076171875], + [94.71201171875, 44.350830078125], + [93.5162109375, 44.944482421875], + [92.787890625, 45.0357421875], + [92.57890625, 45.010986328125], + [92.423828125, 45.008935546875], + [92.17265625, 45.03525390625], + [92.02978515625, 45.068505859375], + [91.584375, 45.076513671875], + [91.05, 45.217431640625], + [90.87724609375, 45.19609375], + [90.66181640625, 45.525244140625], + [91.0017578125, 46.035791015625], + [90.99677734375, 46.10498046875], + [90.94755859375, 46.177294921875], + [90.9115234375, 46.270654296875], + [90.9857421875, 46.7490234375], + [90.910546875, 46.883251953125], + [90.869921875, 46.9544921875], + [90.7990234375, 46.98515625], + [90.71552734375, 47.003857421875], + [90.49619140625, 47.28515625], + [90.4251953125, 47.5041015625], + [90.3474609375, 47.59697265625], + [90.3306640625, 47.65517578125], + [90.31328125, 47.676171875], + [90.191015625, 47.702099609375], + [90.10322265625, 47.74541015625], + [90.0279296875, 47.877685546875], + [89.95869140625, 47.886328125], + [89.91044921875, 47.8443359375], + [89.83134765625, 47.823291015625], + [89.778125, 47.827001953125], + [89.5609375, 48.003955078125], + [89.47919921875, 48.029052734375], + [89.04765625, 48.0025390625], + [88.97109375, 48.049951171875], + [88.9177734375, 48.089013671875], + [88.83828125, 48.101708984375], + [88.6818359375, 48.170556640625], + [88.5759765625, 48.220166015625], + [88.566796875, 48.317431640625], + [88.51708984375, 48.38447265625], + [88.41396484375, 48.40341796875], + [88.3099609375, 48.4720703125], + [87.9796875, 48.555126953125], + [88.06005859375, 48.707177734375], + [87.8318359375, 48.791650390625], + [87.7431640625, 48.881640625], + [87.87216796875, 49.000146484375], + [87.81630859375, 49.0802734375], + [87.8251953125, 49.11630859375], + [87.8142578125, 49.1623046875], + [87.934765625, 49.16455078125], + [87.9880859375, 49.1869140625], + [88.028515625, 49.219775390625], + [88.11572265625, 49.256298828125], + [88.192578125, 49.451708984375], + [88.633203125, 49.4861328125], + [88.831640625, 49.4484375], + [88.8638671875, 49.52763671875], + [88.9001953125, 49.539697265625], + [88.94541015625, 49.507666015625], + [88.97060546875, 49.483740234375], + [89.0083984375, 49.472802734375], + [89.10947265625, 49.5013671875], + [89.17998046875, 49.5322265625], + [89.2029296875, 49.595703125], + [89.2439453125, 49.62705078125], + [89.39560546875, 49.6115234375], + [89.475, 49.660546875], + [89.57919921875, 49.69970703125], + [89.6541015625, 49.71748046875], + [89.64384765625, 49.90302734375], + [90.0537109375, 50.09375], + [90.655078125, 50.22236328125], + [90.71435546875, 50.259423828125], + [90.7607421875, 50.30595703125], + [91.02158203125, 50.415478515625], + [91.2337890625, 50.452392578125], + [91.3005859375, 50.46337890625], + [91.3408203125, 50.470068359375], + [91.4150390625, 50.468017578125], + [91.446484375, 50.52216796875], + [91.804296875, 50.693603515625], + [92.10400390625, 50.6919921875], + [92.1923828125, 50.7005859375], + [92.35478515625, 50.86416015625], + [92.4263671875, 50.803076171875], + [92.62666015625, 50.68828125], + [92.68134765625, 50.683203125], + [92.738671875, 50.7109375], + [92.779296875, 50.778662109375], + [92.8564453125, 50.789111328125], + [92.94130859375, 50.77822265625], + [93.103125, 50.60390625], + [94.25107421875, 50.556396484375], + [94.3546875, 50.221826171875], + [94.61474609375, 50.02373046875], + [94.67548828125, 50.028076171875], + [94.71806640625, 50.04326171875], + [94.9302734375, 50.04375], + [95.11142578125, 49.93544921875], + [95.52265625, 49.91123046875], + [96.06552734375, 49.99873046875], + [96.3150390625, 49.901123046875], + [96.9857421875, 49.8828125], + [97.20859375, 49.730810546875], + [97.359765625, 49.741455078125], + [97.58935546875, 49.911474609375], + [98.00390625, 50.0142578125], + [98.25029296875, 50.30244140625], + [98.2794921875, 50.533251953125], + [98.14501953125, 50.5685546875], + [98.07890625, 50.60380859375], + [98.02978515625, 50.64462890625], + [97.82529296875, 50.98525390625], + [98.103125, 51.483544921875], + [98.64052734375, 51.801171875], + [98.8931640625, 52.11728515625], + [99.9216796875, 51.755517578125], + [100.0345703125, 51.737109375], + [100.23037109375, 51.729833984375], + [100.4689453125, 51.72607421875], + [100.53623046875, 51.7134765625], + [101.38125, 51.45263671875], + [101.5708984375, 51.4671875], + [101.82119140625, 51.421044921875], + [102.1115234375, 51.353466796875], + [102.1556640625, 51.31376953125], + [102.16005859375, 51.26083984375], + [102.1423828125, 51.216064453125], + [102.151953125, 51.10751953125], + [102.19453125, 51.05068359375], + [102.2150390625, 50.829443359375], + [102.3166015625, 50.71845703125], + [102.28837890625, 50.585107421875], + [103.30439453125, 50.20029296875], + [103.63291015625, 50.13857421875], + [103.7232421875, 50.153857421875], + [103.80263671875, 50.17607421875], + [104.0787109375, 50.154248046875], + [105.38359375, 50.47373046875], + [106.21787109375, 50.30458984375], + [106.36845703125, 50.317578125], + [106.5744140625, 50.32880859375], + [106.7111328125, 50.31259765625], + [106.94130859375, 50.1966796875], + [107.040234375, 50.086474609375], + [107.14306640625, 50.0330078125], + [107.23330078125, 49.989404296875], + [107.3470703125, 49.986669921875], + [107.63095703125, 49.98310546875], + [107.9166015625, 49.947802734375], + [107.9654296875, 49.653515625], + [108.40693359375, 49.39638671875], + [108.5224609375, 49.34150390625], + [108.613671875, 49.322802734375], + [109.23671875, 49.334912109375], + [109.4537109375, 49.296337890625], + [109.5287109375, 49.269873046875], + [110.19990234375, 49.17041015625], + [110.42783203125, 49.219970703125], + [110.709765625, 49.14296875], + [110.8279296875, 49.166162109375], + [111.20419921875, 49.304296875], + [111.33662109375, 49.355859375], + [111.429296875, 49.342626953125], + [112.0796875, 49.42421875], + [112.494921875, 49.53232421875], + [112.69736328125, 49.507275390625], + [112.8064453125, 49.523583984375], + [112.91484375, 49.56923828125], + [113.05556640625, 49.616259765625], + [113.09208984375, 49.692529296875], + [113.16416015625, 49.79716796875], + [113.31904296875, 49.87431640625], + [113.4455078125, 49.9416015625], + [113.57421875, 50.00703125], + [114.2970703125, 50.2744140625], + [114.7431640625, 50.23369140625], + [115.0033203125, 50.13857421875], + [115.27451171875, 49.948876953125], + [115.3650390625, 49.911767578125], + [115.42919921875, 49.896484375], + [115.58798828125, 49.88603515625], + [115.7177734375, 49.880615234375], + [115.79521484375, 49.905908203125], + [115.9259765625, 49.9521484375], + [116.1345703125, 50.010791015625], + [116.216796875, 50.00927734375], + [116.351171875, 49.978076171875], + [116.551171875, 49.9203125], + [116.68330078125, 49.823779296875], + [115.8205078125, 48.57724609375], + [115.79169921875, 48.455712890625], + [115.79658203125, 48.346337890625], + [115.785546875, 48.2482421875], + [115.639453125, 48.18623046875], + [115.52509765625, 48.130859375], + [115.61640625, 47.8748046875], + [115.8982421875, 47.6869140625], + [115.99384765625, 47.711328125], + [116.0748046875, 47.78955078125], + [116.23115234375, 47.858203125], + [116.3171875, 47.85986328125], + [116.37822265625, 47.84404296875], + [116.5134765625, 47.83955078125], + [116.651953125, 47.864501953125], + [116.760546875, 47.869775390625], + [116.901171875, 47.853076171875], + [116.95166015625, 47.836572265625], + [117.0697265625, 47.806396484375], + [117.2859375, 47.666357421875], + [117.35078125, 47.652197265625], + [117.768359375, 47.987890625], + [118.4984375, 47.983984375], + [118.5677734375, 47.94326171875], + [118.69052734375, 47.822265625], + [118.7599609375, 47.7576171875], + [118.8802734375, 47.72509765625], + [119.017578125, 47.6853515625], + [119.08193359375, 47.654150390625], + [119.7111328125, 47.15], + [119.8978515625, 46.8578125], + [119.8671875, 46.67216796875], + [119.7474609375, 46.627197265625], + [119.706640625, 46.606005859375], + [119.62021484375, 46.603955078125], + [119.4740234375, 46.62666015625], + [119.3318359375, 46.613818359375], + [119.162109375, 46.638671875], + [118.95712890625, 46.73486328125], + [118.8439453125, 46.760205078125], + [118.79033203125, 46.7470703125], + [118.72294921875, 46.69189453125], + [118.64873046875, 46.70166015625], + [118.58046875, 46.69189453125], + [118.40439453125, 46.703173828125], + [118.30869140625, 46.717041015625], + [118.1568359375, 46.678564453125], + [118.0712890625, 46.6666015625], + [117.7412109375, 46.5181640625], + [117.546875, 46.58828125], + [117.4380859375, 46.58623046875], + [117.40556640625, 46.5708984375], + [117.3921875, 46.53759765625], + [117.35634765625, 46.436669921875], + [117.35693359375, 46.39130859375], + [117.3333984375, 46.36201171875], + [116.85908203125, 46.387939453125], + [116.56259765625, 46.289794921875], + [116.21298828125, 45.8869140625], + [116.2291015625, 45.845751953125], + [116.240625, 45.79599609375], + [116.19765625, 45.73935546875], + [115.6810546875, 45.458251953125], + [115.16259765625, 45.390234375], + [114.91923828125, 45.378271484375], + [114.73876953125, 45.41962890625], + [114.56015625, 45.389990234375], + [114.419140625, 45.202587890625], + [114.1673828125, 45.049853515625], + [114.0802734375, 44.971142578125], + [113.87705078125, 44.89619140625], + [113.65263671875, 44.7634765625], + [113.58701171875, 44.745703125], + [113.0494140625, 44.8103515625], + [112.70673828125, 44.883447265625], + [112.59677734375, 44.91767578125], + [112.49931640625, 45.0109375], + [112.411328125, 45.058203125], + [112.112890625, 45.062939453125], + [112.0326171875, 45.081640625], + [111.898046875, 45.0640625], + [111.40224609375, 44.36728515625], + [111.93173828125, 43.81494140625], + [111.878125, 43.68017578125] + ] + ] + }, + "properties": { + "name": "Mongolia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [145.751953125, 15.133154296875], + [145.71318359375, 15.215283203125], + [145.821875, 15.265380859375], + [145.751953125, 15.133154296875] + ] + ] + }, + "properties": { + "name": "N. Mariana Is.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [32.112890625, -26.839453125], + [32.10595703125, -26.52001953125], + [32.04140625, -26.28125], + [32.060546875, -26.018359375], + [31.9482421875, -25.9576171875], + [31.98583984375, -24.46064453125], + [31.799609375, -23.8921875], + [31.54560546875, -23.48232421875], + [31.287890625, -22.40205078125], + [31.4294921875, -22.298828125], + [32.42978515625, -21.2970703125], + [32.35361328125, -21.1365234375], + [32.4923828125, -20.659765625], + [32.9927734375, -19.98486328125], + [32.77763671875, -19.38876953125], + [32.8498046875, -19.10439453125], + [32.69970703125, -18.94091796875], + [32.99306640625, -18.3595703125], + [32.87626953125, -16.88359375], + [32.948046875, -16.7123046875], + [31.93984375, -16.42880859375], + [31.23623046875, -16.0236328125], + [30.43779296875, -15.9953125], + [30.39609375, -15.64306640625], + [30.2318359375, -14.99033203125], + [33.2017578125, -14.01337890625], + [33.63642578125, -14.5681640625], + [34.375, -14.4248046875], + [34.5052734375, -14.59814453125], + [34.5408203125, -15.297265625], + [34.24609375, -15.82939453125], + [34.528125, -16.319140625], + [34.9333984375, -16.7603515625], + [35.112109375, -16.89853515625], + [35.0646484375, -17.07861328125], + [35.124609375, -17.12724609375], + [35.2013671875, -17.1310546875], + [35.27255859375, -17.11845703125], + [35.2904296875, -17.09697265625], + [35.28115234375, -16.8078125], + [35.22978515625, -16.6392578125], + [35.1783203125, -16.57333984375], + [35.1671875, -16.56025390625], + [35.2427734375, -16.375390625], + [35.35849609375, -16.160546875], + [35.59931640625, -16.12587890625], + [35.70888671875, -16.09580078125], + [35.7552734375, -16.05830078125], + [35.7912109375, -15.95869140625], + [35.8927734375, -14.891796875], + [35.86669921875, -14.86376953125], + [35.84716796875, -14.6708984375], + [35.6904296875, -14.46552734375], + [35.4884765625, -14.20107421875], + [35.37578125, -14.05869140625], + [35.2474609375, -13.896875], + [35.0138671875, -13.64345703125], + [34.6115234375, -13.437890625], + [34.545703125, -13.21630859375], + [34.542578125, -13.10869140625], + [34.3578125, -12.16474609375], + [34.60625, -11.6900390625], + [34.6595703125, -11.588671875], + [34.8265625, -11.57568359375], + [34.95947265625, -11.578125], + [35.1826171875, -11.5748046875], + [35.41826171875, -11.583203125], + [35.50439453125, -11.60478515625], + [35.56435546875, -11.60234375], + [35.63095703125, -11.58203125], + [35.78544921875, -11.4529296875], + [35.911328125, -11.4546875], + [36.0822265625, -11.5373046875], + [36.17548828125, -11.60927734375], + [36.19130859375, -11.670703125], + [36.3056640625, -11.70634765625], + [36.97890625, -11.5669921875], + [37.3728515625, -11.71044921875], + [37.54169921875, -11.67509765625], + [37.7248046875, -11.5806640625], + [37.92021484375, -11.2947265625], + [38.491796875, -11.41328125], + [38.9875, -11.16728515625], + [39.81708984375, -10.91240234375], + [39.988671875, -10.82080078125], + [40.46357421875, -10.46435546875], + [40.61171875, -10.6615234375], + [40.48662109375, -10.76513671875], + [40.59716796875, -10.8306640625], + [40.40283203125, -11.33203125], + [40.53154296875, -12.00458984375], + [40.487109375, -12.4921875], + [40.580859375, -12.635546875], + [40.43681640625, -12.98310546875], + [40.56875, -12.98466796875], + [40.595703125, -14.1228515625], + [40.715625, -14.214453125], + [40.64609375, -14.538671875], + [40.775, -14.4212890625], + [40.84453125, -14.71865234375], + [40.6177734375, -15.11552734375], + [40.6509765625, -15.2609375], + [39.98359375, -16.22548828125], + [39.79091796875, -16.29453125], + [39.84462890625, -16.43564453125], + [39.084375, -16.9728515625], + [38.144921875, -17.2427734375], + [37.24453125, -17.73994140625], + [36.93935546875, -17.99345703125], + [36.4037109375, -18.7697265625], + [36.262890625, -18.71962890625], + [36.23564453125, -18.861328125], + [35.8537109375, -18.993359375], + [34.9478515625, -19.8126953125], + [34.6494140625, -19.7013671875], + [34.75576171875, -19.82197265625], + [34.705078125, -20.473046875], + [34.98232421875, -20.80625], + [35.26767578125, -21.6509765625], + [35.31572265625, -22.396875], + [35.3830078125, -22.45458984375], + [35.45634765625, -22.11591796875], + [35.530078125, -22.24814453125], + [35.575390625, -22.9630859375], + [35.37041015625, -23.7982421875], + [35.5419921875, -23.8244140625], + [35.4896484375, -24.06552734375], + [34.99208984375, -24.6505859375], + [32.9611328125, -25.4904296875], + [32.5904296875, -26.0041015625], + [32.848828125, -26.26806640625], + [32.9548828125, -26.08359375], + [32.93359375, -26.25234375], + [32.88916015625, -26.83046875], + [32.8861328125, -26.84931640625], + [32.353515625, -26.86162109375], + [32.199609375, -26.83349609375], + [32.112890625, -26.839453125] + ] + ] + }, + "properties": { + "name": "Mozambique", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-16.37333984375, 19.7064453125], + [-16.4375488281249, 19.60927734375], + [-16.477001953125, 19.7103515625], + [-16.34365234375, 19.8662109375], + [-16.37333984375, 19.7064453125] + ] + ], + [ + [ + [-5.35991210937499, 16.282861328125], + [-5.5125, 15.4962890625], + [-9.293701171875, 15.50283203125], + [-9.35058593749994, 15.677392578125], + [-9.38535156249992, 15.667626953125], + [-9.4265625, 15.6230468750001], + [-9.44770507812493, 15.574853515625], + [-9.44692382812494, 15.458203125], + [-9.94140624999997, 15.373779296875], + [-10.69658203125, 15.42265625], + [-10.9482421875, 15.151123046875], + [-11.455224609375, 15.625390625], + [-11.7601562499999, 15.4255371093751], + [-11.828759765625, 15.244873046875], + [-11.8728515625, 14.995166015625], + [-12.0215820312499, 14.804931640625], + [-12.08154296875, 14.7663574218751], + [-12.1046875, 14.745361328125], + [-12.40869140625, 14.889013671875], + [-12.73525390625, 15.13125], + [-13.1052734375, 15.57177734375], + [-13.40966796875, 16.0591796875], + [-13.756640625, 16.172509765625], + [-13.8684570312499, 16.14814453125], + [-14.3000976562499, 16.5802734375], + [-14.990625, 16.676904296875], + [-15.768212890625, 16.485107421875], + [-16.239013671875, 16.531298828125], + [-16.4410156249999, 16.204541015625], + [-16.480078125, 16.097216796875], + [-16.5020507812499, 15.9173339843751], + [-16.53525390625, 15.8383789062501], + [-16.5357421875, 16.28681640625], + [-16.463623046875, 16.601513671875], + [-16.030322265625, 17.887939453125], + [-16.2130859374999, 19.0033203125], + [-16.514453125, 19.361962890625], + [-16.3052734375, 19.512646484375], + [-16.444873046875, 19.47314453125], + [-16.21044921875, 20.2279296875], + [-16.42978515625, 20.6523437500001], + [-16.622509765625, 20.6341796875], + [-16.8760742187499, 21.0861328125], + [-16.9982421874999, 21.039697265625], + [-17.048046875, 20.80615234375], + [-17.06396484375, 20.898828125], + [-16.96455078125, 21.329248046875], + [-15.231201171875, 21.331298828125], + [-14.0846679687499, 21.33271484375], + [-13.6260253906249, 21.333251953125], + [-13.3967285156249, 21.333544921875], + [-13.1674316406249, 21.3337890625001], + [-13.0162109374999, 21.333935546875], + [-13.02509765625, 21.466796875], + [-13.0322265625, 21.5720703125], + [-13.041748046875, 21.713818359375], + [-13.051220703125, 21.8547851562501], + [-13.0943359375, 22.4959960937501], + [-13.153271484375, 22.8205078125], + [-13.0314941406249, 23.000244140625], + [-12.89599609375, 23.08955078125], + [-12.739599609375, 23.1927246093751], + [-12.62041015625, 23.271337890625], + [-12.559375, 23.2908203125], + [-12.372900390625, 23.318017578125], + [-12.0234374999999, 23.467578125], + [-12.01630859375, 23.97021484375], + [-12.01630859375, 24.378662109375], + [-12.01630859375, 24.9232421875], + [-12.01630859375, 25.059375], + [-12.01630859375, 25.331689453125], + [-12.01630859375, 25.74013671875], + [-12.01630859375, 25.99541015625], + [-10.376123046875, 25.995458984375], + [-9.44453124999998, 25.9955078125001], + [-9.07192382812494, 25.9955078125001], + [-8.88564453124999, 25.9955078125001], + [-8.68222656249995, 25.9955078125001], + [-8.68212890625, 26.10947265625], + [-8.68212890625, 26.2731933593751], + [-8.68232421874996, 26.4977050781251], + [-8.68261718750003, 26.7231445312501], + [-8.68286132812497, 26.921337890625], + [-8.683349609375, 27.2859375], + [-4.82260742187495, 24.99560546875], + [-5.64077148437499, 24.995166015625], + [-5.95981445312498, 24.9949707031251], + [-6.28720703124998, 24.99482421875], + [-6.59409179687498, 24.99462890625], + [-6.39658203124998, 23.2748046875], + [-6.02641601562496, 20.0421875], + [-5.82709960937496, 18.3015625], + [-5.74169921874994, 17.55556640625], + [-5.71318359375002, 17.306884765625], + [-5.68476562499998, 17.058251953125], + [-5.62866210937503, 16.56865234375], + [-5.50961914062492, 16.442041015625], + [-5.35991210937499, 16.282861328125] + ] + ] + ] + }, + "properties": { + "name": "Mauritania", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-62.1484375, 16.74033203125], + [-62.221630859375, 16.69951171875], + [-62.191357421875, 16.80439453125], + [-62.1484375, 16.74033203125] + ] + ] + }, + "properties": { + "name": "Montserrat", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [57.65126953125, -20.48486328125], + [57.31767578125, -20.42763671875], + [57.416015625, -20.1837890625], + [57.65654296875, -19.98994140625], + [57.7919921875, -20.21259765625], + [57.65126953125, -20.48486328125] + ] + ] + }, + "properties": { + "name": "Mauritius", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.95947265625, -11.578125], + [34.8265625000001, -11.57568359375], + [34.6595703125001, -11.588671875], + [34.6185546875001, -11.62021484375], + [34.60625, -11.6900390625], + [34.3578125, -12.16474609375], + [34.542578125, -13.10869140625], + [34.545703125, -13.21630859375], + [34.6115234375001, -13.437890625], + [35.0138671875001, -13.64345703125], + [35.2474609375, -13.896875], + [35.37578125, -14.05869140625], + [35.4884765625, -14.20107421875], + [35.6904296875, -14.46552734375], + [35.84716796875, -14.6708984375], + [35.8927734375001, -14.891796875], + [35.7912109375001, -15.95869140625], + [35.7552734375001, -16.05830078125], + [35.70888671875, -16.09580078125], + [35.5993164062501, -16.12587890625], + [35.3584960937501, -16.160546875], + [35.2427734375, -16.375390625], + [35.1671875, -16.56025390625], + [35.1783203125, -16.57333984375], + [35.22978515625, -16.6392578125], + [35.28115234375, -16.8078125], + [35.2904296875001, -17.09697265625], + [35.2725585937501, -17.11845703125], + [35.2013671875001, -17.1310546875], + [35.124609375, -17.12724609375], + [35.0646484375, -17.07861328125], + [35.112109375, -16.89853515625], + [34.9333984375, -16.7603515625], + [34.528125, -16.319140625], + [34.24609375, -15.82939453125], + [34.5408203125, -15.297265625], + [34.5052734375001, -14.59814453125], + [34.375, -14.4248046875], + [33.63642578125, -14.5681640625], + [33.148046875, -13.94091796875], + [32.98125, -14.009375], + [32.7974609375, -13.6884765625], + [32.67041015625, -13.5904296875], + [32.967578125, -13.225], + [32.9751953125001, -12.7013671875], + [33.5123046875001, -12.34775390625], + [33.3401367187501, -12.30830078125], + [33.2523437500001, -12.11259765625], + [33.3039062500001, -11.6908203125], + [33.23271484375, -11.41767578125], + [33.268359375, -11.40390625], + [33.37978515625, -11.15791015625], + [33.2927734375, -10.85234375], + [33.6615234375, -10.553125], + [33.5537109375, -10.39130859375], + [33.53759765625, -10.3515625], + [33.52890625, -10.23466796875], + [33.3115234375, -10.03798828125], + [33.3371093750001, -9.95400390624999], + [33.3509765625, -9.86220703125004], + [33.25, -9.7595703125], + [33.148046875, -9.603515625], + [32.9959960937501, -9.62285156249995], + [32.919921875, -9.40742187500003], + [33.8888671875, -9.67011718749998], + [33.99560546875, -9.49541015625], + [34.3208984375001, -9.73154296874998], + [34.5699218750001, -10.24111328125], + [34.6670898437501, -10.79248046875], + [34.60791015625, -11.08046875], + [34.7738281250001, -11.34169921875], + [34.890625, -11.3935546875], + [34.93701171875, -11.4634765625], + [34.95947265625, -11.578125] + ] + ] + }, + "properties": { + "name": "Malawi", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [111.3892578125, 2.41533203125003], + [111.3115234375, 2.43759765625003], + [111.33349609375, 2.768310546875], + [111.3892578125, 2.41533203125003] + ] + ], + [ + [ + [104.22158203125, 2.73173828125], + [104.1291015625, 2.76723632812504], + [104.184765625, 2.87172851562501], + [104.22158203125, 2.73173828125] + ] + ], + [ + [ + [117.884765625, 4.18613281250001], + [117.6490234375, 4.16899414062497], + [117.7080078125, 4.26240234375], + [117.884765625, 4.18613281250001] + ] + ], + [ + [ + [100.28896484375, 5.29472656249999], + [100.191015625, 5.28286132812498], + [100.2455078125, 5.46777343749999], + [100.3388671875, 5.41005859375004], + [100.28896484375, 5.29472656249999] + ] + ], + [ + [ + [99.848046875, 6.46572265624999], + [99.9186523437501, 6.35859375000001], + [99.74375, 6.26328124999996], + [99.6462890625, 6.41835937500002], + [99.848046875, 6.46572265624999] + ] + ], + [ + [ + [102.10107421875, 6.24223632812503], + [102.34013671875, 6.17202148437502], + [102.534375, 5.86254882812503], + [103.0970703125, 5.40844726562499], + [103.4158203125, 4.85029296875004], + [103.439453125, 2.93310546875], + [103.81220703125, 2.58046875], + [104.2185546875, 1.7228515625], + [104.25009765625, 1.38857421875001], + [104.11494140625, 1.41225585937504], + [103.9814453125, 1.62363281250003], + [103.99150390625, 1.45478515625], + [103.69453125, 1.44965820312503], + [103.4802734375, 1.32949218749997], + [103.3568359375, 1.54614257812506], + [102.7271484375, 1.85556640625003], + [101.2955078125, 2.88520507812501], + [101.29990234375, 3.25327148437503], + [100.7154296875, 3.96621093749997], + [100.7955078125, 4.02338867187498], + [100.61455078125, 4.3734375], + [100.34326171875, 5.98417968750003], + [100.119140625, 6.44199218750005], + [100.26142578125, 6.68271484374996], + [100.34541015625, 6.54990234375001], + [100.7544921875, 6.46005859374999], + [100.87392578125, 6.24541015624996], + [101.053515625, 6.242578125], + [100.981640625, 5.77104492187505], + [101.11396484375, 5.63676757812505], + [101.5560546875, 5.907763671875], + [101.67841796875, 5.77880859375003], + [101.8736328125, 5.82529296874999], + [102.10107421875, 6.24223632812503] + ] + ], + [ + [ + [117.5744140625, 4.17060546875004], + [117.1005859375, 4.33706054687502], + [116.51474609375, 4.37080078124997], + [115.8607421875, 4.34804687500004], + [115.67880859375, 4.19301757812499], + [115.45439453125, 3.03432617187501], + [115.24697265625, 3.02592773437499], + [115.117578125, 2.89487304687502], + [115.08076171875, 2.63422851562504], + [115.1791015625, 2.52319335937497], + [114.78642578125, 2.25048828125001], + [114.83056640625, 1.98002929687499], + [114.5125, 1.45200195312496], + [113.90234375, 1.43427734375], + [113.622265625, 1.2359375], + [113.00654296875, 1.43388671875], + [112.94296875, 1.56699218750003], + [112.476171875, 1.55908203125003], + [112.1857421875, 1.4390625], + [112.078515625, 1.14335937499997], + [111.808984375, 1.01166992187497], + [111.1013671875, 1.05053710937499], + [110.50576171875, 0.861962890625023], + [109.65400390625, 1.61489257812502], + [109.53896484375, 1.89619140625004], + [109.62890625, 2.02753906249998], + [109.86484375, 1.76445312500003], + [110.34921875, 1.71972656249997], + [111.2232421875, 1.39584960937499], + [111.0287109375, 1.55781250000003], + [111.2681640625, 2.13974609375002], + [111.20859375, 2.37963867187504], + [111.44384765625, 2.38154296874998], + [111.5125, 2.74301757812499], + [112.987890625, 3.16191406249997], + [113.92392578125, 4.243212890625], + [114.0638671875, 4.59267578124997], + [114.6541015625, 4.03764648437505], + [114.840234375, 4.39321289062501], + [114.7466796875, 4.71806640625002], + [115.0267578125, 4.89970703124999], + [115.10703125, 4.39042968749997], + [115.290625, 4.35258789062499], + [115.1400390625, 4.89975585937499], + [115.37490234375, 4.93276367187497], + [115.5544921875, 5.09355468750005], + [115.41904296875, 5.41318359374996], + [115.60390625, 5.60341796874999], + [115.7408203125, 5.53300781250005], + [115.8771484375, 5.61352539062501], + [116.7498046875, 6.97709960937499], + [116.8498046875, 6.82670898437499], + [116.7880859375, 6.60610351562499], + [117.128515625, 6.96889648437501], + [117.2298828125, 6.93999023437497], + [117.29404296875, 6.67690429687502], + [117.60966796875, 6.51264648437505], + [117.69375, 6.35], + [117.64453125, 6.00185546874999], + [117.501171875, 5.88466796875001], + [118.00380859375, 6.05332031249999], + [118.1158203125, 5.8625], + [117.934765625, 5.7875], + [117.9736328125, 5.70625], + [118.353125, 5.80605468749998], + [118.59482421875, 5.59208984375], + [119.2234375, 5.41264648437503], + [119.26630859375, 5.30810546875006], + [119.21962890625, 5.15981445312504], + [118.9125, 5.02290039062504], + [118.260546875, 4.98886718750003], + [118.1853515625, 4.82851562500005], + [118.5625, 4.5021484375], + [118.54833984375, 4.37924804687501], + [118.008203125, 4.25024414062501], + [117.696484375, 4.34282226562505], + [117.5744140625, 4.17060546875004] + ] + ], + [ + [ + [117.1416015625, 7.16821289062503], + [117.0806640625, 7.11528320312499], + [117.0642578125, 7.26069335937504], + [117.2640625, 7.35166015625001], + [117.266796875, 7.22080078124999], + [117.1416015625, 7.16821289062503] + ] + ] + ] + }, + "properties": { + "name": "Malaysia", + "childNum": 8 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.3806640625, -17.640625], + [24.27490234375, -17.4810546875], + [24.73291015625, -17.5177734375], + [25.0017578125, -17.5685546875], + [25.2587890625, -17.7935546875], + [24.90908203125, -17.82138671875], + [24.53056640625, -18.052734375], + [24.2439453125, -18.0234375], + [23.59970703125, -18.4599609375], + [23.2193359375, -17.99970703125], + [20.97412109375, -18.31884765625], + [20.9794921875, -21.9619140625], + [19.97734375, -22.0001953125], + [19.98046875, -24.7767578125], + [19.98046875, -28.3103515625], + [19.98046875, -28.45126953125], + [19.53984375, -28.574609375], + [19.3126953125, -28.73330078125], + [19.24580078125, -28.90166015625], + [19.16171875, -28.93876953125], + [18.31083984375, -28.88623046875], + [17.44794921875, -28.69814453125], + [17.3478515625, -28.501171875], + [17.35869140625, -28.26943359375], + [17.1884765625, -28.13251953125], + [17.05625, -28.0310546875], + [16.93330078125, -28.06962890625], + [16.87529296875, -28.1279296875], + [16.8412109375, -28.2189453125], + [16.81015625, -28.26455078125], + [16.7875, -28.3947265625], + [16.75576171875, -28.4521484375], + [16.626171875, -28.487890625], + [16.487109375, -28.5728515625], + [16.44755859375, -28.617578125], + [15.71904296875, -27.9658203125], + [15.34150390625, -27.3865234375], + [15.1390625, -26.5080078125], + [14.9677734375, -26.31806640625], + [14.837109375, -25.033203125], + [14.5015625, -24.201953125], + [14.46279296875, -22.44912109375], + [13.4505859375, -20.91669921875], + [13.168359375, -20.18466796875], + [12.458203125, -18.9267578125], + [11.77587890625, -18.0017578125], + [11.73349609375, -17.7509765625], + [11.74306640625, -17.24921875], + [11.9025390625, -17.2265625], + [12.01396484375, -17.1685546875], + [12.21337890625, -17.2099609375], + [12.31845703125, -17.21337890625], + [12.35927734375, -17.205859375], + [12.54814453125, -17.2126953125], + [13.1794921875, -16.9716796875], + [13.4759765625, -17.0400390625], + [14.01748046875, -17.40888671875], + [16.1484375, -17.390234375], + [18.39638671875, -17.3994140625], + [18.9552734375, -17.803515625], + [20.1943359375, -17.863671875], + [20.7455078125, -18.0197265625], + [22.32421875, -17.8375], + [23.3806640625, -17.640625] + ] + ] + }, + "properties": { + "name": "Namibia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [167.54443359375, -22.6232421875], + [167.44375, -22.63916015625], + [167.44345703125, -22.54140625], + [167.54443359375, -22.6232421875] + ] + ], + [ + [ + [168.0109375, -21.42998046875], + [168.1390625, -21.44521484375], + [168.120703125, -21.6158203125], + [167.966796875, -21.6416015625], + [167.8154296875, -21.39267578125], + [167.9884765625, -21.337890625], + [168.0109375, -21.42998046875] + ] + ], + [ + [ + [167.40087890625, -21.16064453125], + [167.07265625, -20.997265625], + [167.03271484375, -20.92255859375], + [167.189453125, -20.803515625], + [167.05576171875, -20.72021484375], + [167.29794921875, -20.73251953125], + [167.40087890625, -21.16064453125] + ] + ], + [ + [ + [164.20234375, -20.24609375], + [164.4359375, -20.2822265625], + [165.191796875, -20.76884765625], + [165.66279296875, -21.2671875], + [166.9423828125, -22.09013671875], + [166.9703125, -22.3228515625], + [166.77412109375, -22.376171875], + [166.46796875, -22.2560546875], + [164.92744140625, -21.28984375], + [164.1697265625, -20.48017578125], + [164.05966796875, -20.14150390625], + [164.20234375, -20.24609375] + ] + ] + ] + }, + "properties": { + "name": "New Caledonia", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [14.97900390625, 22.99619140625], + [15.1818359375, 21.523388671875], + [15.60732421875, 20.95439453125], + [15.587109375, 20.73330078125], + [15.96318359375, 20.34619140625], + [15.73505859375, 19.904052734375], + [15.47431640625, 16.9083984375], + [14.36796875, 15.750146484375], + [13.4482421875, 14.3806640625], + [13.50576171875, 14.134423828125], + [13.60634765625, 13.70458984375], + [13.426953125, 13.7017578125], + [13.323828125, 13.670849609375], + [12.8716796875, 13.4490234375], + [12.65478515625, 13.3265625], + [12.46318359375, 13.09375], + [10.95888671875, 13.371533203125], + [10.47587890625, 13.330224609375], + [10.22958984375, 13.281005859375], + [10.18466796875, 13.2701171875], + [9.61591796875001, 12.81064453125], + [9.20156250000002, 12.821484375], + [8.75058593750001, 12.908154296875], + [8.4560546875, 13.05966796875], + [8.09501953125002, 13.291162109375], + [7.95576171875001, 13.32275390625], + [7.788671875, 13.337890625], + [7.05673828125001, 13.0001953125], + [6.804296875, 13.107666015625], + [6.2998046875, 13.6587890625], + [6.18427734375001, 13.663671875], + [5.83818359375002, 13.765380859375], + [5.49199218750002, 13.8728515625], + [5.41582031250002, 13.8591796875], + [5.36162109375002, 13.836865234375], + [5.24189453125001, 13.7572265625], + [4.66484375000002, 13.733203125], + [4.14755859375001, 13.45771484375], + [3.94785156250001, 12.775048828125], + [3.64667968750001, 12.52998046875], + [3.59541015625001, 11.6962890625], + [2.80527343750001, 12.383837890625], + [2.36601562500002, 12.221923828125], + [2.38916015625, 11.8970703125], + [2.07294921875001, 12.309375], + [2.22626953125001, 12.466064453125], + [2.10458984375001, 12.70126953125], + [1.56494140625, 12.635400390625], + [0.9873046875, 13.04189453125], + [0.988476562500011, 13.36484375], + [1.201171875, 13.35751953125], + [0.6181640625, 13.70341796875], + [0.42919921875, 13.972119140625], + [0.382519531250011, 14.24580078125], + [0.163867187500017, 14.497216796875], + [0.217480468750011, 14.911474609375], + [0.947460937500011, 14.98212890625], + [1.30019531250002, 15.272265625], + [3.00107421875001, 15.340966796875], + [3.06015625, 15.427197265625], + [3.50429687500002, 15.35634765625], + [3.5205078125, 15.48310546875], + [3.84296875000001, 15.701708984375], + [4.12128906250001, 16.35771484375], + [4.23466796875002, 16.99638671875], + [4.22763671875001, 19.1427734375], + [5.83662109375001, 19.479150390625], + [7.48173828125002, 20.873095703125], + [11.96787109375, 23.51787109375], + [13.48125, 23.18017578125], + [14.21552734375, 22.619677734375], + [14.97900390625, 22.99619140625] + ] + ] + }, + "properties": { + "name": "Niger", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [7.30078125, 4.41816406250003], + [7.14042968750002, 4.39511718750003], + [7.22734375000005, 4.52734374999997], + [7.30078125, 4.41816406250003] + ] + ], + [ + [ + [6.804296875, 13.107666015625], + [7.05673828125001, 13.0001953125], + [7.788671875, 13.337890625], + [7.95576171875001, 13.32275390625], + [8.09501953125005, 13.291162109375], + [8.75058593750003, 12.908154296875], + [9.20156250000008, 12.821484375], + [9.61591796875001, 12.81064453125], + [10.1846679687501, 13.2701171875], + [10.22958984375, 13.281005859375], + [10.4758789062501, 13.330224609375], + [10.9588867187501, 13.371533203125], + [12.46318359375, 13.09375], + [12.6547851562501, 13.3265625], + [13.4269531250001, 13.7017578125], + [13.60634765625, 13.70458984375], + [13.93232421875, 13.25849609375], + [14.06396484375, 13.078515625], + [14.16005859375, 12.61279296875], + [14.18486328125, 12.447216796875], + [14.2728515625, 12.356494140625], + [14.5189453125001, 12.2982421875], + [14.6197265625001, 12.1509765625], + [14.559765625, 11.49228515625], + [14.20234375, 11.2681640625], + [14.1432617187501, 11.24853515625], + [14.05673828125, 11.24501953125], + [13.9814453125001, 11.211865234375], + [13.8920898437501, 11.140087890625], + [13.69990234375, 10.87314453125], + [13.5353515625, 10.605078125], + [13.41455078125, 10.171435546875], + [13.2699218750001, 10.036181640625], + [13.19873046875, 9.56376953125], + [12.9294921875001, 9.42626953124997], + [12.87568359375, 9.30351562500002], + [12.8065429687501, 8.88662109374999], + [12.7822265625, 8.81787109375001], + [12.6515625, 8.66777343749999], + [12.403515625, 8.59555664062502], + [12.3113281250001, 8.41972656249999], + [12.2333984375, 8.28232421874998], + [12.0160156250001, 7.58974609375001], + [11.8091796875, 7.34506835937499], + [11.7673828125, 7.27226562499999], + [11.86142578125, 7.11640625000004], + [11.65751953125, 6.95156250000002], + [11.5800781250001, 6.88886718750004], + [11.55166015625, 6.697265625], + [11.1533203125001, 6.43793945312501], + [11.1064453125, 6.45771484375005], + [11.03251953125, 6.69790039062504], + [10.95419921875, 6.7765625], + [10.60625, 7.06308593750001], + [10.41318359375, 6.877734375], + [10.29306640625, 6.87675781249997], + [10.2054687500001, 6.89160156249999], + [10.185546875, 6.91279296875004], + [10.1677734375, 6.95917968749998], + [10.1435546875001, 6.99643554687502], + [10.0388671875, 6.92138671875001], + [9.87421875000007, 6.80327148437502], + [9.82070312500008, 6.78393554687499], + [9.77988281250003, 6.76015625000002], + [9.72558593749997, 6.65], + [9.65996093750002, 6.53198242187499], + [9.490234375, 6.41865234375], + [8.99716796875001, 5.917724609375], + [8.715625, 5.046875], + [8.51484375000007, 4.72470703125003], + [8.23378906250008, 4.90747070312497], + [8.29306640625001, 4.55761718750001], + [7.64423828125007, 4.52534179687501], + [7.53076171875003, 4.65517578124999], + [7.284375, 4.54765625000003], + [7.07656250000005, 4.71616210937499], + [7.15468750000008, 4.514404296875], + [6.92324218750008, 4.39067382812502], + [6.76767578125001, 4.72470703125003], + [6.86035156250006, 4.37333984375005], + [6.63300781250001, 4.34023437500005], + [6.57998046875005, 4.47597656249999], + [6.55458984375002, 4.34140625000002], + [6.263671875, 4.30942382812499], + [6.27099609374997, 4.43212890625003], + [6.17333984374997, 4.27739257812503], + [5.970703125, 4.33857421874998], + [5.58779296875005, 4.64721679687497], + [5.44814453125002, 4.94584960937497], + [5.38330078125006, 5.12900390624998], + [5.47597656250002, 5.15385742187499], + [5.37001953125002, 5.19501953125003], + [5.36796875000005, 5.33774414062496], + [5.54970703125002, 5.47421874999996], + [5.38583984375003, 5.40175781250004], + [5.19921875000003, 5.53354492187498], + [5.45664062499998, 5.61171875], + [5.32734375000001, 5.70751953124999], + [5.11240234375003, 5.64155273437504], + [4.86103515625007, 6.026318359375], + [4.43134765625001, 6.34858398437503], + [3.45078124999998, 6.42705078125002], + [3.71699218750004, 6.59794921875002], + [3.43017578125006, 6.525], + [3.33554687500006, 6.39692382812501], + [2.70644531250005, 6.36923828124996], + [2.73564453125005, 6.595703125], + [2.75371093749999, 6.66176757812497], + [2.77460937499998, 6.71171875000002], + [2.75292968750003, 6.77163085937497], + [2.73173828125005, 6.85283203124999], + [2.72138671875007, 6.98027343750002], + [2.75673828125008, 7.06791992187502], + [2.75048828125006, 7.39506835937496], + [2.76582031250007, 7.42250976562505], + [2.78398437500005, 7.44340820312505], + [2.78515625, 7.47685546875002], + [2.703125, 8.371826171875], + [2.77480468750002, 9.04853515625003], + [3.044921875, 9.08383789062502], + [3.32519531249997, 9.77846679687505], + [3.60205078125, 10.004541015625], + [3.64658203125001, 10.408984375], + [3.77177734375002, 10.417626953125], + [3.83447265625, 10.607421875], + [3.7568359375, 10.76875], + [3.71640625, 11.07958984375], + [3.69531249999997, 11.1203125], + [3.63886718750004, 11.17685546875], + [3.48779296874997, 11.39541015625], + [3.49052734375002, 11.4992187500001], + [3.55390625000004, 11.631884765625], + [3.59541015625007, 11.6962890625001], + [3.66474609375007, 11.762451171875], + [3.64667968750001, 12.52998046875], + [3.94785156250001, 12.775048828125], + [4.14755859375001, 13.45771484375], + [4.66484375000005, 13.733203125], + [5.24189453125001, 13.7572265625], + [5.36162109375007, 13.8368652343751], + [5.41582031250002, 13.8591796875], + [5.49199218750007, 13.8728515625], + [6.2998046875, 13.6587890625], + [6.804296875, 13.107666015625] + ] + ] + ] + }, + "properties": { + "name": "Nigeria", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-83.6419921875, 10.917236328125], + [-83.712939453125, 10.785888671875], + [-83.919287109375, 10.7353515625], + [-84.6341796875, 11.04560546875], + [-84.9091796875, 10.9453125], + [-85.5841796875, 11.189453125], + [-85.7443359375, 11.062109375], + [-87.670166015625, 12.965673828125], + [-87.58505859375, 13.043310546875], + [-87.424365234375, 12.921142578125], + [-87.337255859375, 12.979248046875], + [-87.0591796875, 12.991455078125], + [-87.009326171875, 13.0078125], + [-86.918212890625, 13.223583984375], + [-86.87353515625, 13.26650390625], + [-86.792138671875, 13.27978515625], + [-86.729296875, 13.284375], + [-86.710693359375, 13.31337890625], + [-86.763525390625, 13.63525390625], + [-86.77060546875, 13.69873046875], + [-86.758984375, 13.746142578125], + [-86.733642578125, 13.7634765625], + [-86.61025390625, 13.774853515625], + [-86.376953125, 13.7556640625], + [-86.33173828125, 13.770068359375], + [-86.238232421875, 13.899462890625], + [-86.151220703125, 13.994580078125], + [-86.0892578125, 14.03720703125], + [-86.040380859375, 14.050146484375], + [-85.9837890625, 13.965673828125], + [-85.78671875, 13.84443359375], + [-85.75341796875, 13.85205078125], + [-85.733935546875, 13.85869140625], + [-85.727734375, 13.87607421875], + [-85.731201171875, 13.9318359375], + [-85.68193359375, 13.982568359375], + [-85.208349609375, 14.31181640625], + [-85.059375, 14.582958984375], + [-84.86044921875, 14.809765625], + [-84.645947265625, 14.661083984375], + [-84.537646484375, 14.6333984375], + [-83.635498046875, 14.876416015625], + [-83.5365234375, 14.977001953125], + [-83.4150390625, 15.008056640625], + [-83.15751953125, 14.99306640625], + [-83.1853515625, 14.956396484375], + [-83.21591796875, 14.932373046875], + [-83.2798828125, 14.81279296875], + [-83.344384765625, 14.902099609375], + [-83.413720703125, 14.825341796875], + [-83.29921875, 14.7490234375], + [-83.187744140625, 14.340087890625], + [-83.4123046875, 13.996484375], + [-83.567333984375, 13.3203125], + [-83.5109375, 12.41181640625], + [-83.627197265625, 12.459326171875], + [-83.593359375, 12.7130859375], + [-83.754248046875, 12.501953125], + [-83.680419921875, 12.02431640625], + [-83.7671875, 12.05927734375], + [-83.82890625, 11.86103515625], + [-83.70458984375, 11.824560546875], + [-83.6517578125, 11.642041015625], + [-83.86787109375, 11.300048828125], + [-83.6419921875, 10.917236328125] + ] + ] + }, + "properties": { + "name": "Nicaragua", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-169.80341796875, -19.0830078125], + [-169.94833984375, -19.0728515625], + [-169.834033203125, -18.966015625], + [-169.80341796875, -19.0830078125] + ] + ] + }, + "properties": { + "name": "Niue", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-68.205810546875, 12.144580078125], + [-68.254345703125, 12.032080078125], + [-68.36923828125, 12.301953125], + [-68.205810546875, 12.144580078125] + ] + ], + [ + [ + [4.22617187500003, 51.386474609375], + [3.90205078125001, 51.207666015625], + [3.43251953125008, 51.2457519531251], + [3.35009765625, 51.377685546875], + [4.22617187500003, 51.386474609375] + ] + ], + [ + [ + [3.94912109375008, 51.739453125], + [4.07509765625008, 51.648779296875], + [3.69902343750002, 51.709912109375], + [3.94912109375008, 51.739453125] + ] + ], + [ + [ + [4.88613281250002, 53.0707031250001], + [4.70917968750004, 53.03603515625], + [4.88642578124998, 53.18330078125], + [4.88613281250002, 53.0707031250001] + ] + ], + [ + [ + [4.22617187500003, 51.386474609375], + [3.44892578125007, 51.540771484375], + [3.74394531250002, 51.596044921875], + [4.27412109375004, 51.471630859375], + [4.00478515625005, 51.595849609375], + [4.18261718750006, 51.610302734375], + [3.946875, 51.810546875], + [4.48281250000002, 52.3091796875], + [4.76875, 52.94130859375], + [5.06123046875007, 52.96064453125], + [5.53203125000007, 53.268701171875], + [6.06220703125007, 53.407080078125], + [6.81621093750005, 53.441162109375], + [7.19726562500003, 53.282275390625], + [7.03300781250005, 52.6513671875], + [6.71074218750005, 52.61787109375], + [6.74882812500007, 52.464013671875], + [7.03515625000006, 52.380224609375], + [6.72451171874999, 52.080224609375], + [6.800390625, 51.9673828125], + [5.94873046875006, 51.802685546875], + [6.19882812500003, 51.45], + [6.12998046875003, 51.147412109375], + [5.85751953125003, 51.030126953125], + [6.04843750000003, 50.9048828125001], + [5.99394531250002, 50.750439453125], + [5.69355468750001, 50.774755859375], + [5.79648437500003, 51.153076171875], + [5.21416015625005, 51.278955078125], + [5.03095703125004, 51.469091796875], + [4.22617187500003, 51.386474609375] + ] + ], + [ + [ + [5.32578125000006, 53.3857421875], + [5.19023437500007, 53.391796875], + [5.58261718750006, 53.4380859375], + [5.32578125000006, 53.3857421875] + ] + ] + ] + }, + "properties": { + "name": "Netherlands", + "childNum": 6, + "cp": [5.0752777, 52.358465] + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [5.08583984375002, 60.307568359375], + [5.08906250000007, 60.18876953125], + [4.95722656250004, 60.4472656250001], + [5.08583984375002, 60.307568359375] + ] + ], + [ + [ + [4.95869140625007, 61.0845703125], + [4.79902343750004, 61.08271484375], + [4.86162109374999, 61.19384765625], + [4.95869140625007, 61.0845703125] + ] + ], + [ + [ + [8.10273437500004, 63.33759765625], + [7.80400390625002, 63.413916015625], + [8.07353515625005, 63.47080078125], + [8.10273437500004, 63.33759765625] + ] + ], + [ + [ + [8.47080078125006, 63.667138671875], + [8.28710937500003, 63.687158203125], + [8.76464843750006, 63.804638671875], + [8.78652343750008, 63.703466796875], + [8.47080078125006, 63.667138671875] + ] + ], + [ + [ + [11.2314453125, 64.865869140625], + [10.73984375, 64.8703125], + [11.02099609375, 64.9787109375], + [11.2314453125, 64.865869140625] + ] + ], + [ + [ + [12.9717773437501, 67.87412109375], + [12.8240234375001, 67.821240234375], + [13.0680664062501, 68.0713378906251], + [12.9717773437501, 67.87412109375] + ] + ], + [ + [ + [13.8728515625, 68.26533203125], + [14.09677734375, 68.218603515625], + [13.2293945312501, 67.995361328125], + [13.3001953125, 68.1604492187501], + [13.8728515625, 68.26533203125] + ] + ], + [ + [ + [15.20712890625, 68.943115234375], + [15.2220703125, 68.61630859375], + [14.4046875000001, 68.663232421875], + [15.0377929687501, 69.0005371093751], + [15.20712890625, 68.943115234375] + ] + ], + [ + [ + [15.7603515625, 68.56123046875], + [16.32890625, 68.876318359375], + [16.5192382812501, 68.6330078125], + [15.97529296875, 68.402490234375], + [14.25751953125, 68.190771484375], + [15.41259765625, 68.6158203125], + [15.4830078125, 69.04345703125], + [16.048046875, 69.30205078125], + [15.7603515625, 68.56123046875] + ] + ], + [ + [ + [17.50302734375, 69.596240234375], + [18.0041015625001, 69.50498046875], + [17.95068359375, 69.19814453125], + [17.4878906250001, 69.196826171875], + [17.08251953125, 69.013671875], + [16.8104492187501, 69.070703125], + [17.0017578125, 69.3619140625001], + [17.36083984375, 69.381494140625], + [17.50302734375, 69.596240234375] + ] + ], + [ + [ + [29.95615234375, 69.79677734375], + [29.7662109375, 69.767529296875], + [29.83583984375, 69.9055664062501], + [29.95615234375, 69.79677734375] + ] + ], + [ + [ + [20.77919921875, 70.08974609375], + [20.4642578125001, 70.0765625], + [20.4927734375, 70.2033203125], + [20.7860351562501, 70.21953125], + [20.77919921875, 70.08974609375] + ] + ], + [ + [ + [19.255078125, 70.0664062500001], + [19.6078125, 70.019140625], + [19.3347656250001, 69.820263671875], + [18.784765625, 69.57900390625], + [18.1298828125, 69.557861328125], + [18.34931640625, 69.76787109375], + [18.6740234375, 69.781640625], + [19.1327148437501, 70.244140625], + [19.255078125, 70.0664062500001] + ] + ], + [ + [ + [19.7674804687501, 70.21669921875], + [20.00595703125, 70.076220703125], + [19.5990234375, 70.2661621093751], + [19.7674804687501, 70.21669921875] + ] + ], + [ + [ + [23.61533203125, 70.54931640625], + [23.1591796875, 70.2826171875001], + [22.9410156250001, 70.444580078125], + [23.5466796875, 70.61708984375], + [23.61533203125, 70.54931640625] + ] + ], + [ + [ + [24.017578125, 70.5673828125], + [23.7166015625001, 70.561865234375], + [23.7784179687501, 70.7473632812501], + [24.017578125, 70.5673828125] + ] + ], + [ + [ + [23.4405273437501, 70.815771484375], + [22.8291015625, 70.5415527343751], + [22.35869140625, 70.514794921875], + [21.9945312500001, 70.65712890625], + [23.4405273437501, 70.815771484375] + ] + ], + [ + [ + [30.8697265625, 69.7834472656251], + [30.8607421875, 69.538427734375], + [30.18017578125, 69.63583984375], + [30.0873046875001, 69.432861328125], + [29.38828125, 69.2981445312501], + [28.9658203125, 69.02197265625], + [28.8462890625, 69.176904296875], + [29.3333984375001, 69.472998046875], + [29.1416015625, 69.6714355468751], + [27.7478515625, 70.06484375], + [27.1275390625001, 69.906494140625], + [26.5253906250001, 69.9150390625], + [26.0724609375, 69.691552734375], + [25.74833984375, 68.99013671875], + [24.94140625, 68.5932617187501], + [23.85400390625, 68.805908203125], + [23.3240234375, 68.648974609375], + [22.4109375000001, 68.719873046875], + [21.59375, 69.273583984375], + [21.06611328125, 69.214111328125], + [21.06572265625, 69.041748046875], + [20.62216796875, 69.036865234375], + [20.1166992187501, 69.0208984375001], + [20.348046875, 68.84873046875], + [19.9698242187501, 68.356396484375], + [18.30302734375, 68.555419921875], + [17.91669921875, 67.964892578125], + [17.324609375, 68.10380859375], + [16.78359375, 67.89501953125], + [16.12744140625, 67.4258300781251], + [16.403515625, 67.05498046875], + [15.42294921875, 66.48984375], + [15.4837890625001, 66.30595703125], + [14.54326171875, 66.129345703125], + [14.4796875, 65.30146484375], + [13.65029296875, 64.58154296875], + [14.07763671875, 64.464013671875], + [14.1412109375, 64.17353515625], + [13.9605468750001, 64.014013671875], + [13.203515625, 64.07509765625], + [12.7927734375, 64], + [12.1751953125001, 63.595947265625], + [11.9999023437501, 63.29169921875], + [12.3035156250001, 62.285595703125], + [12.15537109375, 61.720751953125], + [12.8807617187501, 61.3522949218751], + [12.7060546875, 61.0598632812501], + [12.294140625, 61.0026855468751], + [12.588671875, 60.450732421875], + [12.4861328125001, 60.1067871093751], + [11.68076171875, 59.59228515625], + [11.7981445312501, 59.289892578125], + [11.6427734375, 58.92607421875], + [11.4707031250001, 58.909521484375], + [11.3882812500001, 59.0365234375], + [10.83447265625, 59.183935546875], + [10.5953125000001, 59.76455078125], + [10.1793945312501, 59.00927734375], + [9.84257812500002, 58.95849609375], + [9.55722656250006, 59.1126953125], + [9.65693359375004, 58.97119140625], + [8.16611328125006, 58.1453125], + [7.0048828125, 58.0242187500001], + [6.87705078125001, 58.150732421875], + [6.59052734375007, 58.097314453125], + [6.65986328125007, 58.262744140625], + [5.70683593750007, 58.5236328125], + [5.55556640625008, 58.9751953125], + [6.09902343750002, 58.870263671875], + [6.36328125000003, 59.000927734375], + [6.09941406250002, 58.9519531250001], + [5.88916015625, 59.09794921875], + [5.95185546875007, 59.299072265625], + [6.41533203125007, 59.547119140625], + [5.17324218750008, 59.162548828125], + [5.2421875, 59.564306640625], + [5.47246093750002, 59.7130859375], + [5.77216796875004, 59.6609375], + [6.21660156249999, 59.818359375], + [5.73046875, 59.8630859375], + [6.34873046875001, 60.352978515625], + [6.57363281250008, 60.360595703125], + [6.52685546875006, 60.1529296875], + [6.995703125, 60.511962890625], + [6.1533203125, 60.346240234375], + [5.14580078125007, 59.638818359375], + [5.20566406250001, 60.087939453125], + [5.68857421874998, 60.123193359375], + [5.28583984375001, 60.2057128906251], + [5.13710937500008, 60.4456054687501], + [5.64833984375005, 60.68798828125], + [5.24404296875002, 60.569580078125], + [5.11582031250001, 60.635986328125], + [5.00859375000002, 61.03818359375], + [6.77783203125003, 61.142431640625], + [7.03867187500006, 60.9529296875], + [7.04013671875001, 61.091162109375], + [7.60449218750006, 61.210546875], + [7.34658203125008, 61.3005859375], + [7.44257812500001, 61.434619140625], + [7.17353515625001, 61.165966796875], + [6.59990234375002, 61.2896484375], + [6.38349609375007, 61.13388671875], + [5.45126953125003, 61.10234375], + [5.10673828125002, 61.187548828125], + [5.00273437500007, 61.43359375], + [5.33867187500002, 61.485498046875], + [4.92783203124998, 61.7106933593751], + [4.93007812499999, 61.8783203125], + [6.01582031250004, 61.7875], + [6.73076171875005, 61.8697753906251], + [5.26689453125005, 61.935595703125], + [5.14316406250006, 62.159912109375], + [5.90830078124998, 62.416015625], + [6.08349609375006, 62.349609375], + [6.58007812500006, 62.407275390625], + [6.69238281250003, 62.46806640625], + [6.13613281250005, 62.407470703125], + [6.35292968750005, 62.6111328125], + [7.653125, 62.564013671875], + [7.53837890625007, 62.6720703125], + [8.04550781250001, 62.771240234375], + [6.73496093750001, 62.720703125], + [6.94042968750003, 62.93046875], + [7.571875, 63.09951171875], + [8.10058593750003, 63.090966796875], + [8.62314453125001, 62.846240234375], + [8.15800781250002, 63.1615234375001], + [8.63554687500005, 63.342333984375], + [8.36074218750002, 63.498876953125], + [8.57617187500003, 63.601171875], + [9.13583984375001, 63.59365234375], + [9.15605468750005, 63.459326171875], + [9.696875, 63.624560546875], + [10.02099609375, 63.3908203125], + [10.7601562500001, 63.461279296875], + [10.7252929687501, 63.625], + [11.370703125, 63.804833984375], + [11.1755859375001, 63.898876953125], + [11.4576171875001, 64.0029785156251], + [11.306640625, 64.048876953125], + [10.9142578125, 63.92109375], + [10.93486328125, 63.77021484375], + [10.0550781250001, 63.5126953125], + [9.56728515625005, 63.70615234375], + [10.565625, 64.418310546875], + [11.5238281250001, 64.744384765625], + [11.6329101562501, 64.813916015625], + [11.2967773437501, 64.75478515625], + [11.48935546875, 64.975830078125], + [12.15966796875, 65.178955078125], + [12.5083984375, 65.0994140625001], + [12.9155273437501, 65.3392578125], + [12.4175781250001, 65.18408203125], + [12.13388671875, 65.279150390625], + [12.6888671875001, 65.902197265625], + [13.0331054687501, 65.95625], + [12.7837890625001, 66.1004394531251], + [14.0341796875001, 66.29755859375], + [13.11884765625, 66.2306640625], + [13.21142578125, 66.6408203125], + [13.95947265625, 66.7943359375], + [13.6515625, 66.907080078125], + [14.1087890625001, 67.11923828125], + [15.41572265625, 67.20244140625], + [14.44169921875, 67.2713867187501], + [14.9619140625001, 67.574267578125], + [15.59443359375, 67.3485351562501], + [15.69150390625, 67.52138671875], + [15.24873046875, 67.6021484375], + [15.30390625, 67.765283203125], + [14.8546875000001, 67.6633300781251], + [14.7989257812501, 67.809326171875], + [15.13427734375, 67.972705078125], + [15.62138671875, 67.948291015625], + [15.316015625, 68.06875], + [16.00791015625, 68.2287109375], + [16.3123046875, 67.8814453125], + [16.20380859375, 68.316748046875], + [17.5528320312501, 68.4262695312501], + [16.51435546875, 68.532568359375], + [18.10146484375, 69.156298828125], + [18.259765625, 69.47060546875], + [18.91591796875, 69.335595703125], + [18.6144531250001, 69.490576171875], + [19.1972656250001, 69.7478515625], + [19.7224609375, 69.781640625], + [19.6415039062501, 69.4240234375], + [20.3242187500001, 69.9453125], + [20.0544921875001, 69.332666015625], + [20.48671875, 69.54208984375], + [20.739453125, 69.5205078125], + [20.6220703125001, 69.913916015625], + [21.1630859375001, 69.889501953125], + [21.43291015625, 70.0131835937501], + [21.97470703125, 69.8345703125], + [21.35576171875, 70.2333984375], + [22.3219726562501, 70.264501953125], + [22.6845703125001, 70.374755859375], + [23.3539062500001, 69.9833984375], + [23.3291015625, 70.2072265625], + [24.42001953125, 70.702001953125], + [24.2634765625, 70.826318359375], + [24.6580078125, 71.0010253906251], + [25.2646484375001, 70.843505859375], + [25.7681640625001, 70.853173828125], + [25.04384765625, 70.109033203125], + [26.661328125, 70.93974609375], + [26.58505859375, 70.410009765625], + [26.9893554687501, 70.511376953125], + [27.18369140625, 70.74404296875], + [27.5464843750001, 70.8040039062501], + [27.2352539062501, 70.947216796875], + [27.5970703125001, 71.09130859375], + [28.3922851562501, 70.97529296875], + [27.898046875, 70.6779296875], + [28.27177734375, 70.66796875], + [28.19296875, 70.2485839843751], + [28.83154296875, 70.86396484375], + [29.7375, 70.646826171875], + [30.0651367187501, 70.702978515625], + [30.944140625, 70.2744140625], + [30.2629882812501, 70.12470703125], + [28.8042968750001, 70.0925292968751], + [29.6013671875, 69.9767578125], + [29.7920898437501, 69.727880859375], + [30.08828125, 69.7175781250001], + [30.23759765625, 69.86220703125], + [30.4283203125, 69.722265625], + [30.8697265625, 69.7834472656251] + ] + ], + [ + [ + [25.5863281250001, 71.14208984375], + [26.1337890625, 70.99580078125], + [25.5820312500001, 70.960791015625], + [25.31494140625, 71.034130859375], + [25.5863281250001, 71.14208984375] + ] + ], + [ + [ + [-8.95356445312498, 70.83916015625], + [-8.00136718749997, 71.177685546875], + [-8.00209960937494, 71.041259765625], + [-8.95356445312498, 70.83916015625] + ] + ], + [ + [ + [19.2193359375, 74.391015625], + [18.8612304687501, 74.51416015625], + [19.18291015625, 74.517919921875], + [19.2193359375, 74.391015625] + ] + ], + [ + [ + [21.60810546875, 78.595703125], + [22.0431640625, 78.5769531250001], + [22.29951171875, 78.228173828125], + [23.4519531250001, 78.149462890625], + [23.11669921875, 77.99150390625], + [24.9018554687501, 77.756591796875], + [22.5537109375, 77.266650390625], + [22.6853515625, 77.553515625], + [20.928125, 77.45966796875], + [21.653125, 77.92353515625], + [20.2279296875001, 78.4778320312501], + [21.60810546875, 78.595703125] + ] + ], + [ + [ + [11.25029296875, 78.610693359375], + [12.1164062500001, 78.232568359375], + [11.1212890625, 78.46328125], + [10.5582031250001, 78.9029296875], + [11.25029296875, 78.610693359375] + ] + ], + [ + [ + [29.0470703125001, 78.912060546875], + [29.6966796875001, 78.904736328125], + [27.8890625000001, 78.8521484375], + [28.5111328125, 78.967333984375], + [29.0470703125001, 78.912060546875] + ] + ], + [ + [ + [16.78671875, 79.90673828125], + [17.8345703125, 79.800048828125], + [17.66875, 79.3859375], + [18.3973632812501, 79.60517578125], + [18.67783203125, 79.26171875], + [19.8935546875001, 79.056201171875], + [20.61103515625, 79.106640625], + [21.38876953125, 78.7404296875], + [19.6767578125, 78.6095703125], + [16.70048828125, 76.579296875], + [14.3658203125, 77.23447265625], + [13.995703125, 77.508203125], + [14.69501953125, 77.525048828125], + [14.92080078125, 77.6888183593751], + [17.03330078125, 77.797705078125], + [16.9140625, 77.8979980468751], + [14.0899414062501, 77.77138671875], + [13.6805664062501, 78.028125], + [14.3072265625, 78.005078125], + [15.78388671875, 78.3270507812501], + [17.0029296875, 78.369384765625], + [16.4486328125001, 78.503564453125], + [16.7826171875001, 78.6636230468751], + [15.4173828125, 78.4732421875], + [15.3841796875, 78.77119140625], + [15.01630859375, 78.630126953125], + [14.6892578125, 78.720947265625], + [14.63828125, 78.414599609375], + [14.1104492187501, 78.2708984375], + [13.1501953125, 78.2375], + [11.3654296875, 78.950390625], + [12.3234375000001, 78.9142578125], + [12.083984375, 79.267529296875], + [11.5797851562501, 79.2834960937501], + [11.20810546875, 79.129638671875], + [10.73759765625, 79.520166015625], + [10.80400390625, 79.798779296875], + [11.150390625, 79.7169921875], + [11.70234375, 79.8206054687501], + [12.2877929687501, 79.713134765625], + [12.27998046875, 79.8159667968751], + [13.69287109375, 79.860986328125], + [13.7775390625, 79.715283203125], + [12.5553710937501, 79.569482421875], + [13.3337890625, 79.5748046875001], + [14.02958984375, 79.3441406250001], + [14.5936523437501, 79.79873046875], + [16.34375, 78.976123046875], + [15.81611328125, 79.6818359375], + [16.245703125, 80.049462890625], + [16.78671875, 79.90673828125] + ] + ], + [ + [ + [32.5259765625001, 80.119140625], + [31.48193359375, 80.10791015625], + [33.629296875, 80.217431640625], + [32.5259765625001, 80.119140625] + ] + ], + [ + [ + [20.8978515625, 80.249951171875], + [22.28974609375, 80.04921875], + [22.45078125, 80.4022460937501], + [23.0080078125, 80.473974609375], + [23.1145507812501, 80.186962890625], + [24.29755859375, 80.3604003906251], + [26.86083984375, 80.160009765625], + [27.1986328125001, 79.9065917968751], + [25.6412109375, 79.40302734375], + [23.94775390625, 79.194287109375], + [22.9037109375, 79.2306640625], + [22.86552734375, 79.411865234375], + [20.8611328125, 79.3978515625], + [20.1282226562501, 79.489599609375], + [19.674609375, 79.591162109375], + [20.78408203125, 79.748583984375], + [18.725, 79.7607421875], + [18.25537109375, 79.92919921875], + [18.8559570312501, 80.03662109375], + [17.9168945312501, 80.143115234375], + [19.3433593750001, 80.11640625], + [19.73330078125, 80.47783203125], + [20.8978515625, 80.249951171875] + ] + ] + ] + }, + "properties": { + "name": "Norway", + "childNum": 27 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [87.984375, 27.133935546875], + [87.9931640625, 27.086083984375], + [88.11103515625, 26.928466796875], + [88.1572265625, 26.80732421875], + [88.1615234375, 26.7248046875], + [88.1115234375, 26.58642578125], + [88.0548828125, 26.430029296875], + [88.026953125, 26.39501953125], + [87.9951171875, 26.382373046875], + [87.28740234375, 26.360302734375], + [87.01640625, 26.555419921875], + [86.7013671875, 26.43505859375], + [86.00732421875, 26.649365234375], + [85.79453125, 26.604150390625], + [85.7373046875, 26.63974609375], + [85.6484375, 26.82900390625], + [85.56845703125, 26.83984375], + [85.29296875, 26.741015625], + [85.191796875, 26.766552734375], + [84.6853515625, 27.041015625], + [84.65380859375, 27.09169921875], + [84.65478515625, 27.203662109375], + [84.64072265625, 27.249853515625], + [84.61015625, 27.298681640625], + [84.480859375, 27.348193359375], + [84.22978515625, 27.42783203125], + [84.091015625, 27.491357421875], + [83.82880859375, 27.37783203125], + [83.74697265625, 27.395947265625], + [83.55166015625, 27.45634765625], + [83.44716796875, 27.46533203125], + [83.383984375, 27.44482421875], + [83.36943359375, 27.41025390625], + [83.28974609375, 27.37099609375], + [82.7333984375, 27.518994140625], + [82.71083984375, 27.5966796875], + [82.67734375, 27.6734375], + [82.6298828125, 27.687060546875], + [82.4513671875, 27.671826171875], + [82.2876953125, 27.75654296875], + [82.1119140625, 27.86494140625], + [82.03701171875, 27.9005859375], + [81.9876953125, 27.91376953125], + [81.94521484375, 27.899267578125], + [81.896875, 27.874462890625], + [81.85263671875, 27.86708984375], + [81.1689453125, 28.335009765625], + [80.58701171875, 28.649609375], + [80.51787109375, 28.665185546875], + [80.49580078125, 28.635791015625], + [80.4791015625, 28.6048828125], + [80.4185546875, 28.61201171875], + [80.3248046875, 28.66640625], + [80.2265625, 28.72333984375], + [80.070703125, 28.83017578125], + [80.05166015625, 28.8703125], + [80.0845703125, 28.994189453125], + [80.13046875, 29.100390625], + [80.16953125, 29.12431640625], + [80.2330078125, 29.19462890625], + [80.25595703125, 29.318017578125], + [80.2548828125, 29.42333984375], + [80.31689453125, 29.5720703125], + [80.40185546875, 29.7302734375], + [80.5490234375, 29.8998046875], + [80.819921875, 30.1193359375], + [80.84814453125, 30.13974609375], + [80.9076171875, 30.171923828125], + [80.96611328125, 30.180029296875], + [81.1771484375, 30.039892578125], + [81.255078125, 30.093310546875], + [81.4171875, 30.33759765625], + [81.64189453125, 30.3875], + [81.8548828125, 30.36240234375], + [82.043359375, 30.3267578125], + [82.220703125, 30.0638671875], + [83.15546875, 29.612646484375], + [83.58349609375, 29.18359375], + [83.9359375, 29.2794921875], + [84.02197265625, 29.253857421875], + [84.1013671875, 29.219970703125], + [84.12783203125, 29.156298828125], + [84.1755859375, 29.036376953125], + [84.2287109375, 28.911767578125], + [84.796875, 28.560205078125], + [84.855078125, 28.55361328125], + [85.069140625, 28.60966796875], + [85.1263671875, 28.60263671875], + [85.15908203125, 28.592236328125], + [85.16015625, 28.571875], + [85.121484375, 28.48427734375], + [85.08857421875, 28.372265625], + [85.1224609375, 28.315966796875], + [85.212109375, 28.292626953125], + [85.41064453125, 28.276025390625], + [85.6783203125, 28.27744140625], + [85.75947265625, 28.220654296875], + [85.840234375, 28.1353515625], + [85.9216796875, 27.989697265625], + [85.9541015625, 27.92822265625], + [85.99453125, 27.910400390625], + [86.06416015625, 27.934716796875], + [86.0787109375, 28.08359375], + [86.13701171875, 28.11435546875], + [86.21796875, 28.0220703125], + [86.32861328125, 27.959521484375], + [86.40869140625, 27.928662109375], + [86.51689453125, 27.963525390625], + [86.5544921875, 28.085205078125], + [86.614453125, 28.10302734375], + [86.69052734375, 28.094921875], + [86.71962890625, 28.070654296875], + [86.750390625, 28.0220703125], + [86.9337890625, 27.96845703125], + [87.0201171875, 27.928662109375], + [87.14140625, 27.838330078125], + [87.29072265625, 27.821923828125], + [87.62255859375, 27.815185546875], + [87.8607421875, 27.886083984375], + [88.109765625, 27.87060546875], + [87.984375, 27.133935546875] + ] + ] + }, + "properties": { + "name": "Nepal", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [169.17822265625, -52.497265625], + [169.1275390625, -52.5703125], + [169.02177734375, -52.49541015625], + [169.17822265625, -52.497265625] + ] + ], + [ + [ + [166.22109375, -50.7615234375], + [166.24287109375, -50.845703125], + [165.88916015625, -50.80771484375], + [166.1013671875, -50.53896484375], + [166.26748046875, -50.55859375], + [166.22109375, -50.7615234375] + ] + ], + [ + [ + [168.144921875, -46.86220703125], + [168.0431640625, -46.9326171875], + [168.24091796875, -47.07001953125], + [167.52197265625, -47.25869140625], + [167.80078125, -46.90654296875], + [167.783984375, -46.6998046875], + [167.95576171875, -46.69443359375], + [168.144921875, -46.86220703125] + ] + ], + [ + [ + [166.9794921875, -45.1796875], + [167.02265625, -45.2998046875], + [166.89267578125, -45.24052734375], + [166.9794921875, -45.1796875] + ] + ], + [ + [ + [-176.17763671875, -43.74033203125], + [-176.38173828125, -43.866796875], + [-176.407373046875, -43.7609375], + [-176.516552734375, -43.784765625], + [-176.33359375, -44.02529296875], + [-176.51552734375, -44.1166015625], + [-176.629345703125, -44.0361328125], + [-176.555126953125, -43.851953125], + [-176.84765625, -43.82392578125], + [-176.56611328125, -43.717578125], + [-176.17763671875, -43.74033203125] + ] + ], + [ + [ + [173.9146484375, -40.863671875], + [173.780859375, -40.92177734375], + [173.964453125, -40.71298828125], + [173.9146484375, -40.863671875] + ] + ], + [ + [ + [173.11533203125, -41.279296875], + [173.94716796875, -40.92412109375], + [173.7978515625, -41.27197265625], + [173.9994140625, -40.99326171875], + [174.3025390625, -41.01953125], + [174.03857421875, -41.24189453125], + [174.3701171875, -41.1037109375], + [174.0693359375, -41.4294921875], + [174.08369140625, -41.67080078125], + [174.28310546875, -41.740625], + [173.22119140625, -42.9765625], + [172.6240234375, -43.2724609375], + [172.734765625, -43.35478515625], + [172.52666015625, -43.46474609375], + [172.69345703125, -43.4443359375], + [172.80703125, -43.62099609375], + [173.0732421875, -43.676171875], + [173.065625, -43.874609375], + [172.502734375, -43.84365234375], + [172.48037109375, -43.72666015625], + [172.29658203125, -43.86787109375], + [172.035546875, -43.7017578125], + [172.17978515625, -43.89599609375], + [171.24072265625, -44.26416015625], + [171.1462890625, -44.9123046875], + [170.9990234375, -44.91142578125], + [171.11328125, -45.0392578125], + [170.7005859375, -45.68427734375], + [170.77626953125, -45.8708984375], + [170.419140625, -45.941015625], + [169.68662109375, -46.55166015625], + [169.34228515625, -46.6205078125], + [168.38212890625, -46.60537109375], + [168.18916015625, -46.36220703125], + [167.8419921875, -46.3662109375], + [167.539453125, -46.14853515625], + [167.3689453125, -46.24150390625], + [166.73154296875, -46.1978515625], + [166.91669921875, -45.9572265625], + [166.64990234375, -46.04169921875], + [166.71796875, -45.88935546875], + [166.4931640625, -45.9638671875], + [166.48828125, -45.8318359375], + [167.0033203125, -45.712109375], + [166.79765625, -45.64560546875], + [166.9908203125, -45.53173828125], + [166.733984375, -45.5435546875], + [166.74306640625, -45.46845703125], + [166.919921875, -45.40791015625], + [166.86923828125, -45.31123046875], + [167.1556640625, -45.4109375], + [167.230078125, -45.29033203125], + [167.02587890625, -45.1236328125], + [167.25947265625, -45.0822265625], + [167.19453125, -44.9634765625], + [167.4107421875, -44.8279296875], + [167.4662109375, -44.95830078125], + [167.4849609375, -44.77138671875], + [167.78701171875, -44.59501953125], + [167.908984375, -44.66474609375], + [167.85654296875, -44.50068359375], + [168.457421875, -44.03056640625], + [169.17890625, -43.9130859375], + [169.16953125, -43.77705078125], + [169.83388671875, -43.53701171875], + [170.240234375, -43.1638671875], + [170.39609375, -43.1822265625], + [170.30283203125, -43.1076171875], + [170.61181640625, -43.091796875], + [170.5236328125, -43.008984375], + [170.6654296875, -42.96123046875], + [170.73525390625, -43.02978515625], + [170.969921875, -42.718359375], + [171.01171875, -42.88505859375], + [171.027734375, -42.69609375], + [171.31337890625, -42.46015625], + [171.48623046875, -41.7947265625], + [171.948046875, -41.538671875], + [172.139453125, -40.947265625], + [172.640625, -40.51826171875], + [172.94365234375, -40.51875], + [172.7326171875, -40.54375], + [172.70439453125, -40.6677734375], + [172.988671875, -40.8482421875], + [173.11533203125, -41.279296875] + ] + ], + [ + [ + [175.5431640625, -36.279296875], + [175.34619140625, -36.2177734375], + [175.38955078125, -36.077734375], + [175.5431640625, -36.279296875] + ] + ], + [ + [ + [173.26943359375, -34.934765625], + [173.4478515625, -34.8443359375], + [173.47265625, -34.94697265625], + [174.10400390625, -35.14287109375], + [174.1431640625, -35.3], + [174.3203125, -35.2466796875], + [174.5806640625, -35.785546875], + [174.39580078125, -35.79736328125], + [174.8021484375, -36.30947265625], + [174.7224609375, -36.8412109375], + [175.29951171875, -36.99326171875], + [175.3853515625, -37.20693359375], + [175.54248046875, -37.2013671875], + [175.46083984375, -36.47568359375], + [175.77216796875, -36.73515625], + [176.1083984375, -37.6451171875], + [177.2740234375, -37.99345703125], + [178.0091796875, -37.5548828125], + [178.53623046875, -37.69208984375], + [178.26767578125, -38.551171875], + [177.976171875, -38.7222656250001], + [177.9087890625, -39.23955078125], + [177.52294921875, -39.073828125], + [177.0767578125, -39.22177734375], + [176.9392578125, -39.5552734375], + [177.10986328125, -39.67314453125], + [176.8421875, -40.1578125], + [175.98291015625, -41.21328125], + [175.309765625, -41.61064453125], + [175.165625, -41.4173828125], + [174.88134765625, -41.4240234375], + [174.865625, -41.223046875], + [174.6353515625, -41.289453125], + [175.1625, -40.62158203125], + [175.2541015625, -40.28935546875], + [175.15595703125, -40.11494140625], + [175.00927734375, -39.9521484375], + [173.934375, -39.50908203125], + [173.763671875, -39.31875], + [173.8443359375, -39.13935546875], + [174.3984375, -38.96259765625], + [174.59736328125, -38.78505859375], + [174.80166015625, -37.8955078125], + [174.92802734375, -37.8044921875], + [174.58583984375, -37.09775390625], + [174.73427734375, -37.215234375], + [174.92890625, -37.084765625], + [174.78203125, -36.94375], + [174.4755859375, -36.94189453125], + [174.1888671875, -36.49228515625], + [174.4015625, -36.601953125], + [174.3927734375, -36.2400390625], + [174.26787109375, -36.1630859375], + [174.2537109375, -36.24912109375], + [174.03642578125, -36.1224609375], + [173.914453125, -35.90869140625], + [173.91728515625, -36.0181640625], + [174.16640625, -36.32763671875], + [174.0546875, -36.359765625], + [173.41220703125, -35.542578125], + [173.626171875, -35.319140625], + [173.3763671875, -35.50009765625], + [173.31396484375, -35.443359375], + [173.11669921875, -35.2052734375], + [173.190625, -35.0162109375], + [172.70595703125, -34.45517578125], + [173.0439453125, -34.4291015625], + [172.96376953125, -34.53515625], + [173.26943359375, -34.934765625] + ] + ] + ] + }, + "properties": { + "name": "New Zealand", + "childNum": 9 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [58.7220703125, 20.21875], + [58.6409179687501, 20.2106933593751], + [58.6412109375001, 20.337353515625], + [58.884375, 20.68056640625], + [58.9507812500001, 20.516162109375], + [58.7220703125, 20.21875] + ] + ], + [ + [ + [56.38798828125, 24.97919921875], + [56.640625, 24.4703125], + [57.123046875, 23.980712890625], + [58.773046875, 23.5171875], + [59.42939453125, 22.66083984375], + [59.8232421875, 22.508984375], + [59.8, 22.219921875], + [59.3714843750001, 21.498828125], + [58.895703125, 21.11279296875], + [58.4742187500001, 20.406884765625], + [58.208984375, 20.423974609375], + [58.24501953125, 20.59921875], + [58.16943359375, 20.5895019531251], + [57.86181640625, 20.244140625], + [57.71416015625, 19.67841796875], + [57.8116210937501, 19.01708984375], + [56.8259765625001, 18.753515625], + [56.3834960937501, 17.98798828125], + [55.4791015625, 17.84326171875], + [55.25537109375, 17.58564453125], + [55.2751953125001, 17.3208984375], + [55.06416015625, 17.038916015625], + [54.0681640625, 17.005517578125], + [53.60986328125, 16.7599609375], + [53.08564453125, 16.648388671875], + [51.97763671875, 18.9961425781251], + [54.97734375, 19.995947265625], + [55.641015625, 22.00185546875], + [55.1858398437501, 22.7041015625], + [55.1999023437501, 23.034765625], + [55.531640625, 23.81904296875], + [55.4684570312501, 23.94111328125], + [55.98515625, 24.06337890625], + [55.9286132812501, 24.2151367187501], + [55.7608398437501, 24.24267578125], + [55.7957031250001, 24.868115234375], + [56.0005859375001, 24.95322265625], + [56.0638671875001, 24.73876953125], + [56.38798828125, 24.97919921875] + ] + ], + [ + [ + [56.2978515625, 25.65068359375], + [56.14462890625, 25.69052734375], + [56.16748046875, 26.0474609375], + [56.08046875, 26.0626464843751], + [56.4130859375, 26.351171875], + [56.2978515625, 25.65068359375] + ] + ] + ] + }, + "properties": { + "name": "Oman", + "childNum": 3 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [73.089618029279, 36.8643590794733], + [73.0820312500011, 36.4394994399118], + [72.3112864774827, 35.7729093663824], + [73.1341085994956, 34.8251016055828], + [73.1989504810656, 33.887709314682], + [74.0080938913929, 33.2537578933149], + [73.98984375, 33.22119140625], + [74.30361328125, 32.991796875], + [74.30546875, 32.81044921875], + [74.35458984375, 32.768701171875], + [74.58828125, 32.75322265625], + [74.632421875, 32.7708984375], + [74.66328125, 32.757666015625], + [74.643359375, 32.60771484375], + [74.6857421875, 32.493798828125], + [74.7888671875, 32.4578125], + [74.9873046875, 32.46220703125], + [75.33349609375, 32.27919921875], + [75.2541015625, 32.14033203125], + [75.13876953125, 32.10478515625], + [75.071484375, 32.08935546875], + [74.739453125, 31.948828125], + [74.6357421875, 31.88974609375], + [74.55556640625, 31.8185546875], + [74.5259765625, 31.76513671875], + [74.5099609375, 31.712939453125], + [74.5818359375, 31.52392578125], + [74.5939453125, 31.465380859375], + [74.5349609375, 31.261376953125], + [74.51767578125, 31.185595703125], + [74.6103515625, 31.112841796875], + [74.62578125, 31.06875], + [74.6328125, 31.03466796875], + [74.509765625, 30.95966796875], + [74.38037109375, 30.893408203125], + [74.33935546875, 30.8935546875], + [74.008984375, 30.519677734375], + [73.89931640625, 30.4353515625], + [73.88271484375, 30.3521484375], + [73.924609375, 30.281640625], + [73.9333984375, 30.2220703125], + [73.8865234375, 30.16201171875], + [73.8091796875, 30.093359375], + [73.381640625, 29.934375], + [72.9033203125, 29.028759765625], + [72.34189453125, 28.751904296875], + [72.2919921875, 28.697265625], + [72.128515625, 28.346337890625], + [71.948046875, 28.177294921875], + [71.8888671875, 28.0474609375], + [71.8703125, 27.9625], + [71.54296875, 27.869873046875], + [71.184765625, 27.831640625], + [70.87490234375, 27.714453125], + [70.79794921875, 27.709619140625], + [70.6916015625, 27.768994140625], + [70.6291015625, 27.937451171875], + [70.4037109375, 28.025048828125], + [70.2443359375, 27.934130859375], + [70.1939453125, 27.894873046875], + [70.14453125, 27.8490234375], + [70.0498046875, 27.6947265625], + [69.8962890625, 27.4736328125], + [69.56796875, 27.174609375], + [69.47001953125, 26.804443359375], + [70.1146484375, 26.548046875], + [70.14921875, 26.34755859375], + [70.1001953125, 25.91005859375], + [70.2646484375, 25.70654296875], + [70.3251953125, 25.6857421875], + [70.44853515625, 25.68134765625], + [70.505859375, 25.685302734375], + [70.56953125, 25.70595703125], + [70.6484375, 25.666943359375], + [70.65205078125, 25.422900390625], + [70.877734375, 25.06298828125], + [70.95087890625, 24.8916015625], + [71.020703125, 24.757666015625], + [71.0478515625, 24.687744140625], + [71.00234375, 24.65390625], + [70.9763671875, 24.61875], + [70.96982421875, 24.571875], + [71.0453125, 24.42998046875], + [71.04404296875, 24.40009765625], + [70.9828125, 24.36103515625], + [70.928125, 24.362353515625], + [70.88623046875, 24.34375], + [70.805078125, 24.261962890625], + [70.76728515625, 24.24541015625], + [70.71630859375, 24.23798828125], + [70.65947265625, 24.24609375], + [70.579296875, 24.279052734375], + [70.555859375, 24.331103515625], + [70.5650390625, 24.385791015625], + [70.54677734375, 24.418310546875], + [70.2890625, 24.356298828125], + [70.0982421875, 24.2875], + [69.80517578125, 24.165234375], + [69.7162109375, 24.172607421875], + [69.6341796875, 24.2251953125], + [69.5591796875, 24.273095703125], + [69.44345703125, 24.275390625], + [69.23505859375, 24.26826171875], + [69.11953125, 24.26865234375], + [69.0515625, 24.286328125], + [68.9845703125, 24.273095703125], + [68.90078125, 24.292431640625], + [68.8634765625, 24.26650390625], + [68.8283203125, 24.264013671875], + [68.78115234375, 24.313720703125], + [68.758984375, 24.3072265625], + [68.7396484375, 24.2919921875], + [68.728125, 24.265625], + [68.72412109375, 23.964697265625], + [68.488671875, 23.967236328125], + [68.38125, 23.95087890625], + [68.28251953125, 23.927978515625], + [68.1650390625, 23.85732421875], + [68.11552734375, 23.753369140625], + [67.8599609375, 23.902685546875], + [67.66845703125, 23.810986328125], + [67.309375, 24.1748046875], + [67.171484375, 24.756103515625], + [66.70302734375, 24.8609375], + [66.6986328125, 25.226318359375], + [66.32421875, 25.601806640625], + [66.13115234375, 25.49326171875], + [66.46767578125, 25.4453125], + [64.77666015625, 25.30732421875], + [64.658984375, 25.18408203125], + [64.059375, 25.4029296875], + [63.556640625, 25.353173828125], + [63.49140625, 25.21083984375], + [61.56689453125, 25.186328125], + [61.587890625, 25.20234375], + [61.6154296875, 25.2861328125], + [61.64013671875, 25.584619140625], + [61.67138671875, 25.6923828125], + [61.66181640625, 25.75126953125], + [61.66865234375, 25.768994140625], + [61.7376953125, 25.82109375], + [61.75439453125, 25.843359375], + [61.78076171875, 25.995849609375], + [61.8099609375, 26.165283203125], + [61.8423828125, 26.225927734375], + [62.1259765625, 26.368994140625], + [62.23935546875, 26.35703125], + [62.3123046875, 26.490869140625], + [63.16806640625, 26.665576171875], + [63.1861328125, 26.83759765625], + [63.2416015625, 26.86474609375], + [63.250390625, 26.879248046875], + [63.24208984375, 27.077685546875], + [63.30517578125, 27.124560546875], + [63.3015625, 27.15146484375], + [63.25625, 27.20791015625], + [63.19609375, 27.2439453125], + [63.166796875, 27.252490234375], + [62.752734375, 27.265625], + [62.78232421875, 27.800537109375], + [62.7625, 28.20205078125], + [61.88984375, 28.546533203125], + [61.1521484375, 29.542724609375], + [61.0341796875, 29.663427734375], + [60.843359375, 29.85869140625], + [61.2244140625, 29.7494140625], + [62.0009765625, 29.530419921875], + [62.4765625, 29.408349609375], + [63.567578125, 29.497998046875], + [64.09873046875, 29.391943359375], + [64.39375, 29.5443359375], + [65.0955078125, 29.55947265625], + [66.23125, 29.86572265625], + [66.346875, 30.802783203125], + [66.829296875, 31.263671875], + [67.45283203125, 31.234619140625], + [67.737890625, 31.3439453125], + [67.57822265625, 31.506494140625], + [68.16103515625, 31.802978515625], + [68.59765625, 31.802978515625], + [68.8689453125, 31.634228515625], + [69.279296875, 31.93681640625], + [69.24140625, 32.433544921875], + [69.5015625, 33.020068359375], + [70.2611328125, 33.289013671875], + [69.8896484375, 34.007275390625], + [70.65400390625, 33.952294921875], + [71.0515625, 34.04970703125], + [71.095703125, 34.36943359375], + [70.965625, 34.53037109375], + [71.6205078125, 35.1830078125], + [71.57197265625, 35.546826171875], + [71.18505859375, 36.04208984375], + [71.23291015625, 36.12177734375], + [72.2498046875, 36.734716796875], + [73.089618029279, 36.8643590794733] + ] + ] + }, + "properties": { + "name": "Pakistan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-81.603271484375, 7.33281249999999], + [-81.85205078125, 7.45332031250003], + [-81.812158203125, 7.59238281250002], + [-81.7287597656249, 7.62119140625002], + [-81.603271484375, 7.33281249999999] + ] + ], + [ + [ + [-78.89833984375, 8.27426757812502], + [-78.960595703125, 8.43583984374999], + [-78.883251953125, 8.46025390624999], + [-78.89833984375, 8.27426757812502] + ] + ], + [ + [ + [-77.3742187499999, 8.65830078125002], + [-77.4785156249999, 8.49843750000004], + [-77.19599609375, 7.9724609375], + [-77.53828125, 7.56625976562502], + [-77.7619140625, 7.69882812500003], + [-77.901171875, 7.22934570312505], + [-78.42158203125, 8.06098632812501], + [-78.287353515625, 8.09179687499997], + [-78.14189453125, 8.38608398437498], + [-77.7605468749999, 8.13325195312498], + [-78.099462890625, 8.49697265625001], + [-78.223046875, 8.39663085937499], + [-78.3992187499999, 8.5056640625], + [-78.40986328125, 8.35532226562502], + [-78.5140625, 8.628173828125], + [-79.086376953125, 8.99716796875003], + [-79.5070800781249, 8.97006835937502], + [-79.6874511718749, 8.85097656250001], + [-79.81591796875, 8.63920898437503], + [-79.750439453125, 8.59550781250002], + [-80.458984375, 8.21386718749997], + [-80.45810546875, 8.07705078124999], + [-80.01123046875, 7.50004882812503], + [-80.66669921875, 7.22568359375001], + [-80.901220703125, 7.27714843750002], + [-81.0638671874999, 7.89975585937502], + [-81.268408203125, 7.62548828125001], + [-81.504150390625, 7.72119140624997], + [-81.72763671875, 8.13754882812498], + [-82.15986328125, 8.19482421875], + [-82.23544921875, 8.31103515625006], + [-82.679541015625, 8.32197265624997], + [-82.8661132812499, 8.24633789062501], + [-82.879345703125, 8.07065429687502], + [-83.02734375, 8.33774414062499], + [-82.86162109375, 8.45351562500004], + [-82.8447753906249, 8.48935546874996], + [-82.8557128906249, 8.63530273437503], + [-82.917041015625, 8.74033203125003], + [-82.881982421875, 8.80532226562504], + [-82.72783203125, 8.91606445312503], + [-82.783056640625, 8.99028320312497], + [-82.88134765625, 9.05585937500001], + [-82.94033203125, 9.06010742187499], + [-82.9398437499999, 9.44916992187503], + [-82.9250488281249, 9.46904296874999], + [-82.88896484375, 9.48100585937502], + [-82.86015625, 9.51147460937501], + [-82.843994140625, 9.57080078125001], + [-82.801025390625, 9.59179687500003], + [-82.644091796875, 9.50585937500003], + [-82.56357421875, 9.57666015624997], + [-82.500341796875, 9.52324218750002], + [-82.3708007812499, 9.42856445312499], + [-82.33974609375, 9.20917968749998], + [-82.188134765625, 9.19174804687498], + [-82.244189453125, 9.03149414062501], + [-82.077880859375, 8.93486328124996], + [-81.780224609375, 8.95722656249998], + [-81.894482421875, 9.1404296875], + [-81.35478515625, 8.78056640624996], + [-80.838671875, 8.88720703125001], + [-80.127099609375, 9.20991210937504], + [-79.577294921875, 9.59785156250003], + [-78.0827636718749, 9.236279296875], + [-77.3742187499999, 8.65830078125002] + ] + ] + ] + }, + "properties": { + "name": "Panama", + "childNum": 3 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-73.137353515625, -6.4658203125], + [-73.75810546875, -6.90576171875], + [-73.793017578125, -7.13505859375], + [-73.758203125, -7.17275390625001], + [-73.72041015625, -7.30927734375001], + [-73.964306640625, -7.37890625], + [-73.95849609375, -7.506640625], + [-73.98173828125, -7.53574218750001], + [-74.00205078125, -7.55605468750001], + [-73.98173828125, -7.58505859375001], + [-73.946875, -7.61123046875001], + [-73.89462890625, -7.65478515625], + [-73.8220703125, -7.73896484375001], + [-73.76689453125, -7.753515625], + [-73.72041015625, -7.78251953125], + [-73.73203125, -7.875390625], + [-73.54912109375, -8.34580078125001], + [-73.39814453125, -8.458984375], + [-73.360400390625, -8.479296875], + [-73.351708984375, -8.51416015625], + [-73.35673828125, -8.56699218750001], + [-73.30244140625, -8.65400390625001], + [-73.203125, -8.71933593750001], + [-73.0705078125, -8.8828125], + [-72.9740234375, -8.9931640625], + [-72.970361328125, -9.1201171875], + [-73.08984375, -9.26572265625001], + [-73.209423828125, -9.41142578125], + [-72.379052734375, -9.51015625], + [-72.181591796875, -10.0037109375], + [-71.339404296875, -9.98857421875], + [-71.115283203125, -9.85244140625001], + [-71.041748046875, -9.81875], + [-70.6369140625, -9.47822265625001], + [-70.60791015625, -9.463671875], + [-70.54111328125, -9.4375], + [-70.570166015625, -9.48984375], + [-70.592236328125, -9.54345703125], + [-70.599169921875, -9.62050781250001], + [-70.642333984375, -11.01025390625], + [-70.596533203125, -10.97685546875], + [-70.533251953125, -10.946875], + [-70.45087890625, -11.0248046875], + [-70.39228515625, -11.05859375], + [-70.3419921875, -11.06669921875], + [-70.290380859375, -11.0642578125], + [-70.220068359375, -11.04765625], + [-70.06630859375, -10.982421875], + [-69.9603515625, -10.9298828125], + [-69.839794921875, -10.9333984375], + [-69.6740234375, -10.9541015625], + [-69.57861328125, -10.9517578125], + [-68.68525390625, -12.501953125], + [-68.97861328125, -12.880078125], + [-69.07412109375, -13.6828125], + [-68.8708984375, -14.1697265625], + [-69.35947265625, -14.7953125], + [-69.37470703125, -14.96298828125], + [-69.1724609375, -15.23662109375], + [-69.4208984375, -15.640625], + [-69.217578125, -16.14912109375], + [-68.8427734375, -16.337890625], + [-69.03291015625, -16.4759765625], + [-69.020703125, -16.6421875], + [-69.624853515625, -17.2001953125], + [-69.645703125, -17.24853515625], + [-69.521923828125, -17.38896484375], + [-69.510986328125, -17.4603515625], + [-69.511083984375, -17.5048828125], + [-69.5109375, -17.5060546875], + [-69.58642578125, -17.5732421875], + [-69.684765625, -17.6498046875], + [-69.852099609375, -17.70380859375], + [-69.802587890625, -17.990234375], + [-69.9263671875, -18.2060546875], + [-70.41826171875, -18.34560546875], + [-71.336962890625, -17.68251953125], + [-71.5322265625, -17.2943359375], + [-72.46767578125, -16.70810546875], + [-73.727685546875, -16.20166015625], + [-75.104248046875, -15.4119140625], + [-75.533642578125, -14.89921875], + [-75.93388671875, -14.63359375], + [-76.37646484375, -13.8630859375], + [-76.259228515625, -13.80283203125], + [-76.2236328125, -13.37119140625], + [-76.83212890625, -12.34873046875], + [-77.152734375, -12.0603515625], + [-77.2203125, -11.66337890625], + [-77.633203125, -11.28779296875], + [-77.736083984375, -10.83671875], + [-78.185595703125, -10.0890625], + [-78.762255859375, -8.6169921875], + [-79.37724609375, -7.835546875], + [-79.994970703125, -6.76894531250001], + [-81.142041015625, -6.05673828125001], + [-81.164306640625, -5.87529296875], + [-80.9306640625, -5.8408203125], + [-80.88193359375, -5.63505859375], + [-81.33662109375, -4.66953125], + [-81.283203125, -4.322265625], + [-80.503662109375, -3.49609375], + [-80.324658203125, -3.38789062500001], + [-80.24375, -3.57675781250001], + [-80.194140625, -3.905859375], + [-80.230517578125, -3.92402343750001], + [-80.26689453125, -3.948828125], + [-80.303271484375, -4.00507812500001], + [-80.43720703125, -3.97861328125001], + [-80.49013671875, -4.01005859375], + [-80.510009765625, -4.06953125000001], + [-80.49345703125, -4.119140625], + [-80.4884765625, -4.16552734375], + [-80.453759765625, -4.20517578125001], + [-80.352880859375, -4.20849609375], + [-80.44384765625, -4.33583984375001], + [-80.4884765625, -4.39365234375001], + [-80.478564453125, -4.430078125], + [-80.424169921875, -4.46142578125], + [-80.38349609375, -4.463671875], + [-80.293359375, -4.416796875], + [-80.1974609375, -4.31103515625], + [-80.13955078125, -4.29609375000001], + [-80.063525390625, -4.32753906250001], + [-79.962890625, -4.39033203125001], + [-79.8451171875, -4.44589843750001], + [-79.797265625, -4.4763671875], + [-79.710986328125, -4.467578125], + [-79.638525390625, -4.4548828125], + [-79.577685546875, -4.50058593750001], + [-79.516162109375, -4.53916015625001], + [-79.501904296875, -4.67060546875001], + [-79.45576171875, -4.76621093750001], + [-79.3994140625, -4.84003906250001], + [-79.33095703125, -4.92783203125001], + [-79.268115234375, -4.95761718750001], + [-79.186669921875, -4.95820312500001], + [-79.07626953125, -4.990625], + [-79.03330078125, -4.969140625], + [-78.995263671875, -4.9080078125], + [-78.975390625, -4.87324218750001], + [-78.919189453125, -4.8583984375], + [-78.92578125, -4.77070312500001], + [-78.9076171875, -4.714453125], + [-78.8615234375, -4.6650390625], + [-78.68603515625, -4.56240234375001], + [-78.647998046875, -4.24814453125001], + [-78.345361328125, -3.39736328125001], + [-78.240380859375, -3.47255859375001], + [-77.860595703125, -2.98164062500001], + [-76.6791015625, -2.56259765625001], + [-76.089794921875, -2.13310546875], + [-75.570556640625, -1.53125], + [-75.42041015625, -0.962207031250003], + [-75.408056640625, -0.92431640625], + [-75.249609375, -0.951855468750011], + [-75.259375, -0.590136718750003], + [-75.42470703125, -0.408886718750011], + [-75.491064453125, -0.248339843750003], + [-75.560595703125, -0.200097656250009], + [-75.63203125, -0.157617187500009], + [-75.62626953125, -0.122851562500003], + [-75.340478515625, -0.1421875], + [-75.13837890625, -0.050488281250011], + [-74.8017578125, -0.200097656250009], + [-74.78046875, -0.24453125], + [-74.75537109375, -0.298632812500003], + [-74.691650390625, -0.335253906250003], + [-74.616357421875, -0.370019531250009], + [-74.555078125, -0.429882812500011], + [-74.5138671875, -0.470117187500009], + [-74.465185546875, -0.517675781250006], + [-74.41787109375, -0.580664062500006], + [-74.334423828125, -0.850878906250003], + [-74.28388671875, -0.927832031250006], + [-74.24638671875, -0.970605468750009], + [-74.05439453125, -1.02861328125], + [-73.98681640625, -1.09814453125], + [-73.926953125, -1.12519531250001], + [-73.86318359375, -1.19667968750001], + [-73.664306640625, -1.248828125], + [-73.4962890625, -1.69306640625001], + [-73.19697265625, -1.83027343750001], + [-73.1544921875, -2.27822265625001], + [-72.9896484375, -2.33974609375001], + [-72.94111328125, -2.39404296875], + [-72.21845703125, -2.40048828125001], + [-71.98427734375, -2.3265625], + [-71.932470703125, -2.288671875], + [-71.86728515625, -2.22773437500001], + [-71.802734375, -2.16630859375], + [-71.7525390625, -2.152734375], + [-71.55947265625, -2.22421875], + [-71.39697265625, -2.33408203125001], + [-71.19638671875, -2.31308593750001], + [-71.11337890625, -2.24541015625], + [-71.027294921875, -2.22578125000001], + [-70.9685546875, -2.2068359375], + [-70.70537109375, -2.34199218750001], + [-70.647998046875, -2.40576171875], + [-70.57587890625, -2.41826171875], + [-70.29462890625, -2.5525390625], + [-70.24443359375, -2.60654296875001], + [-70.16474609375, -2.63984375000001], + [-70.095849609375, -2.658203125], + [-70.735107421875, -3.78154296875], + [-70.5296875, -3.86640625000001], + [-70.48583984375, -3.86933593750001], + [-70.42109375, -3.849609375], + [-70.37919921875, -3.81875], + [-70.339501953125, -3.81435546875001], + [-70.2984375, -3.84423828125], + [-70.240283203125, -3.88271484375001], + [-70.167529296875, -4.05019531250001], + [-70.0171875, -4.16201171875001], + [-69.96591796875, -4.2359375], + [-69.972021484375, -4.301171875], + [-70.003955078125, -4.32724609375001], + [-70.0533203125, -4.33310546875001], + [-70.12880859375, -4.28662109375], + [-70.23916015625, -4.301171875], + [-70.31689453125, -4.24697265625001], + [-70.34365234375, -4.19365234375], + [-70.404638671875, -4.15009765625001], + [-70.5306640625, -4.167578125], + [-70.72158203125, -4.15888671875001], + [-70.79951171875, -4.17333984375], + [-70.973681640625, -4.35048828125001], + [-71.8447265625, -4.50439453125], + [-72.256787109375, -4.74892578125001], + [-72.35283203125, -4.78603515625001], + [-72.468994140625, -4.90126953125001], + [-72.608349609375, -5.0095703125], + [-72.69873046875, -5.0671875], + [-72.83193359375, -5.09375], + [-72.887060546875, -5.12275390625001], + [-72.9798828125, -5.63486328125001], + [-73.162890625, -5.9333984375], + [-73.209375, -6.02871093750001], + [-73.235546875, -6.0984375], + [-73.137353515625, -6.4658203125] + ] + ] + }, + "properties": { + "name": "Peru", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [120.250390625, 5.25659179687504], + [119.821484375, 5.06953125000004], + [120.165234375, 5.33242187500004], + [120.250390625, 5.25659179687504] + ] + ], + [ + [ + [121.159375, 6.07563476562501], + [121.41103515625, 5.93984374999997], + [121.29443359375, 5.86997070312503], + [120.8763671875, 5.95263671875], + [121.159375, 6.07563476562501] + ] + ], + [ + [ + [122.09287109375, 6.42832031250001], + [121.9591796875, 6.41582031250005], + [121.83203125, 6.66406249999999], + [122.05830078125, 6.74072265624997], + [122.32353515625, 6.60224609375001], + [122.09287109375, 6.42832031250001] + ] + ], + [ + [ + [122.937109375, 7.40913085937498], + [122.8046875, 7.31596679687502], + [122.82216796875, 7.42846679687501], + [122.937109375, 7.40913085937498] + ] + ], + [ + [ + [117.0798828125, 7.88339843749998], + [117.0283203125, 7.80751953124997], + [116.96953125, 7.894921875], + [116.9935546875, 8.05053710937501], + [117.07705078125, 8.06914062499997], + [117.0798828125, 7.88339843749998] + ] + ], + [ + [ + [117.3552734375, 8.21464843749996], + [117.28701171875, 8.19101562500003], + [117.280859375, 8.31499023437497], + [117.3552734375, 8.21464843749996] + ] + ], + [ + [ + [124.806640625, 9.142626953125], + [124.6658203125, 9.13232421875004], + [124.6533203125, 9.225830078125], + [124.806640625, 9.142626953125] + ] + ], + [ + [ + [123.69765625, 9.23730468750003], + [123.614453125, 9.10332031249999], + [123.49345703125, 9.19208984375005], + [123.69765625, 9.23730468750003] + ] + ], + [ + [ + [126.00595703125, 9.32094726562501], + [126.193359375, 9.27670898437496], + [126.30458984375, 8.95205078124999], + [126.13955078125, 8.59565429687504], + [126.36533203125, 8.48388671875001], + [126.45869140625, 8.20283203125004], + [126.4353515625, 7.83281249999997], + [126.5701171875, 7.67724609374999], + [126.58154296875, 7.24775390624997], + [126.19208984375, 6.85253906250001], + [126.18935546875, 6.30966796874999], + [125.8244140625, 7.33330078124999], + [125.6892578125, 7.26303710937498], + [125.3806640625, 6.68994140625001], + [125.5884765625, 6.465771484375], + [125.66796875, 5.97866210937498], + [125.346484375, 5.59897460937498], + [125.23154296875, 6.06953125000001], + [124.92734375, 5.87534179687498], + [124.21279296875, 6.23325195312498], + [124.078125, 6.40444335937504], + [123.98525390625, 6.993701171875], + [124.206640625, 7.39643554687498], + [123.6658203125, 7.81777343750002], + [123.49306640625, 7.80791015624996], + [123.39091796875, 7.40751953125002], + [123.0966796875, 7.700439453125], + [122.84296875, 7.52929687500004], + [122.791796875, 7.72246093749996], + [122.6162109375, 7.76313476562498], + [122.14248046875, 6.949658203125], + [121.9642578125, 6.96821289062504], + [121.924609375, 7.19951171875], + [122.243359375, 7.94511718750003], + [122.9111328125, 8.1564453125], + [123.0505859375, 8.43393554687505], + [123.4345703125, 8.70332031250004], + [123.84921875, 8.43271484374998], + [123.7994140625, 8.04912109374999], + [124.19765625, 8.22954101562497], + [124.4048828125, 8.59985351562501], + [124.73115234375, 8.56298828125004], + [124.8689453125, 8.97226562500003], + [125.141015625, 8.86875], + [125.20966796875, 9.02714843750002], + [125.49873046875, 9.01474609374998], + [125.4712890625, 9.75678710937498], + [126.00595703125, 9.32094726562501] + ] + ], + [ + [ + [126.059375, 9.76621093750003], + [125.9912109375, 9.83852539062502], + [126.073828125, 10.0592285156251], + [126.17255859375, 9.79995117187498], + [126.059375, 9.76621093750003] + ] + ], + [ + [ + [124.59384765625, 9.78720703124996], + [124.1224609375, 9.59931640624997], + [123.93564453125, 9.62397460937501], + [123.8171875, 9.81738281249999], + [124.1728515625, 10.135205078125], + [124.3357421875, 10.159912109375], + [124.5771484375, 10.026708984375], + [124.59384765625, 9.78720703124996] + ] + ], + [ + [ + [125.690234375, 9.91445312500004], + [125.49482421875, 10.118701171875], + [125.666796875, 10.44013671875], + [125.690234375, 9.91445312500004] + ] + ], + [ + [ + [119.9162109375, 10.485986328125], + [119.7931640625, 10.4552734375], + [119.85205078125, 10.64013671875], + [120.0083984375, 10.5701171875], + [119.9162109375, 10.485986328125] + ] + ], + [ + [ + [122.64951171875, 10.472705078125], + [122.53837890625, 10.424951171875], + [122.5375, 10.607568359375], + [122.70126953125, 10.740625], + [122.64951171875, 10.472705078125] + ] + ], + [ + [ + [123.130859375, 9.06411132812499], + [122.9947265625, 9.05883789062499], + [122.8666015625, 9.31982421875004], + [122.5625, 9.48281250000004], + [122.39951171875, 9.82304687499999], + [122.471484375, 9.96152343750003], + [122.85556640625, 10.0869140625], + [122.8169921875, 10.50380859375], + [122.98330078125, 10.88662109375], + [123.256640625, 10.9939453125], + [123.51064453125, 10.923046875], + [123.567578125, 10.7807617187501], + [123.16201171875, 9.86425781250003], + [123.1498046875, 9.60615234375003], + [123.3205078125, 9.27294921875], + [123.130859375, 9.06411132812499] + ] + ], + [ + [ + [123.3703125, 9.44960937500002], + [123.38623046875, 9.96708984375002], + [124.0388671875, 11.27353515625], + [124.00498046875, 10.40009765625], + [123.70048828125, 10.1283203125], + [123.3703125, 9.44960937500002] + ] + ], + [ + [ + [123.75703125, 11.28330078125], + [123.815625, 11.150732421875], + [123.73671875, 11.15146484375], + [123.75703125, 11.28330078125] + ] + ], + [ + [ + [117.3111328125, 8.43959960937505], + [117.2185546875, 8.36728515624996], + [117.34990234375, 8.71357421875], + [119.223828125, 10.477294921875], + [119.3056640625, 10.9736328125], + [119.5533203125, 11.313525390625], + [119.52666015625, 10.953173828125], + [119.6869140625, 10.500341796875], + [119.3693359375, 10.327294921875], + [119.19150390625, 10.061083984375], + [118.78212890625, 9.91611328125002], + [118.4349609375, 9.25600585937501], + [117.3111328125, 8.43959960937505] + ] + ], + [ + [ + [119.86142578125, 11.525341796875], + [119.8306640625, 11.37568359375], + [119.72998046875, 11.43193359375], + [119.86142578125, 11.525341796875] + ] + ], + [ + [ + [124.574609375, 11.34306640625], + [124.92998046875, 11.3728515625], + [125.0265625, 11.21171875], + [125.01318359375, 10.785693359375], + [125.26845703125, 10.30771484375], + [125.142578125, 10.189453125], + [124.9875, 10.367578125], + [125.0265625, 10.03310546875], + [124.78076171875, 10.16806640625], + [124.78671875, 10.781396484375], + [124.6626953125, 10.961962890625], + [124.4455078125, 10.923583984375], + [124.3306640625, 11.535205078125], + [124.574609375, 11.34306640625] + ] + ], + [ + [ + [124.6083984375, 11.4921875], + [124.48349609375, 11.48583984375], + [124.3603515625, 11.66591796875], + [124.5109375, 11.687109375], + [124.6083984375, 11.4921875] + ] + ], + [ + [ + [122.49619140625, 11.615087890625], + [122.8380859375, 11.595654296875], + [122.89453125, 11.44130859375], + [123.15830078125, 11.535546875], + [123.11953125, 11.28681640625], + [122.8029296875, 10.9900390625], + [122.769921875, 10.823828125], + [121.95400390625, 10.444384765625], + [122.103515625, 11.642919921875], + [121.916015625, 11.854345703125], + [122.02919921875, 11.89541015625], + [122.49619140625, 11.615087890625] + ] + ], + [ + [ + [120.03876953125, 11.7033203125], + [119.944921875, 11.69072265625], + [119.8609375, 11.953955078125], + [120.0359375, 11.917236328125], + [120.03876953125, 11.7033203125] + ] + ], + [ + [ + [120.1, 12.16767578125], + [120.22822265625, 12.21982421875], + [120.31455078125, 12.01240234375], + [120.010546875, 12.008251953125], + [119.8857421875, 12.299853515625], + [120.1, 12.16767578125] + ] + ], + [ + [ + [122.6544921875, 12.309033203125], + [122.42294921875, 12.455078125], + [122.60361328125, 12.4916015625], + [122.6544921875, 12.309033203125] + ] + ], + [ + [ + [125.23955078125, 12.527880859375], + [125.32021484375, 12.321826171875], + [125.53564453125, 12.19140625], + [125.491796875, 11.5943359375], + [125.57353515625, 11.238232421875], + [125.73564453125, 11.049609375], + [125.2333984375, 11.145068359375], + [125.03427734375, 11.341259765625], + [124.9169921875, 11.5583984375], + [124.99501953125, 11.76494140625], + [124.445703125, 12.152783203125], + [124.2947265625, 12.5693359375], + [125.23955078125, 12.527880859375] + ] + ], + [ + [ + [123.7166015625, 12.287353515625], + [124.04033203125, 11.966796875], + [124.0455078125, 11.75244140625], + [123.47373046875, 12.216650390625], + [123.1578125, 11.925634765625], + [123.23642578125, 12.5834960937501], + [123.7166015625, 12.287353515625] + ] + ], + [ + [ + [122.09404296875, 12.3548828125], + [122.01396484375, 12.105615234375], + [121.9232421875, 12.331298828125], + [122.0015625, 12.59853515625], + [122.14501953125, 12.65263671875], + [122.09404296875, 12.3548828125] + ] + ], + [ + [ + [123.775390625, 12.45390625], + [123.7791015625, 12.366259765625], + [123.621484375, 12.67490234375], + [123.775390625, 12.45390625] + ] + ], + [ + [ + [123.2818359375, 12.85341796875], + [123.3671875, 12.700830078125], + [122.95751953125, 13.107177734375], + [123.2818359375, 12.85341796875] + ] + ], + [ + [ + [120.70439453125, 13.4794921875], + [121.202734375, 13.43232421875], + [121.52275390625, 13.131201171875], + [121.540625, 12.63818359375], + [121.3943359375, 12.3005859375], + [121.23671875, 12.218798828125], + [120.92216796875, 12.51162109375], + [120.6513671875, 13.169140625], + [120.3384765625, 13.412353515625], + [120.40126953125, 13.517041015625], + [120.70439453125, 13.4794921875] + ] + ], + [ + [ + [121.91484375, 13.54033203125], + [122.11455078125, 13.46318359375], + [122.0048828125, 13.20498046875], + [121.82919921875, 13.32861328125], + [121.91484375, 13.54033203125] + ] + ], + [ + [ + [124.35361328125, 13.6322265625], + [124.175390625, 13.53154296875], + [124.0388671875, 13.663134765625], + [124.22490234375, 14.077587890625], + [124.4171875, 13.871044921875], + [124.35361328125, 13.6322265625] + ] + ], + [ + [ + [122.03349609375, 15.005029296875], + [121.9330078125, 14.6560546875], + [121.83984375, 15.038134765625], + [122.03349609375, 15.005029296875] + ] + ], + [ + [ + [121.1015625, 18.615283203125], + [121.84560546875, 18.29541015625], + [122.0384765625, 18.3279296875], + [122.1466796875, 18.486572265625], + [122.26552734375, 18.458837890625], + [122.15234375, 17.664404296875], + [122.519140625, 17.124853515625], + [122.13515625, 16.184814453125], + [121.5953125, 15.933251953125], + [121.60703125, 15.66982421875], + [121.39228515625, 15.3244140625], + [121.69541015625, 14.7373046875], + [121.6279296875, 14.58115234375], + [121.7666015625, 14.16806640625], + [122.21171875, 13.9301757812501], + [122.2875, 13.99619140625], + [122.19970703125, 14.148046875], + [122.6271484375, 14.317529296875], + [122.9341796875, 14.1880859375], + [123.101953125, 13.750244140625], + [123.29697265625, 13.83642578125], + [123.3203125, 14.061669921875], + [123.81572265625, 13.837109375], + [123.80625, 13.721728515625], + [123.549609375, 13.645751953125], + [123.81923828125, 13.269482421875], + [123.78515625, 13.1105468750001], + [124.1427734375, 13.035791015625], + [124.059765625, 12.56708984375], + [123.87783203125, 12.689697265625], + [123.94853515625, 12.91640625], + [123.3109375, 13.044091796875], + [123.16328125, 13.441748046875], + [122.59521484375, 13.9076171875], + [122.46796875, 13.88671875], + [122.66787109375, 13.395361328125], + [122.59990234375, 13.194140625], + [122.3765625, 13.52060546875], + [121.7779296875, 13.937646484375], + [121.50107421875, 13.8421875], + [121.344140625, 13.64912109375], + [121.0955078125, 13.6794921875], + [120.84072265625, 13.884716796875], + [120.637109375, 13.8044921875], + [120.616796875, 14.188037109375], + [120.9220703125, 14.493115234375], + [120.94130859375, 14.645068359375], + [120.58369140625, 14.88125], + [120.588671875, 14.48310546875], + [120.43876953125, 14.453369140625], + [120.25078125, 14.793310546875], + [120.08212890625, 14.85107421875], + [119.77255859375, 16.255126953125], + [119.83076171875, 16.3265625], + [120.159765625, 16.04765625], + [120.36875, 16.1095703125], + [120.3583984375, 17.63818359375], + [120.59970703125, 18.5078613281251], + [121.1015625, 18.615283203125] + ] + ], + [ + [ + [121.9216796875, 18.8947265625], + [121.8251953125, 18.842724609375], + [121.943359375, 19.01044921875], + [121.9216796875, 18.8947265625] + ] + ], + [ + [ + [121.5208984375, 19.361962890625], + [121.53125, 19.271337890625], + [121.374609375, 19.356298828125], + [121.5208984375, 19.361962890625] + ] + ] + ] + }, + "properties": { + "name": "Philippines", + "childNum": 37 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [134.59541015625, 7.38203124999997], + [134.51572265625, 7.52578125000004], + [134.651171875, 7.71210937499998], + [134.59541015625, 7.38203124999997] + ] + ] + }, + "properties": { + "name": "Palau", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [153.5361328125, -11.4761718749999], + [153.75986328125, -11.586328125], + [153.5537109375, -11.63056640625], + [153.28681640625, -11.5169921875], + [153.20361328125, -11.32412109375], + [153.5361328125, -11.4761718749999] + ] + ], + [ + [ + [154.28076171875, -11.36142578125], + [154.12119140625, -11.42568359375], + [154.0234375, -11.34794921875], + [154.28076171875, -11.36142578125] + ] + ], + [ + [ + [150.89873046875, -10.56533203125], + [150.88466796875, -10.64345703125], + [150.7857421875, -10.60341796875], + [150.89873046875, -10.56533203125] + ] + ], + [ + [ + [151.08095703125, -10.0201171875], + [151.296484375, -9.95673828125003], + [151.230859375, -10.1947265625], + [150.9591796875, -10.092578125], + [150.77607421875, -9.70908203125002], + [151.08095703125, -10.0201171875] + ] + ], + [ + [ + [150.52841796875, -9.34658203124998], + [150.788671875, -9.41796874999996], + [150.89404296875, -9.66748046874999], + [150.43623046875, -9.62460937499995], + [150.50849609375, -9.53613281249996], + [150.4373046875, -9.35996093750003], + [150.52841796875, -9.34658203124998] + ] + ], + [ + [ + [150.34541015625, -9.49384765624996], + [150.109765625, -9.36191406249999], + [150.20830078125, -9.20634765625], + [150.3201171875, -9.26416015624997], + [150.34541015625, -9.49384765624996] + ] + ], + [ + [ + [152.63095703125, -8.959375], + [152.9529296875, -9.07011718749996], + [152.96689453125, -9.20898437500001], + [152.51513671875, -9.00986328125003], + [152.63095703125, -8.959375] + ] + ], + [ + [ + [151.1068359375, -8.73349609374995], + [151.12412109375, -8.80488281250001], + [151.00498046875, -8.52382812499995], + [151.117578125, -8.41884765624998], + [151.1068359375, -8.73349609374995] + ] + ], + [ + [ + [143.58681640625, -8.48173828125], + [143.321875, -8.367578125], + [143.5814453125, -8.39091796874997], + [143.58681640625, -8.48173828125] + ] + ], + [ + [ + [148.02578125, -5.82636718750001], + [147.7810546875, -5.62724609374995], + [147.79462890625, -5.49238281250001], + [148.05478515625, -5.61152343750004], + [148.02578125, -5.82636718750001] + ] + ], + [ + [ + [155.9576171875, -6.68681640624999], + [155.7193359375, -6.86279296874996], + [155.34404296875, -6.72167968749999], + [155.2021484375, -6.3076171875], + [154.75927734375, -5.93134765625], + [154.729296875, -5.44443359375001], + [155.09384765625, -5.62021484375003], + [155.4669921875, -6.14511718750003], + [155.82255859375, -6.38046875000002], + [155.9576171875, -6.68681640624999] + ] + ], + [ + [ + [147.17626953125, -5.43193359374995], + [147.005859375, -5.30703125], + [147.1310546875, -5.19082031250004], + [147.17626953125, -5.43193359374995] + ] + ], + [ + [ + [154.647265625, -5.43271484375002], + [154.5400390625, -5.11083984375], + [154.6326171875, -5.01386718749996], + [154.7271484375, -5.21806640624999], + [154.647265625, -5.43271484375002] + ] + ], + [ + [ + [146.0193359375, -4.72617187499996], + [145.88359375, -4.66748046875], + [145.99580078125, -4.53925781249998], + [146.0193359375, -4.72617187499996] + ] + ], + [ + [ + [151.915625, -4.29677734374997], + [152.1171875, -4.21220703124997], + [152.4056640625, -4.34072265624995], + [152.351171875, -4.82216796874998], + [151.98369140625, -5.07441406250004], + [152.14296875, -5.35703124999996], + [152.07705078125, -5.45830078124999], + [151.8654296875, -5.56484375000002], + [151.51513671875, -5.55234374999996], + [151.229296875, -5.91992187499999], + [150.47353515625, -6.26337890624997], + [149.6525390625, -6.29042968749997], + [149.38232421875, -6.078125], + [149.0990234375, -6.11699218749999], + [148.33720703125, -5.66943359375001], + [148.43203125, -5.47177734374999], + [149.35888671875, -5.58398437500001], + [149.8314453125, -5.52412109375], + [149.96279296875, -5.44775390624997], + [150.0900390625, -5.01181640624998], + [150.1703125, -5.07060546874997], + [150.0724609375, -5.30957031249999], + [150.18310546875, -5.52363281249998], + [150.90029296875, -5.44716796875004], + [151.3265625, -4.96035156249998], + [151.67119140625, -4.88330078125], + [151.59306640625, -4.20078124999995], + [151.915625, -4.29677734374997] + ] + ], + [ + [ + [152.67060546875, -3.13339843750002], + [152.64619140625, -3.22119140624996], + [152.54326171875, -3.09560546874995], + [152.63876953125, -3.04277343750003], + [152.67060546875, -3.13339843750002] + ] + ], + [ + [ + [140.976171875, -9.11875], + [140.9751953125, -6.90537109375002], + [140.8623046875, -6.74003906249999], + [140.975, -6.34609375000002], + [140.97353515625, -2.80341796875003], + [140.9734375, -2.609765625], + [142.90517578125, -3.32070312499998], + [143.508984375, -3.43115234375001], + [144.06640625, -3.80517578125], + [144.477734375, -3.82529296875002], + [145.08779296875, -4.34912109374997], + [145.3345703125, -4.38525390624997], + [145.7669921875, -4.82304687499999], + [145.74521484375, -5.40244140624998], + [147.56669921875, -6.05693359375], + [147.80205078125, -6.31523437499996], + [147.8455078125, -6.66240234374999], + [147.119140625, -6.72167968749999], + [146.95361328125, -6.83408203124996], + [147.1900390625, -7.378125], + [148.1267578125, -8.10361328124996], + [148.246875, -8.55429687500003], + [148.451171875, -8.69453125000001], + [148.58310546875, -9.05175781249996], + [149.19833984375, -9.03125], + [149.26318359375, -9.49785156249997], + [150.01103515625, -9.68818359375003], + [149.76123046875, -9.80585937500001], + [149.8744140625, -10.01298828125], + [150.84951171875, -10.23603515625], + [150.44609375, -10.30732421875], + [150.64716796875, -10.51796875], + [150.319921875, -10.6548828125], + [150.016796875, -10.5771484375], + [149.7541015625, -10.35302734375], + [147.76865234375, -10.0701171875], + [147.0171875, -9.38789062500004], + [146.96376953125, -9.05957031249994], + [146.630859375, -8.95117187499997], + [146.033203125, -8.07636718750001], + [144.973828125, -7.80214843750001], + [144.8642578125, -7.63154296874998], + [144.50986328125, -7.56738281249997], + [144.14287109375, -7.75722656250001], + [143.6548828125, -7.46035156250001], + [143.94228515625, -7.94423828125001], + [143.8333984375, -8.02910156249997], + [143.5181640625, -8.00068359374996], + [143.61376953125, -8.20039062499997], + [142.52412109375, -8.32167968749998], + [142.3474609375, -8.16748046875001], + [142.2068359375, -8.19580078125001], + [142.4748046875, -8.36943359375003], + [142.79794921875, -8.34501953125003], + [143.11181640625, -8.47451171875004], + [143.37724609375, -8.76220703125003], + [143.3662109375, -8.96103515625003], + [142.64716796875, -9.32783203124997], + [142.22958984375, -9.16992187499996], + [141.133203125, -9.22128906250003], + [140.976171875, -9.11875] + ] + ], + [ + [ + [152.9658203125, -4.75634765624999], + [152.89169921875, -4.83242187500002], + [152.73994140625, -4.63583984375003], + [152.6681640625, -4.13183593750003], + [152.27939453125, -3.582421875], + [151.066796875, -2.82900390624999], + [150.74609375, -2.73886718750002], + [150.825390625, -2.57294921874997], + [152.03291015625, -3.25136718749998], + [153.016796875, -4.10566406250003], + [153.13251953125, -4.35244140625004], + [152.9658203125, -4.75634765624999] + ] + ], + [ + [ + [150.43662109375, -2.66181640625004], + [150.16572265625, -2.66025390624999], + [149.96162109375, -2.47382812500003], + [150.2271484375, -2.38417968749997], + [150.4294921875, -2.47041015625004], + [150.43662109375, -2.66181640625004] + ] + ], + [ + [ + [147.067578125, -1.96015625], + [147.4380859375, -2.05898437499998], + [147.20634765625, -2.18193359374997], + [146.546484375, -2.20859375], + [146.65625, -1.97402343749998], + [147.067578125, -1.96015625] + ] + ], + [ + [ + [149.7654296875, -1.55302734375002], + [149.5458984375, -1.47167968749996], + [149.58095703125, -1.35322265624998], + [149.7654296875, -1.55302734375002] + ] + ] + ] + }, + "properties": { + "name": "Papua New Guinea", + "childNum": 21 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.48466796875, 53.939794921875], + [23.9154296875, 52.770263671875], + [23.17509765625, 52.28662109375], + [23.65244140625, 52.040380859375], + [23.6052734375, 51.517919921875], + [23.664453125, 51.31005859375], + [24.09580078125, 50.87275390625], + [23.9970703125, 50.809375], + [24.08994140625, 50.53046875], + [23.97265625, 50.41005859375], + [23.71171875, 50.37734375], + [23.036328125, 49.899072265625], + [22.70615234375, 49.606201171875], + [22.6494140625, 49.539013671875], + [22.66064453125, 49.48369140625], + [22.719921875, 49.35380859375], + [22.732421875, 49.295166015625], + [22.7056640625, 49.17119140625], + [22.8470703125, 49.08125], + [22.538671875, 49.072705078125], + [22.473046875, 49.081298828125], + [22.0201171875, 49.209521484375], + [21.6396484375, 49.411962890625], + [21.07939453125, 49.41826171875], + [20.86845703125, 49.314697265625], + [20.36298828125, 49.38525390625], + [20.0576171875, 49.181298828125], + [19.756640625, 49.20439453125], + [19.77392578125, 49.37216796875], + [19.4416015625, 49.597705078125], + [19.1494140625, 49.4], + [18.8322265625, 49.510791015625], + [18.56240234375, 49.879345703125], + [18.0283203125, 50.03525390625], + [17.8748046875, 49.972265625], + [17.62705078125, 50.11640625], + [17.70224609375, 50.307177734375], + [17.415234375, 50.25478515625], + [16.880078125, 50.42705078125], + [16.9896484375, 50.2369140625], + [16.63916015625, 50.1021484375], + [16.2103515625, 50.42373046875], + [16.4197265625, 50.5736328125], + [16.2822265625, 50.655615234375], + [16.0072265625, 50.61162109375], + [14.99375, 51.01435546875], + [14.98291015625, 50.886572265625], + [14.89580078125, 50.861376953125], + [14.809375, 50.858984375], + [14.8142578125, 50.871630859375], + [14.91748046875, 51.008740234375], + [14.9638671875, 51.0951171875], + [14.935546875, 51.4353515625], + [14.90595703125, 51.463330078125], + [14.72470703125, 51.523876953125], + [14.7109375, 51.544921875], + [14.738671875, 51.6271484375], + [14.60166015625, 51.832373046875], + [14.7525390625, 52.0818359375], + [14.6798828125, 52.25], + [14.615625, 52.27763671875], + [14.57392578125, 52.31416015625], + [14.55458984375, 52.35966796875], + [14.5697265625, 52.431103515625], + [14.61943359375, 52.528515625], + [14.5140625, 52.64560546875], + [14.2537109375, 52.78251953125], + [14.12861328125, 52.87822265625], + [14.1388671875, 52.932861328125], + [14.2931640625, 53.0267578125], + [14.3685546875, 53.10556640625], + [14.4109375, 53.1990234375], + [14.4123046875, 53.216748046875], + [14.41455078125, 53.28349609375], + [14.25888671875, 53.729638671875], + [14.58349609375, 53.63935546875], + [14.5583984375, 53.823193359375], + [14.21142578125, 53.950341796875], + [16.186328125, 54.290380859375], + [16.559765625, 54.55380859375], + [18.3234375, 54.83818359375], + [18.75927734375, 54.6845703125], + [18.43623046875, 54.7447265625], + [18.83642578125, 54.369580078125], + [19.60439453125, 54.4591796875], + [20.208203125, 54.420751953125], + [22.16845703125, 54.35986328125], + [22.7318359375, 54.35009765625], + [22.7662109375, 54.356787109375], + [22.82373046875, 54.39580078125], + [22.8939453125, 54.39052734375], + [22.9767578125, 54.366357421875], + [23.01552734375, 54.34833984375], + [23.0421875, 54.30419921875], + [23.0875, 54.299462890625], + [23.1703125, 54.2814453125], + [23.28232421875, 54.24033203125], + [23.3701171875, 54.20048828125], + [23.45361328125, 54.14345703125], + [23.48466796875, 53.939794921875] + ] + ] + }, + "properties": { + "name": "Poland", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-65.4255859375, 18.105615234375], + [-65.5722167968749, 18.1373046875], + [-65.294873046875, 18.133349609375], + [-65.4255859375, 18.105615234375] + ] + ], + [ + [ + [-66.12939453125, 18.444921875], + [-65.62880859375, 18.381396484375], + [-65.620849609375, 18.242333984375], + [-65.97080078125, 17.974365234375], + [-67.196875, 17.994189453125], + [-67.2640625, 18.364599609375], + [-67.158642578125, 18.49921875], + [-66.12939453125, 18.444921875] + ] + ] + ] + }, + "properties": { + "name": "Puerto Rico", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [130.526953125, 42.535400390625], + [130.6873046875, 42.3025390625], + [130.2357421875, 42.183203125], + [129.75634765625, 41.712255859375], + [129.70869140625, 40.85732421875], + [129.34111328125, 40.7263183593751], + [128.51123046875, 40.130224609375], + [127.5681640625, 39.781982421875], + [127.39453125, 39.20791015625], + [127.7861328125, 39.084130859375], + [128.374609375, 38.6234375], + [128.03896484375, 38.308544921875], + [127.09033203125, 38.28388671875], + [126.63388671875, 37.7818359375001], + [126.369921875, 37.878369140625], + [126.11669921875, 37.742919921875], + [125.769140625, 37.9853515625], + [125.3578125, 37.7248046875], + [125.3107421875, 37.843505859375], + [124.98876953125, 37.9314453125], + [125.20673828125, 38.08154296875], + [124.69091796875, 38.12919921875], + [125.0673828125, 38.55673828125], + [125.5544921875, 38.68623046875], + [125.16884765625, 38.8055175781251], + [125.40966796875, 39.28837890625], + [125.36083984375, 39.526611328125], + [124.77529296875, 39.7580566406251], + [124.63828125, 39.6150878906251], + [124.362109375, 40.004052734375], + [124.88935546875, 40.459814453125], + [125.9890625, 40.904638671875], + [126.74306640625, 41.724853515625], + [126.95478515625, 41.769482421875], + [127.1796875, 41.53134765625], + [128.1494140625, 41.387744140625], + [128.2892578125, 41.6074218750001], + [128.04521484375, 41.9875], + [128.9234375, 42.038232421875], + [129.313671875, 42.41357421875], + [129.6978515625, 42.44814453125], + [129.8982421875, 42.99814453125], + [130.24033203125, 42.891796875], + [130.2466796875, 42.74482421875], + [130.526953125, 42.535400390625] + ] + ] + }, + "properties": { + "name": "North Korea", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-17.1908691406249, 32.868603515625], + [-16.69326171875, 32.7580078125], + [-17.0182617187499, 32.66279296875], + [-17.226025390625, 32.766845703125], + [-17.1908691406249, 32.868603515625] + ] + ], + [ + [ + [-25.648974609375, 37.84091796875], + [-25.18193359375, 37.837890625], + [-25.19072265625, 37.76435546875], + [-25.7344726562499, 37.762890625], + [-25.8458984375, 37.89404296875], + [-25.648974609375, 37.84091796875] + ] + ], + [ + [ + [-28.147265625, 38.452685546875], + [-28.064794921875, 38.412744140625], + [-28.4544921875, 38.408642578125], + [-28.548828125, 38.5185546875], + [-28.147265625, 38.452685546875] + ] + ], + [ + [ + [-28.64130859375, 38.525], + [-28.842041015625, 38.5984375], + [-28.69775390625, 38.6384765625], + [-28.64130859375, 38.525] + ] + ], + [ + [ + [-27.075244140625, 38.64345703125], + [-27.3859375, 38.7658203125], + [-27.127001953125, 38.78984375], + [-27.075244140625, 38.64345703125] + ] + ], + [ + [ + [-31.1371093749999, 39.40693359375], + [-31.282958984375, 39.394091796875], + [-31.26083984375, 39.49677734375], + [-31.1371093749999, 39.40693359375] + ] + ], + [ + [ + [-7.40615234374994, 37.179443359375], + [-7.83413085937499, 37.005712890625], + [-8.59765624999994, 37.1213378906251], + [-8.99780273437503, 37.032275390625], + [-8.81416015624998, 37.430810546875], + [-8.88110351562494, 38.4466796875001], + [-8.66831054687495, 38.42431640625], + [-8.79887695312499, 38.5181640625], + [-9.21328124999994, 38.448095703125], + [-9.25039062499997, 38.65673828125], + [-9.02148437499994, 38.746875], + [-8.79160156249992, 39.078173828125], + [-9.13579101562496, 38.7427734375], + [-9.35673828124996, 38.697900390625], + [-9.47973632812497, 38.798779296875], + [-9.37475585937497, 39.33828125], + [-8.83784179687493, 40.115673828125], + [-8.68461914062499, 40.7525390625001], + [-8.75541992187493, 41.698388671875], + [-8.88759765624994, 41.764599609375], + [-8.77714843750002, 41.941064453125], + [-8.26606445312498, 42.13740234375], + [-8.15249023437494, 41.811962890625], + [-7.40361328124996, 41.83369140625], + [-7.14711914062502, 41.98115234375], + [-6.61826171874992, 41.9423828125], + [-6.54218749999996, 41.672509765625], + [-6.2125, 41.53203125], + [-6.92846679687497, 41.009130859375], + [-6.8101562499999, 40.343115234375], + [-7.03261718749997, 40.167919921875], + [-6.89609374999995, 40.0218261718751], + [-6.97539062499993, 39.798388671875], + [-7.11767578124997, 39.681689453125], + [-7.53569335937496, 39.661572265625], + [-6.99794921874999, 39.0564453125], + [-7.34301757812494, 38.457421875], + [-7.10639648437498, 38.181005859375], + [-6.95756835937493, 38.187890625], + [-7.44394531249992, 37.728271484375], + [-7.40615234374994, 37.179443359375] + ] + ] + ] + }, + "properties": { + "name": "Portugal", + "childNum": 7, + "cp": [-8.7440694, 39.9251454] + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-58.159765625, -20.1646484375], + [-58.13779296875, -20.2373046875], + [-58.124609375, -20.29345703125], + [-58.09150390625, -20.333203125], + [-58.058447265625, -20.3861328125], + [-58.025390625, -20.4158203125], + [-58.00224609375, -20.4654296875], + [-57.979052734375, -20.65732421875], + [-57.91513671875, -20.69033203125], + [-57.830224609375, -20.99794921875], + [-57.94267578125, -21.79833984375], + [-57.955908203125, -22.1091796875], + [-56.7751953125, -22.261328125], + [-56.447802734375, -22.076171875], + [-56.394873046875, -22.09267578125], + [-56.35185546875, -22.17861328125], + [-56.246044921875, -22.2646484375], + [-56.18984375, -22.28115234375], + [-55.99140625, -22.28115234375], + [-55.849169921875, -22.3076171875], + [-55.753271484375, -22.41015625], + [-55.746630859375, -22.5126953125], + [-55.61767578125, -22.671484375], + [-55.53828125, -23.58095703125], + [-55.51845703125, -23.62724609375], + [-55.45888671875, -23.68671875], + [-55.4423828125, -23.792578125], + [-55.4423828125, -23.86533203125], + [-55.41591796875, -23.9513671875], + [-55.36630859375, -23.991015625], + [-55.2869140625, -24.004296875], + [-55.1943359375, -24.01748046875], + [-55.081884765625, -23.99765625], + [-54.982666015625, -23.97451171875], + [-54.62548828125, -23.8125], + [-54.440234375, -23.9017578125], + [-54.37080078125, -23.97119140625], + [-54.241796875, -24.047265625], + [-54.281005859375, -24.3060546875], + [-54.43623046875, -25.1212890625], + [-54.47314453125, -25.22021484375], + [-54.610546875, -25.43271484375], + [-54.615869140625, -25.57607421875], + [-54.63193359375, -26.00576171875], + [-54.677734375, -26.3087890625], + [-54.93447265625, -26.7025390625], + [-55.1359375, -26.93115234375], + [-55.42666015625, -27.00927734375], + [-55.450634765625, -27.068359375], + [-55.496728515625, -27.11533203125], + [-55.564892578125, -27.15], + [-55.597265625, -27.2076171875], + [-55.593798828125, -27.2880859375], + [-55.63291015625, -27.35712890625], + [-55.7146484375, -27.41484375], + [-55.789990234375, -27.41640625], + [-55.95146484375, -27.32568359375], + [-56.1640625, -27.321484375], + [-56.437158203125, -27.55380859375], + [-58.16826171875, -27.2734375], + [-58.604833984375, -27.31435546875], + [-58.641748046875, -27.19609375], + [-58.618603515625, -27.13212890625], + [-58.2220703125, -26.65], + [-58.181494140625, -26.307421875], + [-57.943115234375, -26.0529296875], + [-57.563134765625, -25.47373046875], + [-57.8216796875, -25.13642578125], + [-59.187255859375, -24.5623046875], + [-59.89248046875, -24.0935546875], + [-60.83984375, -23.85810546875], + [-61.084716796875, -23.6564453125], + [-61.79853515625, -23.18203125], + [-62.21416015625, -22.61240234375], + [-62.372509765625, -22.43916015625], + [-62.541552734375, -22.349609375], + [-62.6259765625, -22.2904296875], + [-62.62568359375, -22.2615234375], + [-62.6509765625, -22.23369140625], + [-62.27666015625, -21.066015625], + [-62.276318359375, -20.5625], + [-61.7568359375, -19.6453125], + [-60.007373046875, -19.29755859375], + [-59.09052734375, -19.28623046875], + [-58.18017578125, -19.81787109375], + [-58.159765625, -20.1646484375] + ] + ] + }, + "properties": { + "name": "Paraguay", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [34.34833984375, 31.292919921875], + [34.2453125000001, 31.20830078125], + [34.2125, 31.29228515625], + [34.19814453125, 31.3226074218751], + [34.47734375, 31.58486328125], + [34.52412109375, 31.541650390625], + [34.5255859375001, 31.525634765625], + [34.34833984375, 31.292919921875] + ] + ], + [ + [ + [34.88046875, 31.3681640625], + [34.9509765625001, 31.602294921875], + [35.2037109375001, 31.75], + [35.1271484375001, 31.816748046875], + [35.05322265625, 31.837939453125], + [34.9830078125, 31.816796875], + [34.9611328125001, 31.82333984375], + [34.95380859375, 31.841259765625], + [34.98974609375, 31.91328125], + [34.95595703125, 32.1609375], + [35.010546875, 32.33818359375], + [35.0650390625001, 32.4604492187501], + [35.1932617187501, 32.534423828125], + [35.30380859375, 32.512939453125], + [35.38671875, 32.493017578125], + [35.4026367187501, 32.450634765625], + [35.484375, 32.40166015625], + [35.5514648437501, 32.3955078125001], + [35.5720703125, 32.237890625], + [35.4505859375, 31.479296875], + [34.88046875, 31.3681640625] + ] + ] + ] + }, + "properties": { + "name": "Palestine", + "childNum": 2 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-149.321533203125, -17.6900390625], + [-149.177685546875, -17.73662109375], + [-149.181787109375, -17.8623046875], + [-149.34111328125, -17.732421875], + [-149.57890625, -17.7349609375], + [-149.635009765625, -17.5642578125], + [-149.37919921875, -17.52236328125], + [-149.321533203125, -17.6900390625] + ] + ], + [ + [ + [-143.440576171875, -16.6197265625], + [-143.386181640625, -16.66884765625], + [-143.55068359375, -16.62109375], + [-143.440576171875, -16.6197265625] + ] + ], + [ + [ + [-139.02431640625, -9.69521484375004], + [-138.82734375, -9.74160156249998], + [-139.13408203125, -9.82949218750004], + [-139.02431640625, -9.69521484375004] + ] + ], + [ + [ + [-140.075634765625, -9.42597656249998], + [-140.144384765625, -9.359375], + [-140.070947265625, -9.328125], + [-140.075634765625, -9.42597656249998] + ] + ], + [ + [ + [-140.072607421875, -8.91044921875003], + [-140.217431640625, -8.92968749999996], + [-140.2400390625, -8.79755859375004], + [-140.057666015625, -8.80146484375003], + [-140.072607421875, -8.91044921875003] + ] + ] + ] + }, + "properties": { + "name": "Fr. Polynesia", + "childNum": 5 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [51.26796875, 24.6072265625], + [51.17802734375, 24.58671875], + [51.093359375, 24.5646484375], + [51.02275390625, 24.565234375], + [50.966015625, 24.57392578125], + [50.9283203125, 24.5951171875], + [50.8556640625, 24.679638671875], + [50.80439453125, 24.7892578125], + [50.8359375, 24.850390625], + [50.84677734375, 24.88857421875], + [50.75458984375, 25.399267578125], + [51.003125, 25.9814453125], + [51.2623046875, 26.153271484375], + [51.54306640625, 25.902392578125], + [51.4853515625, 25.52470703125], + [51.60888671875, 25.052880859375], + [51.4279296875, 24.66826171875], + [51.26796875, 24.6072265625] + ] + ] + }, + "properties": { + "name": "Qatar", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.2125, 45.450439453125], + [28.31767578125, 45.347119140625], + [28.45126953125, 45.2921875], + [28.78828125, 45.240966796875], + [28.78173828125, 45.30986328125], + [28.8943359375, 45.28994140625], + [29.22353515625, 45.4029296875], + [29.4037109375, 45.419677734375], + [29.56767578125, 45.37080078125], + [29.705859375, 45.259912109375], + [29.55751953125, 44.843408203125], + [29.0482421875, 44.757568359375], + [29.0953125, 44.975048828125], + [28.89150390625, 44.91865234375], + [28.5853515625, 43.742236328125], + [28.22197265625, 43.7728515625], + [27.88427734375, 43.987353515625], + [27.425390625, 44.0205078125], + [27.0869140625, 44.1673828125], + [26.2158203125, 44.007275390625], + [25.4970703125, 43.67080078125], + [22.91904296875, 43.83447265625], + [22.86826171875, 43.947900390625], + [23.028515625, 44.077978515625], + [22.705078125, 44.23779296875], + [22.687890625, 44.248291015625], + [22.49453125, 44.43544921875], + [22.55400390625, 44.54033203125], + [22.6201171875, 44.562353515625], + [22.70078125, 44.555517578125], + [22.734375, 44.569921875], + [22.7208984375, 44.605517578125], + [22.64208984375, 44.6509765625], + [22.49765625, 44.70625], + [22.35068359375, 44.676123046875], + [22.2009765625, 44.560693359375], + [22.09306640625, 44.541943359375], + [21.90927734375, 44.66611328125], + [21.6361328125, 44.71044921875], + [21.52314453125, 44.790087890625], + [21.36005859375, 44.82666015625], + [21.35791015625, 44.86181640625], + [21.384375, 44.870068359375], + [21.4421875, 44.873388671875], + [21.519921875, 44.880810546875], + [21.53232421875, 44.90068359375], + [21.35703125, 44.990771484375], + [21.4654296875, 45.171875], + [21.4314453125, 45.192529296875], + [20.79404296875, 45.46787109375], + [20.775, 45.7498046875], + [20.76015625, 45.75810546875], + [20.746875, 45.748974609375], + [20.72783203125, 45.73740234375], + [20.70927734375, 45.73525390625], + [20.652734375, 45.77939453125], + [20.58115234375, 45.869482421875], + [20.35859375, 45.97548828125], + [20.241796875, 46.10859375], + [20.28095703125, 46.1330078125], + [20.50810546875, 46.166943359375], + [20.613671875, 46.13349609375], + [20.76025390625, 46.246240234375], + [21.1216796875, 46.282421875], + [21.99970703125, 47.505029296875], + [22.87666015625, 47.947265625], + [23.05478515625, 48.00654296875], + [23.139453125, 48.08740234375], + [23.20263671875, 48.084521484375], + [23.408203125, 47.989990234375], + [23.6287109375, 47.995849609375], + [24.57890625, 47.9310546875], + [24.9791015625, 47.72412109375], + [25.4642578125, 47.910791015625], + [25.6892578125, 47.932470703125], + [25.90869140625, 47.967578125], + [26.1626953125, 47.992529296875], + [26.23623046875, 48.06435546875], + [26.276953125, 48.113232421875], + [26.3056640625, 48.203759765625], + [26.4423828125, 48.22998046875], + [26.6189453125, 48.25986328125], + [26.98076171875, 48.155029296875], + [27.6140625, 47.34052734375], + [28.07177734375, 46.97841796875], + [28.239453125, 46.6408203125], + [28.07470703125, 45.598974609375], + [28.2125, 45.450439453125] + ] + ] + }, + "properties": { + "name": "Romania", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [146.71396484375, 43.743798828125], + [146.62197265625, 43.8129882812501], + [146.88408203125, 43.829150390625], + [146.71396484375, 43.743798828125] + ] + ], + [ + [ + [146.2076171875, 44.49765625], + [146.5677734375, 44.4404296875], + [145.9140625, 44.1037109375], + [145.58681640625, 43.8451171875], + [145.555859375, 43.664599609375], + [145.46171875, 43.8708984375], + [146.2076171875, 44.49765625] + ] + ], + [ + [ + [148.59951171875, 45.317626953125], + [147.91376953125, 44.990380859375], + [147.6578125, 44.9771484375], + [146.8974609375, 44.404296875], + [147.24658203125, 44.8560546875], + [147.885546875, 45.225634765625], + [147.9240234375, 45.3833007812501], + [148.0560546875, 45.2621093750001], + [148.32421875, 45.282421875], + [148.81220703125, 45.510009765625], + [148.837109375, 45.3626953125], + [148.59951171875, 45.317626953125] + ] + ], + [ + [ + [149.6876953125, 45.642041015625], + [149.4470703125, 45.593359375], + [149.9623046875, 46.021923828125], + [150.553125, 46.208544921875], + [149.6876953125, 45.642041015625] + ] + ], + [ + [ + [152.00205078125, 46.89716796875], + [151.7234375, 46.82880859375], + [152.2888671875, 47.1421875], + [152.00205078125, 46.89716796875] + ] + ], + [ + [ + [154.81044921875, 49.31201171875], + [154.6109375, 49.29404296875], + [154.82490234375, 49.646923828125], + [154.81044921875, 49.31201171875] + ] + ], + [ + [ + [155.92109375, 50.302197265625], + [155.39716796875, 50.041259765625], + [155.24306640625, 50.09462890625], + [155.218359375, 50.2978515625], + [155.68017578125, 50.400732421875], + [156.096875, 50.771875], + [155.92109375, 50.302197265625] + ] + ], + [ + [ + [156.405078125, 50.6576171875001], + [156.16796875, 50.731884765625], + [156.37646484375, 50.862109375], + [156.4875, 50.84296875], + [156.405078125, 50.6576171875001] + ] + ], + [ + [ + [142.76103515625, 54.3939453125], + [143.32470703125, 52.9630859375], + [143.15556640625, 52.083740234375], + [143.29951171875, 51.632373046875], + [143.816015625, 50.2826171875], + [144.71376953125, 48.640283203125], + [144.04873046875, 49.249169921875], + [143.73232421875, 49.31201171875], + [143.10498046875, 49.198828125], + [142.57421875, 48.07216796875], + [142.55693359375, 47.737890625], + [143.21767578125, 46.794873046875], + [143.48564453125, 46.75205078125], + [143.5806640625, 46.360693359375], + [143.431640625, 46.028662109375], + [143.28232421875, 46.558984375], + [142.57802734375, 46.70078125], + [142.0771484375, 45.917041015625], + [141.83037109375, 46.45107421875], + [142.038671875, 47.140283203125], + [141.9640625, 47.587451171875], + [142.18173828125, 48.01337890625], + [141.86630859375, 48.75009765625], + [142.14228515625, 49.569140625], + [142.066015625, 50.63046875], + [142.20673828125, 51.22255859375], + [141.72236328125, 51.736328125], + [141.66083984375, 52.27294921875], + [141.85556640625, 52.793505859375], + [141.82353515625, 53.339501953125], + [142.1419921875, 53.49560546875], + [142.526171875, 53.4474609375], + [142.70595703125, 53.895703125], + [142.3349609375, 54.280712890625], + [142.76103515625, 54.3939453125] + ] + ], + [ + [ + [137.17861328125, 55.100439453125], + [137.0552734375, 54.9267578125], + [136.7146484375, 54.95615234375], + [137.17861328125, 55.100439453125] + ] + ], + [ + [ + [137.94052734375, 55.092626953125], + [138.20615234375, 55.033544921875], + [137.721484375, 54.6632324218751], + [137.4626953125, 54.873388671875], + [137.23291015625, 54.790576171875], + [137.57734375, 55.197021484375], + [137.94052734375, 55.092626953125] + ] + ], + [ + [ + [21.2357421875, 55.264111328125], + [22.07236328125, 55.063671875], + [22.5672851562501, 55.059130859375], + [22.82470703125, 54.8712890625], + [22.68447265625, 54.562939453125], + [22.6798828125001, 54.493017578125], + [22.7662109375, 54.356787109375], + [22.1684570312501, 54.3598632812501], + [21.1405273437501, 54.391796875], + [19.60439453125, 54.4591796875], + [19.97451171875, 54.92119140625], + [20.5203125, 54.994873046875], + [20.8998046875001, 55.286669921875], + [20.9578125000001, 55.2789062500001], + [20.59482421875, 54.982373046875], + [20.9958984375, 54.9026855468751], + [21.1888671875001, 54.935205078125], + [21.2357421875, 55.264111328125] + ] + ], + [ + [ + [166.65029296875, 54.8390625], + [166.6451171875, 54.694091796875], + [165.75107421875, 55.29453125], + [166.27578125, 55.311962890625], + [166.248046875, 55.1654296875], + [166.65029296875, 54.8390625] + ] + ], + [ + [ + [150.58994140625, 59.01875], + [150.47021484375, 59.054052734375], + [150.6662109375, 59.16015625], + [150.58994140625, 59.01875] + ] + ], + [ + [ + [163.63515625, 58.603369140625], + [163.47138671875, 58.509375], + [163.7609375, 59.0150390625], + [164.57265625, 59.221142578125], + [164.61572265625, 58.885595703125], + [163.63515625, 58.603369140625] + ] + ], + [ + [ + [35.8161132812501, 65.182080078125], + [35.7787109375001, 64.97666015625], + [35.5289062500001, 65.15107421875], + [35.8161132812501, 65.182080078125] + ] + ], + [ + [ + [70.020703125, 66.502197265625], + [69.6513671875, 66.56533203125], + [69.502734375, 66.75107421875], + [70.07666015625, 66.6958984375], + [70.020703125, 66.502197265625] + ] + ], + [ + [ + [-179.79853515625, 68.9404296875], + [-178.873876953125, 68.7541015625], + [-178.692626953125, 68.54599609375], + [-178.0974609375, 68.4248046875], + [-178.055810546875, 68.264892578125], + [-177.79677734375, 68.33798828125], + [-178.373046875, 68.565673828125], + [-177.52724609375, 68.294384765625], + [-177.589208984375, 68.22421875], + [-175.34521484375, 67.678076171875], + [-175.37470703125, 67.357373046875], + [-175.002685546875, 67.4375], + [-174.849853515625, 67.348876953125], + [-174.92490234375, 66.6231445312501], + [-174.503759765625, 66.537939453125], + [-174.394091796875, 66.34423828125], + [-174.084765625, 66.473095703125], + [-174.0650390625, 66.22958984375], + [-173.773974609375, 66.43466796875], + [-174.231591796875, 66.6318847656251], + [-174.08642578125, 66.94287109375], + [-174.55009765625, 67.090625], + [-173.6796875, 67.144775390625], + [-173.1578125, 67.069091796875], + [-173.32353515625, 66.954833984375], + [-173.258935546875, 66.840087890625], + [-173.193017578125, 66.993603515625], + [-172.5201171875, 66.952490234375], + [-173.00751953125, 67.064892578125], + [-171.795556640625, 66.93173828125], + [-170.509521484375, 66.3436523437501], + [-170.604443359375, 66.24892578125], + [-170.301220703125, 66.29404296875], + [-170.2439453125, 66.169287109375], + [-169.777880859375, 66.1431152343751], + [-169.831689453125, 65.99892578125], + [-170.540673828125, 65.8654296875], + [-170.66630859375, 65.621533203125], + [-171.421533203125, 65.8103515625], + [-171.105859375, 65.5110351562501], + [-171.90712890625, 65.495947265625], + [-172.78330078125, 65.6810546875], + [-172.2328125, 65.455712890625], + [-172.30927734375, 65.275634765625], + [-172.6619140625, 65.2485351562501], + [-172.28603515625, 65.205712890625], + [-172.21318359375, 65.04814453125], + [-173.085791015625, 64.817333984375], + [-172.80107421875, 64.79052734375], + [-172.90087890625, 64.628857421875], + [-172.40146484375, 64.413916015625], + [-172.73916015625, 64.412255859375], + [-172.903173828125, 64.52607421875], + [-172.96005859375, 64.327685546875], + [-173.27548828125, 64.2896484375], + [-173.327490234375, 64.53955078125], + [-173.729736328125, 64.364501953125], + [-174.570556640625, 64.7177734375], + [-175.3951171875, 64.802392578125], + [-175.853857421875, 65.01083984375], + [-176.09326171875, 65.471044921875], + [-177.05625, 65.613623046875], + [-177.48876953125, 65.5037109375], + [-178.4125, 65.495556640625], + [-178.9390625, 66.0327636718751], + [-178.746728515625, 66.0136718750001], + [-178.5265625, 66.4015625], + [-178.868115234375, 66.187060546875], + [-179.143408203125, 66.3750488281251], + [-179.327197265625, 66.16259765625], + [-179.68330078125, 66.1841308593751], + [-179.789697265625, 65.90087890625], + [-179.352099609375, 65.516748046875], + [-180, 65.067236328125], + [-180, 65.311962890625], + [-180, 65.556787109375], + [-180, 65.8015625], + [-180, 66.0462890625], + [-180, 66.291064453125], + [-180, 66.53583984375], + [-180, 66.7805664062501], + [-180, 67.025341796875], + [-180, 67.2701171875001], + [-180, 67.51484375], + [-180, 67.759619140625], + [-180, 68.00439453125], + [-180, 68.24912109375], + [-180, 68.493896484375], + [-180, 68.738671875], + [-179.999951171875, 68.9834472656251], + [-179.79853515625, 68.9404296875] + ] + ], + [ + [ + [50.265234375, 69.185595703125], + [49.62626953125, 68.859716796875], + [48.9103515625, 68.74306640625], + [48.4390625, 68.8048828125], + [48.319921875, 69.26923828125], + [48.8449218750001, 69.4947265625], + [49.2251953125001, 69.51123046875], + [50.265234375, 69.185595703125] + ] + ], + [ + [ + [161.46708984375, 68.9009765625], + [161.0828125, 69.4056640625], + [161.50517578125, 69.639453125], + [161.46708984375, 68.9009765625] + ] + ], + [ + [ + [169.20078125, 69.58046875], + [168.348046875, 69.6643554687501], + [167.86474609375, 69.90107421875], + [168.35791015625, 70.015673828125], + [169.3748046875, 69.8826171875], + [169.20078125, 69.58046875] + ] + ], + [ + [ + [60.4504882812501, 69.93486328125], + [60.440234375, 69.7259277343751], + [59.6370117187501, 69.721044921875], + [59.50263671875, 69.8662109375], + [58.952734375, 69.8927734375], + [58.5199218750001, 70.318310546875], + [59.048046875, 70.4604980468751], + [60.4504882812501, 69.93486328125] + ] + ], + [ + [ + [52.9033203125, 71.364990234375], + [53.192578125, 71.215283203125], + [53.0226562500001, 70.968701171875], + [52.2496093750001, 71.2849121093751], + [52.9033203125, 71.364990234375] + ] + ], + [ + [ + [178.8615234375, 70.826416015625], + [178.68388671875, 71.1056640625], + [180, 71.5377441406251], + [180, 70.993017578125], + [178.8615234375, 70.826416015625] + ] + ], + [ + [ + [137.95986328125, 71.507666015625], + [137.71181640625, 71.4232421875], + [137.0640625, 71.5298828125], + [137.816796875, 71.5878906250001], + [137.95986328125, 71.507666015625] + ] + ], + [ + [ + [-178.87646484375, 71.57705078125], + [-178.13388671875, 71.465478515625], + [-177.523583984375, 71.16689453125], + [-179.415673828125, 70.918994140625], + [-179.999951171875, 70.993017578125], + [-179.999951171875, 71.5377441406251], + [-178.87646484375, 71.57705078125] + ] + ], + [ + [ + [77.6325195312501, 72.291259765625], + [76.87109375, 72.317041015625], + [77.74853515625, 72.6312011718751], + [78.3651367187501, 72.482421875], + [77.6325195312501, 72.291259765625] + ] + ], + [ + [ + [79.50146484375, 72.721923828125], + [78.6332031250001, 72.850732421875], + [79.1642578125, 73.0943359375], + [79.50146484375, 72.721923828125] + ] + ], + [ + [ + [74.660546875, 72.8734375], + [74.1806640625, 72.975341796875], + [74.19853515625, 73.10908203125], + [74.9615234375, 73.0625], + [74.660546875, 72.8734375] + ] + ], + [ + [ + [120.261328125, 73.08984375], + [119.79208984375, 73.04541015625], + [119.6404296875, 73.1243164062501], + [120.261328125, 73.08984375] + ] + ], + [ + [ + [55.31982421875, 73.30830078125], + [56.4295898437501, 73.201171875], + [56.1216796875, 72.806591796875], + [55.4033203125, 72.549072265625], + [55.2978515625, 71.9353515625001], + [56.45439453125, 71.107373046875], + [57.6253906250001, 70.72880859375], + [57.1458984375001, 70.5891113281251], + [56.3857421875, 70.734130859375], + [56.49970703125, 70.56640625], + [55.6873046875001, 70.6921875], + [54.6011718750001, 70.680078125], + [53.3835937500001, 70.87353515625], + [53.6705078125, 71.0869140625], + [54.1556640625, 71.12548828125], + [53.4099609375, 71.34013671875], + [53.41162109375, 71.530126953125], + [51.9378906250001, 71.47470703125], + [51.511328125, 71.648095703125], + [51.58251953125, 72.07119140625], + [52.25205078125, 72.129736328125], + [52.6619140625, 72.336865234375], + [52.9166015625001, 72.668896484375], + [52.5792968750001, 72.791357421875], + [53.3698242187501, 72.9167480468751], + [53.2511718750001, 73.182958984375], + [54.80390625, 73.387646484375], + [55.31982421875, 73.30830078125] + ] + ], + [ + [ + [70.6739257812501, 73.0950195312501], + [70.04072265625, 73.0371582031251], + [69.9958984375, 73.359375], + [70.940234375, 73.514404296875], + [71.6261718750001, 73.173974609375], + [70.6739257812501, 73.0950195312501] + ] + ], + [ + [ + [142.18486328125, 73.8958984375001], + [143.34375, 73.56875], + [143.45146484375, 73.231298828125], + [141.5966796875, 73.3108398437501], + [140.66279296875, 73.452001953125], + [139.785546875, 73.355224609375], + [141.084765625, 73.865869140625], + [142.18486328125, 73.8958984375001] + ] + ], + [ + [ + [83.5490234375001, 74.07177734375], + [82.8177734375, 74.0916015625001], + [83.1498046875001, 74.151611328125], + [83.5490234375001, 74.07177734375] + ] + ], + [ + [ + [141.01025390625, 73.999462890625], + [140.40947265625, 73.9216796875001], + [140.1935546875, 74.23671875], + [141.03857421875, 74.242724609375], + [141.01025390625, 73.999462890625] + ] + ], + [ + [ + [113.38720703125, 74.400439453125], + [112.782421875, 74.095068359375], + [111.50341796875, 74.353076171875], + [111.87978515625, 74.363818359375], + [112.08447265625, 74.5489746093751], + [113.38720703125, 74.400439453125] + ] + ], + [ + [ + [86.653125, 74.981298828125], + [87.0521484375001, 74.982568359375], + [86.9271484375001, 74.83076171875], + [86.25859375, 74.893505859375], + [86.653125, 74.981298828125] + ] + ], + [ + [ + [82.17236328125, 75.419384765625], + [81.978515625, 75.247119140625], + [81.65478515625, 75.288916015625], + [81.712109375, 75.4514160156251], + [82.165625, 75.515625], + [82.17236328125, 75.419384765625] + ] + ], + [ + [ + [146.79521484375, 75.3707519531251], + [148.432421875, 75.413525390625], + [148.59013671875, 75.236376953125], + [150.82236328125, 75.15654296875], + [150.6462890625, 74.944580078125], + [149.596875, 74.7726074218751], + [148.296875, 74.800439453125], + [146.14853515625, 75.198291015625], + [146.5375, 75.5817871093751], + [146.79521484375, 75.3707519531251] + ] + ], + [ + [ + [135.9486328125, 75.4095703125001], + [135.451953125, 75.38955078125], + [135.6986328125, 75.845263671875], + [136.1689453125, 75.60556640625], + [135.9486328125, 75.4095703125001] + ] + ], + [ + [ + [140.04873046875, 75.828955078125], + [140.81591796875, 75.630712890625], + [141.48544921875, 76.137158203125], + [142.66953125, 75.863427734375], + [143.68583984375, 75.863671875], + [145.3599609375, 75.53046875], + [144.0197265625, 75.0446777343751], + [143.1703125, 75.11689453125], + [142.7294921875, 75.3376464843751], + [142.941796875, 75.71328125], + [142.30791015625, 75.6916992187501], + [142.198828125, 75.39267578125], + [143.1279296875, 74.9703125], + [142.47275390625, 74.82041015625], + [141.9873046875, 74.991259765625], + [140.26787109375, 74.846923828125], + [139.68125, 74.9640625], + [139.09912109375, 74.65654296875], + [138.09228515625, 74.7974609375], + [136.94765625, 75.325537109375], + [137.28974609375, 75.3486328125], + [137.26884765625, 75.7494140625], + [137.70654296875, 75.7595703125], + [137.560546875, 75.955224609375], + [138.2076171875, 76.11494140625], + [138.91953125, 76.196728515625], + [140.04873046875, 75.828955078125] + ] + ], + [ + [ + [96.5324218750001, 76.278125], + [96.3005859375, 76.121728515625], + [95.3111328125001, 76.21474609375], + [95.3798828125, 76.2890625], + [96.5324218750001, 76.278125] + ] + ], + [ + [ + [112.47802734375, 76.6208984375], + [112.531640625, 76.450048828125], + [111.9689453125, 76.626171875], + [112.47802734375, 76.6208984375] + ] + ], + [ + [ + [149.1501953125, 76.6599121093751], + [148.3986328125, 76.6482421875001], + [149.4064453125, 76.782080078125], + [149.1501953125, 76.6599121093751] + ] + ], + [ + [ + [67.7653320312501, 76.23759765625], + [61.35595703125, 75.31484375], + [60.27685546875, 75.007568359375], + [60.5013671875, 74.904638671875], + [59.6740234375, 74.61015625], + [59.2401367187501, 74.69296875], + [59.0404296875, 74.485546875], + [58.53466796875, 74.49892578125], + [58.6178710937501, 74.227392578125], + [57.7673828125, 74.013818359375], + [57.75595703125, 73.769189453125], + [57.3130859375, 73.838037109375], + [57.5425781250001, 73.658203125], + [56.9638671875, 73.366552734375], + [56.43037109375, 73.297216796875], + [55.0068359375, 73.4538574218751], + [54.2999023437501, 73.3509765625], + [53.7628906250001, 73.766162109375], + [54.6426757812501, 73.9595703125001], + [55.3409179687501, 74.41962890625], + [56.1371093750001, 74.49609375], + [55.5822265625001, 74.627685546875], + [56.4987304687501, 74.9570800781251], + [55.81005859375, 75.12490234375], + [56.035546875, 75.19423828125], + [56.5703125, 75.09775390625], + [56.8444335937501, 75.351416015625], + [57.6068359375, 75.341259765625], + [58.05830078125, 75.6630859375], + [58.88125, 75.8547851562501], + [60.279296875, 76.0962402343751], + [60.9421875, 76.0712890625], + [61.20166015625, 76.2820312500001], + [62.971484375, 76.236669921875], + [64.4634765625, 76.378173828125], + [67.65185546875, 77.011572265625], + [68.4857421875001, 76.93369140625], + [68.94169921875, 76.707666015625], + [67.7653320312501, 76.23759765625] + ] + ], + [ + [ + [96.28544921875, 77.0266601562501], + [95.2703125000001, 77.01884765625], + [96.5284179687501, 77.205517578125], + [96.28544921875, 77.0266601562501] + ] + ], + [ + [ + [89.5142578125001, 77.188818359375], + [89.1416992187501, 77.226806640625], + [89.6162109375, 77.31103515625], + [89.5142578125001, 77.188818359375] + ] + ], + [ + [ + [130.6873046875, 42.3025390625], + [130.526953125, 42.535400390625], + [130.4248046875, 42.72705078125], + [131.0685546875, 42.9022460937501], + [131.25732421875, 43.378076171875], + [131.2552734375, 44.07158203125], + [130.981640625, 44.8443359375], + [131.446875, 44.984033203125], + [131.85185546875, 45.32685546875], + [132.93603515625, 45.029931640625], + [133.1134765625, 45.130712890625], + [133.18603515625, 45.49482421875], + [133.43642578125, 45.6046875], + [133.861328125, 46.24775390625], + [134.16767578125, 47.302197265625], + [134.75234375, 47.7154296875], + [134.566015625, 48.022509765625], + [134.665234375, 48.25390625], + [134.293359375, 48.3734375], + [133.468359375, 48.09716796875], + [133.14404296875, 48.1056640625], + [132.7072265625, 47.9472656250001], + [132.47626953125, 47.714990234375], + [130.9619140625, 47.709326171875], + [130.7326171875, 48.01923828125], + [130.804296875, 48.34150390625], + [130.5521484375, 48.602490234375], + [130.553125, 48.861181640625], + [130.19599609375, 48.891650390625], + [129.49814453125, 49.388818359375], + [129.06513671875, 49.374658203125], + [128.70400390625, 49.600146484375], + [127.999609375, 49.5686035156251], + [127.55078125, 49.801806640625], + [127.590234375, 50.208984375], + [127.33720703125, 50.350146484375], + [127.30703125, 50.707958984375], + [126.9248046875, 51.100146484375], + [126.34169921875, 52.36201171875], + [125.6490234375, 53.04228515625], + [125.075, 53.203662109375], + [124.8123046875, 53.133837890625], + [123.6078125, 53.546533203125], + [120.98544921875, 53.2845703125], + [120.09453125, 52.78720703125], + [120.067578125, 52.63291015625], + [120.65615234375, 52.566650390625], + [120.7498046875, 52.096533203125], + [120.06689453125, 51.6006835937501], + [119.163671875, 50.406005859375], + [119.3462890625, 50.278955078125], + [119.25986328125, 50.06640625], + [118.4515625, 49.844482421875], + [117.8734375, 49.5134765625], + [116.68330078125, 49.823779296875], + [116.551171875, 49.9203125], + [116.351171875, 49.978076171875], + [116.216796875, 50.00927734375], + [116.1345703125, 50.010791015625], + [115.9259765625, 49.9521484375], + [115.79521484375, 49.905908203125], + [115.7177734375, 49.880615234375], + [115.58798828125, 49.88603515625], + [115.42919921875, 49.896484375], + [115.3650390625, 49.911767578125], + [115.27451171875, 49.948876953125], + [115.0033203125, 50.13857421875], + [114.7431640625, 50.23369140625], + [114.2970703125, 50.2744140625001], + [113.57421875, 50.00703125], + [113.4455078125, 49.9416015625], + [113.31904296875, 49.87431640625], + [113.16416015625, 49.79716796875], + [113.09208984375, 49.692529296875], + [113.05556640625, 49.616259765625], + [112.91484375, 49.56923828125], + [112.8064453125, 49.523583984375], + [112.69736328125, 49.507275390625], + [112.494921875, 49.53232421875], + [112.0796875, 49.42421875], + [111.429296875, 49.342626953125], + [111.33662109375, 49.355859375], + [111.20419921875, 49.304296875], + [110.8279296875, 49.1661621093751], + [110.709765625, 49.14296875], + [110.42783203125, 49.219970703125], + [110.32138671875, 49.215869140625], + [110.19990234375, 49.17041015625], + [109.5287109375, 49.269873046875], + [109.4537109375, 49.296337890625], + [109.23671875, 49.334912109375], + [108.613671875, 49.322802734375], + [108.5224609375, 49.34150390625], + [108.40693359375, 49.3963867187501], + [107.9654296875, 49.653515625], + [107.9166015625, 49.947802734375], + [107.63095703125, 49.98310546875], + [107.3470703125, 49.986669921875], + [107.23330078125, 49.989404296875], + [107.14306640625, 50.0330078125], + [107.040234375, 50.086474609375], + [106.94130859375, 50.1966796875], + [106.7111328125, 50.31259765625], + [106.5744140625, 50.32880859375], + [106.36845703125, 50.317578125], + [106.21787109375, 50.30458984375], + [105.38359375, 50.47373046875], + [104.0787109375, 50.154248046875], + [103.63291015625, 50.13857421875], + [103.4962890625, 50.1649414062501], + [103.42119140625, 50.187060546875], + [103.30439453125, 50.20029296875], + [102.28837890625, 50.585107421875], + [102.3166015625, 50.71845703125], + [102.2150390625, 50.8294433593751], + [102.19453125, 51.05068359375], + [102.151953125, 51.10751953125], + [102.1423828125, 51.216064453125], + [102.16005859375, 51.26083984375], + [102.1556640625, 51.31376953125], + [102.1115234375, 51.353466796875], + [101.97919921875, 51.3822265625], + [101.82119140625, 51.421044921875], + [101.5708984375, 51.4671875000001], + [101.38125, 51.45263671875], + [100.53623046875, 51.7134765625], + [100.4689453125, 51.72607421875], + [100.23037109375, 51.729833984375], + [100.0345703125, 51.737109375], + [99.9216796875, 51.755517578125], + [99.71923828125, 51.871630859375], + [98.8931640625001, 52.1172851562501], + [98.6405273437501, 51.8011718750001], + [98.103125, 51.483544921875], + [97.8252929687501, 50.98525390625], + [97.953125, 50.85517578125], + [98.02978515625, 50.64462890625], + [98.07890625, 50.60380859375], + [98.14501953125, 50.5685546875], + [98.2205078125001, 50.557177734375], + [98.2794921875001, 50.533251953125], + [98.25029296875, 50.30244140625], + [98.00390625, 50.0142578125], + [97.3597656250001, 49.741455078125], + [97.2085937500001, 49.7308105468751], + [96.9857421875001, 49.8828125], + [96.3150390625001, 49.901123046875], + [96.0655273437501, 49.99873046875], + [95.52265625, 49.91123046875], + [95.1114257812501, 49.93544921875], + [94.9302734375001, 50.04375], + [94.8112304687501, 50.0481933593751], + [94.71806640625, 50.04326171875], + [94.67548828125, 50.0280761718751], + [94.61474609375, 50.02373046875], + [94.5646484375, 50.087939453125], + [94.3546875, 50.221826171875], + [94.2510742187501, 50.556396484375], + [93.103125, 50.60390625], + [92.9413085937501, 50.77822265625], + [92.8564453125, 50.789111328125], + [92.779296875, 50.778662109375], + [92.738671875, 50.7109375], + [92.68134765625, 50.683203125], + [92.6266601562501, 50.68828125], + [92.57890625, 50.725439453125], + [92.4263671875001, 50.803076171875], + [92.35478515625, 50.86416015625], + [92.29580078125, 50.8498046875], + [92.1923828125, 50.7005859375], + [91.8042968750001, 50.693603515625], + [91.4464843750001, 50.52216796875], + [91.4150390625, 50.4680175781251], + [91.3408203125, 50.470068359375], + [91.3005859375, 50.46337890625], + [91.2337890625, 50.452392578125], + [91.0215820312501, 50.415478515625], + [90.8380859375, 50.32373046875], + [90.7607421875, 50.30595703125], + [90.71435546875, 50.259423828125], + [90.6550781250001, 50.22236328125], + [90.0537109375, 50.09375], + [89.64384765625, 49.90302734375], + [89.6541015625001, 49.71748046875], + [89.5791992187501, 49.69970703125], + [89.475, 49.6605468750001], + [89.3956054687501, 49.6115234375], + [89.2439453125001, 49.6270507812501], + [89.2029296875001, 49.595703125], + [89.17998046875, 49.5322265625], + [89.1094726562501, 49.5013671875], + [89.0083984375001, 49.472802734375], + [88.97060546875, 49.483740234375], + [88.9454101562501, 49.507666015625], + [88.9001953125, 49.539697265625], + [88.8638671875001, 49.52763671875], + [88.8316406250001, 49.4484375], + [88.633203125, 49.4861328125], + [88.192578125, 49.451708984375], + [88.135546875, 49.381494140625], + [88.11572265625, 49.256298828125], + [88.0285156250001, 49.219775390625], + [87.9880859375, 49.1869140625], + [87.9347656250001, 49.16455078125], + [87.8142578125, 49.1623046875], + [87.7625, 49.1658203125], + [87.5158203125001, 49.122412109375], + [87.41669921875, 49.076611328125], + [87.3228515625001, 49.085791015625], + [86.62646484375, 49.5626953125], + [86.67548828125, 49.777294921875], + [86.1808593750001, 49.49931640625], + [85.2326171875001, 49.6158203125], + [84.9894531250001, 50.06142578125], + [84.3232421875, 50.23916015625], + [83.9451171875001, 50.774658203125], + [83.3573242187501, 50.994580078125], + [82.7608398437501, 50.893359375], + [82.4939453125001, 50.727587890625], + [81.4659179687501, 50.73984375], + [81.3882812500001, 50.956494140625], + [81.0714843750001, 50.96875], + [81.12724609375, 51.191064453125], + [80.73525390625, 51.293408203125], + [80.448046875, 51.183349609375], + [80.4236328125, 50.9462890625], + [79.98623046875, 50.774560546875], + [77.8599609375001, 53.269189453125], + [76.4847656250001, 54.02255859375], + [76.4216796875001, 54.151513671875], + [76.6545898437501, 54.145263671875], + [76.8373046875, 54.4423828125], + [75.43720703125, 54.0896484375], + [75.22021484375, 53.8937988281251], + [74.4519531250001, 53.647265625], + [74.3515625, 53.487646484375], + [73.8589843750001, 53.6197265625], + [73.40693359375, 53.44755859375], + [73.3056640625, 53.7072265625], + [73.71240234375, 54.0423828125], + [73.2298828125001, 53.9578125], + [72.622265625, 54.134326171875], + [72.44677734375, 53.941845703125], + [72.18603515625, 54.325634765625], + [72.0044921875001, 54.2056640625], + [71.0931640625001, 54.21220703125], + [71.185546875, 54.59931640625], + [70.7380859375001, 55.30517578125], + [70.182421875, 55.162451171875], + [68.9772460937501, 55.389599609375], + [68.20625, 55.1609375], + [68.1558593750001, 54.9767089843751], + [65.476953125, 54.623291015625], + [65.08837890625, 54.340185546875], + [64.46123046875, 54.3841796875], + [61.9287109375, 53.946484375], + [61.2310546875, 54.019482421875], + [60.9794921875, 53.6217285156251], + [61.5349609375, 53.5232910156251], + [61.22890625, 53.4458984375], + [61.19921875, 53.287158203125], + [61.65986328125, 53.228466796875], + [62.08271484375, 53.005419921875], + [61.0474609375, 52.9724609375], + [60.7744140625, 52.67578125], + [60.9945312500001, 52.336865234375], + [60.0302734375, 51.9332519531251], + [60.46474609375, 51.651171875], + [61.5546875, 51.3246093750001], + [61.389453125, 50.86103515625], + [60.9422851562501, 50.6955078125], + [60.4248046875, 50.679150390625], + [60.05859375, 50.85029296875], + [59.81240234375, 50.58203125], + [59.523046875, 50.49287109375], + [59.4523437500001, 50.62041015625], + [58.8836914062501, 50.69443359375], + [58.3591796875001, 51.063818359375], + [57.8388671875, 51.091650390625], + [57.4421875, 50.8888671875], + [57.01171875, 51.065185546875], + [56.49140625, 51.01953125], + [55.68623046875, 50.582861328125], + [54.6416015625, 51.011572265625], + [54.5552734375, 50.535791015625], + [54.13974609375, 51.040771484375], + [53.3380859375, 51.482373046875], + [52.5711914062501, 51.481640625], + [52.219140625, 51.709375], + [51.3445312500001, 51.475341796875], + [51.1634765625001, 51.6474609375], + [50.7939453125, 51.72919921875], + [50.246875, 51.289501953125], + [49.498046875, 51.0835937500001], + [49.3234375, 50.851708984375], + [48.62509765625, 50.6126953125001], + [48.7589843750001, 49.9283203125001], + [48.3349609375, 49.858251953125], + [47.7057617187501, 50.377978515625], + [47.42919921875, 50.357958984375], + [46.88955078125, 49.69697265625], + [46.80205078125, 49.36708984375], + [47.03134765625, 49.15029296875], + [46.70263671875, 48.80556640625], + [46.6609375000001, 48.412255859375], + [47.0646484375, 48.232470703125], + [47.2923828125, 47.74091796875], + [47.48193359375, 47.80390625], + [48.1669921875, 47.7087890625], + [48.959375, 46.774609375], + [48.5583984375001, 46.75712890625], + [48.5412109375, 46.605615234375], + [49.2322265625001, 46.337158203125], + [48.68369140625, 46.086181640625], + [48.7295898437501, 45.896826171875], + [48.4870117187501, 45.93486328125], + [47.63330078125, 45.584033203125], + [47.46328125, 45.6796875], + [47.5294921875001, 45.530224609375], + [47.3512695312501, 45.217724609375], + [46.7072265625001, 44.5033203125], + [47.3070312500001, 44.103125], + [47.46279296875, 43.555029296875], + [47.646484375, 43.884619140625], + [47.4631835937501, 43.03505859375], + [48.5728515625, 41.844482421875], + [47.791015625, 41.199267578125], + [47.31767578125, 41.282421875], + [46.74931640625, 41.81259765625], + [46.4298828125, 41.890966796875], + [46.2126953125, 41.989892578125], + [45.6385742187501, 42.205078125], + [45.63427734375, 42.234716796875], + [45.7275390625, 42.475048828125], + [45.7052734375, 42.498095703125], + [45.562890625, 42.5357421875], + [45.34375, 42.52978515625], + [45.1602539062501, 42.675], + [45.07158203125, 42.694140625], + [44.943359375, 42.7302734375], + [44.87099609375, 42.756396484375], + [44.85048828125, 42.746826171875], + [44.7710937500001, 42.616796875], + [44.691796875, 42.709619140625], + [44.6443359375, 42.734716796875], + [44.505859375, 42.7486328125], + [44.3294921875, 42.703515625], + [44.102734375, 42.616357421875], + [44.0046875000001, 42.59560546875], + [43.9574218750001, 42.5665527343751], + [43.8259765625001, 42.571533203125], + [43.75986328125, 42.59384765625], + [43.73837890625, 42.6169921875], + [43.7499023437501, 42.65751953125], + [43.79541015625, 42.702978515625], + [43.7826171875001, 42.747021484375], + [43.623046875, 42.80771484375], + [43.5578125000001, 42.844482421875], + [43.0891601562501, 42.9890625], + [43.0001953125, 43.0496582031251], + [42.9916015625, 43.09150390625], + [42.7606445312501, 43.169580078125], + [41.58056640625, 43.21923828125], + [41.4607421875001, 43.276318359375], + [41.358203125, 43.3333984375001], + [41.0831054687501, 43.374462890625], + [40.9419921875001, 43.41806640625], + [40.80166015625, 43.479931640625], + [40.6480468750001, 43.53388671875], + [40.0845703125, 43.553125], + [40.02373046875, 43.48486328125], + [39.8736328125, 43.472802734375], + [38.71728515625, 44.2880859375], + [38.18125, 44.419677734375], + [37.85146484375, 44.698828125], + [37.4951171875, 44.695263671875], + [37.20478515625, 44.97197265625], + [36.62763671875, 45.151318359375], + [36.9412109375001, 45.289697265625], + [36.72041015625, 45.371875], + [36.8659179687501, 45.42705078125], + [37.21357421875, 45.272314453125], + [37.6471679687501, 45.3771972656251], + [37.6124023437501, 45.5646972656251], + [37.93310546875, 46.001708984375], + [38.0142578125, 46.04775390625], + [38.07958984375, 45.9348144531251], + [38.18359375, 46.0948242187501], + [38.4922851562501, 46.09052734375], + [37.9138671875001, 46.406494140625], + [37.76650390625, 46.6361328125], + [38.5009765625, 46.663671875], + [38.438671875, 46.8130859375], + [39.29345703125, 47.10576171875], + [39.195703125, 47.26884765625], + [39.0237304687501, 47.272216796875], + [38.9283203125, 47.17568359375], + [38.55244140625, 47.150341796875], + [38.7619140625001, 47.26162109375], + [38.21435546875, 47.091455078125], + [38.36884765625, 47.6099609375], + [38.9002929687501, 47.855126953125], + [39.7787109375001, 47.8875488281251], + [39.9579101562501, 48.268896484375], + [39.8356445312501, 48.5427734375], + [39.6447265625001, 48.5912109375], + [39.79287109375, 48.80771484375], + [40.00361328125, 48.8220703125], + [39.6865234375, 49.00791015625], + [40.1087890625001, 49.2515625], + [40.0806640625, 49.57685546875], + [39.7805664062501, 49.572021484375], + [39.1748046875, 49.85595703125], + [38.918359375, 49.82470703125], + [38.2585937500001, 50.05234375], + [38.046875, 49.9200195312501], + [37.4228515625, 50.411474609375], + [36.6194335937501, 50.209228515625], + [36.1164062500001, 50.408544921875], + [35.59111328125, 50.36875], + [35.3119140625001, 51.043896484375], + [35.0640625, 51.20341796875], + [34.2138671875, 51.2553710937501], + [34.12109375, 51.679150390625], + [34.3978515625, 51.780419921875], + [33.73525390625, 52.344775390625], + [32.43544921875, 52.3072265625], + [32.122265625, 52.0505859375], + [31.7633789062501, 52.10107421875], + [31.75859375, 52.125830078125], + [31.690625, 52.220654296875], + [31.64990234375, 52.26220703125], + [31.6015625, 52.284814453125], + [31.57734375, 52.3123046875], + [31.585546875, 52.532470703125], + [31.56484375, 52.759228515625], + [31.53515625, 52.7982421875], + [31.4427734375, 52.86181640625], + [31.35302734375, 52.933447265625], + [31.2951171875001, 52.989794921875], + [31.2587890625, 53.0166992187501], + [31.36455078125, 53.13896484375], + [31.3883789062501, 53.184814453125], + [31.4178710937501, 53.196044921875], + [31.84970703125, 53.106201171875], + [32.1419921875001, 53.091162109375], + [32.4693359375001, 53.2703125], + [32.57802734375, 53.31240234375], + [32.64443359375, 53.32890625], + [32.704296875, 53.336328125], + [32.4509765625, 53.6533203125], + [32.200390625, 53.78125], + [31.9921875, 53.796875], + [31.82080078125, 53.791943359375], + [31.75419921875, 53.81044921875], + [31.82529296875, 53.935009765625], + [31.83779296875, 54.00078125], + [31.8259765625001, 54.030712890625], + [31.7919921875, 54.055908203125], + [31.62841796875, 54.111181640625], + [31.40361328125, 54.195947265625], + [31.29912109375, 54.29169921875], + [31.1847656250001, 54.452978515625], + [31.0748046875001, 54.491796875], + [31.1548828125001, 54.6109375], + [31.1521484375, 54.625341796875], + [31.1212890625, 54.648486328125], + [30.9841796875001, 54.6958984375], + [30.798828125, 54.783251953125], + [30.791015625, 54.806005859375], + [30.8044921875001, 54.8609375], + [30.8298828125, 54.914990234375], + [30.9777343750001, 55.05048828125], + [30.9777343750001, 55.08779296875], + [30.95888671875, 55.1375976562501], + [30.87744140625, 55.2234375], + [30.814453125, 55.2787109375], + [30.810546875, 55.306982421875], + [30.82099609375, 55.3302734375], + [30.9005859375001, 55.397412109375], + [30.9068359375001, 55.57001953125], + [30.6255859375, 55.666259765625], + [30.23359375, 55.8452148437501], + [30.04267578125, 55.83642578125], + [29.93701171875, 55.845263671875], + [29.8816406250001, 55.83232421875], + [29.82392578125, 55.7951171875], + [29.744140625, 55.77041015625], + [29.6300781250001, 55.751171875], + [29.4822265625001, 55.6845703125], + [29.41298828125, 55.7248535156251], + [29.3534179687501, 55.784375], + [29.375, 55.938720703125], + [28.28427734375, 56.055908203125], + [28.14794921875, 56.142919921875], + [28.20205078125, 56.260400390625], + [28.19169921875, 56.3155761718751], + [28.16923828125, 56.386865234375], + [28.11083984375, 56.510693359375], + [28.103125, 56.545703125], + [27.89208984375, 56.741064453125], + [27.88154296875, 56.824169921875], + [27.8486328125001, 56.85341796875], + [27.8060546875, 56.8670898437501], + [27.6394531250001, 56.845654296875], + [27.8302734375, 57.1944824218751], + [27.8382812500001, 57.247705078125], + [27.82861328125, 57.293310546875], + [27.796875, 57.316943359375], + [27.5386718750001, 57.42978515625], + [27.5111328125001, 57.508154296875], + [27.4697265625001, 57.5240234375], + [27.3519531250001, 57.528125], + [27.4, 57.666796875], + [27.5420898437501, 57.7994140625], + [27.7785156250001, 57.8707031250001], + [27.5024414062501, 58.221337890625], + [27.4341796875, 58.787255859375], + [28.15107421875, 59.3744140625], + [28.0125, 59.48427734375], + [28.0580078125001, 59.78154296875], + [28.3345703125, 59.692529296875], + [28.5181640625, 59.849560546875], + [28.9472656250001, 59.828759765625], + [29.147265625, 59.999755859375], + [30.12255859375, 59.8735839843751], + [30.17265625, 59.95712890625], + [29.72119140625, 60.1953125], + [29.069140625, 60.191455078125], + [28.6431640625, 60.37529296875], + [28.51279296875, 60.677294921875], + [27.7976562500001, 60.5361328125], + [29.69013671875, 61.54609375], + [31.18671875, 62.481396484375], + [31.533984375, 62.885400390625], + [31.1808593750001, 63.2083007812501], + [29.9915039062501, 63.73515625], + [30.50390625, 64.02060546875], + [30.51376953125, 64.2], + [30.0418945312501, 64.443359375], + [30.0728515625001, 64.7650390625001], + [29.60419921875, 64.968408203125], + [29.826953125, 65.145068359375], + [29.6080078125, 65.248681640625], + [29.7159179687501, 65.624560546875], + [30.1027343750001, 65.72626953125], + [29.0662109375, 66.891748046875], + [29.9880859375, 67.66826171875], + [29.34384765625, 68.0618652343751], + [28.68515625, 68.189794921875], + [28.4707031250001, 68.48837890625], + [28.7728515625001, 68.8400390625], + [28.4140625000001, 68.9041503906251], + [28.9658203125, 69.02197265625], + [29.38828125, 69.2981445312501], + [30.0873046875001, 69.432861328125], + [30.18017578125, 69.63583984375], + [30.8607421875, 69.538427734375], + [30.8697265625, 69.7834472656251], + [31.5469726562501, 69.696923828125], + [31.99794921875, 69.809912109375], + [31.9845703125, 69.953662109375], + [33.0078125, 69.722119140625], + [32.9150390625, 69.601708984375], + [32.1767578125, 69.6740234375], + [32.377734375, 69.4791015625], + [32.9998046875, 69.4701171875], + [32.9789062500001, 69.367333984375], + [33.454296875, 69.428173828125], + [33.1412109375001, 69.068701171875], + [33.684375, 69.31025390625], + [35.85791015625, 69.191748046875], + [37.7305664062501, 68.692138671875], + [38.43017578125, 68.3556152343751], + [39.5689453125, 68.071728515625], + [39.8233398437501, 68.05859375], + [39.80927734375, 68.150830078125], + [40.3806640625, 67.831884765625], + [40.9664062500001, 67.7134765625], + [41.3587890625, 67.20966796875], + [41.18896484375, 66.826171875], + [40.1033203125, 66.299951171875], + [38.6539062500001, 66.06904296875], + [35.5134765625, 66.39580078125], + [34.824609375, 66.6111328125], + [34.4826171875, 66.5503417968751], + [34.4515625, 66.651220703125], + [33.1501953125, 66.8439453125], + [32.93046875, 67.08681640625], + [31.8953125000001, 67.16142578125], + [33.65595703125, 66.4426269531251], + [33.360546875, 66.329541015625], + [34.1126953125, 66.225244140625], + [34.6917968750001, 65.95185546875], + [34.7769531250001, 65.76826171875], + [34.4064453125, 65.395751953125], + [35.0353515625, 64.4402343750001], + [35.8020507812501, 64.3353515625], + [36.3649414062501, 64.00283203125], + [37.4421875, 63.81337890625], + [37.9679687500001, 63.94912109375], + [38.0622070312501, 64.091015625], + [37.9537109375, 64.3201171875], + [37.18369140625, 64.4084960937501], + [36.6242187500001, 64.750537109375], + [36.5345703125, 64.938623046875], + [36.8828125, 65.17236328125], + [39.7580078125001, 64.57705078125], + [40.0578125, 64.770751953125], + [40.4449218750001, 64.7787109375], + [39.7980468750001, 65.349853515625], + [39.81650390625, 65.59794921875], + [41.4757812500001, 66.1234375], + [42.2105468750001, 66.519677734375], + [43.233203125, 66.41552734375], + [43.653125, 66.2509765625], + [43.5418945312501, 66.123388671875], + [43.84375, 66.1423828125], + [44.1043945312501, 66.00859375], + [44.4292968750001, 66.937744140625], + [43.7824218750001, 67.2544921875], + [44.2046875000001, 68.253759765625], + [43.333203125, 68.673388671875], + [44.048046875, 68.548828125], + [45.8919921875, 68.4796875], + [46.6904296875, 67.848828125], + [45.5287109375001, 67.757568359375], + [44.9021484375, 67.4131347656251], + [45.56220703125, 67.1855957031251], + [45.8853515625001, 66.891064453125], + [46.4923828125001, 66.8001953125], + [47.6558593750001, 66.975927734375], + [47.87470703125, 67.5841796875], + [48.833203125, 67.681494140625], + [48.7542968750001, 67.895947265625], + [49.1552734375, 67.8704101562501], + [51.9947265625, 68.53876953125], + [52.3966796875001, 68.3517089843751], + [52.72265625, 68.484033203125], + [52.34404296875, 68.608154296875], + [53.801953125, 68.9958984375], + [54.4912109375, 68.992333984375], + [53.7976562500001, 68.907470703125], + [53.9308593750001, 68.435546875], + [53.2605468750001, 68.26748046875], + [54.476171875, 68.294140625], + [54.861328125, 68.20185546875], + [55.41806640625, 68.567822265625], + [56.04365234375, 68.648876953125], + [57.12685546875, 68.5540039062501], + [58.173046875, 68.8897460937501], + [59.0573242187501, 69.0060546875], + [59.3705078125001, 68.73837890625], + [59.0990234375001, 68.4443359375], + [59.72568359375, 68.351611328125], + [59.89599609375, 68.70634765625], + [60.48916015625, 68.728955078125], + [60.93359375, 68.986767578125], + [60.17060546875, 69.59091796875], + [60.9090820312501, 69.847119140625], + [64.1904296875, 69.53466796875], + [64.8962890625, 69.247802734375], + [67.00244140625, 68.8735839843751], + [68.3711914062501, 68.3142578125001], + [69.1405273437501, 68.950634765625], + [68.5427734375, 68.96708984375], + [68.005859375, 69.4800292968751], + [67.62412109375, 69.584423828125], + [67.064453125, 69.693701171875], + [66.8966796875, 69.55380859375], + [67.2847656250001, 70.738720703125], + [67.143359375, 70.837548828125], + [66.7022460937501, 70.818505859375], + [66.6396484375, 71.081396484375], + [68.2692382812501, 71.6828125], + [69.61181640625, 72.98193359375], + [69.73828125, 72.8849609375], + [71.5001953125001, 72.913671875], + [72.812109375, 72.69140625], + [72.57412109375, 72.0125488281251], + [71.86728515625, 71.457373046875], + [72.7044921875001, 70.963232421875], + [72.5767578125, 68.968701171875], + [73.5916992187501, 68.481884765625], + [73.139453125, 68.18134765625], + [73.0667968750001, 67.766943359375], + [71.8474609375, 67.0076171875001], + [71.365234375, 66.9615234375], + [71.53955078125, 66.68310546875], + [70.7249023437501, 66.51943359375], + [70.3828125, 66.602490234375], + [70.69072265625, 66.7453125], + [70.2833984375001, 66.685791015625], + [69.8771484375001, 66.8454589843751], + [69.2177734375, 66.82861328125], + [69.0134765625, 66.788330078125], + [69.1943359375, 66.5786621093751], + [70.3394531250001, 66.3423828125001], + [71.3580078125001, 66.3594238281251], + [71.9169921875, 66.246728515625], + [72.32158203125, 66.33212890625], + [72.4173828125, 66.5607910156251], + [73.79208984375, 66.9953125], + [74.0745117187501, 67.414111328125], + [74.76953125, 67.766357421875], + [74.3914062500001, 68.42060546875], + [74.57958984375, 68.751220703125], + [76.1075195312501, 68.975732421875], + [76.4591796875, 68.978271484375], + [77.2384765625001, 68.469580078125], + [77.1744140625001, 67.778515625], + [77.7715820312501, 67.570263671875], + [78.9224609375001, 67.589111328125], + [77.5882812500001, 67.751904296875], + [77.66484375, 68.190380859375], + [77.9951171875, 68.25947265625], + [77.6506835937501, 68.90302734375], + [76.0009765625, 69.23505859375], + [75.42001953125, 69.238623046875], + [74.81484375, 69.090576171875], + [73.8360351562501, 69.143212890625], + [73.578125, 69.802978515625], + [74.3433593750001, 70.5787109375], + [73.0862304687501, 71.4449218750001], + [73.67177734375, 71.845068359375], + [74.9921875, 72.14482421875], + [74.78681640625, 72.811865234375], + [75.15244140625, 72.852734375], + [75.74140625, 72.296240234375], + [75.273828125, 71.958935546875], + [75.33203125, 71.341748046875], + [76.92900390625, 71.127880859375], + [77.5896484375001, 71.167919921875], + [78.32060546875, 70.930419921875], + [78.9421875, 70.9337890625], + [79.08388671875, 71.0020019531251], + [78.5876953125001, 70.993896484375], + [78.21259765625, 71.26630859375], + [76.4333984375, 71.552490234375], + [76.032421875, 71.910400390625], + [76.87138671875, 72.0330078125001], + [77.7775390625, 71.8364257812501], + [78.232421875, 71.952294921875], + [78.0164062500001, 72.092041015625], + [77.49287109375, 72.071728515625], + [77.47158203125, 72.1921386718751], + [78.2253906250001, 72.3774414062501], + [79.4220703125001, 72.38076171875], + [80.7625, 72.08916015625], + [81.66162109375, 71.715966796875], + [82.7578125, 71.764111328125], + [83.23359375, 71.6681640625], + [82.3228515625001, 71.260009765625], + [82.1631835937501, 70.59814453125], + [82.22119140625, 70.395703125], + [82.869140625, 70.954833984375], + [83.03017578125, 70.580517578125], + [82.6823242187501, 70.217724609375], + [83.0807617187501, 70.093017578125], + [83.0738281250001, 70.276708984375], + [83.7359375000001, 70.546484375], + [83.1512695312501, 71.10361328125], + [83.534375, 71.683935546875], + [83.2002929687501, 71.87470703125], + [82.6454101562501, 71.925244140625], + [82.09365234375, 72.2654296875001], + [80.8270507812501, 72.48828125], + [80.8416015625001, 72.949169921875], + [80.4245117187501, 73.23115234375], + [80.5832031250001, 73.56845703125], + [85.2005859375001, 73.7215332031251], + [86.89296875, 73.887109375], + [85.7925781250001, 73.438330078125], + [86.67705078125, 73.106787109375], + [85.93896484375, 73.456494140625], + [87.1201171875, 73.6150390625], + [87.57119140625, 73.8107421875], + [86.5710937500001, 74.24375], + [86.0013671875, 74.316015625], + [86.3958007812501, 74.45009765625], + [86.89794921875, 74.325341796875], + [87.2296875, 74.3638671875], + [85.791015625, 74.6451171875], + [86.2012695312501, 74.8162109375001], + [86.6514648437501, 74.6824218750001], + [87.0417968750001, 74.778857421875], + [87.467578125, 75.0132324218751], + [86.9390625000001, 75.068115234375], + [87.0059570312501, 75.16982421875], + [87.67138671875, 75.12958984375], + [90.1849609375001, 75.591064453125], + [94.0751953125, 75.912890625], + [92.8904296875, 75.9099609375], + [93.25927734375, 76.098779296875], + [95.5787109375001, 76.1373046875], + [96.0754882812501, 76.081982421875], + [95.6533203125, 75.8921875], + [96.50859375, 76.00556640625], + [96.4970703125, 75.8912109375], + [98.6620117187501, 76.24267578125], + [99.77041015625, 76.028759765625], + [99.5407226562501, 75.798583984375], + [99.8513671875001, 75.9302734375], + [99.8253906250001, 76.1359375], + [98.8056640625, 76.4806640625], + [100.84375, 76.5251953125001], + [101.59775390625, 76.439208984375], + [100.92802734375, 76.55673828125], + [100.98994140625, 76.990478515625], + [102.61015625, 77.508544921875], + [104.01455078125, 77.730419921875], + [106.0595703125, 77.39052734375], + [104.20244140625, 77.101806640625], + [106.9416015625, 77.034375], + [107.42978515625, 76.9265625], + [106.41357421875, 76.512255859375], + [107.72216796875, 76.522314453125], + [108.181640625, 76.737841796875], + [111.39248046875, 76.686669921875], + [112.0939453125, 76.4803222656251], + [111.94267578125, 76.38046875], + [112.61953125, 76.3835449218751], + [112.65625, 76.053564453125], + [113.27265625, 76.25166015625], + [113.5638671875, 75.891650390625], + [113.8572265625, 75.9212890625], + [113.567578125, 75.568408203125], + [112.45302734375, 75.83017578125], + [112.9556640625, 75.571923828125], + [113.24296875, 75.61142578125], + [113.726171875, 75.450634765625], + [112.92490234375, 75.0150390625], + [109.84033203125, 74.32197265625], + [109.81025390625, 74.169189453125], + [108.19951171875, 73.694091796875], + [107.27109375, 73.621044921875], + [106.67939453125, 73.3306640625], + [106.188671875, 73.3080078125], + [105.1439453125, 72.77705078125], + [105.708203125, 72.836669921875], + [106.4779296875, 73.139404296875], + [107.750390625, 73.1731445312501], + [109.3310546875, 73.487451171875], + [109.8552734375, 73.4724609375], + [110.8681640625, 73.730712890625], + [109.70673828125, 73.74375], + [110.26142578125, 74.017431640625], + [111.05625, 73.93935546875], + [111.130859375, 74.05283203125], + [111.5505859375, 74.028515625], + [111.228125, 73.9685546875], + [111.400390625, 73.827734375], + [112.147265625, 73.708935546875], + [112.79541015625, 73.74609375], + [112.8359375, 73.962060546875], + [113.0328125, 73.9138671875001], + [113.4162109375, 73.647607421875], + [113.15693359375, 73.4595703125], + [113.49091796875, 73.34609375], + [113.12783203125, 72.8306640625], + [113.66455078125, 72.634521484375], + [113.21552734375, 72.805859375], + [113.88623046875, 73.34580078125], + [113.5103515625, 73.50498046875], + [115.3376953125, 73.702587890625], + [118.8708984375, 73.537890625], + [118.45703125, 73.4644042968751], + [118.4302734375, 73.246533203125], + [119.750390625, 72.9791015625001], + [122.26015625, 72.88056640625], + [122.751953125, 72.906494140625], + [122.615234375, 73.0279296875001], + [123.1603515625, 72.9548828125], + [123.622265625, 73.19326171875], + [123.49111328125, 73.666357421875], + [124.5412109375, 73.7512695312501], + [125.59853515625, 73.447412109375], + [126.2544921875, 73.548193359375], + [126.5525390625, 73.334912109375], + [127.03134765625, 73.5474609375], + [127.74033203125, 73.48154296875], + [129.1005859375, 73.112353515625], + [128.5990234375, 72.895166015625], + [129.01728515625, 72.8724609375], + [129.250390625, 72.70517578125], + [128.41826171875, 72.53515625], + [129.28134765625, 72.4376953125], + [129.41064453125, 72.16630859375], + [128.9349609375, 72.0794921875], + [127.80341796875, 72.434033203125], + [127.84140625, 72.308251953125], + [128.91142578125, 71.755322265625], + [129.21025390625, 71.916943359375], + [129.46083984375, 71.739306640625], + [128.84326171875, 71.6634765625], + [129.7619140625, 71.11953125], + [130.537109375, 70.892529296875], + [130.75712890625, 70.962353515625], + [131.02158203125, 70.74609375], + [132.0353515625, 71.24404296875], + [132.65390625, 71.9259765625], + [133.6888671875, 71.434228515625], + [134.702734375, 71.38681640625], + [135.5591796875, 71.6103515625], + [136.09033203125, 71.619580078125], + [137.9396484375, 71.1333984375], + [137.84404296875, 71.226806640625], + [138.3140625, 71.325537109375], + [137.918359375, 71.38408203125], + [138.2341796875, 71.596337890625], + [138.78017578125, 71.62900390625], + [139.209375, 71.444775390625], + [139.9841796875, 71.4915039062501], + [139.72294921875, 71.8849609375], + [139.35927734375, 71.9513671875], + [140.1876953125, 72.19130859375], + [139.1763671875, 72.1634765625], + [139.1408203125, 72.329736328125], + [139.601171875, 72.49609375], + [141.079296875, 72.5869140625], + [140.808203125, 72.890966796875], + [142.06142578125, 72.72080078125], + [146.2529296875, 72.442236328125], + [146.234765625, 72.34970703125], + [144.7763671875, 72.382275390625], + [144.16923828125, 72.2587890625], + [144.294921875, 72.192626953125], + [146.8318359375, 72.29541015625], + [146.11328125, 71.944970703125], + [146.2302734375, 72.1375], + [145.75859375, 72.22587890625], + [145.75673828125, 71.94130859375], + [145.06396484375, 71.92607421875], + [145.18857421875, 71.69580078125], + [146.0732421875, 71.808349609375], + [147.26181640625, 72.327880859375], + [149.5015625, 72.164306640625], + [150.01689453125, 71.8956542968751], + [149.04873046875, 71.795751953125], + [148.9681640625, 71.690478515625], + [150.5998046875, 71.5201171875], + [150.09765625, 71.2265625], + [150.9677734375, 71.38046875], + [151.582421875, 71.286962890625], + [152.0927734375, 71.023291015625], + [151.76201171875, 70.982470703125], + [152.5087890625, 70.83447265625], + [156.6845703125, 71.09375], + [158.03701171875, 71.0392578125], + [159.35068359375, 70.79072265625], + [160.0064453125, 70.3096679687501], + [159.72939453125, 69.8702148437501], + [160.9107421875, 69.60634765625], + [161.035546875, 69.0981933593751], + [161.30986328125, 68.982275390625], + [160.8560546875, 68.5383300781251], + [161.565625, 68.90517578125], + [161.5369140625, 69.379541015625], + [162.166015625, 69.611572265625], + [163.2013671875, 69.71474609375], + [166.8203125, 69.4995605468751], + [167.8568359375, 69.72822265625], + [168.30302734375, 69.271484375], + [169.31064453125, 69.079541015625], + [169.60986328125, 68.78603515625], + [170.53759765625, 68.825390625], + [170.99541015625, 69.0453125000001], + [170.5822265625, 69.5833496093751], + [170.1609375, 69.6265625], + [170.48681640625, 70.107568359375], + [173.27744140625, 69.823828125], + [173.438671875, 69.946826171875], + [175.921484375, 69.8953125], + [179.27265625, 69.25966796875], + [180, 68.9834472656251], + [180, 65.067236328125], + [178.51953125, 64.602978515625], + [177.7486328125, 64.717041015625], + [176.880859375, 65.08193359375], + [176.341015625, 65.047314453125], + [177.0373046875, 64.999658203125], + [177.2228515625, 64.861669921875], + [177.06875, 64.786669921875], + [176.0611328125, 64.960888671875], + [174.548828125, 64.6838867187501], + [176.05654296875, 64.904736328125], + [176.3509765625, 64.705126953125], + [176.14091796875, 64.5858398437501], + [177.42744140625, 64.76337890625], + [177.43291015625, 64.444482421875], + [177.6875, 64.3047363281251], + [178.0447265625, 64.219580078125], + [178.2294921875, 64.364404296875], + [178.3814453125, 64.260888671875], + [178.7314453125, 63.66708984375], + [178.4404296875, 63.60556640625], + [178.74404296875, 63.394775390625], + [178.79296875, 63.54033203125], + [179.38857421875, 63.147216796875], + [179.2595703125, 63.00830078125], + [179.5705078125, 62.6875], + [179.120703125, 62.320361328125], + [177.292578125, 62.5990234375], + [177.33896484375, 62.78134765625], + [177.02353515625, 62.77724609375], + [177.15947265625, 62.560986328125], + [174.51435546875, 61.8236328125], + [173.6234375, 61.716064453125], + [173.1318359375, 61.406640625], + [172.85654296875, 61.469189453125], + [172.9080078125, 61.31162109375], + [172.39609375, 61.1673828125], + [172.3927734375, 61.061767578125], + [170.608203125, 60.434912109375], + [170.3509765625, 59.96552734375], + [169.9826171875, 60.06708984375], + [169.2267578125, 60.595947265625], + [168.1375, 60.57392578125], + [167.2267578125, 60.406298828125], + [166.273046875, 59.85625], + [166.13603515625, 59.979345703125], + [166.3521484375, 60.484814453125], + [165.0845703125, 60.098583984375], + [164.9537109375, 59.843603515625], + [164.52529296875, 60.061279296875], + [164.11328125, 59.89755859375], + [164.13505859375, 59.984375], + [163.74384765625, 60.02802734375], + [163.36484375, 59.7814453125], + [163.2728515625, 59.302587890625], + [162.1416015625, 58.447412109375], + [161.96005859375, 58.0769042968751], + [162.39140625, 57.717236328125], + [162.654296875, 57.9482421875], + [163.22578125, 57.790380859375], + [162.779296875, 57.3576171875], + [162.79111328125, 56.875390625], + [162.9220703125, 56.72265625], + [163.25654296875, 56.688037109375], + [163.335546875, 56.23251953125], + [163.04736328125, 56.044677734375], + [162.84033203125, 56.065625], + [162.628125, 56.232275390625], + [163.03837890625, 56.521875], + [162.671484375, 56.490087890625], + [162.52822265625, 56.260693359375], + [162.0849609375, 56.0896484375], + [161.72392578125, 55.496142578125], + [162.10556640625, 54.7521484375], + [161.6248046875, 54.516259765625], + [160.77265625, 54.541357421875], + [160.0744140625, 54.18916015625], + [159.84375, 53.783642578125], + [160.02509765625, 53.12958984375], + [159.5859375, 53.2376953125], + [158.74541015625, 52.9089355468751], + [158.4720703125, 53.032373046875], + [158.6087890625, 52.8736328125], + [158.4931640625, 52.383154296875], + [158.103515625, 51.809619140625], + [156.8474609375, 51.006591796875], + [156.74775390625, 50.969287109375], + [156.52119140625, 51.3802734375], + [156.36474609375, 52.509375], + [156.1103515625, 52.866162109375], + [155.6203125, 54.86455078125], + [155.5548828125, 55.348486328125], + [155.98251953125, 56.69521484375], + [156.848828125, 57.290185546875], + [156.9767578125, 57.46630859375], + [156.8298828125, 57.779638671875], + [157.450390625, 57.799267578125], + [157.66640625, 58.0197753906251], + [158.2751953125, 58.008984375], + [159.21064453125, 58.51943359375], + [159.84736328125, 59.1271484375], + [161.753515625, 60.152294921875], + [162.0681640625, 60.46640625], + [163.7099609375, 60.916796875], + [163.553515625, 61.025634765625], + [164.00546875, 61.343798828125], + [163.80439453125, 61.461376953125], + [164.2072265625, 62.2922363281251], + [164.59833984375, 62.470556640625], + [165.20810546875, 62.373974609375], + [165.4173828125, 62.4470703125], + [164.418359375, 62.704638671875], + [163.33173828125, 62.550927734375], + [163.01767578125, 61.891064453125], + [163.2578125, 61.699462890625], + [163.08525390625, 61.570556640625], + [162.85595703125, 61.705029296875], + [162.392578125, 61.662109375], + [160.7666015625, 60.7533203125], + [160.1736328125, 60.638427734375], + [160.37890625, 61.02548828125], + [159.7904296875, 60.956640625], + [160.309375, 61.894384765625], + [159.55234375, 61.719482421875], + [159.1892578125, 61.92939453125], + [158.0701171875, 61.75361328125], + [157.4693359375, 61.79892578125], + [157.0841796875, 61.67568359375], + [155.71611328125, 60.682373046875], + [154.97080078125, 60.37666015625], + [154.29306640625, 59.833349609375], + [154.1498046875, 59.528515625], + [154.9712890625, 59.449609375], + [155.16044921875, 59.19013671875], + [154.4580078125, 59.216552734375], + [154.0109375, 59.075537109375], + [153.69521484375, 59.2247558593751], + [153.3611328125, 59.214794921875], + [152.81787109375, 58.92626953125], + [152.31962890625, 59.03076171875], + [152.087890625, 58.91044921875], + [151.3267578125, 58.87509765625], + [151.12109375, 59.08251953125], + [152.26064453125, 59.223583984375], + [151.3482421875, 59.5611328125], + [150.48359375, 59.494384765625], + [150.66728515625, 59.55634765625], + [149.642578125, 59.77041015625], + [149.065234375, 59.630517578125], + [149.20498046875, 59.48818359375], + [148.7970703125, 59.53232421875], + [148.744140625, 59.37353515625], + [148.9646484375, 59.369140625], + [148.72666015625, 59.25791015625], + [148.257421875, 59.414208984375], + [147.514453125, 59.2685546875], + [146.53720703125, 59.456982421875], + [146.04951171875, 59.170556640625], + [145.55458984375, 59.413525390625], + [143.1921875, 59.3701171875], + [142.5802734375, 59.24013671875], + [140.790234375, 58.303466796875], + [140.446875, 57.813671875], + [138.662109375, 56.96552734375], + [137.69150390625, 56.13935546875], + [135.2625, 54.943310546875], + [135.25771484375, 54.731494140625], + [135.8515625, 54.583935546875], + [136.797265625, 54.6209960937501], + [136.71884765625, 53.8041015625], + [137.15537109375, 53.8216796875], + [137.1416015625, 54.1822265625], + [137.666015625, 54.28330078125], + [137.3392578125, 54.100537109375], + [137.834765625, 53.946728515625], + [137.2537109375, 53.546142578125], + [137.95048828125, 53.603564453125], + [138.5279296875, 53.95986328125], + [138.569140625, 53.818798828125], + [138.24970703125, 53.5240234375], + [138.45068359375, 53.53701171875], + [138.6994140625, 53.8697265625], + [138.6572265625, 54.29833984375], + [139.3197265625, 54.19296875], + [139.707421875, 54.2771484375], + [140.68759765625, 53.596435546875], + [141.37373046875, 53.2927734375], + [141.18125, 53.0152832031251], + [140.8396484375, 53.087890625], + [141.255859375, 52.84013671875], + [141.132421875, 52.435693359375], + [141.48525390625, 52.178515625], + [141.36689453125, 51.9206542968751], + [140.9326171875, 51.619921875], + [140.5208984375, 50.8001953125001], + [140.62451171875, 50.082421875], + [140.4626953125, 49.911474609375], + [140.5171875, 49.596142578125], + [140.17060546875, 48.523681640625], + [138.58681640625, 47.0572265625], + [138.3369140625, 46.543408203125], + [137.68544921875, 45.818359375], + [136.14228515625, 44.489111328125], + [135.874609375, 44.37353515625], + [135.1310546875, 43.5257324218751], + [134.01044921875, 42.9474609375], + [133.1599609375, 42.69697265625], + [132.708984375, 42.875830078125], + [132.30380859375, 42.88330078125], + [132.3095703125, 43.313525390625], + [131.8666015625, 43.095166015625], + [131.93896484375, 43.301953125], + [131.15830078125, 42.626025390625], + [130.709375, 42.656396484375], + [130.8341796875, 42.5229492187501], + [130.6873046875, 42.3025390625] + ] + ], + [ + [ + [107.6955078125, 78.1309082031251], + [107.481640625, 78.057763671875], + [106.41552734375, 78.13984375], + [107.6955078125, 78.1309082031251] + ] + ], + [ + [ + [102.884765625, 79.2539550781251], + [102.4123046875, 78.83544921875], + [103.80078125, 79.149267578125], + [104.45205078125, 78.880029296875], + [105.14599609375, 78.8188476562501], + [105.31259765625, 78.49990234375], + [104.741796875, 78.33974609375], + [102.7966796875, 78.187890625], + [101.2041015625, 78.1919433593751], + [99.50029296875, 77.97607421875], + [101.590625, 79.350439453125], + [102.25126953125, 79.2560546875], + [102.4048828125, 79.433203125], + [102.884765625, 79.2539550781251] + ] + ], + [ + [ + [76.2489257812501, 79.65107421875], + [77.5889648437501, 79.501904296875], + [76.6495117187501, 79.493408203125], + [76.2489257812501, 79.65107421875] + ] + ], + [ + [ + [92.6834960937501, 79.685205078125], + [91.3762695312501, 79.8354980468751], + [91.2292968750001, 80.030712890625], + [93.803125, 79.904541015625], + [92.6834960937501, 79.685205078125] + ] + ], + [ + [ + [51.40927734375, 79.94423828125], + [50.09140625, 79.98056640625], + [50.936328125, 80.09423828125], + [51.40927734375, 79.94423828125] + ] + ], + [ + [ + [59.6888671875001, 79.9558105468751], + [58.91923828125, 79.9846191406251], + [59.5445312500001, 80.11884765625], + [59.6888671875001, 79.9558105468751] + ] + ], + [ + [ + [97.67451171875, 80.158251953125], + [97.65166015625, 79.76064453125], + [98.596484375, 80.052197265625], + [100.06123046875, 79.7770996093751], + [99.6806640625, 79.32333984375], + [99.0417968750001, 79.293017578125], + [99.9292968750001, 78.96142578125], + [98.4111328125, 78.78779296875], + [95.5310546875001, 79.098095703125], + [95.0204101562501, 79.052685546875], + [94.21875, 79.40234375], + [93.07080078125, 79.4953125], + [94.9873046875, 80.096826171875], + [95.2813476562501, 80.030517578125], + [97.67451171875, 80.158251953125] + ] + ], + [ + [ + [50.0517578125, 80.07431640625], + [49.5560546875001, 80.158935546875], + [49.88369140625, 80.230224609375], + [50.0517578125, 80.07431640625] + ] + ], + [ + [ + [57.0787109375001, 80.350927734375], + [56.9869140625, 80.071484375], + [55.81162109375, 80.087158203125], + [56.0244140625, 80.34130859375], + [57.0787109375001, 80.350927734375] + ] + ], + [ + [ + [53.52138671875, 80.185205078125], + [52.3435546875, 80.213232421875], + [52.85390625, 80.402392578125], + [53.8516601562501, 80.2683593750001], + [53.52138671875, 80.185205078125] + ] + ], + [ + [ + [57.95625, 80.1232421875], + [57.33232421875, 80.1581054687501], + [57.075, 80.4939453125], + [59.2554687500001, 80.343212890625], + [58.39794921875, 80.31875], + [57.95625, 80.1232421875] + ] + ], + [ + [ + [54.41533203125, 80.472802734375], + [53.8119140625, 80.476220703125], + [53.87724609375, 80.6052734375], + [54.41533203125, 80.472802734375] + ] + ], + [ + [ + [47.4419921875, 80.853662109375], + [48.4457031250001, 80.8060058593751], + [48.68359375, 80.633251953125], + [47.7052734375001, 80.765185546875], + [46.1414062500001, 80.446728515625], + [45.9690429687501, 80.569482421875], + [44.9049804687501, 80.611279296875], + [47.4419921875, 80.853662109375] + ] + ], + [ + [ + [62.1677734375001, 80.8347656250001], + [62.0757812500001, 80.616943359375], + [61.05126953125, 80.418603515625], + [60.2783203125, 80.49443359375], + [59.6498046875, 80.43125], + [59.59228515625, 80.81650390625], + [62.1677734375001, 80.8347656250001] + ] + ], + [ + [ + [50.278125, 80.92724609375], + [51.70361328125, 80.687646484375], + [48.81103515625, 80.3537109375], + [48.9775390625, 80.16259765625], + [47.7373046875, 80.081689453125], + [47.8929687500001, 80.2392578125], + [46.9910156250001, 80.182763671875], + [46.64443359375, 80.3003417968751], + [47.89580078125, 80.529052734375], + [49.08779296875, 80.515771484375], + [49.2443359375, 80.82138671875], + [50.278125, 80.92724609375] + ] + ], + [ + [ + [80.0266601562501, 80.84814453125], + [79.0985351562501, 80.8120605468751], + [79.2173828125001, 80.9603515625], + [80.2795898437501, 80.9498046875], + [80.0266601562501, 80.84814453125] + ] + ], + [ + [ + [61.1408203125001, 80.950341796875], + [60.0783203125001, 80.999169921875], + [61.457421875, 81.103955078125], + [61.1408203125001, 80.950341796875] + ] + ], + [ + [ + [54.7189453125, 81.115966796875], + [56.4722656250001, 80.9982421875], + [57.58037109375, 80.75546875], + [55.8833984375001, 80.62841796875], + [54.6681640625, 80.738671875], + [54.04541015625, 80.87197265625], + [54.7189453125, 81.115966796875] + ] + ], + [ + [ + [58.62236328125, 81.041650390625], + [58.93056640625, 80.831689453125], + [58.28564453125, 80.764892578125], + [57.2109375, 81.01708984375], + [58.04951171875, 81.11845703125], + [58.62236328125, 81.041650390625] + ] + ], + [ + [ + [63.373828125, 80.70009765625], + [62.592578125, 80.8530273437501], + [64.80205078125, 81.197265625], + [65.4374023437501, 80.9307128906251], + [63.373828125, 80.70009765625] + ] + ], + [ + [ + [91.5671875000001, 81.1412109375], + [91.2228515625001, 81.063818359375], + [89.901171875, 81.170703125], + [91.5671875000001, 81.1412109375] + ] + ], + [ + [ + [96.5265625, 81.0755859375], + [97.8699218750001, 80.7632812500001], + [97.025390625, 80.535546875], + [97.2984375000001, 80.2727539062501], + [93.6546875, 80.009619140625], + [91.5238281250001, 80.358544921875], + [93.2625, 80.791259765625], + [92.5925781250001, 80.780859375], + [92.7103515625, 80.87216796875], + [95.1595703125, 81.27099609375], + [95.8006835937501, 81.28046875], + [96.5265625, 81.0755859375] + ] + ], + [ + [ + [57.81025390625, 81.546044921875], + [58.5638671875, 81.418408203125], + [57.8586914062501, 81.36806640625], + [57.7697265625, 81.1697265625], + [55.7166992187501, 81.1884765625], + [55.466015625, 81.311181640625], + [57.81025390625, 81.546044921875] + ] + ], + [ + [ + [63.6509765625001, 81.609326171875], + [62.1064453125, 81.679345703125], + [63.7095703125, 81.6873046875], + [63.6509765625001, 81.609326171875] + ] + ], + [ + [ + [58.29541015625, 81.715185546875], + [58.1345703125, 81.827978515625], + [59.26181640625, 81.85419921875], + [59.3564453125, 81.758984375], + [58.29541015625, 81.715185546875] + ] + ] + ] + }, + "properties": { + "name": "Russia", + "childNum": 73 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [30.5099609375, -1.06728515625001], + [30.47705078125, -1.0830078125], + [30.47021484375, -1.13115234375], + [30.50810546875, -1.20820312500001], + [30.63193359375, -1.36748046875], + [30.7107421875, -1.39677734375], + [30.76220703125, -1.45869140625001], + [30.81259765625, -1.56308593750001], + [30.8765625, -2.143359375], + [30.85498046875, -2.2654296875], + [30.8287109375, -2.33847656250001], + [30.7625, -2.37167968750001], + [30.71484375, -2.36347656250001], + [30.656640625, -2.373828125], + [30.593359375, -2.39677734375], + [30.55361328125, -2.40009765625001], + [30.40849609375, -2.31298828125], + [30.11728515625, -2.41660156250001], + [29.93017578125, -2.33955078125001], + [29.8681640625, -2.71640625], + [29.698046875, -2.7947265625], + [29.390234375, -2.80859375], + [29.10205078125, -2.595703125], + [29.01435546875, -2.72021484375], + [28.8939453125, -2.63505859375], + [28.8763671875, -2.40029296875001], + [29.13154296875, -2.1951171875], + [29.19658203125, -1.71992187500001], + [29.576953125, -1.38789062500001], + [29.825390625, -1.335546875], + [29.930078125, -1.46992187500001], + [30.36025390625, -1.074609375], + [30.4123046875, -1.06308593750001], + [30.469921875, -1.066015625], + [30.5099609375, -1.06728515625001] + ] + ] + }, + "properties": { + "name": "Rwanda", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [41.9876953125001, 16.715625], + [42.0599609375, 16.803515625], + [42.1578125000001, 16.570703125], + [41.8015625, 16.778759765625], + [41.8604492187501, 17.0025390625], + [41.9876953125001, 16.715625] + ] + ], + [ + [ + [46.5314453125, 29.096240234375], + [47.433203125, 28.98955078125], + [47.6712890625, 28.533154296875], + [48.44248046875, 28.542919921875], + [48.808984375, 27.8958984375], + [48.7971679687501, 27.72431640625], + [49.2375, 27.492724609375], + [49.17509765625, 27.4376464843751], + [49.4052734375, 27.18095703125], + [50.1498046875, 26.662646484375], + [50.00810546875, 26.678515625], + [50.2138671875, 26.3084960937501], + [50.15546875, 26.100537109375], + [50.031640625, 26.1109863281251], + [50.55791015625, 25.086669921875], + [50.6668945312501, 24.963818359375], + [50.7255859375, 24.8693847656251], + [50.80439453125, 24.7892578125], + [50.9283203125, 24.5951171875], + [50.966015625, 24.57392578125], + [51.0227539062501, 24.565234375], + [51.0933593750001, 24.5646484375], + [51.1780273437501, 24.58671875], + [51.26796875, 24.6072265625], + [51.3384765625001, 24.56435546875], + [51.4112304687501, 24.5708007812501], + [51.30986328125, 24.340380859375], + [51.568359375, 24.2861816406251], + [51.5925781250001, 24.078857421875], + [52.5550781250001, 22.9328125], + [55.1042968750001, 22.621484375], + [55.1858398437501, 22.7041015625], + [55.641015625, 22.00185546875], + [54.97734375, 19.995947265625], + [51.97763671875, 18.9961425781251], + [49.0419921875, 18.581787109375], + [48.17216796875, 18.15693359375], + [47.57958984375, 17.44833984375], + [47.441796875, 17.111865234375], + [47.1435546875, 16.9466796875], + [46.9756835937501, 16.953466796875], + [46.7276367187501, 17.265576171875], + [45.5353515625001, 17.30205078125], + [45.1480468750001, 17.42744140625], + [43.9169921875, 17.32470703125], + [43.41796875, 17.516259765625], + [43.19091796875, 17.359375], + [43.1650390625, 16.689404296875], + [42.79931640625, 16.37177734375], + [42.2939453125, 17.4349609375], + [41.75, 17.8857421875], + [41.2294921875, 18.67841796875], + [40.7591796875001, 19.75546875], + [40.0806640625, 20.26591796875], + [39.7283203125001, 20.39033203125], + [39.27607421875, 20.973974609375], + [39.0935546875001, 21.3103515625], + [39.1470703125001, 21.518994140625], + [38.9878906250001, 21.8817382812501], + [39.06201171875, 22.5921875], + [38.46416015625, 23.711865234375], + [37.9197265625, 24.1854003906251], + [37.5430664062501, 24.291650390625], + [37.180859375, 24.82001953125], + [37.26630859375, 24.96005859375], + [37.148828125, 25.29111328125], + [35.18046875, 28.03486328125], + [34.7220703125, 28.1306640625], + [34.625, 28.064501953125], + [34.95078125, 29.353515625], + [36.06845703125, 29.200537109375], + [36.2828125000001, 29.35537109375], + [36.47607421875, 29.4951171875], + [36.591796875, 29.66611328125], + [36.7039062500001, 29.831640625], + [36.7552734375001, 29.866015625], + [37.46923828125, 29.995068359375], + [37.49072265625, 30.01171875], + [37.5536132812501, 30.144580078125], + [37.63359375, 30.31328125], + [37.64990234375, 30.33095703125], + [37.6697265625001, 30.34814453125], + [37.862890625, 30.442626953125], + [37.9800781250001, 30.5], + [37.47900390625, 31.007763671875], + [37.1052734375, 31.35517578125], + [36.9585937500001, 31.49150390625], + [37.215625, 31.556103515625], + [37.493359375, 31.62587890625], + [38.11142578125, 31.7811523437501], + [38.37548828125, 31.8474609375], + [38.9623046875, 31.994921875], + [38.9970703125, 32.0074707031251], + [39.14541015625, 32.12451171875], + [39.36865234375, 32.091748046875], + [39.7041015625, 32.042529296875], + [40.02783203125, 31.99501953125], + [40.3693359375001, 31.93896484375], + [40.4789062500001, 31.893359375], + [42.0744140625, 31.08037109375], + [43.77373046875, 29.84921875], + [44.71650390625, 29.193603515625], + [46.3564453125, 29.063671875], + [46.5314453125, 29.096240234375] + ] + ] + ] + }, + "properties": { + "name": "Saudi Arabia", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [36.87138671875, 21.996728515625], + [36.926953125, 21.5865234375], + [37.25859375, 21.108544921875], + [37.2572265625, 21.039404296875], + [37.1505859375, 21.103759765625], + [37.14111328125, 20.981787109375], + [37.1931640625, 20.120703125], + [37.4712890625, 18.8201171875], + [38.60947265625, 18.005078125], + [38.4224609375, 17.82392578125], + [38.39716796875, 17.778369140625], + [38.385546875, 17.75126953125], + [38.37373046875, 17.717333984375], + [38.34736328125, 17.68359375], + [38.28984375, 17.63701171875], + [38.26728515625, 17.61669921875], + [38.253515625, 17.584765625], + [37.782421875, 17.4580078125], + [37.5474609375, 17.32412109375], + [37.51015625, 17.288134765625], + [37.4529296875, 17.10869140625], + [37.41103515625, 17.06171875], + [37.248828125, 17.056884765625], + [37.16953125, 17.04140625], + [37.0615234375, 17.061279296875], + [37.008984375, 17.05888671875], + [36.99521484375, 17.020556640625], + [36.97578125, 16.866552734375], + [36.9787109375, 16.8005859375], + [36.88779296875, 16.624658203125], + [36.91376953125, 16.29619140625], + [36.566015625, 15.362109375], + [36.4267578125, 15.132080078125], + [36.44814453125, 14.940087890625], + [36.47080078125, 14.736474609375], + [36.52431640625, 14.2568359375], + [36.1251953125, 12.75703125], + [35.67021484375, 12.62373046875], + [35.1123046875, 11.816552734375], + [34.9314453125, 10.864794921875], + [34.7712890625, 10.74619140625], + [34.571875, 10.88017578125], + [34.3439453125, 10.658642578125], + [34.31123046875, 10.190869140625], + [34.078125, 9.46152343749999], + [33.871484375, 9.50615234374999], + [33.96328125, 9.861767578125], + [33.90703125, 10.1814453125], + [33.130078125, 10.745947265625], + [33.07333984375, 11.606103515625], + [33.19931640625, 12.21728515625], + [32.721875, 12.223095703125], + [32.73671875, 12.00966796875], + [32.072265625, 12.00673828125], + [32.3384765625, 11.710107421875], + [32.42080078125, 11.089111328125], + [31.22490234375, 9.799267578125], + [30.75537109375, 9.731201171875], + [30.00302734375, 10.277392578125], + [29.60546875, 10.065087890625], + [29.47314453125, 9.76860351562499], + [28.97958984375, 9.594189453125], + [28.84453125, 9.32607421874999], + [28.04892578125, 9.32861328125], + [27.880859375, 9.60161132812499], + [27.07421875, 9.61381835937499], + [26.65869140625, 9.484130859375], + [25.919140625, 10.1693359375], + [25.858203125, 10.406494140625], + [25.21171875, 10.329931640625], + [25.0669921875, 10.293798828125], + [24.78525390625, 9.774658203125], + [24.53193359375, 8.8869140625], + [24.14736328125, 8.665625], + [23.5373046875, 8.81582031249999], + [23.46826171875, 9.11474609375], + [23.62265625, 9.340625], + [23.6462890625, 9.82290039062499], + [22.86005859375, 10.919677734375], + [22.92265625, 11.344873046875], + [22.59111328125, 11.5798828125], + [22.58095703125, 11.99013671875], + [22.4724609375, 12.0677734375], + [22.35234375, 12.66044921875], + [21.928125, 12.678125], + [21.82529296875, 12.79052734375], + [22.228125, 13.32958984375], + [22.1064453125, 13.7998046875], + [22.53857421875, 14.161865234375], + [22.38154296875, 14.55048828125], + [22.6708984375, 14.7224609375], + [22.93232421875, 15.162109375], + [22.93388671875, 15.53310546875], + [23.10517578125, 15.7025390625], + [23.97080078125, 15.721533203125], + [23.9802734375, 19.496630859375], + [23.9802734375, 19.995947265625], + [24.9794921875, 20.002587890625], + [24.9802734375, 21.995849609375], + [28.03642578125, 21.995361328125], + [31.09267578125, 21.994873046875], + [31.26064453125, 22.002294921875], + [31.40029296875, 22.20244140625], + [31.4861328125, 22.147802734375], + [31.43447265625, 21.995849609375], + [36.87138671875, 21.996728515625] + ] + ] + }, + "properties": { + "name": "Sudan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [34.078125, 9.46152343749999], + [34.07275390625, 8.54526367187499], + [33.9533203125, 8.44350585937499], + [33.2810546875, 8.437255859375], + [32.99892578125, 7.89951171874999], + [33.90244140625, 7.509521484375], + [34.0642578125, 7.22573242187499], + [34.71064453125, 6.66030273437499], + [34.98359375, 5.85830078124999], + [35.268359375, 5.49228515624999], + [35.08447265625, 5.31186523437499], + [34.8783203125, 5.1095703125], + [34.63984375, 4.87548828125], + [34.38017578125, 4.62065429687499], + [34.17685546875, 4.41909179687499], + [33.97607421875, 4.22021484375], + [33.7416015625, 3.98525390624999], + [33.56845703125, 3.81171875], + [33.48935546875, 3.755078125], + [32.997265625, 3.88017578124999], + [32.3357421875, 3.70620117187499], + [32.1359375, 3.5197265625], + [31.798046875, 3.80263671874999], + [31.54716796875, 3.67758789062499], + [31.15234375, 3.785595703125], + [30.83857421875, 3.49072265625], + [30.7572265625, 3.62421875], + [30.58671875, 3.62421875], + [30.50830078125, 3.835693359375], + [30.194921875, 3.98193359375], + [29.67685546875, 4.5869140625], + [29.46962890625, 4.61181640625], + [29.22490234375, 4.39189453124999], + [28.72705078125, 4.50498046874999], + [28.4275390625, 4.324169921875], + [28.19208984375, 4.35024414062499], + [27.7880859375, 4.64467773437499], + [27.4033203125, 5.10917968749999], + [27.1439453125, 5.72294921874999], + [26.5142578125, 6.06923828124999], + [26.30859375, 6.455322265625], + [26.36181640625, 6.63530273437499], + [25.27890625, 7.427490234375], + [25.18134765625, 7.55722656249999], + [25.200390625, 7.80791015624999], + [24.8533203125, 8.13754882812499], + [24.29140625, 8.29140625], + [24.14736328125, 8.665625], + [24.53193359375, 8.8869140625], + [24.78525390625, 9.774658203125], + [25.0669921875, 10.293798828125], + [25.21171875, 10.329931640625], + [25.858203125, 10.406494140625], + [25.919140625, 10.1693359375], + [26.65869140625, 9.484130859375], + [27.07421875, 9.61381835937499], + [27.880859375, 9.60161132812499], + [28.04892578125, 9.32861328125], + [28.84453125, 9.32607421874999], + [28.97958984375, 9.594189453125], + [29.47314453125, 9.76860351562499], + [29.60546875, 10.065087890625], + [30.00302734375, 10.277392578125], + [30.75537109375, 9.731201171875], + [31.22490234375, 9.799267578125], + [32.42080078125, 11.089111328125], + [32.3384765625, 11.710107421875], + [32.072265625, 12.00673828125], + [32.73671875, 12.00966796875], + [32.721875, 12.223095703125], + [33.19931640625, 12.21728515625], + [33.07333984375, 11.606103515625], + [33.130078125, 10.745947265625], + [33.90703125, 10.1814453125], + [33.96328125, 9.861767578125], + [33.871484375, 9.50615234374999], + [34.078125, 9.46152343749999] + ] + ] + }, + "properties": { + "name": "South Sudan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-12.280615234375, 14.809033203125], + [-12.22841796875, 14.45859375], + [-12.019189453125, 14.206494140625], + [-11.960888671875, 13.87529296875], + [-12.05419921875, 13.633056640625], + [-11.831689453125, 13.3158203125], + [-11.6349609375, 13.369873046875], + [-11.390380859375, 12.9419921875], + [-11.389404296875, 12.40439453125], + [-12.399072265625, 12.340087890625], + [-12.930712890625, 12.532275390625], + [-13.061279296875, 12.489990234375], + [-13.08291015625, 12.633544921875], + [-13.729248046875, 12.67392578125], + [-14.06484375, 12.67529296875], + [-14.34921875, 12.676416015625], + [-15.19609375, 12.679931640625], + [-15.3779296875, 12.58896484375], + [-15.5748046875, 12.490380859375], + [-15.83955078125, 12.437890625], + [-16.144189453125, 12.457421875], + [-16.24150390625, 12.443310546875], + [-16.41630859375, 12.36767578125], + [-16.521337890625, 12.3486328125], + [-16.65693359375, 12.36435546875], + [-16.71181640625, 12.354833984375], + [-16.760302734375, 12.52578125], + [-16.44287109375, 12.60947265625], + [-16.59765625, 12.715283203125], + [-16.743896484375, 12.58544921875], + [-16.763330078125, 13.06416015625], + [-16.648779296875, 13.154150390625], + [-15.83427734375, 13.1564453125], + [-15.814404296875, 13.325146484375], + [-15.28623046875, 13.39599609375], + [-15.151123046875, 13.556494140625], + [-14.24677734375, 13.23583984375], + [-13.826708984375, 13.4078125], + [-13.977392578125, 13.54345703125], + [-14.40546875, 13.5037109375], + [-15.108349609375, 13.812109375], + [-15.42685546875, 13.727001953125], + [-15.50966796875, 13.58623046875], + [-16.5623046875, 13.5873046875], + [-16.766943359375, 13.904931640625], + [-16.618115234375, 14.04052734375], + [-16.791748046875, 14.004150390625], + [-17.16806640625, 14.640625], + [-17.34580078125, 14.729296875], + [-17.44501953125, 14.651611328125], + [-17.53564453125, 14.755126953125], + [-17.14716796875, 14.922021484375], + [-16.843408203125, 15.293994140625], + [-16.570751953125, 15.734423828125], + [-16.53525390625, 15.83837890625], + [-16.50205078125, 15.917333984375], + [-16.480078125, 16.097216796875], + [-16.441015625, 16.204541015625], + [-16.239013671875, 16.531298828125], + [-15.768212890625, 16.485107421875], + [-14.990625, 16.676904296875], + [-14.30009765625, 16.5802734375], + [-13.86845703125, 16.14814453125], + [-13.756640625, 16.172509765625], + [-13.40966796875, 16.0591796875], + [-13.1052734375, 15.57177734375], + [-12.73525390625, 15.13125], + [-12.40869140625, 14.889013671875], + [-12.280615234375, 14.809033203125] + ] + ] + }, + "properties": { + "name": "Senegal", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [103.9697265625, 1.33144531249999], + [103.6501953125, 1.32553710937499], + [103.81796875, 1.44707031249999], + [103.9697265625, 1.33144531249999] + ] + ] + }, + "properties": { + "name": "Singapore", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-37.1033203125, -54.065625], + [-36.70380859375, -54.10810546875], + [-36.647412109375, -54.2623046875], + [-36.32646484375, -54.251171875], + [-35.798583984375, -54.7634765625], + [-36.085498046875, -54.866796875], + [-36.885986328125, -54.339453125], + [-37.630908203125, -54.16748046875], + [-37.61884765625, -54.04208984375], + [-38.017431640625, -54.0080078125], + [-37.1033203125, -54.065625] + ] + ] + }, + "properties": { + "name": "S. Geo. and S. Sandw. Is.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-5.69213867187497, -15.99775390625], + [-5.78251953125002, -16.00400390625], + [-5.70786132812498, -15.90615234375], + [-5.69213867187497, -15.99775390625] + ] + ] + }, + "properties": { + "name": "Saint Helena", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [160.57626953125, -11.7978515625], + [160.44306640625, -11.81494140625], + [159.986328125, -11.4947265625], + [160.57626953125, -11.7978515625] + ] + ], + [ + [ + [166.133203125, -10.7578125], + [165.90400390625, -10.85146484375], + [165.791015625, -10.784765625], + [166.023828125, -10.6611328125], + [166.133203125, -10.7578125] + ] + ], + [ + [ + [161.71533203125, -10.3873046875], + [162.10537109375, -10.45380859375], + [162.37333984375, -10.8232421875], + [161.78681640625, -10.71689453125], + [161.537890625, -10.56640625], + [161.48701171875, -10.36142578125], + [161.2939453125, -10.32646484375], + [161.30478515625, -10.20439453125], + [161.71533203125, -10.3873046875] + ] + ], + [ + [ + [161.5478515625, -9.62568359375], + [161.55380859375, -9.76972656250003], + [161.409765625, -9.68164062500003], + [161.36416015625, -9.35341796875004], + [161.5478515625, -9.62568359375] + ] + ], + [ + [ + [159.750390625, -9.27265625000001], + [159.97060546875, -9.43330078124997], + [160.35458984375, -9.42158203124998], + [160.8189453125, -9.86279296874999], + [160.64921875, -9.92861328124998], + [159.802734375, -9.7634765625], + [159.6123046875, -9.47070312499994], + [159.6255859375, -9.31123046874997], + [159.750390625, -9.27265625000001] + ] + ], + [ + [ + [160.1681640625, -8.99550781250004], + [160.40751953125, -9.14033203124997], + [160.10537109375, -9.08076171875], + [160.1681640625, -8.99550781250004] + ] + ], + [ + [ + [159.18857421875, -9.12353515625001], + [159.036328125, -9.075], + [159.12978515625, -8.99306640624998], + [159.22841796875, -9.02998046874996], + [159.18857421875, -9.12353515625001] + ] + ], + [ + [ + [158.10791015625, -8.68417968750003], + [157.93759765625, -8.73642578125002], + [157.90927734375, -8.565625], + [158.10546875, -8.53681640625003], + [158.10791015625, -8.68417968750003] + ] + ], + [ + [ + [157.38896484375, -8.71347656249996], + [157.2123046875, -8.56503906250001], + [157.3794921875, -8.42089843749994], + [157.38896484375, -8.71347656249996] + ] + ], + [ + [ + [160.7494140625, -8.31396484375001], + [160.99765625, -8.61201171874998], + [160.9443359375, -8.79902343749998], + [161.15869140625, -8.96181640625001], + [161.3673828125, -9.61123046874998], + [160.7720703125, -8.96386718749999], + [160.7140625, -8.5392578125], + [160.5904296875, -8.37275390625], + [160.7494140625, -8.31396484375001] + ] + ], + [ + [ + [157.7634765625, -8.24218749999996], + [157.8984375, -8.50634765624994], + [157.8193359375, -8.61201171874998], + [157.587890625, -8.44541015624996], + [157.5580078125, -8.269921875], + [157.30244140625, -8.33330078124996], + [157.217578125, -8.26279296874998], + [157.490625, -7.96572265625004], + [157.7634765625, -8.24218749999996] + ] + ], + [ + [ + [157.171875, -8.10810546875], + [156.95830078125, -8.01435546875], + [157.02412109375, -7.86787109375], + [157.1861328125, -7.94121093750002], + [157.171875, -8.10810546875] + ] + ], + [ + [ + [156.687890625, -7.92304687500004], + [156.5109375, -7.70781249999997], + [156.5609375, -7.57402343749999], + [156.80908203125, -7.72285156250003], + [156.687890625, -7.92304687500004] + ] + ], + [ + [ + [159.8791015625, -8.53427734374995], + [158.94404296875, -8.04072265625004], + [158.457421875, -7.54472656249997], + [158.734375, -7.60429687500003], + [159.4314453125, -8.02900390624996], + [159.84306640625, -8.32695312499999], + [159.8791015625, -8.53427734374995] + ] + ], + [ + [ + [155.83984375, -7.09716796875001], + [155.6775390625, -7.08896484375002], + [155.73896484375, -6.97294921875002], + [155.83984375, -7.09716796875001] + ] + ], + [ + [ + [157.48671875, -7.33037109375], + [157.44130859375, -7.42568359374997], + [157.1015625, -7.32363281249997], + [156.4525390625, -6.63828124999996], + [157.0302734375, -6.89199218749995], + [157.193359375, -7.1603515625], + [157.48671875, -7.33037109375] + ] + ] + ] + }, + "properties": { + "name": "Solomon Is.", + "childNum": 16 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-12.5260742187499, 7.43632812500002], + [-12.9516113281249, 7.57084960937499], + [-12.615234375, 7.63720703125], + [-12.5125, 7.58242187500004], + [-12.5260742187499, 7.43632812500002] + ] + ], + [ + [ + [-10.75859375, 9.38535156249999], + [-10.68271484375, 9.28935546874997], + [-10.6876464843749, 9.26113281249999], + [-10.7499511718749, 9.12236328124996], + [-10.747021484375, 9.09526367187505], + [-10.7268554687499, 9.08168945312502], + [-10.615966796875, 9.05917968749998], + [-10.500537109375, 8.68754882812502], + [-10.67734375, 8.4005859375], + [-10.712109375, 8.33525390625002], + [-10.686962890625, 8.32167968750001], + [-10.65263671875, 8.33027343749998], + [-10.6040039062499, 8.31948242187499], + [-10.5577148437499, 8.31567382812503], + [-10.496435546875, 8.36210937499997], + [-10.39443359375, 8.48095703125003], + [-10.36005859375, 8.49550781249998], + [-10.283203125, 8.48515625], + [-10.2857421874999, 8.45410156249999], + [-10.3146484375, 8.31083984375002], + [-10.3598144531249, 8.18793945312503], + [-10.5708496093749, 8.07114257812503], + [-10.6474609375, 7.759375], + [-10.878076171875, 7.53823242187499], + [-11.26767578125, 7.2326171875], + [-11.50751953125, 6.90654296875], + [-12.48564453125, 7.38627929687505], + [-12.4802734374999, 7.75327148437502], + [-12.697607421875, 7.71586914062505], + [-12.8508789062499, 7.81870117187503], + [-12.95693359375, 8.14531250000005], + [-13.148974609375, 8.21459960937504], + [-13.27275390625, 8.42973632812499], + [-13.0850097656249, 8.42475585937504], + [-12.8940917968749, 8.62978515624998], + [-13.1818359375, 8.57690429687504], + [-13.20693359375, 8.84311523437501], + [-13.05947265625, 8.88115234375003], + [-13.29267578125, 9.04921875], + [-13.077294921875, 9.06962890624997], + [-12.9587890625, 9.26333007812499], + [-12.7558593749999, 9.37358398437499], + [-12.557861328125, 9.70498046874999], + [-12.427978515625, 9.89814453125001], + [-12.142333984375, 9.87539062499999], + [-11.911083984375, 9.99301757812498], + [-11.2736328125, 9.99653320312498], + [-11.2056640624999, 9.97773437499997], + [-11.180859375, 9.92534179687505], + [-11.0474609375, 9.78632812500005], + [-10.75859375, 9.38535156249999] + ] + ] + ] + }, + "properties": { + "name": "Sierra Leone", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-89.36259765625, 14.416015625], + [-89.1205078125, 14.37021484375], + [-88.512548828125, 13.978955078125], + [-88.504345703125, 13.964208984375], + [-88.49765625, 13.904541015625], + [-88.482666015625, 13.854248046875], + [-88.44912109375, 13.8509765625], + [-88.40849609375, 13.875390625], + [-88.276220703125, 13.94267578125], + [-88.151025390625, 13.987353515625], + [-87.991015625, 13.879638671875], + [-87.8919921875, 13.894970703125], + [-87.80224609375, 13.889990234375], + [-87.7314453125, 13.841064453125], + [-87.71533203125, 13.8126953125], + [-87.781884765625, 13.52138671875], + [-87.930859375, 13.1806640625], + [-88.68564453125, 13.281494140625], + [-88.51201171875, 13.183935546875], + [-89.80419921875, 13.560107421875], + [-90.09521484375, 13.7365234375], + [-90.04814453125, 13.904052734375], + [-89.54716796875, 14.241259765625], + [-89.5736328125, 14.390087890625], + [-89.36259765625, 14.416015625] + ] + ] + }, + "properties": { + "name": "El Salvador", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-56.26708984375, 46.8384765625], + [-56.3847656249999, 46.8194335937501], + [-56.3646484374999, 47.098974609375], + [-56.26708984375, 46.8384765625] + ] + ] + }, + "properties": { + "name": "St. Pierre and Miquelon", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [6.65996093749999, 0.120654296874989], + [6.51972656250004, 0.066308593750023], + [6.46816406249999, 0.22734375], + [6.68691406250008, 0.404394531249977], + [6.75, 0.24345703124996], + [6.65996093749999, 0.120654296874989] + ] + ], + [ + [ + [7.423828125, 1.56772460937501], + [7.33066406250003, 1.60336914062499], + [7.41445312500005, 1.69912109375004], + [7.423828125, 1.56772460937501] + ] + ] + ] + }, + "properties": { + "name": "São Tomé and Principe", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-54.034228515625, 3.62939453125], + [-54.0095703125, 3.44853515624999], + [-54.06318359375, 3.35332031249999], + [-54.188037109375, 3.17875976562499], + [-54.203125, 3.13818359375], + [-54.170703125, 2.993603515625], + [-54.1880859375, 2.87485351562499], + [-54.1955078125, 2.81787109375], + [-54.25673828125, 2.71372070312499], + [-54.402001953125, 2.46152343749999], + [-54.5359375, 2.34331054687499], + [-54.568408203125, 2.34257812499999], + [-54.604736328125, 2.33579101562499], + [-54.616259765625, 2.32675781249999], + [-54.661865234375, 2.32753906249999], + [-54.697412109375, 2.359814453125], + [-54.722216796875, 2.441650390625], + [-54.87607421875, 2.450390625], + [-54.9265625, 2.49736328124999], + [-54.968408203125, 2.54833984375], + [-54.978662109375, 2.59765625], + [-55.005810546875, 2.59296875], + [-55.0703125, 2.54833984375], + [-55.114111328125, 2.53920898437499], + [-55.1876953125, 2.54750976562499], + [-55.28603515625, 2.49965820312499], + [-55.343994140625, 2.48876953125], + [-55.3853515625, 2.440625], + [-55.73056640625, 2.40615234374999], + [-55.957470703125, 2.520458984375], + [-55.993505859375, 2.497509765625], + [-56.020361328125, 2.3927734375], + [-56.0451171875, 2.36440429687499], + [-56.08779296875, 2.34130859375], + [-56.12939453125, 2.29951171875], + [-56.1376953125, 2.259033203125], + [-56.0736328125, 2.236767578125], + [-56.020068359375, 2.158154296875], + [-55.961962890625, 2.09511718749999], + [-55.91533203125, 2.03955078125], + [-55.921630859375, 1.97666015624999], + [-55.929638671875, 1.8875], + [-56.019921875, 1.842236328125], + [-56.4828125, 1.942138671875], + [-56.704345703125, 2.03647460937499], + [-57.19736328125, 2.853271484375], + [-57.303662109375, 3.37709960937499], + [-57.646728515625, 3.39453125], + [-58.054296875, 4.10166015624999], + [-57.84599609375, 4.6681640625], + [-57.917041015625, 4.82041015624999], + [-57.711083984375, 4.99106445312499], + [-57.331005859375, 5.02016601562499], + [-57.209814453125, 5.19541015624999], + [-57.3185546875, 5.33535156249999], + [-57.194775390625, 5.5484375], + [-56.96982421875, 5.99287109375], + [-56.235595703125, 5.88535156249999], + [-55.897607421875, 5.69931640624999], + [-55.909912109375, 5.89262695312499], + [-55.64833984375, 5.98588867187499], + [-54.83369140625, 5.98833007812499], + [-54.05419921875, 5.80791015624999], + [-54.08046875, 5.50224609374999], + [-54.4796875, 4.83652343749999], + [-54.350732421875, 4.05410156249999], + [-54.034228515625, 3.62939453125] + ] + ] + }, + "properties": { + "name": "Suriname", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.538671875, 49.072705078125], + [22.52412109375, 49.031396484375], + [22.389453125, 48.873486328125], + [22.29521484375, 48.68583984375], + [22.14287109375, 48.568505859375], + [22.1318359375, 48.405322265625], + [21.7669921875, 48.3380859375], + [21.4513671875, 48.55224609375], + [20.4900390625, 48.526904296875], + [20.3337890625, 48.295556640625], + [19.950390625, 48.146630859375], + [19.625390625, 48.223095703125], + [18.79189453125, 48.00029296875], + [18.72421875, 47.787158203125], + [17.7619140625, 47.770166015625], + [17.14736328125, 48.00595703125], + [16.8654296875, 48.3869140625], + [16.953125, 48.598828125], + [17.13564453125, 48.841064453125], + [17.75849609375, 48.888134765625], + [18.0859375, 49.06513671875], + [18.1609375, 49.257373046875], + [18.8322265625, 49.510791015625], + [19.1494140625, 49.4], + [19.4416015625, 49.597705078125], + [19.77392578125, 49.37216796875], + [19.756640625, 49.20439453125], + [20.0576171875, 49.181298828125], + [20.36298828125, 49.38525390625], + [20.86845703125, 49.314697265625], + [21.07939453125, 49.41826171875], + [21.6396484375, 49.411962890625], + [22.0201171875, 49.209521484375], + [22.473046875, 49.081298828125], + [22.538671875, 49.072705078125] + ] + ] + }, + "properties": { + "name": "Slovakia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.5162109375, 46.49990234375], + [16.42763671875, 46.5244140625], + [16.32119140625, 46.534619140625], + [16.1064453125, 46.3822265625], + [15.608984375, 46.171923828125], + [15.592578125, 46.139990234375], + [15.596875, 46.109228515625], + [15.6755859375, 45.98369140625], + [15.6521484375, 45.862158203125], + [15.27705078125, 45.7326171875], + [15.3537109375, 45.659912109375], + [15.28359375, 45.5796875], + [15.2912109375, 45.541552734375], + [15.32666015625, 45.502294921875], + [15.339453125, 45.467041015625], + [15.24208984375, 45.44140625], + [15.11044921875, 45.45078125], + [14.95458984375, 45.49990234375], + [14.79306640625, 45.47822265625], + [14.64951171875, 45.571484375], + [14.591796875, 45.65126953125], + [14.56884765625, 45.6572265625], + [14.5484486607143, 45.628388671875], + [14.5075864955357, 45.5903934151786], + [14.42734375, 45.50576171875], + [14.369921875, 45.4814453125], + [13.8787109375, 45.428369140625], + [13.5779296875, 45.51689453125], + [13.8447265625, 45.59287109375], + [13.83115234375, 45.680419921875], + [13.6634765625, 45.7919921875], + [13.6005859375, 45.97978515625], + [13.5091796875, 45.973779296875], + [13.4876953125, 45.987109375], + [13.4802734375, 46.009228515625], + [13.48642578125, 46.03955078125], + [13.548046875, 46.089111328125], + [13.6166015625, 46.13310546875], + [13.6349609375, 46.157763671875], + [13.63251953125, 46.17705078125], + [13.42099609375, 46.2123046875], + [13.39951171875, 46.317529296875], + [13.56328125, 46.415087890625], + [13.637109375, 46.44853515625], + [13.6796875, 46.462890625], + [13.7, 46.520263671875], + [14.5498046875, 46.39970703125], + [14.89326171875, 46.605908203125], + [15.9576171875, 46.67763671875], + [16.09306640625, 46.86328125], + [16.28359375, 46.857275390625], + [16.5162109375, 46.49990234375] + ] + ] + }, + "properties": { + "name": "Slovenia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [16.528515625, 56.29052734375], + [16.431640625, 56.24375], + [16.4123046875, 56.568994140625], + [17.025390625, 57.345068359375], + [16.528515625, 56.29052734375] + ] + ], + [ + [ + [19.07646484375, 57.8359375], + [18.8138671875, 57.706201171875], + [18.9079101562501, 57.39833984375], + [18.14638671875, 56.9205078125], + [18.2853515625001, 57.083203125], + [18.1365234375, 57.556640625], + [18.53740234375, 57.8305664062501], + [18.9005859375, 57.915478515625], + [19.07646484375, 57.8359375] + ] + ], + [ + [ + [19.1563476562501, 57.922607421875], + [19.0865234375, 57.8649902343751], + [19.13486328125, 57.98134765625], + [19.3314453125, 57.962890625], + [19.1563476562501, 57.922607421875] + ] + ], + [ + [ + [24.15546875, 65.8052734375001], + [23.1023437500001, 65.7353515625], + [22.4009765625, 65.862109375], + [22.25400390625, 65.59755859375], + [21.5655273437501, 65.40810546875], + [21.6091796875001, 65.261376953125], + [21.4103515625001, 65.3174316406251], + [21.57392578125, 65.12578125], + [21.1381835937501, 64.8086914062501], + [21.51962890625, 64.4630859375], + [20.7626953125, 63.8678222656251], + [18.6064453125, 63.178271484375], + [18.3128906250001, 62.99638671875], + [18.4630859375, 62.895849609375], + [18.17001953125, 62.7893554687501], + [17.906640625, 62.886767578125], + [18.0373046875001, 62.600537109375], + [17.8344726562501, 62.502734375], + [17.4102539062501, 62.5083984375], + [17.63369140625, 62.2330078125001], + [17.3745117187501, 61.86630859375], + [17.4654296875, 61.6844726562501], + [17.19638671875, 61.724560546875], + [17.1307617187501, 61.575732421875], + [17.2509765625, 60.70078125], + [17.6611328125, 60.53515625], + [17.9557617187501, 60.589794921875], + [18.852734375, 60.02587890625], + [18.9705078125, 59.7572265625], + [17.9642578125, 59.359375], + [18.56025390625, 59.394482421875], + [18.2853515625001, 59.109375], + [16.978125, 58.6541503906251], + [16.2142578125, 58.636669921875], + [16.923828125, 58.492578125], + [16.651953125, 58.434326171875], + [16.6522460937501, 57.50068359375], + [16.3487304687501, 56.70927734375], + [15.82666015625, 56.124951171875], + [14.78203125, 56.1619140625], + [14.7547851562501, 56.033154296875], + [14.401953125, 55.9767578125], + [14.2150390625, 55.8326171875], + [14.34169921875, 55.527734375], + [14.1737304687501, 55.396630859375], + [12.8858398437501, 55.4113769531251], + [12.9739257812501, 55.74814453125], + [12.4711914062501, 56.29052734375], + [12.8016601562501, 56.263916015625], + [12.6564453125, 56.440576171875], + [12.857421875, 56.452392578125], + [12.8836914062501, 56.617724609375], + [12.421484375, 56.906396484375], + [11.4493164062501, 58.118359375], + [11.4315429687501, 58.339990234375], + [11.2482421875, 58.369140625], + [11.14716796875, 58.988623046875], + [11.19580078125, 59.0782714843751], + [11.3882812500001, 59.0365234375], + [11.4707031250001, 58.909521484375], + [11.6427734375, 58.92607421875], + [11.7981445312501, 59.289892578125], + [11.68076171875, 59.59228515625], + [12.4861328125001, 60.1067871093751], + [12.588671875, 60.450732421875], + [12.294140625, 61.0026855468751], + [12.7060546875, 61.0598632812501], + [12.8807617187501, 61.3522949218751], + [12.15537109375, 61.720751953125], + [12.3035156250001, 62.285595703125], + [11.9999023437501, 63.29169921875], + [12.1751953125001, 63.595947265625], + [12.7927734375, 64], + [13.203515625, 64.07509765625], + [13.9605468750001, 64.014013671875], + [14.1412109375, 64.17353515625], + [14.07763671875, 64.464013671875], + [13.65029296875, 64.58154296875], + [14.4796875, 65.30146484375], + [14.54326171875, 66.129345703125], + [15.4837890625001, 66.30595703125], + [15.42294921875, 66.48984375], + [16.403515625, 67.05498046875], + [16.12744140625, 67.4258300781251], + [16.78359375, 67.89501953125], + [17.324609375, 68.10380859375], + [17.91669921875, 67.964892578125], + [18.30302734375, 68.555419921875], + [19.9698242187501, 68.356396484375], + [20.348046875, 68.84873046875], + [20.1166992187501, 69.0208984375001], + [20.62216796875, 69.036865234375], + [21.9974609375001, 68.52060546875], + [22.8541015625, 68.367333984375], + [23.6388671875, 67.95439453125], + [23.4548828125, 67.4602539062501], + [23.7335937500001, 67.422900390625], + [23.6415039062501, 67.12939453125], + [23.98857421875, 66.810546875], + [23.70029296875, 66.25263671875], + [24.15546875, 65.8052734375001] + ] + ] + ] + }, + "properties": { + "name": "Sweden", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [31.9482421875, -25.9576171875], + [32.060546875, -26.018359375], + [32.04140625, -26.28125], + [32.10595703125, -26.52001953125], + [32.112890625, -26.839453125], + [32.0248046875, -26.8111328125], + [31.9947265625, -26.81748046875], + [31.9671875, -26.96064453125], + [31.94609375, -27.1736328125], + [31.9583984375, -27.305859375], + [31.742578125, -27.3099609375], + [31.46953125, -27.2955078125], + [31.2740234375, -27.23837890625], + [31.06337890625, -27.1123046875], + [30.9380859375, -26.9158203125], + [30.88330078125, -26.7923828125], + [30.80673828125, -26.78525390625], + [30.7943359375, -26.7642578125], + [30.8033203125, -26.4134765625], + [31.0880859375, -25.9806640625], + [31.20732421875, -25.843359375], + [31.33515625, -25.75556640625], + [31.3826171875, -25.74296875], + [31.41513671875, -25.74658203125], + [31.9216796875, -25.96875], + [31.9482421875, -25.9576171875] + ] + ] + }, + "properties": { + "name": "Swaziland", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [55.54033203125, -4.69306640625001], + [55.54296875, -4.785546875], + [55.3833984375, -4.60927734375001], + [55.45576171875, -4.55878906250001], + [55.54033203125, -4.69306640625001] + ] + ] + }, + "properties": { + "name": "Seychelles", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [42.358984375, 37.10859375], + [41.78857421875, 36.59716796875], + [41.416796875, 36.5146484375], + [41.29599609375, 36.383349609375], + [41.3541015625, 35.6404296875], + [41.1947265625, 34.768994140625], + [40.98701171875, 34.429052734375], + [38.77353515625, 33.372216796875], + [36.818359375, 32.31728515625], + [36.3720703125, 32.3869140625], + [35.7873046875, 32.734912109375], + [35.9134765625, 32.949609375], + [35.869140625, 33.43173828125], + [36.03447265625, 33.58505859375], + [35.9861328125, 33.75263671875], + [36.3650390625, 33.83935546875], + [36.27783203125, 33.92529296875], + [36.5849609375, 34.221240234375], + [36.50439453125, 34.432373046875], + [36.3298828125, 34.499609375], + [36.38388671875, 34.65791015625], + [35.97626953125, 34.62919921875], + [35.90244140625, 35.420703125], + [35.764453125, 35.57158203125], + [35.8396484375, 35.84921875], + [35.89267578125, 35.916552734375], + [35.967578125, 35.91005859375], + [36.12734375, 35.8314453125], + [36.15361328125, 35.83388671875], + [36.34755859375, 36.003515625], + [36.375390625, 36.171240234375], + [36.63671875, 36.233984375], + [36.64140625, 36.263525390625], + [36.5375, 36.457421875], + [36.5466796875, 36.50634765625], + [36.596875, 36.7013671875], + [36.62841796875, 36.777685546875], + [36.65859375, 36.8025390625], + [36.7765625, 36.79267578125], + [36.941796875, 36.7583984375], + [36.9853515625, 36.702392578125], + [37.0662109375, 36.65263671875], + [37.436328125, 36.643310546875], + [37.52353515625, 36.6783203125], + [37.7203125, 36.743701171875], + [37.906640625, 36.79462890625], + [38.19169921875, 36.9015625], + [38.7666015625, 36.693115234375], + [38.9064453125, 36.694677734375], + [39.1083984375, 36.68056640625], + [39.356640625, 36.681591796875], + [39.50146484375, 36.70224609375], + [39.6865234375, 36.738623046875], + [40.01640625, 36.82607421875], + [40.7056640625, 37.097705078125], + [41.88681640625, 37.156396484375], + [42.05986328125, 37.2060546875], + [42.16787109375, 37.288623046875], + [42.202734375, 37.297265625], + [42.24755859375, 37.2822265625], + [42.2685546875, 37.2765625], + [42.312890625, 37.22958984375], + [42.358984375, 37.10859375] + ] + ] + }, + "properties": { + "name": "Syria", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-72.3328125, 21.8513671875], + [-72.1443359375, 21.792724609375], + [-72.3354492187499, 21.7580078125], + [-72.3328125, 21.8513671875] + ] + ] + }, + "properties": { + "name": "Turks and Caicos Is.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.9802734375, 19.496630859375], + [23.97080078125, 15.721533203125], + [23.10517578125, 15.7025390625], + [22.93388671875, 15.53310546875], + [22.93232421875, 15.162109375], + [22.6708984375, 14.7224609375], + [22.38154296875, 14.55048828125], + [22.53857421875, 14.161865234375], + [22.1064453125, 13.7998046875], + [22.228125, 13.32958984375], + [21.82529296875, 12.79052734375], + [21.928125, 12.678125], + [22.35234375, 12.66044921875], + [22.4724609375, 12.0677734375], + [22.58095703125, 11.99013671875], + [22.59111328125, 11.5798828125], + [22.92265625, 11.344873046875], + [22.86005859375, 10.919677734375], + [22.49384765625, 10.996240234375], + [21.771484375, 10.642822265625], + [21.68271484375, 10.28984375], + [20.7732421875, 9.40566406249999], + [20.34208984375, 9.12709960937499], + [18.95625, 8.93886718749999], + [18.88603515625, 8.83603515624999], + [19.10869140625, 8.65615234374999], + [18.56416015625, 8.0458984375], + [17.6494140625, 7.98359375], + [16.784765625, 7.5509765625], + [16.5453125, 7.865478515625], + [16.37890625, 7.683544921875], + [15.9576171875, 7.507568359375], + [15.480078125, 7.52377929687499], + [15.5498046875, 7.78789062499999], + [15.1162109375, 8.55732421875], + [14.33232421875, 9.20351562499999], + [13.97724609375, 9.69155273437499], + [14.24326171875, 9.979736328125], + [15.6548828125, 10.0078125], + [15.27607421875, 10.357373046875], + [15.1322265625, 10.648486328125], + [15.0298828125, 11.113671875], + [15.08125, 11.8455078125], + [14.8470703125, 12.502099609375], + [14.46171875, 13.02177734375], + [14.24482421875, 13.07734375], + [14.06396484375, 13.078515625], + [13.93232421875, 13.25849609375], + [13.60634765625, 13.70458984375], + [13.50576171875, 14.134423828125], + [13.4482421875, 14.3806640625], + [14.36796875, 15.750146484375], + [15.47431640625, 16.9083984375], + [15.73505859375, 19.904052734375], + [15.96318359375, 20.34619140625], + [15.587109375, 20.73330078125], + [15.60732421875, 20.95439453125], + [15.1818359375, 21.523388671875], + [14.97900390625, 22.99619140625], + [15.98408203125, 23.44521484375], + [20.14765625, 21.3892578125], + [23.9802734375, 19.496630859375] + ] + ] + }, + "properties": { + "name": "Chad", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [0.900488281250006, 10.99326171875], + [0.763378906250011, 10.386669921875], + [1.330078125, 9.99697265624999], + [1.3857421875, 9.36166992187499], + [1.60019531250001, 9.050048828125], + [1.62470703125001, 6.997314453125], + [1.53095703125001, 6.992431640625], + [1.77792968750001, 6.29462890625], + [1.62265625, 6.216796875], + [1.18720703125001, 6.08940429687499], + [0.736914062500006, 6.452587890625], + [0.525585937500011, 6.85092773437499], + [0.634765625, 7.35366210937499], + [0.5, 7.546875], + [0.686328125000017, 8.35488281249999], + [0.37255859375, 8.75927734375], + [0.48876953125, 8.85146484374999], + [0.525683593750017, 9.39848632812499], + [0.2333984375, 9.46352539062499], + [0.342578125000017, 9.60415039062499], + [0.264550781250023, 9.6447265625], + [0.380859375, 10.291845703125], + [-0.08632812499999, 10.673046875], + [0.009423828125023, 11.02099609375], + [-0.068603515625, 11.115625], + [0.49267578125, 10.95498046875], + [0.900488281250006, 10.99326171875] + ] + ] + }, + "properties": { + "name": "Togo", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [98.4090820312501, 7.90205078125004], + [98.2962890625, 7.77607421875005], + [98.3220703125001, 8.16630859374997], + [98.4349609375, 8.08564453124997], + [98.4090820312501, 7.90205078125004] + ] + ], + [ + [ + [100.070703125, 9.58603515625002], + [99.96240234375, 9.421630859375], + [99.9395507812501, 9.55996093750004], + [100.070703125, 9.58603515625002] + ] + ], + [ + [ + [102.4267578125, 11.988720703125], + [102.301953125, 11.980810546875], + [102.27744140625, 12.15185546875], + [102.4267578125, 11.988720703125] + ] + ], + [ + [ + [100.1224609375, 20.3166503906251], + [100.11494140625, 20.257666015625], + [100.13974609375, 20.24541015625], + [100.31796875, 20.3858886718751], + [100.51953125, 20.1779296875], + [100.39765625, 19.756103515625], + [100.51357421875, 19.553466796875], + [101.2119140625, 19.54833984375], + [101.22080078125, 19.4866210937501], + [101.19755859375, 19.3279296875001], + [101.286328125, 18.9771484375], + [101.04697265625, 18.4419921875001], + [101.0505859375, 18.40703125], + [101.1375, 18.286865234375], + [101.1439453125, 18.142626953125], + [100.90849609375, 17.58388671875], + [100.955859375, 17.54111328125], + [101.10517578125, 17.479541015625], + [101.16748046875, 17.4990234375], + [101.413671875, 17.71875], + [101.555078125, 17.812353515625], + [101.563671875, 17.8205078125], + [101.6875, 17.889404296875], + [101.7748046875, 18.0333984375], + [101.81865234375, 18.0646484375], + [101.87548828125, 18.046435546875], + [101.9474609375, 18.081494140625], + [102.0345703125, 18.16982421875], + [102.10146484375, 18.21064453125], + [102.1482421875, 18.203857421875], + [102.35185546875, 18.045947265625], + [102.4587890625, 17.9846191406251], + [102.5525390625, 17.965087890625], + [102.616796875, 17.833349609375], + [102.66064453125, 17.81796875], + [102.680078125, 17.82412109375], + [103.0513671875, 18.028515625], + [103.0912109375, 18.138232421875], + [103.14853515625, 18.221728515625], + [103.19970703125, 18.25947265625], + [103.26318359375, 18.2784667968751], + [103.27958984375, 18.30498046875], + [103.24892578125, 18.33896484375], + [103.2517578125, 18.373486328125], + [103.28828125, 18.4083984375], + [103.3669921875, 18.42333984375], + [103.48798828125, 18.4181640625], + [103.6296875, 18.382568359375], + [103.79228515625, 18.31650390625], + [103.898828125, 18.2953125], + [103.949609375, 18.3189941406251], + [104.04873046875, 18.21669921875], + [104.19619140625, 17.98837890625], + [104.32265625, 17.8158203125], + [104.428125, 17.698974609375], + [104.7396484375, 17.461669921875], + [104.816015625, 17.30029296875], + [104.758984375, 17.0771484375], + [104.7435546875, 16.884375], + [104.7505859375, 16.6475585937501], + [104.8193359375, 16.466064453125], + [105.04716796875, 16.16025390625], + [105.14873046875, 16.0935546875], + [105.3306640625, 16.037890625], + [105.40625, 15.9874511718751], + [105.39892578125, 15.8298828125], + [105.6220703125, 15.699951171875], + [105.641015625, 15.65654296875], + [105.6388671875, 15.5859375000001], + [105.615625, 15.4882812500001], + [105.4904296875, 15.256591796875], + [105.4904296875, 15.127587890625], + [105.5333984375, 15.0416015625], + [105.5466796875, 14.932470703125], + [105.523046875, 14.843310546875], + [105.49736328125, 14.590673828125], + [105.4755859375, 14.530126953125], + [105.42265625, 14.4716308593751], + [105.3421875, 14.4166992187501], + [105.24365234375, 14.3678710937501], + [105.18330078125, 14.346240234375], + [105.169140625, 14.336083984375], + [105.1259765625, 14.28095703125], + [105.07412109375, 14.22744140625], + [104.77900390625, 14.42783203125], + [103.1994140625, 14.3326171875], + [102.90927734375, 14.13671875], + [102.546875, 13.585693359375], + [102.336328125, 13.560302734375], + [102.499609375, 12.669970703125], + [102.7556640625, 12.42626953125], + [102.73662109375, 12.089794921875], + [102.93388671875, 11.706689453125], + [102.594140625, 12.20302734375], + [102.540234375, 12.109228515625], + [101.8357421875, 12.640380859375], + [100.89775390625, 12.65380859375], + [100.9626953125, 13.431982421875], + [100.6029296875, 13.5681640625], + [100.23564453125, 13.48447265625], + [99.9905273437501, 13.24345703125], + [100.08994140625, 13.045654296875], + [99.9639648437501, 12.6900390625], + [99.9890625000001, 12.17080078125], + [99.1650390625, 10.31982421875], + [99.25390625, 9.26523437500003], + [99.8355468750001, 9.28837890625003], + [99.9895507812501, 8.58920898437498], + [100.129296875, 8.42807617187501], + [100.1634765625, 8.50839843750003], + [100.27939453125, 8.26850585937501], + [100.54521484375, 7.22690429687499], + [100.43935546875, 7.28076171875004], + [100.38037109375, 7.54150390625004], + [100.2837890625, 7.55151367187504], + [100.256640625, 7.77490234374999], + [100.1607421875, 7.59926757812499], + [100.42353515625, 7.18784179687502], + [101.01787109375, 6.86093750000003], + [101.49794921875, 6.86528320312503], + [102.10107421875, 6.24223632812503], + [101.8736328125, 5.82529296874999], + [101.67841796875, 5.77880859375003], + [101.5560546875, 5.907763671875], + [101.11396484375, 5.63676757812505], + [100.981640625, 5.77104492187505], + [101.053515625, 6.242578125], + [100.87392578125, 6.24541015624996], + [100.7544921875, 6.46005859374999], + [100.34541015625, 6.54990234375001], + [100.26142578125, 6.68271484374996], + [100.119140625, 6.44199218750005], + [99.69599609375, 6.87666015625004], + [99.7203125000001, 7.106201171875], + [99.55302734375, 7.21879882812503], + [99.59697265625, 7.35561523437501], + [99.35859375, 7.37221679687502], + [99.263671875, 7.61904296875004], + [99.07763671875, 7.71806640625005], + [99.05107421875, 7.88784179687499], + [98.7886718750001, 8.05981445312503], + [98.703515625, 8.25673828125001], + [98.5791992187501, 8.34428710937499], + [98.4209960937501, 8.17822265625], + [98.3054687500001, 8.22622070312501], + [98.2417968750001, 8.76787109375005], + [98.7025390625001, 10.190380859375], + [98.7572265625, 10.6609375], + [99.1901367187501, 11.1052734375], + [99.61474609375, 11.781201171875], + [99.405078125, 12.547900390625], + [99.12392578125, 13.03076171875], + [99.1368164062501, 13.71669921875], + [98.57001953125, 14.359912109375], + [98.2021484375, 14.975927734375], + [98.1910156250001, 15.2041015625], + [98.5569335937501, 15.36767578125], + [98.5923828125001, 16.0506835937501], + [98.8179687500001, 16.180810546875], + [98.8882812500001, 16.351904296875], + [98.83544921875, 16.417578125], + [98.6607421875001, 16.330419921875], + [98.4388671875, 16.97568359375], + [97.7064453125, 17.797119140625], + [97.6322265625001, 18.2903320312501], + [97.37392578125, 18.51796875], + [97.7458984375, 18.58818359375], + [97.816796875, 19.4599609375001], + [98.0150390625001, 19.74951171875], + [98.3712890625, 19.68916015625], + [98.9166992187501, 19.772900390625], + [99.07421875, 20.099365234375], + [99.4859375000001, 20.149853515625], + [99.4588867187501, 20.363037109375], + [99.7201171875001, 20.325439453125], + [99.8903320312501, 20.4244140625], + [99.9542968750001, 20.4154296875], + [100.00361328125, 20.37958984375], + [100.1224609375, 20.3166503906251] + ] + ] + ] + }, + "properties": { + "name": "Thailand", + "childNum": 4 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [70.66416015625, 39.85546875], + [70.5595703125, 39.79091796875], + [70.4892578125, 39.863037109375], + [70.4828125000001, 39.8827148437501], + [70.49775390625, 39.882421875], + [70.56708984375, 39.8666015625001], + [70.66416015625, 39.85546875] + ] + ], + [ + [ + [70.9580078125, 40.2388671875], + [70.59921875, 39.97451171875], + [69.966796875, 40.20224609375], + [69.46875, 40.020751953125], + [69.47099609375, 39.990625], + [69.4319335937501, 39.909765625], + [69.3654296875, 39.9470703125], + [69.3072265625001, 39.9685546875], + [69.27880859375, 39.9177734375], + [69.2447265625001, 39.827099609375], + [69.2976562500001, 39.5248046875001], + [70.501171875, 39.587353515625], + [70.79931640625, 39.3947265625], + [71.4703125, 39.603662109375], + [71.5030273437501, 39.582177734375], + [71.5173828125, 39.553857421875], + [71.505859375, 39.51708984375], + [71.5033203125, 39.47880859375], + [71.7322265625, 39.422998046875], + [71.7786132812501, 39.277978515625], + [72.0427734375, 39.3521484375], + [72.0841796875, 39.31064453125], + [72.1473632812501, 39.2607421875], + [72.22998046875, 39.20751953125], + [72.63994140625, 39.385986328125], + [73.10927734375, 39.3619140625], + [73.2349609375, 39.374560546875], + [73.3361328125001, 39.4123535156251], + [73.38740234375, 39.442724609375], + [73.4704101562501, 39.460595703125], + [73.6316406250001, 39.448876953125], + [73.6363281250001, 39.3966796875], + [73.60732421875, 39.22919921875], + [73.8052734375, 38.96865234375], + [73.6960937500001, 38.854296875], + [73.80166015625, 38.606884765625], + [74.0255859375, 38.53984375], + [74.27744140625, 38.659765625], + [74.8123046875, 38.460302734375], + [74.8942382812501, 37.601416015625], + [75.11875, 37.385693359375], + [74.89130859375, 37.231640625], + [74.875390625, 37.2419921875], + [74.83046875, 37.2859375], + [74.7305664062501, 37.35703125], + [74.659375, 37.394482421875], + [74.3490234375001, 37.41875], + [74.2596679687501, 37.4154296875], + [74.2035156250001, 37.3724609375001], + [74.16708984375, 37.329443359375], + [73.7496093750001, 37.231787109375], + [73.6535156250001, 37.23935546875], + [73.6275390625001, 37.261572265625], + [73.71728515625, 37.329443359375], + [73.7337890625, 37.37578125], + [73.72060546875, 37.41875], + [73.6571289062501, 37.43046875], + [73.6046875000001, 37.446044921875], + [73.48134765625, 37.4716796875], + [73.3829101562501, 37.462255859375], + [73.2111328125, 37.40849609375], + [72.8955078125, 37.267529296875], + [72.657421875, 37.029052734375], + [71.665625, 36.696923828125], + [71.530859375, 36.8451171875], + [71.4329101562501, 37.1275390625], + [71.5822265625001, 37.910107421875], + [71.551953125, 37.933154296875], + [71.48779296875, 37.931884765625], + [71.3896484375, 37.906298828125], + [71.3199218750001, 37.90185546875], + [71.278515625, 37.918408203125], + [71.33271484375, 38.170263671875], + [71.255859375, 38.306982421875], + [70.7359375, 38.42255859375], + [70.4177734375, 38.075439453125], + [70.2146484375, 37.9244140625001], + [70.1994140625, 37.88603515625], + [70.2549804687501, 37.765380859375], + [70.25146484375, 37.6641601562501], + [70.188671875, 37.582470703125], + [70.11982421875, 37.543505859375], + [69.9849609375, 37.566162109375], + [69.8208984375, 37.6095703125], + [69.62578125, 37.59404296875], + [69.49208984375, 37.553076171875], + [69.4201171875, 37.48671875], + [69.3992187500001, 37.39931640625], + [69.4296875, 37.290869140625], + [69.414453125, 37.207763671875], + [69.3538085937501, 37.150048828125], + [69.3039062500001, 37.116943359375], + [69.26484375, 37.1083984375], + [69.18017578125, 37.15830078125], + [68.96044921875, 37.325048828125], + [68.9118164062501, 37.333935546875], + [68.88525390625, 37.328076171875], + [68.8553710937501, 37.316845703125], + [68.8384765625001, 37.30283203125], + [68.82373046875, 37.270703125], + [68.78203125, 37.2580078125], + [68.7232421875, 37.268017578125], + [68.6691406250001, 37.2583984375], + [68.3869140625001, 37.1375], + [68.29951171875, 37.088427734375], + [68.2847656250001, 37.036328125], + [68.2609375000001, 37.0130859375], + [68.2121093750001, 37.021533203125], + [68.0677734375, 36.9498046875], + [67.9580078125, 36.972021484375], + [67.83447265625, 37.0642089843751], + [67.758984375, 37.172216796875], + [67.7980468750001, 37.244970703125], + [67.8143554687501, 37.48701171875], + [68.3502929687501, 38.21103515625], + [68.08720703125, 38.47353515625], + [68.13251953125, 38.92763671875], + [67.6944335937501, 38.99462890625], + [67.6483398437501, 39.1310546875], + [67.3576171875001, 39.21669921875], + [67.426171875, 39.465576171875], + [67.7190429687501, 39.62138671875], + [68.46328125, 39.53671875], + [68.6389648437501, 39.8388671875], + [68.86875, 39.907470703125], + [68.8046875, 40.050341796875], + [68.9720703125, 40.08994140625], + [68.6306640625001, 40.16708984375], + [69.27490234375, 40.198095703125], + [69.20625, 40.566552734375], + [69.3572265625, 40.7673828125], + [69.712890625, 40.656982421875], + [70.4019531250001, 41.035107421875], + [70.7510742187501, 40.72177734375], + [70.37158203125, 40.3841308593751], + [70.653125, 40.201171875], + [70.9580078125, 40.2388671875] + ] + ] + ] + }, + "properties": { + "name": "Tajikistan", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [66.5222656250001, 37.3484863281251], + [66.471875, 37.3447265625], + [65.7650390625, 37.569140625], + [65.55498046875, 37.251171875], + [65.3036132812501, 37.24677734375], + [65.0896484375001, 37.237939453125], + [64.9515625, 37.1935546875], + [64.8163085937501, 37.132080078125], + [64.7824218750001, 37.05927734375], + [64.6025390625, 36.554541015625], + [64.5658203125, 36.427587890625], + [64.51103515625, 36.340673828125], + [64.184375, 36.14892578125], + [63.8625, 36.012353515625], + [63.1299804687501, 35.84619140625], + [63.1697265625001, 35.678125], + [63.056640625, 35.44580078125], + [62.9802734375, 35.4091796875], + [62.8580078125001, 35.349658203125], + [62.6880859375, 35.255322265625], + [62.3078125000001, 35.1708007812501], + [62.0896484375, 35.3796875], + [61.6209960937501, 35.43232421875], + [61.3447265625, 35.6294921875001], + [61.26201171875, 35.619580078125], + [61.2521484375, 35.867626953125], + [61.1529296875001, 35.9767578125], + [61.21201171875, 36.19052734375], + [61.11962890625, 36.642578125], + [60.34130859375, 36.637646484375], + [60.06279296875, 36.962890625], + [59.45498046875, 37.25283203125], + [59.3017578125, 37.5106445312501], + [58.8154296875, 37.68349609375], + [58.26162109375, 37.6658203125], + [57.3537109375, 37.97333984375], + [57.1935546875001, 38.21640625], + [56.440625, 38.2494140625], + [56.2720703125, 38.080419921875], + [55.380859375, 38.051123046875], + [54.90009765625, 37.7779296875001], + [54.6994140625001, 37.470166015625], + [53.9141601562501, 37.3435546875], + [53.86865234375, 38.949267578125], + [53.70458984375, 39.2095703125], + [53.3363281250001, 39.3408203125001], + [53.156640625, 39.2649902343751], + [53.23564453125, 39.608544921875], + [53.603125, 39.54697265625], + [53.472265625, 39.668798828125], + [53.4873046875, 39.909375], + [52.9875, 39.98759765625], + [53.0355468750001, 39.7744140625], + [52.8046875, 40.05400390625], + [52.73369140625, 40.39873046875], + [52.94345703125, 41.0380859375001], + [53.1452148437501, 40.824951171875], + [53.615234375, 40.818505859375], + [53.8700195312501, 40.648681640625], + [54.37734375, 40.69326171875], + [54.31943359375, 40.8345703125], + [54.68505859375, 40.873046875], + [54.7037109375001, 41.071142578125], + [54.09482421875, 41.5193847656251], + [53.8046875, 42.117626953125], + [53.1641601562501, 42.093798828125], + [52.97001953125, 41.9762207031251], + [52.81484375, 41.71181640625], + [52.8503906250001, 41.2002929687501], + [52.4938476562501, 41.78037109375], + [53.0558593750001, 42.14775390625], + [54.12099609375, 42.335205078125], + [54.85380859375, 41.965185546875], + [55.434375, 41.2962890625], + [55.9774414062501, 41.322216796875], + [57.01796875, 41.2634765625], + [57.11884765625, 41.35029296875], + [56.9640625, 41.85654296875], + [57.290625, 42.123779296875], + [57.8142578125001, 42.1898437500001], + [58.02890625, 42.4876464843751], + [58.4744140625001, 42.299365234375], + [58.1515625, 42.628076171875], + [58.4771484375, 42.662841796875], + [58.5890625000001, 42.778466796875], + [59.354296875, 42.323291015625], + [59.98515625, 42.21171875], + [59.941796875, 41.97353515625], + [60.2007812500001, 41.803125], + [60.0755859375001, 41.75966796875], + [60.0896484375001, 41.3994140625], + [60.45498046875, 41.221630859375], + [61.2423828125001, 41.189208984375], + [61.49697265625, 41.27607421875], + [61.90283203125, 41.093701171875], + [62.483203125, 39.975634765625], + [63.763671875, 39.160546875], + [64.3099609375, 38.977294921875], + [65.612890625, 38.23857421875], + [65.97119140625, 38.24423828125], + [66.60625, 37.9867187500001], + [66.5255859375, 37.7857421875], + [66.5113281250001, 37.599169921875], + [66.51064453125, 37.45869140625], + [66.5222656250001, 37.3484863281251] + ] + ] + }, + "properties": { + "name": "Turkmenistan", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [124.036328125, -9.34160156250003], + [124.44443359375, -9.19033203125002], + [124.28232421875, -9.42792968750003], + [124.036328125, -9.34160156250003] + ] + ], + [ + [ + [125.0681640625, -9.5119140625], + [124.96015625, -9.21376953125001], + [125.10048828125, -9.18984375000002], + [125.1490234375, -9.04257812500003], + [124.93681640625, -9.05341796875003], + [124.922265625, -8.94248046874998], + [125.17802734375, -8.64785156249999], + [125.3818359375, -8.57539062499998], + [126.6197265625, -8.45947265624999], + [126.96640625, -8.31572265625002], + [127.29609375, -8.42451171874997], + [126.915234375, -8.71523437499997], + [125.4080078125, -9.27578125000002], + [125.0681640625, -9.5119140625] + ] + ], + [ + [ + [125.64609375, -8.13994140625], + [125.5794921875, -8.31181640625002], + [125.50712890625, -8.27509765625], + [125.64609375, -8.13994140625] + ] + ] + ] + }, + "properties": { + "name": "Timor-Leste", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-175.1619140625, -21.1693359375], + [-175.078173828125, -21.12900390625], + [-175.156591796875, -21.263671875], + [-175.362353515625, -21.1068359375], + [-175.1619140625, -21.1693359375] + ] + ], + [ + [ + [-173.953515625, -18.63935546875], + [-174.069140625, -18.640234375], + [-173.96806640625, -18.56533203125], + [-173.953515625, -18.63935546875] + ] + ] + ] + }, + "properties": { + "name": "Tonga", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.012109375, 10.134326171875], + [-61.906103515625, 10.069140625], + [-61.49931640625, 10.2685546875], + [-61.478271484375, 10.603369140625], + [-61.6511718749999, 10.71806640625], + [-60.917626953125, 10.840234375], + [-61.033740234375, 10.669873046875], + [-61.012109375, 10.134326171875] + ] + ] + }, + "properties": { + "name": "Trinidad and Tobago", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10.9576171875001, 33.7220703125001], + [10.7220703125001, 33.738916015625], + [10.7452148437501, 33.8886718750001], + [11.01787109375, 33.82333984375], + [10.9576171875001, 33.7220703125001] + ] + ], + [ + [ + [11.2780273437501, 34.75380859375], + [11.1236328125001, 34.681689453125], + [11.2548828125001, 34.8203125000001], + [11.2780273437501, 34.75380859375] + ] + ], + [ + [ + [10.274609375, 31.6849609375], + [10.1149414062501, 31.4637695312501], + [10.2164062500001, 30.783203125], + [10.059765625, 30.580078125], + [9.93251953125005, 30.425341796875], + [9.89501953125003, 30.3873046875], + [9.51875, 30.22939453125], + [9.22402343750002, 31.373681640625], + [9.16025390625001, 31.621337890625], + [9.04404296875003, 32.07236328125], + [8.33339843750005, 32.543603515625], + [8.1125, 33.055322265625], + [7.87724609375002, 33.172119140625], + [7.534375, 33.717919921875], + [7.51386718750007, 34.080517578125], + [8.24560546875, 34.73408203125], + [8.27685546875006, 34.9794921875], + [8.31210937500006, 35.084619140625], + [8.39423828125001, 35.203857421875], + [8.31806640625001, 35.654931640625], + [8.34873046875006, 36.36796875], + [8.20761718750001, 36.5189453125], + [8.60126953125007, 36.833935546875], + [8.57656250000002, 36.93720703125], + [9.68798828125006, 37.340380859375], + [9.83847656250006, 37.308984375], + [9.83027343749998, 37.1353515625001], + [9.87558593749998, 37.254150390625], + [10.1963867187501, 37.205859375], + [10.2932617187501, 36.781494140625], + [10.4123046875, 36.7318359375], + [11.0539062500001, 37.0725097656251], + [11.12666015625, 36.874072265625], + [10.4765625, 36.175146484375], + [10.5908203125, 35.887255859375], + [11.0042968750001, 35.633837890625], + [11.1201171875001, 35.240283203125], + [10.69091796875, 34.678466796875], + [10.1183593750001, 34.280078125], + [10.0490234375001, 34.056298828125], + [10.3052734375, 33.728271484375], + [10.71318359375, 33.689013671875], + [10.72275390625, 33.514404296875], + [10.9580078125001, 33.626318359375], + [11.257421875, 33.3088378906251], + [11.20263671875, 33.24921875], + [11.50458984375, 33.18193359375], + [11.50244140625, 33.15556640625], + [11.4671875000001, 32.9657226562501], + [11.4591796875, 32.89736328125], + [11.45390625, 32.642578125], + [11.5337890625, 32.524951171875], + [11.5359375, 32.47333984375], + [11.50498046875, 32.413671875], + [11.3580078125, 32.34521484375], + [11.1682617187501, 32.25673828125], + [11.0051757812501, 32.1727050781251], + [10.8263671875001, 32.0806640625], + [10.77158203125, 32.02119140625], + [10.60888671875, 31.929541015625], + [10.47578125, 31.73603515625], + [10.274609375, 31.6849609375] + ] + ] + ] + }, + "properties": { + "name": "Tunisia", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [25.97001953125, 40.136328125], + [25.6689453125, 40.135888671875], + [25.918359375, 40.23798828125], + [25.97001953125, 40.136328125] + ] + ], + [ + [ + [43.4333984375, 41.155517578125], + [43.439453125, 41.10712890625], + [43.72265625, 40.71953125], + [43.5693359375, 40.482373046875], + [43.6662109375, 40.1263671875], + [44.2892578125, 40.040380859375], + [44.76826171875, 39.7035156250001], + [44.8171875, 39.650439453125], + [44.587109375, 39.7685546875001], + [44.3893554687501, 39.422119140625], + [44.0232421875, 39.3774414062501], + [44.2716796875, 38.8360351562501], + [44.2985351562501, 38.386279296875], + [44.4499023437501, 38.3342285156251], + [44.211328125, 37.908056640625], + [44.58994140625, 37.7103515625], + [44.5740234375001, 37.435400390625], + [44.794140625, 37.290380859375], + [44.76513671875, 37.142431640625], + [44.73095703125, 37.165283203125], + [44.6693359375001, 37.173583984375], + [44.60595703125, 37.176025390625], + [44.401953125, 37.05849609375], + [44.3255859375, 37.0107421875], + [44.2818359375001, 36.97802734375], + [44.2457031250001, 36.98330078125], + [44.20166015625, 37.051806640625], + [44.2083984375, 37.20263671875], + [44.191796875, 37.249853515625], + [44.15625, 37.282958984375], + [44.114453125, 37.3018554687501], + [44.01318359375, 37.313525390625], + [43.83642578125, 37.22353515625], + [43.67578125, 37.22724609375], + [43.09248046875, 37.3673828125], + [42.93662109375, 37.324755859375], + [42.774609375, 37.371875], + [42.7411132812501, 37.3619140625], + [42.6354492187501, 37.249267578125], + [42.455859375, 37.1287109375], + [42.358984375, 37.10859375], + [42.312890625, 37.22958984375], + [42.2685546875, 37.2765625], + [42.24755859375, 37.2822265625001], + [42.2027343750001, 37.297265625], + [42.1678710937501, 37.288623046875], + [42.0598632812501, 37.2060546875], + [41.88681640625, 37.156396484375], + [40.7056640625001, 37.097705078125], + [40.4503906250001, 37.0088867187501], + [40.0164062500001, 36.82607421875], + [39.6865234375, 36.7386230468751], + [39.50146484375, 36.70224609375], + [39.356640625, 36.681591796875], + [39.1083984375, 36.6805664062501], + [38.9064453125, 36.694677734375], + [38.7666015625, 36.693115234375], + [38.19169921875, 36.9015625], + [37.9066406250001, 36.79462890625], + [37.7203125, 36.743701171875], + [37.5235351562501, 36.6783203125], + [37.4363281250001, 36.643310546875], + [37.32705078125, 36.6465820312501], + [37.1874023437501, 36.655908203125], + [37.0662109375001, 36.65263671875], + [36.9853515625, 36.7023925781251], + [36.941796875, 36.7583984375], + [36.7765625, 36.79267578125], + [36.6585937500001, 36.8025390625], + [36.62841796875, 36.777685546875], + [36.596875, 36.7013671875], + [36.5466796875001, 36.50634765625], + [36.5375, 36.457421875], + [36.63671875, 36.233984375], + [36.375390625, 36.171240234375], + [36.34755859375, 36.003515625], + [36.201953125, 35.937548828125], + [36.15361328125, 35.8338867187501], + [36.12734375, 35.8314453125], + [35.9675781250001, 35.91005859375], + [35.8926757812501, 35.916552734375], + [35.8109375000001, 36.30986328125], + [36.1884765625, 36.658984375], + [36.04892578125, 36.910595703125], + [35.3931640625, 36.5751953125], + [34.70361328125, 36.816796875], + [33.6947265625, 36.181982421875], + [32.79482421875, 36.035888671875], + [32.377734375, 36.183642578125], + [32.02197265625, 36.535302734375], + [31.3525390625, 36.80107421875], + [30.64404296875, 36.865673828125], + [30.4460937500001, 36.269873046875], + [29.6890625, 36.156689453125], + [29.2236328125, 36.324462890625], + [28.9696289062501, 36.71533203125], + [28.3037109375001, 36.811962890625], + [28.0194335937501, 36.63447265625], + [28.0839843750001, 36.75146484375], + [27.45390625, 36.712158203125], + [28.00537109375, 36.831982421875], + [28.2423828125001, 37.029052734375], + [27.26298828125, 36.9765625], + [27.3001953125001, 37.12685546875], + [27.5350585937501, 37.1638671875], + [27.06796875, 37.65791015625], + [27.2244140625001, 37.725439453125], + [27.232421875, 37.978662109375], + [26.29072265625, 38.277197265625], + [26.4413085937501, 38.6412109375], + [26.6742187500001, 38.3357421875], + [27.14423828125, 38.451953125], + [26.9068359375, 38.48173828125], + [26.763671875, 38.709619140625], + [27.0136718750001, 38.886865234375], + [26.8149414062501, 38.960986328125], + [26.85361328125, 39.115625], + [26.6818359375, 39.292236328125], + [26.89921875, 39.549658203125], + [26.1130859375001, 39.4673828125], + [26.1013671875001, 39.5689453125], + [26.18134765625, 39.990087890625], + [26.7380859375, 40.4002441406251], + [27.2845703125001, 40.455615234375], + [27.4755859375, 40.319921875], + [27.72802734375, 40.32880859375], + [27.8485351562501, 40.38173828125], + [27.7318359375001, 40.481494140625], + [27.8749023437501, 40.512939453125], + [27.9895507812501, 40.489453125], + [27.96259765625, 40.369873046875], + [29.00712890625, 40.38974609375], + [28.787890625, 40.534033203125], + [28.9580078125, 40.63056640625], + [29.8492187500001, 40.760107421875], + [29.1138671875, 40.9378417968751], + [29.14814453125, 41.221044921875], + [31.2548828125, 41.1076171875], + [31.4580078125, 41.32001953125], + [32.3064453125001, 41.72958984375], + [33.38134765625, 42.017578125], + [34.75048828125, 41.9568359375], + [35.0064453125, 42.06328125], + [35.1548828125001, 42.0275390625], + [35.1220703125, 41.89111328125], + [35.29775390625, 41.728515625], + [35.5580078125, 41.6340332031251], + [36.0517578125, 41.682568359375], + [36.4053710937501, 41.274609375], + [36.777734375, 41.3634765625], + [37.0662109375001, 41.184423828125], + [38.3810546875, 40.92451171875], + [39.4263671875, 41.1064453125], + [40.2652343750001, 40.9613281250001], + [41.0835937500001, 41.261181640625], + [41.41435546875, 41.4236328125], + [41.5100585937501, 41.51748046875], + [41.7017578125001, 41.47158203125], + [41.7793945312501, 41.44052734375], + [41.8235351562501, 41.432373046875], + [41.92578125, 41.495654296875], + [42.46640625, 41.43984375], + [42.5673828125, 41.55927734375], + [42.5904296875, 41.570703125], + [42.6068359375001, 41.57880859375], + [42.6824218750001, 41.5857421875], + [42.7541015625, 41.57890625], + [42.7878906250001, 41.563720703125], + [42.8216796875001, 41.4923828125], + [42.90673828125, 41.466845703125], + [43.05712890625, 41.35283203125], + [43.1490234375, 41.30712890625], + [43.1712890625, 41.287939453125], + [43.141015625, 41.26484375], + [43.15283203125, 41.2364257812501], + [43.2054687500001, 41.199169921875], + [43.4333984375, 41.155517578125] + ] + ], + [ + [ + [27.4748046875, 41.946875], + [28.014453125, 41.96904296875], + [28.1978515625001, 41.5544921875], + [29.0572265625, 41.229736328125], + [28.95625, 41.008203125], + [28.1721679687501, 41.080712890625], + [27.4994140625001, 40.97314453125], + [27.2580078125, 40.687353515625], + [26.7720703125, 40.498046875], + [26.202734375, 40.075390625], + [26.2538085937501, 40.314697265625], + [26.79208984375, 40.626611328125], + [26.10546875, 40.611328125], + [26.0389648437501, 40.7267578125], + [26.3310546875001, 40.9544921875], + [26.3306640625, 41.23876953125], + [26.6249023437501, 41.4017578125], + [26.5813476562501, 41.60126953125], + [26.3208984375, 41.716552734375], + [26.3603515625, 41.8015625], + [26.51142578125, 41.8263671875], + [26.54970703125, 41.896728515625], + [26.5796875, 41.94794921875], + [26.6153320312501, 41.964892578125], + [26.88486328125, 41.991845703125], + [26.96875, 42.0268554687501], + [27.01171875, 42.058642578125], + [27.1933593750001, 42.077099609375], + [27.2443359375, 42.09326171875], + [27.2949218750001, 42.079541015625], + [27.4748046875, 41.946875] + ] + ] + ] + }, + "properties": { + "name": "Turkey", + "childNum": 3 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [39.711328125, -7.97744140625002], + [39.6029296875, -7.93613281249995], + [39.90712890625, -7.64921875000003], + [39.711328125, -7.97744140625002] + ] + ], + [ + [ + [39.496484375, -6.174609375], + [39.5730468750001, -6.38740234375001], + [39.48095703125, -6.45371093750002], + [39.18232421875, -6.17255859375003], + [39.308984375, -5.72197265624997], + [39.496484375, -6.174609375] + ] + ], + [ + [ + [39.8650390625, -4.90615234375004], + [39.74931640625, -5.44384765624999], + [39.6467773437501, -5.36855468750001], + [39.6734375, -4.92705078125003], + [39.8650390625, -4.90615234375004] + ] + ], + [ + [ + [33.9032226562501, -1.00205078125003], + [37.6438476562501, -3.04541015625003], + [37.6082031250001, -3.49707031250003], + [39.22177734375, -4.69238281250001], + [38.8046875, -6.07011718750003], + [38.8740234375, -6.33125], + [39.5460937500001, -7.02402343750003], + [39.2884765625, -7.51787109375], + [39.2870117187501, -7.78769531250001], + [39.4284179687501, -7.81279296874996], + [39.441015625, -8.01152343749995], + [39.3040039062501, -8.44384765625], + [39.45126953125, -8.94296875], + [39.64130859375, -9.19248046875002], + [39.7251953125001, -10.00048828125], + [40.46357421875, -10.46435546875], + [39.988671875, -10.82080078125], + [39.81708984375, -10.91240234375], + [38.9875, -11.16728515625], + [38.4917968750001, -11.41328125], + [37.92021484375, -11.2947265625], + [37.7248046875, -11.5806640625], + [37.54169921875, -11.67509765625], + [37.3728515625, -11.71044921875], + [36.9789062500001, -11.5669921875], + [36.3056640625, -11.7063476562499], + [36.19130859375, -11.670703125], + [36.17548828125, -11.60927734375], + [36.0822265625, -11.5373046875], + [35.911328125, -11.4546875], + [35.7854492187501, -11.4529296875], + [35.6309570312501, -11.58203125], + [35.56435546875, -11.60234375], + [35.4182617187501, -11.583203125], + [35.1826171875, -11.5748046875], + [34.95947265625, -11.578125], + [34.93701171875, -11.4634765625], + [34.890625, -11.3935546875], + [34.7738281250001, -11.34169921875], + [34.60791015625, -11.08046875], + [34.6670898437501, -10.79248046875], + [34.5699218750001, -10.24111328125], + [34.3208984375001, -9.73154296874998], + [33.99560546875, -9.49541015625], + [33.8888671875, -9.67011718749998], + [32.919921875, -9.40742187500003], + [32.756640625, -9.322265625], + [31.942578125, -9.05400390624996], + [31.91865234375, -8.94218750000002], + [31.8861328125, -8.92197265624998], + [31.81806640625, -8.90224609374995], + [31.6736328125, -8.90878906249996], + [31.55625, -8.80546875], + [31.44921875, -8.65390625], + [31.3505859375, -8.60703125000003], + [31.0763671875, -8.61191406249996], + [30.9683593750001, -8.55097656249998], + [30.8919921875001, -8.47373046874996], + [30.8306640625001, -8.38554687500003], + [30.7208984375001, -8.10439453125004], + [30.40673828125, -7.46064453124998], + [30.3131835937501, -7.20371093749995], + [30.2126953125, -7.03789062500002], + [30.10625, -6.91503906250003], + [29.96181640625, -6.803125], + [29.79814453125, -6.69189453124996], + [29.70966796875, -6.61689453125004], + [29.590625, -6.39443359375002], + [29.5408203125, -6.31386718750004], + [29.50625, -6.17207031250001], + [29.480078125, -6.025], + [29.4908203125001, -5.96542968750002], + [29.59638671875, -5.77597656249996], + [29.60703125, -5.72265625000003], + [29.5941406250001, -5.65078125000004], + [29.5423828125, -5.49980468750002], + [29.3427734375, -4.98310546875], + [29.3234375, -4.89882812499997], + [29.32568359375, -4.83564453124997], + [29.40419921875, -4.49667968750002], + [29.4032226562501, -4.44931640624996], + [29.7177734375, -4.45585937499996], + [29.947265625, -4.30732421874998], + [30.4, -3.65390625], + [30.7902343750001, -3.27460937500001], + [30.8111328125, -3.11640625000001], + [30.7802734375, -2.98486328124996], + [30.70947265625, -2.97724609375], + [30.6042968750001, -2.93525390624997], + [30.5150390625, -2.917578125], + [30.45556640625, -2.89316406250001], + [30.43349609375, -2.87451171875003], + [30.4240234375001, -2.82402343749996], + [30.4733398437501, -2.6943359375], + [30.4242187500001, -2.64160156250001], + [30.4419921875, -2.61347656249997], + [30.53369140625, -2.42626953125001], + [30.5536132812501, -2.40009765625001], + [30.5933593750001, -2.39677734374996], + [30.6566406250001, -2.37382812499999], + [30.71484375, -2.36347656250001], + [30.7625, -2.37167968749999], + [30.8287109375, -2.33847656249998], + [30.85498046875, -2.26542968750002], + [30.8765625, -2.14335937500002], + [30.8646484375, -2.04404296874995], + [30.819140625, -1.96748046874998], + [30.81259765625, -1.56308593750002], + [30.76220703125, -1.45869140624998], + [30.7107421875001, -1.39677734374997], + [30.63193359375, -1.36748046874996], + [30.5081054687501, -1.20820312500003], + [30.47021484375, -1.13115234374996], + [30.47705078125, -1.0830078125], + [30.5099609375001, -1.06728515624999], + [30.519921875, -1.0625], + [30.6727539062501, -1.05136718749995], + [30.7419921875, -1.00751953125], + [30.8091796875001, -0.994921875], + [30.8236328125001, -0.999023437499943], + [30.8447265625, -1.00205078125003], + [32.371875, -1.00205078125003], + [33.9032226562501, -1.00205078125003] + ] + ] + ] + }, + "properties": { + "name": "Tanzania", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [30.5099609375, -1.06728515625001], + [30.469921875, -1.066015625], + [30.4123046875, -1.06308593750001], + [30.36025390625, -1.074609375], + [29.930078125, -1.46992187500001], + [29.825390625, -1.335546875], + [29.576953125, -1.38789062500001], + [29.71767578125, 0.098339843749997], + [29.93447265625, 0.4990234375], + [29.94287109375, 0.819238281249994], + [31.252734375, 2.04458007812499], + [31.1763671875, 2.27006835937499], + [30.72861328125, 2.45537109374999], + [30.8466796875, 2.84702148437499], + [30.75400390625, 3.04179687499999], + [30.9064453125, 3.408935546875], + [30.83857421875, 3.49072265625], + [31.15234375, 3.785595703125], + [31.54716796875, 3.67758789062499], + [31.798046875, 3.80263671874999], + [32.1359375, 3.5197265625], + [32.3357421875, 3.70620117187499], + [32.997265625, 3.88017578124999], + [33.48935546875, 3.755078125], + [33.56845703125, 3.81171875], + [33.7416015625, 3.98525390624999], + [33.97607421875, 4.22021484375], + [34.13203125, 3.88916015625], + [34.1857421875, 3.86977539062499], + [34.1650390625, 3.81298828125], + [34.26708984375, 3.733154296875], + [34.39287109375, 3.69150390624999], + [34.4376953125, 3.6505859375], + [34.441796875, 3.60625], + [34.3994140625, 3.41269531249999], + [34.4072265625, 3.35751953124999], + [34.4478515625, 3.16347656249999], + [34.90576171875, 2.4796875], + [34.8830078125, 2.417919921875], + [34.9640625, 2.06240234374999], + [34.9775390625, 1.86191406249999], + [34.97646484375, 1.71962890624999], + [34.7986328125, 1.24453125], + [34.48173828125, 1.04213867187499], + [34.41083984375, 0.867285156249991], + [34.1609375, 0.605175781249997], + [33.9431640625, 0.173779296874997], + [33.90322265625, -1.00205078125001], + [32.371875, -1.00205078125001], + [30.8447265625, -1.00205078125001], + [30.8236328125, -0.9990234375], + [30.8091796875, -0.994921875], + [30.7419921875, -1.00751953125001], + [30.67275390625, -1.05136718750001], + [30.59873046875, -1.06972656250001], + [30.519921875, -1.0625], + [30.5099609375, -1.06728515625001] + ] + ] + }, + "properties": { + "name": "Uganda", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [32.01220703125, 46.20390625], + [32.15009765625, 46.1546875], + [31.5638671875001, 46.257763671875], + [31.5087890625, 46.37314453125], + [32.01220703125, 46.20390625] + ] + ], + [ + [ + [38.21435546875, 47.091455078125], + [37.543359375, 47.074560546875], + [36.79482421875, 46.714404296875], + [36.5587890625, 46.7626953125001], + [35.8271484375, 46.62431640625], + [35.0145507812501, 46.106005859375], + [35.28017578125, 46.2794921875], + [35.2303710937501, 46.440625], + [34.849609375, 46.189892578125], + [35.0228515625001, 45.7009765625], + [35.45751953125, 45.31630859375], + [36.1705078125, 45.453076171875], + [36.575, 45.3935546875], + [36.393359375, 45.065380859375], + [35.8701171875, 45.005322265625], + [35.47255859375, 45.098486328125], + [35.0876953125, 44.80263671875], + [34.469921875, 44.7216796875], + [33.9099609375001, 44.38759765625], + [33.45068359375, 44.553662109375], + [33.55517578125, 45.09765625], + [32.5080078125001, 45.4038085937501], + [33.6648437500001, 45.9470703125], + [33.5941406250001, 46.096240234375], + [33.4298828125, 46.0576171875], + [33.2022460937501, 46.175732421875], + [32.4767578125, 46.08369140625], + [31.83125, 46.281689453125], + [32.00849609375, 46.42998046875], + [31.5548828125001, 46.554296875], + [32.361328125, 46.474951171875], + [32.57802734375, 46.615625], + [32.0443359375001, 46.64248046875], + [31.7591796875001, 47.212841796875], + [31.8728515625, 46.649755859375], + [31.53212890625, 46.66474609375], + [31.5633789062501, 46.777294921875], + [31.4029296875001, 46.62880859375], + [30.7962890625, 46.552001953125], + [30.2190429687501, 45.866748046875], + [29.62841796875, 45.7224609375], + [29.7058593750001, 45.2599121093751], + [29.5676757812501, 45.37080078125], + [29.4037109375001, 45.419677734375], + [29.2235351562501, 45.4029296875], + [28.8943359375, 45.28994140625], + [28.78173828125, 45.30986328125], + [28.7666015625, 45.28623046875], + [28.78828125, 45.240966796875], + [28.45126953125, 45.2921875], + [28.31767578125, 45.347119140625], + [28.2125, 45.4504394531251], + [28.26484375, 45.48388671875], + [28.3103515625001, 45.498583984375], + [28.4990234375001, 45.517724609375], + [28.51376953125, 45.572412109375], + [28.4916015625001, 45.665771484375], + [28.5623046875001, 45.735791015625], + [28.667578125, 45.79384765625], + [28.7292968750001, 45.852001953125], + [28.73876953125, 45.937158203125], + [28.8495117187501, 45.978662109375], + [28.94775390625, 46.049951171875], + [28.971875, 46.12763671875], + [29.00625, 46.17646484375], + [28.94375, 46.2884277343751], + [28.93056640625, 46.362255859375], + [28.92744140625, 46.42412109375], + [28.9583984375, 46.45849609375], + [29.1462890625, 46.526904296875], + [29.1862304687501, 46.523974609375], + [29.20078125, 46.50498046875], + [29.20458984375, 46.379345703125], + [29.2238281250001, 46.376953125], + [29.4587890625, 46.453759765625], + [29.837890625, 46.350537109375], + [29.8780273437501, 46.360205078125], + [30.07568359375, 46.37783203125], + [30.1310546875001, 46.4230957031251], + [29.92431640625, 46.5388671875], + [29.9347656250001, 46.625], + [29.9424804687501, 46.723779296875], + [29.9180664062501, 46.782421875], + [29.87783203125, 46.82890625], + [29.57197265625, 46.964013671875], + [29.4556640625, 47.292626953125], + [29.13486328125, 47.489697265625], + [29.125390625, 47.96455078125], + [28.423046875, 48.146875], + [28.34052734375, 48.14443359375], + [27.5492187500001, 48.477734375], + [27.228515625, 48.3714355468751], + [26.9005859375, 48.3719238281251], + [26.8470703125, 48.387158203125], + [26.6404296875, 48.294140625], + [26.6189453125, 48.2598632812501], + [26.4423828125, 48.22998046875], + [26.1626953125001, 47.992529296875], + [25.90869140625, 47.967578125], + [25.6892578125, 47.9324707031251], + [25.4642578125001, 47.910791015625], + [24.9791015625001, 47.72412109375], + [24.5789062500001, 47.9310546875001], + [23.6287109375, 47.995849609375], + [23.408203125, 47.9899902343751], + [23.20263671875, 48.084521484375], + [23.139453125, 48.08740234375], + [22.87666015625, 47.9472656250001], + [22.7691406250001, 48.109619140625], + [22.582421875, 48.134033203125], + [22.2537109375, 48.407373046875], + [22.1318359375001, 48.405322265625], + [22.14287109375, 48.568505859375], + [22.29521484375, 48.68583984375], + [22.389453125, 48.873486328125], + [22.52412109375, 49.031396484375], + [22.538671875, 49.072705078125], + [22.8470703125, 49.08125], + [22.7056640625, 49.17119140625], + [22.6494140625, 49.539013671875], + [22.70615234375, 49.606201171875], + [23.036328125, 49.899072265625], + [23.71171875, 50.37734375], + [23.97265625, 50.41005859375], + [24.08994140625, 50.53046875], + [24.0947265625, 50.617041015625], + [23.9970703125, 50.809375], + [24.0958007812501, 50.87275390625], + [23.664453125, 51.31005859375], + [23.61376953125, 51.525390625], + [23.7068359375, 51.64130859375], + [23.79169921875, 51.637109375], + [23.8642578125001, 51.623974609375], + [23.951171875, 51.58505859375], + [23.9783203125, 51.59130859375], + [24.1268554687501, 51.6646484375], + [24.280078125, 51.77470703125], + [24.3619140625, 51.867529296875], + [25.7857421875, 51.923828125], + [26.7734375, 51.770703125], + [26.95283203125, 51.75400390625], + [27.07412109375, 51.76083984375], + [27.1419921875001, 51.75205078125], + [27.2962890625001, 51.597412109375], + [27.68974609375, 51.572412109375], + [27.7, 51.477978515625], + [27.85859375, 51.5923828125001], + [28.53203125, 51.562451171875], + [28.5990234375001, 51.5426269531251], + [28.6477539062501, 51.45654296875], + [28.690234375, 51.4388671875001], + [28.73125, 51.4333984375], + [28.8495117187501, 51.540185546875], + [28.9275390625, 51.562158203125], + [28.977734375, 51.57177734375], + [29.0130859375001, 51.59892578125], + [29.0607421875, 51.625439453125], + [29.1020507812501, 51.6275390625], + [29.346484375, 51.382568359375], + [30.1607421875, 51.477880859375], + [30.44951171875, 51.27431640625], + [30.63251953125, 51.355419921875], + [30.6117187500001, 51.40634765625], + [30.60234375, 51.471240234375], + [30.5607421875, 51.531494140625], + [30.5330078125, 51.596337890625], + [30.58388671875, 51.68896484375], + [30.66728515625, 51.814111328125], + [30.7552734375, 51.895166015625], + [30.845703125, 51.953076171875], + [30.9806640625001, 52.04619140625], + [31.2179687500001, 52.050244140625], + [31.3459960937501, 52.10537109375], + [31.57373046875, 52.10810546875], + [31.7633789062501, 52.10107421875], + [32.122265625, 52.0505859375], + [32.43544921875, 52.3072265625], + [33.73525390625, 52.344775390625], + [34.3978515625, 51.780419921875], + [34.12109375, 51.679150390625], + [34.2138671875, 51.2553710937501], + [35.0640625, 51.20341796875], + [35.3119140625001, 51.043896484375], + [35.59111328125, 50.36875], + [36.1164062500001, 50.408544921875], + [36.6194335937501, 50.209228515625], + [37.4228515625, 50.411474609375], + [38.046875, 49.9200195312501], + [38.2585937500001, 50.05234375], + [38.918359375, 49.82470703125], + [39.1748046875, 49.85595703125], + [39.7805664062501, 49.572021484375], + [40.0806640625, 49.57685546875], + [40.1087890625001, 49.2515625], + [39.6865234375, 49.00791015625], + [40.00361328125, 48.8220703125], + [39.79287109375, 48.80771484375], + [39.6447265625001, 48.5912109375], + [39.8356445312501, 48.5427734375], + [39.9579101562501, 48.268896484375], + [39.7787109375001, 47.8875488281251], + [38.9002929687501, 47.855126953125], + [38.36884765625, 47.6099609375], + [38.21435546875, 47.091455078125] + ] + ] + ] + }, + "properties": { + "name": "Ukraine", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-57.810595703125, -30.85859375], + [-57.872509765625, -30.591015625], + [-57.831201171875, -30.49521484375], + [-57.7126953125, -30.38447265625], + [-57.65087890625, -30.29501953125], + [-57.645751953125, -30.226953125], + [-57.60888671875, -30.18779296875], + [-57.552294921875, -30.26123046875], + [-57.214453125, -30.2833984375], + [-57.1869140625, -30.26484375], + [-57.1205078125, -30.14443359375], + [-56.83271484375, -30.1072265625], + [-56.4072265625, -30.4474609375], + [-55.998974609375, -30.83720703125], + [-56.01845703125, -30.99189453125], + [-56.0046875, -31.07919921875], + [-55.873681640625, -31.06962890625], + [-55.6271484375, -30.85810546875], + [-55.60302734375, -30.85078125], + [-55.55732421875, -30.8759765625], + [-55.17353515625, -31.27958984375], + [-55.091162109375, -31.31396484375], + [-55.03603515625, -31.27900390625], + [-54.587646484375, -31.48515625], + [-54.220556640625, -31.85517578125], + [-53.76171875, -32.0568359375], + [-53.601708984375, -32.40302734375], + [-53.1255859375, -32.73671875], + [-53.2140625, -32.82109375], + [-53.310107421875, -32.92705078125], + [-53.39521484375, -33.0103515625], + [-53.482861328125, -33.0685546875], + [-53.511865234375, -33.10869140625], + [-53.53134765625, -33.1708984375], + [-53.53134765625, -33.65546875], + [-53.37060546875, -33.7421875], + [-53.419580078125, -33.77919921875], + [-53.4724609375, -33.84931640625], + [-53.534521484375, -34.01748046875], + [-53.742919921875, -34.24951171875], + [-53.785302734375, -34.38037109375], + [-54.1685546875, -34.670703125], + [-54.902294921875, -34.9328125], + [-55.67314453125, -34.77568359375], + [-56.249951171875, -34.90126953125], + [-57.170703125, -34.45234375], + [-57.8291015625, -34.47734375], + [-58.4001953125, -33.91240234375], + [-58.363525390625, -33.18232421875], + [-58.08232421875, -32.89365234375], + [-58.12958984375, -32.7572265625], + [-58.16220703125, -32.56650390625], + [-58.201171875, -32.4716796875], + [-58.123046875, -32.321875], + [-58.1197265625, -32.24892578125], + [-58.164794921875, -32.18486328125], + [-58.177001953125, -32.11904296875], + [-58.15634765625, -32.0515625], + [-58.160400390625, -31.9865234375], + [-58.189013671875, -31.92421875], + [-58.16748046875, -31.87265625], + [-58.042333984375, -31.76923828125], + [-58.006982421875, -31.6849609375], + [-58.053857421875, -31.494921875], + [-58.0333984375, -31.4166015625], + [-57.893359375, -31.1953125], + [-57.868408203125, -31.10439453125], + [-57.886328125, -30.93740234375], + [-57.810595703125, -30.85859375] + ] + ] + }, + "properties": { + "name": "Uruguay", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-155.58134765625, 19.01201171875], + [-155.881298828125, 19.0705078125], + [-156.048681640625, 19.749951171875], + [-155.8203125, 20.01416015625], + [-155.831640625, 20.275830078125], + [-155.198779296875, 19.994384765625], + [-154.80419921875, 19.524462890625], + [-155.58134765625, 19.01201171875] + ] + ], + [ + [ + [-156.849609375, 20.77265625], + [-156.973388671875, 20.75751953125], + [-157.0505859375, 20.912451171875], + [-156.88056640625, 20.9048339843751], + [-156.849609375, 20.77265625] + ] + ], + [ + [ + [-156.48681640625, 20.932568359375], + [-156.2775390625, 20.95126953125], + [-155.98984375, 20.75712890625], + [-156.4087890625, 20.60517578125], + [-156.480078125, 20.801220703125], + [-156.69775390625, 20.949072265625], + [-156.585400390625, 21.034326171875], + [-156.48681640625, 20.932568359375] + ] + ], + [ + [ + [-157.213623046875, 21.215380859375], + [-156.712158203125, 21.1550781250001], + [-156.85986328125, 21.05634765625], + [-157.29033203125, 21.11259765625], + [-157.213623046875, 21.215380859375] + ] + ], + [ + [ + [-157.799365234375, 21.456640625], + [-157.635400390625, 21.3076171875], + [-158.1103515625, 21.318603515625], + [-158.27314453125, 21.58525390625], + [-157.9625, 21.7013671875], + [-157.799365234375, 21.456640625] + ] + ], + [ + [ + [-159.37275390625, 21.932373046875], + [-159.608837890625, 21.909521484375], + [-159.78916015625, 22.0417968750001], + [-159.57919921875, 22.22314453125], + [-159.35205078125, 22.219580078125], + [-159.37275390625, 21.932373046875] + ] + ], + [ + [ + [-81.044189453125, 24.7167968750001], + [-81.137353515625, 24.710498046875], + [-80.93046875, 24.75947265625], + [-81.044189453125, 24.7167968750001] + ] + ], + [ + [ + [-80.3818359375, 25.14228515625], + [-80.58056640625, 24.954248046875], + [-80.257080078125, 25.347607421875], + [-80.3818359375, 25.14228515625] + ] + ], + [ + [ + [-97.170703125, 26.159375], + [-97.4020996093749, 26.8205078125], + [-97.3859863281249, 27.196484375], + [-97.170703125, 26.159375] + ] + ], + [ + [ + [-80.186767578125, 27.27841796875], + [-80.1705078125, 27.20478515625], + [-80.4369140624999, 27.850537109375], + [-80.186767578125, 27.27841796875] + ] + ], + [ + [ + [-91.793701171875, 29.500732421875], + [-92.006640625, 29.610302734375], + [-91.875244140625, 29.640966796875], + [-91.793701171875, 29.500732421875] + ] + ], + [ + [ + [-84.90791015625, 29.642626953125], + [-85.116748046875, 29.6328125], + [-84.737158203125, 29.732421875], + [-84.90791015625, 29.642626953125] + ] + ], + [ + [ + [-89.223974609375, 30.08408203125], + [-89.3419921875, 30.062841796875], + [-89.18466796875, 30.16865234375], + [-89.223974609375, 30.08408203125] + ] + ], + [ + [ + [-118.34794921875, 33.3857421875], + [-118.2974609375, 33.312109375], + [-118.4462890625, 33.31708984375], + [-118.56943359375, 33.46416015625], + [-118.34794921875, 33.3857421875] + ] + ], + [ + [ + [-120.0435546875, 33.91884765625], + [-120.251904296875, 34.0138671875], + [-120.071826171875, 34.026513671875], + [-120.0435546875, 33.91884765625] + ] + ], + [ + [ + [-119.882373046875, 34.0796875], + [-119.549267578125, 34.0281738281251], + [-119.8095703125, 33.9677734375], + [-119.882373046875, 34.0796875] + ] + ], + [ + [ + [-75.544140625, 35.240087890625], + [-75.690087890625, 35.22158203125], + [-75.536376953125, 35.27861328125], + [-75.503515625, 35.769140625], + [-75.4647460937499, 35.4486328125], + [-75.544140625, 35.240087890625] + ] + ], + [ + [ + [-74.133203125, 39.68076171875], + [-74.25048828125, 39.52939453125], + [-74.10673828125, 39.746435546875], + [-74.133203125, 39.68076171875] + ] + ], + [ + [ + [-72.509765625, 40.98603515625], + [-72.580859375, 40.921337890625], + [-71.90322265625, 41.0606933593751], + [-73.194287109375, 40.65419921875], + [-74.014892578125, 40.581201171875], + [-73.879248046875, 40.791650390625], + [-73.573828125, 40.91962890625], + [-72.62509765625, 40.9918457031251], + [-72.27412109375, 41.15302734375], + [-72.509765625, 40.98603515625] + ] + ], + [ + [ + [-69.9779296875, 41.265576171875], + [-70.233056640625, 41.286328125], + [-70.0412109375, 41.3974609375], + [-69.9779296875, 41.265576171875] + ] + ], + [ + [ + [-70.509912109375, 41.376318359375], + [-70.82919921875, 41.3589843750001], + [-70.616015625, 41.4572265625], + [-70.509912109375, 41.376318359375] + ] + ], + [ + [ + [-71.24140625, 41.491943359375], + [-71.346240234375, 41.469384765625], + [-71.23203125, 41.654296875], + [-71.24140625, 41.491943359375] + ] + ], + [ + [ + [-68.187255859375, 44.332470703125], + [-68.41171875, 44.2943359375], + [-68.2994140625, 44.456494140625], + [-68.187255859375, 44.332470703125] + ] + ], + [ + [ + [-122.394140625, 47.395263671875], + [-122.509912109375, 47.3580078125], + [-122.486474609375, 47.48876953125], + [-122.394140625, 47.395263671875] + ] + ], + [ + [ + [-122.57275390625, 48.156640625], + [-122.383154296875, 47.923193359375], + [-122.74150390625, 48.22529296875], + [-122.62861328125, 48.384228515625], + [-122.542431640625, 48.293994140625], + [-122.697021484375, 48.228662109375], + [-122.57275390625, 48.156640625] + ] + ], + [ + [ + [-94.803466796875, 49.0029296875], + [-94.71279296875, 48.863427734375], + [-94.6208984375, 48.742626953125], + [-93.851611328125, 48.607275390625], + [-93.70771484375, 48.525439453125], + [-93.377880859375, 48.616552734375], + [-93.257958984375, 48.628857421875], + [-92.83671875, 48.5677734375], + [-92.5005859375, 48.4353515625], + [-92.4145996093749, 48.276611328125], + [-92.3484375, 48.276611328125], + [-92.00517578125, 48.30185546875], + [-91.38720703125, 48.058544921875], + [-91.04345703125, 48.193701171875], + [-90.84033203125, 48.2005371093751], + [-90.797314453125, 48.1310546875], + [-89.4556640625, 47.996240234375], + [-88.378173828125, 48.303076171875], + [-87.743896484375, 48.060546875], + [-87.2080078125, 47.848486328125], + [-86.67216796875, 47.63642578125], + [-85.65224609375, 47.219970703125], + [-85.070068359375, 46.979931640625], + [-84.8759765624999, 46.89990234375], + [-84.665771484375, 46.54326171875], + [-84.440478515625, 46.4981445312501], + [-84.123193359375, 46.5029296875], + [-83.977783203125, 46.084912109375], + [-83.615966796875, 46.116845703125], + [-83.469482421875, 45.994677734375], + [-83.59267578125, 45.8171386718751], + [-82.9193359374999, 45.51796875], + [-82.55107421875, 45.34736328125], + [-82.4850585937499, 45.083740234375], + [-82.137841796875, 43.5708984375], + [-82.190380859375, 43.474072265625], + [-82.5453125, 42.62470703125], + [-83.109521484375, 42.25068359375], + [-83.141943359375, 41.97587890625], + [-82.6900390625, 41.6751953125], + [-82.4390625, 41.674853515625], + [-81.974169921875, 41.888720703125], + [-81.50732421875, 42.103466796875], + [-81.02822265625, 42.24716796875], + [-80.24755859375, 42.366015625], + [-79.17373046875, 42.74853515625], + [-78.915087890625, 42.909130859375], + [-78.9807617187499, 42.980615234375], + [-79.026171875, 43.0173339843751], + [-79.066064453125, 43.106103515625], + [-79.171875, 43.466552734375], + [-79.002490234375, 43.5271484375], + [-78.845556640625, 43.583349609375], + [-78.72041015625, 43.624951171875], + [-78.458251953125, 43.631494140625], + [-77.596533203125, 43.62861328125], + [-76.819970703125, 43.62880859375], + [-76.185791015625, 44.242236328125], + [-75.8193359375, 44.468017578125], + [-75.40126953125, 44.772265625], + [-74.996142578125, 44.9701171875], + [-74.7624511718749, 44.999072265625], + [-74.663232421875, 45.00390625], + [-71.517529296875, 45.007568359375], + [-71.327294921875, 45.290087890625], + [-70.8650390625, 45.270703125], + [-70.296240234375, 45.9061035156251], + [-70.00771484375, 46.708935546875], + [-69.24287109375, 47.46298828125], + [-69.0501953125, 47.426611328125], + [-68.93720703125, 47.21123046875], + [-68.235498046875, 47.345947265625], + [-67.806787109375, 47.0828125], + [-67.8022460937499, 45.7275390625], + [-67.432666015625, 45.603125], + [-67.366943359375, 45.173779296875], + [-67.124853515625, 45.16943359375], + [-66.98701171875, 44.827685546875], + [-67.191259765625, 44.6755859375], + [-67.8390625, 44.57626953125], + [-68.056640625, 44.384326171875], + [-68.15205078125, 44.502001953125], + [-68.4505859375, 44.5076171875], + [-68.53251953125, 44.258642578125], + [-68.8119140624999, 44.33935546875], + [-68.7626953124999, 44.570751953125], + [-69.22607421875, 43.9864746093751], + [-69.520751953125, 43.89736328125], + [-69.556689453125, 43.982763671875], + [-69.62392578125, 43.880615234375], + [-69.6528808593749, 43.9938964843751], + [-69.808349609375, 43.772314453125], + [-69.965234375, 43.855078125], + [-70.17880859375, 43.7663574218751], + [-70.73310546875, 43.07001953125], + [-70.8290527343749, 42.825341796875], + [-70.612939453125, 42.6232421875], + [-71.0461914062499, 42.331103515625], + [-70.73828125, 42.228857421875], + [-70.42666015625, 41.757275390625], + [-70.001416015625, 41.826171875], + [-70.241064453125, 42.0912109375], + [-70.108935546875, 42.0783203125], + [-69.977880859375, 41.961279296875], + [-69.9486328125, 41.6771484375001], + [-70.65712890625, 41.534228515625], + [-70.701123046875, 41.71484375], + [-71.1685546875, 41.489404296875], + [-71.14873046875, 41.745703125], + [-71.27109375, 41.68125], + [-71.39013671875, 41.7953125000001], + [-71.5228515625, 41.378955078125], + [-72.92470703125, 41.28515625], + [-73.987109375, 40.7513671875], + [-73.87197265625, 41.05517578125], + [-73.969921875, 41.24970703125], + [-73.927197265625, 40.9142578125], + [-74.264208984375, 40.52861328125], + [-73.972265625, 40.400341796875], + [-74.079931640625, 39.788134765625], + [-74.064599609375, 39.993115234375], + [-74.794482421875, 39.001904296875], + [-74.954296875, 38.949951171875], + [-74.897021484375, 39.145458984375], + [-75.52421875, 39.490185546875], + [-75.421875, 39.789697265625], + [-75.074169921875, 39.9834960937501], + [-75.400634765625, 39.831591796875], + [-75.58759765625, 39.6407714843751], + [-75.3921875, 39.0927734375001], + [-75.088671875, 38.7775390625], + [-75.187109375, 38.59111328125], + [-75.0387695312499, 38.4263671875], + [-75.934375, 37.151904296875], + [-75.975048828125, 37.3984375], + [-75.65927734375, 37.953955078125], + [-75.850830078125, 37.97158203125], + [-75.85869140625, 38.362060546875], + [-76.051220703125, 38.279541015625], + [-76.2646484375, 38.43642578125], + [-76.26416015625, 38.599951171875], + [-76.016943359375, 38.62509765625], + [-76.21298828125, 38.75830078125], + [-76.341162109375, 38.70966796875], + [-76.1681640625, 38.852734375], + [-76.32958984375, 38.9527832031251], + [-76.1352050781249, 39.08212890625], + [-76.235693359375, 39.1916015625], + [-76.153125, 39.3150390625], + [-75.8759765625, 39.3759765625], + [-76.003125, 39.41083984375], + [-75.87294921875, 39.510888671875], + [-75.958935546875, 39.58505859375], + [-76.2763671875, 39.32275390625], + [-76.330810546875, 39.40390625], + [-76.4208984375, 39.225], + [-76.57041015625, 39.2693359375], + [-76.427587890625, 39.126025390625], + [-76.5585449218749, 39.065234375], + [-76.394091796875, 38.368994140625], + [-76.67734375, 38.611962890625], + [-76.6685546875, 38.5375], + [-76.341162109375, 38.0870117187501], + [-76.868115234375, 38.390283203125], + [-76.88974609375, 38.29208984375], + [-77.001171875, 38.445263671875], + [-77.23251953125, 38.40771484375], + [-77.03037109375, 38.8892578125], + [-77.260400390625, 38.6], + [-77.2732421875, 38.3517578125], + [-77.04677734375, 38.356689453125], + [-76.2642578125, 37.8935546875], + [-76.344140625, 37.67568359375], + [-76.49248046875, 37.6822265625], + [-77.111083984375, 38.165673828125], + [-76.5494628906249, 37.669140625], + [-76.30556640625, 37.571484375], + [-76.2634765625, 37.35703125], + [-76.4009765625, 37.3861328125], + [-76.4539062499999, 37.2735351562501], + [-76.75771484375, 37.505419921875], + [-76.28330078125, 37.052685546875], + [-76.40087890625, 36.99130859375], + [-76.6309082031249, 37.221728515625], + [-77.2508789062499, 37.32919921875], + [-76.671875, 37.17294921875], + [-76.487841796875, 36.897021484375], + [-75.9994140625, 36.912646484375], + [-75.5341796875, 35.8190917968751], + [-75.946484375, 36.65908203125], + [-75.9927734375, 36.473779296875], + [-75.8200683593749, 36.112841796875], + [-76.1478515625, 36.279296875], + [-76.15, 36.145751953125], + [-76.27060546875, 36.189892578125], + [-76.227392578125, 36.116015625], + [-76.559375, 36.01533203125], + [-76.733642578125, 36.229150390625], + [-76.726220703125, 35.9576171875], + [-76.069775390625, 35.9703125], + [-76.08359375, 35.6905273437501], + [-75.85390625, 35.96015625], + [-75.758837890625, 35.84326171875], + [-75.77392578125, 35.64697265625], + [-76.173828125, 35.354150390625], + [-76.489501953125, 35.397021484375], + [-76.577197265625, 35.53232421875], + [-76.74140625, 35.431494140625], + [-77.039990234375, 35.527392578125], + [-76.512939453125, 35.27041015625], + [-76.779150390625, 34.99033203125], + [-77.070263671875, 35.154638671875], + [-76.974951171875, 35.0251953125], + [-76.744970703125, 34.940966796875], + [-76.45673828125, 34.98935546875], + [-76.36220703125, 34.9365234375], + [-76.439794921875, 34.842919921875], + [-77.296240234375, 34.6029296875], + [-77.412255859375, 34.730810546875], + [-77.37978515625, 34.526611328125], + [-77.750732421875, 34.2849609375], + [-77.92783203125, 33.93974609375], + [-77.9532714843749, 34.168994140625], + [-78.013330078125, 33.91181640625], + [-78.405859375, 33.917578125], + [-78.841455078125, 33.724072265625], + [-79.193798828125, 33.244140625], + [-79.22646484375, 33.4048828125], + [-79.276025390625, 33.135400390625], + [-79.80498046875, 32.78740234375], + [-79.93310546875, 32.8100585937501], + [-79.94072265625, 32.667138671875], + [-80.362841796875, 32.500732421875], + [-80.6341796875, 32.51171875], + [-80.474267578125, 32.42275390625], + [-80.579345703125, 32.2873046875], + [-80.8025390625, 32.448046875], + [-80.69423828125, 32.21572265625], + [-81.11328125, 31.87861328125], + [-81.06611328125, 31.78798828125], + [-81.259375, 31.538916015625], + [-81.1754394531249, 31.531298828125], + [-81.38095703125, 31.353271484375], + [-81.2884765625, 31.263916015625], + [-81.441748046875, 31.19970703125], + [-81.5162109375, 30.801806640625], + [-81.24951171875, 29.793798828125], + [-80.52412109375, 28.486083984375], + [-80.5849609375, 28.27158203125], + [-80.456884765625, 27.90068359375], + [-80.6100097656249, 28.177587890625], + [-80.60693359375, 28.522900390625], + [-80.693505859375, 28.344970703125], + [-80.6884765625, 28.578515625], + [-80.83818359375, 28.757666015625], + [-80.7486328125, 28.381005859375], + [-80.050048828125, 26.8077148437501], + [-80.1263671875, 25.83349609375], + [-80.48466796875, 25.229833984375], + [-81.1104980468749, 25.138037109375], + [-81.13603515625, 25.30966796875], + [-80.9404296875, 25.264208984375], + [-81.113330078125, 25.367236328125], + [-81.36494140625, 25.8310546875], + [-81.715478515625, 25.983154296875], + [-81.958935546875, 26.48994140625], + [-81.828662109375, 26.687060546875], + [-82.039599609375, 26.55205078125], + [-82.01328125, 26.9615722656251], + [-82.24287109375, 26.848876953125], + [-82.441357421875, 27.05966796875], + [-82.714599609375, 27.4996093750001], + [-82.4057617187499, 27.862890625], + [-82.6751953124999, 27.96376953125], + [-82.610986328125, 27.7772460937501], + [-82.74287109375, 27.709375], + [-82.8435058593749, 27.84599609375], + [-82.65146484375, 28.8875], + [-83.694384765625, 29.9259765625], + [-84.04423828125, 30.10380859375], + [-84.30966796875, 30.06474609375], + [-84.3828125, 29.9073730468751], + [-85.3189453125, 29.680224609375], + [-85.413818359375, 29.767578125], + [-85.413818359375, 29.84248046875], + [-85.3148925781249, 29.75810546875], + [-85.35361328125, 29.875732421875], + [-85.67578125, 30.1219238281251], + [-85.603515625, 30.286767578125], + [-85.755810546875, 30.1669921875], + [-86.454443359375, 30.39912109375], + [-86.123828125, 30.405810546875], + [-86.257373046875, 30.493017578125], + [-87.201171875, 30.3392578125], + [-86.985791015625, 30.430859375], + [-86.99755859375, 30.5703125], + [-87.17060546875, 30.53876953125], + [-87.2810546875, 30.3392578125], + [-87.47578125, 30.294287109375], + [-87.448291015625, 30.394140625], + [-87.622265625, 30.26474609375], + [-88.00595703125, 30.230908203125], + [-87.790283203125, 30.291796875], + [-88.011328125, 30.694189453125], + [-88.13544921875, 30.3666015625], + [-88.905224609375, 30.41513671875], + [-89.320556640625, 30.3453125], + [-89.5884765625, 30.165966796875], + [-90.1259765625, 30.369091796875], + [-90.3319824218749, 30.2775878906251], + [-90.413037109375, 30.14033203125], + [-90.175341796875, 30.0291015625], + [-89.737451171875, 30.17197265625], + [-89.6650390624999, 30.117041015625], + [-89.815185546875, 30.007275390625], + [-89.631689453125, 29.90380859375], + [-89.400732421875, 30.0460449218751], + [-89.354443359375, 29.8202148437501], + [-89.7208984375, 29.619287109375], + [-89.01572265625, 29.2028808593751], + [-89.155517578125, 29.0166015625], + [-89.2360839843749, 29.081103515625], + [-89.376123046875, 28.98134765625], + [-89.4431640625, 29.194140625], + [-90.15908203125, 29.537158203125], + [-90.052783203125, 29.33681640625], + [-90.21279296875, 29.104931640625], + [-90.37919921875, 29.2951171875], + [-90.751025390625, 29.130859375], + [-91.29013671875, 29.28896484375], + [-91.1507812499999, 29.317919921875], + [-91.2488281249999, 29.564208984375], + [-91.514208984375, 29.55537109375], + [-91.8931640625, 29.83603515625], + [-92.135498046875, 29.6994628906251], + [-92.084033203125, 29.592822265625], + [-92.26083984375, 29.5568359375], + [-93.17568359375, 29.778955078125], + [-93.82646484375, 29.725146484375], + [-93.841455078125, 29.979736328125], + [-93.890478515625, 29.68935546875], + [-94.759619140625, 29.3842773437501], + [-94.52626953125, 29.54794921875], + [-94.778271484375, 29.5478515625], + [-94.741943359375, 29.75], + [-95.0228515625, 29.70234375], + [-94.88828125, 29.370556640625], + [-95.273486328125, 28.9638671875], + [-96.234521484375, 28.48896484375], + [-96.01103515625, 28.63193359375], + [-96.44873046875, 28.594482421875], + [-96.6400390624999, 28.7087890625], + [-96.4210937499999, 28.45732421875], + [-96.6763671875, 28.34130859375], + [-96.77353515625, 28.4216308593751], + [-96.839501953125, 28.194384765625], + [-97.156494140625, 28.1443359375], + [-97.141259765625, 28.0607421875], + [-97.034326171875, 28.0938476562501], + [-97.073095703125, 27.986083984375], + [-97.431494140625, 27.83720703125], + [-97.2887207031249, 27.67060546875], + [-97.439111328125, 27.328271484375], + [-97.76845703125, 27.45751953125], + [-97.6923828125, 27.287158203125], + [-97.485107421875, 27.23740234375], + [-97.5546874999999, 26.967333984375], + [-97.43505859375, 26.48583984375], + [-97.1462402343749, 25.961474609375], + [-97.375634765625, 25.871826171875], + [-99.107763671875, 26.446923828125], + [-99.45654296875, 27.056689453125], + [-99.505322265625, 27.54833984375], + [-100.296044921875, 28.327685546875], + [-100.75458984375, 29.18251953125], + [-101.440380859375, 29.77685546875], + [-102.2689453125, 29.87119140625], + [-102.61494140625, 29.75234375], + [-102.8919921875, 29.21640625], + [-103.168310546875, 28.998193359375], + [-104.110595703125, 29.3861328125], + [-104.50400390625, 29.677685546875], + [-104.97880859375, 30.645947265625], + [-106.148046875, 31.450927734375], + [-106.44541015625, 31.768408203125], + [-108.21181640625, 31.779345703125], + [-108.214453125, 31.329443359375], + [-111.0419921875, 31.32421875], + [-114.8359375, 32.50830078125], + [-114.724755859375, 32.71533203125], + [-117.128271484375, 32.533349609375], + [-117.467431640625, 33.2955078125], + [-118.080517578125, 33.72216796875], + [-118.41044921875, 33.7439453125], + [-118.506201171875, 34.0173828125], + [-119.14375, 34.11201171875], + [-119.6060546875, 34.418017578125], + [-120.481201171875, 34.471630859375], + [-120.644677734375, 34.57998046875], + [-120.65908203125, 35.122412109375], + [-120.857373046875, 35.20966796875], + [-120.899609375, 35.42509765625], + [-121.283837890625, 35.676318359375], + [-121.877392578125, 36.3310546875], + [-121.807421875, 36.851220703125], + [-122.394921875, 37.20751953125], + [-122.49921875, 37.542626953125], + [-122.44560546875, 37.797998046875], + [-122.0705078125, 37.478271484375], + [-122.38544921875, 37.960595703125], + [-122.3142578125, 38.00732421875], + [-121.525341796875, 38.055908203125], + [-122.393359375, 38.14482421875], + [-122.521337890625, 37.826416015625], + [-122.931982421875, 38.05546875], + [-122.998779296875, 37.988623046875], + [-122.908154296875, 38.19658203125], + [-123.701123046875, 38.907275390625], + [-123.83291015625, 39.77548828125], + [-124.35654296875, 40.37109375], + [-124.071923828125, 41.459521484375], + [-124.5396484375, 42.812890625], + [-124.14873046875, 43.691748046875], + [-123.929345703125, 45.576953125], + [-123.989306640625, 46.219384765625], + [-123.22060546875, 46.15361328125], + [-123.46484375, 46.27109375], + [-124.07275390625, 46.279443359375], + [-124.0443359375, 46.605078125], + [-123.946142578125, 46.432568359375], + [-123.88916015625, 46.660009765625], + [-124.112548828125, 46.8626953125], + [-123.84287109375, 46.96318359375], + [-124.11171875, 47.035205078125], + [-124.1392578125, 46.9546875], + [-124.376025390625, 47.658642578125], + [-124.6630859375, 47.97412109375], + [-124.7099609375, 48.38037109375], + [-123.97578125, 48.16845703125], + [-122.973876953125, 48.073291015625], + [-122.77861328125, 48.13759765625], + [-122.656640625, 47.88115234375], + [-122.77841796875, 47.738427734375], + [-122.82138671875, 47.7931640625], + [-123.1390625, 47.386083984375], + [-122.92216796875, 47.407666015625], + [-123.066796875, 47.3996582031251], + [-123.0486328125, 47.479345703125], + [-122.5328125, 47.9197265625], + [-122.67548828125, 47.612353515625], + [-122.577880859375, 47.2931640625], + [-122.7677734375, 47.2183593750001], + [-122.828466796875, 47.336572265625], + [-123.027587890625, 47.138916015625], + [-122.701953125, 47.110888671875], + [-122.35380859375, 47.37158203125], + [-122.401806640625, 47.78427734375], + [-122.2419921875, 48.0107421875], + [-122.5169921875, 48.15966796875], + [-122.408544921875, 48.293896484375], + [-122.668994140625, 48.465234375], + [-122.49677734375, 48.50556640625], + [-122.512744140625, 48.66943359375], + [-122.56201171875, 48.777978515625], + [-122.6859375, 48.794287109375], + [-122.7224609375, 48.85302734375], + [-122.78876953125, 48.993017578125], + [-121.4072265625, 48.993017578125], + [-119.701708984375, 48.993017578125], + [-119.275341796875, 48.9930664062501], + [-118.84892578125, 48.9930664062501], + [-117.99619140625, 48.9930664062501], + [-116.717041015625, 48.9930664062501], + [-110.74765625, 48.9930664062501], + [-104.7783203125, 48.993115234375], + [-98.808984375, 48.9931640625], + [-97.5298339843749, 48.9931640625], + [-96.6770507812499, 48.9931640625], + [-96.2506835937499, 48.9931640625], + [-95.3979003906249, 48.9931640625], + [-95.1620605468749, 48.991748046875], + [-95.1552734375, 49.369677734375], + [-94.854345703125, 49.30458984375], + [-94.8604003906249, 49.25859375], + [-94.803466796875, 49.0029296875] + ] + ], + [ + [ + [-176.28671875, 51.7919921875001], + [-176.349658203125, 51.73330078125], + [-176.413720703125, 51.840576171875], + [-176.28671875, 51.7919921875001] + ] + ], + [ + [ + [-177.879052734375, 51.64970703125], + [-178.05888671875, 51.672607421875], + [-177.986376953125, 51.7642578125], + [-178.16826171875, 51.90302734375], + [-177.644482421875, 51.82626953125], + [-177.879052734375, 51.64970703125] + ] + ], + [ + [ + [-177.148193359375, 51.716748046875], + [-177.67021484375, 51.70107421875], + [-177.11005859375, 51.928759765625], + [-177.148193359375, 51.716748046875] + ] + ], + [ + [ + [-176.593310546875, 51.86669921875], + [-176.45234375, 51.735693359375], + [-176.96162109375, 51.6036621093751], + [-176.69833984375, 51.98603515625], + [-176.593310546875, 51.86669921875] + ] + ], + [ + [ + [179.727734375, 51.905419921875], + [179.50390625, 51.97958984375], + [179.6271484375, 52.030419921875], + [179.727734375, 51.905419921875] + ] + ], + [ + [ + [177.4154296875, 51.8828125], + [177.25029296875, 51.9029296875], + [177.66962890625, 52.10302734375], + [177.4154296875, 51.8828125] + ] + ], + [ + [ + [-173.5533203125, 52.136279296875], + [-173.022900390625, 52.079150390625], + [-173.835791015625, 52.048193359375], + [-173.99248046875, 52.12333984375], + [-173.5533203125, 52.136279296875] + ] + ], + [ + [ + [-172.464794921875, 52.272265625], + [-172.61982421875, 52.2728515625001], + [-172.47041015625, 52.3880371093751], + [-172.313623046875, 52.3295898437501], + [-172.464794921875, 52.272265625] + ] + ], + [ + [ + [-174.677392578125, 52.035009765625], + [-175.295556640625, 52.02216796875], + [-174.30615234375, 52.216162109375], + [-174.435546875, 52.317236328125], + [-174.168896484375, 52.420166015625], + [-174.04560546875, 52.367236328125], + [-174.120654296875, 52.135205078125], + [-174.677392578125, 52.035009765625] + ] + ], + [ + [ + [173.72275390625, 52.3595703125], + [173.40234375, 52.40478515625], + [173.77607421875, 52.4951171875], + [173.72275390625, 52.3595703125] + ] + ], + [ + [ + [172.81181640625, 53.01298828125], + [173.43603515625, 52.85205078125], + [172.93515625, 52.752099609375], + [172.49482421875, 52.937890625], + [172.81181640625, 53.01298828125] + ] + ], + [ + [ + [-167.96435546875, 53.3451171875], + [-169.088916015625, 52.83203125], + [-168.68984375, 53.22724609375], + [-168.380419921875, 53.2834472656251], + [-168.2876953125, 53.500146484375], + [-167.828076171875, 53.5079589843751], + [-167.96435546875, 53.3451171875] + ] + ], + [ + [ + [-166.61533203125, 53.900927734375], + [-166.372314453125, 53.998974609375], + [-166.230859375, 53.9326171875001], + [-166.54560546875, 53.72646484375], + [-166.354541015625, 53.67353515625], + [-166.8509765625, 53.452880859375], + [-167.780859375, 53.300244140625], + [-167.136083984375, 53.52646484375], + [-167.01572265625, 53.698388671875], + [-166.808984375, 53.6461425781251], + [-166.741259765625, 53.712939453125], + [-167.105615234375, 53.81337890625], + [-167.0380859375, 53.9421875], + [-166.673291015625, 54.00595703125], + [-166.61533203125, 53.900927734375] + ] + ], + [ + [ + [-165.841552734375, 54.070654296875], + [-166.056640625, 54.054345703125], + [-166.087744140625, 54.169140625], + [-165.89287109375, 54.206982421875], + [-165.69287109375, 54.09990234375], + [-165.841552734375, 54.070654296875] + ] + ], + [ + [ + [-165.5611328125, 54.13671875], + [-165.550634765625, 54.284521484375], + [-165.407861328125, 54.196826171875], + [-165.5611328125, 54.13671875] + ] + ], + [ + [ + [-162.29814453125, 54.847021484375], + [-162.43388671875, 54.93154296875], + [-162.264599609375, 54.98349609375], + [-162.29814453125, 54.847021484375] + ] + ], + [ + [ + [-163.476025390625, 54.980712890625], + [-163.378955078125, 54.81552734375], + [-163.083251953125, 54.668994140625], + [-163.35810546875, 54.7356933593751], + [-164.8234375, 54.4190917968751], + [-164.887646484375, 54.6078125], + [-164.47861328125, 54.9068359375], + [-163.80712890625, 55.049072265625], + [-163.476025390625, 54.980712890625] + ] + ], + [ + [ + [-159.51513671875, 55.15185546875], + [-159.617724609375, 55.05732421875], + [-159.545068359375, 55.2259765625], + [-159.51513671875, 55.15185546875] + ] + ], + [ + [ + [-131.33974609375, 55.079833984375], + [-131.329541015625, 54.887744140625], + [-131.592236328125, 55.02568359375], + [-131.5654296875, 55.264111328125], + [-131.33974609375, 55.079833984375] + ] + ], + [ + [ + [-159.872998046875, 55.128759765625], + [-160.22705078125, 54.9227050781251], + [-160.1720703125, 55.123046875], + [-159.887353515625, 55.272998046875], + [-159.872998046875, 55.128759765625] + ] + ], + [ + [ + [-132.862255859375, 54.89443359375], + [-132.617236328125, 54.892431640625], + [-132.705810546875, 54.6841796875], + [-133.429052734375, 55.30380859375], + [-133.097412109375, 55.213720703125], + [-132.862255859375, 54.89443359375] + ] + ], + [ + [ + [-160.329296875, 55.3376953125], + [-160.343310546875, 55.2587890625001], + [-160.51748046875, 55.3338378906251], + [-160.329296875, 55.3376953125] + ] + ], + [ + [ + [-160.684912109375, 55.314794921875], + [-160.552783203125, 55.38076171875], + [-160.487548828125, 55.18486328125], + [-160.795068359375, 55.14521484375], + [-160.72392578125, 55.404638671875], + [-160.684912109375, 55.314794921875] + ] + ], + [ + [ + [-133.305078125, 55.54375], + [-133.6501953125, 55.2692871093751], + [-133.737109375, 55.496923828125], + [-133.305078125, 55.54375] + ] + ], + [ + [ + [-155.566015625, 55.8211914062501], + [-155.737353515625, 55.82978515625], + [-155.5939453125, 55.92431640625], + [-155.566015625, 55.8211914062501] + ] + ], + [ + [ + [-130.979150390625, 55.48916015625], + [-131.187890625, 55.206298828125], + [-131.44755859375, 55.4087890625001], + [-131.7625, 55.1658203125], + [-131.84609375, 55.416259765625], + [-131.624951171875, 55.831689453125], + [-131.26923828125, 55.95537109375], + [-130.997802734375, 55.72763671875], + [-130.979150390625, 55.48916015625] + ] + ], + [ + [ + [-133.56611328125, 56.339208984375], + [-133.202978515625, 56.31982421875], + [-133.096630859375, 56.0900390625], + [-132.597607421875, 55.89501953125], + [-132.172705078125, 55.480615234375], + [-132.511279296875, 55.5939453125], + [-132.631298828125, 55.473193359375], + [-132.41787109375, 55.4829101562501], + [-132.206689453125, 55.2244140625], + [-131.976416015625, 55.20859375], + [-132.06474609375, 54.713134765625], + [-133.1185546875, 55.32763671875], + [-132.95888671875, 55.395556640625], + [-133.0333984375, 55.589697265625], + [-133.68017578125, 55.78515625], + [-133.24150390625, 55.92080078125], + [-133.371240234375, 56.035888671875], + [-133.742529296875, 55.96484375], + [-133.530859375, 56.145654296875], + [-133.56611328125, 56.339208984375] + ] + ], + [ + [ + [-132.7798828125, 56.247265625], + [-133.035009765625, 56.3409179687501], + [-132.90205078125, 56.4537597656251], + [-132.6291015625, 56.4119140625], + [-132.7798828125, 56.247265625] + ] + ], + [ + [ + [-132.112353515625, 56.109375], + [-132.132958984375, 55.9432617187501], + [-132.2873046875, 55.92939453125], + [-132.659912109375, 56.078173828125], + [-132.379833984375, 56.498779296875], + [-132.06689453125, 56.24423828125], + [-132.112353515625, 56.109375] + ] + ], + [ + [ + [-154.208642578125, 56.514892578125], + [-154.322216796875, 56.57060546875], + [-154.110400390625, 56.6029296875], + [-154.208642578125, 56.514892578125] + ] + ], + [ + [ + [-169.755224609375, 56.63505859375], + [-169.47431640625, 56.59404296875], + [-169.6326171875, 56.545703125], + [-169.755224609375, 56.63505859375] + ] + ], + [ + [ + [-132.746875, 56.52568359375], + [-132.948046875, 56.567236328125], + [-132.842529296875, 56.7947753906251], + [-132.56796875, 56.5758300781251], + [-132.746875, 56.52568359375] + ] + ], + [ + [ + [-133.989599609375, 56.844970703125], + [-133.73837890625, 56.650439453125], + [-133.94970703125, 56.127734375], + [-134.189599609375, 56.076953125], + [-134.084375, 56.45634765625], + [-134.373681640625, 56.838671875], + [-134.14326171875, 56.93232421875], + [-133.989599609375, 56.844970703125] + ] + ], + [ + [ + [-133.3662109375, 57.003515625], + [-132.996240234375, 56.930419921875], + [-132.9591796875, 56.67705078125], + [-133.034912109375, 56.6207519531251], + [-133.328955078125, 56.830078125], + [-133.158154296875, 56.495166015625], + [-133.4841796875, 56.4517578125], + [-133.979443359375, 57.0095703125], + [-133.3662109375, 57.003515625] + ] + ], + [ + [ + [-153.007080078125, 57.124853515625], + [-153.374609375, 57.0519042968751], + [-153.285205078125, 57.18505859375], + [-152.9083984375, 57.15244140625], + [-153.007080078125, 57.124853515625] + ] + ], + [ + [ + [-134.969775390625, 57.351416015625], + [-134.620703125, 56.718310546875], + [-134.681884765625, 56.216162109375], + [-134.98056640625, 56.5189453125], + [-134.883447265625, 56.679052734375], + [-135.330615234375, 56.821875], + [-135.199609375, 57.02734375], + [-135.454931640625, 57.2494140625001], + [-135.8123046875, 57.009521484375], + [-135.82275390625, 57.280419921875], + [-135.448681640625, 57.534375], + [-134.969775390625, 57.351416015625] + ] + ], + [ + [ + [-152.898046875, 57.82392578125], + [-152.428759765625, 57.82568359375], + [-152.4826171875, 57.7033203125], + [-152.2162109375, 57.577001953125], + [-152.41220703125, 57.45478515625], + [-152.940771484375, 57.498095703125], + [-152.679052734375, 57.3451171875], + [-153.274365234375, 57.2263671875], + [-153.732568359375, 57.05234375], + [-153.643310546875, 56.9607421875], + [-154.02734375, 56.777978515625], + [-153.793212890625, 56.989501953125], + [-154.24375, 57.143017578125], + [-154.33896484375, 56.9208984375], + [-154.673193359375, 57.44609375], + [-154.116162109375, 57.651220703125], + [-153.6876953125, 57.305126953125], + [-153.841552734375, 57.862841796875], + [-153.487939453125, 57.73095703125], + [-153.21748046875, 57.7957519531251], + [-153.16044921875, 57.97197265625], + [-152.850390625, 57.89677734375], + [-152.898046875, 57.82392578125] + ] + ], + [ + [ + [-135.73037109375, 58.24423828125], + [-135.613232421875, 57.9918457031251], + [-135.346630859375, 58.12412109375], + [-134.9546875, 58.01533203125], + [-134.970654296875, 57.817236328125], + [-135.3384765625, 57.76865234375], + [-134.978857421875, 57.724365234375], + [-134.931494140625, 57.48115234375], + [-135.564208984375, 57.66640625], + [-135.691943359375, 57.4199218750001], + [-135.910791015625, 57.44658203125], + [-136.568603515625, 57.97216796875], + [-136.32197265625, 58.218896484375], + [-136.14375, 58.098486328125], + [-136.094384765625, 58.19814453125], + [-135.73037109375, 58.24423828125] + ] + ], + [ + [ + [-134.6802734375, 58.161669921875], + [-134.240087890625, 58.143994140625], + [-133.82275390625, 57.628662109375], + [-134.292333984375, 58.0447265625001], + [-133.9111328125, 57.3525390625], + [-134.516015625, 57.042578125], + [-134.486767578125, 57.48203125], + [-134.923486328125, 58.354638671875], + [-134.6802734375, 58.161669921875] + ] + ], + [ + [ + [-152.416943359375, 58.360205078125], + [-151.974365234375, 58.30986328125], + [-152.068896484375, 58.1779296875], + [-152.268359375, 58.2517089843751], + [-152.309228515625, 58.13388671875], + [-152.5982421875, 58.16259765625], + [-152.92841796875, 57.993701171875], + [-153.38134765625, 58.08720703125], + [-152.976123046875, 58.2970214843751], + [-152.771875, 58.278564453125], + [-152.84111328125, 58.41640625], + [-152.416943359375, 58.360205078125] + ] + ], + [ + [ + [-152.486083984375, 58.485009765625], + [-152.63662109375, 58.54169921875], + [-152.3955078125, 58.619384765625], + [-152.486083984375, 58.485009765625] + ] + ], + [ + [ + [-160.918994140625, 58.577099609375], + [-161.131494140625, 58.668212890625], + [-160.71513671875, 58.79521484375], + [-160.918994140625, 58.577099609375] + ] + ], + [ + [ + [-148.02177734375, 60.0653320312501], + [-148.271875, 60.053271484375], + [-148.07958984375, 60.15166015625], + [-148.02177734375, 60.0653320312501] + ] + ], + [ + [ + [-147.735888671875, 59.813232421875], + [-147.76806640625, 59.94375], + [-147.180859375, 60.358251953125], + [-147.019873046875, 60.3322265625], + [-147.735888671875, 59.813232421875] + ] + ], + [ + [ + [-166.13544921875, 60.383544921875], + [-165.7296875, 60.314208984375], + [-165.591796875, 59.913134765625], + [-166.14873046875, 59.764111328125], + [-167.1388671875, 60.008544921875], + [-167.43642578125, 60.2066406250001], + [-166.836328125, 60.2169921875], + [-166.47568359375, 60.382763671875], + [-166.13544921875, 60.383544921875] + ] + ], + [ + [ + [-146.3939453125, 60.449658203125], + [-146.10224609375, 60.411181640625], + [-146.618310546875, 60.273681640625], + [-146.7025390625, 60.408544921875], + [-146.3939453125, 60.449658203125] + ] + ], + [ + [ + [-147.658251953125, 60.45048828125], + [-147.787841796875, 60.1779296875], + [-147.891455078125, 60.2994140625], + [-147.658251953125, 60.45048828125] + ] + ], + [ + [ + [-172.742236328125, 60.457373046875], + [-172.232080078125, 60.2991210937501], + [-172.6357421875, 60.328857421875], + [-173.04765625, 60.568310546875], + [-172.742236328125, 60.457373046875] + ] + ], + [ + [ + [-171.463037109375, 63.6400390625], + [-171.03486328125, 63.585498046875], + [-170.299365234375, 63.680615234375], + [-169.554541015625, 63.373486328125], + [-168.716015625, 63.310595703125], + [-168.761328125, 63.21376953125], + [-169.364697265625, 63.1711425781251], + [-169.6763671875, 62.956103515625], + [-169.818603515625, 63.12236328125], + [-170.848388671875, 63.444384765625], + [-171.6318359375, 63.351220703125], + [-171.74638671875, 63.703076171875], + [-171.463037109375, 63.6400390625] + ] + ], + [ + [ + [-141.0021484375, 68.7741699218751], + [-141.0021484375, 67.89755859375], + [-141.0021484375, 66.4365234375001], + [-141.0021484375, 65.559912109375], + [-141.0021484375, 64.0988769531251], + [-141.0021484375, 63.222265625], + [-141.0021484375, 61.761279296875], + [-141.0021484375, 60.88466796875], + [-141.0021484375, 60.300244140625], + [-140.762744140625, 60.259130859375], + [-140.525439453125, 60.218359375], + [-140.45283203125, 60.29970703125], + [-139.973291015625, 60.1831542968751], + [-139.676318359375, 60.3283203125], + [-139.234765625, 60.33974609375], + [-139.079248046875, 60.343701171875], + [-139.079248046875, 60.279443359375], + [-139.136962890625, 60.172705078125], + [-139.18515625, 60.08359375], + [-138.86875, 59.945751953125], + [-138.317626953125, 59.6111328125001], + [-137.593310546875, 59.22626953125], + [-137.5208984375, 58.915380859375], + [-137.43857421875, 58.903125], + [-137.2775390625, 58.98818359375], + [-137.126220703125, 59.040966796875], + [-136.81328125, 59.150048828125], + [-136.578759765625, 59.15224609375], + [-136.466357421875, 59.45908203125], + [-136.277978515625, 59.4803222656251], + [-136.321826171875, 59.604833984375], + [-135.702587890625, 59.7287597656251], + [-135.36787109375, 59.743310546875], + [-135.051025390625, 59.578662109375], + [-134.94375, 59.28828125], + [-134.67724609375, 59.199267578125], + [-134.39306640625, 59.0091796875], + [-134.329638671875, 58.9396972656251], + [-134.218505859375, 58.84990234375], + [-133.54638671875, 58.503466796875], + [-133.27529296875, 58.2228515625], + [-133.001416015625, 57.948974609375], + [-132.55048828125, 57.49990234375], + [-132.44248046875, 57.40673828125], + [-132.30166015625, 57.276318359375], + [-132.232177734375, 57.19853515625], + [-132.27939453125, 57.145361328125], + [-132.33798828125, 57.0794433593751], + [-132.15703125, 57.048193359375], + [-132.03154296875, 57.0265625], + [-132.062890625, 56.953369140625], + [-132.104296875, 56.856787109375], + [-131.866162109375, 56.792822265625], + [-131.824267578125, 56.589990234375], + [-131.471875, 56.5567382812501], + [-130.649072265625, 56.263671875], + [-130.477099609375, 56.23056640625], + [-130.413134765625, 56.122509765625], + [-130.0978515625, 56.10927734375], + [-130.0140625, 55.950537109375], + [-130.2140625, 55.02587890625], + [-130.575341796875, 54.769677734375], + [-130.849609375, 54.8076171875001], + [-131.0478515625, 55.157666015625], + [-130.748193359375, 55.318017578125], + [-131.127685546875, 55.96015625], + [-131.032763671875, 56.0880859375], + [-131.7841796875, 55.8765625], + [-131.9833984375, 55.535009765625], + [-132.155419921875, 55.599560546875], + [-132.20751953125, 55.75341796875], + [-131.84384765625, 56.160107421875], + [-131.5513671875, 56.206787109375], + [-131.887890625, 56.241650390625], + [-132.18203125, 56.4206542968751], + [-132.824609375, 57.0558105468751], + [-133.465869140625, 57.17216796875], + [-133.64873046875, 57.64228515625], + [-133.117041015625, 57.5662109375], + [-133.535205078125, 57.832958984375], + [-133.1943359375, 57.8776855468751], + [-133.559375, 57.924462890625], + [-133.722314453125, 57.84423828125], + [-134.031103515625, 58.07216796875], + [-133.8767578125, 58.5181640625], + [-134.208837890625, 58.232958984375], + [-134.776123046875, 58.453857421875], + [-135.363671875, 59.41943359375], + [-135.50234375, 59.202294921875], + [-135.090234375, 58.245849609375], + [-135.57177734375, 58.412060546875], + [-135.89755859375, 58.4001953125], + [-136.043115234375, 58.821630859375], + [-135.8263671875, 58.89794921875], + [-136.0166015625, 58.873974609375], + [-136.150048828125, 59.048095703125], + [-136.225830078125, 58.765478515625], + [-136.989013671875, 59.03447265625], + [-137.059033203125, 58.87373046875], + [-136.613916015625, 58.80927734375], + [-136.483740234375, 58.61767578125], + [-136.224609375, 58.60224609375], + [-136.061474609375, 58.4527343750001], + [-136.607421875, 58.243994140625], + [-137.543994140625, 58.581201171875], + [-138.514892578125, 59.1659179687501], + [-139.773291015625, 59.527294921875], + [-139.513037109375, 59.698095703125], + [-139.5123046875, 59.953564453125], + [-139.28671875, 59.6109375], + [-139.22080078125, 59.819873046875], + [-138.9880859375, 59.835009765625], + [-139.4314453125, 60.0122558593751], + [-140.41982421875, 59.7107421875], + [-141.40830078125, 59.902783203125], + [-141.408740234375, 60.1176757812501], + [-141.670166015625, 59.969873046875], + [-142.945654296875, 60.09697265625], + [-144.147216796875, 60.01640625], + [-144.185498046875, 60.150732421875], + [-144.901318359375, 60.33515625], + [-144.69111328125, 60.669091796875], + [-145.248291015625, 60.3801269531251], + [-145.898876953125, 60.4781738281251], + [-145.67490234375, 60.651123046875], + [-146.570458984375, 60.729150390625], + [-146.3919921875, 60.81083984375], + [-146.638427734375, 60.897314453125], + [-146.59912109375, 61.053515625], + [-146.284912109375, 61.112646484375], + [-147.89111328125, 60.889892578125], + [-148.005126953125, 60.9685546875], + [-147.75185546875, 61.2189453125], + [-148.34189453125, 61.060400390625], + [-148.34443359375, 60.853564453125], + [-148.55615234375, 60.8270019531251], + [-148.25673828125, 60.67529296875], + [-148.64013671875, 60.489453125], + [-148.119189453125, 60.575146484375], + [-147.964111328125, 60.48486328125], + [-148.430712890625, 59.989111328125], + [-149.2666015625, 59.998291015625], + [-149.395263671875, 60.10576171875], + [-149.598046875, 59.770458984375], + [-149.7138671875, 59.919580078125], + [-149.80126953125, 59.737939453125], + [-150.005322265625, 59.784423828125], + [-150.198046875, 59.5665527343751], + [-150.607373046875, 59.56337890625], + [-150.934521484375, 59.24912109375], + [-151.182763671875, 59.30078125], + [-151.73818359375, 59.188525390625], + [-151.94951171875, 59.265087890625], + [-151.884619140625, 59.386328125], + [-151.399609375, 59.51630859375], + [-151.046484375, 59.771826171875], + [-151.45009765625, 59.650390625], + [-151.85322265625, 59.782080078125], + [-151.39599609375, 60.274462890625], + [-151.3564453125, 60.72294921875], + [-150.441259765625, 61.0235839843751], + [-149.07509765625, 60.876416015625], + [-150.053271484375, 61.17109375], + [-149.433544921875, 61.50078125], + [-149.97568359375, 61.279345703125], + [-150.612255859375, 61.301123046875], + [-151.593505859375, 60.979638671875], + [-152.54091796875, 60.2654296875], + [-153.025, 60.295654296875], + [-152.660107421875, 59.997216796875], + [-153.21123046875, 59.842724609375], + [-153.093603515625, 59.7091308593751], + [-153.6525390625, 59.647021484375], + [-154.1783203125, 59.1555664062501], + [-153.41826171875, 58.9599609375], + [-153.43759765625, 58.754833984375], + [-154.289013671875, 58.304345703125], + [-154.247021484375, 58.159423828125], + [-155.006884765625, 58.016064453125], + [-155.777978515625, 57.568212890625], + [-156.435888671875, 57.3599609375], + [-156.62900390625, 57.0099609375], + [-158.414404296875, 56.43583984375], + [-158.5521484375, 56.3126953125], + [-158.275634765625, 56.196240234375], + [-158.5046875, 56.062109375], + [-158.591162109375, 56.184521484375], + [-158.78984375, 55.9869140625001], + [-159.5232421875, 55.810009765625], + [-159.65966796875, 55.625927734375], + [-159.77138671875, 55.84111328125], + [-160.49931640625, 55.5373046875], + [-161.38193359375, 55.3712890625], + [-161.443798828125, 55.51328125], + [-161.202099609375, 55.5435546875001], + [-161.516943359375, 55.618408203125], + [-162.073974609375, 55.1393066406251], + [-162.386376953125, 55.05234375], + [-162.63037109375, 55.2466796875], + [-162.674365234375, 54.99658203125], + [-162.8650390625, 54.954541015625], + [-163.11962890625, 55.064697265625], + [-163.131103515625, 54.916552734375], + [-163.335302734375, 54.83916015625], + [-163.27880859375, 55.121826171875], + [-162.906591796875, 55.195556640625], + [-161.697314453125, 55.9072265625], + [-161.215625, 56.021435546875], + [-160.8986328125, 55.99365234375], + [-161.00537109375, 55.887158203125], + [-160.80283203125, 55.754443359375], + [-160.70634765625, 55.870458984375], + [-160.29169921875, 55.8050781250001], + [-160.5390625, 56.006298828125], + [-160.30205078125, 56.314111328125], + [-158.918017578125, 56.882177734375], + [-158.675146484375, 56.794873046875], + [-158.660791015625, 57.039404296875], + [-158.320947265625, 57.297900390625], + [-157.845751953125, 57.528076171875], + [-157.4619140625, 57.506201171875], + [-157.697216796875, 57.679443359375], + [-157.610888671875, 58.0508300781251], + [-157.193701171875, 58.1941894531251], + [-157.48837890625, 58.2537109375], + [-157.5236328125, 58.421337890625], + [-156.974658203125, 58.736328125], + [-156.80888671875, 59.13427734375], + [-157.142041015625, 58.87763671875], + [-158.19091796875, 58.6142578125], + [-158.503173828125, 58.850341796875], + [-158.425634765625, 58.99931640625], + [-158.080517578125, 58.97744140625], + [-158.422802734375, 59.08984375], + [-158.678271484375, 58.92939453125], + [-158.80947265625, 58.973876953125], + [-158.788623046875, 58.440966796875], + [-158.95068359375, 58.404541015625], + [-159.670263671875, 58.9111328125], + [-159.92021484375, 58.8198730468751], + [-160.363134765625, 59.051171875], + [-161.246826171875, 58.799462890625], + [-161.361328125, 58.66953125], + [-162.144921875, 58.64423828125], + [-161.724365234375, 58.794287109375], + [-161.644384765625, 59.10966796875], + [-161.9810546875, 59.146142578125], + [-161.8287109375, 59.588623046875], + [-162.421337890625, 60.283984375], + [-161.96201171875, 60.695361328125], + [-162.6849609375, 60.2689453125], + [-162.570751953125, 59.98974609375], + [-163.68037109375, 59.801513671875], + [-164.142822265625, 59.89677734375], + [-165.026513671875, 60.500634765625], + [-165.35380859375, 60.5412109375], + [-164.80517578125, 60.892041015625], + [-164.318505859375, 60.7712890625], + [-164.37236328125, 60.591845703125], + [-163.999560546875, 60.766064453125], + [-163.72998046875, 60.589990234375], + [-163.420947265625, 60.757421875], + [-163.90654296875, 60.85380859375], + [-163.5869140625, 60.902978515625], + [-163.7490234375, 60.9697265625], + [-163.99462890625, 60.864697265625], + [-165.11484375, 60.9328125], + [-164.868994140625, 61.111767578125], + [-165.27978515625, 61.16962890625], + [-165.2736328125, 61.274853515625], + [-165.565869140625, 61.10234375], + [-165.86396484375, 61.335693359375], + [-165.8453125, 61.53623046875], + [-166.152734375, 61.5459472656251], + [-166.168115234375, 61.650830078125], + [-165.808935546875, 61.69609375], + [-166.07880859375, 61.803125], + [-165.61279296875, 61.869287109375], + [-165.707275390625, 62.1004394531251], + [-165.19453125, 62.47353515625], + [-164.757861328125, 62.496728515625], + [-164.589453125, 62.709375], + [-164.79267578125, 62.623193359375], + [-164.799658203125, 62.91806640625], + [-164.384228515625, 63.03046875], + [-164.409033203125, 63.2150390625], + [-163.94287109375, 63.247216796875], + [-163.61630859375, 63.125146484375], + [-163.737841796875, 63.01640625], + [-163.504345703125, 63.105859375], + [-163.287841796875, 63.046435546875], + [-162.621484375, 63.2658203125], + [-162.2828125, 63.52919921875], + [-161.973974609375, 63.4529296875], + [-161.09970703125, 63.55791015625], + [-160.778564453125, 63.8189453125], + [-160.987548828125, 64.25126953125], + [-161.49072265625, 64.4337890625], + [-160.93193359375, 64.5791015625], + [-160.855908203125, 64.755615234375], + [-161.13017578125, 64.9254394531251], + [-161.759375, 64.816259765625], + [-162.80703125, 64.37421875], + [-163.20390625, 64.652001953125], + [-163.1443359375, 64.423828125], + [-163.7130859375, 64.588232421875], + [-164.978759765625, 64.453662109375], + [-166.1427734375, 64.582763671875], + [-166.481396484375, 64.7280761718751], + [-166.415234375, 64.926513671875], + [-166.92841796875, 65.157080078125], + [-166.15703125, 65.28583984375], + [-167.40400390625, 65.422119140625], + [-168.08837890625, 65.657763671875], + [-166.39873046875, 66.1444335937501], + [-165.629931640625, 66.131201171875], + [-165.776171875, 66.31904296875], + [-164.460498046875, 66.588427734375], + [-163.638232421875, 66.574658203125], + [-163.8939453125, 66.57587890625], + [-164.033740234375, 66.21552734375], + [-163.695361328125, 66.083837890625], + [-161.93369140625, 66.04287109375], + [-161.455419921875, 66.281396484375], + [-161.03427734375, 66.188818359375], + [-161.1203125, 66.334326171875], + [-161.91689453125, 66.41181640625], + [-162.54365234375, 66.805126953125], + [-162.36162109375, 66.947314453125], + [-161.591015625, 66.459521484375], + [-160.231689453125, 66.420263671875], + [-160.360888671875, 66.6125], + [-160.864013671875, 66.670849609375], + [-161.398046875, 66.55185546875], + [-161.856689453125, 66.700341796875], + [-161.719921875, 67.020556640625], + [-163.5318359375, 67.102587890625], + [-164.1251953125, 67.6067382812501], + [-166.786279296875, 68.359619140625], + [-166.380517578125, 68.425146484375], + [-166.20908203125, 68.8853515625], + [-165.0439453125, 68.882470703125], + [-163.867919921875, 69.0366699218751], + [-161.88095703125, 70.33173828125], + [-162.073876953125, 70.161962890625], + [-160.9962890625, 70.30458984375], + [-160.117138671875, 70.5912109375], + [-159.865673828125, 70.278857421875], + [-159.814990234375, 70.4970703125], + [-159.386767578125, 70.52451171875], + [-160.081591796875, 70.63486328125], + [-159.680908203125, 70.786767578125], + [-159.314501953125, 70.878515625], + [-159.251171875, 70.7484375], + [-157.909375, 70.860107421875], + [-156.47021484375, 71.407666015625], + [-156.469970703125, 71.2915527343751], + [-155.579443359375, 71.12109375], + [-156.14658203125, 70.92783203125], + [-155.97353515625, 70.8419921875], + [-155.166845703125, 71.0992187500001], + [-154.19521484375, 70.801123046875], + [-153.23291015625, 70.932568359375], + [-152.4912109375, 70.88095703125], + [-152.23291015625, 70.8103515625], + [-152.39921875, 70.620458984375], + [-151.76904296875, 70.56015625], + [-151.944677734375, 70.452099609375], + [-149.26943359375, 70.50078125], + [-147.70537109375, 70.217236328125], + [-145.82314453125, 70.16005859375], + [-145.19736328125, 70.00869140625], + [-143.218310546875, 70.116259765625], + [-142.707861328125, 70.0337890625], + [-141.40791015625, 69.653369140625], + [-141.0021484375, 69.65078125], + [-141.0021484375, 68.7741699218751] + ] + ] + ] + }, + "properties": { + "name": "United States", + "childNum": 76 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [71.2061523437501, 39.892578125], + [71.15625, 39.883447265625], + [71.0642578125, 39.8849121093751], + [71.01171875, 39.8951171875], + [71.04365234375, 39.976318359375], + [71.0448242187501, 39.992529296875], + [70.96064453125, 40.08798828125], + [71.00546875, 40.152294921875], + [71.0241210937501, 40.149169921875], + [71.0803710937501, 40.0798828125], + [71.2287109375001, 40.04814453125], + [71.2061523437501, 39.892578125] + ] + ], + [ + [ + [70.94677734375, 42.2486816406251], + [70.97900390625, 42.266552734375], + [71.03603515625, 42.28466796875], + [71.1299804687501, 42.25], + [71.2126953125, 42.2064453125001], + [71.2323242187501, 42.186279296875], + [71.228515625, 42.162890625], + [70.1809570312501, 41.571435546875], + [70.734375, 41.400537109375], + [70.8604492187501, 41.22490234375], + [71.1107421875001, 41.15263671875], + [71.298828125, 41.152490234375], + [71.39306640625, 41.123388671875], + [71.4083984375, 41.13603515625], + [71.4208984375, 41.34189453125], + [71.60625, 41.367431640625], + [71.66494140625, 41.5412109375], + [71.70068359375, 41.45400390625], + [71.7577148437501, 41.42802734375], + [71.79248046875, 41.413134765625], + [71.8580078125001, 41.311376953125], + [71.8786132812501, 41.19501953125], + [71.95849609375, 41.187060546875], + [72.05244140625, 41.16474609375], + [72.1154296875001, 41.186572265625], + [72.1642578125001, 41.17373046875], + [72.18095703125, 41.11845703125], + [72.1873046875, 41.025927734375], + [72.2130859375001, 41.0142578125], + [72.3640625, 41.04345703125], + [72.65830078125, 40.869921875], + [73.13212890625, 40.828515625], + [72.6041015625, 40.525439453125], + [72.40205078125, 40.578076171875], + [72.3892578125, 40.427392578125], + [72.13125, 40.438623046875], + [71.69248046875, 40.15234375], + [71.3046875, 40.2869140625], + [70.990625, 40.2548828125], + [70.9580078125, 40.2388671875], + [70.653125, 40.201171875], + [70.37158203125, 40.3841308593751], + [70.7510742187501, 40.72177734375], + [70.4019531250001, 41.035107421875], + [69.712890625, 40.656982421875], + [69.3572265625, 40.7673828125], + [69.20625, 40.566552734375], + [69.27490234375, 40.198095703125], + [68.6306640625001, 40.16708984375], + [68.9720703125, 40.08994140625], + [68.8046875, 40.050341796875], + [68.86875, 39.907470703125], + [68.6389648437501, 39.8388671875], + [68.46328125, 39.53671875], + [67.7190429687501, 39.62138671875], + [67.426171875, 39.465576171875], + [67.3576171875001, 39.21669921875], + [67.6483398437501, 39.1310546875], + [67.6944335937501, 38.99462890625], + [68.13251953125, 38.92763671875], + [68.08720703125, 38.47353515625], + [68.3502929687501, 38.21103515625], + [67.8143554687501, 37.48701171875], + [67.7980468750001, 37.244970703125], + [67.758984375, 37.172216796875], + [67.7529296875, 37.1998046875], + [67.7, 37.22724609375], + [67.607421875, 37.2225097656251], + [67.5172851562501, 37.266650390625], + [67.4416992187501, 37.2580078125], + [67.3197265625, 37.2095703125], + [67.1955078125001, 37.235205078125], + [67.06884765625, 37.334814453125], + [66.8277343750001, 37.3712890625], + [66.5222656250001, 37.3484863281251], + [66.51064453125, 37.45869140625], + [66.5113281250001, 37.599169921875], + [66.5255859375, 37.7857421875], + [66.60625, 37.9867187500001], + [65.97119140625, 38.24423828125], + [65.612890625, 38.23857421875], + [64.3099609375, 38.977294921875], + [63.763671875, 39.160546875], + [62.483203125, 39.975634765625], + [61.90283203125, 41.093701171875], + [61.49697265625, 41.27607421875], + [61.2423828125001, 41.189208984375], + [60.45498046875, 41.221630859375], + [60.0896484375001, 41.3994140625], + [60.0755859375001, 41.75966796875], + [60.2007812500001, 41.803125], + [59.941796875, 41.97353515625], + [59.98515625, 42.21171875], + [59.354296875, 42.323291015625], + [58.5890625000001, 42.778466796875], + [58.4771484375, 42.662841796875], + [58.1515625, 42.628076171875], + [58.4744140625001, 42.299365234375], + [58.02890625, 42.4876464843751], + [57.8142578125001, 42.1898437500001], + [57.290625, 42.123779296875], + [56.9640625, 41.85654296875], + [57.11884765625, 41.35029296875], + [57.01796875, 41.2634765625], + [55.9774414062501, 41.322216796875], + [55.9756835937501, 44.994921875], + [58.5552734375, 45.55537109375], + [61.00791015625, 44.393798828125], + [61.990234375, 43.492138671875], + [63.20703125, 43.627978515625], + [64.4431640625001, 43.551171875], + [64.9054687500001, 43.714697265625], + [65.49619140625, 43.310546875], + [65.80302734375, 42.8769531250001], + [66.1002929687501, 42.9908203125], + [66.0095703125001, 42.0048828125], + [66.4986328125001, 41.994873046875], + [66.70966796875, 41.179150390625], + [67.9357421875001, 41.19658203125], + [68.1130859375001, 41.02861328125], + [68.0476562500001, 40.80927734375], + [68.29189453125, 40.656103515625], + [68.57265625, 40.62265625], + [68.58408203125, 40.87626953125], + [69.15361328125, 41.425244140625], + [70.94677734375, 42.2486816406251] + ] + ] + ] + }, + "properties": { + "name": "Uzbekistan", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-61.17451171875, 13.15810546875], + [-61.26845703125, 13.2876953125], + [-61.13896484375, 13.358740234375], + [-61.17451171875, 13.15810546875] + ] + ] + }, + "properties": { + "name": "St. Vin. and Gren.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-60.997900390625, 8.86733398437497], + [-61.069189453125, 8.947314453125], + [-60.9158203125, 9.07031250000001], + [-60.86142578125, 8.94960937500004], + [-60.997900390625, 8.86733398437497] + ] + ], + [ + [ + [-60.82119140625, 9.13837890625003], + [-60.94140625, 9.10556640625001], + [-60.73583984375, 9.20332031250003], + [-60.82119140625, 9.13837890625003] + ] + ], + [ + [ + [-63.8493652343749, 11.131005859375], + [-63.917626953125, 10.887548828125], + [-64.40234375, 10.981591796875], + [-64.213671875, 11.0861328125], + [-64.0283203125, 11.00185546875], + [-63.8493652343749, 11.131005859375] + ] + ], + [ + [ + [-60.7421386718749, 5.20205078125004], + [-60.711962890625, 5.19155273437502], + [-60.67197265625, 5.16435546874999], + [-60.603857421875, 4.94936523437498], + [-61.00283203125, 4.53525390624999], + [-61.280078125, 4.51689453124997], + [-61.820849609375, 4.197021484375], + [-62.153125, 4.09838867187499], + [-62.4106445312499, 4.15673828124997], + [-62.712109375, 4.01791992187502], + [-62.856982421875, 3.59345703124997], + [-63.338671875, 3.94389648437505], + [-64.021484375, 3.92910156250005], + [-64.19248046875, 4.12685546875001], + [-64.5763671875, 4.139892578125], + [-64.788671875, 4.27602539062502], + [-64.668994140625, 4.01181640625002], + [-64.22109375, 3.58740234374997], + [-64.04658203125, 2.502392578125], + [-63.3892578125, 2.41191406250005], + [-63.4325195312499, 2.15556640625005], + [-64.00849609375, 1.93159179687497], + [-64.2050292968749, 1.52949218750004], + [-65.103759765625, 1.10810546874998], + [-65.473388671875, 0.691259765624977], + [-65.5560546875, 0.687988281250014], + [-65.5229980468749, 0.843408203124966], + [-65.6814453125, 0.983447265624989], + [-66.06005859375, 0.78535156250004], + [-66.347119140625, 0.7671875], + [-66.876025390625, 1.22304687500004], + [-67.21083984375, 2.39013671875004], + [-67.618701171875, 2.79360351562499], + [-67.85908203125, 2.79360351562499], + [-67.3111328125, 3.41586914062502], + [-67.66162109375, 3.86425781249999], + [-67.8552734375, 4.50688476562499], + [-67.82490234375, 5.27045898437503], + [-67.473876953125, 5.92998046875], + [-67.481982421875, 6.18027343750002], + [-67.8591796875, 6.28989257812496], + [-68.47177734375, 6.15654296874997], + [-69.4271484375, 6.123974609375], + [-70.12919921875, 6.95361328125], + [-70.737158203125, 7.0900390625], + [-71.1286132812499, 6.98671875], + [-72.0066406249999, 7.03261718750002], + [-72.20771484375, 7.37026367187498], + [-72.47197265625, 7.52426757812499], + [-72.39033203125, 8.28706054687497], + [-72.6654296874999, 8.62758789062498], + [-72.79638671875, 9.10898437499999], + [-73.0583984375, 9.25957031250003], + [-73.3662109375, 9.19414062500002], + [-73.00654296875, 9.78916015625001], + [-72.8693359375, 10.491259765625], + [-72.690087890625, 10.83583984375], + [-72.248486328125, 11.196435546875], + [-71.95810546875, 11.66640625], + [-71.3197265625, 11.8619140625], + [-71.95693359375, 11.569921875], + [-71.835107421875, 11.19033203125], + [-71.6416015625, 11.013525390625], + [-71.730908203125, 10.994677734375], + [-71.5943359375, 10.6573730468751], + [-72.112841796875, 9.81557617187497], + [-71.6195312499999, 9.04794921874999], + [-71.24140625, 9.16044921875], + [-71.08583984375, 9.34824218749998], + [-71.052685546875, 9.70581054687499], + [-71.49423828125, 10.533203125], + [-71.4695312499999, 10.96416015625], + [-70.23251953125, 11.372998046875], + [-70.0971191406249, 11.519775390625], + [-69.80478515625, 11.47421875], + [-69.817333984375, 11.6720703125], + [-70.1925781249999, 11.624609375], + [-70.2865234375, 11.88603515625], + [-70.202783203125, 12.098388671875], + [-70.003955078125, 12.177880859375], + [-69.6315917968749, 11.479931640625], + [-68.827978515625, 11.43173828125], + [-68.3986328125, 11.160986328125], + [-68.2962890625, 10.68935546875], + [-68.13994140625, 10.492724609375], + [-66.247216796875, 10.6322265625], + [-65.8517578125, 10.257763671875], + [-65.1291015625, 10.070068359375], + [-64.85048828125, 10.098095703125], + [-64.188330078125, 10.4578125], + [-63.731884765625, 10.50341796875], + [-64.247509765625, 10.542578125], + [-64.298193359375, 10.63515625], + [-61.8794921875, 10.741015625], + [-62.37998046875, 10.546875], + [-62.91357421875, 10.531494140625], + [-62.68583984375, 10.289794921875], + [-62.740576171875, 10.05615234375], + [-62.550341796875, 10.200439453125], + [-62.32041015625, 9.78305664062501], + [-62.221142578125, 9.88256835937503], + [-62.1533691406249, 9.82177734374999], + [-62.155322265625, 9.97924804687501], + [-62.0770996093749, 9.97504882812504], + [-61.7359375, 9.63120117187498], + [-61.76591796875, 9.81381835937496], + [-61.5888671874999, 9.89453124999999], + [-60.79248046875, 9.36074218750004], + [-61.02314453125, 9.15458984374996], + [-61.247265625, 8.60034179687501], + [-61.618701171875, 8.59746093749996], + [-61.30400390625, 8.41040039062504], + [-60.8009765624999, 8.59213867187503], + [-60.16748046875, 8.61699218750003], + [-60.017529296875, 8.54931640625001], + [-59.831640625, 8.30595703125], + [-59.849072265625, 8.24868164062497], + [-59.96484375, 8.19160156249997], + [-59.99072265625, 8.16201171874998], + [-60.0324218749999, 8.05356445312501], + [-60.513623046875, 7.81318359374997], + [-60.7186523437499, 7.53593749999997], + [-60.60654296875, 7.32084960937503], + [-60.63330078125, 7.21108398437497], + [-60.583203125, 7.15620117187497], + [-60.523193359375, 7.14370117187501], + [-60.46494140625, 7.16655273437505], + [-60.3923828125, 7.16455078124999], + [-60.345068359375, 7.15], + [-60.32548828125, 7.13398437499998], + [-60.3220703125, 7.09204101562504], + [-60.352099609375, 7.002880859375], + [-60.39501953125, 6.945361328125], + [-60.717919921875, 6.768310546875], + [-61.14560546875, 6.69453124999998], + [-61.20361328125, 6.58837890625003], + [-61.1815917968749, 6.51337890625003], + [-61.151025390625, 6.44653320312499], + [-61.152294921875, 6.38510742187501], + [-61.1287109375, 6.21430664062503], + [-61.15947265625, 6.17441406249998], + [-61.224951171875, 6.12919921875], + [-61.303125, 6.04951171875003], + [-61.3908203125, 5.93876953125002], + [-61.376806640625, 5.90698242187503], + [-61.1671874999999, 5.67421875000004], + [-60.95400390625, 5.43740234375002], + [-60.7421386718749, 5.20205078125004] + ] + ] + ] + }, + "properties": { + "name": "Venezuela", + "childNum": 4 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-64.765625, 17.7943359375], + [-64.5804687499999, 17.7501953125], + [-64.889111328125, 17.701708984375], + [-64.765625, 17.7943359375] + ] + ] + }, + "properties": { + "name": "U.S. Virgin Is.", + "childNum": 1 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [104.06396484375, 10.3908203125], + [104.01845703125, 10.02919921875], + [103.84951171875, 10.37109375], + [104.06396484375, 10.3908203125] + ] + ], + [ + [ + [107.5212890625, 20.926611328125], + [107.39921875, 20.903466796875], + [107.55126953125, 21.034033203125], + [107.5212890625, 20.926611328125] + ] + ], + [ + [ + [107.602734375, 21.216796875], + [107.403515625, 21.09365234375], + [107.47626953125, 21.2689453125], + [107.602734375, 21.216796875] + ] + ], + [ + [ + [107.97265625, 21.507958984375], + [107.4099609375, 21.284814453125], + [107.354296875, 21.0551757812501], + [107.16474609375, 20.94873046875], + [106.6833984375, 21.0002929687501], + [106.75341796875, 20.73505859375], + [106.55078125, 20.5265625], + [106.5728515625, 20.3921875], + [105.98408203125, 19.9390625], + [105.62177734375, 18.96630859375], + [105.88828125, 18.502490234375], + [106.4990234375, 17.946435546875], + [106.47890625, 17.7195800781251], + [106.3705078125, 17.746875], + [107.8337890625, 16.3224609375], + [108.02939453125, 16.3311035156251], + [108.8212890625, 15.3779296875], + [109.3033203125, 13.8564453125], + [109.271875, 13.279345703125], + [109.42392578125, 12.95595703125], + [109.444921875, 12.5996093750001], + [109.335546875, 12.751904296875], + [109.2189453125, 12.64580078125], + [109.3046875, 12.391162109375], + [109.2068359375, 12.415380859375], + [109.1986328125, 11.724853515625], + [109.0396484375, 11.59267578125], + [108.98671875, 11.336376953125], + [108.094921875, 10.897265625], + [108.0013671875, 10.720361328125], + [107.2615234375, 10.398388671875], + [107.006640625, 10.660546875], + [106.9474609375, 10.400341796875], + [106.72734375, 10.53564453125], + [106.605859375, 10.46494140625], + [106.7412109375, 10.444384765625], + [106.757421875, 10.29580078125], + [106.4640625, 10.298291015625], + [106.78525390625, 10.116455078125], + [106.59560546875, 9.85986328125003], + [106.13642578125, 10.2216796875], + [106.56435546875, 9.715625], + [106.48408203125, 9.55942382812501], + [105.83095703125, 10.000732421875], + [106.15859375, 9.59414062499998], + [106.168359375, 9.396728515625], + [105.5009765625, 9.09321289062498], + [105.11435546875, 8.62919921875003], + [104.77041015625, 8.59765625], + [104.8962890625, 8.74663085937497], + [104.8185546875, 8.80185546875003], + [104.84521484375, 9.60615234375003], + [105.08447265625, 9.99570312499999], + [104.801953125, 10.202734375], + [104.6634765625, 10.169921875], + [104.4263671875, 10.41123046875], + [104.8505859375, 10.53447265625], + [105.04638671875, 10.70166015625], + [105.045703125, 10.911376953125], + [105.3146484375, 10.845166015625], + [105.40576171875, 10.951611328125], + [105.755078125, 10.989990234375], + [105.8533203125, 10.86357421875], + [106.16396484375, 10.794921875], + [106.1609375, 11.0371093750001], + [105.8560546875, 11.294287109375], + [105.85146484375, 11.635009765625], + [106.0060546875, 11.7580078125], + [106.39921875, 11.68701171875], + [106.4138671875, 11.9484375], + [106.70009765625, 11.979296875], + [107.212109375, 12.30400390625], + [107.393359375, 12.260498046875], + [107.5064453125, 12.36455078125], + [107.475390625, 13.03037109375], + [107.60546875, 13.43779296875], + [107.3314453125, 14.126611328125], + [107.51943359375, 14.705078125], + [107.51376953125, 14.8173828125001], + [107.52451171875, 14.871826171875], + [107.5046875, 14.91591796875], + [107.48037109375, 14.9798828125], + [107.5552734375, 15.05703125], + [107.5896484375, 15.11845703125], + [107.63369140625, 15.18984375], + [107.653125, 15.255224609375], + [107.6216796875, 15.30986328125], + [107.5642578125, 15.3916015625], + [107.4595703125, 15.4658203125], + [107.33876953125, 15.560498046875], + [107.27939453125, 15.618701171875], + [107.16591796875, 15.802490234375], + [107.1888671875, 15.838623046875], + [107.36064453125, 15.921728515625], + [107.3919921875, 15.95166015625], + [107.39638671875, 16.043017578125], + [106.9306640625, 16.353125], + [106.8927734375, 16.3965332031251], + [106.85107421875, 16.515625], + [106.832421875, 16.52626953125], + [106.7916015625, 16.49033203125], + [106.73955078125, 16.4525390625], + [106.6564453125, 16.492626953125], + [106.54619140625, 16.650732421875], + [106.53369140625, 16.8210449218751], + [106.5259765625, 16.876611328125], + [106.50224609375, 16.9541015625], + [106.26953125, 17.216796875], + [106.00625, 17.4152832031251], + [105.69140625, 17.737841796875], + [105.5884765625, 17.98369140625], + [105.5185546875, 18.07744140625], + [105.458203125, 18.154296875], + [105.11455078125, 18.4052734375], + [105.08701171875, 18.496240234375], + [105.14541015625, 18.6167968750001], + [105.146484375, 18.6509765625], + [103.8916015625, 19.30498046875], + [103.89638671875, 19.339990234375], + [103.93203125, 19.366064453125], + [104.0275390625, 19.420458984375], + [104.062890625, 19.4825683593751], + [104.0515625, 19.56416015625], + [104.0134765625, 19.646484375], + [104.03203125, 19.675146484375], + [104.06279296875, 19.67841796875], + [104.25986328125, 19.685498046875], + [104.5462890625, 19.610546875], + [104.587890625, 19.61875], + [104.7431640625, 19.754736328125], + [104.8017578125, 19.8361328125], + [104.81513671875, 19.90400390625], + [104.9279296875, 20.018115234375], + [104.92919921875, 20.0828125], + [104.888671875, 20.169091796875], + [104.8478515625, 20.20244140625], + [104.69873046875, 20.205322265625], + [104.676953125, 20.22470703125], + [104.6619140625, 20.289013671875], + [104.6564453125, 20.328515625], + [104.61884765625, 20.37451171875], + [104.49619140625, 20.413671875], + [104.3921875, 20.424755859375], + [104.3677734375, 20.44140625], + [104.4078125, 20.4857421875001], + [104.47861328125, 20.52958984375], + [104.53271484375, 20.5548828125], + [104.583203125, 20.6466796875], + [104.349609375, 20.8210937500001], + [104.1953125, 20.91396484375], + [104.1013671875, 20.9455078125], + [103.63505859375, 20.6970703125], + [103.46357421875, 20.779833984375], + [103.2107421875, 20.840625], + [103.1044921875, 20.891650390625], + [102.8837890625, 21.202587890625], + [102.851171875, 21.26591796875], + [102.949609375, 21.68134765625], + [102.84521484375, 21.7347656250001], + [102.81591796875, 21.807373046875], + [102.7982421875, 21.79794921875], + [102.77109375, 21.70966796875], + [102.73857421875, 21.6779296875], + [102.66201171875, 21.676025390625], + [102.58251953125, 21.904296875], + [102.12744140625, 22.37919921875], + [102.1759765625, 22.4146484375], + [102.23701171875, 22.466015625], + [102.4064453125, 22.7080078125], + [102.4708984375, 22.750927734375], + [102.98193359375, 22.4482421875], + [103.32666015625, 22.7697753906251], + [103.49296875, 22.58798828125], + [103.62021484375, 22.78203125], + [103.94150390625, 22.540087890625], + [104.14306640625, 22.800146484375], + [104.37177734375, 22.704052734375], + [104.6873046875, 22.822216796875], + [104.86474609375, 23.136376953125], + [105.275390625, 23.34521484375], + [105.84296875, 22.922802734375], + [106.1484375, 22.970068359375], + [106.27900390625, 22.857470703125], + [106.541796875, 22.908349609375], + [106.7802734375, 22.77890625], + [106.550390625, 22.5013671875], + [106.66357421875, 21.9789062500001], + [106.97099609375, 21.92392578125], + [107.351171875, 21.60888671875], + [107.75927734375, 21.6550292968751], + [107.97265625, 21.507958984375] + ] + ] + ] + }, + "properties": { + "name": "Vietnam", + "childNum": 4 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [169.49130859375, -19.54013671875], + [169.347265625, -19.62353515625], + [169.21748046875, -19.4763671875], + [169.2474609375, -19.3447265625], + [169.49130859375, -19.54013671875] + ] + ], + [ + [ + [169.334375, -18.940234375], + [168.9869140625, -18.8712890625], + [169.0158203125, -18.64375], + [169.14384765625, -18.6310546875], + [169.334375, -18.940234375] + ] + ], + [ + [ + [168.44580078125, -17.5421875], + [168.5849609375, -17.6958984375], + [168.524609375, -17.798046875], + [168.158203125, -17.710546875], + [168.27314453125, -17.55224609375], + [168.44580078125, -17.5421875] + ] + ], + [ + [ + [168.44677734375, -16.77880859375], + [168.1814453125, -16.80400390625], + [168.1353515625, -16.6369140625], + [168.44677734375, -16.77880859375] + ] + ], + [ + [ + [168.2966796875, -16.3365234375], + [167.92900390625, -16.2287109375], + [168.1638671875, -16.081640625], + [168.2966796875, -16.3365234375] + ] + ], + [ + [ + [167.4125, -16.0958984375], + [167.83662109375, -16.44970703125], + [167.44931640625, -16.55498046875], + [167.34921875, -16.1544921875], + [167.15146484375, -16.08046875], + [167.19951171875, -15.88505859375], + [167.3357421875, -15.91669921875], + [167.4125, -16.0958984375] + ] + ], + [ + [ + [167.911328125, -15.4359375], + [167.67421875, -15.4515625], + [168.0025390625, -15.283203125], + [167.911328125, -15.4359375] + ] + ], + [ + [ + [166.74580078125, -14.82685546875], + [166.81015625, -15.157421875], + [167.0755859375, -14.93564453125], + [167.20078125, -15.44306640625], + [167.0939453125, -15.580859375], + [166.75830078125, -15.63115234375], + [166.6310546875, -15.4060546875], + [166.5673828125, -14.641796875], + [166.74580078125, -14.82685546875] + ] + ], + [ + [ + [167.58486328125, -14.2609375], + [167.4302734375, -14.294921875], + [167.4107421875, -14.1974609375], + [167.5064453125, -14.1421875], + [167.58486328125, -14.2609375] + ] + ], + [ + [ + [167.4888671875, -13.9072265625], + [167.391796875, -13.78837890625], + [167.4810546875, -13.70947265625], + [167.4888671875, -13.9072265625] + ] + ] + ] + }, + "properties": { + "name": "Vanuatu", + "childNum": 10 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-171.4541015625, -14.046484375], + [-171.9119140625, -14.00166015625], + [-172.0458984375, -13.85712890625], + [-171.60390625, -13.87919921875], + [-171.4541015625, -14.046484375] + ] + ], + [ + [ + [-172.33349609375, -13.465234375], + [-172.17685546875, -13.68466796875], + [-172.224951171875, -13.804296875], + [-172.535693359375, -13.79169921875], + [-172.778515625, -13.516796875], + [-172.33349609375, -13.465234375] + ] + ] + ] + }, + "properties": { + "name": "Samoa", + "childNum": 2 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [53.76318359375, 12.63681640625], + [54.1874023437501, 12.664013671875], + [54.5111328125, 12.552783203125], + [54.1294921875001, 12.36064453125], + [53.7188476562501, 12.318994140625], + [53.3158203125001, 12.533154296875], + [53.5349609375, 12.715771484375], + [53.76318359375, 12.63681640625] + ] + ], + [ + [ + [42.755859375, 13.704296875], + [42.6897460937501, 13.6736328125], + [42.7941406250001, 13.76611328125], + [42.755859375, 13.704296875] + ] + ], + [ + [ + [42.7874023437501, 13.971484375], + [42.69404296875, 14.00791015625], + [42.7621093750001, 14.06748046875], + [42.7874023437501, 13.971484375] + ] + ], + [ + [ + [53.08564453125, 16.648388671875], + [52.327734375, 16.2935546875001], + [52.1740234375, 15.9568359375], + [52.2174804687501, 15.655517578125], + [51.3224609375001, 15.22626953125], + [49.34990234375, 14.63779296875], + [48.668359375, 14.050146484375], + [47.9899414062501, 14.048095703125], + [47.40771484375, 13.6616210937501], + [46.7888671875, 13.465576171875], + [45.6573242187501, 13.338720703125], + [45.0386718750001, 12.815869140625], + [44.6177734375, 12.817236328125], + [44.005859375, 12.607666015625], + [43.634375, 12.744482421875], + [43.4875976562501, 12.698828125], + [43.23193359375, 13.2670898437501], + [43.2824218750001, 13.692529296875], + [43.0890625, 14.010986328125], + [42.9364257812501, 14.93857421875], + [42.8556640625, 15.132958984375], + [42.6578125000001, 15.2328125000001], + [42.7990234375, 15.32626953125], + [42.7171875000001, 15.654638671875], + [42.8396484375, 16.0320312500001], + [42.79931640625, 16.37177734375], + [43.1650390625, 16.689404296875], + [43.19091796875, 17.359375], + [43.41796875, 17.516259765625], + [43.9169921875, 17.32470703125], + [45.1480468750001, 17.42744140625], + [45.5353515625001, 17.30205078125], + [46.7276367187501, 17.265576171875], + [46.9756835937501, 16.953466796875], + [47.1435546875, 16.9466796875], + [47.441796875, 17.111865234375], + [47.57958984375, 17.44833984375], + [48.17216796875, 18.15693359375], + [49.0419921875, 18.581787109375], + [51.97763671875, 18.9961425781251], + [53.08564453125, 16.648388671875] + ] + ] + ] + }, + "properties": { + "name": "Yemen", + "childNum": 4 + } + }, + { + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [37.85693359375, -46.94423828125], + [37.5900390625001, -46.9080078125001], + [37.78955078125, -46.8375], + [37.85693359375, -46.94423828125] + ] + ], + [ + [ + [31.799609375, -23.8921875], + [31.98583984375, -24.46064453125], + [31.9216796875, -25.96875], + [31.3351562500001, -25.75556640625], + [31.2073242187501, -25.843359375], + [31.0880859375, -25.9806640625], + [30.8033203125, -26.4134765625], + [30.80673828125, -26.78525390625], + [30.88330078125, -26.7923828125], + [30.9380859375, -26.9158203125], + [31.0633789062501, -27.1123046875], + [31.2740234375001, -27.23837890625], + [31.46953125, -27.2955078125], + [31.7425781250001, -27.3099609375], + [31.9583984375001, -27.305859375], + [31.94609375, -27.1736328125], + [31.9671875000001, -26.96064453125], + [31.9947265625, -26.81748046875], + [32.0248046875, -26.8111328125], + [32.112890625, -26.839453125], + [32.199609375, -26.83349609375], + [32.353515625, -26.86162109375], + [32.7765625000001, -26.8509765625], + [32.8861328125001, -26.84931640625], + [32.5347656250001, -28.19970703125], + [32.2857421875, -28.621484375], + [31.3351562500001, -29.378125], + [29.97119140625, -31.3220703125], + [28.4494140625001, -32.624609375], + [27.0774414062501, -33.52119140625], + [26.4294921875, -33.7595703125], + [25.805859375, -33.737109375], + [25.5742187500001, -34.0353515625], + [25.0029296875, -33.9736328125], + [24.8271484375, -34.1689453125], + [24.5955078125001, -34.17451171875], + [23.6978515625001, -33.9927734375], + [23.2681640625, -34.08115234375], + [22.5538085937501, -34.01005859375], + [22.2455078125001, -34.069140625], + [21.78896484375, -34.37265625], + [20.5298828125, -34.4630859375], + [20.02060546875, -34.7857421875], + [19.2982421875, -34.6150390625], + [19.3307617187501, -34.4923828125], + [19.0983398437501, -34.35009765625], + [18.83134765625, -34.3640625], + [18.7521484375, -34.0826171875], + [18.500390625, -34.10927734375], + [18.46162109375, -34.346875], + [18.35205078125, -34.1884765625], + [18.4330078125001, -33.71728515625], + [17.8510742187501, -32.82744140625], + [17.9652343750001, -32.70859375], + [18.125, -32.74912109375], + [18.32529296875, -32.50498046875], + [18.2108398437501, -31.74248046875], + [17.3470703125001, -30.44482421875], + [16.95, -29.40341796875], + [16.739453125, -29.009375], + [16.44755859375, -28.617578125], + [16.75576171875, -28.4521484375], + [16.7875, -28.3947265625], + [16.81015625, -28.26455078125], + [16.8412109375, -28.2189453125], + [16.87529296875, -28.1279296875], + [16.93330078125, -28.06962890625], + [17.05625, -28.0310546875], + [17.1884765625, -28.13251953125], + [17.35869140625, -28.26943359375], + [17.44794921875, -28.69814453125], + [18.31083984375, -28.88623046875], + [19.16171875, -28.93876953125], + [19.2458007812501, -28.90166015625], + [19.3126953125, -28.73330078125], + [19.53984375, -28.574609375], + [19.98046875, -28.45126953125], + [19.98046875, -28.3103515625], + [19.98046875, -24.7767578125], + [20.4306640625001, -25.1470703125], + [20.7931640625, -25.915625], + [20.64140625, -26.7421875], + [20.73984375, -26.848828125], + [21.6947265625, -26.84091796875], + [21.7380859375, -26.8068359375], + [21.7882812500001, -26.71005859375], + [22.0109375, -26.63583984375], + [22.09091796875, -26.58017578125], + [22.217578125, -26.3888671875], + [22.4708984375, -26.21904296875], + [22.5486328125001, -26.17841796875], + [22.59765625, -26.13271484375], + [22.87880859375, -25.45791015625], + [23.14873046875, -25.288671875], + [23.3892578125, -25.29140625], + [23.89375, -25.60087890625], + [23.96953125, -25.62607421875], + [24.19296875, -25.63291015625], + [24.33056640625, -25.74287109375], + [25.21337890625, -25.75625], + [25.5181640625, -25.66279296875], + [25.912109375, -24.7474609375], + [26.0318359375, -24.70244140625], + [26.1308593750001, -24.671484375], + [26.39716796875, -24.61357421875], + [26.4517578125001, -24.58271484375], + [26.8350585937501, -24.2408203125], + [27.085546875, -23.5779296875], + [27.7685546875, -23.14892578125], + [27.81259765625, -23.1080078125], + [28.21015625, -22.69365234375], + [28.83984375, -22.480859375], + [28.94580078125, -22.3951171875], + [29.0134765625, -22.27841796875], + [29.1298828125001, -22.21328125], + [29.3648437500001, -22.1939453125001], + [29.37744140625, -22.1927734375], + [29.6630859375, -22.1462890625], + [29.90234375, -22.1841796875], + [30.1904296875, -22.29111328125], + [30.4601562500001, -22.32900390625], + [30.71162109375, -22.2978515625], + [31.0734375, -22.3078125], + [31.197265625, -22.344921875], + [31.2878906250001, -22.40205078125], + [31.54560546875, -23.48232421875], + [31.799609375, -23.8921875] + ], + [ + [27.1935546875, -29.94130859375], + [27.3640625, -30.27919921875], + [27.753125, -30.6], + [28.0568359375, -30.6310546875], + [28.1287109375, -30.52509765625], + [28.39208984375, -30.14755859375], + [28.646875, -30.1265625], + [29.0980468750001, -29.91904296875], + [29.1421875000001, -29.7009765625], + [29.2935546875, -29.56689453125], + [29.3488281250001, -29.4419921875], + [29.38671875, -29.3197265625], + [29.3013671875, -29.08984375], + [28.62578125, -28.5817382812501], + [28.5833984375, -28.594140625], + [28.471875, -28.6158203125], + [28.2326171875, -28.70126953125], + [28.084375, -28.77998046875], + [27.9598632812501, -28.87333984375], + [27.735546875, -28.9400390625], + [27.2945312500001, -29.5193359375], + [27.0569335937501, -29.6255859375], + [27.1935546875, -29.94130859375] + ] + ] + ] + }, + "properties": { + "name": "South Africa", + "childNum": 2 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [33.148046875, -9.603515625], + [33.25, -9.7595703125], + [33.3509765625, -9.86220703125001], + [33.337109375, -9.95400390625001], + [33.3115234375, -10.03798828125], + [33.52890625, -10.23466796875], + [33.53759765625, -10.3515625], + [33.5537109375, -10.39130859375], + [33.6615234375, -10.553125], + [33.2927734375, -10.85234375], + [33.37978515625, -11.15791015625], + [33.268359375, -11.40390625], + [33.23271484375, -11.41767578125], + [33.2263671875, -11.53486328125], + [33.30390625, -11.6908203125], + [33.25234375, -12.11259765625], + [33.34013671875, -12.30830078125], + [33.5123046875, -12.34775390625], + [32.9751953125, -12.7013671875], + [32.967578125, -13.225], + [32.67041015625, -13.5904296875], + [32.7974609375, -13.6884765625], + [32.98125, -14.009375], + [33.148046875, -13.94091796875], + [33.2017578125, -14.01337890625], + [30.2318359375, -14.99033203125], + [30.39609375, -15.64306640625], + [29.4873046875, -15.69677734375], + [28.9130859375, -15.98779296875], + [28.760546875, -16.53212890625], + [27.9322265625, -16.89619140625], + [27.02080078125, -17.9583984375], + [26.7798828125, -18.04150390625], + [26.3333984375, -17.929296875], + [25.9958984375, -17.96982421875], + [25.2587890625, -17.7935546875], + [25.0017578125, -17.5685546875], + [24.73291015625, -17.5177734375], + [24.27490234375, -17.4810546875], + [23.3806640625, -17.640625], + [22.1939453125, -16.628125], + [21.97978515625, -15.95556640625], + [21.97939453125, -14.44052734375], + [21.979296875, -14.11962890625], + [21.9791015625, -13.79873046875], + [21.97890625, -13.0009765625], + [22.2095703125, -13.0009765625], + [23.8431640625, -13.0009765625], + [23.96298828125, -12.9884765625], + [23.882421875, -12.7990234375], + [23.8865234375, -12.74326171875], + [23.909375, -12.6361328125], + [23.98388671875, -11.725], + [23.96650390625, -10.87177734375], + [24.36572265625, -11.1298828125], + [24.3779296875, -11.41708984375], + [25.28876953125, -11.21240234375], + [25.3494140625, -11.623046875], + [26.0259765625, -11.89013671875], + [26.8240234375, -11.965234375], + [27.1591796875, -11.57919921875], + [27.573828125, -12.22705078125], + [28.412890625, -12.51806640625], + [28.55087890625, -12.8361328125], + [28.730078125, -12.92548828125], + [29.0142578125, -13.36884765625], + [29.20185546875, -13.39833984375], + [29.55419921875, -13.24892578125], + [29.7751953125, -13.4380859375], + [29.7951171875, -12.15546875], + [29.508203125, -12.22822265625], + [29.485546875, -12.41845703125], + [29.06435546875, -12.348828125], + [28.48251953125, -11.812109375], + [28.3833984375, -11.56669921875], + [28.6455078125, -10.5501953125], + [28.60419921875, -9.67880859375001], + [28.40068359375, -9.22480468750001], + [28.86953125, -8.78583984375001], + [28.89814453125, -8.48544921875001], + [30.751171875, -8.19365234375], + [30.8306640625, -8.385546875], + [30.8919921875, -8.47373046875001], + [30.968359375, -8.55097656250001], + [31.0763671875, -8.61191406250001], + [31.3505859375, -8.60703125], + [31.44921875, -8.65390625], + [31.53486328125, -8.71328125], + [31.55625, -8.80546875], + [31.6736328125, -8.90878906250001], + [31.91865234375, -8.9421875], + [31.921875, -9.01943359375001], + [31.942578125, -9.05400390625], + [32.756640625, -9.322265625], + [32.919921875, -9.40742187500001], + [32.99599609375, -9.6228515625], + [33.148046875, -9.603515625] + ] + ] + }, + "properties": { + "name": "Zambia", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [31.287890625, -22.40205078125], + [31.0734375, -22.3078125], + [30.71162109375, -22.2978515625], + [30.46015625, -22.32900390625], + [30.1904296875, -22.29111328125], + [29.90234375, -22.1841796875], + [29.6630859375, -22.1462890625], + [29.37744140625, -22.1927734375], + [29.36484375, -22.1939453125], + [29.315234375, -22.15771484375], + [29.23720703125, -22.0794921875], + [29.0423828125, -22.018359375], + [29.0255859375, -21.796875], + [28.0140625, -21.55419921875], + [27.66943359375, -21.0642578125], + [27.679296875, -20.50302734375], + [27.28076171875, -20.4787109375], + [27.17822265625, -20.1009765625], + [26.16806640625, -19.53828125], + [25.93935546875, -18.938671875], + [25.24228515625, -17.96904296875], + [25.2587890625, -17.7935546875], + [25.9958984375, -17.96982421875], + [26.3333984375, -17.929296875], + [26.7798828125, -18.04150390625], + [27.02080078125, -17.9583984375], + [27.9322265625, -16.89619140625], + [28.760546875, -16.53212890625], + [28.9130859375, -15.98779296875], + [29.4873046875, -15.69677734375], + [30.39609375, -15.64306640625], + [30.43779296875, -15.9953125], + [31.23623046875, -16.0236328125], + [31.93984375, -16.42880859375], + [32.948046875, -16.7123046875], + [32.87626953125, -16.88359375], + [32.99306640625, -18.3595703125], + [32.69970703125, -18.94091796875], + [32.8498046875, -19.10439453125], + [32.77763671875, -19.38876953125], + [32.9927734375, -19.98486328125], + [32.4923828125, -20.659765625], + [32.35361328125, -21.1365234375], + [32.42978515625, -21.2970703125], + [31.4294921875, -22.298828125], + [31.287890625, -22.40205078125] + ] + ] + }, + "properties": { + "name": "Zimbabwe", + "childNum": 1 + } + }, + { + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [74.5751953125, 37.0902398030721], + [74.1796875, 36.8796206050268], + [73.7841796875, 36.8444607407956], + [72.94921875, 36.774092494642], + [72.158203125, 36.6331620955866], + [71.4990234375, 36.4919734705937], + [71.19140625, 36.0313317763319], + [71.3671875, 35.6394410689739], + [71.3232421875, 35.3890499669117], + [71.19140625, 35.0299963690257], + [70.927734375, 34.3434360684829], + [71.3671875, 34.1981730962773], + [72.158203125, 33.9798087287246], + [72.6416015625, 33.7974087675725], + [73.0810546875, 33.7243396617476], + [73.5205078125, 33.7974087675725], + [73.5205078125, 33.5413946689828], + [73.740234375, 32.9902355596511], + [74.00390625, 32.8426736319543], + [74.443359375, 32.6578757369553], + [74.8828125, 32.5097617359194], + [75.498046875, 32.3242755888766], + [75.849609375, 32.6948659778751], + [75.9814453125, 32.9533681457993], + [76.1572265625, 33.1007454051442], + [76.5966796875, 33.1007454051442], + [76.904296875, 33.1007454051442], + [77.3876953125, 32.8795871730663], + [77.783203125, 32.8795871730663], + [78.4423828125, 32.6208701831811], + [78.7939453125, 32.6578757369553], + [79.189453125, 32.4726950220615], + [79.2333984375, 32.8057447329069], + [79.1015625, 33.2111164724169], + [78.7060546875, 33.7243396617476], + [78.57421875, 34.052659421376], + [79.013671875, 34.3434360684829], + [78.7939453125, 34.5246614717717], + [78.4423828125, 34.5970415161442], + [78.1787109375, 34.8138033171132], + [78.0029296875, 35.2815006578912], + [77.8271484375, 35.4606699514953], + [77.2998046875, 35.5679804580121], + [76.904296875, 35.6037187406973], + [76.6845703125, 35.6751474360847], + [76.46484375, 35.8534396195918], + [76.11328125, 36.0313317763319], + [76.025390625, 36.2797072052402], + [75.8056640625, 36.6331620955866], + [75.6298828125, 36.8092847020594], + [75.146484375, 36.985003092856], + [74.9267578125, 36.985003092856], + [74.5751953125, 37.0902398030721] + ] + ] + }, + "properties": { + "name": "", + "childNum": 1 + } + } + ] + } \ No newline at end of file diff --git a/public/imgs/canvas-badge/Ambient.webp b/public/imgs/canvas-badge/Ambient.webp new file mode 100644 index 000000000..54dfc4373 Binary files /dev/null and b/public/imgs/canvas-badge/Ambient.webp differ diff --git a/public/imgs/canvas-badge/Cog.png b/public/imgs/canvas-badge/Cog.png new file mode 100644 index 000000000..e90647b06 Binary files /dev/null and b/public/imgs/canvas-badge/Cog.png differ diff --git a/public/imgs/canvas-badge/EAS.png b/public/imgs/canvas-badge/EAS.png new file mode 100644 index 000000000..40555ebcf Binary files /dev/null and b/public/imgs/canvas-badge/EAS.png differ diff --git a/public/imgs/canvas-badge/FLock-x.png b/public/imgs/canvas-badge/FLock-x.png new file mode 100644 index 000000000..7822bd555 Binary files /dev/null and b/public/imgs/canvas-badge/FLock-x.png differ diff --git a/public/imgs/canvas-badge/Flock.png b/public/imgs/canvas-badge/Flock.png new file mode 100644 index 000000000..d5b2f0325 Binary files /dev/null and b/public/imgs/canvas-badge/Flock.png differ diff --git a/public/imgs/canvas-badge/Panda.png b/public/imgs/canvas-badge/Panda.png new file mode 100644 index 000000000..196fc2507 Binary files /dev/null and b/public/imgs/canvas-badge/Panda.png differ diff --git a/public/imgs/canvas-badge/Passport.png b/public/imgs/canvas-badge/Passport.png new file mode 100644 index 000000000..0a7cf585b Binary files /dev/null and b/public/imgs/canvas-badge/Passport.png differ diff --git a/public/imgs/canvas-badge/Pencils.png b/public/imgs/canvas-badge/Pencils.png new file mode 100644 index 000000000..ca15e1af6 Binary files /dev/null and b/public/imgs/canvas-badge/Pencils.png differ diff --git a/public/imgs/canvas-badge/Scroller.png b/public/imgs/canvas-badge/Scroller.png new file mode 100644 index 000000000..7380d9644 Binary files /dev/null and b/public/imgs/canvas-badge/Scroller.png differ diff --git a/public/imgs/canvas-badge/Scrolly.png b/public/imgs/canvas-badge/Scrolly.png new file mode 100644 index 000000000..2a8b332d5 Binary files /dev/null and b/public/imgs/canvas-badge/Scrolly.png differ diff --git a/public/imgs/canvas-badge/SymTrader.png b/public/imgs/canvas-badge/SymTrader.png new file mode 100644 index 000000000..f9c010472 Binary files /dev/null and b/public/imgs/canvas-badge/SymTrader.png differ diff --git a/public/imgs/canvas-badge/Symbiosis.png b/public/imgs/canvas-badge/Symbiosis.png new file mode 100644 index 000000000..2fb375537 Binary files /dev/null and b/public/imgs/canvas-badge/Symbiosis.png differ diff --git a/public/imgs/canvas-badge/Zebra.webp b/public/imgs/canvas-badge/Zebra.webp new file mode 100644 index 000000000..91c0b0589 Binary files /dev/null and b/public/imgs/canvas-badge/Zebra.webp differ diff --git a/public/imgs/canvas-badge/badgePlaceholder.svg b/public/imgs/canvas-badge/badgePlaceholder.svg new file mode 100644 index 000000000..d145a45a8 --- /dev/null +++ b/public/imgs/canvas-badge/badgePlaceholder.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/imgs/canvas-badge/badges-header-bg.webp b/public/imgs/canvas-badge/badges-header-bg.webp new file mode 100644 index 000000000..6c0a8a812 Binary files /dev/null and b/public/imgs/canvas-badge/badges-header-bg.webp differ diff --git a/public/imgs/canvas-badge/featured-badges-bg-mobile.webp b/public/imgs/canvas-badge/featured-badges-bg-mobile.webp new file mode 100644 index 000000000..bc9b292a9 Binary files /dev/null and b/public/imgs/canvas-badge/featured-badges-bg-mobile.webp differ diff --git a/public/imgs/canvas-badge/featured-badges-bg.webp b/public/imgs/canvas-badge/featured-badges-bg.webp new file mode 100644 index 000000000..bdd3527eb Binary files /dev/null and b/public/imgs/canvas-badge/featured-badges-bg.webp differ diff --git a/public/imgs/canvas/Badge_Ethereum_Year.png b/public/imgs/canvas/Badge_Ethereum_Year.png new file mode 100644 index 000000000..62679639f Binary files /dev/null and b/public/imgs/canvas/Badge_Ethereum_Year.png differ diff --git a/public/imgs/canvas/NFTCardPlaceholder.svg b/public/imgs/canvas/NFTCardPlaceholder.svg new file mode 100644 index 000000000..c1d023214 --- /dev/null +++ b/public/imgs/canvas/NFTCardPlaceholder.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/imgs/canvas/NFTPlaceholder.svg b/public/imgs/canvas/NFTPlaceholder.svg new file mode 100644 index 000000000..b47b806b8 --- /dev/null +++ b/public/imgs/canvas/NFTPlaceholder.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/imgs/canvas/OriginsNFT.svg b/public/imgs/canvas/OriginsNFT.svg new file mode 100644 index 000000000..4e2c6f992 --- /dev/null +++ b/public/imgs/canvas/OriginsNFT.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/imgs/canvas/Penguin1.webp b/public/imgs/canvas/Penguin1.webp new file mode 100644 index 000000000..50f0b8e3d Binary files /dev/null and b/public/imgs/canvas/Penguin1.webp differ diff --git a/public/imgs/canvas/SCR_Holding_Badge.png b/public/imgs/canvas/SCR_Holding_Badge.png new file mode 100644 index 000000000..00de0c31d Binary files /dev/null and b/public/imgs/canvas/SCR_Holding_Badge.png differ diff --git a/public/imgs/canvas/ScrollCanvas.svg b/public/imgs/canvas/ScrollCanvas.svg new file mode 100644 index 000000000..3e28db4e2 --- /dev/null +++ b/public/imgs/canvas/ScrollCanvas.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/imgs/canvas/Scrolly_Coding.webp b/public/imgs/canvas/Scrolly_Coding.webp new file mode 100644 index 000000000..0411a0aa0 Binary files /dev/null and b/public/imgs/canvas/Scrolly_Coding.webp differ diff --git a/public/imgs/canvas/Scrolly_Coding_s.webp b/public/imgs/canvas/Scrolly_Coding_s.webp new file mode 100644 index 000000000..96933fda2 Binary files /dev/null and b/public/imgs/canvas/Scrolly_Coding_s.webp differ diff --git a/public/imgs/canvas/Scrolly_Wen.png b/public/imgs/canvas/Scrolly_Wen.png new file mode 100644 index 000000000..121eaae56 Binary files /dev/null and b/public/imgs/canvas/Scrolly_Wen.png differ diff --git a/public/imgs/canvas/Scrolly_Wen.webp b/public/imgs/canvas/Scrolly_Wen.webp new file mode 100644 index 000000000..7c52e0906 Binary files /dev/null and b/public/imgs/canvas/Scrolly_Wen.webp differ diff --git a/public/imgs/canvas/avatarPlaceholder.svg b/public/imgs/canvas/avatarPlaceholder.svg new file mode 100644 index 000000000..b45da2e29 --- /dev/null +++ b/public/imgs/canvas/avatarPlaceholder.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/imgs/canvas/badgePlaceholder.svg b/public/imgs/canvas/badgePlaceholder.svg new file mode 100644 index 000000000..4c254f112 --- /dev/null +++ b/public/imgs/canvas/badgePlaceholder.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/imgs/canvas/canvas.gif b/public/imgs/canvas/canvas.gif new file mode 100644 index 000000000..27ed4008c Binary files /dev/null and b/public/imgs/canvas/canvas.gif differ diff --git a/public/imgs/canvas/heartbeat.webp b/public/imgs/canvas/heartbeat.webp new file mode 100644 index 000000000..b4ec1e71f Binary files /dev/null and b/public/imgs/canvas/heartbeat.webp differ diff --git a/public/imgs/canvas/scroll.mp4 b/public/imgs/canvas/scroll.mp4 new file mode 100644 index 000000000..2470557c0 Binary files /dev/null and b/public/imgs/canvas/scroll.mp4 differ diff --git a/public/imgs/canvas/support/contact.svg b/public/imgs/canvas/support/contact.svg new file mode 100644 index 000000000..86d2bb699 --- /dev/null +++ b/public/imgs/canvas/support/contact.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/imgs/canvas/support/discord.svg b/public/imgs/canvas/support/discord.svg new file mode 100644 index 000000000..c357924fd --- /dev/null +++ b/public/imgs/canvas/support/discord.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/imgs/canvas/support/telegram.svg b/public/imgs/canvas/support/telegram.svg new file mode 100644 index 000000000..7b8904960 --- /dev/null +++ b/public/imgs/canvas/support/telegram.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/imgs/canvas/support/x.svg b/public/imgs/canvas/support/x.svg new file mode 100644 index 000000000..e6c1ecf20 --- /dev/null +++ b/public/imgs/canvas/support/x.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/imgs/canvas/warning.png b/public/imgs/canvas/warning.png new file mode 100644 index 000000000..f1a1b84f2 Binary files /dev/null and b/public/imgs/canvas/warning.png differ diff --git a/public/imgs/career/career-bg.svg b/public/imgs/career/career-bg.svg deleted file mode 100644 index 7d795a1c3..000000000 --- a/public/imgs/career/career-bg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/imgs/career/career-header-bg.webp b/public/imgs/career/career-header-bg.webp new file mode 100644 index 000000000..ab87c48de Binary files /dev/null and b/public/imgs/career/career-header-bg.webp differ diff --git a/public/imgs/community/globe/0xblob.jpg b/public/imgs/community/globe/0xblob.jpg new file mode 100644 index 000000000..f87e6a7fe Binary files /dev/null and b/public/imgs/community/globe/0xblob.jpg differ diff --git a/public/imgs/community/globe/Berlin.jpg b/public/imgs/community/globe/Berlin.jpg new file mode 100644 index 000000000..898411847 Binary files /dev/null and b/public/imgs/community/globe/Berlin.jpg differ diff --git a/public/imgs/community/globe/CostaRica.jpg b/public/imgs/community/globe/CostaRica.jpg new file mode 100644 index 000000000..5551dbb15 Binary files /dev/null and b/public/imgs/community/globe/CostaRica.jpg differ diff --git a/public/imgs/community/globe/KL.jpg b/public/imgs/community/globe/KL.jpg new file mode 100644 index 000000000..8efd54a1f Binary files /dev/null and b/public/imgs/community/globe/KL.jpg differ diff --git a/public/imgs/community/globe/TGU.jpg b/public/imgs/community/globe/TGU.jpg new file mode 100644 index 000000000..cfe83ee2f Binary files /dev/null and b/public/imgs/community/globe/TGU.jpg differ diff --git a/public/imgs/community/globe/abcafrica.jpg b/public/imgs/community/globe/abcafrica.jpg new file mode 100644 index 000000000..9e3fabf51 Binary files /dev/null and b/public/imgs/community/globe/abcafrica.jpg differ diff --git a/public/imgs/community/globe/akindo.jpg b/public/imgs/community/globe/akindo.jpg new file mode 100644 index 000000000..438ed1ac7 Binary files /dev/null and b/public/imgs/community/globe/akindo.jpg differ diff --git a/public/imgs/community/globe/antalpha.png b/public/imgs/community/globe/antalpha.png new file mode 100644 index 000000000..8de213ab0 Binary files /dev/null and b/public/imgs/community/globe/antalpha.png differ diff --git a/public/imgs/community/globe/atx.jpg b/public/imgs/community/globe/atx.jpg new file mode 100644 index 000000000..829d241b9 Binary files /dev/null and b/public/imgs/community/globe/atx.jpg differ diff --git a/public/imgs/community/globe/barcelona.jpg b/public/imgs/community/globe/barcelona.jpg new file mode 100644 index 000000000..6fdf9c771 Binary files /dev/null and b/public/imgs/community/globe/barcelona.jpg differ diff --git a/public/imgs/community/globe/berkeley.jpg b/public/imgs/community/globe/berkeley.jpg new file mode 100644 index 000000000..ee9b0efee Binary files /dev/null and b/public/imgs/community/globe/berkeley.jpg differ diff --git a/public/imgs/community/globe/bewater.jpg b/public/imgs/community/globe/bewater.jpg new file mode 100644 index 000000000..b933c3f6f Binary files /dev/null and b/public/imgs/community/globe/bewater.jpg differ diff --git a/public/imgs/community/globe/biteye.jpg b/public/imgs/community/globe/biteye.jpg new file mode 100644 index 000000000..e8edcc5de Binary files /dev/null and b/public/imgs/community/globe/biteye.jpg differ diff --git a/public/imgs/community/globe/bogota.jpg b/public/imgs/community/globe/bogota.jpg new file mode 100644 index 000000000..6b3689283 Binary files /dev/null and b/public/imgs/community/globe/bogota.jpg differ diff --git a/public/imgs/community/globe/bolivia.jpg b/public/imgs/community/globe/bolivia.jpg new file mode 100644 index 000000000..d2b6b7a14 Binary files /dev/null and b/public/imgs/community/globe/bolivia.jpg differ diff --git a/public/imgs/community/globe/borderless.jpg b/public/imgs/community/globe/borderless.jpg new file mode 100644 index 000000000..0cd7c729a Binary files /dev/null and b/public/imgs/community/globe/borderless.jpg differ diff --git a/public/imgs/community/globe/buidlers.jpg b/public/imgs/community/globe/buidlers.jpg new file mode 100644 index 000000000..55923dec3 Binary files /dev/null and b/public/imgs/community/globe/buidlers.jpg differ diff --git a/public/imgs/community/globe/cryptist.jpg b/public/imgs/community/globe/cryptist.jpg new file mode 100644 index 000000000..b76a4b7c7 Binary files /dev/null and b/public/imgs/community/globe/cryptist.jpg differ diff --git a/public/imgs/community/globe/cryptocanal.jpg b/public/imgs/community/globe/cryptocanal.jpg new file mode 100644 index 000000000..b4734a583 Binary files /dev/null and b/public/imgs/community/globe/cryptocanal.jpg differ diff --git a/public/imgs/community/globe/elsalva.jpg b/public/imgs/community/globe/elsalva.jpg new file mode 100644 index 000000000..7d03ad2e9 Binary files /dev/null and b/public/imgs/community/globe/elsalva.jpg differ diff --git a/public/imgs/community/globe/espaiocripto.jpg b/public/imgs/community/globe/espaiocripto.jpg new file mode 100644 index 000000000..50dcdf197 Binary files /dev/null and b/public/imgs/community/globe/espaiocripto.jpg differ diff --git a/public/imgs/community/globe/ethbeijing.png b/public/imgs/community/globe/ethbeijing.png new file mode 100644 index 000000000..718ae1ea3 Binary files /dev/null and b/public/imgs/community/globe/ethbeijing.png differ diff --git a/public/imgs/community/globe/ethdenver.jpg b/public/imgs/community/globe/ethdenver.jpg new file mode 100644 index 000000000..6d3050a02 Binary files /dev/null and b/public/imgs/community/globe/ethdenver.jpg differ diff --git a/public/imgs/community/globe/ethgathering.jpg b/public/imgs/community/globe/ethgathering.jpg new file mode 100644 index 000000000..dc735c02c Binary files /dev/null and b/public/imgs/community/globe/ethgathering.jpg differ diff --git a/public/imgs/community/globe/ethsamba.jpg b/public/imgs/community/globe/ethsamba.jpg new file mode 100644 index 000000000..ca900c67f Binary files /dev/null and b/public/imgs/community/globe/ethsamba.jpg differ diff --git a/public/imgs/community/globe/franklin.jpg b/public/imgs/community/globe/franklin.jpg new file mode 100644 index 000000000..20dd375f2 Binary files /dev/null and b/public/imgs/community/globe/franklin.jpg differ diff --git a/public/imgs/community/globe/guate.jpg b/public/imgs/community/globe/guate.jpg new file mode 100644 index 000000000..5d65f25b6 Binary files /dev/null and b/public/imgs/community/globe/guate.jpg differ diff --git a/public/imgs/community/globe/itu.png b/public/imgs/community/globe/itu.png new file mode 100644 index 000000000..83355072a Binary files /dev/null and b/public/imgs/community/globe/itu.png differ diff --git a/public/imgs/community/globe/japan.jpg b/public/imgs/community/globe/japan.jpg new file mode 100644 index 000000000..3b65d4025 Binary files /dev/null and b/public/imgs/community/globe/japan.jpg differ diff --git a/public/imgs/community/globe/kyiv.jpg b/public/imgs/community/globe/kyiv.jpg new file mode 100644 index 000000000..7e7e890ba Binary files /dev/null and b/public/imgs/community/globe/kyiv.jpg differ diff --git a/public/imgs/community/globe/lima.jpg b/public/imgs/community/globe/lima.jpg new file mode 100644 index 000000000..e0d620060 Binary files /dev/null and b/public/imgs/community/globe/lima.jpg differ diff --git a/public/imgs/community/globe/mich.jpg b/public/imgs/community/globe/mich.jpg new file mode 100644 index 000000000..f7be2293c Binary files /dev/null and b/public/imgs/community/globe/mich.jpg differ diff --git a/public/imgs/community/globe/nonce.jpg b/public/imgs/community/globe/nonce.jpg new file mode 100644 index 000000000..75eab6d40 Binary files /dev/null and b/public/imgs/community/globe/nonce.jpg differ diff --git a/public/imgs/community/globe/padthai.jpg b/public/imgs/community/globe/padthai.jpg new file mode 100644 index 000000000..002364b32 Binary files /dev/null and b/public/imgs/community/globe/padthai.jpg differ diff --git a/public/imgs/community/globe/prague.jpg b/public/imgs/community/globe/prague.jpg new file mode 100644 index 000000000..f076d1cb0 Binary files /dev/null and b/public/imgs/community/globe/prague.jpg differ diff --git a/public/imgs/community/globe/sbc.jpg b/public/imgs/community/globe/sbc.jpg new file mode 100644 index 000000000..f6ed47316 Binary files /dev/null and b/public/imgs/community/globe/sbc.jpg differ diff --git a/public/imgs/community/globe/taipei.jpg b/public/imgs/community/globe/taipei.jpg new file mode 100644 index 000000000..2cd141bfb Binary files /dev/null and b/public/imgs/community/globe/taipei.jpg differ diff --git a/public/imgs/community/globe/tum.jpg b/public/imgs/community/globe/tum.jpg new file mode 100644 index 000000000..db51cc613 Binary files /dev/null and b/public/imgs/community/globe/tum.jpg differ diff --git a/public/imgs/community/globe/uruguay.jpg b/public/imgs/community/globe/uruguay.jpg new file mode 100644 index 000000000..c0e4013a4 Binary files /dev/null and b/public/imgs/community/globe/uruguay.jpg differ diff --git a/public/imgs/community/globe/usc.svg b/public/imgs/community/globe/usc.svg new file mode 100644 index 000000000..7d5edf1e1 --- /dev/null +++ b/public/imgs/community/globe/usc.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/imgs/community/globe/warsaw.jpg b/public/imgs/community/globe/warsaw.jpg new file mode 100644 index 000000000..8fd1d4064 Binary files /dev/null and b/public/imgs/community/globe/warsaw.jpg differ diff --git a/public/imgs/community/globe/web3afrika.jpg b/public/imgs/community/globe/web3afrika.jpg new file mode 100644 index 000000000..94187e59a Binary files /dev/null and b/public/imgs/community/globe/web3afrika.jpg differ diff --git a/public/imgs/community/globe/web3samaj.jpg b/public/imgs/community/globe/web3samaj.jpg new file mode 100644 index 000000000..d4ae5387e Binary files /dev/null and b/public/imgs/community/globe/web3samaj.jpg differ diff --git a/public/imgs/community/pin.svg b/public/imgs/community/pin.svg new file mode 100644 index 000000000..dd07166f0 --- /dev/null +++ b/public/imgs/community/pin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/imgs/ecosystem/ecosystem-bg-mobile.svg b/public/imgs/ecosystem/ecosystem-bg-mobile.svg deleted file mode 100644 index fb18a8465..000000000 --- a/public/imgs/ecosystem/ecosystem-bg-mobile.svg +++ /dev/null @@ -1,526 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/ecosystem/ecosystem-bg-mobile.webp b/public/imgs/ecosystem/ecosystem-bg-mobile.webp new file mode 100644 index 000000000..c624f28ef Binary files /dev/null and b/public/imgs/ecosystem/ecosystem-bg-mobile.webp differ diff --git a/public/imgs/ecosystem/ecosystem-bg.png b/public/imgs/ecosystem/ecosystem-bg.png deleted file mode 100644 index a5fe54cbc..000000000 Binary files a/public/imgs/ecosystem/ecosystem-bg.png and /dev/null differ diff --git a/public/imgs/ecosystem/ecosystem-bg.svg b/public/imgs/ecosystem/ecosystem-bg.svg deleted file mode 100644 index abe4b5c36..000000000 --- a/public/imgs/ecosystem/ecosystem-bg.svg +++ /dev/null @@ -1,1182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/ecosystem/ecosystem-bg.webp b/public/imgs/ecosystem/ecosystem-bg.webp new file mode 100644 index 000000000..7214b078e Binary files /dev/null and b/public/imgs/ecosystem/ecosystem-bg.webp differ diff --git a/public/imgs/ecosystem/new-ecosystem-bg-mobile.svg b/public/imgs/ecosystem/new-ecosystem-bg-mobile.svg deleted file mode 100644 index 5ad03a6f1..000000000 --- a/public/imgs/ecosystem/new-ecosystem-bg-mobile.svg +++ /dev/null @@ -1,789 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/ecosystem/new-ecosystem-bg-tablet.svg b/public/imgs/ecosystem/new-ecosystem-bg-tablet.svg deleted file mode 100644 index 2e4c536d4..000000000 --- a/public/imgs/ecosystem/new-ecosystem-bg-tablet.svg +++ /dev/null @@ -1,654 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/ecosystem/new-ecosystem-bg.svg b/public/imgs/ecosystem/new-ecosystem-bg.svg deleted file mode 100644 index dde14d6d0..000000000 --- a/public/imgs/ecosystem/new-ecosystem-bg.svg +++ /dev/null @@ -1,1172 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/homepage/blog-cover-1.svg b/public/imgs/homepage/blog-cover-1.svg deleted file mode 100644 index 4c94b354b..000000000 --- a/public/imgs/homepage/blog-cover-1.svg +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/homepage/blog-cover-2.svg b/public/imgs/homepage/blog-cover-2.svg deleted file mode 100644 index 57f2d8d86..000000000 --- a/public/imgs/homepage/blog-cover-2.svg +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/homepage/blog-cover.svg b/public/imgs/homepage/blog-cover.svg deleted file mode 100644 index 800d6c8f9..000000000 --- a/public/imgs/homepage/blog-cover.svg +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/homepage/blog/poster_cover_21.png b/public/imgs/homepage/blog/poster_cover_21.png new file mode 100644 index 000000000..55a597e0a Binary files /dev/null and b/public/imgs/homepage/blog/poster_cover_21.png differ diff --git a/public/imgs/homepage/blog/poster_cover_21_og.png b/public/imgs/homepage/blog/poster_cover_21_og.png new file mode 100644 index 000000000..e05ff3253 Binary files /dev/null and b/public/imgs/homepage/blog/poster_cover_21_og.png differ diff --git a/public/imgs/homepage/landing-bg-mobile.webp b/public/imgs/homepage/landing-bg-mobile.webp new file mode 100644 index 000000000..dbc2686ff Binary files /dev/null and b/public/imgs/homepage/landing-bg-mobile.webp differ diff --git a/public/imgs/homepage/landing-bg.webp b/public/imgs/homepage/landing-bg.webp new file mode 100644 index 000000000..dd654720b Binary files /dev/null and b/public/imgs/homepage/landing-bg.webp differ diff --git a/public/imgs/homepage/landing-blog-1.webp b/public/imgs/homepage/landing-blog-1.webp new file mode 100644 index 000000000..fafbfede2 Binary files /dev/null and b/public/imgs/homepage/landing-blog-1.webp differ diff --git a/public/imgs/homepage/landing-blog-2.webp b/public/imgs/homepage/landing-blog-2.webp new file mode 100644 index 000000000..cc0d5363b Binary files /dev/null and b/public/imgs/homepage/landing-blog-2.webp differ diff --git a/public/imgs/homepage/section_1_bg.svg b/public/imgs/homepage/section_1_bg.svg deleted file mode 100644 index 68c439428..000000000 --- a/public/imgs/homepage/section_1_bg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/imgs/homepage/section_1_bg_mobile.svg b/public/imgs/homepage/section_1_bg_mobile.svg deleted file mode 100644 index 65fd5d364..000000000 --- a/public/imgs/homepage/section_1_bg_mobile.svg +++ /dev/null @@ -1,1215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/imgs/sessions/0-BG-PNG.png b/public/imgs/sessions/0-BG-PNG.png new file mode 100644 index 000000000..2911d65b1 Binary files /dev/null and b/public/imgs/sessions/0-BG-PNG.png differ diff --git a/public/imgs/sessions/1-Left-TallTower-PNG.png b/public/imgs/sessions/1-Left-TallTower-PNG.png new file mode 100644 index 000000000..2fe00707a Binary files /dev/null and b/public/imgs/sessions/1-Left-TallTower-PNG.png differ diff --git a/public/imgs/sessions/2-Left-Building-PNG.png b/public/imgs/sessions/2-Left-Building-PNG.png new file mode 100644 index 000000000..a54b8dd05 Binary files /dev/null and b/public/imgs/sessions/2-Left-Building-PNG.png differ diff --git a/public/imgs/sessions/2-Right-Building-PNG.png b/public/imgs/sessions/2-Right-Building-PNG.png new file mode 100644 index 000000000..51747b4b9 Binary files /dev/null and b/public/imgs/sessions/2-Right-Building-PNG.png differ diff --git a/public/imgs/sessions/3-Humans-png.png b/public/imgs/sessions/3-Humans-png.png new file mode 100644 index 000000000..99c058c71 Binary files /dev/null and b/public/imgs/sessions/3-Humans-png.png differ diff --git a/public/imgs/sessions/LeftCloud.png b/public/imgs/sessions/LeftCloud.png new file mode 100644 index 000000000..8cde9884b Binary files /dev/null and b/public/imgs/sessions/LeftCloud.png differ diff --git a/public/imgs/sessions/Scroll-Eth.png b/public/imgs/sessions/Scroll-Eth.png new file mode 100644 index 000000000..252f396c5 Binary files /dev/null and b/public/imgs/sessions/Scroll-Eth.png differ diff --git a/public/imgs/sessions/Scroll-Layer1.png b/public/imgs/sessions/Scroll-Layer1.png new file mode 100644 index 000000000..51aa6a7b1 Binary files /dev/null and b/public/imgs/sessions/Scroll-Layer1.png differ diff --git a/public/imgs/sessions/Scroll-Layer2-back.png b/public/imgs/sessions/Scroll-Layer2-back.png new file mode 100644 index 000000000..b84d46c3e Binary files /dev/null and b/public/imgs/sessions/Scroll-Layer2-back.png differ diff --git a/public/imgs/sessions/Scroll-Layer3.png b/public/imgs/sessions/Scroll-Layer3.png new file mode 100644 index 000000000..3869f5ea4 Binary files /dev/null and b/public/imgs/sessions/Scroll-Layer3.png differ diff --git a/public/imgs/sessions/gas.svg b/public/imgs/sessions/gas.svg new file mode 100644 index 000000000..4688f95eb --- /dev/null +++ b/public/imgs/sessions/gas.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/imgs/sessions/tokens/Huma.svg b/public/imgs/sessions/tokens/Huma.svg new file mode 100644 index 000000000..a3ccd0928 --- /dev/null +++ b/public/imgs/sessions/tokens/Huma.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/imgs/sessions/tokens/Loop.jpg b/public/imgs/sessions/tokens/Loop.jpg new file mode 100644 index 000000000..6ef239f82 Binary files /dev/null and b/public/imgs/sessions/tokens/Loop.jpg differ diff --git a/public/imgs/sessions/tokens/Mitosis.png b/public/imgs/sessions/tokens/Mitosis.png new file mode 100644 index 000000000..008b2f76a Binary files /dev/null and b/public/imgs/sessions/tokens/Mitosis.png differ diff --git a/public/imgs/sessions/tokens/Pencils.jpeg b/public/imgs/sessions/tokens/Pencils.jpeg new file mode 100644 index 000000000..1f51fe6ac Binary files /dev/null and b/public/imgs/sessions/tokens/Pencils.jpeg differ diff --git a/public/imgs/sessions/tokens/Scribe.png b/public/imgs/sessions/tokens/Scribe.png new file mode 100644 index 000000000..6eaf9c018 Binary files /dev/null and b/public/imgs/sessions/tokens/Scribe.png differ diff --git a/public/imgs/sessions/tokens/Tranchess.svg b/public/imgs/sessions/tokens/Tranchess.svg new file mode 100644 index 000000000..259392ec9 --- /dev/null +++ b/public/imgs/sessions/tokens/Tranchess.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/imgs/sessions/tokens/Trust.jpg b/public/imgs/sessions/tokens/Trust.jpg new file mode 100644 index 000000000..0776d6cf2 Binary files /dev/null and b/public/imgs/sessions/tokens/Trust.jpg differ diff --git a/public/imgs/sessions/tokens/WBTC.svg b/public/imgs/sessions/tokens/WBTC.svg new file mode 100644 index 000000000..82f5ba5d7 --- /dev/null +++ b/public/imgs/sessions/tokens/WBTC.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/agETH.png b/public/imgs/sessions/tokens/agETH.png new file mode 100644 index 000000000..051e79f90 Binary files /dev/null and b/public/imgs/sessions/tokens/agETH.png differ diff --git a/public/imgs/sessions/tokens/sUSDe.svg b/public/imgs/sessions/tokens/sUSDe.svg new file mode 100644 index 000000000..981907c40 --- /dev/null +++ b/public/imgs/sessions/tokens/sUSDe.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/solvBTC.png b/public/imgs/sessions/tokens/solvBTC.png new file mode 100644 index 000000000..e62d394ee Binary files /dev/null and b/public/imgs/sessions/tokens/solvBTC.png differ diff --git a/public/imgs/sessions/tokens/staYSTONE.svg b/public/imgs/sessions/tokens/staYSTONE.svg new file mode 100644 index 000000000..7a2d34f09 --- /dev/null +++ b/public/imgs/sessions/tokens/staYSTONE.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/stone-white.svg b/public/imgs/sessions/tokens/stone-white.svg new file mode 100644 index 000000000..6d6c70ff3 --- /dev/null +++ b/public/imgs/sessions/tokens/stone-white.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/stone.svg b/public/imgs/sessions/tokens/stone.svg new file mode 100644 index 000000000..c485bd970 --- /dev/null +++ b/public/imgs/sessions/tokens/stone.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/stoneQueen.svg b/public/imgs/sessions/tokens/stoneQueen.svg new file mode 100644 index 000000000..6eb34c2f8 --- /dev/null +++ b/public/imgs/sessions/tokens/stoneQueen.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/turPSTONE.svg b/public/imgs/sessions/tokens/turPSTONE.svg new file mode 100644 index 000000000..425339e39 --- /dev/null +++ b/public/imgs/sessions/tokens/turPSTONE.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/weETH.png b/public/imgs/sessions/tokens/weETH.png new file mode 100644 index 000000000..dd16258b9 Binary files /dev/null and b/public/imgs/sessions/tokens/weETH.png differ diff --git a/public/imgs/sessions/tokens/weth.png b/public/imgs/sessions/tokens/weth.png new file mode 100644 index 000000000..0b54f86cd Binary files /dev/null and b/public/imgs/sessions/tokens/weth.png differ diff --git a/public/imgs/sessions/tokens/wrsETH.svg b/public/imgs/sessions/tokens/wrsETH.svg new file mode 100644 index 000000000..c7877f6a5 --- /dev/null +++ b/public/imgs/sessions/tokens/wrsETH.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/imgs/sessions/tokens/wstETH.svg b/public/imgs/sessions/tokens/wstETH.svg new file mode 100644 index 000000000..2e170ef10 --- /dev/null +++ b/public/imgs/sessions/tokens/wstETH.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/imgs/sticker/Andre1.jpg b/public/imgs/sticker/Andre1.jpg new file mode 100644 index 000000000..0524f12db Binary files /dev/null and b/public/imgs/sticker/Andre1.jpg differ diff --git a/public/imgs/sticker/Andre2.jpg b/public/imgs/sticker/Andre2.jpg new file mode 100644 index 000000000..355a31f2c Binary files /dev/null and b/public/imgs/sticker/Andre2.jpg differ diff --git a/public/imgs/sticker/Coincuddle1.png b/public/imgs/sticker/Coincuddle1.png new file mode 100644 index 000000000..e81a410c1 Binary files /dev/null and b/public/imgs/sticker/Coincuddle1.png differ diff --git a/public/imgs/sticker/Coincuddle2.png b/public/imgs/sticker/Coincuddle2.png new file mode 100644 index 000000000..65350b27f Binary files /dev/null and b/public/imgs/sticker/Coincuddle2.png differ diff --git a/public/imgs/sticker/Cozy1.png b/public/imgs/sticker/Cozy1.png new file mode 100644 index 000000000..71cf22a81 Binary files /dev/null and b/public/imgs/sticker/Cozy1.png differ diff --git a/public/imgs/sticker/Cozy2.png b/public/imgs/sticker/Cozy2.png new file mode 100644 index 000000000..1da1c34b4 Binary files /dev/null and b/public/imgs/sticker/Cozy2.png differ diff --git a/public/imgs/sticker/EssisW.eth1.gif b/public/imgs/sticker/EssisW.eth1.gif new file mode 100644 index 000000000..f897717c2 Binary files /dev/null and b/public/imgs/sticker/EssisW.eth1.gif differ diff --git a/public/imgs/sticker/EssisW.eth2.jpg b/public/imgs/sticker/EssisW.eth2.jpg new file mode 100644 index 000000000..23e8bf8f7 Binary files /dev/null and b/public/imgs/sticker/EssisW.eth2.jpg differ diff --git a/public/imgs/sticker/Magda1.png b/public/imgs/sticker/Magda1.png new file mode 100644 index 000000000..958ccdbc1 Binary files /dev/null and b/public/imgs/sticker/Magda1.png differ diff --git a/public/imgs/sticker/Magda2.png b/public/imgs/sticker/Magda2.png new file mode 100644 index 000000000..cf440789c Binary files /dev/null and b/public/imgs/sticker/Magda2.png differ diff --git a/public/imgs/sticker/MillionDollars1.png b/public/imgs/sticker/MillionDollars1.png new file mode 100644 index 000000000..46e5493bb Binary files /dev/null and b/public/imgs/sticker/MillionDollars1.png differ diff --git a/public/imgs/sticker/MillionDollars2.png b/public/imgs/sticker/MillionDollars2.png new file mode 100644 index 000000000..215e59f96 Binary files /dev/null and b/public/imgs/sticker/MillionDollars2.png differ diff --git a/public/imgs/sticker/Shallot1.png b/public/imgs/sticker/Shallot1.png new file mode 100644 index 000000000..de8814058 Binary files /dev/null and b/public/imgs/sticker/Shallot1.png differ diff --git a/public/imgs/sticker/Shallot2.png b/public/imgs/sticker/Shallot2.png new file mode 100644 index 000000000..f299ae906 Binary files /dev/null and b/public/imgs/sticker/Shallot2.png differ diff --git a/public/imgs/sticker/Yol1.png b/public/imgs/sticker/Yol1.png new file mode 100644 index 000000000..6e8a6c18f Binary files /dev/null and b/public/imgs/sticker/Yol1.png differ diff --git a/public/imgs/sticker/Yol2.png b/public/imgs/sticker/Yol2.png new file mode 100644 index 000000000..b24ae4c51 Binary files /dev/null and b/public/imgs/sticker/Yol2.png differ diff --git a/public/imgs/sticker/afifridwan1.gif b/public/imgs/sticker/afifridwan1.gif new file mode 100644 index 000000000..69a8f8f5f Binary files /dev/null and b/public/imgs/sticker/afifridwan1.gif differ diff --git a/public/imgs/sticker/afifridwan2.gif b/public/imgs/sticker/afifridwan2.gif new file mode 100644 index 000000000..0fee10ddb Binary files /dev/null and b/public/imgs/sticker/afifridwan2.gif differ diff --git a/public/imgs/sticker/fomomonstr1.png b/public/imgs/sticker/fomomonstr1.png new file mode 100644 index 000000000..e5b11c37a Binary files /dev/null and b/public/imgs/sticker/fomomonstr1.png differ diff --git a/public/imgs/sticker/fomomonstr2.png b/public/imgs/sticker/fomomonstr2.png new file mode 100644 index 000000000..f8a84065a Binary files /dev/null and b/public/imgs/sticker/fomomonstr2.png differ diff --git a/public/index.html b/public/index.html index 8b7baf0ef..36fc939bb 100644 --- a/public/index.html +++ b/public/index.html @@ -23,10 +23,7 @@ Learn how to configure a non-root public URL by running `npm run build`. --> Scroll – Native zkEVM Layer 2 for Ethereum - + diff --git a/public/og_canvas.png b/public/og_canvas.png new file mode 100644 index 000000000..35a257b2d Binary files /dev/null and b/public/og_canvas.png differ diff --git a/public/og_canvas_and_badges.png b/public/og_canvas_and_badges.png new file mode 100644 index 000000000..8eba659c4 Binary files /dev/null and b/public/og_canvas_and_badges.png differ diff --git a/public/og_community.png b/public/og_community.png new file mode 100644 index 000000000..b4562002a Binary files /dev/null and b/public/og_community.png differ diff --git a/public/og_scroll_sessions.png b/public/og_scroll_sessions.png new file mode 100644 index 000000000..415a86e26 Binary files /dev/null and b/public/og_scroll_sessions.png differ diff --git a/public/og_sticker_vote.png b/public/og_sticker_vote.png new file mode 100644 index 000000000..bf6aa6217 Binary files /dev/null and b/public/og_sticker_vote.png differ diff --git a/public/sitemap.txt b/public/sitemap.txt deleted file mode 100644 index 0e96d6097..000000000 --- a/public/sitemap.txt +++ /dev/null @@ -1,12 +0,0 @@ -https://scroll.io -https://scroll.io/team -https://scroll.io/join-us -https://scroll.io/blog -https://scroll.io/blog/proofGeneration -https://scroll.io/blog/kzg -https://scroll.io/blog/upgradingPreAlphaTestnet -https://scroll.io/blog/architecture -https://scroll.io/blog/technicalPrinciples -https://scroll.io/blog/preAlphaTestnet -https://scroll.io/blog/visionAndValues -https://scroll.io/blog/zkEVM \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml index f64322a21..677889fa2 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1 +1 @@ -https://scroll.io/https://scroll.io/teamhttps://scroll.io/join-ushttps://scroll.io/bloghttps://scroll.io/blog/proofGenerationhttps://scroll.io/blog/kzghttps://scroll.io/blog/upgradingPreAlphaTestnethttps://scroll.io/blog/architecturehttps://scroll.io/blog/technicalPrincipleshttps://scroll.io/blog/preAlphaTestnethttps://scroll.io/blog/visionAndValueshttps://scroll.io/blog/zkEVM \ No newline at end of file +https://scroll.io/daily0.8https://scroll.io/bridgeweekly0.7https://scroll.io/ecosystemweekly0.7https://scroll.io/brand-kitweekly0.7https://scroll.io/storyweekly0.7https://scroll.io/portalweekly0.7https://scroll.io/blogweekly0.7https://scroll.io/join-usmonthly0.6https://scroll.io/rollupscanmonthly0.6https://scroll.io/developer-nftmonthly0.6https://scroll.io/developer-nft/mintmonthly0.6https://scroll.io/bridge/faqmonthly0.4https://scroll.io/terms-of-serviceyearly0.4https://scroll.io/blog/scaling-securitymonthly0.4https://scroll.io/blog/designing-scroll-originsmonthly0.4https://scroll.io/blog/community-update-novembermonthly0.4https://scroll.io/blog/data-availability-4844monthly0.4https://scroll.io/blog/community-update-octobermonthly0.4https://scroll.io/blog/scroll-origins-nftmonthly0.4https://scroll.io/blog/scrolls-security-measuresmonthly0.4https://scroll.io/blog/founder-lettermonthly0.4https://scroll.io/blog/scrolls-fresh-coatmonthly0.4https://scroll.io/blog/scroll-sepoliamonthly0.4https://scroll.io/blog/contribute-to-scrollmonthly0.4https://scroll.io/blog/alpha-testnetmonthly0.4https://scroll.io/blog/release-note-0109monthly0.4https://scroll.io/blog/proof-generationmonthly0.4https://scroll.io/blog/kzgmonthly0.4https://scroll.io/blog/upgrading-pre-alpha-testnetmonthly0.4https://scroll.io/blog/architecturemonthly0.4https://scroll.io/blog/technical-principlesmonthly0.4https://scroll.io/blog/pre-alpha-testnetmonthly0.4https://scroll.io/blog/vision-and-valuesmonthly0.4https://scroll.io/blog/zkevmmonthly0.4 \ No newline at end of file diff --git a/public/tokenomics/circulatingSupply.txt b/public/tokenomics/circulatingSupply.txt new file mode 100644 index 000000000..ad467a3f4 --- /dev/null +++ b/public/tokenomics/circulatingSupply.txt @@ -0,0 +1 @@ +190000000 \ No newline at end of file diff --git a/public/tokenomics/totalSupply.txt b/public/tokenomics/totalSupply.txt new file mode 100644 index 000000000..21ce28af3 --- /dev/null +++ b/public/tokenomics/totalSupply.txt @@ -0,0 +1 @@ +1000000000 \ No newline at end of file diff --git a/public/twitter_canvas.png b/public/twitter_canvas.png new file mode 100644 index 000000000..f3548b7ac Binary files /dev/null and b/public/twitter_canvas.png differ diff --git a/public/twitter_canvas_and_badges.png b/public/twitter_canvas_and_badges.png new file mode 100644 index 000000000..20d2cb9bd Binary files /dev/null and b/public/twitter_canvas_and_badges.png differ diff --git a/public/twitter_community.png b/public/twitter_community.png new file mode 100644 index 000000000..6643c5970 Binary files /dev/null and b/public/twitter_community.png differ diff --git a/public/twitter_scroll_sessions.png b/public/twitter_scroll_sessions.png new file mode 100644 index 000000000..e71a4c566 Binary files /dev/null and b/public/twitter_scroll_sessions.png differ diff --git a/public/twitter_sticker_vote.png b/public/twitter_sticker_vote.png new file mode 100644 index 000000000..f7f488041 Binary files /dev/null and b/public/twitter_sticker_vote.png differ diff --git a/public/videos/ecosystem-header-bg-264.mp4 b/public/videos/ecosystem-header-bg-264.mp4 new file mode 100644 index 000000000..435698043 Binary files /dev/null and b/public/videos/ecosystem-header-bg-264.mp4 differ diff --git a/public/videos/ecosystem-header-bg.mp4 b/public/videos/ecosystem-header-bg.mp4 new file mode 100644 index 000000000..32bd38280 Binary files /dev/null and b/public/videos/ecosystem-header-bg.mp4 differ diff --git a/public/videos/home-header-bg-264.mp4 b/public/videos/home-header-bg-264.mp4 new file mode 100644 index 000000000..6b5cc4bdb Binary files /dev/null and b/public/videos/home-header-bg-264.mp4 differ diff --git a/public/videos/home-header-bg.mp4 b/public/videos/home-header-bg.mp4 new file mode 100644 index 000000000..112530740 Binary files /dev/null and b/public/videos/home-header-bg.mp4 differ diff --git a/scripts/download-blog-posts.data.json.js b/scripts/download-blog-posts.data.json.js new file mode 100644 index 000000000..747aa07d7 --- /dev/null +++ b/scripts/download-blog-posts.data.json.js @@ -0,0 +1,13 @@ +const fs = require("fs") +const fetch = require("node-fetch") + +const isMainnet = process.env.REACT_APP_SCROLL_ENVIRONMENT === "Mainnet" +const POSTS_URL = `https://blog.scroll.cat/api/posts/${isMainnet ? "published" : "preview"}/data.json` + +async function fetchPosts() { + await fetch(POSTS_URL, { headers: { origin: "https://scroll.io" } }) + .then(res => res.json()) + .then(json => fs.writeFileSync("./src/pages/blog/data.json", JSON.stringify(json, null, 2))) +} + +fetchPosts() diff --git a/scripts/generate_sitemap.js b/scripts/generate_sitemap.js new file mode 100644 index 000000000..edf992b22 --- /dev/null +++ b/scripts/generate_sitemap.js @@ -0,0 +1,13 @@ +const fs = require("fs") +const { SitemapStream, streamToPromise } = require("sitemap") +const { Readable } = require("stream") + +const links = JSON.parse(fs.readFileSync("sitemap.json", "utf8")) + +// Create a stream to write to +const stream = new SitemapStream({ hostname: "https://scroll.io" }) + +// Return a promise that resolves with your XML string +streamToPromise(Readable.from(links).pipe(stream)) + .then(data => fs.writeFileSync("../public/sitemap.xml", data)) + .catch(error => console.error("Error generating sitemap:", error)) diff --git a/scripts/sitemap.json b/scripts/sitemap.json new file mode 100644 index 000000000..5c99cd8e5 --- /dev/null +++ b/scripts/sitemap.json @@ -0,0 +1,35 @@ +[ + { "url": "https://scroll.io", "changefreq": "daily", "priority": 0.8 }, + { "url": "https://scroll.io/bridge", "changefreq": "weekly", "priority": 0.7 }, + { "url": "https://scroll.io/ecosystem", "changefreq": "weekly", "priority": 0.7 }, + { "url": "https://scroll.io/brand-kit", "changefreq": "weekly", "priority": 0.7 }, + { "url": "https://scroll.io/portal", "changefreq": "weekly", "priority": 0.7 }, + { "url": "https://scroll.io/blog", "changefreq": "weekly", "priority": 0.7 }, + { "url": "https://scroll.io/join-us", "changefreq": "monthly", "priority": 0.6 }, + { "url": "https://scroll.io/rollupscan", "changefreq": "monthly", "priority": 0.6 }, + { "url": "https://scroll.io/developer-nft", "changefreq": "monthly", "priority": 0.6 }, + { "url": "https://scroll.io/developer-nft/mint", "changefreq": "monthly", "priority": 0.6 }, + { "url": "https://scroll.io/bridge/faq", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/terms-of-service", "changefreq": "yearly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/scaling-security", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/designing-scroll-origins", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/community-update-november", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/data-availability-4844", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/community-update-october", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/scroll-origins-nft", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/scrolls-security-measures", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/founder-letter", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/scrolls-fresh-coat", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/scroll-sepolia", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/contribute-to-scroll", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/alpha-testnet", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/release-note-0109", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/proof-generation", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/kzg", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/upgrading-pre-alpha-testnet", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/architecture", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/technical-principles", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/pre-alpha-testnet", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/vision-and-values", "changefreq": "monthly", "priority": 0.4 }, + { "url": "https://scroll.io/blog/zkevm", "changefreq": "monthly", "priority": 0.4 } +] diff --git a/src/Homepage.tsx b/src/Homepage.tsx index 72d497eb6..4054571bc 100644 --- a/src/Homepage.tsx +++ b/src/Homepage.tsx @@ -1,13 +1,23 @@ +import { SnackbarProvider } from "notistack" +import { useEffect } from "react" import { Helmet } from "react-helmet-async" import { Route, Routes } from "react-router-dom" +import { Box } from "@mui/material" + import Footer from "@/components/Footer" +import GlobalComponents from "@/components/GlobalComponents" import Header from "@/components/Header" +import BridgeContextProvider from "@/contexts/BridgeContextProvider" +import CanvasContextProvider from "@/contexts/CanvasContextProvider" import RainbowProvider from "@/contexts/RainbowProvider" import ScrollToTop from "@/hooks/useScrollToTop" import NotFound from "@/pages/404" import { isSepolia, requireEnv } from "@/utils" +import useCheckTheme from "./components/Header/useCheckTheme" +import GlobalError from "./components/RequestWarning/GlobalError" +import GlobalSuccess from "./components/RequestWarning/GlobalSuccess" import useMatchedRoute from "./hooks/useMatchedRoute" import routes from "./routes" @@ -17,26 +27,54 @@ interface RouteItem { fullPath?: string element: JSX.Element description?: string + isHiddenFooter?: boolean } const baseUrl = requireEnv("REACT_APP_API_BASE_URI") + function Homepage() { + const dark = useCheckTheme() const route = useMatchedRoute() as RouteItem + + useEffect(() => { + function setVh() { + const vh = window.innerHeight * 0.01 + document.documentElement.style.setProperty("--vh", `${vh}px`) + } + setVh() + window.addEventListener("resize", setVh) + return () => { + window.removeEventListener("resize", setVh) + } + }, []) + const getUrl = () => { return window.location.href } - const getImageUrl = (type = "") => { + const getImageUrl = (type = "og") => { if (window.location.pathname.startsWith("/developer-nft")) { - return window.location.origin + `/${type || "og"}_scroll_origins_nft.png` + return window.location.origin + `/${type}_scroll_origins_nft.png` } else if (window.location.pathname.startsWith("/brand-kit")) { return window.location.origin + `/og_scroll_brand.png` + } else if (window.location.pathname.startsWith("/sticker-vote")) { + return window.location.origin + `/${type}_sticker_vote.png` + } else if (window.location.pathname.startsWith("/sticker-winners")) { + return window.location.origin + `/${type}_sticker_vote.png` + } else if (window.location.pathname.startsWith("/sessions")) { + return window.location.origin + `/${type}_scroll_sessions.png` + } else if (["/canvas", "/canvas/mint"].includes(window.location.pathname)) { + return window.location.origin + `/${type}_canvas.png` + } else if (window.location.pathname.startsWith("/canvas-and-badges")) { + return window.location.origin + `/${type}_canvas_and_badges.png` + } else if (window.location.pathname.startsWith("/community")) { + return window.location.origin + `/${type}_community.png` } return window.location.origin + "/og_scroll.png" } return ( -
+ Scroll{route ? " – " + route.name : null} @@ -51,18 +89,25 @@ function Homepage() { - -
- - {routes.map((route, key) => ( - - ))} - } /> - - {isSepolia ? null :
+ ) } diff --git a/src/apis/canvas-badge.ts b/src/apis/canvas-badge.ts new file mode 100644 index 000000000..17935d503 --- /dev/null +++ b/src/apis/canvas-badge.ts @@ -0,0 +1,15 @@ +import { requireEnv } from "@/utils" + +const badgeRegistryBaseURL = requireEnv("REACT_APP_BADGE_REGISTRY_URL") + +const badgeIndexerBaseURL = requireEnv("REACT_APP_BADGE_INDEXER_URL") + +export const fetchBadgesURL = `${badgeRegistryBaseURL}/badges` + +export const fetchBadgeByAddrURL = addr => `${badgeRegistryBaseURL}/badge/${addr}` + +export const retrieveCanvasBadgeURL = `${badgeIndexerBaseURL}/count` + +// Grace Period + +export const fetchWhiteListBadgesURL = `${badgeRegistryBaseURL}/badges?whitelist=1&page_number=1&page_size=100` diff --git a/src/apis/canvas-profile.ts b/src/apis/canvas-profile.ts new file mode 100644 index 000000000..fb8b97854 --- /dev/null +++ b/src/apis/canvas-profile.ts @@ -0,0 +1,22 @@ +import { requireEnv } from "@/utils" + +const ensBaseURL = requireEnv("REACT_APP_ENS_API_URL") + +const canvasBaseUrl = requireEnv("REACT_APP_CANVAS_BACKEND_URI") + +export const fetchENSNameURL = addr => `${ensBaseURL}/address/${addr}/name` + +export const claimENSNameURL = addr => `${canvasBaseUrl}/acc/${addr}/ens/claim` + +export const fetchIsNameTakenURL = subdomainName => `${ensBaseURL}/name/${subdomainName}/taken` + +export const fetchUserNFTsURL = (walletAddress, page, pageSize) => + `${canvasBaseUrl}/acc/${walletAddress}/nfts?page_size=${pageSize}&page_number=${page}` + +export const setCanvasAvatarURL = walletAddress => `${canvasBaseUrl}/acc/${walletAddress}/set-avatar` + +export const fetchAvatarURL = walletAddress => `${canvasBaseUrl}/avatar/${walletAddress}.json` + +export const generateNFTURL = walletAddress => `${canvasBaseUrl}/avatar/${walletAddress}.nft` + +export const generateAvatarURL = avatar => `${canvasBaseUrl}/avatar/${avatar}` diff --git a/src/apis/canvas.ts b/src/apis/canvas.ts new file mode 100644 index 000000000..58e7f396c --- /dev/null +++ b/src/apis/canvas.ts @@ -0,0 +1,28 @@ +import { requireEnv } from "@/utils" + +const baseUrl = requireEnv("REACT_APP_CANVAS_BACKEND_URI") + +export const getHeartbeatURL = add => `${baseUrl}/heartbeat/${add}.svg` + +export const getHeartrate = add => `${baseUrl}/heartbeat/${add}` + +export const getSmallHeartbeatURL = add => `${baseUrl}/heartbeat/${add}/s.svg` + +export const getImgByCode = code => `${baseUrl}/code/${code}.png` + +export const fetchSignByCode = (code, add) => `${baseUrl}/code/${code}/sig/${add}` + +export const fetchCodeByAdd = add => `${baseUrl}/acc/${add}/code` + +export const checkCodeValidation = code => `${baseUrl}/code/${code}/active` + +export const getInviteUrlByCode = code => `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas/invite/${code}` + +export const viewEASScanURL = id => `${requireEnv("REACT_APP_EAS_EXPLORER_URL")}/attestation/view/${id}` + +export const checkBadgeEligibilityURL = (baseUrl, walletAddress, badgeContract) => + `${baseUrl}/check?badge=${badgeContract}&recipient=${walletAddress}` + +export const claimBadgeURL = (baseUrl, walletAddress, badgeContract) => `${baseUrl}/claim?badge=${badgeContract}&recipient=${walletAddress}` + +export const EthereumYearBadgeURL = year => `${requireEnv("REACT_APP_ETHEREUM_YEAR_BADGE_API_URI")}/canvas/year/${year}.webp` diff --git a/src/apis/community.ts b/src/apis/community.ts new file mode 100644 index 000000000..a84f6b616 --- /dev/null +++ b/src/apis/community.ts @@ -0,0 +1,2 @@ +export const communityOrigin = "https://community.scroll.cat" +export const communityEventListUrl = `${communityOrigin}/events` diff --git a/src/apis/dynamic.ts b/src/apis/dynamic.ts index 4d381dc3e..1574b8ed2 100644 --- a/src/apis/dynamic.ts +++ b/src/apis/dynamic.ts @@ -1 +1 @@ -export const tokenListUrl = "https://scroll-tech.github.io/token-list/scroll.tokenlist.json" +export const tokenListUrl = "https://assets.scroll.cat/token-list.json" diff --git a/src/apis/ecosystem.ts b/src/apis/ecosystem.ts index 919e4be9a..4a77abe7e 100644 --- a/src/apis/ecosystem.ts +++ b/src/apis/ecosystem.ts @@ -1,12 +1,17 @@ export const ecosystemOrigin = "https://scroll-eco-list.netlify.app" export const ecosystemListHashUrl = ecosystemOrigin + "/docs/" export const ecosystemListLogoUrl = ecosystemOrigin + "/logos/" -export const ecosystemListUrl = "https://ecosystem-list-api.vercel.app/api/query" +export const ecosystemListUrl = "https://ecosystem.scroll.cat/api/query" -export const l2beatOrigin = "https://l2beat.com" +export const fetchEcosystemMetricsData = "https://assets.scroll.cat/ecosystem/metrics" + +// export const l2beatOrigin = "https://l2beat.com" // lack of the latest day -export const ecosystemTVLUrl = l2beatOrigin + "/api/tvl/scroll.json" -export const ecosystemActivityUrl = l2beatOrigin + "/api/activity/scroll.json" +// export const ecosystemTVLUrl = l2beatOrigin + "/api/tvl/scroll.json" +// export const ecosystemActivityUrl = l2beatOrigin + "/api/activity/scroll.json" + +export const fetchEcosystemProtocolLogo = (name, ext) => `${ecosystemListLogoUrl}${name}${ext}` +export const fetchEcosystemProtocolByNameURL = name => `${ecosystemListUrl}?name=${name}` // cross origin // export const l2beatOrigin = "https://api.l2beat.com" diff --git a/src/apis/ens.ts b/src/apis/ens.ts new file mode 100644 index 000000000..a5643dbb9 --- /dev/null +++ b/src/apis/ens.ts @@ -0,0 +1,6 @@ +import { requireEnv } from "@/utils" + +const ensBaseURL = requireEnv("REACT_APP_ENS_API_URL") +export function getEnsAddressURL(ens: string) { + return `${ensBaseURL}/name/${ens}/address` +} diff --git a/src/apis/sessions.ts b/src/apis/sessions.ts new file mode 100644 index 000000000..f5b5646c1 --- /dev/null +++ b/src/apis/sessions.ts @@ -0,0 +1,13 @@ +import { requireEnv } from "@/utils" + +const baseUrl = requireEnv("REACT_APP_OPEN_BLOCK_URI") +const venusUrl = requireEnv("REACT_APP_SCROLL_VENUS_URI") + +export const fetchPastWalletPointsUrl = address => `${baseUrl}/scroll/wallet-points?walletAddress=${address}` +export const fetchCurrentWalletPointsUrl = address => `${baseUrl}/scroll/wallet-points-s2?walletAddress=${address}` + +export const fetchTokensMarksUrl = address => `${baseUrl}/scroll/bridge-balances?walletAddress=${address}` +export const fetchProjectsMarksUrl = address => `${baseUrl}/scroll/project-marks?walletAddress=${address}` + +export const checkSignStatus = address => `${venusUrl}/v1/signature/address?address=${address}` +export const updateSignStatus = `${venusUrl}/v1/signature/sign` diff --git a/src/appGlobals.ts b/src/appGlobals.ts index 38533d35c..b0fb81985 100644 --- a/src/appGlobals.ts +++ b/src/appGlobals.ts @@ -1,4 +1,29 @@ -const scrollRequest = (url: string, options?: object) => { +const scrollRequest = (url: string, options?: RequestInit & { timeout?: number }) => { + if (options?.timeout) { + const controller = new AbortController() + const { signal } = controller + const optionsWithSignal = { ...options, signal } + + const timeoutId = setTimeout(() => { + controller.abort() + }, options.timeout) + + return fetch(url, optionsWithSignal) + .then(async res => { + if (res.ok) { + clearTimeout(timeoutId) + return res.json() + } + // server response but not 200 + const message = await res.text() + const error = new Error(message) + error.status = res.status + clearTimeout(timeoutId) + throw error + }) + .then(data => data) + } + return fetch(url, options) .then(async res => { if (res.ok) { diff --git a/src/assets/abis/CanvasAttestProxy.json b/src/assets/abis/CanvasAttestProxy.json new file mode 100644 index 000000000..f010fb256 --- /dev/null +++ b/src/assets/abis/CanvasAttestProxy.json @@ -0,0 +1,727 @@ +[ + { + "inputs": [ + { + "internalType": "contract IEAS", + "name": "eas", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessDenied", + "type": "error" + }, + { + "inputs": [], + "name": "DeadlineExpired", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidEAS", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidShortString", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "NotFound", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "str", + "type": "string" + } + ], + "name": "StringTooLong", + "type": "error" + }, + { + "inputs": [], + "name": "UsedSignature", + "type": "error" + }, + { + "anonymous": false, + "inputs": [], + "name": "EIP712DomainChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData", + "name": "data", + "type": "tuple" + } + ], + "internalType": "struct AttestationRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "attest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData", + "name": "data", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct Signature", + "name": "signature", + "type": "tuple" + }, + { + "internalType": "address", + "name": "attester", + "type": "address" + }, + { + "internalType": "uint64", + "name": "deadline", + "type": "uint64" + } + ], + "internalType": "struct DelegatedProxyAttestationRequest", + "name": "delegatedRequest", + "type": "tuple" + } + ], + "name": "attestByDelegation", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "eip712Domain", + "outputs": [ + { + "internalType": "bytes1", + "name": "fields", + "type": "bytes1" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "version", + "type": "string" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "verifyingContract", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "salt", + "type": "bytes32" + }, + { + "internalType": "uint256[]", + "name": "extensions", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getAttestTypeHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uid", + "type": "bytes32" + } + ], + "name": "getAttester", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEAS", + "outputs": [ + { + "internalType": "contract IEAS", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getName", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRevokeTypeHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAttester", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData[]", + "name": "data", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "attester", + "type": "address" + }, + { + "internalType": "uint64", + "name": "deadline", + "type": "uint64" + } + ], + "internalType": "struct MultiDelegatedProxyAttestationRequest[]", + "name": "multiDelegatedRequests", + "type": "tuple[]" + } + ], + "name": "multiAttestByDelegation", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData[]", + "name": "data", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "revoker", + "type": "address" + }, + { + "internalType": "uint64", + "name": "deadline", + "type": "uint64" + } + ], + "internalType": "struct MultiDelegatedProxyRevocationRequest[]", + "name": "multiDelegatedRequests", + "type": "tuple[]" + } + ], + "name": "multiRevokeByDelegation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData", + "name": "data", + "type": "tuple" + } + ], + "internalType": "struct RevocationRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "revoke", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData", + "name": "data", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct Signature", + "name": "signature", + "type": "tuple" + }, + { + "internalType": "address", + "name": "revoker", + "type": "address" + }, + { + "internalType": "uint64", + "name": "deadline", + "type": "uint64" + } + ], + "internalType": "struct DelegatedProxyRevocationRequest", + "name": "delegatedRequest", + "type": "tuple" + } + ], + "name": "revokeByDelegation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "attester", + "type": "address" + }, + { + "internalType": "bool", + "name": "enable", + "type": "bool" + } + ], + "name": "toggleAttester", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/src/assets/abis/CanvasBadge.json b/src/assets/abis/CanvasBadge.json new file mode 100644 index 000000000..882aa4a1f --- /dev/null +++ b/src/assets/abis/CanvasBadge.json @@ -0,0 +1,154 @@ +[ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uid", + "type": "bytes32" + } + ], + "name": "badgeTokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "hasBadge", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "uid", + "type": "bytes32" + } + ], + "name": "canUpgrade", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "uid", + "type": "bytes32" + } + ], + "name": "upgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "recipient", + "type": "address" + } + ], + "name": "isEligible", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "uid", "type": "bytes32" }], + "name": "getAndValidateBadge", + "outputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "uid", "type": "bytes32" }, + { "internalType": "bytes32", "name": "schema", "type": "bytes32" }, + { "internalType": "uint64", "name": "time", "type": "uint64" }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revocationTime", + "type": "uint64" + }, + { "internalType": "bytes32", "name": "refUID", "type": "bytes32" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "address", "name": "attester", "type": "address" }, + { "internalType": "bool", "name": "revocable", "type": "bool" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "internalType": "struct Attestation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "uid", "type": "bytes32" }], + "name": "getAttestation", + "outputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "uid", "type": "bytes32" }, + { "internalType": "bytes32", "name": "schema", "type": "bytes32" }, + { "internalType": "uint64", "name": "time", "type": "uint64" }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revocationTime", + "type": "uint64" + }, + { "internalType": "bytes32", "name": "refUID", "type": "bytes32" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "address", "name": "attester", "type": "address" }, + { "internalType": "bool", "name": "revocable", "type": "bool" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "internalType": "struct Attestation", + "name": "attestation", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/assets/abis/CanvasBadgeResolver.json b/src/assets/abis/CanvasBadgeResolver.json new file mode 100644 index 000000000..84f8c1822 --- /dev/null +++ b/src/assets/abis/CanvasBadgeResolver.json @@ -0,0 +1,56 @@ +[ + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "selfAttestedBadges", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "uid", "type": "bytes32" }], + "name": "getAndValidateBadge", + "outputs": [ + { + "components": [ + { "internalType": "bytes32", "name": "uid", "type": "bytes32" }, + { "internalType": "bytes32", "name": "schema", "type": "bytes32" }, + { "internalType": "uint64", "name": "time", "type": "uint64" }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revocationTime", + "type": "uint64" + }, + { "internalType": "bytes32", "name": "refUID", "type": "bytes32" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "address", "name": "attester", "type": "address" }, + { "internalType": "bool", "name": "revocable", "type": "bool" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "internalType": "struct Attestation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/assets/abis/CanvasProfile.json b/src/assets/abis/CanvasProfile.json new file mode 100644 index 000000000..07cc86c28 --- /dev/null +++ b/src/assets/abis/CanvasProfile.json @@ -0,0 +1,181 @@ +[ + { "type": "constructor", "inputs": [{ "name": "resolver_", "type": "address", "internalType": "address" }], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "attach", + "inputs": [{ "name": "_uids", "type": "bytes32[]", "internalType": "bytes32[]" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "autoAttach", + "inputs": [{ "name": "_uid", "type": "bytes32", "internalType": "bytes32" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "avatar", + "inputs": [], + "outputs": [ + { "name": "token", "type": "address", "internalType": "address" }, + { "name": "tokenId", "type": "uint256", "internalType": "uint256" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "changeAvatar", + "inputs": [ + { "name": "token", "type": "address", "internalType": "address" }, + { "name": "tokenId", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "changeUsername", + "inputs": [{ "name": "newUsername", "type": "string", "internalType": "string" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "detach", + "inputs": [{ "name": "_uids", "type": "bytes32[]", "internalType": "bytes32[]" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getAndValidateBadge", + "inputs": [{ "name": "uid", "type": "bytes32", "internalType": "bytes32" }], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Attestation", + "components": [ + { "name": "uid", "type": "bytes32", "internalType": "bytes32" }, + { "name": "schema", "type": "bytes32", "internalType": "bytes32" }, + { "name": "time", "type": "uint64", "internalType": "uint64" }, + { "name": "expirationTime", "type": "uint64", "internalType": "uint64" }, + { "name": "revocationTime", "type": "uint64", "internalType": "uint64" }, + { "name": "refUID", "type": "bytes32", "internalType": "bytes32" }, + { "name": "recipient", "type": "address", "internalType": "address" }, + { "name": "attester", "type": "address", "internalType": "address" }, + { "name": "revocable", "type": "bool", "internalType": "bool" }, + { "name": "data", "type": "bytes", "internalType": "bytes" } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAttachedBadges", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32[]", "internalType": "bytes32[]" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAvatar", + "inputs": [], + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getBadgeOrder", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256[]", "internalType": "uint256[]" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidBadges", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32[]", "internalType": "bytes32[]" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { "name": "owner_", "type": "address", "internalType": "address" }, + { "name": "username_", "type": "string", "internalType": "string" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isBadgeValid", + "inputs": [{ "name": "uid", "type": "bytes32", "internalType": "bytes32" }], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "multicall", + "inputs": [{ "name": "data", "type": "bytes[]", "internalType": "bytes[]" }], + "outputs": [{ "name": "results", "type": "bytes[]", "internalType": "bytes[]" }], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registry", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "reorderBadges", + "inputs": [{ "name": "_orders", "type": "uint256[]", "internalType": "uint256[]" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "resolver", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "username", + "inputs": [], + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [{ "name": "version", "type": "uint8", "indexed": false, "internalType": "uint8" }], + "anonymous": false + }, + { "type": "error", "name": "AttestationOwnerMismatch", "inputs": [{ "name": "uid", "type": "bytes32", "internalType": "bytes32" }] }, + { "type": "error", "name": "BadgeCountReached", "inputs": [] }, + { "type": "error", "name": "LengthMismatch", "inputs": [] }, + { + "type": "error", + "name": "TokenNotOwnedByUser", + "inputs": [ + { "name": "token", "type": "address", "internalType": "address" }, + { "name": "tokenId", "type": "uint256", "internalType": "uint256" } + ] + }, + { "type": "error", "name": "Unauthorized", "inputs": [] } +] diff --git a/src/assets/abis/CanvasProfileRegistry.json b/src/assets/abis/CanvasProfileRegistry.json new file mode 100644 index 000000000..2d6669626 --- /dev/null +++ b/src/assets/abis/CanvasProfileRegistry.json @@ -0,0 +1,107 @@ +[ + { + "inputs": [ + { + "internalType": "string", + "name": "username", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function", + "name": "isUsernameUsed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ] + }, + { + "inputs": [ + { + "internalType": "string", + "name": "username", + "type": "string" + }, + { + "internalType": "bytes", + "name": "referral", + "type": "bytes" + } + ], + "name": "mint", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getProfile", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isProfileMinted", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "referrerData", + "outputs": [ + { + "internalType": "uint128", + "name": "referred", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "earned", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/assets/abis/L1MessageQueue.json b/src/assets/abis/ERC1155ABI.json similarity index 56% rename from src/assets/abis/L1MessageQueue.json rename to src/assets/abis/ERC1155ABI.json index 127fc2b59..2582d8202 100644 --- a/src/assets/abis/L1MessageQueue.json +++ b/src/assets/abis/ERC1155ABI.json @@ -8,51 +8,25 @@ "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "startIndex", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "count", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "skippedBitmap", - "type": "uint256" - } - ], - "name": "DequeueTransaction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "DropTransaction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" + "internalType": "bool", + "name": "approved", + "type": "bool" } ], - "name": "Initialized", + "name": "ApprovalForAll", "type": "event" }, { @@ -80,79 +54,72 @@ { "indexed": true, "internalType": "address", - "name": "sender", + "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "target", + "name": "from", "type": "address" }, { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint64", - "name": "queueIndex", - "type": "uint64" + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "gasLimit", - "type": "uint256" + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" }, { "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" } ], - "name": "QueueTransaction", + "name": "TransferBatch", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "_oldGateway", + "name": "operator", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "_newGateway", + "name": "from", "type": "address" - } - ], - "name": "UpdateEnforcedTxGateway", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + }, { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "_oldGasOracle", + "name": "to", "type": "address" }, { "indexed": false, - "internalType": "address", - "name": "_newGasOracle", - "type": "address" + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" } ], - "name": "UpdateGasOracle", + "name": "TransferSingle", "type": "event" }, { @@ -160,90 +127,82 @@ "inputs": [ { "indexed": false, - "internalType": "uint256", - "name": "_oldMaxGasLimit", - "type": "uint256" + "internalType": "string", + "name": "value", + "type": "string" }, { - "indexed": false, + "indexed": true, "internalType": "uint256", - "name": "_newMaxGasLimit", + "name": "id", "type": "uint256" } ], - "name": "UpdateMaxGasLimit", + "name": "URI", "type": "event" }, { "inputs": [ { "internalType": "address", - "name": "_target", + "name": "account", "type": "address" }, { "internalType": "uint256", - "name": "_gasLimit", + "name": "id", "type": "uint256" - }, + } + ], + "name": "balanceOf", + "outputs": [ { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "appendCrossDomainMessage", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "address", - "name": "_target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" + "internalType": "address[]", + "name": "accounts", + "type": "address[]" }, { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + } + ], + "name": "balanceOfBatch", + "outputs": [ { - "internalType": "bytes", - "name": "_data", - "type": "bytes" + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" } ], - "name": "appendEnforcedTransaction", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "bytes", - "name": "_calldata", - "type": "bytes" + "internalType": "uint256", + "name": "id", + "type": "uint256" } ], - "name": "calculateIntrinsicGasFee", + "name": "exists", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", @@ -253,94 +212,85 @@ "inputs": [ { "internalType": "address", - "name": "_sender", + "name": "account", "type": "address" }, - { - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_value", - "type": "uint256" - }, { "internalType": "address", - "name": "_target", + "name": "operator", "type": "address" - }, - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" } ], - "name": "computeTransactionHash", + "name": "isApprovedForAll", "outputs": [ { - "internalType": "bytes32", + "internalType": "bool", "name": "", - "type": "bytes32" + "type": "bool" } ], - "stateMutability": "pure", + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, { "internalType": "uint256", - "name": "_index", + "name": "id", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "dropCrossDomainMessage", + "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "enforcedTxGateway", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "to", "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - } - ], - "name": "estimateCrossDomainMessageFee", - "outputs": [ + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "view", + "name": "mintBatch", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "gasOracle", + "name": "owner", "outputs": [ { "internalType": "address", @@ -352,123 +302,123 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256", - "name": "_queueIndex", - "type": "uint256" - } - ], - "name": "getCrossDomainMessage", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "_messenger", + "name": "from", "type": "address" }, { "internalType": "address", - "name": "_scrollChain", + "name": "to", "type": "address" }, { - "internalType": "address", - "name": "_enforcedTxGateway", - "type": "address" + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" }, { - "internalType": "address", - "name": "_gasOracle", - "type": "address" + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" }, { - "internalType": "uint256", - "name": "_maxGasLimit", - "type": "uint256" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "name": "initialize", + "name": "safeBatchTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "maxGasLimit", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "id", "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ + }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" - } - ], - "name": "messageQueue", - "outputs": [ + }, { - "internalType": "bytes32", - "name": "", - "type": "bytes32" + "internalType": "bytes", + "name": "data", + "type": "bytes" } ], - "stateMutability": "view", + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "messenger", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "operator", "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" } ], - "stateMutability": "view", + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "nextCrossDomainMessageIndex", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "string", + "name": "newuri", + "type": "string" } ], - "stateMutability": "view", + "name": "setURI", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "owner", + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", "outputs": [ { - "internalType": "address", + "internalType": "bool", "name": "", - "type": "address" + "type": "bool" } ], "stateMutability": "view", @@ -476,7 +426,7 @@ }, { "inputs": [], - "name": "pendingQueueIndex", + "name": "totalSupply", "outputs": [ { "internalType": "uint256", @@ -491,40 +441,16 @@ "inputs": [ { "internalType": "uint256", - "name": "_startIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_count", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_skippedBitmap", + "name": "id", "type": "uint256" } ], - "name": "popCrossDomainMessage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "scrollChain", + "name": "totalSupply", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", @@ -546,40 +472,20 @@ { "inputs": [ { - "internalType": "address", - "name": "_newGateway", - "type": "address" - } - ], - "name": "updateEnforcedTxGateway", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newGasOracle", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "updateGasOracle", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "uri", + "outputs": [ { - "internalType": "uint256", - "name": "_newMaxGasLimit", - "type": "uint256" + "internalType": "string", + "name": "", + "type": "string" } ], - "name": "updateMaxGasLimit", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" } ] diff --git a/src/assets/abis/ERC721ABI.json b/src/assets/abis/ERC721ABI.json new file mode 100644 index 000000000..723c8a778 --- /dev/null +++ b/src/assets/abis/ERC721ABI.json @@ -0,0 +1,416 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_DAI", "type": "address" }, + { "internalType": "address", "name": "_WETH", "type": "address" }, + { "internalType": "string", "name": "_URI", "type": "string" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "FaucetDrained", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + } + ], + "name": "FaucetDripped", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "OperatorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "status", + "type": "bool" + } + ], + "name": "SuperOperatorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "DAI", + "outputs": [ + { "internalType": "contract IERC20", "name": "", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DAI_AMOUNT", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETH_AMOUNT", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NFT_COUNT", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "URI", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH", + "outputs": [ + { "internalType": "contract IERC20", "name": "", "type": "address" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WETH_AMOUNT", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "approvedOperators", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "availableDrips", + "outputs": [ + { "internalType": "uint256", "name": "ethDrips", "type": "uint256" }, + { "internalType": "uint256", "name": "daiDrips", "type": "uint256" }, + { "internalType": "uint256", "name": "wethDrips", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" } + ], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_recipient", "type": "address" } + ], + "name": "drain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_recipient", "type": "address" } + ], + "name": "drip", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "getApproved", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "operator", "type": "address" } + ], + "name": "isApprovedForAll", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nftsMinted", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "ownerOf", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, + { "internalType": "bytes", "name": "_data", "type": "bytes" } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "operator", "type": "address" }, + { "internalType": "bool", "name": "approved", "type": "bool" } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "superOperators", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } + ], + "name": "supportsInterface", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "tokenURI", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "tokenId", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_operator", "type": "address" }, + { "internalType": "bool", "name": "_status", "type": "bool" } + ], + "name": "updateApprovedOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_nftCount", "type": "uint256" }, + { "internalType": "uint256", "name": "_ethAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "_daiAmount", "type": "uint256" }, + { "internalType": "uint256", "name": "_wethAmount", "type": "uint256" } + ], + "name": "updateDripAmounts", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_operator", "type": "address" }, + { "internalType": "bool", "name": "_status", "type": "bool" } + ], + "name": "updateSuperOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "string", "name": "_URI", "type": "string" }], + "name": "updateTokenURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "stateMutability": "payable", "type": "receive" } +] diff --git a/src/assets/abis/L1BatchBridgeGateway.json b/src/assets/abis/L1BatchBridgeGateway.json new file mode 100644 index 000000000..e6fafdbbf --- /dev/null +++ b/src/assets/abis/L1BatchBridgeGateway.json @@ -0,0 +1,681 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_counterpart", + "type": "address" + }, + { + "internalType": "address", + "name": "_router", + "type": "address" + }, + { + "internalType": "address", + "name": "_messenger", + "type": "address" + }, + { + "internalType": "address", + "name": "_queue", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ErrorCallerNotMessenger", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorDepositAmountTooSmall", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorIncorrectMethodForETHDeposit", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorInsufficientMsgValueForBatchDepositFee", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorInvalidBatchConfig", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorNoPendingBatch", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorTokenNotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "ErrorTransferETHFailed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "l1Token", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "l2Token", + "type": "address" + } + ], + "name": "BatchDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "batches", + "outputs": [ + { + "internalType": "uint128", + "name": "amount", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "startTime", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "numDeposits", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "configs", + "outputs": [ + { + "internalType": "uint96", + "name": "feeAmountPerTx", + "type": "uint96" + }, + { + "internalType": "uint96", + "name": "minAmountPerTx", + "type": "uint96" + }, + { + "internalType": "uint16", + "name": "maxTxsPerBatch", + "type": "uint16" + }, + { + "internalType": "uint24", + "name": "maxDelayPerBatch", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "safeBridgeGasLimit", + "type": "uint24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "counterpart", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint96", + "name": "amount", + "type": "uint96" + } + ], + "name": "depositERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "depositETH", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "executeBatchDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "feeVault", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_feeVault", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "messenger", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "queue", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "router", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "components": [ + { + "internalType": "uint96", + "name": "feeAmountPerTx", + "type": "uint96" + }, + { + "internalType": "uint96", + "name": "minAmountPerTx", + "type": "uint96" + }, + { + "internalType": "uint16", + "name": "maxTxsPerBatch", + "type": "uint16" + }, + { + "internalType": "uint24", + "name": "maxDelayPerBatch", + "type": "uint24" + }, + { + "internalType": "uint24", + "name": "safeBridgeGasLimit", + "type": "uint24" + } + ], + "internalType": "struct L1BatchBridgeGateway.BatchConfig", + "name": "newConfig", + "type": "tuple" + } + ], + "name": "setBatchConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "tokens", + "outputs": [ + { + "internalType": "uint128", + "name": "pending", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "currentBatchIndex", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "pendingBatchIndex", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] diff --git a/src/assets/abis/L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE.json b/src/assets/abis/L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE.json new file mode 100644 index 000000000..9e2d54fe0 --- /dev/null +++ b/src/assets/abis/L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE.json @@ -0,0 +1,311 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_messenger", "type": "address" }, + { "internalType": "address", "name": "_scrollChain", "type": "address" }, + { "internalType": "address", "name": "_enforcedTxGateway", "type": "address" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "name": "ErrorNotWhitelistedSender", "type": "error" }, + { "inputs": [], "name": "ErrorZeroAddress", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "startIndex", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "count", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "skippedBitmap", "type": "uint256" } + ], + "name": "DequeueTransaction", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" }], + "name": "DropTransaction", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" }], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, + { "indexed": false, "internalType": "uint64", "name": "queueIndex", "type": "uint64" }, + { "indexed": false, "internalType": "uint256", "name": "gasLimit", "type": "uint256" }, + { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } + ], + "name": "QueueTransaction", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "_oldGasOracle", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "_newGasOracle", "type": "address" } + ], + "name": "UpdateGasOracle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "oldL2BaseFee", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "newL2BaseFee", "type": "uint256" } + ], + "name": "UpdateL2BaseFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "_oldMaxGasLimit", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "_newMaxGasLimit", "type": "uint256" } + ], + "name": "UpdateMaxGasLimit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "_oldWhitelistChecker", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "_newWhitelistChecker", "type": "address" } + ], + "name": "UpdateWhitelistChecker", + "type": "event" + }, + { + "inputs": [ + { "internalType": "address", "name": "_target", "type": "address" }, + { "internalType": "uint256", "name": "_gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "_data", "type": "bytes" } + ], + "name": "appendCrossDomainMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_sender", "type": "address" }, + { "internalType": "address", "name": "_target", "type": "address" }, + { "internalType": "uint256", "name": "_value", "type": "uint256" }, + { "internalType": "uint256", "name": "_gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "_data", "type": "bytes" } + ], + "name": "appendEnforcedTransaction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes", "name": "_calldata", "type": "bytes" }], + "name": "calculateIntrinsicGasFee", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_sender", "type": "address" }, + { "internalType": "uint256", "name": "_queueIndex", "type": "uint256" }, + { "internalType": "uint256", "name": "_value", "type": "uint256" }, + { "internalType": "address", "name": "_target", "type": "address" }, + { "internalType": "uint256", "name": "_gasLimit", "type": "uint256" }, + { "internalType": "bytes", "name": "_data", "type": "bytes" } + ], + "name": "computeTransactionHash", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_index", "type": "uint256" }], + "name": "dropCrossDomainMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enforcedTxGateway", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_gasLimit", "type": "uint256" }], + "name": "estimateCrossDomainMessageFee", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "gasOracle", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_queueIndex", "type": "uint256" }], + "name": "getCrossDomainMessage", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_messenger", "type": "address" }, + { "internalType": "address", "name": "_scrollChain", "type": "address" }, + { "internalType": "address", "name": "_enforcedTxGateway", "type": "address" }, + { "internalType": "address", "name": "_gasOracle", "type": "address" }, + { "internalType": "uint256", "name": "_maxGasLimit", "type": "uint256" } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "inputs": [], "name": "initializeV2", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [{ "internalType": "uint256", "name": "_queueIndex", "type": "uint256" }], + "name": "isMessageDropped", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_queueIndex", "type": "uint256" }], + "name": "isMessageSkipped", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l2BaseFee", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxGasLimit", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "messageQueue", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messenger", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextCrossDomainMessageIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingQueueIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_startIndex", "type": "uint256" }, + { "internalType": "uint256", "name": "_count", "type": "uint256" }, + { "internalType": "uint256", "name": "_skippedBitmap", "type": "uint256" } + ], + "name": "popCrossDomainMessage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "scrollChain", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_newL2BaseFee", "type": "uint256" }], + "name": "setL2BaseFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "_newGasOracle", "type": "address" }], + "name": "updateGasOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "_newMaxGasLimit", "type": "uint256" }], + "name": "updateMaxGasLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "_newWhitelistChecker", "type": "address" }], + "name": "updateWhitelistChecker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "whitelistChecker", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + } +] diff --git a/src/assets/abis/L2GasPriceOracle.json b/src/assets/abis/L2GasPriceOracle.json deleted file mode 100644 index cd9696e1d..000000000 --- a/src/assets/abis/L2GasPriceOracle.json +++ /dev/null @@ -1,315 +0,0 @@ -[ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "txGas", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "txGasContractCreation", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "zeroGas", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nonZeroGas", - "type": "uint256" - } - ], - "name": "IntrinsicParamsUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "oldL2BaseFee", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "newL2BaseFee", - "type": "uint256" - } - ], - "name": "L2BaseFeeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_oldWhitelist", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_newWhitelist", - "type": "address" - } - ], - "name": "UpdateWhitelist", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "_message", - "type": "bytes" - } - ], - "name": "calculateIntrinsicGasFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_gasLimit", - "type": "uint256" - } - ], - "name": "estimateCrossDomainMessageFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "_txGas", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_txGasContractCreation", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_zeroGas", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_nonZeroGas", - "type": "uint64" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "intrinsicParams", - "outputs": [ - { - "internalType": "uint64", - "name": "txGas", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "txGasContractCreation", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "zeroGas", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "nonZeroGas", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "l2BaseFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint64", - "name": "_txGas", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_txGasContractCreation", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_zeroGas", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "_nonZeroGas", - "type": "uint64" - } - ], - "name": "setIntrinsicParams", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_newL2BaseFee", - "type": "uint256" - } - ], - "name": "setL2BaseFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newWhitelist", - "type": "address" - } - ], - "name": "updateWhitelist", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "whitelist", - "outputs": [ - { - "internalType": "contract IWhitelist", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/assets/abis/ScrollCanvas.json b/src/assets/abis/ScrollCanvas.json new file mode 100644 index 000000000..dfd77a44d --- /dev/null +++ b/src/assets/abis/ScrollCanvas.json @@ -0,0 +1,16 @@ +[ + "function getAttachedBadges() external view returns (bytes32[])", + "function getProfile(address) view returns (address)", + "function isProfileMinted(address) view returns (bool)", + "function mintProfile(string)", + "function mint(string username, bytes referrer) payable", + "function changeUsername(string)", + "function username() view returns (string)", + "function changeUsername(string)", + "function isUsernameUsed(string calldata username) external view returns (bool)", + "function getBadgeOrder() external view returns (uint256[])", + "function attachOne(bytes32)", + "function detach(bytes32[])", + "function detach(bytes32[])", + "function attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))" +] diff --git a/src/assets/blog/alphaTestnet.md b/src/assets/blog/alpha-testnet.md similarity index 100% rename from src/assets/blog/alphaTestnet.md rename to src/assets/blog/alpha-testnet.md diff --git a/src/assets/blog/architecture.md b/src/assets/blog/architecture.md index 46f39406a..4b2c8973e 100644 --- a/src/assets/blog/architecture.md +++ b/src/assets/blog/architecture.md @@ -74,4 +74,4 @@ If our vision of scaling Ethereum in an open and community-driven way resonates - If you are a ZK researcher, ZKP, Go or Solidity developer, or a GPU engineer, we are working on many interesting technical challenges at the edge of what’s possible. Come build cutting-edge solutions to these problems with us in the open! - If you love nurturing and growing ecosystems or communities, we are looking for developer advocates and community organizers to make sure we are building in a community-aligned and user-friendly way. -To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://jobs.lever.co/ScrollFoundation). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](http://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](http://github.com/privacy-scaling-explorations/zkevm-circuits). +To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://boards.greenhouse.io/scrollio). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](http://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](http://github.com/privacy-scaling-explorations/zkevm-circuits). diff --git a/src/assets/blog/contributeToScroll.md b/src/assets/blog/contribute-to-scroll.md similarity index 100% rename from src/assets/blog/contributeToScroll.md rename to src/assets/blog/contribute-to-scroll.md diff --git a/src/assets/blog/founderLetter.md b/src/assets/blog/founder-letter.md similarity index 100% rename from src/assets/blog/founderLetter.md rename to src/assets/blog/founder-letter.md diff --git a/src/assets/blog/preAlphaTestnet.md b/src/assets/blog/pre-alpha-testnet.md similarity index 93% rename from src/assets/blog/preAlphaTestnet.md rename to src/assets/blog/pre-alpha-testnet.md index dff798da4..2bbc52022 100644 --- a/src/assets/blog/preAlphaTestnet.md +++ b/src/assets/blog/pre-alpha-testnet.md @@ -39,4 +39,4 @@ To become an early tester or contributor, sign up to try out our pre-alpha testn - If you are a ZK researcher, ZKP, Go or Solidity developer, or a GPU engineer, we are working on many interesting technical challenges at the edge of what’s possible. Come build cutting-edge solutions to these problems with us in the open! - If you love nurturing and growing ecosystems or communities, we are looking for developer advocates and community organizers to make sure we are building in a community-aligned and user-friendly way. -To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://jobs.lever.co/ScrollFoundation). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](https://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](https://github.com/privacy-scaling-explorations/zkevm-circuits). +To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://boards.greenhouse.io/scrollio). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](https://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](https://github.com/privacy-scaling-explorations/zkevm-circuits). diff --git a/src/assets/blog/proofGeneration.md b/src/assets/blog/proof-generation.md similarity index 100% rename from src/assets/blog/proofGeneration.md rename to src/assets/blog/proof-generation.md diff --git a/src/assets/blog/releaseNote0109.md b/src/assets/blog/release-note-0109.md similarity index 100% rename from src/assets/blog/releaseNote0109.md rename to src/assets/blog/release-note-0109.md diff --git a/src/assets/blog/scaling-security.md b/src/assets/blog/scaling-security.md new file mode 100644 index 000000000..6a1bf7547 --- /dev/null +++ b/src/assets/blog/scaling-security.md @@ -0,0 +1,75 @@ +# Scaling Security: Multi-Prover Implementation on Scroll + +*Written by Haichen Shen* + +*Acknowledgment: Special thanks to [Péter Garamvölgyi](https://twitter.com/thegaram33), [Mohammad Jahanara](https://twitter.com/MMJahanara), [Ye Zhang](https://twitter.com/yezhang1998), and [Deli Gong](https://twitter.com/deligong) for discussions and feedback on earlier drafts of this article.* + + +As more assets have moved from Ethereum to Layer 2, one crucial factor often gets sidelined: security. As Vitalik pointed out in his [talk](https://hackmd.io/@vbuterin/zk_slides_20221010) and [blog](https://vitalik.eth.limo/general/2023/03/31/zkmulticlient.html), it will take a long time for complex software like zkEVMs to be completely bug-free. The risk of bugs in a single prover that validates all L2 transactions could be catastrophic. Similar to Ethereum's multi-client philosophy, having prover diversity can significantly reduce such risk. + +This article unveils the architecture bringing prover diversity to enhance Scroll's security. We explore the design space for a multi-proof system and articulate the rationale behind incorporating a TEE (Trusted Execution Environment) prover as a secondary prover to Scroll. Lastly, we are excited to share the news that Scroll is collaborating with [Automata](https://www.ata.network/), a modular attestation layer, to develop a TEE prover for the Scroll protocol jointly. A prototype SGX prover has already validated all Scroll Sepolia testnet blocks successfully. + +## Why do multi-provers matter? + +ZK rollups leverage zero-knowledge proofs to validate the correct execution of L2 transactions. However, ZK circuits, especially zkEVM circuits, are complex software comprising tens of thousands of lines of code. Such complexity inherently increases their susceptibility to bugs. Among these, [completeness](https://en.wikipedia.org/wiki/Zero-knowledge_proof#Completeness) bugs are relatively more straightforward to detect and resolve. However, [soundness](https://en.wikipedia.org/wiki/Zero-knowledge_proof#Soundness) bugs pose a more formidable challenge. These bugs are not only difficult to identify but also require substantial time and resources to ensure their rectification. + +In the current landscape, ZK rollups predominantly operate with centralized sequencers and provers. Under the centralization scenario, the liveness and the security given the potential bugs still depend on the chain operator's honesty. Furthermore, the decentralization of provers poses an increased risk of soundness bugs becoming a critical threat. These bugs could allow provers to finalize invalid state transitions on Ethereum, undermining the integrity of the entire blockchain network. + +Similar to the rationale of client diversity, having multiple types of provers independently validate state transitions significantly bolsters security. When these provers unanimously agree on the state transition after applying the same batch of transactions, the likelihood of invalid transactions infiltrating the system drastically reduces. Therefore, the user assets on the layer2s become more secure. + +## What is the design space of a multi-proof system? + +When designing the multi-proof system for Scroll, we aim to achieve three objectives: +- Enhance the layer2 security +- Doesn't increase finality time +- Only introduce marginal cost to L2 transactions + +![multi-proof system design space](https://hackmd.io/_uploads/Sy4oveptp.png) + +To understand the design space of Layer 2 proof systems, we use the critical metrics of finality and security to evaluate each proof system. We begin with single-proof systems. These systems only use a single mechanism to ensure the correctness of L2 blocks. There are two main categories: fraud proofs and ZK proofs. Fraud proofs, used by optimistic rollups, depend on verifiers to challenge transaction states. Their security stems from the economic incentives of verifiers, and fraud proofs suffer from a long finality delay due to the challenge period. On the other hand, ZK proofs, also known as validity proofs, leverage cryptographic protocols to proactively generate proofs and achieve a faster finality time and a more robust security guarantee. + +Now, back to multi-proof systems. A recent [proposal](https://taiko.mirror.xyz/Z4I5ZhreGkyfdaL5I9P0Rj0DNX4zaWFmcws-0CVMJ2A) introduces a hierarchical contestable multi-proof system[^1]. However, it cannot achieve our objectives. First, its security is inferior to the ZK proof, as it only mandates a fraction of the state transition to be validated by ZK proofs, leaving the majority to less-secure proofs. Second, the finality time also becomes slower due to the introduction of contestation periods. + +For Scroll to achieve all three objectives, the multi-proof system must validate all state transitions with multiple proofs, including at least one ZK proof. We call it an "always-on" multi-proof system. Finality time and cost efficiency requirements narrow our options for a secondary prover. In the next section, we will delve into these options. + +## What are the options for a 2nd prover? + +We have explored three options for a 2nd prover in the multi-proof system on Scroll. + +- One intuitive option is a fraud proof, as it is well-established and adopted by the optimistic rollups. As explained above, a significant limitation of fraud proofs arises with its finality time, which extends up to seven days. Combining the fraud proofs with zk proofs extends the L2 finality time to the slowest proof time. This slow finality time violates our objective that a 2nd prover should not increase the finality time. +- Another option is a 2nd zkEVM prover. This means to have a completely separate implementation of the zkEVM prover for Scroll. However, developing an entirely new zkEVM prover is a resource-intensive endeavor in terms of cost and time. The substantial complexity and technical expertise required to implement a new zkEVM prover only makes this option a long-term solution. +- A third alternative is a Trusted Execution Environment (TEE) prover, [proposed](https://ethresear.ch/t/2fa-zk-rollups-using-sgx/14462) by Justin Drake. TEEs allow you to run software in a secure area of a processor where data and memory are inaccessible to other components in the system. The TEE prover operates within this protected environment, executing transactions and generating proofs. A vital advantage of the TEE prover lies in its efficiency. The overhead associated with proving processes is negligible, resulting in a faster and more cost-effective solution than a zkEVM prover. Thus, the TEE prover won't increase the finality time. A TEE prover bolsters the safety guarantees of the protocol at the cost of reduced liveness guarantees. In other words, a bug in one of the two provers will not result in the user funds being stolen but has the tradeoff of a validating bridge pausing if one of the two provers has a bug. + +After weighing the pros and cons of all three options, we decided to add a TEE prover to Scroll. In addition to the benefits mentioned earlier, the rationale for adopting the TEE prover is as follows: +- We will be able to bring a TEE prover to production in 6 months or less, enhancing the security of Scroll Mainnet and delivering more user benefits. +- The additional cost of verifying TEE proofs on Ethereum is marginal, meaning that the increase in transaction cost on Scroll will be negligible. +- It's an essential step towards decentralizing zkEVM provers by introducing a second prover to safeguard the Scroll state transition. + +To mitigate the concern of trusting TEE implementation and hardware manufacturers, we are researching a protocol to aggregate TEE proofs from multiple TEE provers with different hardware and client implementations. Similar to [Distributed Validator Technology](https://ethereum.org/en/staking/dvt/) (DVT) for Ethereum validation, we can combine the threshold signature scheme into the TEE proof generation so that a TEE proof requires the attestation of `t` out of `n` TEE provers, minimizing the trust of a single hardware manufacturer, depicted in the figure below. + +![multi-prover](https://hackmd.io/_uploads/BkPPG8HDp.png) + +## How will the TEE prover integrate into Scroll? + +Integrating a TEE prover into Scroll involves ensuring secure and accurate state transition validation, as illustrated in the figure. + +![multi-prover-timeline](https://hackmd.io/_uploads/Hy0OKhJwT.png) + +- First, a TEE prover must register itself to a smart contract deployed on Ethereum by submitting a valid attestation report generated by the hardware. The attestation report also encloses a public key that the prover will use to sign the TEE proof later on and the hash of the software binary that the enclave is running to ensure the correctness of the Scroll attestation program. An on-chain verifier will validate the report. +- Whenever a new batch is committed to Ethereum, the registered TEE prover, operating in its secure enclave, executes the state transition verification program using the committed data. The output of the TEE prover includes the old and new state roots after applying the transactions and an attestation signature using the previously registered key. +- Both the ZK and TEE proofs are required to finalize the Scroll state transition. This dual-proof system ensures higher security and reliability, combining the strengths of both TEE and zkEVM methodologies to validate transactions. +- Periodically, the registration of a TEE prover expires. It requires the TEE prover to generate a new attestation report and register itself again to prevent private key leaks or side-channel attacks on the enclave. + +TEE provers on the Scroll chain will be initially managed and operated by a committee and later decentralized. This committee will rotate the responsibility of running the TEE provers among its members. This rotation system is designed to distribute trust and reduce the risk of any single point of failure or bias in the validation process. + +If a TEE proof and a zk proof disagree, the Scroll chain will enter a "dispute" state. This situation triggers a pause in batch finalization and withdrawal processes to maintain the integrity of the network. During this period, a Security Council (which will launch alongside multi-proofs) steps in to resolve the conflict. The Council recomputes the state root by executing the batch in question. The resultant state root that garners the majority vote from the Security Council will be accepted as the canonical state root of the Scroll chain. This mechanism ensures that disagreements between proofs are resolved securely and transparently, maintaining the stability and security of the Scroll network. + +## Next steps + +We're working closely with [Automata](https://www.ata.network/) to implement an SGX prover for Scroll. The prototype SGX prover has already been built and can verify all state transitions of the Scroll Sepolia testnet, where the [code](https://github.com/automata-network/sgx-prover) is fully open-sourced. + +Moving forward, we'll integrate the dual-proof system of SGX + ZK and the "dispute" functionality into Scroll. As always, this code will be thoroughly audited to ensure it meets the highest security standards, and a TEE prover committee will be formed to provide the necessary support. + + +[^1]: In a hierarchical contestable multi-proof design, the system supports a hierarchy of proof types ranging from light, less secure, and inexpensive (e.g., optimistic) to strong, more secure, and relatively expensive (e.g. zk). The state transitions are mostly validated by light proofs. However, light proofs can be contested and refuted by stronger proofs within a contestable period. + diff --git a/src/assets/blog/scrollSepolia.md b/src/assets/blog/scroll-sepolia.md similarity index 100% rename from src/assets/blog/scrollSepolia.md rename to src/assets/blog/scroll-sepolia.md diff --git a/src/assets/blog/technicalPrinciples.md b/src/assets/blog/technical-principles.md similarity index 96% rename from src/assets/blog/technicalPrinciples.md rename to src/assets/blog/technical-principles.md index 72571e0e3..de9e82af7 100644 --- a/src/assets/blog/technicalPrinciples.md +++ b/src/assets/blog/technical-principles.md @@ -67,4 +67,4 @@ If our vision of scaling Ethereum in an open and community-driven way resonates - If you are a ZK researcher, ZKP, Go or Solidity developer, or a GPU engineer, we are working on many interesting technical challenges at the edge of what’s possible. Come build cutting-edge solutions to these problems with us in the open! - If you love nurturing and growing ecosystems or communities, we are looking for developer advocates and community organizers to make sure we are building in a community-aligned and user-friendly way. -To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://jobs.lever.co/ScrollFoundation). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](http://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](http://github.com/privacy-scaling-explorations/zkevm-circuits). +To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://boards.greenhouse.io/scrollio). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](http://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](http://github.com/privacy-scaling-explorations/zkevm-circuits). diff --git a/src/assets/blog/upgradingPreAlphaTestnet.md b/src/assets/blog/upgrading-pre-alpha-testnet.md similarity index 93% rename from src/assets/blog/upgradingPreAlphaTestnet.md rename to src/assets/blog/upgrading-pre-alpha-testnet.md index 8ab91d18e..02902414e 100644 --- a/src/assets/blog/upgradingPreAlphaTestnet.md +++ b/src/assets/blog/upgrading-pre-alpha-testnet.md @@ -44,4 +44,4 @@ To become an early tester or contributor, sign up to try out our Pre-Alpha Testn - If you love nurturing and growing ecosystems or communities, we are looking for developer advocates and community organizers to build with us in a community-aligned and user-friendly way. -To learn more about these roles, check out our [jobs page](https://jobs.lever.co/ScrollFoundation). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](http://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](http://github.com/privacy-scaling-explorations/zkevm-circuits). +To learn more about these roles, check out our [jobs page](https://boards.greenhouse.io/scrollio). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](http://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](http://github.com/privacy-scaling-explorations/zkevm-circuits). diff --git a/src/assets/blog/visionAndValues.md b/src/assets/blog/vision-and-values.md similarity index 96% rename from src/assets/blog/visionAndValues.md rename to src/assets/blog/vision-and-values.md index 9333f240f..7451b068d 100644 --- a/src/assets/blog/visionAndValues.md +++ b/src/assets/blog/vision-and-values.md @@ -47,4 +47,4 @@ If our vision of scaling Ethereum in an open and community-driven way resonates - If you are a ZK researcher, ZKP, Go or Solidity developer, or a GPU engineer, we are working on many interesting technical challenges at the edge of what’s possible. Come build cutting-edge solutions to these problems with us in the open! - If you love nurturing and growing ecosystems or communities, we are looking for developer advocates and community organizers to make sure we are building in a community-aligned and user-friendly way. -To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://jobs.lever.co/ScrollFoundation). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](https://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](https://github.com/privacy-scaling-explorations/zkevm-circuits). +To learn more about these roles and about Scroll, check out our [website](https://scroll.io/), [Twitter](https://twitter.com/Scroll_ZKP), [Discord](https://discord.gg/scroll), or [jobs page](https://boards.greenhouse.io/scrollio). If you want to get straight to the code and build with us, you can find our repos at [github.com/scroll-tech](https://github.com/scroll-tech) and [github.com/privacy-scaling-explorations/zkevm-circuits](https://github.com/privacy-scaling-explorations/zkevm-circuits). diff --git a/src/assets/blog/zkEVM.md b/src/assets/blog/zkevm.md similarity index 100% rename from src/assets/blog/zkEVM.md rename to src/assets/blog/zkevm.md diff --git a/src/assets/files/sensitive-word.json b/src/assets/files/sensitive-word.json new file mode 100644 index 000000000..e6c50144d --- /dev/null +++ b/src/assets/files/sensitive-word.json @@ -0,0 +1,332 @@ +[ + "2girls1cup", + "anal", + "Arsch", + "Arschloch", + "Arse", + "Arsehole", + "arseholes", + "ass", + "asshole", + "assholes", + "bitch", + "blow job", + "Blowjob", + "buttfuck", + "buttfucker", + "Cock", + "cock sucker", + "Cocks", + "Cocksucker", + "comepollas", + "comepoyas", + "Connard", + "Cum", + "Cunt", + "cunts", + "Dick", + "Dickhead", + "Dicks", + "Drecksau", + "drecksjude", + "Faggot", + "falangista", + "fascista", + "Fellatio", + "fick dich", + "fistfuck", + "Fooking", + "Fotze", + "Fuck", + "Fucker", + "Fuckers", + "Fucking", + "judenmutter", + "Kike", + "leck mich", + "porno", + "Pussy", + "raghead", + "ragheads", + "sadomasochistic", + "sadomasoquista", + "sausagejockey", + "shadydealings", + "shag", + "shaggers", + "sheep-l0ver", + "sheep-l0vers", + "sheep-lover", + "sheep-lovers", + "sheep-shaggers", + "sheepl0ver", + "sheepl0vers", + "sheeplover", + "sheepshaggers", + "sheethead", + "sheetheads", + "sheister", + "shiznit", + "shortfuck", + "Bollocks", + "Bullshit", + "Nazi", + "neger", + "negrero", + "Nigga", + "Nigger", + "niggers", + "Niquer", + "heil hitler", + "Hitler", + "Queer", + "racista", + "motherfucker", + "Motherfucking", + "scrote", + "scum", + "scum!", + "shít", + "sh!t", + "sh!te", + "sh!tes", + "sh1't", + "sh1t", + "sh1te", + "sh1thead", + "sh1theads", + "shhit", + "shit", + "shited", + "shitface", + "shitfaced", + "shitforbrains", + "shitfuck", + "shitfucker", + "shitfull", + "shithapens", + "shithappens", + "shithead", + "shithole", + "shithouse", + "shiting", + "shitings", + "shitoutofluck", + "shits", + "shitspitter", + "shitstabber", + "shitstabbers", + "shitstain", + "shitted", + "shitter", + "shitters", + "shittiest", + "shitting", + "shittings", + "shitty", + "shiz", + "slanteye", + "slut", + "slutbag", + "sluts", + "slutt", + "slutting", + "slutwear", + "slutwhore", + "xjp", + "vpn", + "sock", + "v2ray", + "v2fly", + "proxy", + "jinping", + "china", + "taiwan", + "hong kong", + "mzd", + "porn", + "sexy", + "party", + "gay", + "64", + "vx", + "wechat", + "weixin", + "qq", + "tencent", + "lantern", + "Porn", + "Adult", + "XXX", + "Explicit", + "Hardcore", + "Nude", + "Sex", + "Erotic", + "Fetish", + "Uncensored", + "BDSM", + "Swinger", + "Violence", + "Blood", + "Gore", + "Brutal", + "War", + "Weapon", + "Kill", + "Murder", + "Assault", + "Torture", + "Terrorist", + "Suicide", + "Riot", + "Attack", + "Gun", + "Knife", + "Politics", + "Politician", + "Election", + "Government", + "Policy", + "President", + "Prime Minister", + "Congress", + "Parliament", + "Democracy", + "Dictatorship", + "Revolution", + "Anarchy", + "Communist", + "Fascist", + "Socialist", + "Liberal", + "Conservative", + "Republican", + "Democrat", + "Racism", + "Sexism", + "Homophobia", + "Xenophobia", + "Islamophobia", + "Anti-Semitic", + "Discrimination", + "Prejudice", + "Bigotry", + "Drug", + "Cocaine", + "Marijuana", + "Methamphetamine", + "Heroin", + "LSD", + "MDMA", + "Firearms", + "Trafficking", + "Smuggling", + "Fraud", + "Forgery", + "Counterfeit", + "Piracy", + "Hacking", + "Cybercrime", + "Profanity", + "Vulgarity", + "Obscenity", + "Insult", + "Slur", + "Curse", + "Swear", + "Abortion", + "Suicide", + "Self-harm", + "Eating disorder", + "Mental illness", + "Cancer", + "HIV/AIDS", + "Rape", + "Domestic violence", + "Child abuse", + "Holocaust", + "Genocide", + "Religion", + "God", + "Allah", + "Jesus", + "Bible", + "Quran", + "Church", + "Mosque", + "Synagogue", + "Buddhism", + "Hinduism", + "Judaism", + "Christianity", + "Islam", + "Atheism", + "Racial slurs", + "Ethnic slurs", + "Gender slurs", + "LGBTQ+ slurs", + "Ableist language", + "Ageist language", + "Sizeist language", + "Sexual harassment", + "Inappropriate touching", + "Sexual assault", + "Groping", + "Catcalling", + "Unwanted advances", + "Victim blaming", + "Terrorism", + "Terrorist group names", + "Jihad", + "Extremism", + "Radicalization", + "Suicide bombing", + "Hijacking", + "Hostage", + "Massacre", + "Death", + "Dead", + "Corpse", + "Funeral", + "Burial", + "Cremation", + "Mortuary", + "Grave", + "Eulogy", + "Mourning", + "Grief", + "Suicide note", + "Depression", + "Anxiety", + "PTSD", + "Bipolar disorder", + "Schizophrenia", + "OCD", + "Eating disorders", + "Self-harm", + "Therapy", + "Psychiatrist", + "Psychiatric hospital", + "Addiction", + "Alcoholism", + "Substance abuse", + "Drug overdose", + "Rehab", + "Relapse", + "Withdrawal", + "Narcotics Anonymous", + "Gambling addiction", + "Porn addiction", + "Shopping addiction", + "Slavery", + "Colonialism", + "Apartheid", + "Hiroshima", + "Nagasaki", + "Chernobyl", + "9/11", + "Holocaust denial", + "Armenian Genocide", + "Rwandan Genocide" +] diff --git a/src/assets/images/canvas/advertising-nft-1.webp b/src/assets/images/canvas/advertising-nft-1.webp new file mode 100644 index 000000000..19ea9445e Binary files /dev/null and b/src/assets/images/canvas/advertising-nft-1.webp differ diff --git a/src/assets/images/canvas/advertising-nft-2.png b/src/assets/images/canvas/advertising-nft-2.png new file mode 100644 index 000000000..ad23d8781 Binary files /dev/null and b/src/assets/images/canvas/advertising-nft-2.png differ diff --git a/src/assets/images/canvas/advertising-nft-2.webp b/src/assets/images/canvas/advertising-nft-2.webp new file mode 100644 index 000000000..5dd20e3cd Binary files /dev/null and b/src/assets/images/canvas/advertising-nft-2.webp differ diff --git a/src/assets/images/canvas/advertising-nft-3.webp b/src/assets/images/canvas/advertising-nft-3.webp new file mode 100644 index 000000000..40faa073a Binary files /dev/null and b/src/assets/images/canvas/advertising-nft-3.webp differ diff --git a/src/assets/images/canvas/grace-period.gif b/src/assets/images/canvas/grace-period.gif new file mode 100644 index 000000000..a79cd02ad Binary files /dev/null and b/src/assets/images/canvas/grace-period.gif differ diff --git a/src/assets/images/common/scrolly-sad.png b/src/assets/images/common/scrolly-sad.png new file mode 100644 index 000000000..faa8b6ff6 Binary files /dev/null and b/src/assets/images/common/scrolly-sad.png differ diff --git a/src/assets/images/home/feature-img-1.webp b/src/assets/images/home/feature-img-1.webp new file mode 100644 index 000000000..46cc9cef2 Binary files /dev/null and b/src/assets/images/home/feature-img-1.webp differ diff --git a/src/assets/images/home/feature-img-2.webp b/src/assets/images/home/feature-img-2.webp new file mode 100644 index 000000000..76ac5b287 Binary files /dev/null and b/src/assets/images/home/feature-img-2.webp differ diff --git a/src/assets/images/home/feature_icon_1.png b/src/assets/images/home/feature_icon_1.png deleted file mode 100644 index 0eb852bf7..000000000 Binary files a/src/assets/images/home/feature_icon_1.png and /dev/null differ diff --git a/src/assets/images/home/feature_icon_2.png b/src/assets/images/home/feature_icon_2.png deleted file mode 100644 index 1a6a7b647..000000000 Binary files a/src/assets/images/home/feature_icon_2.png and /dev/null differ diff --git a/src/assets/images/home/feature_icon_3.png b/src/assets/images/home/feature_icon_3.png deleted file mode 100644 index 971fb6df8..000000000 Binary files a/src/assets/images/home/feature_icon_3.png and /dev/null differ diff --git a/src/assets/images/home/feature_icon_4.png b/src/assets/images/home/feature_icon_4.png deleted file mode 100644 index 5cdfded8b..000000000 Binary files a/src/assets/images/home/feature_icon_4.png and /dev/null differ diff --git a/src/assets/images/home/partner_logo_10.svg b/src/assets/images/home/partner_logo_10.svg index 73a58936d..e7495351e 100644 --- a/src/assets/images/home/partner_logo_10.svg +++ b/src/assets/images/home/partner_logo_10.svg @@ -1,6 +1,9 @@ - - - - - + + + + + + + + diff --git a/src/assets/images/home/partner_logo_12.svg b/src/assets/images/home/partner_logo_12.svg index 495f52daf..ea0425f5e 100644 --- a/src/assets/images/home/partner_logo_12.svg +++ b/src/assets/images/home/partner_logo_12.svg @@ -1,17 +1,9 @@ - - - - - - - - - - - + + - - - + + + + diff --git a/src/assets/images/home/partner_logo_13.svg b/src/assets/images/home/partner_logo_13.svg index 581a130bc..2fae64ad3 100644 --- a/src/assets/images/home/partner_logo_13.svg +++ b/src/assets/images/home/partner_logo_13.svg @@ -1,27 +1,9 @@ - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + diff --git a/src/assets/images/home/partner_logo_15.svg b/src/assets/images/home/partner_logo_15.svg index 718ef13dd..cb5f69b83 100644 --- a/src/assets/images/home/partner_logo_15.svg +++ b/src/assets/images/home/partner_logo_15.svg @@ -1,10 +1,10 @@ - - - + + + - + diff --git a/src/assets/images/home/partner_logo_16.svg b/src/assets/images/home/partner_logo_16.svg index ce3648416..77951c16d 100644 --- a/src/assets/images/home/partner_logo_16.svg +++ b/src/assets/images/home/partner_logo_16.svg @@ -1,8 +1,8 @@ - + - + diff --git a/src/assets/images/home/partner_logo_18.svg b/src/assets/images/home/partner_logo_18.svg new file mode 100644 index 000000000..7c21268eb --- /dev/null +++ b/src/assets/images/home/partner_logo_18.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/images/home/partner_logo_7.svg b/src/assets/images/home/partner_logo_7.svg index 0bab4cb16..9e6a579d5 100644 --- a/src/assets/images/home/partner_logo_7.svg +++ b/src/assets/images/home/partner_logo_7.svg @@ -1,9 +1,9 @@ - + - - + + - + diff --git a/src/assets/images/home/partner_logo_8.svg b/src/assets/images/home/partner_logo_8.svg index e275b7bef..ddc926eb6 100644 --- a/src/assets/images/home/partner_logo_8.svg +++ b/src/assets/images/home/partner_logo_8.svg @@ -1,14 +1,9 @@ - - - - - - - - + + - - - + + + + diff --git a/src/assets/images/skelly/Scrolly_Coding.png b/src/assets/images/skelly/Scrolly_Coding.png new file mode 100644 index 000000000..7fe870c81 Binary files /dev/null and b/src/assets/images/skelly/Scrolly_Coding.png differ diff --git a/src/assets/images/skelly/Scrolly_Hi_c.png b/src/assets/images/skelly/Scrolly_Hi_c.png new file mode 100644 index 000000000..315700b1f Binary files /dev/null and b/src/assets/images/skelly/Scrolly_Hi_c.png differ diff --git a/src/assets/images/skelly/Scrolly_Wen.png b/src/assets/images/skelly/Scrolly_Wen.png new file mode 100644 index 000000000..121eaae56 Binary files /dev/null and b/src/assets/images/skelly/Scrolly_Wen.png differ diff --git a/src/assets/images/skelly/scroll.mp4 b/src/assets/images/skelly/scroll.mp4 new file mode 100644 index 000000000..2470557c0 Binary files /dev/null and b/src/assets/images/skelly/scroll.mp4 differ diff --git a/src/assets/svgs/bridge/edit.svg b/src/assets/svgs/bridge/edit.svg new file mode 100644 index 000000000..762c8e7d4 --- /dev/null +++ b/src/assets/svgs/bridge/edit.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/bridge/external-link.svg b/src/assets/svgs/bridge/external-link.svg deleted file mode 100644 index 24c874b42..000000000 --- a/src/assets/svgs/bridge/external-link.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/assets/svgs/bridge/remove.svg b/src/assets/svgs/bridge/remove.svg new file mode 100644 index 000000000..c6bdb4601 --- /dev/null +++ b/src/assets/svgs/bridge/remove.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/arrow-down.svg b/src/assets/svgs/canvas-badge/arrow-down.svg new file mode 100644 index 000000000..47c8e72dd --- /dev/null +++ b/src/assets/svgs/canvas-badge/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/engagement.svg b/src/assets/svgs/canvas-badge/engagement.svg new file mode 100644 index 000000000..0b6b0fb3a --- /dev/null +++ b/src/assets/svgs/canvas-badge/engagement.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/external-link.svg b/src/assets/svgs/canvas-badge/external-link.svg new file mode 100644 index 000000000..43e0c83f4 --- /dev/null +++ b/src/assets/svgs/canvas-badge/external-link.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/find.svg b/src/assets/svgs/canvas-badge/find.svg new file mode 100644 index 000000000..25e2e6d6b --- /dev/null +++ b/src/assets/svgs/canvas-badge/find.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/issue.svg b/src/assets/svgs/canvas-badge/issue.svg new file mode 100644 index 000000000..c3bd27f2d --- /dev/null +++ b/src/assets/svgs/canvas-badge/issue.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/passport-logo.svg b/src/assets/svgs/canvas-badge/passport-logo.svg new file mode 100644 index 000000000..ef1a41ab4 --- /dev/null +++ b/src/assets/svgs/canvas-badge/passport-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas-badge/rock.svg b/src/assets/svgs/canvas-badge/rock.svg new file mode 100644 index 000000000..fb17019d9 --- /dev/null +++ b/src/assets/svgs/canvas-badge/rock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/canvas-badge/special.svg b/src/assets/svgs/canvas-badge/special.svg new file mode 100644 index 000000000..11ae2af21 --- /dev/null +++ b/src/assets/svgs/canvas-badge/special.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-blur-1.svg b/src/assets/svgs/canvas-badge/star-blur-1.svg new file mode 100644 index 000000000..a10eb9abb --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-blur-1.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas-badge/star-blur-2.svg b/src/assets/svgs/canvas-badge/star-blur-2.svg new file mode 100644 index 000000000..219578b55 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-blur-2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/svgs/canvas-badge/star-circle-1.svg b/src/assets/svgs/canvas-badge/star-circle-1.svg new file mode 100644 index 000000000..7598d196b --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-10.svg b/src/assets/svgs/canvas-badge/star-circle-10.svg new file mode 100644 index 000000000..dfe3dfae1 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-10.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-2.svg b/src/assets/svgs/canvas-badge/star-circle-2.svg new file mode 100644 index 000000000..60ec145ab --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-3.svg b/src/assets/svgs/canvas-badge/star-circle-3.svg new file mode 100644 index 000000000..fee3b988e --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-3.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-4.svg b/src/assets/svgs/canvas-badge/star-circle-4.svg new file mode 100644 index 000000000..adec24240 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-4.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-5.svg b/src/assets/svgs/canvas-badge/star-circle-5.svg new file mode 100644 index 000000000..755de69c3 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-5.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-6.svg b/src/assets/svgs/canvas-badge/star-circle-6.svg new file mode 100644 index 000000000..177e4460a --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-6.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-7.svg b/src/assets/svgs/canvas-badge/star-circle-7.svg new file mode 100644 index 000000000..177e4460a --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-7.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-8.svg b/src/assets/svgs/canvas-badge/star-circle-8.svg new file mode 100644 index 000000000..d0e3133c8 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-8.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-circle-9.svg b/src/assets/svgs/canvas-badge/star-circle-9.svg new file mode 100644 index 000000000..cd87949b3 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-circle-9.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-diamond-1.svg b/src/assets/svgs/canvas-badge/star-diamond-1.svg new file mode 100644 index 000000000..615c11d0a --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-diamond-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/star-diamond-2.svg b/src/assets/svgs/canvas-badge/star-diamond-2.svg new file mode 100644 index 000000000..30ab6c8f4 --- /dev/null +++ b/src/assets/svgs/canvas-badge/star-diamond-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/total-minted.svg b/src/assets/svgs/canvas-badge/total-minted.svg new file mode 100644 index 000000000..02e46f70e --- /dev/null +++ b/src/assets/svgs/canvas-badge/total-minted.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-badge/treasure.svg b/src/assets/svgs/canvas-badge/treasure.svg new file mode 100644 index 000000000..6759b82ff --- /dev/null +++ b/src/assets/svgs/canvas-badge/treasure.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-perks/arrow.svg b/src/assets/svgs/canvas-perks/arrow.svg new file mode 100644 index 000000000..dc2e2f9b7 --- /dev/null +++ b/src/assets/svgs/canvas-perks/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas-perks/badge-ethereum-year.svg b/src/assets/svgs/canvas-perks/badge-ethereum-year.svg new file mode 100644 index 000000000..c37a1ecf8 --- /dev/null +++ b/src/assets/svgs/canvas-perks/badge-ethereum-year.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/svgs/canvas-perks/badge-placeholder.svg b/src/assets/svgs/canvas-perks/badge-placeholder.svg new file mode 100644 index 000000000..fe7960c23 --- /dev/null +++ b/src/assets/svgs/canvas-perks/badge-placeholder.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas-perks/congrat-bg-mobile.svg b/src/assets/svgs/canvas-perks/congrat-bg-mobile.svg new file mode 100644 index 000000000..64ac6dba4 --- /dev/null +++ b/src/assets/svgs/canvas-perks/congrat-bg-mobile.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas-perks/congrat-bg.svg b/src/assets/svgs/canvas-perks/congrat-bg.svg new file mode 100644 index 000000000..ad9b7e8f5 --- /dev/null +++ b/src/assets/svgs/canvas-perks/congrat-bg.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas-perks/external.svg b/src/assets/svgs/canvas-perks/external.svg new file mode 100644 index 000000000..b4cbbd0b2 --- /dev/null +++ b/src/assets/svgs/canvas-perks/external.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/arrow-left.svg b/src/assets/svgs/canvas/arrow-left.svg new file mode 100644 index 000000000..c45a5a35a --- /dev/null +++ b/src/assets/svgs/canvas/arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/arrow-right.svg b/src/assets/svgs/canvas/arrow-right.svg new file mode 100644 index 000000000..9a32483b4 --- /dev/null +++ b/src/assets/svgs/canvas/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/back.svg b/src/assets/svgs/canvas/back.svg new file mode 100644 index 000000000..4d862e026 --- /dev/null +++ b/src/assets/svgs/canvas/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/badges.svg b/src/assets/svgs/canvas/badges.svg new file mode 100644 index 000000000..72f959f8c --- /dev/null +++ b/src/assets/svgs/canvas/badges.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgs/canvas/check.svg b/src/assets/svgs/canvas/check.svg new file mode 100644 index 000000000..dd426d38e --- /dev/null +++ b/src/assets/svgs/canvas/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/circle-warning.svg b/src/assets/svgs/canvas/circle-warning.svg new file mode 100644 index 000000000..49e5df1fc --- /dev/null +++ b/src/assets/svgs/canvas/circle-warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/canvas/close.svg b/src/assets/svgs/canvas/close.svg new file mode 100644 index 000000000..5b72f94ed --- /dev/null +++ b/src/assets/svgs/canvas/close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/canvas/connect-sticker.svg b/src/assets/svgs/canvas/connect-sticker.svg new file mode 100644 index 000000000..d68104255 --- /dev/null +++ b/src/assets/svgs/canvas/connect-sticker.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas/copy-success.svg b/src/assets/svgs/canvas/copy-success.svg new file mode 100644 index 000000000..b4d941df1 --- /dev/null +++ b/src/assets/svgs/canvas/copy-success.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/copy.svg b/src/assets/svgs/canvas/copy.svg new file mode 100644 index 000000000..3ca141d37 --- /dev/null +++ b/src/assets/svgs/canvas/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/coupon-mobile.svg b/src/assets/svgs/canvas/coupon-mobile.svg new file mode 100644 index 000000000..348b50a83 --- /dev/null +++ b/src/assets/svgs/canvas/coupon-mobile.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/canvas/coupon.svg b/src/assets/svgs/canvas/coupon.svg new file mode 100644 index 000000000..9e3449a64 --- /dev/null +++ b/src/assets/svgs/canvas/coupon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/canvas/default-badge.svg b/src/assets/svgs/canvas/default-badge.svg new file mode 100644 index 000000000..f546dae14 --- /dev/null +++ b/src/assets/svgs/canvas/default-badge.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/svgs/canvas/edit-profile.svg b/src/assets/svgs/canvas/edit-profile.svg new file mode 100644 index 000000000..5c4e0ebd5 --- /dev/null +++ b/src/assets/svgs/canvas/edit-profile.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/canvas/edit.svg b/src/assets/svgs/canvas/edit.svg new file mode 100644 index 000000000..14c87a753 --- /dev/null +++ b/src/assets/svgs/canvas/edit.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/canvas/empty.svg b/src/assets/svgs/canvas/empty.svg new file mode 100644 index 000000000..d7ec1e5aa --- /dev/null +++ b/src/assets/svgs/canvas/empty.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/svgs/canvas/error.svg b/src/assets/svgs/canvas/error.svg new file mode 100644 index 000000000..5a4e1460a --- /dev/null +++ b/src/assets/svgs/canvas/error.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/canvas/eth.svg b/src/assets/svgs/canvas/eth.svg new file mode 100644 index 000000000..138a182e9 --- /dev/null +++ b/src/assets/svgs/canvas/eth.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/canvas/gift.svg b/src/assets/svgs/canvas/gift.svg new file mode 100644 index 000000000..8b00c60a7 --- /dev/null +++ b/src/assets/svgs/canvas/gift.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/info.svg b/src/assets/svgs/canvas/info.svg new file mode 100644 index 000000000..0604c5bcf --- /dev/null +++ b/src/assets/svgs/canvas/info.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/insufficient.svg b/src/assets/svgs/canvas/insufficient.svg new file mode 100644 index 000000000..019837cb0 --- /dev/null +++ b/src/assets/svgs/canvas/insufficient.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas/landing.svg b/src/assets/svgs/canvas/landing.svg new file mode 100644 index 000000000..25dcb1a79 --- /dev/null +++ b/src/assets/svgs/canvas/landing.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas/loading.svg b/src/assets/svgs/canvas/loading.svg new file mode 100644 index 000000000..1e0e1f5e2 --- /dev/null +++ b/src/assets/svgs/canvas/loading.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/src/assets/svgs/canvas/lock.svg b/src/assets/svgs/canvas/lock.svg new file mode 100644 index 000000000..bdc61b1d7 --- /dev/null +++ b/src/assets/svgs/canvas/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/logo.svg b/src/assets/svgs/canvas/logo.svg new file mode 100644 index 000000000..906d9eaa6 --- /dev/null +++ b/src/assets/svgs/canvas/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/canvas/secret-badge.svg b/src/assets/svgs/canvas/secret-badge.svg new file mode 100644 index 000000000..dab9ccaa6 --- /dev/null +++ b/src/assets/svgs/canvas/secret-badge.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/svgs/canvas/share.svg b/src/assets/svgs/canvas/share.svg new file mode 100644 index 000000000..8d7bfb373 --- /dev/null +++ b/src/assets/svgs/canvas/share.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/sticker.svg b/src/assets/svgs/canvas/sticker.svg new file mode 100644 index 000000000..be46fc898 --- /dev/null +++ b/src/assets/svgs/canvas/sticker.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/svgs/canvas/tooltip.svg b/src/assets/svgs/canvas/tooltip.svg new file mode 100644 index 000000000..8439a4171 --- /dev/null +++ b/src/assets/svgs/canvas/tooltip.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/canvas/triangle.svg b/src/assets/svgs/canvas/triangle.svg new file mode 100644 index 000000000..565a3d3fd --- /dev/null +++ b/src/assets/svgs/canvas/triangle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/canvas/warning.svg b/src/assets/svgs/canvas/warning.svg new file mode 100644 index 000000000..f2e15c514 --- /dev/null +++ b/src/assets/svgs/canvas/warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/canvas/zoom-in.svg b/src/assets/svgs/canvas/zoom-in.svg new file mode 100644 index 000000000..d7dbcce26 --- /dev/null +++ b/src/assets/svgs/canvas/zoom-in.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/canvas/zoom-out.svg b/src/assets/svgs/canvas/zoom-out.svg new file mode 100644 index 000000000..ecad55eac --- /dev/null +++ b/src/assets/svgs/canvas/zoom-out.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/common/back.svg b/src/assets/svgs/common/back.svg new file mode 100644 index 000000000..312822add --- /dev/null +++ b/src/assets/svgs/common/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/common/external-link.svg b/src/assets/svgs/common/external-link.svg index 59a8d71cf..a4a1e4333 100644 --- a/src/assets/svgs/common/external-link.svg +++ b/src/assets/svgs/common/external-link.svg @@ -1,6 +1,6 @@ - + @@ -8,3 +8,5 @@ + + diff --git a/src/assets/svgs/common/global.svg b/src/assets/svgs/common/global.svg new file mode 100644 index 000000000..9d2a347fe --- /dev/null +++ b/src/assets/svgs/common/global.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/common/info.svg b/src/assets/svgs/common/info.svg new file mode 100644 index 000000000..687a0e159 --- /dev/null +++ b/src/assets/svgs/common/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/common/language-checked.svg b/src/assets/svgs/common/language-checked.svg new file mode 100644 index 000000000..d82c2dd61 --- /dev/null +++ b/src/assets/svgs/common/language-checked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/common/language-uncheck.svg b/src/assets/svgs/common/language-uncheck.svg new file mode 100644 index 000000000..ec03f64d8 --- /dev/null +++ b/src/assets/svgs/common/language-uncheck.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/common/triangle-down.svg b/src/assets/svgs/common/triangle-down.svg index 6b9f11b04..bae03b4a5 100644 --- a/src/assets/svgs/common/triangle-down.svg +++ b/src/assets/svgs/common/triangle-down.svg @@ -1,3 +1,3 @@ - + diff --git a/src/assets/svgs/community/arrow.svg b/src/assets/svgs/community/arrow.svg new file mode 100644 index 000000000..38972d46a --- /dev/null +++ b/src/assets/svgs/community/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/community/combination_mark.svg b/src/assets/svgs/community/combination_mark.svg new file mode 100644 index 000000000..05d7c4f73 --- /dev/null +++ b/src/assets/svgs/community/combination_mark.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/community/contribute.svg b/src/assets/svgs/community/contribute.svg new file mode 100644 index 000000000..5ab92e2b6 --- /dev/null +++ b/src/assets/svgs/community/contribute.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/community/discord.svg b/src/assets/svgs/community/discord.svg new file mode 100644 index 000000000..18c2cc8de --- /dev/null +++ b/src/assets/svgs/community/discord.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgs/community/forum.svg b/src/assets/svgs/community/forum.svg new file mode 100644 index 000000000..4e8909b32 --- /dev/null +++ b/src/assets/svgs/community/forum.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/community/region.svg b/src/assets/svgs/community/region.svg new file mode 100644 index 000000000..d95a6712e --- /dev/null +++ b/src/assets/svgs/community/region.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/community/scroll_generic.svg b/src/assets/svgs/community/scroll_generic.svg new file mode 100644 index 000000000..ce69a6eee --- /dev/null +++ b/src/assets/svgs/community/scroll_generic.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/svgs/community/time.svg b/src/assets/svgs/community/time.svg new file mode 100644 index 000000000..fd9027354 --- /dev/null +++ b/src/assets/svgs/community/time.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/ecosystem/note.svg b/src/assets/svgs/ecosystem/note.svg new file mode 100644 index 000000000..9f6db1d02 --- /dev/null +++ b/src/assets/svgs/ecosystem/note.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/svgs/ecosystem/search.svg b/src/assets/svgs/ecosystem/search.svg index 235d62843..7d621d46c 100644 --- a/src/assets/svgs/ecosystem/search.svg +++ b/src/assets/svgs/ecosystem/search.svg @@ -1,3 +1,3 @@ - + diff --git a/src/assets/svgs/header/Badge.svg b/src/assets/svgs/header/Badge.svg new file mode 100644 index 000000000..46f3a276e --- /dev/null +++ b/src/assets/svgs/header/Badge.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/header/Build.svg b/src/assets/svgs/header/Build.svg new file mode 100644 index 000000000..b3644297a --- /dev/null +++ b/src/assets/svgs/header/Build.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/CanvasAndBadges.svg b/src/assets/svgs/header/CanvasAndBadges.svg new file mode 100644 index 000000000..06790c623 --- /dev/null +++ b/src/assets/svgs/header/CanvasAndBadges.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/header/Community.svg b/src/assets/svgs/header/Community.svg new file mode 100644 index 000000000..627f6cfa8 --- /dev/null +++ b/src/assets/svgs/header/Community.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/Discord.svg b/src/assets/svgs/header/Discord.svg new file mode 100644 index 000000000..6e1b65111 --- /dev/null +++ b/src/assets/svgs/header/Discord.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgs/header/Doc.svg b/src/assets/svgs/header/Doc.svg new file mode 100644 index 000000000..778d146bd --- /dev/null +++ b/src/assets/svgs/header/Doc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/header/Eth.svg b/src/assets/svgs/header/Eth.svg new file mode 100644 index 000000000..1ffbf49a2 --- /dev/null +++ b/src/assets/svgs/header/Eth.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/header/External.svg b/src/assets/svgs/header/External.svg new file mode 100644 index 000000000..746791648 --- /dev/null +++ b/src/assets/svgs/header/External.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/Forum.svg b/src/assets/svgs/header/Forum.svg new file mode 100644 index 000000000..f9a8c9888 --- /dev/null +++ b/src/assets/svgs/header/Forum.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/header/Home.svg b/src/assets/svgs/header/Home.svg new file mode 100644 index 000000000..2adab7ecd --- /dev/null +++ b/src/assets/svgs/header/Home.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/Issues.svg b/src/assets/svgs/header/Issues.svg new file mode 100644 index 000000000..96c098e18 --- /dev/null +++ b/src/assets/svgs/header/Issues.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/header/LevelUp.svg b/src/assets/svgs/header/LevelUp.svg new file mode 100644 index 000000000..644f6252f --- /dev/null +++ b/src/assets/svgs/header/LevelUp.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/Projects.svg b/src/assets/svgs/header/Projects.svg new file mode 100644 index 000000000..a943a2a59 --- /dev/null +++ b/src/assets/svgs/header/Projects.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/SDK.svg b/src/assets/svgs/header/SDK.svg new file mode 100644 index 000000000..3e96a9ce1 --- /dev/null +++ b/src/assets/svgs/header/SDK.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/Sessions.svg b/src/assets/svgs/header/Sessions.svg new file mode 100644 index 000000000..3c12d80ea --- /dev/null +++ b/src/assets/svgs/header/Sessions.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/Status.svg b/src/assets/svgs/header/Status.svg new file mode 100644 index 000000000..0fe908415 --- /dev/null +++ b/src/assets/svgs/header/Status.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/landingpage/build.svg b/src/assets/svgs/landingpage/build.svg new file mode 100644 index 000000000..b4346a339 --- /dev/null +++ b/src/assets/svgs/landingpage/build.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/landingpage/build_cover.svg b/src/assets/svgs/landingpage/build_cover.svg new file mode 100644 index 000000000..6ba1bf536 --- /dev/null +++ b/src/assets/svgs/landingpage/build_cover.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/landingpage/change-rpc.svg b/src/assets/svgs/landingpage/change-rpc.svg new file mode 100644 index 000000000..de1b159fd --- /dev/null +++ b/src/assets/svgs/landingpage/change-rpc.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/landingpage/eth.svg b/src/assets/svgs/landingpage/eth.svg new file mode 100644 index 000000000..ec16b3efa --- /dev/null +++ b/src/assets/svgs/landingpage/eth.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/sessions/activities.svg b/src/assets/svgs/sessions/activities.svg new file mode 100644 index 000000000..1bd2877b1 --- /dev/null +++ b/src/assets/svgs/sessions/activities.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/svgs/sessions/assets.svg b/src/assets/svgs/sessions/assets.svg new file mode 100644 index 000000000..ffd0ef6e6 --- /dev/null +++ b/src/assets/svgs/sessions/assets.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/sessions/dex.svg b/src/assets/svgs/sessions/dex.svg new file mode 100644 index 000000000..91e766c03 --- /dev/null +++ b/src/assets/svgs/sessions/dex.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/sessions/downTriangle.svg b/src/assets/svgs/sessions/downTriangle.svg new file mode 100644 index 000000000..ae14f4e56 --- /dev/null +++ b/src/assets/svgs/sessions/downTriangle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/svgs/sessions/forum.svg b/src/assets/svgs/sessions/forum.svg new file mode 100644 index 000000000..d8e0a5a45 --- /dev/null +++ b/src/assets/svgs/sessions/forum.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/sessions/gas.svg b/src/assets/svgs/sessions/gas.svg new file mode 100644 index 000000000..ba2916fec --- /dev/null +++ b/src/assets/svgs/sessions/gas.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/sessions/learn.svg b/src/assets/svgs/sessions/learn.svg new file mode 100644 index 000000000..ac649a174 --- /dev/null +++ b/src/assets/svgs/sessions/learn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/svgs/sessions/lending.svg b/src/assets/svgs/sessions/lending.svg new file mode 100644 index 000000000..ad35c94f5 --- /dev/null +++ b/src/assets/svgs/sessions/lending.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/sessions/qa.svg b/src/assets/svgs/sessions/qa.svg new file mode 100644 index 000000000..5e8649825 --- /dev/null +++ b/src/assets/svgs/sessions/qa.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/svgs/sessions/support.svg b/src/assets/svgs/sessions/support.svg new file mode 100644 index 000000000..d96602c50 --- /dev/null +++ b/src/assets/svgs/sessions/support.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest-result/tada.svg b/src/assets/svgs/sticker-contest-result/tada.svg new file mode 100644 index 000000000..926673f60 --- /dev/null +++ b/src/assets/svgs/sticker-contest-result/tada.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/sticker-contest-result/top2-5.svg b/src/assets/svgs/sticker-contest-result/top2-5.svg new file mode 100644 index 000000000..d1f51564c --- /dev/null +++ b/src/assets/svgs/sticker-contest-result/top2-5.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest-result/winner.svg b/src/assets/svgs/sticker-contest-result/winner.svg new file mode 100644 index 000000000..aefbb833f --- /dev/null +++ b/src/assets/svgs/sticker-contest-result/winner.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest/calender.svg b/src/assets/svgs/sticker-contest/calender.svg new file mode 100644 index 000000000..c145f5412 --- /dev/null +++ b/src/assets/svgs/sticker-contest/calender.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest/character.svg b/src/assets/svgs/sticker-contest/character.svg new file mode 100644 index 000000000..1b282b74f --- /dev/null +++ b/src/assets/svgs/sticker-contest/character.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest/contest.svg b/src/assets/svgs/sticker-contest/contest.svg new file mode 100644 index 000000000..7e03206b2 --- /dev/null +++ b/src/assets/svgs/sticker-contest/contest.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest/finalists.svg b/src/assets/svgs/sticker-contest/finalists.svg new file mode 100644 index 000000000..fbe2acab4 --- /dev/null +++ b/src/assets/svgs/sticker-contest/finalists.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest/scroll.svg b/src/assets/svgs/sticker-contest/scroll.svg new file mode 100644 index 000000000..365c68c34 --- /dev/null +++ b/src/assets/svgs/sticker-contest/scroll.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/sticker-contest/star.svg b/src/assets/svgs/sticker-contest/star.svg new file mode 100644 index 000000000..bb22d1ea2 --- /dev/null +++ b/src/assets/svgs/sticker-contest/star.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/sticker-contest/sticker.svg b/src/assets/svgs/sticker-contest/sticker.svg new file mode 100644 index 000000000..bd91768e2 --- /dev/null +++ b/src/assets/svgs/sticker-contest/sticker.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/svgs/wallet-connector/profile.svg b/src/assets/svgs/wallet-connector/profile.svg new file mode 100644 index 000000000..c87b0f590 --- /dev/null +++ b/src/assets/svgs/wallet-connector/profile.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Animation/FadeIn.tsx b/src/components/Animation/FadeIn.tsx new file mode 100644 index 000000000..3958ba015 --- /dev/null +++ b/src/components/Animation/FadeIn.tsx @@ -0,0 +1,21 @@ +import { keyframes } from "@emotion/react" +import Reveal from "react-awesome-reveal" + +const fadeIn = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +` + +function FadeIn({ children, ...rest }) { + return ( + + {children} + + ) +} + +export default FadeIn diff --git a/src/components/Animation/index.tsx b/src/components/Animation/index.tsx index 0269b9f8a..78e74a495 100644 --- a/src/components/Animation/index.tsx +++ b/src/components/Animation/index.tsx @@ -1,5 +1,6 @@ +import FadeIn from "./FadeIn" import FadeInUp from "./FadeInUp" import SlideInLeft from "./SlideInLeft" import SlideInRight from "./SlideInRight" -export { FadeInUp, SlideInLeft, SlideInRight } +export { FadeInUp, SlideInLeft, SlideInRight, FadeIn } diff --git a/src/components/ArticleCard/index.tsx b/src/components/ArticleCard/index.tsx index d67a3579d..95191285f 100644 --- a/src/components/ArticleCard/index.tsx +++ b/src/components/ArticleCard/index.tsx @@ -69,7 +69,7 @@ const ArticleInfo = styled(Box)(({ theme }) => ({ const ArticlePoster = styled(WebpImage)(({ theme }) => ({ width: "100%", maxWidth: "51.7rem", - height: "auto", + height: "fit-content", borderRadius: "2.5rem", justifySelf: "flex-end", overflow: "hidden", diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index e9f7b42f7..b5601779e 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -2,14 +2,14 @@ import { motion, useCycle } from "framer-motion" import { useMemo } from "react" import { makeStyles } from "tss-react/mui" -import { ButtonBase, ButtonProps, CircularProgress, IconButton, SvgIcon } from "@mui/material" +import { Box, ButtonBase, ButtonProps, CircularProgress, IconButton, SvgIcon } from "@mui/material" import { ReactComponent as ArrowRightIcon } from "@/assets/svgs/common/arrow-right.svg" import useCheckViewport from "@/hooks/useCheckViewport" interface ScrollButtonProps extends ButtonProps { width?: string | number - color?: "primary" | "secondary" + color?: "primary" | "secondary" | "tertiary" gloomy?: boolean loading?: boolean disabled?: boolean @@ -27,6 +27,8 @@ const gColor = (color, theme) => { return theme.palette.primary.main case "secondary": return theme.palette.primary.contrastText + case "tertiary": + return "#ffffff" default: return theme.palette.text.primary } @@ -38,19 +40,23 @@ const cColor = (color, theme) => { return theme.palette.primary.contrastText case "secondary": return theme.palette.text.primary + case "tertiary": + return "#000000" default: return theme.palette.primary.contrastText } } +const ButtonContainer = motion(Box) + const useStyles = makeStyles()((theme, { width, color, disabled, loading, whiteButton }) => ({ wrapper: { position: "relative", - height: "5.4rem", + height: "4.8rem", overflow: "hidden", borderRadius: "1rem", backgroundColor: whiteButton ? "#ffffff" : "transparent", - width: width ?? "25rem", + width: width ?? "24rem", [theme.breakpoints.down("sm")]: { width: width ?? "18.5rem", height: "4.8rem", @@ -69,11 +75,11 @@ const useStyles = makeStyles()((theme, { width, color, disabled, loading, w pointerEvents: "none", }, button: { - fontSize: "2rem", + fontSize: "1.8rem", fontWeight: 600, height: "100%", width: "100%", - paddingLeft: "5.4rem", + paddingLeft: "4.8rem", borderWidth: 1, borderStyle: "solid", borderColor: gColor(color, theme), @@ -99,7 +105,7 @@ const useStyles = makeStyles()((theme, { width, color, disabled, loading, w color: cColor(color, theme), }, mask: { - width: "5.4rem", + width: "4.8rem", height: "100%", position: "absolute", backgroundColor: gColor(color, theme), @@ -116,7 +122,7 @@ const useStyles = makeStyles()((theme, { width, color, disabled, loading, w }, icon: { - width: "5.4rem", + width: "4.8rem", height: "100%", position: "absolute", zIndex: 1, @@ -129,7 +135,7 @@ const useStyles = makeStyles()((theme, { width, color, disabled, loading, w const maskDesktop = { normal: { - width: "5.4rem", + width: "4.8rem", }, expanding: { width: "100%", @@ -145,7 +151,7 @@ const maskMobile = { }, } const Button = (props: ScrollButtonProps) => { - const { width, sx, color, loading, disabled, gloomy, children, whiteButton, ...restProps } = props + const { id, className, width, sx, color, loading, disabled, gloomy, children, whiteButton, ...restProps } = props const { classes, cx } = useStyles({ color, width, disabled, loading, whiteButton }) const { isMobile } = useCheckViewport() @@ -164,8 +170,16 @@ const Button = (props: ScrollButtonProps) => { return ( // TODO: allow sx, allow size=small/medium // avoid setting both 'disabled' and 'loading' to true. - { > {children} {loading && } - + ) } diff --git a/src/components/FlipCard/index.tsx b/src/components/FlipCard/index.tsx new file mode 100644 index 000000000..99d77daa2 --- /dev/null +++ b/src/components/FlipCard/index.tsx @@ -0,0 +1,34 @@ +import { motion, useCycle } from "framer-motion" + +import { Box } from "@mui/material" + +const MotionBox = motion(Box) + +const FlipCard = props => { + const { sx, frontContent, backContent } = props + const [isFlipped, setIsFlipped] = useCycle(false, true) + return ( + + setIsFlipped()} + sx={{ + position: "relative", + width: "100%", + height: "100%", + transition: "transform 1s", + transformStyle: "preserve-3d", + transform: isFlipped ? "rotateY(180deg)" : "rotateY(0deg)", + }} + > + + {frontContent} + + + {backContent} + + + + ) +} + +export default FlipCard diff --git a/src/components/Header/SubmenuLink.tsx b/src/components/Header/SubmenuLink.tsx new file mode 100644 index 000000000..ea5c7c146 --- /dev/null +++ b/src/components/Header/SubmenuLink.tsx @@ -0,0 +1,122 @@ +import ReactGA from "react-ga4" +import { NavLink } from "react-router-dom" + +import { Box, Link, Stack, SvgIcon, Typography } from "@mui/material" +import { CSSObject, Theme, styled } from "@mui/system" + +import { ReactComponent as ExternalSvg } from "@/assets/svgs/header/External.svg" +import useCheckViewport from "@/hooks/useCheckViewport" + +const linkStyles = (theme: Theme, dark: boolean): CSSObject => ({ + fontSize: "1.8rem", + fontWeight: 400, + cursor: "pointer", + whiteSpace: "nowrap", + color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, + textDecoration: "none", + minWidth: "16rem", + "& p, & svg": { + lineHeight: "2.4rem", + cursor: "pointer", + color: "inherit", + }, + "&:hover": { + cursor: "pointer", + color: dark ? theme.palette.primary.contrastText : theme.palette.primary.main, + "& svg": { + opacity: 1, + left: "0.8rem", + color: theme.palette.primary.main, + }, + }, + "&.active": { + color: theme.palette.primary.main, + }, +}) + +interface StyledNavLinkProps { + dark?: boolean + to?: string +} + +interface StyledLinkProps { + dark?: boolean + href?: string +} + +const StyledNavLink = styled(NavLink, { + shouldForwardProp: prop => prop !== "dark", +})(({ theme, dark }) => linkStyles(theme, !!dark)) + +const StyledLink = styled(Link, { + shouldForwardProp: prop => prop !== "dark", +})(({ theme, dark }) => linkStyles(theme, !!dark)) + +const SubmenuLinkContent = ({ icon, label, text, isExternal }: { icon: any; label: string; text?: string; isExternal?: boolean }) => { + const { isDesktop } = useCheckViewport() + + const handleClick = () => { + ReactGA.event("click_menu", { + label: text || label, + device: isDesktop ? "desktop" : "mobile", + }) + } + + return ( + + {icon && } + + {text && {text}} + {label} + + {isExternal && ( + + )} + + ) +} + +const SubmenuLink = ({ + label, + text, + href, + isExternal, + icon, + dark, + reload, + onClick, +}: { + label: string + text?: string + href: string + isExternal?: boolean + icon?: any + dark?: boolean + reload?: boolean + onClick?: () => {} +}) => ( + <> + {isExternal ? ( + + + + ) : ( + + + + )} + +) + +export default SubmenuLink diff --git a/src/components/Header/announcement.tsx b/src/components/Header/announcement.tsx index 98d4bf294..623dbd564 100644 --- a/src/components/Header/announcement.tsx +++ b/src/components/Header/announcement.tsx @@ -4,11 +4,11 @@ import { useMatch } from "react-router-dom" import { Stack } from "@mui/material" import { styled } from "@mui/system" -import { isProduction, requireEnv } from "@/utils" +import { isMainnet } from "@/utils" const AnnouncementStack = styled(Stack, { shouldForwardProp: prop => prop !== "production" })(({ theme, production }) => ({ lineHeight: "2.6rem", - background: production ? "#62e6d4" : theme.palette.primary.main, + background: production ? "rgb(181, 245, 236)" : theme.palette.primary.main, textAlign: "center", color: production ? theme.palette.text.primary : theme.palette.primary.contrastText, fontSize: "1.6rem", @@ -21,42 +21,32 @@ const AnnouncementStack = styled(Stack, { shouldForwardProp: prop => prop ! })) const Announcement = () => { + const displayAnnouncement = false const isHome = useMatch("/") - const isPortal = useMatch("/portal") const announcementContent = useMemo(() => { - if (isProduction && (isHome || isPortal)) { + if (isMainnet && isHome) { return ( <> - Scroll {requireEnv("REACT_APP_SCROLL_ENVIRONMENT")} is now live. Try it! - - ) - } else if (!isProduction) { - return ( - <> - You are on the Scroll {requireEnv("REACT_APP_SCROLL_ENVIRONMENT")} Testnet website. Return to Mainnet + 🔥 Applications for the Level Up Grants Program are open until August 25. Apply now! ) } return null - }, [isProduction, isHome, isPortal]) + }, [isMainnet, isHome]) const rightHref = useMemo(() => { - if (isProduction && (isHome || isPortal)) { - return "/portal" - } else if (!isProduction) { - return "https://scroll.io/" + if (isMainnet && isHome) { + return "https://tally.so/r/mYdQP5" } return "" - }, [isProduction, isHome, isPortal]) - - return ( - announcementContent && ( - - {announcementContent} - - ) - ) + }, [isMainnet, isHome]) + + return displayAnnouncement && announcementContent ? ( + + {announcementContent} + + ) : null } export default Announcement diff --git a/src/components/Header/constants.ts b/src/components/Header/constants.ts index deb7b64d2..53b4b3d3b 100644 --- a/src/components/Header/constants.ts +++ b/src/components/Header/constants.ts @@ -1,4 +1,16 @@ -import { SCROLL_ORIGINS_NFT } from "@/constants" +import { ReactComponent as BuildSvg } from "@/assets/svgs/header/Build.svg" +import { ReactComponent as CanvasAndBadgesSvg } from "@/assets/svgs/header/CanvasAndBadges.svg" +import { ReactComponent as CommunitySvg } from "@/assets/svgs/header/Community.svg" +import { ReactComponent as DocsSvg } from "@/assets/svgs/header/Doc.svg" +import { ReactComponent as EthereumSvg } from "@/assets/svgs/header/Eth.svg" +import { ReactComponent as ForumSvg } from "@/assets/svgs/header/Forum.svg" +import { ReactComponent as HomeSvg } from "@/assets/svgs/header/Home.svg" +import { ReactComponent as IssuesSvg } from "@/assets/svgs/header/Issues.svg" +import { ReactComponent as LevelUpSvg } from "@/assets/svgs/header/LevelUp.svg" +import { ReactComponent as ProjectsSvg } from "@/assets/svgs/header/Projects.svg" +import { ReactComponent as SDKSvg } from "@/assets/svgs/header/SDK.svg" +import { ReactComponent as SessionsSvg } from "@/assets/svgs/header/Sessions.svg" +import { ReactComponent as StatusSvg } from "@/assets/svgs/header/Status.svg" import { isSepolia, requireEnv } from "@/utils" const sepoliaNavigations = [ @@ -81,54 +93,85 @@ const sepoliaNavigations = [ ] const mainnetNavigations = [ - { - label: "Our Story", - key: "story", - href: "/story", - }, { label: "Develop", key: "develop", children: [ { label: "", + type: "grid", children: [ { - label: "Mainnet", - key: "mainnet-resources", - rootKey: "develop", - href: "/portal", - }, - { - label: SCROLL_ORIGINS_NFT, - key: "developer-nft", - rootKey: "develop", - href: "/developer-nft", + label: "DEPLOY AN APP", + items: [ + { + text: "Mainnet Deployment", + label: "Let’s go live now!", + key: "mainnet-resources", + rootKey: "develop", + href: "/portal", + icon: EthereumSvg, + }, + { + label: "Try and test it out", + text: "Sepolia Testnet", + key: "sepolia-resources", + rootKey: "develop", + href: "https://sepolia.scroll.io/portal", + isExternal: true, + icon: BuildSvg, + }, + { + label: "Understand all the details to build", + text: "Docs", + key: "docs", + href: "https://docs.scroll.io/en/home/", + isExternal: true, + icon: DocsSvg, + }, + { + label: "Scroll network health indicator", + text: "Status", + key: "status", + href: "https://status.scroll.io/", + isExternal: true, + icon: StatusSvg, + }, + ], }, { - label: "Sepolia Testnet", - key: "sepolia-resources", - rootKey: "develop", - href: "https://sepolia.scroll.io/portal", - isExternal: true, + label: "DEPLOY A CHAIN", + items: [ + { + label: "Own your blockspace", + text: "Scroll SDK", + key: "sdk", + href: "https://docs.scroll.io/en/sdk", + isExternal: true, + icon: SDKSvg, + }, + ], }, { - label: "Docs", - key: "docs", - href: "https://docs.scroll.io/en/home/", - isExternal: true, - }, - { - label: "Status", - key: "status", - href: "https://status.scroll.io/", - isExternal: true, - }, - { - label: "Bug Bounty", - key: "bug-bounty", - href: "https://immunefi.com/bounty/scroll/", - isExternal: true, + label: "MORE", + items: [ + { + label: "Learn, build and innovate", + text: "Level Up", + key: "lelvel-up", + href: "https://levelupweb3.xyz", + isExternal: true, + icon: LevelUpSvg, + }, + { + label: "Help Scroll get better", + text: "Bug Bounty", + key: "bug-bounty", + href: "https://immunefi.com/bounty/scroll/", + isExternal: true, + icon: IssuesSvg, + }, + ], }, ], }, @@ -153,6 +196,18 @@ const mainnetNavigations = [ href: requireEnv("REACT_APP_EXTERNAL_EXPLORER_URI_DORA"), isExternal: true, }, + { + label: "OKX Explorer", + key: "okx", + href: requireEnv("REACT_APP_OKX_URI"), + isExternal: true, + }, + { + label: "Blockscout Explorer", + key: "blockscout", + href: requireEnv("REACT_APP_BLOCKSCOUT_URI"), + isExternal: true, + }, ], }, ], @@ -160,7 +215,84 @@ const mainnetNavigations = [ { label: "Ecosystem", key: "ecosystem", - href: "/ecosystem", + children: [ + { + children: [ + { + text: "Projects", + label: "Find interesting dApps on Scroll", + key: "projects", + rootKey: "ecosystem", + href: "/ecosystem", + icon: ProjectsSvg, + }, + { + text: "Canvas & Badges", + label: "Build your persona and collect badges", + key: "canvas-and-badges", + rootKey: "ecosystem", + href: "/canvas-and-badges", + icon: CanvasAndBadgesSvg, + }, + { + text: "Sessions", + label: "Receive Marks for your contributions", + key: "sessions", + rootKey: "ecosystem", + href: "/sessions", + icon: SessionsSvg, + reload: true, + }, + { + text: "Community", + label: "Explore events and global communities", + key: "community", + rootKey: "ecosystem", + href: "/community", + icon: CommunitySvg, + reload: true, + }, + ], + }, + ], + }, + { + label: "Governance", + key: "governance", + new: true, + children: [ + { + children: [ + { + text: "Home", + label: "Get to know Scroll governance", + key: "governance-home", + rootKey: "governance", + href: "https://gov.scroll.io", + icon: HomeSvg, + isExternal: true, + }, + { + text: "Documentations", + label: "Browse all the details about Scroll governance", + key: "governance-doc", + rootKey: "governance", + href: "https://gov.scroll.io/docs", + icon: DocsSvg, + isExternal: true, + }, + { + text: "Forum", + label: "Participate in all the governance discussions", + key: "governance-forum", + rootKey: "governance", + href: "https://gov.scroll.io/forum", + icon: ForumSvg, + isExternal: true, + }, + ], + }, + ], }, { label: "Resources", @@ -184,11 +316,18 @@ const mainnetNavigations = [ label: "Brand Kit", key: "brand kit", href: "/brand-kit", + rootKey: "resources", + }, + { + label: "Security", + key: "security", + href: "https://docs.scroll.io/en/technology/security/audits-and-bug-bounty/", + isExternal: true, }, { - label: "Forum", - key: "forum", - href: "https://community.scroll.io", + label: "Whitepaper", + key: "whitepaper.pdf", + href: "/files/whitepaper.pdf", isExternal: true, }, ], diff --git a/src/components/Header/desktop_header.tsx b/src/components/Header/desktop_header.tsx index ea260bc9a..78fa7a85f 100644 --- a/src/components/Header/desktop_header.tsx +++ b/src/components/Header/desktop_header.tsx @@ -1,4 +1,5 @@ import React, { useState } from "react" +import ReactGA from "react-ga4" import { NavLink } from "react-router-dom" import { useStyles } from "tss-react/mui" @@ -6,28 +7,41 @@ import { Box, Container, Fade, Link, Popper, Stack, SvgIcon, Typography } from " import { styled } from "@mui/system" import { ReactComponent as TriangleDownSvg } from "@/assets/svgs/common/header-triangle-down.svg" +import LanguageSelect from "@/components/LanguageSelect" import Logo from "@/components/ScrollLogo" import WalletToolkit from "@/components/WalletToolkit" import useCheckViewport from "@/hooks/useCheckViewport" +import useShowLanguageSelect from "@/hooks/useShowLanguageSelect" import useShowWalletConnector from "@/hooks/useShowWalletToolkit" +import SubmenuLink from "./SubmenuLink" import Announcement from "./announcement" import { navigations } from "./constants" -import useCheckNoBg from "./useCheckNoBg" +import useCheckCustomNavBarBg from "./useCheckCustomNavBarBg" import useCheckTheme from "./useCheckTheme" -const StyledBox = styled(Stack, { shouldForwardProp: prop => prop !== "dark" })(({ theme, transparent, dark }) => ({ +const StyledBox = styled(Stack, { shouldForwardProp: prop => prop !== "dark" && prop !== "bgColor" })(({ theme, bgColor, dark }) => ({ position: "sticky", top: 0, width: "100%", zIndex: 10, - backgroundColor: transparent ? "transparent" : dark ? theme.palette.themeBackground.dark : theme.palette.themeBackground.light, + backgroundColor: bgColor ? theme.palette.themeBackground[bgColor] : dark ? theme.palette.themeBackground.dark : theme.palette.themeBackground.light, })) -const StyledPopper = styled(Popper, { shouldForwardProp: prop => prop !== "dark" })(({ theme, transparent, dark }) => ({ - backgroundColor: transparent ? "transparent" : dark ? theme.palette.themeBackground.dark : theme.palette.themeBackground.light, - padding: "0 2rem 1rem", - marginLeft: "-2rem !important", +const StyledPopper = styled(Popper, { shouldForwardProp: prop => prop !== "dark" && prop !== "bgColor" })(({ theme, bgColor, dark }) => ({ + // backgroundColor: bgColor ? theme.palette.themeBackground[bgColor] : dark ? theme.palette.themeBackground.dark : theme.palette.themeBackground.light, + marginLeft: "-2.4rem !important", + zIndex: theme.zIndex.appBar, +})) + +const StyledFade = styled(Fade)(({ theme }) => ({ + padding: "2.4rem", + background: "#FFFFFF", + borderRadius: "1rem", + minWidth: "16.8rem", + transformOrigin: "top", + boxShadow: "0px 0px 10px 0px rgba(0, 0, 0, 0.10)", + marginTop: "-0.4rem", })) const HeaderContainer = styled(Box)(({ theme }) => ({ @@ -51,20 +65,6 @@ const MenuLinkButton = styled(Link, { shouldForwardProp: prop => prop !== " }, })) -const ExternalLink = styled("p", { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ - fontWeight: 400, - fontSize: "1.8rem", - height: "2.1rem", - lineHeight: "2.1rem", - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - display: "flex", - alignItems: "center", - width: "100%", - "&:hover": { - fontWeight: 500, - }, -})) - const LinkStyledButton = styled(NavLink, { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ fontSize: "1.8rem", fontWeight: 400, @@ -76,9 +76,11 @@ const LinkStyledButton = styled(NavLink, { shouldForwardProp: prop => prop whiteSpace: "nowrap", "&:hover": { fontWeight: 500, + color: theme.palette.primary.main, }, "&.active": { fontWeight: 600, + color: theme.palette.primary.main, }, })) @@ -93,6 +95,7 @@ const SubMenuButton = styled(Stack, { shouldForwardProp: prop => prop !== " color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, "&.active": { fontWeight: 600, + color: theme.palette.primary.main, }, "& .expand-more": { willChange: "transform", @@ -106,65 +109,33 @@ const SubMenuButton = styled(Stack, { shouldForwardProp: prop => prop !== " const SubMenuList = styled(Box)(({ theme }) => ({ display: "flex", - flexDirection: "column", + flexDirection: "row", overflow: "hidden", })) const SectionList = styled(Box, { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ display: "flex", flexDirection: "column", - width: "100%", - padding: "1.8rem 0", - "&:nth-of-type(1)": { - paddingTop: 0, - }, + flex: 1, + gap: "1.6rem", "&:nth-of-type(n+2)": { - borderTop: `1px solid ${dark ? theme.palette.primary.contrastText : theme.palette.text.primary}`, - }, - "&:nth-last-of-type(1)": { - paddingBottom: "0.8rem", - }, -})) - -const LinkButton = styled(Link, { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ - "& p": { - lineHeight: "2.9rem", - height: "2.9rem", - fontSize: "1.8rem", - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - fontWeight: 400, - cursor: "pointer", - "&:hover": { - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - }, - }, -})) - -const LinkStyledSubButton = styled(NavLink, { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ - lineHeight: "2.9rem", - height: "2.9rem", - fontSize: "1.8rem", - fontWeight: 400, - cursor: "pointer", - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - "&:hover": { - fontWeight: 500, - }, - "&.active": { - fontWeight: 600, + borderLeft: `1px solid ${theme.palette.text.primary}`, + paddingLeft: "2.4rem", + marginLeft: "2.4rem", }, })) const App = ({ currentMenu }) => { const { cx } = useStyles() - const noBg = useCheckNoBg() + const [isHover, setIsHover] = useState(false) + const navbarBg = useCheckCustomNavBarBg({ isHover }) const { isDesktop } = useCheckViewport() - const dark = useCheckTheme() const [checked, setChecked] = useState("") const showWalletConnector = useShowWalletConnector() + const showLanguageSelect = useShowLanguageSelect() const [anchorEl, setAnchorEl] = useState(null) @@ -178,34 +149,44 @@ const App = ({ currentMenu }) => { setAnchorEl(null) } + const handleResetIsHover = () => { + setIsHover(false) + } + const renderSubMenuList = children => { return children.map((section, idx) => ( - {section.label} - {section.children - // only show sub menu item when the href is set - ?.filter(subItem => subItem.href) - .map(subItem => - subItem.isExternal ? ( - - - - {subItem.label} - - - - - - - ) : ( - - {subItem.label} - - ), - )} + {section.label && ( + {section.label} + )} + {section.type === "grid" ? ( + + {section.children.map((item, index) => ( + + {item.label} + {item.items.map(item => ( + + ))} + + ))} + + ) : ( + <> + {section.children + // only show sub menu item when the href is set + ?.filter(subItem => subItem.href) + .map(subItem => ( + + ))} + + )} )) } @@ -216,25 +197,29 @@ const App = ({ currentMenu }) => { handleMouseEnter(e, item.key)} onMouseLeave={handleMouseLeave} > {item.label} + {item.new && ( + + NEW + + )} {item.key === checked && ( - + {({ TransitionProps }) => ( - + {renderSubMenuList(item.children)} - + )} )} @@ -248,7 +233,20 @@ const App = ({ currentMenu }) => { ) } else { return ( - + + ReactGA.event("click_menu", { + label: item.label, + device: "desktop", + }) + } + > {item.label} ) @@ -266,7 +264,16 @@ const App = ({ currentMenu }) => { } return ( - + { + setIsHover(true) + }} + onMouseLeave={e => { + setIsHover(false) + }} + > @@ -276,6 +283,7 @@ const App = ({ currentMenu }) => { {renderNavigationList()} {showWalletConnector && } + {showLanguageSelect && } diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index 9fb465dcf..6d2f22c0b 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -2,8 +2,8 @@ import React, { useEffect, useState } from "react" import { useLocation } from "react-router-dom" import { AppBar, Slide } from "@mui/material" +import { styled } from "@mui/material/styles" import useScrollTrigger from "@mui/material/useScrollTrigger" -import { styled } from "@mui/system" import useCheckViewport from "@/hooks/useCheckViewport" diff --git a/src/components/Header/mobile_header.tsx b/src/components/Header/mobile_header.tsx index ad5b394fd..f3353df3e 100644 --- a/src/components/Header/mobile_header.tsx +++ b/src/components/Header/mobile_header.tsx @@ -1,17 +1,21 @@ import React, { useEffect, useState } from "react" +import ReactGA from "react-ga4" import { NavLink } from "react-router-dom" import { ExpandMore } from "@mui/icons-material" -import { Box, Collapse, Link, List, ListItemButton, Stack, Typography } from "@mui/material" +import { Box, Collapse, List, ListItemButton, Stack, Typography } from "@mui/material" import { styled } from "@mui/system" +import LanguageSelect from "@/components/LanguageSelect" import WalletToolkit from "@/components/WalletToolkit" +import useShowLanguageSelect from "@/hooks/useShowLanguageSelect" import useShowWalletConnector from "@/hooks/useShowWalletToolkit" import Logo from "../ScrollLogo" +import SubmenuLink from "./SubmenuLink" import Announcement from "./announcement" import { navigations } from "./constants" -import useCheckNoBg from "./useCheckNoBg" +import useCheckCustomNavBarBg from "./useCheckCustomNavBarBg" import useCheckTheme from "./useCheckTheme" const NavStack = styled(Stack)(({ theme }) => ({ @@ -73,44 +77,14 @@ const MenuLinkStyledButton = styled(NavLink, { shouldForwardProp: prop => p color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, width: "100%", "&.active": { - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, + color: theme.palette.primary.main, }, })) -const SubListItem = styled(ListItemButton)(({ theme }) => ({ - height: "4rem", - lineHeight: "4rem", - margin: "0 !important", - display: "flex", - justifyContent: "space-between", - padding: "0 !important", -})) - -const LinkStyledButton = styled(NavLink, { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ - fontWeight: 500, - fontSize: "1.8rem", - height: "4rem", - lineHeight: "4rem", - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - width: "100%", - "&.active": { - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - fontWeight: 500, - }, -})) - -const ExternalLink = styled(Link, { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ - fontWeight: 500, - fontSize: "1.8rem", - height: "4rem", - lineHeight: "4rem", - color: dark ? theme.palette.primary.contrastText : theme.palette.text.primary, - display: "flex", - alignItems: "center", - width: "100%", -})) - const SectionList = styled("div", { shouldForwardProp: prop => prop !== "dark" })(({ theme, dark }) => ({ + display: "flex", + flexDirection: "column", + gap: "1.6rem", "&:last-of-type": { paddingBottom: "2.5rem", }, @@ -131,8 +105,9 @@ const ExpandMoreIcon = styled(ExpandMore)(({ theme }) => ({ })) const App = ({ currentMenu }) => { - const noBg = useCheckNoBg() + const navbarBg = useCheckCustomNavBarBg() const showWalletConnector = useShowWalletConnector() + const showLanguageSelect = useShowLanguageSelect() const dark = useCheckTheme() const [open, setOpen] = useState(false) @@ -173,11 +148,37 @@ const App = ({ currentMenu }) => { sx={{ py: "1rem" }} onClick={() => toggleCollapse(item.key)} > - {item.label} + + {item.label} + {item.new && ( + + NEW + + )} + + ) : ( toggleDrawer(false)}> - + + ReactGA.event("click_menu", { + label: item.label, + device: "mobile", + }) + } + > {item.label} @@ -186,39 +187,38 @@ const App = ({ currentMenu }) => { {item.children?.map((section, idx) => ( - - {section.label} - {section.children - // only show sub items with href - ?.filter(subItem => subItem.href) - .map(subItem => - subItem.isExternal ? ( - toggleDrawer(false)} sx={{ mx: 4 }} key={subItem.key + idx}> - - {subItem.label} - - - - - - ) : ( - toggleDrawer(false)} sx={{ mx: 4 }} key={subItem.key}> - - {subItem.label} - - - ), - )} + toggleDrawer(false)} key={idx} dark={dark}> + {section.label && ( + + {section.label} + + )} + {section.type === "grid" ? ( + + {section.children.map((item, index) => ( + + {/* + {item.label} + */} + {item.label} + {item.items.map(item => ( + + ))} + + ))} + + ) : ( + <> + {section.children + // only show sub items with href + ?.filter(subItem => subItem.href) + .map(subItem => ( + + ))} + + )} ))} @@ -231,7 +231,7 @@ const App = ({ currentMenu }) => { return ( @@ -242,6 +242,8 @@ const App = ({ currentMenu }) => { {showWalletConnector && } + {showLanguageSelect && } + toggleDrawer(!open)} className={open ? "active" : ""}> @@ -253,7 +255,6 @@ const App = ({ currentMenu }) => { (dark ? theme.palette.themeBackground.dark : theme.palette.themeBackground.light), - paddingTop: "5rem", height: "calc(100vh - 6.2rem)", overflowY: "auto", }} diff --git a/src/components/Header/useCheckCustomNavBarBg.tsx b/src/components/Header/useCheckCustomNavBarBg.tsx new file mode 100644 index 000000000..83ad9e90e --- /dev/null +++ b/src/components/Header/useCheckCustomNavBarBg.tsx @@ -0,0 +1,31 @@ +import { useMemo } from "react" +import { useLocation } from "react-router-dom" + +import useScrollTrigger from "@mui/material/useScrollTrigger" + +const TRANSPARENT_BG_PAGE_LIST = ["/", "/ecosystem", "/story", "/sessions"] +// themeBackground +const CUSTOM_BG_PAGE_MAP = { + "/brand-kit": "brand", + "/join-us": "normal", + "/sticker-vote": "brand", + "/sticker-winners": "brand", +} + +const useCheckCustomNavBarBg = (props = { isHover: false }) => { + const { isHover } = props + const isScrolling = useScrollTrigger({ disableHysteresis: true, threshold: 10 }) + + const { pathname } = useLocation() + const isNoBgPage = useMemo(() => TRANSPARENT_BG_PAGE_LIST.includes(pathname), [pathname]) + + const navbarBg = useMemo(() => { + if (isNoBgPage) { + return isScrolling || isHover ? "" : "transparent" + } + return CUSTOM_BG_PAGE_MAP[pathname] || "" + }, [isNoBgPage, isScrolling, pathname, isHover]) + return navbarBg +} + +export default useCheckCustomNavBarBg diff --git a/src/components/Header/useCheckNoBg.tsx b/src/components/Header/useCheckNoBg.tsx deleted file mode 100644 index ffaafd099..000000000 --- a/src/components/Header/useCheckNoBg.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useEffect, useMemo, useState } from "react" -import { useLocation } from "react-router-dom" - -const useCheckNoBg = () => { - const { pathname } = useLocation() - const isNoBgPage = useMemo(() => ["/story", "/join-us", "/brand-kit"].includes(pathname), [pathname]) - const [isNoBgSection, setIsNoBgSection] = useState(isNoBgPage) - - useEffect(() => { - setIsNoBgSection(isNoBgPage) - if (isNoBgPage) { - const element = document.documentElement - const elementListener = window - const handleScroll = () => { - const scrollTop = element.scrollTop - setIsNoBgSection(scrollTop < 10) - } - elementListener.addEventListener("scroll", handleScroll) - return () => { - setIsNoBgSection(true) - elementListener.removeEventListener("scroll", handleScroll) - } - } - }, [isNoBgPage]) - return isNoBgPage && isNoBgSection ? "transparent" : "" -} - -export default useCheckNoBg diff --git a/src/components/Header/useCheckTheme.tsx b/src/components/Header/useCheckTheme.tsx index af4b5aa26..07ce3cb28 100644 --- a/src/components/Header/useCheckTheme.tsx +++ b/src/components/Header/useCheckTheme.tsx @@ -1,9 +1,13 @@ import { useMemo } from "react" -import { useLocation } from "react-router-dom" +import { useLocation, useMatch } from "react-router-dom" const useCheckTheme = () => { const { pathname } = useLocation() - const dark = useMemo(() => ["/developer-nft/check-eligibility", "/developer-nft/mint"].includes(pathname), [pathname]) + // TODO: + const isCanvas = useMatch("/canvas/*") + const dark = useMemo(() => { + return ["/developer-nft/check-eligibility", "/developer-nft/mint", "/canvas-and-badges"].includes(pathname) || isCanvas + }, [pathname]) return dark } diff --git a/src/components/LanguageSelect/index.tsx b/src/components/LanguageSelect/index.tsx new file mode 100644 index 000000000..b2460ed4b --- /dev/null +++ b/src/components/LanguageSelect/index.tsx @@ -0,0 +1,94 @@ +import { useMemo, useState } from "react" +import { makeStyles } from "tss-react/mui" + +import { ButtonBase, Fade, ListItemIcon, ListItemText, Menu, MenuItem, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as GlobalSvg } from "@/assets/svgs/common/global.svg" +import { ReactComponent as LanguageCheckedSvg } from "@/assets/svgs/common/language-checked.svg" +import { ReactComponent as LanguageUncheckSvg } from "@/assets/svgs/common/language-uncheck.svg" +import { BLOG_LANGUAGE_LIST } from "@/constants" +import useUserLanguage from "@/hooks/useUserLanguage" + +const useStyles = makeStyles()((theme, { dark }) => ({ + button: { + height: "3.6rem", + width: "10rem", + padding: "0 1.2rem", + border: dark ? `1px solid ${theme.palette.primary.contrastText}` : "none", + backgroundColor: dark ? "unset" : theme.palette.themeBackground.normal, + color: dark ? theme.palette.primary.contrastText : "#473835", + borderRadius: "0.5rem", + justifyContent: "flex-start", + }, + paper: { + marginTop: "0.5rem", + borderRadius: "0.5rem", + border: dark ? `1px solid ${theme.palette.primary.contrastText}` : "none", + backgroundColor: dark ? theme.palette.themeBackground.dark : theme.palette.themeBackground.normal, + }, + list: { + padding: 0, + }, + listItem: { + padding: "0.8rem 1.2rem", + gap: "0.8rem", + }, + listItemIcon: { + minWidth: "unset !important", + }, + listItemText: { + fontSize: "1.6rem", + fontFamily: "var(--developer-page-font-family)", + cursor: "pointer", + color: dark ? theme.palette.primary.contrastText : "#473835", + }, +})) + +const LanguageSelect = props => { + const { sx, dark } = props + const { classes } = useStyles({ dark }) + + const [anchorEl, setAnchorEl] = useState(null) + + const [language, setLanguage] = useUserLanguage() + + const currentLanguage = useMemo(() => { + return BLOG_LANGUAGE_LIST.find(item => item.key === language)?.label + }, [language]) + + const open = useMemo(() => Boolean(anchorEl), [anchorEl]) + + const handleClick = e => { + setAnchorEl(e.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + const handleChangeLanguage = key => { + setLanguage(key) + handleClose() + } + + return ( + <> + + + {currentLanguage} + + + {BLOG_LANGUAGE_LIST.map(({ label, key }) => ( + handleChangeLanguage(key)}> + + + + {label} + + ))} + + + ) +} + +export default LanguageSelect diff --git a/src/components/LoadingButton/index.tsx b/src/components/LoadingButton/index.tsx index a5f654367..907bae014 100644 --- a/src/components/LoadingButton/index.tsx +++ b/src/components/LoadingButton/index.tsx @@ -8,10 +8,13 @@ const useStyles = makeStyles()(theme => ({ color: theme.palette.primary.contrastText, width: "max-content", }, + loading: { + color: "transparent !important", + }, })) const ScrollLoadingButton = props => { - const { children, loadingText, ...restProps } = props + const { children, loadingText, sx, ...restProps } = props const { classes } = useStyles() const renderLoadingText = () => { @@ -26,7 +29,15 @@ const ScrollLoadingButton = props => { return ( {renderLoadingText()} diff --git a/src/components/LoadingPage/index.tsx b/src/components/LoadingPage/index.tsx index af7b73b57..a25e8bedd 100644 --- a/src/components/LoadingPage/index.tsx +++ b/src/components/LoadingPage/index.tsx @@ -1,10 +1,10 @@ import { Box, CircularProgress } from "@mui/material" const LoadingPage = props => { - const { height = "100vh", ...restProps } = props + const { height = "100vh", component, ...restProps } = props return ( - + {component ? component : } ) } diff --git a/src/components/Motion/OrientationToView.tsx b/src/components/Motion/OrientationToView.tsx index 45dfd433a..d8c31ab69 100644 --- a/src/components/Motion/OrientationToView.tsx +++ b/src/components/Motion/OrientationToView.tsx @@ -1,7 +1,11 @@ import { motion } from "framer-motion" +import { Box } from "@mui/material" + import useCheckViewport from "@/hooks/useCheckViewport" +const MotionBox = motion(Box) + const OrientationToView = props => { const { children, direction = "up", once = true, delay, ...restProps } = props @@ -49,16 +53,16 @@ const OrientationToView = props => { }, } return ( - {children} - + ) } diff --git a/src/components/Motion/SuccessionToView.tsx b/src/components/Motion/SuccessionToView.tsx index bca422bdc..9fb6e657f 100644 --- a/src/components/Motion/SuccessionToView.tsx +++ b/src/components/Motion/SuccessionToView.tsx @@ -1,7 +1,11 @@ import { motion } from "framer-motion" +import { Box } from "@mui/material" + import useCheckViewport from "@/hooks/useCheckViewport" +const AnimatedBox = motion(Box) + const SuccessionToView = props => { const { children, threshold, animate, once = true, ...restProps } = props const { isPortrait } = useCheckViewport() @@ -17,7 +21,7 @@ const SuccessionToView = props => { } return ( - { {...restProps} > {children} - + ) } @@ -47,9 +51,9 @@ const SuccessionItem = props => { } return ( - + {children} - + ) } diff --git a/src/components/RequestWarning/GlobalError.tsx b/src/components/RequestWarning/GlobalError.tsx new file mode 100644 index 000000000..ee3472119 --- /dev/null +++ b/src/components/RequestWarning/GlobalError.tsx @@ -0,0 +1,55 @@ +import { forwardRef } from "react" +import { makeStyles } from "tss-react/mui" + +import { Alert, SvgIcon } from "@mui/material" + +import { ReactComponent as ErrorSvg } from "@/assets/svgs/nft/alert-error.svg" + +const useStyles = makeStyles()(theme => ({ + alert: { + borderRadius: 5, + padding: "1.6rem", + [theme.breakpoints.down("sm")]: { + padding: "1.2rem 1.6rem", + }, + }, + defaultError: { + backgroundColor: "#FF684B", + color: "#FFEBD7", + }, + icon: { + marginRight: 8, + }, + message: { + lineHeight: 1.5, + fontWeight: 600, + }, +})) + +const GlobalWarning = forwardRef((props: any, ref) => { + const { severity = "error", message, children, style, ...restProps } = props + const { classes } = useStyles() + + return ( + , + }} + classes={{ + root: classes.alert, + icon: classes.icon, + defaultError: classes.defaultError, + message: classes.message, + }} + {...restProps} + > + {message} + + ) +}) + +export default GlobalWarning diff --git a/src/components/RequestWarning/GlobalSuccess.tsx b/src/components/RequestWarning/GlobalSuccess.tsx new file mode 100644 index 000000000..328438083 --- /dev/null +++ b/src/components/RequestWarning/GlobalSuccess.tsx @@ -0,0 +1,57 @@ +import { forwardRef } from "react" +import { makeStyles } from "tss-react/mui" + +import { Alert, SvgIcon } from "@mui/material" + +import { ReactComponent as SuccessSvg } from "@/assets/svgs/nft/alert-success.svg" + +const useStyles = makeStyles()(theme => ({ + alert: { + borderRadius: 5, + padding: "1.6rem", + [theme.breakpoints.down("sm")]: { + padding: "1.2rem 1.6rem", + }, + }, + + defaultSuccess: { + backgroundColor: "#DFFCF8", + color: "#0F8E7E", + }, + + icon: { + marginRight: 8, + }, + message: { + lineHeight: 1.5, + fontWeight: 600, + }, +})) + +const GlobalSuccess = forwardRef((props: any, ref) => { + const { severity = "success", message, children, style, ...restProps } = props + const { classes } = useStyles() + + return ( + , + }} + classes={{ + root: classes.alert, + icon: classes.icon, + defaultSuccess: classes.defaultSuccess, + message: classes.message, + }} + {...restProps} + > + {message} + + ) +}) + +export default GlobalSuccess diff --git a/src/components/ScrollExpandedBg/index.tsx b/src/components/ScrollExpandedBg/index.tsx index 794728ca0..df90ce84f 100644 --- a/src/components/ScrollExpandedBg/index.tsx +++ b/src/components/ScrollExpandedBg/index.tsx @@ -1,13 +1,17 @@ -import { useEffect, useState } from "react" +import { useEffect, useRef, useState } from "react" import { Box } from "@mui/material" import { styled } from "@mui/material/styles" -const Wrapper = styled(Box)(({ theme }) => ({ +const Wrapper = styled(Box, { shouldForwardProp: prop => prop !== "bgColor" })(({ theme, bgColor }) => ({ position: "relative", + backgroundColor: bgColor ? theme.palette.themeBackground[bgColor] : "transparent", + width: "100%", + overflow: "hidden", })) const Container = styled(Box)(({ theme }) => ({ + position: "relative", borderRadius: "40px 40px 0px 0px", paddingTop: "5.4rem", background: "transparent", @@ -24,12 +28,12 @@ const Background = styled(Box)(({ theme }) => ({ bottom: "0", width: "60%", minWidth: "152rem", - background: theme.palette.themeBackground.dark, + backgroundColor: theme.palette.themeBackground.dark, willChange: "width, height", borderRadius: "40px 40px 0px 0px", left: "50%", transform: "translateX(-50%)", - maxWidth: "100%", + // maxWidth: "100%", // in consideration of the main content width [theme.breakpoints.down("xl")]: { @@ -37,9 +41,11 @@ const Background = styled(Box)(({ theme }) => ({ }, })) const ScrollExpandedBg = props => { - const { anchorEl, children } = props + const { anchorEl, children, bottomColor, fastScrollIn, ...restProps } = props const [, setScrollPosition] = useState(0) + const bgRef = useRef(null) + useEffect(() => { const handleScroll = () => { setScrollPosition(window.scrollY) @@ -51,6 +57,7 @@ const ScrollExpandedBg = props => { window.removeEventListener("scroll", handleScroll) } }, []) + const calculateWidth = () => { if (anchorEl.current) { const rect = anchorEl.current.getBoundingClientRect() @@ -59,19 +66,29 @@ const ScrollExpandedBg = props => { if (rect.top <= viewTop) { const scrolledDistance = viewTop - rect.top const percentageScrolled = Math.min(scrolledDistance / viewTop, 1) + let ratio = 0.5 + if (fastScrollIn) { + if (window.innerWidth <= 1920 && window.innerWidth > 1680) { + ratio = 1 + } + if (window.innerWidth > 1920) { + ratio = 2 + } + } - const widthIncrease = 0.5 * percentageScrolled - const targetWidthPercentage = 60 + widthIncrease * 120 + const widthIncrease = ratio * percentageScrolled + const targetWidthPercentage = 40 + widthIncrease * 180 return `${targetWidthPercentage}%` } } - return "60%" //default value + return "40%" //default value } + return ( - - - {children} + + + {children} ) } diff --git a/src/components/Scrolly/index.tsx b/src/components/Scrolly/index.tsx new file mode 100644 index 000000000..2ae4399ac --- /dev/null +++ b/src/components/Scrolly/index.tsx @@ -0,0 +1,177 @@ +import React, { useEffect, useRef, useState } from "react" +import { usePrevious } from "react-use" + +import { Box, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as CloseSvg } from "@/assets/svgs/canvas/close.svg" +import TriangleSvg from "@/assets/svgs/canvas/triangle.svg" +import Button from "@/pages/canvas/components/Button" + +import SuperGif from "./libgif.js" + +const Container = styled(Box)(({ theme }) => ({ + position: "fixed", + bottom: "5rem", + right: "2.7rem", + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + zIndex: 100, + width: "30rem", + "& canvas": { + width: "12rem", + height: "12rem", + margin: "0 auto", + display: "block", + }, + [theme.breakpoints.down("sm")]: { + right: "2rem", + bottom: "2rem", + "& canvas": { + width: "6rem", + height: "6rem", + }, + }, +})) + +const Tooltip = styled(Box)(({ theme }) => ({ + padding: "1rem 1.4rem 1.4rem", + width: "100%", + position: "relative", + boxSizing: "border-box", + background: "#fff", + backgroundClip: "padding-box", + border: "solid 2px transparent", + borderRadius: "1rem", + marginBottom: "2rem", + display: "none", // Initially hide Tooltip + "&:before": { + content: '""', + position: "absolute", + top: 0, + right: 0, + bottom: 0, + left: 0, + zIndex: -1, + margin: "-2px", + borderRadius: "inherit", + //TODO: + background: "linear-gradient(70deg, #FAD880 0%, #FF684B 38%, #FAD880 75%, #90F7EB 100%)", + }, + "&:after": { + content: '""', + position: "absolute", + top: "100%", + left: "40%", + height: "2.2rem", + width: "3.4rem", + background: `url(${TriangleSvg})`, + backgroundSize: "cover", + zIndex: -1, + marginTop: "-0.6rem", + }, +})) + +const MintButton = styled(Button)(({ theme }) => ({ + borderRadius: "0.8rem", + fontSize: "1.6rem", + fontWeight: 600, + lineHeight: "2.4rem", + height: "4rem", +})) + +const Scrolly = props => { + const { + title, + buttonText, + onClick, // for scrolly action + visible, + canvasId = "canvasId", + canvasUrl = "/imgs/canvas/canvas.gif", + startFrame = 16, + targetFrame = 54, + onClosed, // callback after Scrolly closed + } = props + + const preVisible = usePrevious(visible) + const [open, setOpen] = useState(false) + const [tooltipVisible, setTooltipVisible] = useState(false) + const tooltipVisibleRef = useRef(false) + const [loading] = useState(false) + + useEffect(() => { + if (visible) { + setTimeout(() => { + setOpen(true) + setTimeout(() => { + playGif() + }, 4) + }, 1500) + } else if (preVisible && !visible) { + handleCloseTooltip() + } + }, [visible]) + + const playGif = () => { + const gif = document.getElementById(canvasId) + + if (!gif) return + var instance = SuperGif({ + gif, + progressbar_height: "0", + auto_play: false, + on_end: () => { + setOpen(false) + }, + }) + instance.load(() => { + instance.play() + setInterval(() => { + const get_current_frame = instance.get_current_frame() + if (get_current_frame === startFrame) { + setTooltipVisible(true) + tooltipVisibleRef.current = true + } else if (tooltipVisibleRef.current && get_current_frame >= targetFrame) { + instance.move_to(startFrame) + } + }, 100) + }) + } + + const handleCloseTooltip = () => { + setTooltipVisible(false) + tooltipVisibleRef.current = false + onClosed?.() + } + + const handleCloseClick = () => { + handleCloseTooltip() + } + + return ( + + {open && ( + <> + {tooltipVisible && ( + + + + + {title} + + {buttonText} + + + )} +
+ canvas +
+ + )} +
+ ) +} + +export default Scrolly diff --git a/src/components/Scrolly/libgif.js b/src/components/Scrolly/libgif.js new file mode 100644 index 000000000..7db4b550c --- /dev/null +++ b/src/components/Scrolly/libgif.js @@ -0,0 +1,995 @@ +/* + SuperGif + + Example usage: + + + + + + Image tag attributes: + + rel:animated_src - If this url is specified, it's loaded into the player instead of src. + This allows a preview frame to be shown until animated gif data is streamed into the canvas + + rel:auto_play - Defaults to 1 if not specified. If set to zero, a call to the play() method is needed + + Constructor options args + + gif Required. The DOM element of an img tag. + loop_mode Optional. Setting this to false will force disable looping of the gif. + auto_play Optional. Same as the rel:auto_play attribute above, this arg overrides the img tag info. + max_width Optional. Scale images over max_width down to max_width. Helpful with mobile. + on_end Optional. Add a callback for when the gif reaches the end of a single loop (one iteration). The first argument passed will be the gif HTMLElement. + loop_delay Optional. The amount of time to pause (in ms) after each single loop (iteration). + draw_while_loading Optional. Determines whether the gif will be drawn to the canvas whilst it is loaded. + show_progress_bar Optional. Only applies when draw_while_loading is set to true. + + Instance methods + + // loading + load( callback ) Loads the gif specified by the src or rel:animated_src sttributie of the img tag into a canvas element and then calls callback if one is passed + load_url( src, callback ) Loads the gif file specified in the src argument into a canvas element and then calls callback if one is passed + + // play controls + play - Start playing the gif + pause - Stop playing the gif + move_to(i) - Move to frame i of the gif + move_relative(i) - Move i frames ahead (or behind if i < 0) + + // getters + get_canvas The canvas element that the gif is playing in. Handy for assigning event handlers to. + get_playing Whether or not the gif is currently playing + get_loading Whether or not the gif has finished loading/parsing + get_auto_play Whether or not the gif is set to play automatically + get_length The number of frames in the gif + get_current_frame The index of the currently displayed frame of the gif + + For additional customization (viewport inside iframe) these params may be passed: + c_w, c_h - width and height of canvas + vp_t, vp_l, vp_ w, vp_h - top, left, width and height of the viewport + + A bonus: few articles to understand what is going on + http://enthusiasms.org/post/16976438906 + http://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + http://humpy77.deviantart.com/journal/Frame-Delay-Times-for-Animated-GIFs-214150546 + +*/ +/* eslint-disable */ +;(function (root, factory) { + if (typeof exports === "object") { + module.exports = factory() + } else { + root.SuperGif = factory() + } +})(this, function () { + // Generic functions + var bitsToNum = function (ba) { + return ba.reduce(function (s, n) { + return s * 2 + n + }, 0) + } + + var byteToBitArr = function (bite) { + var a = [] + for (var i = 7; i >= 0; i--) { + a.push(!!(bite & (1 << i))) + } + return a + } + + // Stream + /** + * @constructor + */ + // Make compiler happy. + var Stream = function (data) { + this.data = data + this.len = this.data.length + this.pos = 0 + + this.readByte = function () { + if (this.pos >= this.data.length) { + throw new Error("Attempted to read past end of stream.") + } + if (data instanceof Uint8Array) return data[this.pos++] + else return data.charCodeAt(this.pos++) & 0xff + } + + this.readBytes = function (n) { + var bytes = [] + for (var i = 0; i < n; i++) { + bytes.push(this.readByte()) + } + return bytes + } + + this.read = function (n) { + var s = "" + for (var i = 0; i < n; i++) { + s += String.fromCharCode(this.readByte()) + } + return s + } + + this.readUnsigned = function () { + // Little-endian. + var a = this.readBytes(2) + return (a[1] << 8) + a[0] + } + } + + var lzwDecode = function (minCodeSize, data) { + // TODO: Now that the GIF parser is a bit different, maybe this should get an array of bytes instead of a String? + var pos = 0 // Maybe this streaming thing should be merged with the Stream? + var readCode = function (size) { + var code = 0 + for (var i = 0; i < size; i++) { + if (data.charCodeAt(pos >> 3) & (1 << (pos & 7))) { + code |= 1 << i + } + pos++ + } + return code + } + + var output = [] + + var clearCode = 1 << minCodeSize + var eoiCode = clearCode + 1 + + var codeSize = minCodeSize + 1 + + var dict = [] + + var clear = function () { + dict = [] + codeSize = minCodeSize + 1 + for (var i = 0; i < clearCode; i++) { + dict[i] = [i] + } + dict[clearCode] = [] + dict[eoiCode] = null + } + + var code + var last + + while (true) { + last = code + code = readCode(codeSize) + + if (code === clearCode) { + clear() + continue + } + if (code === eoiCode) break + + if (code < dict.length) { + if (last !== clearCode) { + dict.push(dict[last].concat(dict[code][0])) + } + } else { + if (code !== dict.length) throw new Error("Invalid LZW code.") + dict.push(dict[last].concat(dict[last][0])) + } + output.push.apply(output, dict[code]) + + if (dict.length === 1 << codeSize && codeSize < 12) { + // If we're at the last code and codeSize is 12, the next code will be a clearCode, and it'll be 12 bits long. + codeSize++ + } + } + + // I don't know if this is technically an error, but some GIFs do it. + //if (Math.ceil(pos / 8) !== data.length) throw new Error('Extraneous LZW bytes.'); + return output + } + + // The actual parsing; returns an object with properties. + var parseGIF = function (st, handler) { + handler || (handler = {}) + + // LZW (GIF-specific) + var parseCT = function (entries) { + // Each entry is 3 bytes, for RGB. + var ct = [] + for (var i = 0; i < entries; i++) { + ct.push(st.readBytes(3)) + } + return ct + } + + var readSubBlocks = function () { + var size, data + data = "" + do { + size = st.readByte() + data += st.read(size) + } while (size !== 0) + return data + } + + var parseHeader = function () { + var hdr = {} + hdr.sig = st.read(3) + hdr.ver = st.read(3) + if (hdr.sig !== "GIF") throw new Error("Not a GIF file.") // XXX: This should probably be handled more nicely. + hdr.width = st.readUnsigned() + hdr.height = st.readUnsigned() + + var bits = byteToBitArr(st.readByte()) + hdr.gctFlag = bits.shift() + hdr.colorRes = bitsToNum(bits.splice(0, 3)) + hdr.sorted = bits.shift() + hdr.gctSize = bitsToNum(bits.splice(0, 3)) + + hdr.bgColor = st.readByte() + hdr.pixelAspectRatio = st.readByte() // if not 0, aspectRatio = (pixelAspectRatio + 15) / 64 + if (hdr.gctFlag) { + hdr.gct = parseCT(1 << (hdr.gctSize + 1)) + } + handler.hdr && handler.hdr(hdr) + } + + var parseExt = function (block) { + var parseGCExt = function (block) { + // eslint-disable-next-line no-unused-vars + var blockSize = st.readByte() // Always 4 + var bits = byteToBitArr(st.readByte()) + block.reserved = bits.splice(0, 3) // Reserved; should be 000. + block.disposalMethod = bitsToNum(bits.splice(0, 3)) + block.userInput = bits.shift() + block.transparencyGiven = bits.shift() + + block.delayTime = st.readUnsigned() + + block.transparencyIndex = st.readByte() + + block.terminator = st.readByte() + + handler.gce && handler.gce(block) + } + + var parseComExt = function (block) { + block.comment = readSubBlocks() + handler.com && handler.com(block) + } + + var parsePTExt = function (block) { + // No one *ever* uses this. If you use it, deal with parsing it yourself. + // eslint-disable-next-line no-unused-vars + var blockSize = st.readByte() // Always 12 + block.ptHeader = st.readBytes(12) + block.ptData = readSubBlocks() + handler.pte && handler.pte(block) + } + + var parseAppExt = function (block) { + var parseNetscapeExt = function (block) { + // eslint-disable-next-line no-unused-vars + var blockSize = st.readByte() // Always 3 + block.unknown = st.readByte() // ??? Always 1? What is this? + block.iterations = st.readUnsigned() + block.terminator = st.readByte() + handler.app && handler.app.NETSCAPE && handler.app.NETSCAPE(block) + } + + var parseUnknownAppExt = function (block) { + block.appData = readSubBlocks() + // FIXME: This won't work if a handler wants to match on any identifier. + handler.app && handler.app[block.identifier] && handler.app[block.identifier](block) + } + // eslint-disable-next-line no-unused-vars + var blockSize = st.readByte() // Always 11 + block.identifier = st.read(8) + block.authCode = st.read(3) + switch (block.identifier) { + case "NETSCAPE": + parseNetscapeExt(block) + break + default: + parseUnknownAppExt(block) + break + } + } + + var parseUnknownExt = function (block) { + block.data = readSubBlocks() + handler.unknown && handler.unknown(block) + } + + block.label = st.readByte() + switch (block.label) { + case 0xf9: + block.extType = "gce" + parseGCExt(block) + break + case 0xfe: + block.extType = "com" + parseComExt(block) + break + case 0x01: + block.extType = "pte" + parsePTExt(block) + break + case 0xff: + block.extType = "app" + parseAppExt(block) + break + default: + block.extType = "unknown" + parseUnknownExt(block) + break + } + } + + var parseImg = function (img) { + var deinterlace = function (pixels, width) { + // Of course this defeats the purpose of interlacing. And it's *probably* + // the least efficient way it's ever been implemented. But nevertheless... + var newPixels = new Array(pixels.length) + var rows = pixels.length / width + var cpRow = function (toRow, fromRow) { + var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width) + newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels)) + } + + // See appendix E. + var offsets = [0, 4, 2, 1] + var steps = [8, 8, 4, 2] + + var fromRow = 0 + for (var pass = 0; pass < 4; pass++) { + for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) { + cpRow(toRow, fromRow) + fromRow++ + } + } + + return newPixels + } + + img.leftPos = st.readUnsigned() + img.topPos = st.readUnsigned() + img.width = st.readUnsigned() + img.height = st.readUnsigned() + + var bits = byteToBitArr(st.readByte()) + img.lctFlag = bits.shift() + img.interlaced = bits.shift() + img.sorted = bits.shift() + img.reserved = bits.splice(0, 2) + img.lctSize = bitsToNum(bits.splice(0, 3)) + + if (img.lctFlag) { + img.lct = parseCT(1 << (img.lctSize + 1)) + } + + img.lzwMinCodeSize = st.readByte() + + var lzwData = readSubBlocks() + + img.pixels = lzwDecode(img.lzwMinCodeSize, lzwData) + + if (img.interlaced) { + // Move + img.pixels = deinterlace(img.pixels, img.width) + } + + handler.img && handler.img(img) + } + + var parseBlock = function () { + var block = {} + block.sentinel = st.readByte() + + switch ( + String.fromCharCode(block.sentinel) // For ease of matching + ) { + case "!": + block.type = "ext" + parseExt(block) + break + case ",": + block.type = "img" + parseImg(block) + break + case ";": + block.type = "eof" + handler.eof && handler.eof(block) + break + default: + throw new Error("Unknown block: 0x" + block.sentinel.toString(16)) // TODO: Pad this with a 0. + } + + if (block.type !== "eof") setTimeout(parseBlock, 0) + } + + var parse = function () { + parseHeader() + setTimeout(parseBlock, 0) + } + + parse() + } + + var SuperGif = function (opts) { + var options = { + //viewport position + vp_l: 0, + vp_t: 0, + vp_w: null, + vp_h: null, + //canvas sizes + c_w: null, + c_h: null, + } + for (var i in opts) { + options[i] = opts[i] + } + if (options.vp_w && options.vp_h) options.is_vp = true + + var stream + var hdr + + var loadError = null + var loading = false + + var transparency = null + var delay = null + var disposalMethod = null + var disposalRestoreFromIdx = null + var lastDisposalMethod = null + var frame = null + var lastImg = null + + var playing = true + var forward = true + + var ctx_scaled = false + + var frames = [] + var frameOffsets = [] // elements have .x and .y properties + + var gif = options.gif + // eslint-disable-next-line no-unused-vars + if (typeof options.auto_play === "undefined") options.auto_play = !gif.getAttribute("rel:auto_play") || gif.getAttribute("rel:auto_play") === "1" + + var onEndListener = options.hasOwnProperty("on_end") ? options.on_end : null + var loopDelay = options.hasOwnProperty("loop_delay") ? options.loop_delay : 0 + var overrideLoopMode = options.hasOwnProperty("loop_mode") ? options.loop_mode : "auto" + var drawWhileLoading = options.hasOwnProperty("draw_while_loading") ? options.draw_while_loading : true + var showProgressBar = drawWhileLoading ? (options.hasOwnProperty("show_progress_bar") ? options.show_progress_bar : true) : false + var progressBarHeight = options.hasOwnProperty("progressbar_height") ? options.progressbar_height : 25 + var progressBarBackgroundColor = options.hasOwnProperty("progressbar_background_color") + ? options.progressbar_background_color + : "rgba(255,255,255,0.4)" + var progressBarForegroundColor = options.hasOwnProperty("progressbar_foreground_color") + ? options.progressbar_foreground_color + : "rgba(255,0,22,.8)" + + var clear = function () { + transparency = null + delay = null + lastDisposalMethod = disposalMethod + disposalMethod = null + frame = null + } + + // XXX: There's probably a better way to handle catching exceptions when + // callbacks are involved. + var doParse = function () { + try { + parseGIF(stream, handler) + } catch (err) { + doLoadError("parse") + } + } + // eslint-disable-next-line no-unused-vars + var doText = function (text) { + toolbar.innerHTML = text // innerText? Escaping? Whatever. + toolbar.style.visibility = "visible" + } + + var setSizes = function (w, h) { + canvas.width = w * get_canvas_scale() + canvas.height = h * get_canvas_scale() + toolbar.style.minWidth = w * get_canvas_scale() + "px" + + tmpCanvas.width = w + tmpCanvas.height = h + tmpCanvas.style.width = w + "px" + tmpCanvas.style.height = h + "px" + tmpCanvas.getContext("2d").setTransform(1, 0, 0, 1, 0, 0) + } + + var setFrameOffset = function (frame, offset) { + if (!frameOffsets[frame]) { + frameOffsets[frame] = offset + return + } + if (typeof offset.x !== "undefined") { + frameOffsets[frame].x = offset.x + } + if (typeof offset.y !== "undefined") { + frameOffsets[frame].y = offset.y + } + } + + var doShowProgress = function (pos, length, draw) { + if (draw && showProgressBar) { + var height = progressBarHeight + var left, mid, top, width + if (options.is_vp) { + if (!ctx_scaled) { + top = options.vp_t + options.vp_h - height + // eslint-disable-next-line + height = height + left = options.vp_l + mid = left + (pos / length) * options.vp_w + width = canvas.width + } else { + top = (options.vp_t + options.vp_h - height) / get_canvas_scale() + height = height / get_canvas_scale() + left = options.vp_l / get_canvas_scale() + mid = left + (pos / length) * (options.vp_w / get_canvas_scale()) + width = canvas.width / get_canvas_scale() + } + } else { + top = (canvas.height - height) / (ctx_scaled ? get_canvas_scale() : 1) + mid = ((pos / length) * canvas.width) / (ctx_scaled ? get_canvas_scale() : 1) + width = canvas.width / (ctx_scaled ? get_canvas_scale() : 1) + height /= ctx_scaled ? get_canvas_scale() : 1 + } + + ctx.fillStyle = progressBarBackgroundColor + ctx.fillRect(mid, top, width - mid, height) + + ctx.fillStyle = progressBarForegroundColor + ctx.fillRect(0, top, mid, height) + } + } + + var doLoadError = function (originOfError) { + var drawError = function () { + ctx.fillStyle = "black" + ctx.fillRect(0, 0, options.c_w ? options.c_w : hdr.width, options.c_h ? options.c_h : hdr.height) + ctx.strokeStyle = "red" + ctx.lineWidth = 3 + ctx.moveTo(0, 0) + ctx.lineTo(options.c_w ? options.c_w : hdr.width, options.c_h ? options.c_h : hdr.height) + ctx.moveTo(0, options.c_h ? options.c_h : hdr.height) + ctx.lineTo(options.c_w ? options.c_w : hdr.width, 0) + ctx.stroke() + } + + loadError = originOfError + hdr = { + width: gif.width, + height: gif.height, + } // Fake header. + frames = [] + drawError() + } + + var doHdr = function (_hdr) { + hdr = _hdr + setSizes(hdr.width, hdr.height) + } + + var doGCE = function (gce) { + pushFrame() + clear() + transparency = gce.transparencyGiven ? gce.transparencyIndex : null + delay = gce.delayTime + disposalMethod = gce.disposalMethod + // We don't have much to do with the rest of GCE. + } + + var pushFrame = function () { + if (!frame) return + frames.push({ + data: frame.getImageData(0, 0, hdr.width, hdr.height), + delay: delay, + }) + frameOffsets.push({ x: 0, y: 0 }) + } + + var doImg = function (img) { + if (!frame) frame = tmpCanvas.getContext("2d") + + var currIdx = frames.length + + //ct = color table, gct = global color table + var ct = img.lctFlag ? img.lct : hdr.gct // TODO: What if neither exists? + + /* + Disposal method indicates the way in which the graphic is to + be treated after being displayed. + + Values : 0 - No disposal specified. The decoder is + not required to take any action. + 1 - Do not dispose. The graphic is to be left + in place. + 2 - Restore to background color. The area used by the + graphic must be restored to the background color. + 3 - Restore to previous. The decoder is required to + restore the area overwritten by the graphic with + what was there prior to rendering the graphic. + + Importantly, "previous" means the frame state + after the last disposal of method 0, 1, or 2. + */ + if (currIdx > 0) { + if (lastDisposalMethod === 3) { + // Restore to previous + // If we disposed every frame including first frame up to this point, then we have + // no composited frame to restore to. In this case, restore to background instead. + if (disposalRestoreFromIdx !== null) { + frame.putImageData(frames[disposalRestoreFromIdx].data, 0, 0) + } else { + frame.clearRect(lastImg.leftPos, lastImg.topPos, lastImg.width, lastImg.height) + } + } else { + disposalRestoreFromIdx = currIdx - 1 + } + + if (lastDisposalMethod === 2) { + // Restore to background color + // Browser implementations historically restore to transparent; we do the same. + // http://www.wizards-toolkit.org/discourse-server/viewtopic.php?f=1&t=21172#p86079 + frame.clearRect(lastImg.leftPos, lastImg.topPos, lastImg.width, lastImg.height) + } + } + // else, Undefined/Do not dispose. + // frame contains final pixel data from the last frame; do nothing + + //Get existing pixels for img region after applying disposal method + var imgData = frame.getImageData(img.leftPos, img.topPos, img.width, img.height) + + //apply color table colors + img.pixels.forEach(function (pixel, i) { + // imgData.data === [R,G,B,A,R,G,B,A,...] + if (pixel !== transparency) { + imgData.data[i * 4 + 0] = ct[pixel][0] + imgData.data[i * 4 + 1] = ct[pixel][1] + imgData.data[i * 4 + 2] = ct[pixel][2] + imgData.data[i * 4 + 3] = 255 // Opaque. + } + }) + + frame.putImageData(imgData, img.leftPos, img.topPos) + + if (!ctx_scaled) { + ctx.scale(get_canvas_scale(), get_canvas_scale()) + ctx_scaled = true + } + + // We could use the on-page canvas directly, except that we draw a progress + // bar for each image chunk (not just the final image). + if (drawWhileLoading) { + ctx.drawImage(tmpCanvas, 0, 0) + drawWhileLoading = options.auto_play + } + + lastImg = img + } + + var player = (function () { + var i = -1 + var iterationCount = 0 + // eslint-disable-next-line no-unused-vars + var showingInfo = false + // eslint-disable-next-line no-unused-vars + var pinned = false + + /** + * Gets the index of the frame "up next". + * @returns {number} + */ + var getNextFrameNo = function () { + var delta = forward ? 1 : -1 + return (i + delta + frames.length) % frames.length + } + + var stepFrame = function (amount) { + // XXX: Name is confusing. + i = i + amount + + putFrame() + } + + var step = (function () { + var stepping = false + + var completeLoop = function () { + if (onEndListener !== null) onEndListener(gif) + iterationCount++ + + if (overrideLoopMode !== false || iterationCount < 0) { + doStep() + } else { + stepping = false + playing = false + } + } + + var doStep = function () { + stepping = playing + if (!stepping) return + + stepFrame(1) + var delay = frames[i].delay * 10 + if (!delay) delay = 100 // FIXME: Should this even default at all? What should it be? + + var nextFrameNo = getNextFrameNo() + if (nextFrameNo === 0) { + delay += loopDelay + setTimeout(completeLoop, delay) + } else { + setTimeout(doStep, delay) + } + } + + return function () { + if (!stepping) setTimeout(doStep, 0) + } + })() + + var putFrame = function () { + var offset + i = parseInt(i, 10) + + if (i > frames.length - 1) { + i = 0 + } + + if (i < 0) { + i = 0 + } + + offset = frameOffsets[i] + + tmpCanvas.getContext("2d").putImageData(frames[i].data, offset.x, offset.y) + ctx.globalCompositeOperation = "copy" + ctx.drawImage(tmpCanvas, 0, 0) + } + + var play = function () { + playing = true + step() + } + + var pause = function () { + playing = false + } + + return { + init: function () { + if (loadError) return + + if (!(options.c_w && options.c_h)) { + ctx.scale(get_canvas_scale(), get_canvas_scale()) + } + + if (options.auto_play) { + step() + } else { + i = 0 + putFrame() + } + }, + step: step, + play: play, + pause: pause, + playing: playing, + move_relative: stepFrame, + current_frame: function () { + return i + }, + length: function () { + return frames.length + }, + move_to: function (frame_idx) { + i = frame_idx + putFrame() + }, + } + })() + + var doDecodeProgress = function (draw) { + doShowProgress(stream.pos, stream.data.length, draw) + } + + var doNothing = function () {} + /** + * @param{boolean=} draw Whether to draw progress bar or not; this is not idempotent because of translucency. + * Note that this means that the text will be unsynchronized with the progress bar on non-frames; + * but those are typically so small (GCE etc.) that it doesn't really matter. TODO: Do this properly. + */ + var withProgress = function (fn, draw) { + return function (block) { + fn(block) + doDecodeProgress(draw) + } + } + + var handler = { + hdr: withProgress(doHdr), + gce: withProgress(doGCE), + com: withProgress(doNothing), + // I guess that's all for now. + app: { + // TODO: Is there much point in actually supporting iterations? + NETSCAPE: withProgress(doNothing), + }, + img: withProgress(doImg, true), + eof: function (block) { + //toolbar.style.display = ''; + pushFrame() + doDecodeProgress(false) + if (!(options.c_w && options.c_h)) { + canvas.width = hdr.width * get_canvas_scale() + canvas.height = hdr.height * get_canvas_scale() + } + player.init() + loading = false + if (load_callback) { + load_callback(gif) + } + }, + } + + var init = function () { + var parent = gif.parentNode + + var div = document.createElement("div") + canvas = document.createElement("canvas") + ctx = canvas.getContext("2d") + toolbar = document.createElement("div") + + tmpCanvas = document.createElement("canvas") + + div.width = canvas.width = gif.width + div.height = canvas.height = gif.height + toolbar.style.minWidth = gif.width + "px" + + div.className = "jsgif" + toolbar.className = "jsgif_toolbar" + div.appendChild(canvas) + div.appendChild(toolbar) + + parent.insertBefore(div, gif) + parent.removeChild(gif) + + if (options.c_w && options.c_h) setSizes(options.c_w, options.c_h) + initialized = true + } + + var get_canvas_scale = function () { + var scale + if (options.max_width && hdr && hdr.width > options.max_width) { + scale = options.max_width / hdr.width + } else { + scale = 1 + } + return scale + } + + var canvas, ctx, toolbar, tmpCanvas + var initialized = false + var load_callback = false + + var load_setup = function (callback) { + if (loading) return false + if (callback) load_callback = callback + else load_callback = false + + loading = true + frames = [] + clear() + disposalRestoreFromIdx = null + lastDisposalMethod = null + frame = null + lastImg = null + + return true + } + + return { + // play controls + play: player.play, + pause: player.pause, + move_relative: player.move_relative, + move_to: player.move_to, + + // getters for instance vars + get_playing: function () { + return playing + }, + get_canvas: function () { + return canvas + }, + get_canvas_scale: function () { + return get_canvas_scale() + }, + get_loading: function () { + return loading + }, + get_auto_play: function () { + return options.auto_play + }, + get_length: function () { + return player.length() + }, + get_current_frame: function () { + return player.current_frame() + }, + load_url: function (src, callback) { + if (!load_setup(callback)) return + + var h = new XMLHttpRequest() + // new browsers (XMLHttpRequest2-compliant) + h.open("GET", src, true) + + if ("overrideMimeType" in h) { + h.overrideMimeType("text/plain; charset=x-user-defined") + } + + // old browsers (XMLHttpRequest-compliant) + else if ("responseType" in h) { + h.responseType = "arraybuffer" + } + + // IE9 (Microsoft.XMLHTTP-compliant) + else { + h.setRequestHeader("Accept-Charset", "x-user-defined") + } + + h.onloadstart = function () { + // Wait until connection is opened to replace the gif element with a canvas to avoid a blank img + if (!initialized) init() + } + h.onload = function (e) { + if (this.status !== 200) { + doLoadError("xhr - response") + } + var data = this.response + if (data.toString().indexOf("ArrayBuffer") > 0) { + data = new Uint8Array(data) + } + + stream = new Stream(data) + setTimeout(doParse, 0) + } + h.onprogress = function (e) { + if (e.lengthComputable) doShowProgress(e.loaded, e.total, true) + } + h.onerror = function () { + doLoadError("xhr") + } + h.send() + }, + load: function (callback) { + this.load_url(gif.getAttribute("rel:animated_src") || gif.src, callback) + }, + load_raw: function (arr, callback) { + if (!load_setup(callback)) return + if (!initialized) init() + stream = new Stream(arr) + setTimeout(doParse, 0) + }, + set_frame_offset: setFrameOffset, + } + } + + return SuperGif +}) diff --git a/src/components/SectionHeader/index.tsx b/src/components/SectionHeader/index.tsx index 4c726927b..812a0cb58 100644 --- a/src/components/SectionHeader/index.tsx +++ b/src/components/SectionHeader/index.tsx @@ -16,7 +16,7 @@ const SectionHeader = props => { return ( ({ })) const Select = props => { - const { className, ...restProps } = props + const { className, icon, ...restProps } = props const { classes, cx } = useStyles() const [isUnderneath, setIsUnderneath] = useState(true) @@ -103,6 +103,7 @@ const Select = props => { return ( + {icon && } {selected as string} diff --git a/src/components/Skeleton/index.tsx b/src/components/Skeleton/index.tsx new file mode 100644 index 000000000..c4808635e --- /dev/null +++ b/src/components/Skeleton/index.tsx @@ -0,0 +1,22 @@ +import { Skeleton as MuiSkeleton } from "@mui/material" + +const Skeleton = props => { + const { white, dark, sx, size, ...restProps } = props + + return ( + + ) +} + +export default Skeleton diff --git a/src/components/WalletToolkit/NetworkSelect.tsx b/src/components/WalletToolkit/NetworkSelect.tsx index 38bd0f748..43e3df94c 100644 --- a/src/components/WalletToolkit/NetworkSelect.tsx +++ b/src/components/WalletToolkit/NetworkSelect.tsx @@ -11,7 +11,7 @@ import { switchNetwork } from "@/utils" const useStyles = makeStyles()((theme, { dark }) => ({ button: { - height: "3.6rem", + height: "4rem", padding: "0 1.2rem", border: dark ? `1px solid ${theme.palette.primary.contrastText}` : "none", backgroundColor: dark ? "unset" : theme.palette.themeBackground.normal, diff --git a/src/components/WalletToolkit/WalletDropdown.tsx b/src/components/WalletToolkit/WalletDropdown.tsx index fade0c3ce..4929c35d0 100644 --- a/src/components/WalletToolkit/WalletDropdown.tsx +++ b/src/components/WalletToolkit/WalletDropdown.tsx @@ -1,28 +1,39 @@ import copy from "copy-to-clipboard" -import { useCallback, useMemo, useState } from "react" -import { useLocation } from "react-router-dom" +import { useCallback, useEffect, useMemo, useState } from "react" +import Img from "react-cool-img" +import { useLocation, useNavigate } from "react-router-dom" +import { writeItem } from "squirrel-gill/lib/storage" import { makeStyles } from "tss-react/mui" -import { ButtonBase, Fade, ListItemIcon, ListItemText, Menu, MenuItem, SvgIcon } from "@mui/material" +import { Box, ButtonBase, Fade, LinearProgress, ListItemIcon, ListItemText, Menu, MenuItem, SvgIcon } from "@mui/material" +import { getSmallHeartbeatURL } from "@/apis/canvas" import { ReactComponent as CopySuccessSvg } from "@/assets/svgs/bridge/copy-success.svg" import { ReactComponent as HistorySvg } from "@/assets/svgs/bridge/history.svg" import { ReactComponent as BlockSvg } from "@/assets/svgs/wallet-connector/block.svg" import { ReactComponent as CopySvg } from "@/assets/svgs/wallet-connector/copy.svg" import { ReactComponent as DisconnectSvg } from "@/assets/svgs/wallet-connector/disconnect.svg" import { ReactComponent as DownTriangleSvg } from "@/assets/svgs/wallet-connector/down-triangle.svg" +import { ReactComponent as ProfileSvg } from "@/assets/svgs/wallet-connector/profile.svg" import { CHAIN_ID, EXPLORER_URL } from "@/constants" +import { CANVAS_SCROLLY_ID } from "@/constants/storageKey" +import { useCanvasContext } from "@/contexts/CanvasContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" import useBridgeStore from "@/stores/bridgeStore" +import useCanvasStore from "@/stores/canvasStore" +import usePerkStore from "@/stores/perksStore" import { generateExploreLink, truncateAddress } from "@/utils" const useStyles = makeStyles()((theme, { dark }) => ({ button: { fontFamily: "var(--developer-page-font-family)", fontSize: "1.6rem", - height: "3.6rem", + height: "4rem", + width: "16rem", padding: "0 1.2rem", borderRadius: "0.5rem", + // width: "16rem", border: dark ? `1px solid ${theme.palette.primary.contrastText}` : "none", backgroundColor: dark ? "unset" : theme.palette.themeBackground.normal, color: dark ? theme.palette.primary.contrastText : "#473835", @@ -78,15 +89,43 @@ const WalletDropdown = props => { const { sx, dark } = props const { classes, cx } = useStyles({ dark }) const { pathname } = useLocation() + const navigate = useNavigate() const { walletCurrentAddress, connect, disconnect, chainId } = useRainbowContext() const { changeHistoryVisible } = useBridgeStore() + const { unsignedProfileRegistryContract, publicProvider } = useCanvasContext() + const { username, profileMinted, walletDetailLoading, checkAndFetchCurrentWalletCanvas, clearCanvas } = useCanvasStore() + const { clearPerks } = usePerkStore() + const alertWarning = useSnackbar() + const [anchorEl, setAnchorEl] = useState(null) const [copied, setCopied] = useState(false) const open = useMemo(() => Boolean(anchorEl), [anchorEl]) + useEffect(() => { + clearCanvasData() + }, [walletCurrentAddress]) + + useEffect(() => { + if (unsignedProfileRegistryContract && walletCurrentAddress) { + checkAndFetchCurrentWalletCanvas(publicProvider, unsignedProfileRegistryContract, walletCurrentAddress).then(res => { + if (res !== true) { + alertWarning(res) + } + }) + } + + // re check&&fetch walletCurrentAddress's canvas when switching address on Wallet + }, [unsignedProfileRegistryContract, walletCurrentAddress]) + + const clearCanvasData = () => { + clearCanvas() + clearPerks() + writeItem(localStorage, CANVAS_SCROLLY_ID, null) + } + const handleClick = e => { setAnchorEl(e.currentTarget) } @@ -107,6 +146,18 @@ const WalletDropdown = props => { const operations = useMemo( () => [ + { + icon: ProfileSvg, + label: "Scroll Canvas", + action: () => { + if (profileMinted) { + navigate("/canvas") + } else { + navigate("/canvas/mint") + } + handleClose() + }, + }, { icon: HistorySvg, label: "Transaction history", @@ -126,20 +177,51 @@ const WalletDropdown = props => { label: "Disconnect", action: () => { disconnect() - handleClose() + // clear Canvas states + clearCanvasData() }, }, ], - [pathname, viewScan, copyAddress, copied, disconnect], + [pathname, viewScan, copyAddress, copied, disconnect, profileMinted], ) - return ( - <> - {chainId ? ( - + const renderCurrentWallet = () => { + if (walletDetailLoading) { + return ( + {truncateAddress(walletCurrentAddress as string)} + {} + + ) + } else if (profileMinted) { + return ( + + + + {username} +

{truncateAddress(walletCurrentAddress as string)}

+
+
+ ) + } + return ( + + {truncateAddress(walletCurrentAddress as string)} + + + ) + } + + return ( + <> + {walletCurrentAddress ? ( + <>{renderCurrentWallet()} ) : ( Connect Wallet diff --git a/src/components/WalletToolkit/index.tsx b/src/components/WalletToolkit/index.tsx index 094a3f1a9..d151ce797 100644 --- a/src/components/WalletToolkit/index.tsx +++ b/src/components/WalletToolkit/index.tsx @@ -9,11 +9,11 @@ import WalletDropdown from "./WalletDropdown" const WalletToolkit = props => { const { dark } = props const { isMobile } = useCheckViewport() - const { chainId } = useRainbowContext() + const { walletCurrentAddress } = useRainbowContext() return ( - {chainId && !isMobile && } + {walletCurrentAddress && !isMobile && } ) diff --git a/src/constants/badge.ts b/src/constants/badge.ts new file mode 100644 index 000000000..1579c2f2a --- /dev/null +++ b/src/constants/badge.ts @@ -0,0 +1,82 @@ +import { ethers } from "ethers" + +import ScrollOriginsNFTABI from "@/assets/abis/ScrollOriginsNFT.json" +import { requireEnv } from "@/utils" + +const SCROLL_ORIGINS_NFT = requireEnv("REACT_APP_SCROLL_ORIGINS_NFT") +const SCROLL_ORIGINS_NFT_V2 = requireEnv("REACT_APP_SCROLL_ORIGINS_NFT_V2") + +export const ETHEREUM_YEAR_BADGE_ADDRESS = requireEnv("REACT_APP_ETHEREUM_YEAR_BADGE_ADDRESS") +// sepolia +const ETHEREUM_YEAR_ATTESTER_PROXY_ADDRESS = "0xdAe8D9a30681899C305534849e138579aF0BF88e" +const ETHEREUM_YEAR_BASE_URL = `${requireEnv("REACT_APP_CANVAS_BACKEND_URI")}/badge` + +export const SCR_HOLDING_BADGE_ADDRESS = requireEnv("REACT_APP_SCR_HOLDING_BADGE_ADDRESS") + +export const SELF_ATTESTATION_BADGE_ADDRESS_LIST = [SCR_HOLDING_BADGE_ADDRESS] + +export interface Badge { + name: string + description: string + image: string + issuerName?: string + issuer?: { + origin: string + name: string + logo: string + communityURL?: string + } + badgeContract: string + + // Backend-authorized + attesterProxy?: string + baseURL?: string + eligibilityCheck?: boolean + + // Origin NFT + originsNFT?: boolean + validator?: (address, provider) => Promise + nftAddress?: string[] + nftAbi?: object + + // issued by Scroll + native?: boolean +} +export const ETHEREUM_YEAR_BADGE = { + name: "Ethereum Year Badge", + badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + attesterProxy: ETHEREUM_YEAR_ATTESTER_PROXY_ADDRESS, + description: + "Check out the Ethereum Year Badge! It's like a digital trophy that shows off the year your wallet made its debut on Ethereum. It's a little present from Scroll to celebrate all the cool stuff you've done in the Ethereum ecosystem.", + image: "/imgs/canvas/Badge_Ethereum_Year.png", + native: false, + issuer: { + origin: "https://scroll.io", + name: "Scroll", + logo: "https://scroll.io/static/media/Scroll_Logomark.673577c8260b63ae56867bc9af6af514.svg", + }, + baseURL: ETHEREUM_YEAR_BASE_URL, +} +// only keep OriginsNFTBadge +export const ORIGINS_NFT_BADGE = { + nftAddress: [SCROLL_ORIGINS_NFT, SCROLL_ORIGINS_NFT_V2], + nftAbi: ScrollOriginsNFTABI, + validator: async (provider, address) => { + const nftContract = new ethers.Contract(SCROLL_ORIGINS_NFT, ScrollOriginsNFTABI, provider) + const nftV2Contract = new ethers.Contract(SCROLL_ORIGINS_NFT_V2, ScrollOriginsNFTABI, provider) + + let balance = await nftContract.balanceOf(address) + if (!balance) { + balance = await nftV2Contract.balanceOf(address) + } + return !!balance + }, +} + +export enum BADGE_TYPE { + GIFTED = "Gifted", + BACKEND_AUTHORIZED = "Backend-authorized", + PERMISSIONLESS = "Permissionless", + // TODO: need to be stored in Badge Registry + SELF_ATTESTATION = "Self-attestation", +} diff --git a/src/constants/blog.ts b/src/constants/blog.ts new file mode 100644 index 000000000..448f269bd --- /dev/null +++ b/src/constants/blog.ts @@ -0,0 +1,87 @@ +export const BLOG_LANGUAGE_LIST = [ + { label: "English", key: "en" }, + { label: "Español", key: "es" }, + { label: "Türkçe", key: "tr" }, +] + +export const getBlogCategoryList = lang => [ + { + label: LANGUAGE_MAP[lang].all, + key: "All", + }, + { + label: LANGUAGE_MAP[lang].announcement, + key: "Announcement", + }, + { + label: LANGUAGE_MAP[lang].general, + key: "General", + }, + { + label: LANGUAGE_MAP[lang].technical, + key: "Technical", + }, + { + label: LANGUAGE_MAP[lang].ecosystem_highlights, + key: "Ecosystem highlights", + }, +] + +export const getBlogSortList = lang => [ + { + label: LANGUAGE_MAP[lang].newest, + key: "Newest", + }, + { + label: LANGUAGE_MAP[lang].oldest, + key: "Oldest", + }, +] + +export const LANGUAGE_MAP = { + en: { + title: "Scroll Blog", + sub_title: "Learn about Scroll’s technology, research, and latest developments.", + category: "Category", + all: "All", + announcement: "Announcement", + general: "General", + technical: "Technical", + ecosystem_highlights: "Ecosystem highlights", + sort: "Order by", + newest: "Newest", + oldest: "Oldest", + filters: "Filters", + more_articles: "More articles from Scroll", + }, + es: { + title: "Scroll Blog", + sub_title: "Aprende sobre la tecnología, las investigaciones y los últimos desarrollos de Scroll.", + category: "Categoría", + all: "Todo", + announcement: "Anuncio", + general: "General", + technical: "Técnico", + ecosystem_highlights: "Lo mejor del ecosistema", + sort: "Ordenar por", + newest: "Más reciente", + oldest: "Más antiguo", + filters: "Filtros", + more_articles: "Más artículos de Scroll", + }, + tr: { + title: "Scroll Blog", + sub_title: "Scroll teknolojisini, son gelişmeleri ve araştırmaları öğrenin.", + category: "Kategori", + all: "Tümü", + announcement: "Duyuru", + general: "Genel", + technical: "Teknik", + ecosystem_highlights: "Ekosistem vurguları", + sort: "Şuna göre sırala", + newest: "En yeni", + oldest: "En eski", + filters: "Filtreler", + more_articles: "Scroll'dan daha fazla makale", + }, +} diff --git a/src/constants/brandKit.ts b/src/constants/brandKit.ts index c6231064a..155da4164 100644 --- a/src/constants/brandKit.ts +++ b/src/constants/brandKit.ts @@ -29,6 +29,7 @@ export const brandAssets = [ versions: [ { title: "Full coloured logo on light background", + type: "light", cover: FullColouredLogoSvg, coverClass: "LogoDemo", formats: { @@ -39,6 +40,7 @@ export const brandAssets = [ }, { title: "White logo on dark background", + type: "dark", cover: InvertedLogoSvg, coverClass: "LogoDemo", formats: { diff --git a/src/constants/canvas-badge.ts b/src/constants/canvas-badge.ts new file mode 100644 index 000000000..255eacfd4 --- /dev/null +++ b/src/constants/canvas-badge.ts @@ -0,0 +1,267 @@ +import { ReactComponent as EngagementSvg } from "@/assets/svgs/canvas-badge/engagement.svg" +import { ReactComponent as FindSvg } from "@/assets/svgs/canvas-badge/find.svg" +import { ReactComponent as IssueSvg } from "@/assets/svgs/canvas-badge/issue.svg" +import { ReactComponent as RockSvg } from "@/assets/svgs/canvas-badge/rock.svg" +import { ReactComponent as SpecialSvg } from "@/assets/svgs/canvas-badge/special.svg" +import { ReactComponent as StarBlur1Svg } from "@/assets/svgs/canvas-badge/star-blur-1.svg" +import { ReactComponent as StarBlur2Svg } from "@/assets/svgs/canvas-badge/star-blur-2.svg" +import { ReactComponent as StarCircle1Svg } from "@/assets/svgs/canvas-badge/star-circle-1.svg" +import { ReactComponent as StarCircle2Svg } from "@/assets/svgs/canvas-badge/star-circle-2.svg" +import { ReactComponent as StarCircle3Svg } from "@/assets/svgs/canvas-badge/star-circle-3.svg" +import { ReactComponent as StarCircle4Svg } from "@/assets/svgs/canvas-badge/star-circle-4.svg" +import { ReactComponent as StarCircle5Svg } from "@/assets/svgs/canvas-badge/star-circle-5.svg" +import { ReactComponent as StarCircle6Svg } from "@/assets/svgs/canvas-badge/star-circle-6.svg" +import { ReactComponent as StarCircle7Svg } from "@/assets/svgs/canvas-badge/star-circle-7.svg" +import { ReactComponent as StarCircle8Svg } from "@/assets/svgs/canvas-badge/star-circle-8.svg" +import { ReactComponent as StarCircle9Svg } from "@/assets/svgs/canvas-badge/star-circle-9.svg" +import { ReactComponent as StarCircle10Svg } from "@/assets/svgs/canvas-badge/star-circle-10.svg" +import { ReactComponent as StarDiamond1Svg } from "@/assets/svgs/canvas-badge/star-diamond-1.svg" +import { ReactComponent as StarDiamond2Svg } from "@/assets/svgs/canvas-badge/star-diamond-2.svg" +import { ReactComponent as TreasureSvg } from "@/assets/svgs/canvas-badge/treasure.svg" + +export const CANVAS_AND_BADGES_PAGE_SYMBOL = "canvas-badges" + +export const CANVAS_BADGE_INTRODUCTIONS = [ + { + label: "For Users", + key: "user", + icon: "👥", + items: [ + { + icon: RockSvg, + title: "Rock and Scroll", + content: "Make your Scroll Canvas a showcase for your achievements. Share badges, stories, and milestones with the Scroll community.", + }, + { + icon: SpecialSvg, + title: "Unlock Special Perks", + content: "Earn special privileges and access through your badges, turning your achievements into new opportunities.", + }, + { + icon: TreasureSvg, + title: "Collect Hidden Treasures", + content: "Gather badges from various platforms and display them on Canvas.", + }, + ], + }, + { + label: "For Developers", + key: "developer", + icon: "🛠️", + items: [ + { + icon: IssueSvg, + title: "Permissionless, issue badges right away!", + content: "Projects on Scroll can issue versatile, permissionless Badges to recognize contributions and boost engagement.", + }, + { + icon: FindSvg, + title: "Find the right crowd", + content: "Badges represents user traits. Leverage Badge traits to find your ideal users to drive growth.", + }, + { + icon: EngagementSvg, + title: "Activate User Engagement", + content: "Guide, recognize and reward users with badges. Gamify DApp experience.", + }, + ], + }, +] + +export const SORT_LIST = [ + { key: "minted", label: "Sort by most minted" }, + { key: "added", label: "Sort by latest added" }, +] + +export const CATEGORY_LIST = [ + { key: "all", label: "All categories" }, + { key: "Achievements", label: "🏆 Achievements" }, + { key: "Identities", label: "👤 Identities" }, + { key: "Others", label: "👽 Others" }, +] + +export const ISSUE_BADGES_URL = "https://docs.scroll.xyz/en/developers/guides/canvas-badge-integration/" + +export const CANVAS_URL = "/canvas" + +// wrapper 1328x337 +export const HEADER_BADGES = [ + { + image: "/imgs/canvas-badge/Ambient.webp", + key: "Ambient", + width: "13.9rem", + top: 0, + }, + { + image: "/imgs/canvas-badge/Zebra.webp", + key: "Zebra", + width: "18.8rem", + top: "13.5rem", + left: "9.55rem", + }, + { + image: "/imgs/canvas-badge/Panda.png", + key: "Panda", + width: "13.5rem", + top: 0, + left: "17.4rem", + }, + { + image: "/imgs/canvas-badge/Pencils.png", + key: "Pencils", + width: "16.9rem", + top: "8.2rem", + left: "27rem", + }, + { + image: "/imgs/canvas-badge/EAS.png", + key: "EAS", + width: "20.3rem", + top: "13.5rem", + left: "41.8rem", + }, + { + image: "/imgs/canvas-badge/SymTrader.png", + key: "SymTrader", + width: "13.5rem", + top: 0, + left: "45.9rem", + }, + { + image: "/imgs/canvas/Badge_Ethereum_Year.png", + key: "Ethererum", + width: "16.9rem", + top: "6.75rem", + left: "59.45rem", + }, + { + image: "/imgs/canvas-badge/Passport.png", + key: "Passport", + width: "20.3rem", + top: "13.5rem", + left: "73.1rem", + }, + { + image: "/imgs/canvas-badge/Cog.png", + key: "Cog", + width: "12.5rem", + top: 0, + left: "78.7rem", + }, + { + image: "/imgs/canvas-badge/Scrolly.png", + key: "Scrolly", + width: "13.5rem", + top: 0, + left: "101.9rem", + }, + { + image: "/imgs/canvas-badge/Scroller.png", + key: "Scroller", + width: "16.8rem", + top: "8.2rem", + left: "92.8rem", + }, + { + image: "/imgs/canvas-badge/Flock-x.png", + key: "Flock", + width: "20.2rem", + top: "13.5rem", + left: "106.4rem", + }, + { + image: "/imgs/canvas-badge/Symbiosis.png", + key: "Symbiosis", + width: "13.8rem", + top: 0, + left: "119rem", + }, +] +// wrapper 1512 +export const HEADER_STARS = [ + { + icon: StarBlur1Svg, + size: 64, + left: "21.95rem", + top: "10.8rem", + }, + { + icon: StarBlur2Svg, + size: 64, + left: "125.4rem", + top: "36.8rem", + }, + { + icon: StarCircle1Svg, + size: 20, + left: "4.7rem", + top: "79.6rem", + }, + { + icon: StarCircle2Svg, + size: 16, + left: "19.5rem", + top: "29.2rem", + }, + { + icon: StarCircle3Svg, + size: 12, + left: "5.2rem", + top: "32rem", + }, + { + icon: StarCircle4Svg, + size: 16, + left: "38.8rem", + top: "13.2rem", + }, + { + icon: StarCircle5Svg, + size: 16, + left: "65.55rem", + top: "2.4rem", + }, + { + icon: StarCircle6Svg, + size: 20, + left: "108.1rem", + top: "37.7rem", + }, + { + icon: StarCircle7Svg, + size: 20, + left: "136.8rem", + top: "12.5rem", + }, + { + icon: StarCircle8Svg, + size: 12, + left: "146.1rem", + top: "20.3rem", + }, + + { + icon: StarCircle9Svg, + size: 12, + left: "148.6rem", + top: "48.3rem", + }, + { + icon: StarCircle10Svg, + size: 8, + left: "135rem", + top: "15.1rem", + }, + { + icon: StarDiamond1Svg, + size: 30.5, + left: "121.5rem", + top: "27.6rem", + }, + { + icon: StarDiamond2Svg, + size: 30.5, + left: "142rem", + top: "70.3rem", + }, +] diff --git a/src/constants/canvas.ts b/src/constants/canvas.ts new file mode 100644 index 000000000..4e7f3550f --- /dev/null +++ b/src/constants/canvas.ts @@ -0,0 +1,23 @@ +import { SCR_HOLDING_BADGE_ADDRESS } from "./badge" + +export enum BADGES_VISIBLE_TYPE { + VISIBLE = "Displayed", + INVISIBLE = "Not displayed", +} + +export enum CANVAS_AVATAR_TYPE { + NFT = "NFT", + PICTURE = "Picture", + HEARTBEAT = "Heartbeat", +} + +export const BADGE_INTEGRATION_GUIDE = + "https://scrollzkp.notion.site/Introducing-Scroll-Canvas-Badge-Integration-Guide-8656463ab63b42e8baf924763ed8c9d5" + +export const EXPLORE_BADGES_URL = "/canvas-and-badges#discover" + +export const CANVAS_AVATAR_MAX_SIZE = 4.5 * 1024 * 1024 // 4.5MB + +export const GRACE_PERIOD_DURATION = 60 // min + +export const FORCE_PAY_GAS_FEE_BADGE_LIST = [SCR_HOLDING_BADGE_ADDRESS] diff --git a/src/constants/common.ts b/src/constants/common.ts index 0a87f93ac..fc30a29d7 100644 --- a/src/constants/common.ts +++ b/src/constants/common.ts @@ -1,12 +1,12 @@ -import { isProduction, requireEnv } from "@/utils" +import { isMainnet, requireEnv } from "@/utils" export const ETH_SYMBOL = requireEnv("REACT_APP_ETH_SYMBOL") export const WETH_SYMBOL = "WETH" export const USDC_SYMBOL = "USDC" -export const L1_NAME = `Ethereum ${isProduction ? "" : requireEnv("REACT_APP_SCROLL_ENVIRONMENT")}` +export const L1_NAME = `Ethereum ${isMainnet ? "" : requireEnv("REACT_APP_SCROLL_ENVIRONMENT")}` -export const L2_NAME = `Scroll ${isProduction ? "" : requireEnv("REACT_APP_SCROLL_ENVIRONMENT")}` +export const L2_NAME = `Scroll ${isMainnet ? "" : requireEnv("REACT_APP_SCROLL_ENVIRONMENT")}` export const CHAIN_ID = { L1: parseInt(requireEnv("REACT_APP_CHAIN_ID_L1") as string), @@ -39,13 +39,27 @@ export const WETH_GATEWAY_PROXY_ADDR = { [CHAIN_ID.L2]: requireEnv("REACT_APP_L2_WETH_GATEWAY_PROXY_ADDR"), } +export const SCROLL_MESSENGER_ADDR = { + [CHAIN_ID.L1]: requireEnv("REACT_APP_L1_SCROLL_MESSENGER"), + [CHAIN_ID.L2]: requireEnv("REACT_APP_L2_SCROLL_MESSENGER"), +} + export const USDC_GATEWAY_PROXY_ADDR = { [CHAIN_ID.L2]: requireEnv("REACT_APP_L2_USDC_GATEWAY_PROXY_ADDR"), } +export const BATCH_BRIDGE_GATEWAY_PROXY_ADDR = { + [CHAIN_ID.L1]: requireEnv("REACT_APP_L1_BATCH_BRIDGE_GATEWAY_PROXY_ADDR"), +} + export const DOCUMENTATION_URL = { Mainnet: "https://docs.scroll.io/en/developers/developer-quickstart/", Sepolia: "https://docs.scroll.io/en/user-guide/", } export const BRANCH_NAME = requireEnv("REACT_APP_SCROLL_ENVIRONMENT").toLocaleLowerCase() + +export const TOEKN_TYPE = { + 721: "ERC721", + 1155: "ERC1155", +} diff --git a/src/constants/community.ts b/src/constants/community.ts new file mode 100644 index 000000000..5b37f1be2 --- /dev/null +++ b/src/constants/community.ts @@ -0,0 +1,43 @@ +import { ReactComponent as ContributeIcon } from "@/assets/svgs/community/contribute.svg" +import { ReactComponent as DiscordIcon } from "@/assets/svgs/community/discord.svg" +import { ReactComponent as ForumIcon } from "@/assets/svgs/community/forum.svg" + +export const DISCORD_LINK = "https://discord.gg/scroll" +export const COMMUNITY_FORUM_LINK = "https://gov.scroll.io/forum" +export const CONTRIBUTE_TO_SCROLL_LINK = "https://github.com/scroll-tech/contribute-to-scroll" + +export const COMMUNITY_EXPLORER_LIST = [ + { + icon: DiscordIcon, + href: DISCORD_LINK, + title: "Join our Discord", + content: "Connect with other Scroll developers and users", + }, + { + icon: ForumIcon, + href: COMMUNITY_FORUM_LINK, + title: "Governance Forum", + content: "Discuss and propose changes to Scroll", + }, + { + icon: ContributeIcon, + href: CONTRIBUTE_TO_SCROLL_LINK, + title: "Contribute to Scroll", + content: "Build with other developers", + }, +] + +export const COMMUNITY_TIME_LIST = ["All time", "Upcoming", "Last month", "This year"] + +export const COMMUNITY_REGION_LIST = [ + "All regions", + "Africa", + "Asia", + "Central America", + "Europe", + "Middle East", + "North America", + "Online", + "Pacific", + "South America", +] diff --git a/src/constants/ecosystem.ts b/src/constants/ecosystem.ts index 7774f8cfa..7b89f118b 100644 --- a/src/constants/ecosystem.ts +++ b/src/constants/ecosystem.ts @@ -1,21 +1,23 @@ -import { ReactComponent as DoubleEyesIcon } from "@/assets/svgs/ecosystem/double-eyes.svg" import { ReactComponent as HeartIcon } from "@/assets/svgs/ecosystem/heart.svg" +import { ReactComponent as NoteIcon } from "@/assets/svgs/ecosystem/note.svg" import { ReactComponent as SettingsIcon } from "@/assets/svgs/ecosystem/settings.svg" -import { isProduction } from "@/utils" + +export const ECOSYSTEM_PAGE_SYMBOL = "ecosystem" export const DIVERGENT_CATEGORY_MAP = { Community: ["Community", "DAO", "Governance"], DeFi: ["DEX", "DeFi", "Launchpad", "Lending", "Marketplace", "Payment"], Gaming: ["Gaming"], - Infra: ["Bridge", "Gateway", "Indexer", "Infrastructure", "Node Provider", "Oracle"], + Infra: ["Gateway", "Indexer", "Infrastructure", "Node Provider", "Oracle"], NFT: ["NFT"], Privacy: ["Privacy", "Identity"], Social: ["Social"], Tooling: ["Tooling"], Wallet: ["Wallet", "Hardware Wallet"], + Bridge: ["Bridge"], } -export const LIST_YOUR_DAPP_LINK = "https://tally.so/r/nGppyZ" +export const GET_IN_TOUCH_LINK = "https://tally.so/r/waxLBW" export const REQUEST_A_DAPP_LINK = "https://tally.so/r/3jlj59" @@ -23,10 +25,10 @@ export const LEARN_BUILD_LINK = "https://docs.scroll.io/en/getting-started/overv export const ECOSYSTEM_EXPLORER_LIST = [ { - icon: DoubleEyesIcon, - href: LIST_YOUR_DAPP_LINK, - title: "List your Dapp", - content: "Join a supportive, collaborative ecosystem with a greater purpose.", + icon: NoteIcon, + href: GET_IN_TOUCH_LINK, + title: "Get in touch", + content: "Reach out directly if you need more support for your project.", }, { icon: HeartIcon, @@ -46,4 +48,4 @@ export const TWITTER_ORIGIN = "https://twitter.com/" export const ECOSYSTEM_NETWORK_LIST = ["All networks", "Mainnet", "Testnet"] -export const NORMAL_HEADER_HEIGHT = isProduction ? "6.5rem" : "11.5rem" +export const NORMAL_HEADER_HEIGHT = "6.5rem" diff --git a/src/constants/index.ts b/src/constants/index.ts index bcc02e717..6024ef807 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -5,3 +5,11 @@ export * from "./networks" export * from "./transaction" export * from "./nft" export * from "./brandKit" +export * from "./sticker" +export * from "./sessions" +export * from "./blog" + +export * from "./canvas" +export * from "./badge" +export * from "./canvas-badge" +export * from "./community" diff --git a/src/constants/nft.ts b/src/constants/nft.ts index 31045c316..cf7cc47d2 100644 --- a/src/constants/nft.ts +++ b/src/constants/nft.ts @@ -17,6 +17,8 @@ export const EndDate = dayjs("2023-12-09T23:00:00Z").subtract(1, "ms") export const MintableDate = dayjs("2023-12-14T23:00:00Z") // 1702594800 +export const MintableEndDate = dayjs("2024-03-29T23:59:59Z") + export const ContractReleaseDate = dayjs("2023-12-14T11:30:42Z") export const NFT_RARITY_MAP = { diff --git a/src/constants/searchParamsKey.ts b/src/constants/searchParamsKey.ts new file mode 100644 index 000000000..1aa6fdf60 --- /dev/null +++ b/src/constants/searchParamsKey.ts @@ -0,0 +1 @@ +export const BRIDGE_TOKEN = "token" diff --git a/src/constants/sessions.ts b/src/constants/sessions.ts new file mode 100644 index 000000000..19fb50aee --- /dev/null +++ b/src/constants/sessions.ts @@ -0,0 +1,41 @@ +import dayjs from "dayjs" +import utc from "dayjs/plugin/utc.js" + +import { ReactComponent as ForumIcon } from "@/assets/svgs/sessions/forum.svg" +import { ReactComponent as LearnIcon } from "@/assets/svgs/sessions/learn.svg" +import { ReactComponent as SupportIcon } from "@/assets/svgs/sessions/support.svg" + +dayjs.extend(utc) + +export const Chapter1StartDate = dayjs("2024-05-15T09:00:00Z") + +export const FORUM_LINK = "https://scrollzkp.notion.site/Scroll-Sessions-FAQ-498f70eb33b94d539746a43256956517" +export const SUPPORT_LINK = "https://tally.so/r/3lNV1B" +export const TOU_LINK = "/sessions-terms-of-use" + +export const SESSIONS_EXPLORER_LIST = [ + { + icon: ForumIcon, + href: FORUM_LINK, + title: "FAQ", + content: "You will find most answers here", + }, + { + icon: SupportIcon, + href: SUPPORT_LINK, + title: "Support", + content: "Marks are wrong or missing? Tell us", + }, + { + icon: LearnIcon, + href: TOU_LINK, + title: "Sessions’ Terms of Use", + content: "All legal things", + }, +] + +export const SESSIONS_ZERO_ASSETS = "session-0-assets" +export const SESSIONS_ZERO_GAS = "session-0-gas" +export const SESSIONS_ONE_DEX = "session-1-dex" +export const SESSIONS_ONE_LENDING = "session-1-lending" +export const SESSIONS_ONE_ACTIVITIES = "session-1-activities" diff --git a/src/constants/sticker.ts b/src/constants/sticker.ts new file mode 100644 index 000000000..b4960c9b0 --- /dev/null +++ b/src/constants/sticker.ts @@ -0,0 +1,2 @@ +export const STICKER_CONTEST_NOTION_URL = "https://scrollzkp.notion.site/scrollzkp/Scroll-Sticker-Contest-4ba50886794a4ab5b024ca792aadda59" +export const STICKER_CONTEST_DISCORD_VOTE_URL = "https://discord.gg/ymuDXbphct" diff --git a/src/constants/storageKey.ts b/src/constants/storageKey.ts index 8a680ea57..6c3a47c88 100644 --- a/src/constants/storageKey.ts +++ b/src/constants/storageKey.ts @@ -5,8 +5,6 @@ export const TOKEN_SYMBOL_MAP_KEY = "tokenSymbolMap" export const TOKEN_INFO_MAP = "tokenInfoMap" -export const BRIDGE_TOKEN_SYMBOL = "bridgeTokenSymbol" - export const BRIDGE_TRANSACTIONS = "bridgeTransactions" export const CLAIM_TRANSACTIONS = "claimTransactions" @@ -24,3 +22,21 @@ export const USER_TOKEN_LIST = "userTokenList" export const STORAGE_AVAILABLE = "__storage_test__" export const ENVIRONMENT_NAME = "environmentName" + +export const SIGNED_TERMS = "signedTerms" + +export const WALLET_MARKS = "walletMarks" + +export const BRIDGE_BALANCES = "bridgeBalances" + +export const BLOG_LANGUAGE = "blogLanguage" + +export const FIRST_SEE_CANVAS = "firstSeeCanvas" + +export const CANVAS_PERKS = "canvasPerks" + +export const CANVAS_USER_BADGES = "canvasUserBadges" + +export const CANVAS_AVATAR_REMINDER = "canvasAvatarReminder" + +export const CANVAS_SCROLLY_ID = "canvasScrollyId" diff --git a/src/constants/transaction.ts b/src/constants/transaction.ts index 1cd441c09..5974d36d3 100644 --- a/src/constants/transaction.ts +++ b/src/constants/transaction.ts @@ -24,4 +24,9 @@ export enum TX_STATUS { RelayedReverted, Skipped, Dropped, + BatchDepositSent, + BatchDepositRelayed, + BatchDepositFailed, } + +export const BATCH_DEPOSIT_TOKENS = [""] diff --git a/src/contexts/BridgeContextProvider.tsx b/src/contexts/BridgeContextProvider.tsx index 56953cd22..f56b080dd 100644 --- a/src/contexts/BridgeContextProvider.tsx +++ b/src/contexts/BridgeContextProvider.tsx @@ -1,21 +1,22 @@ import { BrowserProvider, JsonRpcProvider, JsonRpcSigner, ethers } from "ethers" import { createContext, useContext, useEffect, useState } from "react" import useStorage from "squirrel-gill" -import useSWR, { mutate } from "swr" import { Alert, Snackbar } from "@mui/material" -import { tokenListUrl } from "@/apis/dynamic" +import BATCH_BRIDGE_GATEWAY_PROXY_ABI from "@/assets/abis/L1BatchBridgeGateway.json" +import L1_SCROLL_MESSENGER_ABI from "@/assets/abis/L1ScrollMessenger.json" import L1_GATEWAY_ROUTER_PROXY_ABI from "@/assets/abis/L1_GATEWAY_ROUTER_PROXY_ADDR.json" +import L2_SCROLL_MESSENGER_ABI from "@/assets/abis/L2ScrollMessenger.json" import L2_GATEWAY_ROUTER_PROXY_ABI from "@/assets/abis/L2_GATEWAY_ROUTER_PROXY_ADDR.json" -import { CHAIN_ID, ETH_SYMBOL, GATEWAY_ROUTE_PROXY_ADDR, NATIVE_TOKEN_LIST, RPC_URL } from "@/constants" -import { BLOCK_NUMBERS, BRIDGE_TOKEN_SYMBOL, USER_TOKEN_LIST } from "@/constants/storageKey" +import { BATCH_BRIDGE_GATEWAY_PROXY_ADDR, CHAIN_ID, GATEWAY_ROUTE_PROXY_ADDR, RPC_URL, SCROLL_MESSENGER_ADDR } from "@/constants" +import { BLOCK_NUMBERS } from "@/constants/storageKey" import { useRainbowContext } from "@/contexts/RainbowProvider" import useBlockNumbers from "@/hooks/useBlockNumbers" import useClaimHistory from "@/hooks/useClaimHistory" import useTokenPrice from "@/hooks/useTokenPrice" import useTxHistory, { TxHistory } from "@/hooks/useTxHistory" -import { loadState } from "@/utils/localStorage" +import useBridgeStore from "@/stores/bridgeStore" export interface Price { usd: number @@ -31,10 +32,8 @@ type BridgeContextProps = { networksAndSigners: any txHistory: TxHistory blockNumbers: number[] - tokenList: Token[] claimHistory: TxHistory tokenPrice: Prices - refreshTokenList: () => void } const BridgeContext = createContext(undefined) @@ -42,8 +41,8 @@ const BridgeContext = createContext(undefined) const BridgeContextProvider = ({ children }: any) => { const { provider, walletCurrentAddress, chainId } = useRainbowContext() const { isL1Available, isL2Available } = useBlockNumbers() + const { tokenList } = useBridgeStore() - const [tokenSymbol, setTokenSymbol] = useStorage(localStorage, BRIDGE_TOKEN_SYMBOL, ETH_SYMBOL) const [blockNumbers] = useStorage(localStorage, BLOCK_NUMBERS, [-1, -1]) const [networksAndSigners, setNetworksAndSigners] = useState({ @@ -51,14 +50,21 @@ const BridgeContextProvider = ({ children }: any) => { [CHAIN_ID.L2]: {}, }) - const [fetchTokenListError, setFetchTokenListError] = useState("") - const txHistory = useTxHistory() const claimHistory = useClaimHistory() // TODO: need refactoring inspired by publicClient and walletClient const update = async (walletProvider: BrowserProvider, address: string) => { - let l1signer, l2signer, l1Gateway, l2Gateway, l1Provider, l2Provider, l1ProviderForSafeBlock + let l1signer, + l2signer, + l1Gateway, + l2Gateway, + l1Provider, + l2Provider, + l1ProviderForSafeBlock, + l1ScrollMessenger, + l2ScrollMessenger, + l1BatchBridgeGateway if (chainId === CHAIN_ID.L1) { l1Provider = walletProvider l2Provider = await new JsonRpcProvider(RPC_URL.L2) @@ -77,12 +83,17 @@ const BridgeContextProvider = ({ children }: any) => { } // TODO: publicProvider l1ProviderForSafeBlock = await new JsonRpcProvider(RPC_URL.L1) + l1ScrollMessenger = new ethers.Contract(SCROLL_MESSENGER_ADDR[CHAIN_ID.L1], L1_SCROLL_MESSENGER_ABI, l1signer) + l2ScrollMessenger = new ethers.Contract(SCROLL_MESSENGER_ADDR[CHAIN_ID.L2], L2_SCROLL_MESSENGER_ABI, l2signer) + l1BatchBridgeGateway = new ethers.Contract(BATCH_BRIDGE_GATEWAY_PROXY_ADDR[CHAIN_ID.L1], BATCH_BRIDGE_GATEWAY_PROXY_ABI, l1signer) setNetworksAndSigners({ [CHAIN_ID.L1]: { provider: l1Provider, signer: l1signer, gateway: l1Gateway, + scrollMessenger: l1ScrollMessenger, + batchBridgeGateway: l1BatchBridgeGateway, }, [`${CHAIN_ID.L1}ForSafeBlock`]: { provider: l1ProviderForSafeBlock, @@ -91,70 +102,19 @@ const BridgeContextProvider = ({ children }: any) => { provider: l2Provider, signer: l2signer, gateway: l2Gateway, + scrollMessenger: l2ScrollMessenger, }, }) } - const { data: tokenList } = useSWR(tokenListUrl, url => { - return scrollRequest(url) - .then((data: any) => { - const tokensListTokens = data.tokens - const currentUserTokens = loadState(USER_TOKEN_LIST) || [] - - const combinedList = [...NATIVE_TOKEN_LIST, ...tokensListTokens, ...currentUserTokens] - const uniqueList = combinedList.reduce( - (accumulator, token) => { - // If the token doesn't have an address, consider it a native token and add it directly - if (!token.address) { - accumulator.result.push(token) - return accumulator - } - // Convert address to lowercase for case-insensitive deduplication - const lowercaseAddress = token.address.toLowerCase() - // Create a key combining address and chainId to ensure different chainIds are not deduplicated - const key = `${lowercaseAddress}-${token.chainId}` - - if (!accumulator.seen[key]) { - accumulator.seen[key] = true - accumulator.result.push(token) - } - return accumulator - }, - { seen: {}, result: [] }, - ).result - - return uniqueList - }) - .catch(() => { - setFetchTokenListError("Fail to fetch token list") - setTokenSymbol(ETH_SYMBOL) - return null - }) - }) - const tokenPrice = useTokenPrice(tokenList) - const refreshTokenList = () => { - mutate(tokenListUrl) - } - useEffect(() => { if (provider && walletCurrentAddress) { update(provider, walletCurrentAddress) } }, [provider, walletCurrentAddress, chainId]) - useEffect(() => { - const fromToken = tokenList?.find(item => item.chainId === chainId && item.symbol === tokenSymbol) - if (!fromToken) { - setTokenSymbol(ETH_SYMBOL) - } - }, [chainId, tokenList]) - - const handleClose = () => { - setFetchTokenListError("") - } - return ( { txHistory, blockNumbers, claimHistory, - tokenList: tokenList ?? NATIVE_TOKEN_LIST, - refreshTokenList, tokenPrice, }} > {children} - {/* TODO: unify error reporting */} - - - {fetchTokenListError} - - {!isL1Available && ( @@ -192,10 +144,10 @@ const BridgeContextProvider = ({ children }: any) => { ) } -export function useBrigeContext() { +export function useBridgeContext() { const ctx = useContext(BridgeContext) if (!ctx) { - throw new Error("useBrigeContext must be used within BridgeContextProvider") + throw new Error("useBridgeContext must be used within BridgeContextProvider") } return ctx } diff --git a/src/contexts/CanvasContextProvider.tsx b/src/contexts/CanvasContextProvider.tsx new file mode 100644 index 000000000..4b99eef9a --- /dev/null +++ b/src/contexts/CanvasContextProvider.tsx @@ -0,0 +1,73 @@ +import { BrowserProvider, Contract, JsonRpcProvider, ethers } from "ethers" +import { createContext, useContext, useEffect, useState } from "react" + +import ProfileRegistryABI from "@/assets/abis/CanvasProfileRegistry.json" +import { CHAIN_ID, RPC_URL } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import { requireEnv } from "@/utils" + +const PROFILE_REGISTRY_ADDRESS = requireEnv("REACT_APP_PROFILE_REGISTRY_ADDRESS") + +type CanvasContextProps = { + unsignedProfileRegistryContract: any + profileRegistryContract: any + publicProvider: any +} + +const CanvasContext = createContext(null) + +// only include contract instance && public provider +const CanvasContextProvider = ({ children }: any) => { + const { provider, chainId } = useRainbowContext() + + const [publicProvider, setPublicProvider] = useState(null) + + const [profileRegistryContract, setProfileRegistryContract] = useState() + const [unsignedProfileRegistryContract, setUnsignedProfileRegistryContract] = useState() + + const initializeInstanceWrapped = async provider => { + const signer = await provider.getSigner(0) + const profileRegistryContract = new ethers.Contract(PROFILE_REGISTRY_ADDRESS, ProfileRegistryABI, signer) + const unsignedProfileRegistryContract = new ethers.Contract(PROFILE_REGISTRY_ADDRESS, ProfileRegistryABI, provider) + setProfileRegistryContract(profileRegistryContract) + setUnsignedProfileRegistryContract(unsignedProfileRegistryContract) + } + + const initializeRPCInstance = async provider => { + const instance = new ethers.Contract(PROFILE_REGISTRY_ADDRESS, ProfileRegistryABI, provider) + setUnsignedProfileRegistryContract(instance) + } + + useEffect(() => { + if (provider && chainId === CHAIN_ID.L2) { + initializeInstanceWrapped(provider) + setPublicProvider(provider) + } else { + const instance = new JsonRpcProvider(RPC_URL.L2) + setPublicProvider(instance) + initializeRPCInstance(instance) + } + }, [provider, chainId]) + + return ( + + {children} + + ) +} + +export function useCanvasContext() { + const ctx = useContext(CanvasContext) + if (!ctx) { + throw new Error("useCanvasContext must be used within CanvasContextProvider") + } + return ctx +} + +export default CanvasContextProvider diff --git a/src/contexts/PriceFeeProvider.tsx b/src/contexts/PriceFeeProvider.tsx index c09a84d34..4d6401722 100644 --- a/src/contexts/PriceFeeProvider.tsx +++ b/src/contexts/PriceFeeProvider.tsx @@ -1,12 +1,13 @@ import { AbiCoder, Transaction, ethers } from "ethers" -import React, { createContext, useContext, useMemo, useState } from "react" -import useStorage from "squirrel-gill" +import React, { createContext, useContext, useEffect, useMemo, useState } from "react" +import { useSearchParams } from "react-router-dom" import { useBlockNumber } from "wagmi" import { CHAIN_ID, ETH_SYMBOL } from "@/constants" -import { BRIDGE_TOKEN_SYMBOL } from "@/constants/storageKey" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { BRIDGE_TOKEN } from "@/constants/searchParamsKey" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" +import useBridgeStore from "@/stores/bridgeStore" import { requireEnv, trimErrorMessage } from "@/utils" const OFFSET = "0x1111000000000000000000000000000000001111" @@ -20,6 +21,7 @@ enum MIN_GASLIMIT { USDC_GATEWAY = 16e4, DAI_GATEWAY = 15e4, LIDO_GATEWAY = 15e4, + PUFFER_GATEWAY = 15e4, } type Props = { @@ -38,17 +40,19 @@ enum GatewayType { USDC_GATEWAY = "USDC_GATEWAY", DAI_GATEWAY = "DAI_GATEWAY", LIDO_GATEWAY = "LIDO_GATEWAY", + PUFFER_GATEWAY = "PUFFER_GATEWAY", } // For USDC, Lido, and DAI, can use the STANDARD_ERC20_GATEWAY const Address2GatewayType = { - [requireEnv("REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR")]: GatewayType.ETH_GATEWAY, + ETH_GATEWAY: GatewayType.ETH_GATEWAY, [requireEnv("REACT_APP_L1_WETH_GATEWAY_PROXY_ADDR")]: GatewayType.WETH_GATEWAY, [requireEnv("REACT_APP_L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR")]: GatewayType.CUSTOM_ERC20_GATEWAY, [requireEnv("REACT_APP_L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR")]: GatewayType.STANDARD_ERC20_GATEWAY, [requireEnv("REACT_APP_L1_USDC_GATEWAY_PROXY_ADDR")]: GatewayType.USDC_GATEWAY, [requireEnv("REACT_APP_L1_DAI_GATEWAY_PROXY_ADDR")]: GatewayType.DAI_GATEWAY, [requireEnv("REACT_APP_L1_LIDO_GATEWAY_PROXY_ADDR")]: GatewayType.LIDO_GATEWAY, + [requireEnv("REACT_APP_L1_PUFFER_GATEWAY_PROXY_ADDR")]: GatewayType.PUFFER_GATEWAY, } // Contracts @@ -75,9 +79,16 @@ const Contracts = { abi: require("@/assets/abis/L2StandardERC20Gateway.json"), env: "REACT_APP_L2_LIDO_GATEWAY_PROXY_ADDR", }, + [GatewayType.PUFFER_GATEWAY]: { + abi: require("@/assets/abis/L2StandardERC20Gateway.json"), + env: "REACT_APP_L2_PUFFER_GATEWAY_PROXY_ADDR", + }, SCROLL_MESSENGER: { abi: require("@/assets/abis/L2ScrollMessenger.json"), env: "REACT_APP_L2_SCROLL_MESSENGER" }, L1_GAS_PRICE_ORACLE: { abi: require("@/assets/abis/L1GasPriceOracle.json"), env: "REACT_APP_L1_GAS_PRICE_ORACLE" }, - L2_GAS_PRICE_ORACLE: { abi: require("@/assets/abis/L2GasPriceOracle.json"), env: "REACT_APP_L2_GAS_PRICE_ORACLE" }, + L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE: { + abi: require("@/assets/abis/L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE.json"), + env: "REACT_APP_L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE", + }, L1_GATEWAY_ROUTER_PROXY: { abi: require("@/assets/abis/L1_GATEWAY_ROUTER_PROXY_ADDR.json"), env: "REACT_APP_L1_GATEWAY_ROUTER_PROXY_ADDR" }, } @@ -97,8 +108,13 @@ export const usePriceFeeContext = () => { export const PriceFeeProvider = ({ children }) => { const { walletCurrentAddress, chainId } = useRainbowContext() - const [tokenSymbol] = useStorage(localStorage, BRIDGE_TOKEN_SYMBOL, ETH_SYMBOL) - const { networksAndSigners, tokenList } = useBrigeContext() + const [searchParams] = useSearchParams() + + const token = searchParams.get(BRIDGE_TOKEN) + const tokenSymbol = useMemo(() => token || ETH_SYMBOL, [token]) + + const { networksAndSigners } = useBridgeContext() + const { tokenList } = useBridgeStore() const [gasLimit, setGasLimit] = useState(BigInt(0)) const [gasPrice, setGasPrice] = useState(BigInt(0)) const [errorMessage, setErrorMessage] = useState("") @@ -109,7 +125,6 @@ export const PriceFeeProvider = ({ children }) => { if (chainId === CHAIN_ID.L1) { const price = await getGasPrice() const limit = await getGasLimit() - // console.log(price, limit, "gas price/limit") setGasPrice(price) setGasLimit(limit) } else { @@ -121,21 +136,21 @@ export const PriceFeeProvider = ({ children }) => { } } - useBlockNumber({ - // enabled: !!(networksAndSigners[CHAIN_ID.L1].signer && networksAndSigners[CHAIN_ID.L2].provider), - onBlock(blockNumber) { - fetchData() - .then(() => { - setErrorMessage("") - }) - .catch(error => { - //TODO: - // setGasLimit(null) - // setGasPrice(null) - setErrorMessage(trimErrorMessage(error.message)) - }) - }, - }) + const { data: blockNumber } = useBlockNumber({ watch: true }) + + useEffect(() => { + fetchData() + .then(() => { + setErrorMessage("") + }) + .catch(error => { + console.log("error", error) + //TODO: + // setGasLimit(null) + // setGasPrice(null) + setErrorMessage(trimErrorMessage(error.message)) + }) + }, [blockNumber]) const l1Token = useMemo( () => tokenList.find(item => item.chainId === CHAIN_ID.L1 && item.symbol === tokenSymbol) ?? ({} as any as Token), @@ -149,18 +164,18 @@ export const PriceFeeProvider = ({ children }) => { const getGasPrice = async () => { try { - const L2GasPriceOracleContract = getContract("L2_GAS_PRICE_ORACLE", networksAndSigners[CHAIN_ID.L1].provider) - const gasPrice = await L2GasPriceOracleContract.l2BaseFee() + const L1MessageQueueWithGasPriceOracleContract = getContract("L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE", networksAndSigners[CHAIN_ID.L1].provider) + const gasPrice = await L1MessageQueueWithGasPriceOracleContract.l2BaseFee() return (gasPrice * BigInt(120)) / BigInt(100) } catch (err) { - // console.log(err) + console.log("err", err) throw new Error("Failed to get gas price") } } const getGasLimit = async () => { if (l2Token.symbol === ETH_SYMBOL) { - return await getGasLimitGeneric(requireEnv(`REACT_APP_L1_ETH_GATEWAY_PROXY_ADDR`)) + return await getGasLimitGeneric("ETH_GATEWAY") } const { provider } = networksAndSigners[CHAIN_ID.L2] @@ -192,7 +207,7 @@ export const PriceFeeProvider = ({ children }) => { amount, "0x", ] - } else if (gatewayType === GatewayType.CUSTOM_ERC20_GATEWAY) { + } else if ([GatewayType.CUSTOM_ERC20_GATEWAY, GatewayType.PUFFER_GATEWAY].includes(gatewayType)) { finalizeDepositParams = [(l1Token as ERC20Token).address, (l2Token as ERC20Token).address, walletCurrentAddress, walletCurrentAddress, 0, "0x"] } else { finalizeDepositParams = [ @@ -221,23 +236,32 @@ export const PriceFeeProvider = ({ children }) => { const { provider: l1Provider } = networksAndSigners[CHAIN_ID.L1] const { provider: l2Provider } = networksAndSigners[CHAIN_ID.L2] const gatewayType = Address2GatewayType[l1GatewayAddress] - - const gateway = getContract(gatewayType, l2Provider) + let accountOrAddress1, accountOrAddress2, message const l2messenger = getContract("SCROLL_MESSENGER", l2Provider) const { finalizeDepositMethod, finalizeDepositParams } = messageDataGeneric(l1GatewayAddress) - const message = gateway.interface.encodeFunctionData(finalizeDepositMethod, finalizeDepositParams) - const l1Gateway = new ethers.Contract(l1GatewayAddress, Contracts[gatewayType].abi, l1Provider) - const l2GatewayAddress = await l1Gateway.counterpart() + + if ([GatewayType.ETH_GATEWAY].includes(gatewayType)) { + accountOrAddress1 = walletCurrentAddress + accountOrAddress2 = walletCurrentAddress + message = "0x" + } else { + const l1Gateway = new ethers.Contract(l1GatewayAddress, Contracts[gatewayType].abi, l1Provider) + const l2GatewayAddress = await l1Gateway.counterpart() + accountOrAddress1 = l1GatewayAddress + accountOrAddress2 = l2GatewayAddress + message = getContract(gatewayType, l2Provider).interface.encodeFunctionData(finalizeDepositMethod, finalizeDepositParams) + } const calldata = l2messenger.interface.encodeFunctionData("relayMessage", [ - l1GatewayAddress, // l1 gateway - l2GatewayAddress, // l2 gateway + accountOrAddress1, + accountOrAddress2, [GatewayType.ETH_GATEWAY, GatewayType.WETH_GATEWAY].includes(gatewayType) ? amount : 0, ethers.MaxUint256, message, ]) + try { const gaslimit = await l2Provider.estimateGas({ from: "0x" + (BigInt(requireEnv("REACT_APP_L1_SCROLL_MESSENGER")) + (BigInt(OFFSET) % BigInt(Math.pow(2, 160)))).toString(16), diff --git a/src/contexts/RainbowProvider/configs.tsx b/src/contexts/RainbowProvider/configs.tsx index 8904b10fc..d5c39cf0e 100644 --- a/src/contexts/RainbowProvider/configs.tsx +++ b/src/contexts/RainbowProvider/configs.tsx @@ -1,68 +1,41 @@ -import { Chain, Wallet } from "@rainbow-me/rainbowkit" -import "@rainbow-me/rainbowkit/styles.css" +import { getDefaultConfig } from "@rainbow-me/rainbowkit" import { - braveWallet, + bitgetWallet, + coin98Wallet, coinbaseWallet, - frameWallet, - imTokenWallet, - injectedWallet, - metaMaskWallet, // okxWallet, + metaMaskWallet, + nestWallet, + okxWallet, rabbyWallet, - rainbowWallet, - safeWallet, + tokenPocketWallet, + trustWallet, walletConnectWallet, + zerionWallet, } from "@rainbow-me/rainbowkit/wallets" +import { Chain, mainnet, scroll, scrollSepolia, sepolia } from "@wagmi/core/chains" import { parseUnits } from "ethers" import produce from "immer" -import { configureChains, mainnet, sepolia } from "wagmi" -import { jsonRpcProvider } from "wagmi/providers/jsonRpc" -import { publicProvider } from "wagmi/providers/public" -import { CHAIN_ID, ETH_SYMBOL, L2_NAME, RPC_URL } from "@/constants" -import { networkType, requireEnv } from "@/utils" +import { RPC_URL } from "@/constants" +import { requireEnv } from "@/utils" -interface WalletConfig { - name: string - wallet: Wallet - visible: boolean - fixedWallet?: boolean -} +import { BinanceWallet } from "./walletConnectors/binanceWallet/binanceWallet" -const createWalletConfig = (name: string, walletFunction: () => Wallet, condition: boolean, fixedWallet?: boolean): WalletConfig => { - return { - name, - wallet: walletFunction(), - visible: condition, - fixedWallet, - } -} +const projectId = requireEnv("REACT_APP_CONNECT_WALLET_PROJECT_ID") -export const scrollChain: Chain = { - id: CHAIN_ID.L2, - name: L2_NAME, - network: L2_NAME, - iconUrl: "https://scroll.io/logo.png", - iconBackground: "#fff", - nativeCurrency: { - decimals: 18, - name: L2_NAME, - symbol: ETH_SYMBOL, - }, - rpcUrls: { - default: { - http: [RPC_URL.L2], - }, - public: { - http: [RPC_URL.L2], - }, +const wallets = [ + { + groupName: "Popular", + wallets: [metaMaskWallet, coinbaseWallet, rabbyWallet, okxWallet, zerionWallet, trustWallet, BinanceWallet], }, - blockExplorers: { - default: { name: "Scrollscan", url: requireEnv("REACT_APP_EXTERNAL_EXPLORER_URI_L2") }, + { + groupName: "More", + wallets: [bitgetWallet, nestWallet, coin98Wallet, tokenPocketWallet, walletConnectWallet], }, -} +] const sepoliaChain = produce(sepolia, draft => { - draft.rpcUrls.public.http = [RPC_URL.L1 as any] + draft.rpcUrls.default.http = [RPC_URL.L1 as any] draft.fees = { // adopt MetaMask params baseFeeMultiplier: 1, @@ -73,7 +46,7 @@ const sepoliaChain = produce(sepolia, draft => { }) const mainnetChain = produce(mainnet, draft => { - draft.rpcUrls.public.http = [RPC_URL.L1 as any] + draft.rpcUrls.default.http = [RPC_URL.L1 as any] draft.fees = { // adopt MetaMask params baseFeeMultiplier: 1, @@ -84,69 +57,9 @@ const mainnetChain = produce(mainnet, draft => { } }) -const projectId = requireEnv("REACT_APP_CONNECT_WALLET_PROJECT_ID") - -const { chains, publicClient } = configureChains( - // ankr - [mainnetChain, sepoliaChain, scrollChain], - [ - publicProvider(), - jsonRpcProvider({ - rpc: chain => ({ http: chain.rpcUrls.default.http[0] }), - }), - ], -) - -const walletConfigs: WalletConfig[] = [ - createWalletConfig("MetaMask", () => metaMaskWallet({ chains, projectId }), window.ethereum?.isMetaMask === true, true), - createWalletConfig("Coinbase", () => coinbaseWallet({ appName: "Scroll", chains }), window.ethereum?.isCoinbaseWallet === true, true), - createWalletConfig("Brave", () => braveWallet({ chains }), window.ethereum?.isBraveWallet === true), - createWalletConfig("Rainbow", () => rainbowWallet({ chains, projectId }), window.ethereum?.isRainbow === true), - createWalletConfig("Safe", () => safeWallet({ chains }), window.ethereum?.isSafeWallet === true), - createWalletConfig("Frame", () => frameWallet({ chains }), window.ethereum?.isFrame === true), - createWalletConfig("imToken", () => imTokenWallet({ chains, projectId }), window.ethereum?.isImToken === true), - // createWalletConfig("Okx Wallet", () => okxWallet({ chains, projectId }), window.okxwallet?.isOKExWallet || window.okxwallet?.isOkxWallet === true), - createWalletConfig("Rabby", () => rabbyWallet({ chains }), window.ethereum?.isRabby && !window.ethereum?.isMetaMask === true), - // Add any additional wallets here -] - -const sortWallets = (a, b) => { - if (a.visible === b.visible) return 0 - if (a.visible || a.fixedWallet) return -1 - return 1 -} - -const activeWallets: Wallet[] = walletConfigs - .filter(wallet => wallet.visible || wallet.fixedWallet) - .sort(sortWallets) - .map(wallet => wallet.wallet) - -const Wallets = [ - // TODO: rainbowkit/injectedWallet.ts "Browser Wallet" and "injectedWallet.svg" -> need to detect automaticlly - injectedWallet({ chains }), - ...activeWallets, - walletConnectWallet({ - projectId, - chains, - options: { - metadata: { - name: "Scroll", - description: `Get started with our ${networkType} now.`, - url: "https://scroll.io/", - icons: ["https://scroll.io/logo_walletconnect.png"], - }, - qrModalOptions: { - explorerRecommendedWalletIds: [ - // metamask - "c57ca95b47569778a828d19178114f4db188b89b763c899ba0be274e97267d96", - // trust - "4622a2b2d6af1c9844944291e5e7351a6aa24cd7b23099efac1b2fd875da31a0", - // uniswap - "c03dfee351b6fcc421b4494ea33b9d4b92a984f87aa76d1663bb28705e95034a", - ], - }, - }, - } as any), -] - -export { Wallets, chains, publicClient } +export const config = getDefaultConfig({ + wallets, + appName: "Scroll", + projectId, + chains: [mainnetChain, sepoliaChain as unknown as Chain, scroll, scrollSepolia], +}) diff --git a/src/contexts/RainbowProvider/index.tsx b/src/contexts/RainbowProvider/index.tsx index c4506f76a..0b28e86f3 100644 --- a/src/contexts/RainbowProvider/index.tsx +++ b/src/contexts/RainbowProvider/index.tsx @@ -1,14 +1,14 @@ -import { RainbowKitProvider, connectorsForWallets, useConnectModal } from "@rainbow-me/rainbowkit" +import { RainbowKitProvider, useConnectModal } from "@rainbow-me/rainbowkit" import "@rainbow-me/rainbowkit/styles.css" -import { type WalletClient } from "@wagmi/core" -import { BrowserProvider, ethers } from "ethers" +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" +import { BrowserProvider } from "ethers" import { createContext, useCallback, useContext, useMemo } from "react" -import { WagmiConfig, createConfig, useAccount, useDisconnect, useNetwork, useWalletClient } from "wagmi" +import { type Config, WagmiProvider, useAccount, useConnectorClient, useDisconnect } from "wagmi" -import { Wallets, chains, publicClient } from "./configs" +import { config } from "./configs" type RainbowContextProps = { - provider: ethers.BrowserProvider | null + provider: BrowserProvider | null walletCurrentAddress?: `0x${string}` chainId?: number connect: () => void @@ -19,20 +19,9 @@ type RainbowContextProps = { const RainbowContext = createContext(undefined) -const connectors = connectorsForWallets([ - { - groupName: "Popular", - wallets: Wallets, - }, -]) +const queryClient = new QueryClient() -const wagmiConfig = createConfig({ - autoConnect: true, - connectors, - publicClient, -}) - -function walletClientToSigner(walletClient: WalletClient) { +function clientToProvider(walletClient) { const { chain, transport } = walletClient const network = { chainId: chain.id, @@ -45,33 +34,33 @@ function walletClientToSigner(walletClient: WalletClient) { const RainbowProvider = props => { return ( - - - {props.children} - - + + + + {props.children} + + + ) } const Web3ContextProvider = props => { - const { data: walletClient } = useWalletClient() + const { connector: activeConnector, address, isConnected, chainId } = useAccount() + const { data: client } = useConnectorClient({ chainId }) const { openConnectModal } = useConnectModal() const { disconnect } = useDisconnect() - const { connector: activeConnector, address, isConnected } = useAccount() - const { chain } = useNetwork() - const provider = useMemo(() => { - if (walletClient && chain && chain.id === walletClient.chain.id) return walletClientToSigner(walletClient) + if (client && chainId && chainId === client.chain?.id) return clientToProvider(client) return null - }, [walletClient, chain]) + }, [client, chainId]) const checkConnectedChainId = useCallback( - chainId => { - return isConnected && chain?.id === chainId + id => { + return isConnected && chainId === id }, - [isConnected, chain], + [isConnected, chainId], ) return ( @@ -80,7 +69,7 @@ const Web3ContextProvider = props => { provider, walletCurrentAddress: address, walletName: activeConnector?.name, - chainId: chain?.id, + chainId, connect: openConnectModal as () => void, disconnect, checkConnectedChainId, diff --git a/src/contexts/RainbowProvider/walletConnectors/binanceWallet/binanceWallet.svg b/src/contexts/RainbowProvider/walletConnectors/binanceWallet/binanceWallet.svg new file mode 100644 index 000000000..3c67f678d --- /dev/null +++ b/src/contexts/RainbowProvider/walletConnectors/binanceWallet/binanceWallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/contexts/RainbowProvider/walletConnectors/binanceWallet/binanceWallet.ts b/src/contexts/RainbowProvider/walletConnectors/binanceWallet/binanceWallet.ts new file mode 100644 index 000000000..5aea0f651 --- /dev/null +++ b/src/contexts/RainbowProvider/walletConnectors/binanceWallet/binanceWallet.ts @@ -0,0 +1,55 @@ +import { RainbowKitWalletConnectParameters, Wallet, getWalletConnectConnector } from "@rainbow-me/rainbowkit" + +import { isAndroid } from "@/utils" + +export interface DefaultWalletOptions { + projectId: string + walletConnectParameters?: RainbowKitWalletConnectParameters +} + +export type BinanceWalletOptions = DefaultWalletOptions + +export const BinanceWallet = ({ projectId, walletConnectParameters }: BinanceWalletOptions): Wallet => ({ + id: "binance", + name: "Binance Wallet", + iconUrl: async () => (await import("./binanceWallet.svg")).default, + iconBackground: "#000000", + downloadUrls: { + android: "https://play.google.com/store/apps/details?id=com.binance.dev", + ios: "https://apps.apple.com/us/app/id1436799971", + mobile: "https://www.binance.com/en/download", + qrCode: "https://www.binance.com/en/web3wallet", + }, + mobile: { + getUri: (uri: string) => { + return isAndroid() ? uri : `bnc://app.binance.com/cedefi/wc?uri=${encodeURIComponent(uri)}` + }, + }, + qrCode: { + getUri: (uri: string) => uri, + instructions: { + learnMoreUrl: "https://www.binance.com/en/web3wallet", + steps: [ + { + description: "wallet_connectors.binance.qr_code.step1.description", + step: "install", + title: "wallet_connectors.binance.qr_code.step1.title", + }, + { + description: "wallet_connectors.binance.qr_code.step2.description", + step: "create", + title: "wallet_connectors.binance.qr_code.step2.title", + }, + { + description: "wallet_connectors.binance.qr_code.step3.description", + step: "scan", + title: "wallet_connectors.binance.qr_code.step3.title", + }, + ], + }, + }, + createConnector: getWalletConnectConnector({ + projectId, + walletConnectParameters, + }), +}) diff --git a/src/hooks/useAddToken.ts b/src/hooks/useAddToken.ts index 767612d7b..1ad8cc16b 100644 --- a/src/hooks/useAddToken.ts +++ b/src/hooks/useAddToken.ts @@ -6,7 +6,8 @@ import L1_erc20ABI from "@/assets/abis/L1_erc20ABI.json" import L2_GATEWAY_ROUTER_PROXY_ABI from "@/assets/abis/L2_GATEWAY_ROUTER_PROXY_ADDR.json" import { CHAIN_ID, GATEWAY_ROUTE_PROXY_ADDR } from "@/constants" import { USER_TOKEN_LIST } from "@/constants/storageKey" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" +import useBridgeStore from "@/stores/bridgeStore" import { loadState, saveState } from "@/utils/localStorage" export enum TOKEN_LEVEL { @@ -16,7 +17,8 @@ export enum TOKEN_LEVEL { } const useAddToken = () => { - const { networksAndSigners, refreshTokenList } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() + const { fetchTokenList } = useBridgeStore() const [isLoading, setIsLoading] = useState(false) const getProvider = chainId => networksAndSigners[chainId].provider @@ -50,7 +52,7 @@ const useAddToken = () => { } const l1TokenDetails = await getTokenDetails(l1TokenContract) - + console.log(l1TokenDetails, "l1TokenDetails") const l2TokenDetails = await getTokenDetails(l2TokenContract) const l1Token = { @@ -85,7 +87,7 @@ const useAddToken = () => { currentUserTokens.push(token) } saveState(USER_TOKEN_LIST, currentUserTokens) - refreshTokenList() + fetchTokenList() } return { loading: isLoading, addToken } diff --git a/src/hooks/useApprove.ts b/src/hooks/useApprove.ts index 49d51f20b..c85ffd42f 100644 --- a/src/hooks/useApprove.ts +++ b/src/hooks/useApprove.ts @@ -2,21 +2,31 @@ import { ethers } from "ethers" import { useCallback, useEffect, useMemo, useState } from "react" import L1_erc20ABI from "@/assets/abis/L1_erc20ABI.json" -import { GATEWAY_ROUTE_PROXY_ADDR, USDC_GATEWAY_PROXY_ADDR, USDC_SYMBOL, WETH_GATEWAY_PROXY_ADDR, WETH_SYMBOL } from "@/constants" +import { + BATCH_BRIDGE_GATEWAY_PROXY_ADDR, + BATCH_DEPOSIT_TOKENS, + GATEWAY_ROUTE_PROXY_ADDR, + USDC_GATEWAY_PROXY_ADDR, + USDC_SYMBOL, + WETH_GATEWAY_PROXY_ADDR, + WETH_SYMBOL, +} from "@/constants" import { CHAIN_ID } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" +import useBatchBridgeStore, { BridgeSummaryType, DepositBatchMode } from "@/stores/batchBridgeStore" import { amountToBN } from "@/utils" const useApprove = (fromNetwork, selectedToken, amount) => { const { walletCurrentAddress, chainId } = useRainbowContext() - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() + const { bridgeSummaryType, depositBatchMode } = useBatchBridgeStore() const [isLoading, setIsLoading] = useState(false) const [isRequested, setIsRequested] = useState(false) const [error, setError] = useState(null) - const [isNeeded, setIsNeeded] = useState() + const [isNeeded, setIsNeeded] = useState() const approveAddress = useMemo(() => { if (!fromNetwork.isL1 && selectedToken.symbol === WETH_SYMBOL) return WETH_GATEWAY_PROXY_ADDR[fromNetwork.chainId] @@ -51,10 +61,17 @@ const useApprove = (fromNetwork, selectedToken, amount) => { const parsedAmount = amountToBN(amount, selectedToken.decimals) const approvedAmount = await tokenInstance.allowance(walletCurrentAddress, approveAddress) - if (approvedAmount >= parsedAmount) { - return false + if (BATCH_DEPOSIT_TOKENS.includes(selectedToken.symbol)) { + let fastNeedApproval + let economyNeedApproval + + fastNeedApproval = parsedAmount > approvedAmount ? 2 : 0 + const approvedAmount2 = await tokenInstance.allowance(walletCurrentAddress, BATCH_BRIDGE_GATEWAY_PROXY_ADDR[fromNetwork.chainId]) + economyNeedApproval = parsedAmount > approvedAmount2 ? 1 : 0 + return fastNeedApproval | economyNeedApproval + } else { + return parsedAmount > approvedAmount } - return true } catch (err) { return undefined } @@ -75,7 +92,11 @@ const useApprove = (fromNetwork, selectedToken, amount) => { const toApproveAmount = isMaximum ? ethers.MaxUint256 : amountToBN(amount, selectedToken.decimals) try { - const tx = await tokenInstance.approve(approveAddress, toApproveAmount) + let proxyAddress = approveAddress + if (bridgeSummaryType === BridgeSummaryType.Selector && depositBatchMode === DepositBatchMode.Economy) { + proxyAddress = BATCH_BRIDGE_GATEWAY_PROXY_ADDR[fromNetwork.chainId] + } + const tx = await tokenInstance.approve(proxyAddress, toApproveAmount) setIsRequested(true) await tx?.wait() const needApproval = await checkApproval() @@ -90,7 +111,11 @@ const useApprove = (fromNetwork, selectedToken, amount) => { // TODO: test const cancelApproval = async () => { - const tx = await tokenInstance?.approve(approveAddress, 0) + let proxyAddress = approveAddress + if (bridgeSummaryType === BridgeSummaryType.Selector && depositBatchMode === DepositBatchMode.Economy) { + proxyAddress = BATCH_BRIDGE_GATEWAY_PROXY_ADDR[fromNetwork.chainId] + } + const tx = await tokenInstance?.approve(proxyAddress, 0) await tx?.wait() const needApproval = await checkApproval() setIsNeeded(needApproval) diff --git a/src/hooks/useAsyncMemo.tsx b/src/hooks/useAsyncMemo.tsx index d6857d0a7..2fa0b7508 100644 --- a/src/hooks/useAsyncMemo.tsx +++ b/src/hooks/useAsyncMemo.tsx @@ -5,6 +5,7 @@ import { shallowEquals } from "@/utils" function useAsyncMemo(factory: () => Promise, deps: DependencyList | undefined): T | undefined { const [res, setRes] = useState() const prevDependencies = useRef() + const lastCallId = useRef(0) useEffect(() => { if (shallowEquals(deps, prevDependencies.current)) { @@ -13,8 +14,11 @@ function useAsyncMemo(factory: () => Promise, deps: DependencyList | undef prevDependencies.current = deps const fetchRes = async () => { + const callId = ++lastCallId.current const _res = await factory() - setRes(_res) + if (callId === lastCallId.current) { + setRes(_res) + } } fetchRes() diff --git a/src/hooks/useBalance.tsx b/src/hooks/useBalance.tsx index 1bbeee80e..33c67f59b 100644 --- a/src/hooks/useBalance.tsx +++ b/src/hooks/useBalance.tsx @@ -2,12 +2,12 @@ import { ethers } from "ethers" import useSWR from "swr" import L1_erc20ABI from "@/assets/abis/L1_erc20ABI.json" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" const useBalance = (token: any, network?: any) => { const { walletCurrentAddress } = useRainbowContext() - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() async function fetchBalance({ provider, token, network, address }) { try { diff --git a/src/hooks/useBlockNumbers.ts b/src/hooks/useBlockNumbers.ts index 38b7c4c8d..ad95132e6 100644 --- a/src/hooks/useBlockNumbers.ts +++ b/src/hooks/useBlockNumbers.ts @@ -5,6 +5,7 @@ import useSWR from "swr" import { CHAIN_ID } from "@/constants" import { BLOCK_NUMBERS } from "@/constants/storageKey" +import { config } from "@/contexts/RainbowProvider/configs" const useBlockNumbers = () => { const [blockNumbers, setBlockNumbers] = useStorage(localStorage, BLOCK_NUMBERS, [-1, -1]) @@ -12,8 +13,8 @@ const useBlockNumbers = () => { const [isL2Available, setIsL2Available] = useState(true) const fetchBlockNumber = async () => { - const fetchL1BlockNumber = getPublicClient({ chainId: CHAIN_ID.L1 }).getBlock({ blockTag: "finalized" }) - const fetchL2BlockNumber = getPublicClient({ chainId: CHAIN_ID.L2 }).getBlock({ blockTag: "latest" }) + const fetchL1BlockNumber = getPublicClient(config, { chainId: CHAIN_ID.L1 })!.getBlock({ blockTag: "finalized" }) + const fetchL2BlockNumber = getPublicClient(config, { chainId: CHAIN_ID.L2 })!.getBlock({ blockTag: "latest" }) const blockNumbers = await Promise.allSettled([fetchL1BlockNumber, fetchL2BlockNumber]) return blockNumbers.map(item => (item.status === "fulfilled" ? Number(item.value.number) : item.reason)) } diff --git a/src/hooks/useClaim.ts b/src/hooks/useClaim.ts index ce52ffcdd..736e97b6d 100644 --- a/src/hooks/useClaim.ts +++ b/src/hooks/useClaim.ts @@ -2,7 +2,7 @@ import { ethers } from "ethers" import { useState } from "react" import L1ScrollMessenger from "@/assets/abis/L1ScrollMessenger.json" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" import useTxStore from "@/stores/txStore" import { CLAIM_OFFSET_TIME } from "@/stores/utils" @@ -10,7 +10,7 @@ import { requireEnv } from "@/utils" export function useClaim(props) { const { tx } = props - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() const [loading, setLoading] = useState(false) const { addEstimatedTimeMap } = useTxStore() const { chainId } = useRainbowContext() diff --git a/src/hooks/useEstimateBatchDeposit.ts b/src/hooks/useEstimateBatchDeposit.ts new file mode 100644 index 000000000..ec0360781 --- /dev/null +++ b/src/hooks/useEstimateBatchDeposit.ts @@ -0,0 +1,61 @@ +import { CHAIN_ID } from "@/constants" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useBatchBridgeStore from "@/stores/batchBridgeStore" + +type TxOptions = { + value: bigint + maxFeePerGas?: bigint | null + maxPriorityFeePerGas?: bigint | null +} + +export function useEstimateBatchDeposit(props) { + const { fromNetwork, selectedToken } = props + const { checkConnectedChainId, walletCurrentAddress } = useRainbowContext() + const { batchDepositConfig } = useBatchBridgeStore() + + const { networksAndSigners } = useBridgeContext() + + const depositETH = async () => { + const options: TxOptions = { + value: batchDepositConfig.minAmountPerTx + batchDepositConfig.feeAmountPerTx, + } + + return networksAndSigners[CHAIN_ID.L1].batchBridgeGateway.depositETH.estimateGas(options) + } + + const depositERC20 = async () => { + return networksAndSigners[CHAIN_ID.L1].batchBridgeGateway.depositERC20.estimateGas( + selectedToken.address, + batchDepositConfig.minAmountPerTx + batchDepositConfig.feeAmountPerTx, + ) + } + + const estimateSend = async () => { + const isNetworkConnected = await checkConnectedChainId(fromNetwork.chainId) + if (!isNetworkConnected) return BigInt(0) + const nativeTokenBalance = await networksAndSigners[fromNetwork.chainId].provider.getBalance(walletCurrentAddress) + if (!nativeTokenBalance) { + return null + } else if (fromNetwork.isL1 && batchDepositConfig.minAmountPerTx) { + return await estimateSendL1ToL2() + } + return BigInt(0) + } + + const estimateSendL1ToL2 = () => { + try { + if (selectedToken.native) { + return depositETH() + } else { + return depositERC20() + } + } catch (error) { + console.error("estimateSendL1ToL2", error) + } + } + + return { + estimateSend, + } +} diff --git a/src/hooks/useEstimateSendTransaction.ts b/src/hooks/useEstimateSendTransaction.ts index 3bb53ba32..8f4fe3c29 100644 --- a/src/hooks/useEstimateSendTransaction.ts +++ b/src/hooks/useEstimateSendTransaction.ts @@ -1,7 +1,7 @@ import { useEffect, useState } from "react" import { CHAIN_ID } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { usePriceFeeContext } from "@/contexts/PriceFeeProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" @@ -10,35 +10,38 @@ export function useEstimateSendTransaction(props) { const { checkConnectedChainId, walletCurrentAddress } = useRainbowContext() const { gasLimit, gasPrice } = usePriceFeeContext() - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() const [instance, setInstance] = useState(null) const minimumAmount = BigInt(1) useEffect(() => { - const gateway = networksAndSigners[fromNetwork.isL1 ? CHAIN_ID.L1 : CHAIN_ID.L2].gateway - if (gateway) { - setInstance(gateway) + const instance = selectedToken.native + ? networksAndSigners[fromNetwork.isL1 ? CHAIN_ID.L1 : CHAIN_ID.L2].scrollMessenger + : networksAndSigners[fromNetwork.isL1 ? CHAIN_ID.L1 : CHAIN_ID.L2].gateway + if (instance) { + setInstance(instance) } - }, [networksAndSigners, fromNetwork]) + }, [networksAndSigners, fromNetwork, selectedToken.native]) const depositETH = async () => { const fee = gasPrice * gasLimit - return instance["depositETH(uint256,uint256)"].estimateGas(minimumAmount, gasLimit, { + return instance["sendMessage(address,uint256,bytes,uint256)"].estimateGas(walletCurrentAddress, minimumAmount, "0x", gasLimit, { value: minimumAmount + fee, }) } const depositERC20 = async () => { const fee = gasPrice * gasLimit + return instance["depositERC20(address,uint256,uint256)"].estimateGas(selectedToken.address, minimumAmount, gasLimit, { value: fee, }) } const withdrawETH = async () => { - return instance["withdrawETH(uint256,uint256)"].estimateGas(minimumAmount, 0, { + return instance["sendMessage(address,uint256,bytes,uint256)"].estimateGas(walletCurrentAddress, minimumAmount, "0x", 0, { value: minimumAmount, }) } @@ -79,5 +82,6 @@ export function useEstimateSendTransaction(props) { return { estimateSend, + instance, } } diff --git a/src/hooks/useGasFee.ts b/src/hooks/useGasFee.ts index 21bb9e9e4..f55d5540d 100644 --- a/src/hooks/useGasFee.ts +++ b/src/hooks/useGasFee.ts @@ -1,87 +1,140 @@ import { getPublicClient } from "@wagmi/core" -import { useState } from "react" +import { isNumber } from "lodash" +import { useCallback, useEffect, useState } from "react" import { useBlockNumber } from "wagmi" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { BATCH_DEPOSIT_TOKENS } from "@/constants" +// import { useBridgeContext } from "@/contexts/BridgeContextProvider" +// import { useBridgeContext } from "@/contexts/BridgeContextProvider" +import { usePriceFeeContext } from "@/contexts/PriceFeeProvider" +import { config } from "@/contexts/RainbowProvider/configs" +import { DepositBatchMode } from "@/stores/batchBridgeStore" import useBridgeStore from "@/stores/bridgeStore" -import { trimErrorMessage } from "@/utils" +import { checkApproved, trimErrorMessage } from "@/utils" +import { useEstimateBatchDeposit } from "./useEstimateBatchDeposit" import { useEstimateSendTransaction } from "./useEstimateSendTransaction" const useGasFee = (selectedToken, needApproval) => { - const { networksAndSigners } = useBrigeContext() const { fromNetwork, toNetwork } = useBridgeStore() - const { estimateSend } = useEstimateSendTransaction({ + const { gasLimit: priceFeeGasLimit, gasPrice: priceFeeGasPrice } = usePriceFeeContext() + + const { estimateSend, instance } = useEstimateSendTransaction({ + fromNetwork, + toNetwork, + selectedToken, + }) + + const { estimateSend: estimateBatchDeposit } = useEstimateBatchDeposit({ fromNetwork, toNetwork, selectedToken, }) const [gasFee, setGasFee] = useState(null) + const [batchDepositGasFee, setBatchDepositGasFee] = useState(null) const [gasLimit, setGasLimit] = useState(null) + const [gasLimitBatch, setGasLimitBatch] = useState(null) const [enlargedGasLimit, setEnlargedGasLimit] = useState(null) const [maxFeePerGas, setMaxFeePerGas] = useState(null) const [maxPriorityFeePerGas, setMaxPriorityFeePerGas] = useState(null) const [error, setError] = useState("") - const calculateGasFee = async () => { - let gasPrice - let priorityFee - // scroll not support EIP-1559 + const { data: blockNumber } = useBlockNumber({ watch: true }) - if (fromNetwork.isL1) { - const { maxFeePerGas, maxPriorityFeePerGas } = await getPublicClient({ chainId: fromNetwork.chainId }).estimateFeesPerGas() - gasPrice = maxFeePerGas as bigint - priorityFee = maxPriorityFeePerGas as bigint - } else { - const { gasPrice: legacyGasPrice } = await getPublicClient({ chainId: fromNetwork.chainId }).estimateFeesPerGas({ type: "legacy" }) - gasPrice = legacyGasPrice as bigint - priorityFee = null - } - const gasLimit = await estimateSend() - if (gasLimit === null) { + const calculateGasFee = useCallback(async () => { + if ( + (needApproval === false || (isNumber(needApproval) && needApproval !== 3)) && + instance && + ((priceFeeGasPrice && priceFeeGasLimit) || !fromNetwork.isL1) && + blockNumber + ) { + let gasPrice + let priorityFee + let gasLimitBatch + // scroll not support EIP-1559 + + if (fromNetwork.isL1) { + const { maxFeePerGas, maxPriorityFeePerGas } = await getPublicClient(config, { chainId: fromNetwork.chainId })!.estimateFeesPerGas() + gasPrice = maxFeePerGas as bigint + priorityFee = maxPriorityFeePerGas as bigint + } else { + const { gasPrice: legacyGasPrice } = await getPublicClient(config, { chainId: fromNetwork.chainId })!.estimateFeesPerGas({ type: "legacy" }) + gasPrice = legacyGasPrice as bigint + priorityFee = null + } + const gasLimit = checkApproved(needApproval, DepositBatchMode.Fast) ? await estimateSend() : BigInt(0) + + try { + gasLimitBatch = + checkApproved(needApproval, DepositBatchMode.Economy) && BATCH_DEPOSIT_TOKENS.includes(selectedToken.symbol) + ? await estimateBatchDeposit() + : BigInt(0) + } catch (error) { + gasLimitBatch = 100000n + } + + if (gasLimit === null) { + return { + gasLimit: null, + gasLimitBatch: null, + batchDepositGasFee: null, + enlargedGasLimit: null, + gasFee: null, + gasPrice, + maxPriorityFeePerGas: priorityFee, + } + } + const estimatedGasCost = (gasLimit as bigint) * (gasPrice || BigInt(1e9)) + const estimatedBatchDepositGasCost = (gasLimitBatch as bigint) * (gasPrice || BigInt(1e9)) + const enlargedGasLimit = (gasLimit * BigInt(120)) / BigInt(100) return { - gasLimit: null, - enlargedGasLimit: null, - gasFee: null, + gasLimit, + gasLimitBatch, + enlargedGasLimit, + gasFee: estimatedGasCost, + batchDepositGasFee: estimatedBatchDepositGasCost, gasPrice, maxPriorityFeePerGas: priorityFee, } } - const estimatedGasCost = (gasLimit as bigint) * (gasPrice || BigInt(1e9)) - const enlargedGasLimit = (gasLimit * BigInt(120)) / BigInt(100) return { - gasLimit, - enlargedGasLimit, - gasFee: estimatedGasCost, - gasPrice, - maxPriorityFeePerGas: priorityFee, + gasLimit: null, + gasLimitBatch: null, + enlargedGasLimit: null, + gasFee: null, + batchDepositGasFee: null, + gasPrice: null, + maxPriorityFeePerGas: null, } - } + }, [blockNumber, needApproval, priceFeeGasPrice, priceFeeGasLimit, instance]) - useBlockNumber({ - enabled: !!networksAndSigners[fromNetwork.chainId].provider && needApproval === false, - onBlock(blockNumber) { - calculateGasFee() - .then(value => { - setGasFee(value.gasFee) - setGasLimit(value.gasLimit) - setEnlargedGasLimit(value.enlargedGasLimit) - setMaxFeePerGas(value.gasPrice) - setMaxPriorityFeePerGas(value.maxPriorityFeePerGas) - setError("") - }) - .catch(error => { - setGasFee(null) - setGasLimit(null) - setEnlargedGasLimit(null) - setMaxFeePerGas(null) - setMaxPriorityFeePerGas(null) - setError(trimErrorMessage(error.message)) - }) - }, - }) - return { enlargedGasLimit, gasLimit, gasFee, error, calculateGasFee, maxFeePerGas, maxPriorityFeePerGas } + useEffect(() => { + calculateGasFee() + .then(({ gasLimit, enlargedGasLimit, gasFee, gasPrice, maxPriorityFeePerGas, batchDepositGasFee, gasLimitBatch }) => { + setGasLimit(gasLimit) + setGasLimitBatch(gasLimitBatch) + setEnlargedGasLimit(enlargedGasLimit) + setGasFee(gasFee) + setBatchDepositGasFee(batchDepositGasFee) + setMaxFeePerGas(gasPrice) + setMaxPriorityFeePerGas(maxPriorityFeePerGas) + setError("") + }) + .catch(error => { + setGasLimit(null) + setGasLimitBatch(null) + setEnlargedGasLimit(null) + setGasFee(null) + setBatchDepositGasFee(null) + setMaxFeePerGas(null) + setMaxPriorityFeePerGas(null) + setError(trimErrorMessage(error.message)) + throw error + }) + }, [calculateGasFee]) + + return { enlargedGasLimit, gasLimit, gasLimitBatch, gasFee, error, calculateGasFee, maxFeePerGas, maxPriorityFeePerGas, batchDepositGasFee } } export default useGasFee diff --git a/src/hooks/useImagesLoaded.tsx b/src/hooks/useImagesLoaded.tsx new file mode 100644 index 000000000..76a3669d9 --- /dev/null +++ b/src/hooks/useImagesLoaded.tsx @@ -0,0 +1,34 @@ +import { useEffect, useState } from "react" + +function useImagesLoaded(imageUrls) { + const [allLoaded, setAllLoaded] = useState(false) + + useEffect(() => { + let images: HTMLImageElement[] = [] + let loadedCount = 0 + + const imageLoaded = () => { + loadedCount++ + if (loadedCount === imageUrls.length) { + setAllLoaded(true) + } + } + + imageUrls.forEach(url => { + const img = new Image() + img.src = url + img.onload = imageLoaded + images.push(img) + }) + + return () => { + images.forEach(img => { + img.onload = null + }) + } + }, [imageUrls]) + + return { allLoaded } +} + +export default useImagesLoaded diff --git a/src/hooks/useInputAddress.ts b/src/hooks/useInputAddress.ts new file mode 100644 index 000000000..e674b8bb1 --- /dev/null +++ b/src/hooks/useInputAddress.ts @@ -0,0 +1,131 @@ +import { isAddress } from "ethers" +import { identity } from "lodash" +import { useEffect } from "react" +import { namehash, normalize } from "viem/ens" +import { create } from "zustand" + +import { getEnsAddressURL } from "@/apis/ens" + +/** + * Fetches Ethereum address for an ENS name + * @param ens ENS name to resolve + * @returns Resolved Ethereum address or null if not found + */ +async function getEnsAddress(ens: string): Promise { + return await scrollRequest(getEnsAddressURL(ens)).then(data => data?.address) +} + +interface InputAddressStore { + inputValue: string + isValidInput: boolean + address: string | null + isValidAddress: boolean + ens: string | null + isValidEns: boolean + resolvingEns: boolean + ensServerError: string | null + validateAddress: () => void + validateEnsFormat: () => void + resolveEnsAddress: () => Promise + validateEns: () => Promise + setInputValue: (v: string) => void + setValidationStatus: () => void +} + +const useInputAddressStore = create((set, get) => ({ + inputValue: "", + isValidInput: true, + address: null, + isValidAddress: false, + ens: null, + isValidEns: false, + resolvingEns: false, + ensServerError: null, + validateAddress() { + const addr = get().inputValue.trim() + if (isAddress(addr)) set({ address: addr }) + else set({ address: null }) + }, + validateEnsFormat() { + set({ ens: null }) + const ens = get().inputValue.trim() + if (!ens.endsWith(".eth")) return + try { + namehash(normalize(ens)) + } catch (err) { + return + } + set({ ens }) + }, + async resolveEnsAddress() { + const { ens } = get() + if (!ens) return + set({ resolvingEns: true }) + const address = await getEnsAddress(ens).catch(() => set({ ensServerError: "Failed to fetch ENS address" })) + set({ resolvingEns: false }) + if (address !== undefined) return set({ ens, address, ensServerError: null }) + }, + async validateEns() { + set({ ensServerError: null, resolvingEns: false }) + + get().validateEnsFormat() + await get().resolveEnsAddress() + }, + async setInputValue(v) { + if (v === get().inputValue) return + set({ inputValue: v || "" }) + + get().validateAddress() + await get().validateEns() + get().setValidationStatus() + }, + setValidationStatus() { + const { inputValue, address, ens } = get() + // Empty input is valid + if (!inputValue) return set({ isValidAddress: false, isValidEns: false, isValidInput: true }) + // Valid address + ENS is valid + if (address && ens) return set({ isValidAddress: true, isValidEns: true, isValidInput: true }) + // Valid address but invalid ENS + if (address && !ens) return set({ isValidAddress: true, isValidEns: false, isValidInput: true }) + return set({ isValidAddress: false, isValidEns: false, isValidInput: false }) + }, +})) + +/** + * Hook for managing and validating Ethereum address/ENS input + * @param options.onValidAddress Callback when valid address is resolved + * @param options.onValidEnsName Callback when valid ENS name is resolved + * @returns Input address store state and methods + */ +export default function useInputAddress({ + onValidAddress = identity, + onValidEnsName = identity, + onAddressChange = identity, + onEnsChange = identity, +} = {}) { + const store = useInputAddressStore() + + useEffect(() => { + try { + if (store.address) { + onValidAddress(store.address) + onAddressChange(store.address) + } else { + onAddressChange(null) + } + } catch (err) {} + }, [store.address]) + + useEffect(() => { + try { + if (store.ens) { + onValidEnsName(store.ens) + onEnsChange(store.ens) + } else { + onEnsChange(null) + } + } catch (err) {} + }, [store.ens]) + + return store +} diff --git a/src/hooks/useLastFinalizedBatchIndex.tsx b/src/hooks/useLastFinalizedBatchIndex.tsx index 0b0ad8c17..4a2e34b3c 100644 --- a/src/hooks/useLastFinalizedBatchIndex.tsx +++ b/src/hooks/useLastFinalizedBatchIndex.tsx @@ -3,11 +3,11 @@ import useSWR from "swr" import ScrollChain from "@/assets/abis/ScrollChain.json" import { CHAIN_ID } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { requireEnv } from "@/utils" const useLastFinalizedBatchIndex = () => { - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() async function fetchLastFinalizedBatchIndex() { const provider = networksAndSigners[CHAIN_ID.L1].provider diff --git a/src/hooks/useMatchedRoute.tsx b/src/hooks/useMatchedRoute.tsx index c39db5d1d..aefd5a95d 100644 --- a/src/hooks/useMatchedRoute.tsx +++ b/src/hooks/useMatchedRoute.tsx @@ -9,7 +9,7 @@ export default function useMatchedRoute() { const normalizedPathname = pathname === "/" ? pathname : pathname.replace(/\/$/, "") for (const route of HomepageRoutes) { - if (matchPath((route as any).fullPath || route.path, normalizedPathname)) { + if (matchPath(route.path, normalizedPathname)) { return route } } diff --git a/src/hooks/useRetry.ts b/src/hooks/useRetry.ts index 81938985f..428943402 100644 --- a/src/hooks/useRetry.ts +++ b/src/hooks/useRetry.ts @@ -1,27 +1,29 @@ import { ethers } from "ethers" import { useState } from "react" -import L1MessageQueue from "@/assets/abis/L1MessageQueue.json" import L1ScrollMessenger from "@/assets/abis/L1ScrollMessenger.json" -import L2GasPriceOracle from "@/assets/abis/L2GasPriceOracle.json" +import L1MessageQueueWithGasPriceOracle from "@/assets/abis/L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE.json" import { CHAIN_ID } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import useTxStore from "@/stores/txStore" import { MAX_OFFSET_TIME } from "@/stores/utils" import { requireEnv } from "@/utils" export function useRetry(props) { const { hash } = props - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() const [loading, setLoading] = useState(false) const { addEstimatedTimeMap } = useTxStore() const replayMessage = async () => { const l2provider = networksAndSigners[CHAIN_ID.L2].provider const deployer = networksAndSigners[CHAIN_ID.L1].signer - const queue = new ethers.Contract(requireEnv("REACT_APP_L1_MESSAGE_QUEUE"), L1MessageQueue, deployer) const messenger = new ethers.Contract(requireEnv("REACT_APP_L1_SCROLL_MESSENGER"), L1ScrollMessenger, deployer) - const oracle = new ethers.Contract(requireEnv("REACT_APP_L2_GAS_PRICE_ORACLE"), L2GasPriceOracle, deployer) + const l1MessageQueueWithGasPriceOracleContract = new ethers.Contract( + requireEnv("REACT_APP_L1_MESSAGE_QUEUE_WITH_GAS_PRICE_ORACLE"), + L1MessageQueueWithGasPriceOracle, + deployer, + ) setLoading(true) try { @@ -31,7 +33,7 @@ export function useRetry(props) { for (const log of receipts.logs) { if (log.topics[0] === "0x69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e") { - const event = queue.interface.decodeEventLog("QueueTransaction", log.data, log.topics) + const event = l1MessageQueueWithGasPriceOracleContract.interface.decodeEventLog("QueueTransaction", log.data, log.topics) gasLimit = await l2provider.estimateGas({ from: event.sender, to: event.target, @@ -40,7 +42,7 @@ export function useRetry(props) { }) } else if (log.topics[0] === "0x104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e") { const event = messenger.interface.decodeEventLog("SentMessage", log.data, log.topics) - const gasPirce = await oracle.estimateCrossDomainMessageFee((gasLimit * BigInt(12)) / BigInt(10)) + const gasPirce = await l1MessageQueueWithGasPriceOracleContract.estimateCrossDomainMessageFee((gasLimit * BigInt(12)) / BigInt(10)) await messenger.replayMessage( event.sender, diff --git a/src/hooks/useSendTransaction.ts b/src/hooks/useSendTransaction.ts index 859203e14..273856faf 100644 --- a/src/hooks/useSendTransaction.ts +++ b/src/hooks/useSendTransaction.ts @@ -1,10 +1,11 @@ import { isError } from "ethers" import { useMemo, useState } from "react" -import { CHAIN_ID, NETWORKS, TX_STATUS } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { BATCH_BRIDGE_GATEWAY_PROXY_ADDR, CHAIN_ID, NETWORKS, SCROLL_MESSENGER_ADDR, TX_STATUS } from "@/constants" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { usePriceFeeContext } from "@/contexts/PriceFeeProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" +import useBatchBridgeStore, { BridgeSummaryType, DepositBatchMode } from "@/stores/batchBridgeStore" import useBridgeStore from "@/stores/bridgeStore" import useTxStore from "@/stores/txStore" import { isValidOffsetTime } from "@/stores/utils" @@ -16,15 +17,20 @@ type TxOptions = { value: bigint maxFeePerGas?: bigint | null maxPriorityFeePerGas?: bigint | null + gasLimit?: number | null } +const LOWER_BOUND = 1e5 + export function useSendTransaction(props) { - const { amount: fromTokenAmount, selectedToken } = props - const { walletCurrentAddress } = useRainbowContext() - const { networksAndSigners, blockNumbers } = useBrigeContext() - const { enlargedGasLimit: txGasLimit, maxFeePerGas, maxPriorityFeePerGas } = useGasFee(selectedToken, false) + const { amount: fromTokenAmount, selectedToken, receiver, needApproval } = props + const { walletCurrentAddress, provider } = useRainbowContext() + const { networksAndSigners, blockNumbers } = useBridgeContext() + const { enlargedGasLimit: txGasLimit, maxFeePerGas, maxPriorityFeePerGas, gasLimitBatch } = useGasFee(selectedToken, needApproval) const { addTransaction, addEstimatedTimeMap, removeFrontTransactions, updateTransaction } = useTxStore() const { fromNetwork, toNetwork, changeTxResult, changeWithdrawStep } = useBridgeStore() + const { bridgeSummaryType, depositBatchMode, batchDepositConfig } = useBatchBridgeStore() + const { gasLimit, gasPrice } = usePriceFeeContext() const [isLoading, setIsLoading] = useState(false) @@ -35,21 +41,32 @@ export function useSendTransaction(props) { return amountToBN(fromTokenAmount, selectedToken.decimals) }, [fromTokenAmount, selectedToken?.decimals]) + const checkIsContract = async contractAddress => { + if (!provider) throw new Error("provider is not defined") + const code = await provider.getCode(contractAddress) + if (code === "0x") throw new Error("You are connected to the wrong network. Please switch to the correct network and refresh.") + } + const send = async () => { setIsLoading(true) let tx - let currentBlockNumber + const isBatchMode = bridgeSummaryType === BridgeSummaryType.Selector && depositBatchMode === DepositBatchMode.Economy + // let currentBlockNumber try { - if (fromNetwork.isL1) { - currentBlockNumber = await networksAndSigners[CHAIN_ID.L1].provider.getBlockNumber() + if (isBatchMode) { + // currentBlockNumber = await networksAndSigners[CHAIN_ID.L1].provider.getBlockNumber() + tx = await batchSendL1ToL2() + } else if (fromNetwork.isL1) { + // currentBlockNumber = await networksAndSigners[CHAIN_ID.L1].provider.getBlockNumber() tx = await sendl1ToL2() } else if (!fromNetwork.isL1 && toNetwork.isL1) { - currentBlockNumber = await networksAndSigners[CHAIN_ID.L2].provider.getBlockNumber() + // currentBlockNumber = await networksAndSigners[CHAIN_ID.L2].provider.getBlockNumber() tx = await sendl2ToL1() } + // start to check tx replacement from current block number // TODO: shouldn't add it here(by @ricmoo) - tx = tx.replaceableTransaction(currentBlockNumber) + // tx = tx.replaceableTransaction(currentBlockNumber) handleTransaction(tx) tx.wait() @@ -63,7 +80,9 @@ export function useSendTransaction(props) { fromBlockNumber: receipt.blockNumber, }) if (fromNetwork.isL1) { - const estimatedOffsetTime = (receipt.blockNumber - blockNumbers[0]) * 12 * 1000 + const estimatedOffsetTime = isBatchMode + ? (receipt.blockNumber - blockNumbers[0]) * 12 * 1000 + 1000 * 60 * 10 + : (receipt.blockNumber - blockNumbers[0]) * 12 * 1000 if (isValidOffsetTime(estimatedOffsetTime)) { addEstimatedTimeMap(`from_${tx.hash}`, Date.now() + estimatedOffsetTime) } else { @@ -94,7 +113,9 @@ export function useSendTransaction(props) { hash: transactionHash, }) if (fromNetwork.isL1) { - const estimatedOffsetTime = (blockNumber - blockNumbers[0]) * 12 * 1000 + const estimatedOffsetTime = isBatchMode + ? (blockNumber - blockNumbers[0]) * 12 * 1000 + 1000 * 60 * 10 + : (blockNumber - blockNumbers[0]) * 12 * 1000 if (isValidOffsetTime(estimatedOffsetTime)) { addEstimatedTimeMap(`from_${transactionHash}`, Date.now() + estimatedOffsetTime) } else { @@ -118,6 +139,7 @@ export function useSendTransaction(props) { if (isError(error, "ACTION_REJECTED")) { setSendError("reject") } else { + console.log(error, "error") setSendError(error) } } @@ -151,7 +173,13 @@ export function useSendTransaction(props) { options.maxPriorityFeePerGas = maxPriorityFeePerGas } - return networksAndSigners[CHAIN_ID.L1].gateway["depositETH(uint256,uint256)"](parsedAmount, gasLimit, options) + return networksAndSigners[CHAIN_ID.L1].scrollMessenger["sendMessage(address,uint256,bytes,uint256)"]( + receiver || walletCurrentAddress, + parsedAmount, + "0x", + gasLimit, + options, + ) } const depositERC20 = async () => { @@ -165,22 +193,77 @@ export function useSendTransaction(props) { options.maxPriorityFeePerGas = maxPriorityFeePerGas } + if (receiver) { + return networksAndSigners[CHAIN_ID.L1].gateway["depositERC20(address,address,uint256,uint256)"]( + selectedToken.address, + receiver, + parsedAmount, + gasLimit, + options, + ) + } + return networksAndSigners[CHAIN_ID.L1].gateway["depositERC20(address,uint256,uint256)"](selectedToken.address, parsedAmount, gasLimit, options) } const withdrawETH = async () => { - return networksAndSigners[CHAIN_ID.L2].gateway["withdrawETH(uint256,uint256)"](parsedAmount, 0, { - value: parsedAmount, - gasLimit: txGasLimit, - }) + await checkIsContract(SCROLL_MESSENGER_ADDR[CHAIN_ID.L2]) + + return networksAndSigners[CHAIN_ID.L2].scrollMessenger["sendMessage(address,uint256,bytes,uint256)"]( + receiver || walletCurrentAddress, + parsedAmount, + "0x", + 0, + { + value: parsedAmount, + gasLimit: txGasLimit, + }, + ) } const withdrawERC20 = async () => { + if (receiver) { + return networksAndSigners[CHAIN_ID.L2].gateway["withdrawERC20(address,address,uint256,uint256)"]( + selectedToken.address, + receiver, + parsedAmount, + 0, + { + gasLimit: txGasLimit, + }, + ) + } return networksAndSigners[CHAIN_ID.L2].gateway["withdrawERC20(address,uint256,uint256)"](selectedToken.address, parsedAmount, 0, { gasLimit: txGasLimit, }) } + const batchDepositETH = async () => { + await checkIsContract(BATCH_BRIDGE_GATEWAY_PROXY_ADDR[CHAIN_ID.L1]) + + const options: TxOptions = { + value: parsedAmount + batchDepositConfig.feeAmountPerTx, + gasLimit: Math.max(Number(gasLimitBatch), LOWER_BOUND), + } + + return networksAndSigners[CHAIN_ID.L1].batchBridgeGateway.depositETH(options) + } + + const batchDepositERC20 = async () => { + // const options: TxOptions = { + // value: batchDepositConfig.feeAmountPerTx, + // } + return networksAndSigners[CHAIN_ID.L1].batchBridgeGateway.depositERC20(selectedToken.address, parsedAmount + batchDepositConfig.feeAmountPerTx) + } + + const batchSendL1ToL2 = () => { + if (selectedToken.native) { + return batchDepositETH() + } else { + return batchDepositERC20() + } + } + const sendl1ToL2 = () => { if (selectedToken.native) { return depositETH() diff --git a/src/hooks/useShowLanguageSelect.tsx b/src/hooks/useShowLanguageSelect.tsx new file mode 100644 index 000000000..50dd372cd --- /dev/null +++ b/src/hooks/useShowLanguageSelect.tsx @@ -0,0 +1,12 @@ +import { useMemo } from "react" +import { useLocation } from "react-router-dom" + +const useShowLanguageSelect = () => { + const { pathname } = useLocation() + + const showLanguageSelect = useMemo(() => pathname.startsWith("/blog"), [pathname]) + + return showLanguageSelect +} + +export default useShowLanguageSelect diff --git a/src/hooks/useShowScrolly.tsx b/src/hooks/useShowScrolly.tsx new file mode 100644 index 000000000..43e5e632c --- /dev/null +++ b/src/hooks/useShowScrolly.tsx @@ -0,0 +1,106 @@ +import { useQueryClient } from "@tanstack/react-query" +import { isEmpty, without } from "lodash" +import { useEffect, useState } from "react" +import { useNavigate } from "react-router-dom" +import useStorage from "squirrel-gill" + +import { CANVAS_SCROLLY_ID } from "@/constants/storageKey" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasProfileStore from "@/stores/canvasProfileStore" +import usePerkStore from "@/stores/perksStore" + +const useShowScrolly = () => { + const navigate = useNavigate() + const { walletCurrentAddress } = useRainbowContext() + const queryClient = useQueryClient() + + const { changePerksDialogVisible, firstSeePerks } = usePerkStore() + + const { changeEditProfileVisible } = useCanvasProfileStore() + + const [scrollyId, setScrollyId] = useStorage(localStorage, CANVAS_SCROLLY_ID, ["1canvas"]) + const [open, setOpen] = useState(false) + + const canvasAvatar = queryClient.getQueryData(["canvasAvatar", walletCurrentAddress]) + + useEffect(() => { + let nextScrollyId = [...scrollyId] + if (firstSeePerks && !scrollyId.includes("2perks")) { + nextScrollyId.push("2perks") + } else if (isEmpty(canvasAvatar) && !scrollyId.includes("3avatar") && !scrollyId.includes("3avatar-end")) { + nextScrollyId.push("3avatar") + } + + setScrollyId(nextScrollyId.sort()) + setOpen(scrollyList.map(item => item.id).includes(nextScrollyId[0])) + }, [firstSeePerks, canvasAvatar]) + + const scrollyList = [ + { + id: "1canvas", + content: ( + <> + Welcome to Scroll Canvas! +

Scroll Canvas provides the best tools to commemorate your on-chain achievements and build your on-chain identity. Discover the + badges you're eligible for and add them to your canvas today! + + ), + acitonText: "Explore More Badges", + action: () => { + setOpen(false) + setTimeout(() => { + navigate("/canvas-and-badges#discover") + }) + }, + clearData: () => { + // from default value of CANVAS_SCROLLY_ID, no need to clear + const nextScrollyId = without(scrollyId, "1canvas") + setScrollyId(nextScrollyId) + }, + }, + { + id: "2perks", + content: ( + <> + We’ve got something new for you! +

+ Perks – Check and claim the benefits you've earned from your badges. + + ), + acitonText: "Go to Perks", + action: () => { + changePerksDialogVisible(true) + setOpen(false) + }, + clearData: () => { + // from CANVAS_PERKS, no need to clear + const nextScrollyId = without(scrollyId, "2perks") + setScrollyId(nextScrollyId) + }, + }, + { + id: "3avatar", + content: ( + <> + Haven’t tried our new features yet? +

Take this chance to set your favorite image as your profile picture! + + ), + acitonText: "Edit Now", + action: () => { + changeEditProfileVisible(true) + setOpen(false) + }, + clearData: () => { + // need to clear -> annotate completed + const nextScrollyId = [...scrollyId] + nextScrollyId.splice(nextScrollyId.indexOf("3avatar"), 1, "3avatar-end") + setScrollyId(nextScrollyId) + }, + }, + ] + + return { open, data: scrollyList.find(item => item.id === scrollyId[0]) } +} + +export default useShowScrolly diff --git a/src/hooks/useShowWalletToolkit.tsx b/src/hooks/useShowWalletToolkit.tsx index 06c89b8c8..fa8ecfa56 100644 --- a/src/hooks/useShowWalletToolkit.tsx +++ b/src/hooks/useShowWalletToolkit.tsx @@ -1,10 +1,18 @@ import { useMemo } from "react" -import { useLocation } from "react-router-dom" +import { + useLocation, // useMatch +} from "react-router-dom" const useShowWalletConnector = () => { const { pathname } = useLocation() - const showWalletConnector = useMemo(() => pathname.startsWith("/developer-nft") || pathname.startsWith("/bridge"), [pathname]) + // const isCanvas = useMatch("/canvas/*") + + const showWalletConnector = useMemo( + // () => pathname.startsWith("/developer-nft") || pathname.startsWith("/bridge") || pathname.startsWith("/sessions") || isCanvas, + () => !pathname.startsWith("/blog"), + [pathname], + ) return showWalletConnector } diff --git a/src/hooks/useSnackbar.ts b/src/hooks/useSnackbar.ts new file mode 100644 index 000000000..fa3b8d5b1 --- /dev/null +++ b/src/hooks/useSnackbar.ts @@ -0,0 +1,16 @@ +import { VariantType, useSnackbar } from "notistack" +import { useCallback } from "react" + +// min width 288px +const useScrollSnackbar = () => { + const { enqueueSnackbar } = useSnackbar() + const enqueueScrollSnackbar = useCallback( + (message, variant: VariantType = "default", key?) => { + enqueueSnackbar(message, { key, autoHideDuration: 6000, anchorOrigin: { horizontal: "center", vertical: "bottom" }, variant }) + }, + [enqueueSnackbar], + ) + return enqueueScrollSnackbar +} + +export default useScrollSnackbar diff --git a/src/hooks/useSufficientBalance.ts b/src/hooks/useSufficientBalance.ts index 22549259a..f5f32655c 100644 --- a/src/hooks/useSufficientBalance.ts +++ b/src/hooks/useSufficientBalance.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from "react" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" import { useIsSmartContractWallet } from "@/hooks" import useBridgeStore from "@/stores/bridgeStore" @@ -10,7 +10,7 @@ import useTransactionBuffer from "./useTransactionBuffer" function useSufficientBalance(selectedToken: any, amount?: bigint, fee?: bigint | null, tokenBalance: bigint = BigInt(0)) { const { walletCurrentAddress, chainId } = useRainbowContext() - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() const networksAndSigner = networksAndSigners[chainId as number] const transactionBuffer = useTransactionBuffer(selectedToken) diff --git a/src/hooks/useTokenInfo.ts b/src/hooks/useTokenInfo.ts index 927574167..66c70612a 100644 --- a/src/hooks/useTokenInfo.ts +++ b/src/hooks/useTokenInfo.ts @@ -4,11 +4,11 @@ import useSWR from "swr" import L1_erc20ABI from "@/assets/abis/L1_erc20ABI.json" import { CHAIN_ID, ETH_SYMBOL } from "@/constants" import { TOKEN_INFO_MAP } from "@/constants/storageKey" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { loadState, saveState } from "@/utils/localStorage" const useTokenInfo = (address: string, isL1: boolean) => { - const { networksAndSigners } = useBrigeContext() + const { networksAndSigners } = useBridgeContext() const { data, isLoading } = useSWR( () => { const provider = networksAndSigners[isL1 ? CHAIN_ID.L1 : CHAIN_ID.L2].provider diff --git a/src/hooks/useTokenPrice.ts b/src/hooks/useTokenPrice.ts index 2bd02b220..08bccce8c 100644 --- a/src/hooks/useTokenPrice.ts +++ b/src/hooks/useTokenPrice.ts @@ -1,19 +1,19 @@ -import { useState } from "react" import useSWR from "swr" import { CHAIN_ID } from "@/constants" -const useTokenPrice = tokenList => { - const [prices, setPrices] = useState({}) +let PRICES = {} +const useTokenPrice = tokenList => { const fetchPrice = async () => { try { + if (typeof window === "object" && !window.location.pathname.startsWith("/bridge")) return { ...PRICES } const tokens = tokenList.filter(token => token.chainId === CHAIN_ID.L1 && token.address).map(token => token.address) const tokenAddresses = tokens.join("%2C") - const fetchEthPrice = fetch(`https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd`) + const fetchEthPrice = fetch(`https://token-price.scroll.cat/simple/price?ids=ethereum&vs_currencies=usd`) const fetchErc20Price = fetch( - `https://api.coingecko.com/api/v3/simple/token_price/ethereum?contract_addresses=${tokenAddresses}&vs_currencies=usd`, + `https://token-price.scroll.cat/simple/token_price/ethereum?contract_addresses=${tokenAddresses}&vs_currencies=usd`, ) const results = await Promise.allSettled([fetchEthPrice, fetchErc20Price]) @@ -29,9 +29,8 @@ const useTokenPrice = tokenList => { erc20Price = await results[1].value.json() } - const newPrices = { ...prices, ...ethPrice, ...erc20Price } - setPrices(newPrices) - return newPrices + PRICES = { ...PRICES, ...ethPrice, ...erc20Price } + return { ...PRICES } } catch (error) { throw error } @@ -41,7 +40,7 @@ const useTokenPrice = tokenList => { return { loading: isValidating, - price: data || prices, + price: data || {}, error, } } diff --git a/src/hooks/useTxHistory.ts b/src/hooks/useTxHistory.ts index 872c3f2dd..88beec149 100644 --- a/src/hooks/useTxHistory.ts +++ b/src/hooks/useTxHistory.ts @@ -38,7 +38,9 @@ const useTxHistory = () => { // fetch to hash/blockNumber from backend const { data } = useSWR( () => { - const needToRefreshTransactions = pageTransactions.filter(item => item.txStatus !== TX_STATUS.Relayed) + const needToRefreshTransactions = pageTransactions.filter( + item => item.txStatus !== TX_STATUS.Relayed && item.txStatus !== TX_STATUS.BatchDepositRelayed, + ) if (needToRefreshTransactions.length && walletCurrentAddress && historyVisible) { const txs = needToRefreshTransactions.map(item => item.hash).filter((item, index, arr) => index === arr.indexOf(item)) diff --git a/src/hooks/useUserLanguage.ts b/src/hooks/useUserLanguage.ts new file mode 100644 index 000000000..c9c81ec1f --- /dev/null +++ b/src/hooks/useUserLanguage.ts @@ -0,0 +1,21 @@ +import useStorage from "squirrel-gill" + +import { BLOG_LANGUAGE } from "@/constants/storageKey" + +function getUserLanguage() { + // Get the user's primary language preference + const userLanguage = navigator.language || "en" + + // Check if the language is Turkish + if (userLanguage.startsWith("tr")) { + return "tr" // Return 'tr' for Turkish + } else if (userLanguage.startsWith("es")) { + return "es" // Return 'es' for Español + } else { + return "en" // Return 'en' for any other language + } +} + +export default function useUserLanguage() { + return useStorage(localStorage, BLOG_LANGUAGE, getUserLanguage()) +} diff --git a/src/hooks/useValidateCanvasName.tsx b/src/hooks/useValidateCanvasName.tsx new file mode 100644 index 000000000..d0d649287 --- /dev/null +++ b/src/hooks/useValidateCanvasName.tsx @@ -0,0 +1,128 @@ +import { useEffect, useRef, useState } from "react" +import { usePrevious } from "react-use" +import { useDebouncedCallback } from "use-debounce" +import { hexToBool } from "viem" + +import { CircularProgress, SvgIcon, Typography } from "@mui/material" + +import SensitiveWord from "@/assets/files/sensitive-word.json" +import { ReactComponent as CheckSvg } from "@/assets/svgs/canvas/check.svg" +import { ReactComponent as WarningSvg } from "@/assets/svgs/canvas/warning.svg" +import { RPC_URL } from "@/constants" +import { useCanvasContext } from "@/contexts/CanvasContextProvider" +import useCanvasStore from "@/stores/canvasStore" + +const useValidateName = value => { + const { unsignedProfileRegistryContract } = useCanvasContext() + const { username } = useCanvasStore() + + const preValue = usePrevious(value) + const [helpText, setHelpText] = useState(null) + const [validating, setValidating] = useState(false) + const controller = useRef() + + useEffect(() => { + if ((preValue && !value) || value !== username) { + handleValidateName(value) + } + }, [value, username]) + + const handleValidateName = useDebouncedCallback(async value => { + setValidating(true) + const nextHelpText: string | JSX.Element = await validateName(value) + setHelpText(nextHelpText) + setValidating(false) + return nextHelpText + }, 300) + + const clearHelpText = () => { + setHelpText(null) + } + + const validateName = async name => { + let nextHelpText: string | JSX.Element = "" + if (controller.current) { + controller.current.abort("user input") + } + + if (!name) { + nextHelpText = "Please enter your name" + } else if (!/^[\dA-Za-z_]{4,15}$/g.test(name)) { + nextHelpText = ( + <> + Your name must consist of 4 to 15 characters,

comprising only letters, numbers or underline. + + ) + } else if (SensitiveWord.some(word => name.toLowerCase().includes(word.toLowerCase()))) { + nextHelpText = "This name is not allowed" + } else { + // const isUsernameUsedCallData = encodeFunctionData({ + // abi: ProfileRegistryABI, + // functionName: "isUsernameUsed", + // args: [name], + // }) + // const callParams = { + // to: requireEnv("REACT_APP_PROFILE_REGISTRY_ADDRESS"), + // data: isUsernameUsedCallData, + // } + // + // TODO: viem will implement request cancellation + const callParams = await unsignedProfileRegistryContract.isUsernameUsed.populateTransaction(name) + const data = { + jsonrpc: "2.0", + method: "eth_call", + params: [callParams, "latest"], + id: 123, + } + controller.current = new AbortController() + const result = await scrollRequest(RPC_URL.L2, { + headers: { + "Content-Type": "application/json", + }, + method: "POST", + body: JSON.stringify(data), + signal: controller.current.signal, + }) + const isUsernameUsed = hexToBool(result.result) + if (isUsernameUsed) { + nextHelpText = "This name is already taken" + } + } + return nextHelpText + } + + const renderValidation = () => { + if (validating) { + return ( + <> + + + Checking... + + + ) + } else if (helpText !== null) { + return ( + <> + + + {helpText || "This name is available"} + + + ) + } + return null + } + + return { helpText, clearHelpText, validating, renderValidation, handleValidateName } +} + +export default useValidateName diff --git a/src/hooks/useValidateENSSubdomain.tsx b/src/hooks/useValidateENSSubdomain.tsx new file mode 100644 index 000000000..d2cc72d28 --- /dev/null +++ b/src/hooks/useValidateENSSubdomain.tsx @@ -0,0 +1,103 @@ +import { useEffect, useRef, useState } from "react" +import { usePrevious } from "react-use" +import { useDebouncedCallback } from "use-debounce" +import { namehash, normalize } from "viem/ens" + +import { CircularProgress, SvgIcon, Typography } from "@mui/material" + +import { fetchIsNameTakenURL } from "@/apis/canvas-profile" +import SensitiveWord from "@/assets/files/sensitive-word.json" +import { ReactComponent as CheckSvg } from "@/assets/svgs/canvas/check.svg" +import { ReactComponent as WarningSvg } from "@/assets/svgs/canvas/warning.svg" + +const useValidateENSSubdomain = value => { + const preValue = usePrevious(value) + const [helpText, setHelpText] = useState(null) + const [validating, setValidating] = useState(false) + const controller = useRef() + + useEffect(() => { + if (preValue !== undefined) { + handleValidateName(value) + } + }, [value]) + + const handleValidateName = useDebouncedCallback(async value => { + setValidating(true) + const nextHelpText: string | JSX.Element = await validateENSSubdomain(value) + setHelpText(nextHelpText) + setValidating(false) + return nextHelpText + }, 300) + + const clearHelpText = () => { + setHelpText(null) + } + + const validateENSSubdomain = async name => { + let nextHelpText: string | JSX.Element = "" + if (controller.current) { + controller.current.abort("user input") + } + + if (!name) { + nextHelpText = "Please enter your subdomain name" + } else if (name.length < 4 || name.length > 15) { + nextHelpText = <>The subdomain name must consist of 4 to 15 characters. + } else if (/[/]+/g.test(name) || SensitiveWord.some(word => name.toLowerCase().includes(word.toLowerCase()))) { + nextHelpText = "This subdomain name is not allowed" + } else { + const ensSubdomain = name + ".scroll.eth" + try { + namehash(normalize(ensSubdomain)) + } catch (err) { + nextHelpText = "This subdomain name is not allowed" + } finally { + controller.current = new AbortController() + + const { taken } = await scrollRequest(fetchIsNameTakenURL(name), { + signal: controller.current.signal, + }) + if (taken) { + nextHelpText = "This subdomain name is already taken" + } + } + } + return nextHelpText + } + + const renderValidation = () => { + if (validating) { + return ( + <> + + + Checking... + + + ) + } else if (helpText !== null) { + return ( + <> + + + {helpText || "This subdomain name is available"} + + + ) + } + return null + } + + return { helpText, clearHelpText, validating, renderValidation, handleValidateName } +} + +export default useValidateENSSubdomain diff --git a/src/hooks/useViemBalance.tsx b/src/hooks/useViemBalance.tsx index 41acdaa40..d9bf2d7cd 100644 --- a/src/hooks/useViemBalance.tsx +++ b/src/hooks/useViemBalance.tsx @@ -5,7 +5,7 @@ import { useRainbowContext } from "@/contexts/RainbowProvider" const useBalance = tokenAddress => { const { walletCurrentAddress } = useRainbowContext() - const { data, isLoading } = useBalance_RAW({ address: walletCurrentAddress, token: tokenAddress, watch: true }) + const { data, isLoading } = useBalance_RAW({ address: walletCurrentAddress, token: tokenAddress }) return { balance: data?.value, isLoading } } diff --git a/src/index.css b/src/index.css index a773d4baf..1ac924905 100644 --- a/src/index.css +++ b/src/index.css @@ -20,6 +20,10 @@ object { max-height: 100vh; } } */ +:root { + --vh: 100vh; +} + html { scroll-padding-top: 140px; } @@ -29,7 +33,7 @@ body { /* font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; */ - font-family: "TransSansPremium"; + font-family: var(--default-font-family); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-variant-ligatures: no-contextual; @@ -80,11 +84,7 @@ body.mobile-top-nav-open { "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* same as scroll documnet */ - --developer-page-font-family: "Roboto Flex", "trans-sans", "circular", Arial, "Helvetica Neue", Helvetica, sans-serif; -} - -.App { - background: #fff8f3; + --developer-page-font-family: "Roboto", "trans-sans", "circular", Arial, "Helvetica Neue", Helvetica, sans-serif; } onboard-v2 .outer-container icon { @@ -108,6 +108,18 @@ onboard-v2 .outer-container icon { } } +div.markdown-body { + max-width: 76rem; + font-family: var(--developer-page-font-family); + letter-spacing: 0.09px; +} + +div.markdown-body p { + margin: 0 0 16px; + max-width: 100%; + line-height: 2.6rem; +} + div.markdown-body h1, div.markdown-body h2, div.markdown-body h3 { @@ -118,6 +130,12 @@ div.markdown-body h3 { list-style-type: decimal; } +div.markdown-body a { + color: #ff684b; + font-weight: 600; + text-decoration: underline; +} + div.markdown-body img { background-color: transparent; } @@ -129,11 +147,10 @@ div.markdown-body img { .header-link { font-size: 1.6rem; font-weight: 400; - padding-left: 1em; cursor: pointer; display: block; - line-height: normal; - margin: 0.5rem 0; + line-height: 1.5; + margin: 1.2rem 0; padding-right: 1.8em; transition: all 0.2s; } @@ -141,7 +158,8 @@ div.markdown-body img { .header-link.active, .header-link:hover, .header-link:focus { - font-weight: 500; + font-weight: 600; + color: #ff684b; } .header-link a { diff --git a/src/index.tsx b/src/index.tsx index 85aa3bbe8..d32923fab 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,6 +1,4 @@ -import * as Sentry from "@sentry/react" -import { BrowserTracing } from "@sentry/tracing" -import React from "react" +// import * as Sentry from "@sentry/react" import { isMobile } from "react-device-detect" import ReactDOM from "react-dom/client" import ReactGA from "react-ga4" @@ -18,25 +16,37 @@ import ScrollThemeProvider from "./theme" const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement) -if (requireEnv("NODE_ENV") === "production") { - Sentry.init({ - environment: requireEnv("REACT_APP_SCROLL_ENVIRONMENT"), - dsn: requireEnv("REACT_APP_SENTRY_DSN"), - integrations: [new BrowserTracing()], - tracesSampleRate: 1.0, - beforeSend(event) { - const exception = event?.exception?.values?.[0] - if (!exception) return event - // Unexpected token '<' - // if (exception.type === "SyntaxError" && exception.value?.includes("'<'")) return null - // error when user reject a transaction in wallet - if (exception.type === "Error" && exception.value?.includes("user rejected transaction")) return null - // error from browser extension wallets that want to redefine window.ethereum - if (exception.type === "TypeError" && exception.stacktrace?.frames?.[0]?.filename?.startsWith("chrome-extension")) return null +window.onerror = function (message, source, lineno, colno, error) { + console.log("Global error captured:", error) +} - return event - }, - }) +window.addEventListener("unhandledrejection", function (event) { + console.log("Unhandled rejection captured:", event.reason) +}) + +if (requireEnv("NODE_ENV") === "production") { + // Sentry.init({ + // environment: requireEnv("REACT_APP_SCROLL_ENVIRONMENT"), + // dsn: requireEnv("REACT_APP_SENTRY_DSN"), + // autoSessionTracking: false, + // integrations: [ + // new Sentry.Integrations.Breadcrumbs({ + // console: false, + // dom: false, + // fetch: false, + // history: false, + // sentry: false, + // xhr: false, + // }), + // ], + // tracesSampleRate: 1.0, + // beforeSend(event) { + // if (!event.exception) { + // return null + // } + // return event + // }, + // }) const GOOGLE_ANALYTICS_ID: string | undefined = requireEnv("REACT_APP_GOOGLE_ANALYTICS_ID") if (typeof GOOGLE_ANALYTICS_ID === "string") { diff --git a/src/pages/blog/components/tableOfContents.tsx b/src/pages/blog/components/tableOfContents.tsx index 336b65e9f..5b848d467 100644 --- a/src/pages/blog/components/tableOfContents.tsx +++ b/src/pages/blog/components/tableOfContents.tsx @@ -2,10 +2,11 @@ import type { FC } from "react" import { useEffect, useRef, useState } from "react" import { Link as RouterLink, useLocation } from "react-router-dom" -import ArrowBackIosIcon from "@mui/icons-material/ArrowBackIos" -import { Typography } from "@mui/material" +import { SvgIcon, Typography } from "@mui/material" import { styled } from "@mui/system" +import { ReactComponent as BackSvg } from "@/assets/svgs/common/back.svg" + const Link = styled(RouterLink)({ display: "flex", alignItems: "center", @@ -102,8 +103,8 @@ const TableOfContents: FC = () => {
  • - - All Articles + + All blogs
  • {headings.map(header => ( diff --git a/src/pages/blog/data.json b/src/pages/blog/data.json deleted file mode 100644 index 66547ea21..000000000 --- a/src/pages/blog/data.json +++ /dev/null @@ -1,195 +0,0 @@ -[ - { - "type": "Announcement", - "id": "designing-scroll-origins", - "date": "2023-12-18", - "title": "Designing Scroll Origins", - "posterTitle": "Designing Scroll Origins", - "summary": "Origins is a visual embodiment of Scroll’s commitment to zero knowledge principles.", - "posterImg": "/imgs/homepage/blog/poster_cover_20.png", - "ogImg": "/imgs/homepage/blog/poster_cover_20_og.png" - }, - { - "type": "Announcement", - "id": "community-update-november", - "date": "2023-12-13", - "title": "Community Update: November", - "posterTitle": "Community Update: November", - "summary": "Dive into our October recap.", - "posterImg": "/imgs/homepage/blog/poster_cover_19.png", - "ogImg": "/imgs/homepage/blog/poster_cover_19_og.png" - }, - { - "type": "Technical", - "id": "data-availability-4844", - "date": "2023-12-04", - "title": "Data Availability Post 4844", - "posterTitle": "Data Availability Post 4844", - "summary": "The one and only feature requested by most rollups is an improvement of Ethereum’s usability as a data availability layer.", - "posterImg": "/imgs/homepage/blog/poster_cover_18.png", - "ogImg": "/imgs/homepage/blog/poster_cover_18_og.png" - }, - { - "type": "Announcement", - "id": "community-update-october", - "date": "2023-11-01", - "title": "Community Update: October", - "posterTitle": "Community Update: October", - "summary": "Dive into our October recap.", - "posterImg": "/imgs/homepage/blog/poster_cover_17.png", - "ogImg": "/imgs/homepage/blog/poster_cover_17_og.png" - }, - { - "type": "Announcement", - "id": "scroll-origins-nft", - "date": "2023-10-26", - "title": "Announcing the Scroll Origins NFT", - "posterTitle": "Announcing the Scroll Origins NFT", - "summary": "To commemorate our launch, we are unveiling Scroll Origins, an NFT mint to celebrate our earliest builders who have been a part of our journey from the beginning.", - "posterImg": "/imgs/homepage/blog/poster_cover_16_1.png", - "ogImg": "/imgs/homepage/blog/poster_cover_16_1_og.png" - }, - { - "type": "Announcement", - "id": "scrolls-security-measures", - "date": "2023-10-19", - "title": "Scroll's Security Measures", - "posterTitle": "Scroll's Security Measures", - "summary": "At Scroll, security has always been our top priority guiding every decision we make.", - "posterImg": "/imgs/homepage/blog/poster_cover_15.png", - "ogImg": "/imgs/homepage/blog/poster_cover_15_og.png" - }, - { - "type": "Announcement", - "id": "founderLetter", - "date": "2023-10-17", - "title": "A Letter from Scroll: Mainnet is Here!", - "posterTitle": "Founder Letter", - "summary": "Scroll was founded in 2021 with the mission to scale Ethereum, and we're just getting started.", - "posterImg": "/imgs/homepage/blog/poster_cover_14.png", - "ogImg": "/imgs/homepage/blog/poster_cover_14_og.png" - }, - { - "type": "Announcement", - "id": "scrolls-fresh-coat", - "date": "2023-08-24", - "title": "Scroll's Fresh Coat: A Community Touch", - "posterTitle": "Scroll's Evolution", - "summary": "Discover our updated website and documentation, shaped by collective insights and collaboration.", - "posterImg": "/imgs/homepage/blog/poster_cover_13.jpg", - "ogImg": "/imgs/homepage/blog/poster_cover_13_og.png" - }, - { - "type": "Announcement", - "id": "scrollSepolia", - "date": "2023-08-17", - "title": "Announcing the Scroll Beta Testnet on Sepolia", - "posterTitle": "Scroll Beta on Sepolia", - "summary": "We are excited to announce that our Beta testnet is now live on Sepolia.", - "posterImg": "/imgs/homepage/blog/poster_cover_12.jpg" - }, - { - "type": "Announcement", - "id": "contributeToScroll", - "date": "2023-07-13", - "title": "Announcing the 'Contribute to Scroll' Initiative", - "posterTitle": "Contribute to Scroll", - "summary": "You can now start contributing to Scroll easily.", - "posterImg": "/imgs/homepage/blog/poster_cover_11.jpg" - }, - { - "type": "Announcement", - "id": "alphaTestnet", - "date": "2023-02-27", - "title": "Announcing the Scroll Alpha Testnet on Goerli", - "posterTitle": "Alpha Testnet on Goerli", - "summary": "We are excited to announce that our Alpha testnet is now live on Goerli.", - "posterImg": "/imgs/homepage/blog/poster_cover_10.jpg" - }, - { - "type": "Announcement", - "id": "releaseNote0109", - "date": "2023-01-13", - "title": "Release Note for 0109 Upgrade", - "posterTitle": "Release Note 0109", - "summary": "This release note describes the changes introduced in the testnet upgrade on Jan 9.", - "posterImg": "/imgs/homepage/blog/poster_cover_9.jpg" - }, - { - "type": "Technical", - "id": "proofGeneration", - "date": "2022-12-14", - "title": "The Anatomy of Proof Generation", - "posterTitle": "Proof Generation", - "summary": "A technical deep dive into the computational costs of proof generation.", - "posterImg": "/imgs/homepage/blog/poster_cover_8.jpg" - }, - { - "type": "Technical", - "id": "kzg", - "date": "2022-10-25", - "title": "KZG in Practice: Polynomial Commitment Schemes and Their Usage in Scaling Ethereum", - "posterTitle": "KZG in Practice", - "summary": "An introduction to polynomial commitment schemes and their usage in Scroll and Ethereum.", - "posterImg": "/imgs/homepage/blog/poster_cover_7.jpg" - }, - { - "type": "Announcement", - "id": "upgradingPreAlphaTestnet", - "date": "2022-10-09", - "title": "Upgrading the Scroll Pre-Alpha Testnet", - "posterTitle": "Scroll Pre-Alpha Testnet", - "summary": "Our new testnet upgrade enables smart contract deployment on Scroll.", - "posterImg": "/imgs/homepage/blog/poster_cover_6.jpg", - "canonical": "https://scroll.mirror.xyz/FYzq9QWb2UhS00p-AOFMBh1Oq6SCqLA6L855GAHczOw" - }, - { - "type": "Technical", - "id": "architecture", - "date": "2022-08-01", - "title": "Scroll’s Architecture Overview", - "posterTitle": "Scroll’s Architecture Overview", - "summary": "The architecture overview of our EVM-equivalent zkRollup aiming to scale Ethereum.", - "posterImg": "/imgs/homepage/blog/poster_cover_5.jpg", - "canonical": "https://scroll.mirror.xyz/nDAbJbSIJdQIWqp9kn8J0MVS4s6pYBwHmK7keidQs-k" - }, - { - "type": "General", - "id": "technicalPrinciples", - "date": "2022-07-21", - "title": "Technical Principles", - "posterTitle": "Technical Principles", - "summary": "To scale Ethereum with our zkRollup, we have designed Scroll based on this set of principles.", - "posterImg": "/imgs/homepage/blog/poster_cover_4.jpg", - "canonical": "https://scroll.mirror.xyz/N7cAie4ul0PdSxNdv2FTqgMV2JEkhOJocsxfeqe4SFE" - }, - { - "type": "General", - "id": "preAlphaTestnet", - "date": "2022-07-19", - "title": "Scroll Pre-Alpha Testnet", - "posterTitle": "Scroll Pre-Alpha Testnet", - "summary": "After over a year of building our zkEVM in close collaboration with the PSE - the Pre-Alpha!", - "posterImg": "/imgs/homepage/blog/poster_cover_3.jpg", - "canonical": "https://scroll.mirror.xyz/XQyXDgyxoefag6hcBgGJFz8qrb10rmSU-zUBvY3Q9_A" - }, - { - "type": "General", - "id": "visionAndValues", - "date": "2022-06-13", - "title": "Vision and Values", - "posterTitle": "Vision and Values", - "summary": "The promise of Ethereum is to build a decentralized computing platform widely accessible to all.", - "posterImg": "/imgs/homepage/blog/poster_cover_2.jpg", - "canonical": "https://scroll.mirror.xyz/EYn7ODhQAnNWABwWcu5xZLts_wEXTZAEWyTgExGS1DA" - }, - { - "type": "General", - "id": "zkEVM", - "date": "2021-09-28", - "title": "zkEVM", - "posterTitle": "zkEVM", - "summary": "We believe zkRollups to be the holy grail: a best-in-class Layer 2 scaling solution for Ethereum.", - "posterImg": "/imgs/homepage/blog/poster_cover_1.jpg" - } -] diff --git a/src/pages/blog/detail.tsx b/src/pages/blog/detail.tsx index 52f229d6e..70a74aab5 100644 --- a/src/pages/blog/detail.tsx +++ b/src/pages/blog/detail.tsx @@ -1,5 +1,5 @@ import { shuffle } from "lodash" -import { useEffect, useState } from "react" +import { useEffect, useMemo, useState } from "react" import { Helmet } from "react-helmet-async" import ReactMarkdown from "react-markdown" import { useNavigate, useParams } from "react-router-dom" @@ -12,7 +12,10 @@ import { Box, Typography } from "@mui/material" import { styled } from "@mui/system" import LoadingPage from "@/components/LoadingPage" +import { LANGUAGE_MAP } from "@/constants" import useCheckViewport from "@/hooks/useCheckViewport" +import useUserLanguage from "@/hooks/useUserLanguage" +import { filterBlogsByLanguage } from "@/utils" import Articles from "./articles" import TOC from "./components/tableOfContents" @@ -20,8 +23,8 @@ import blogSource from "./data.json" const BlogContainer = styled(Box)( ({ theme }) => ` - max-width: 100rem; - padding: 8rem 6rem 14rem; + max-width: 140rem; + padding: 6rem 4rem 14rem; overflow: visible; display: flex; ${theme.breakpoints.down("md")} { @@ -35,11 +38,7 @@ const BlogContainer = styled(Box)( const BlogNavbar = styled(Box)(({ theme }) => ({ position: "sticky", top: "14rem", - width: "40rem", - marginLeft: "4rem", - maxWidth: "30vw", - paddingLeft: "2rem", - borderLeft: `1px solid ${theme.palette.border.main}`, + maxWidth: "32vw", [theme.breakpoints.down("md")]: { display: "none", }, @@ -47,59 +46,65 @@ const BlogNavbar = styled(Box)(({ theme }) => ({ const BlogDetail = () => { const navigate = useNavigate() - const [blog, setBlog] = useState(null) + const [language] = useUserLanguage() + const [blogContent, setBlogContent] = useState(null) const [moreBlog, setMoreBlog] = useState([]) const [currentBlog, setCurrentBlog] = useState({ title: "", - content: "", posterImg: "", }) const [loading, setLoading] = useState(true) const params = useParams() + const blogsWithLang = useMemo(() => filterBlogsByLanguage(blogSource, language), [blogSource, language]) + useEffect(() => { - if (params.blogId === "scrollsFreshCoat") { - navigate("/blog/scrolls-fresh-coat") - return - } - getCurrentBlog() - // @ts-ignore - let anchors = [...document.querySelectorAll("a")] - anchors.map(anchor => { - if (anchor.href.includes("/blog/")) { - anchor.setAttribute("target", "") + const regex = /([^_]*?)_lang_[^_]+/g + const blogId = params.blogId.toLowerCase() + const blogIdMatch = blogId.match(regex) + + const blogItem = blogSource.find(item => item.id === blogId) + const blogItemWithLang = blogSource.find(item => item.id === `${blogId}_lang_${language}`) + + if ((!blogIdMatch && language === "en") || (blogIdMatch && language !== "en") || (!blogIdMatch && language !== "en" && !blogItemWithLang)) { + setCurrentBlog(blogItem) + let anchors = [...document.querySelectorAll("a")] + anchors.map(anchor => { + if (anchor.href.includes("/Content/")) { + anchor.setAttribute("target", "") + } + return anchor + }) + try { + const blogPath = `https://blog.scroll.cat/api/post/${blogId}.md?title=1` + setLoading(true) + fetch(blogPath) + .then(response => response.text()) + .then(text => { + setLoading(false) + setBlogContent(text) + }) + } catch (error) { + navigate("/404") } - return anchor - }) - try { - const blogPath = require(`../../assets/blog/${params.blogId}.md`) - fetch(blogPath) - .then(response => response.text()) - .then(text => { - setLoading(false) - setBlog(text) - }) - } catch (error) { - navigate("/404") + } else if (blogIdMatch && language === "en") { + const nextBlogId = blogId.replace(regex, "$1") + navigate(`/blog/${nextBlogId}`) + } else if (blogItemWithLang) { + navigate(`/blog/${params.blogId}_lang_${language}`) } - getMoreBlog() - }, [params.blogId]) + }, [params.blogId, language]) - const getMoreBlog = () => { - const blogs = shuffle(blogSource.filter(blog => blog.id !== params.blogId)).slice(0, 3) + useEffect(() => { + const blogs = shuffle(blogsWithLang.filter(blog => blog.id !== params.blogId.toLowerCase())).slice(0, 3) setMoreBlog(blogs) - } - - const getCurrentBlog = () => { - const blog = blogSource.find(blog => blog.id === params.blogId) - setCurrentBlog(blog) - } + }, [params.blogId, blogsWithLang]) const { isPortrait } = useCheckViewport() const getPosterUri = () => { - return window.location.origin + (currentBlog.ogImg || currentBlog.posterImg) + return currentBlog.ogImg || currentBlog.posterImg } return ( @@ -132,17 +137,17 @@ const BlogDetail = () => { ) : ( - + {isPortrait ? ( @@ -154,7 +159,7 @@ const BlogDetail = () => { mb: ["2rem", "3rem"], }} > - More articles from Scroll + {LANGUAGE_MAP[language].more_articles} diff --git a/src/pages/blog/index.tsx b/src/pages/blog/index.tsx index 557eefd37..8a1ca96de 100644 --- a/src/pages/blog/index.tsx +++ b/src/pages/blog/index.tsx @@ -1,5 +1,6 @@ import { orderBy } from "lodash" -import { useEffect, useState } from "react" +import { useEffect, useMemo, useState } from "react" +import { useLocation } from "react-router-dom" import { Tune as TuneIcon } from "@mui/icons-material" import { Box, Modal, Typography } from "@mui/material" @@ -7,7 +8,10 @@ import { styled } from "@mui/system" import ArticleCard from "@/components/ArticleCard" import SectionWrapper from "@/components/SectionWrapper" +import { LANGUAGE_MAP, getBlogCategoryList, getBlogSortList } from "@/constants" import useCheckViewport from "@/hooks/useCheckViewport" +import useUserLanguage from "@/hooks/useUserLanguage" +import { filterBlogsByLanguage } from "@/utils" import blogSource from "./data.json" @@ -40,11 +44,11 @@ const Header = styled(Box)(({ theme }) => ({ })) const Title = styled(Typography)(({ theme }) => ({ - fontSize: "7.8rem", + fontSize: "6.4rem", lineHeight: 1, fontWeight: 600, [theme.breakpoints.down("sm")]: { - fontSize: "4rem", + fontSize: "3.6rem", }, })) @@ -158,27 +162,34 @@ const BlogList = styled("ul")(({ theme }) => ({ })) const Blog = () => { + const location = useLocation() const { isDesktop } = useCheckViewport() - const listType = ["Newest", "Oldest"] - const categories = ["All", "Announcement", "General", "Technical"] + const [language] = useUserLanguage() + const BLOG_CATEGORY_LIST = useMemo(() => getBlogCategoryList(language), [language]) + const BLOG_SORT_LIST = useMemo(() => getBlogSortList(language), [language]) + const BLOG_COPY = useMemo(() => LANGUAGE_MAP[language], [language]) const [filterOpen, setFilterOpen] = useState(false) const handleFilterOpen = () => setFilterOpen(true) const handleFilterClose = () => setFilterOpen(false) + const category = location.state?.category ?? "All" + const [blogs, setBlogs] = useState(blogSource) const [queryForm, setQueryForm] = useState({ sort: "Newest", - category: "All", + category, }) + const blogsWithLang = useMemo(() => filterBlogsByLanguage(blogSource, language), [blogSource, language]) + useEffect(() => { const blogs = orderBy( - blogSource.filter(blog => blog.type === queryForm.category || queryForm.category === "All"), + blogsWithLang.filter(blog => blog.type === queryForm.category || queryForm.category === "All"), "date", queryForm.sort === "Newest" ? "desc" : "asc", ) setBlogs(blogs) - }, [queryForm]) + }, [queryForm, blogsWithLang]) const hanleFilter = (attr: string, value: string) => { handleFilterClose() @@ -192,7 +203,7 @@ const Blog = () => { return ( {blogs.map(blog => ( - + ))} @@ -204,17 +215,17 @@ const Blog = () => { if (isDesktop) { return ( - Category - {categories.map(category => ( - hanleFilter("category", category)} key={category} className={category === queryForm.category ? "active" : ""}> - {category} + {BLOG_COPY.category} + {BLOG_CATEGORY_LIST.map(({ label, key }) => ( + hanleFilter("category", key)} key={key} className={key === queryForm.category ? "active" : ""}> + {label} ))} - Order by - {listType.map(type => ( - hanleFilter("sort", type)} key={type} className={type === queryForm.sort ? "active" : ""}> - {type} + {BLOG_COPY.sort} + {BLOG_SORT_LIST.map(({ label, key }) => ( + hanleFilter("sort", key)} key={key} className={key === queryForm.sort ? "active" : ""}> + {label} ))} @@ -224,7 +235,7 @@ const Blog = () => { - Filters + {BLOG_COPY.filters} @@ -242,19 +253,15 @@ const Blog = () => { Category - {categories.map(category => ( - hanleFilter("category", category)} - key={category} - className={category === queryForm.category ? "active" : ""} - > - {category} + {BLOG_CATEGORY_LIST.map(({ label, key }) => ( + hanleFilter("category", key)} key={key} className={key === queryForm.category ? "active" : ""}> + {label} ))} Order by - {listType.map(type => ( - hanleFilter("sort", type)} key={type} className={type === queryForm.sort ? "active" : ""}> - {type} + {BLOG_SORT_LIST.map(({ label, key }) => ( + hanleFilter("sort", key)} key={key} className={key === queryForm.sort ? "active" : ""}> + {label} ))} @@ -268,8 +275,8 @@ const Blog = () => {
    - Scroll Blog - Learn about Scroll’s technology, research, and latest developments. + {BLOG_COPY.title} + {BLOG_COPY.sub_title}
    {renderFilter()} diff --git a/src/pages/brand-kit/Assets/AssetCard.tsx b/src/pages/brand-kit/Assets/AssetCard.tsx index ba002b645..04c30456c 100644 --- a/src/pages/brand-kit/Assets/AssetCard.tsx +++ b/src/pages/brand-kit/Assets/AssetCard.tsx @@ -146,6 +146,10 @@ const useStyles = makeStyles()((theme, { type, name }) => ({ gridArea: "cover", }, + coverdark: { + backgroundColor: theme.palette.themeBackground.dark, + }, + sampleImage0: { gridArea: "sample1", width: "100%", @@ -249,9 +253,9 @@ const AssetCard = props => { {name} {versions.map((version, index) => ( - + {version.title ? {version.title} : null} - + diff --git a/src/pages/brand-kit/Assets/index.tsx b/src/pages/brand-kit/Assets/index.tsx index 0a66d87b8..7f9f3d111 100644 --- a/src/pages/brand-kit/Assets/index.tsx +++ b/src/pages/brand-kit/Assets/index.tsx @@ -10,7 +10,7 @@ const useStyles = makeStyles()(theme => ({ float: { width: "calc(50% - 1.5rem)", float: "right", - "&:nth-child(2n)": { + "&:nth-of-type(2n)": { float: "left", }, [theme.breakpoints.down("md")]: { @@ -25,8 +25,8 @@ const Assets = props => { return ( {brandAssets.map((item, index) => ( - - + + diff --git a/src/pages/brand-kit/Header/index.tsx b/src/pages/brand-kit/Header/index.tsx index 3c10c2430..f0bf418eb 100644 --- a/src/pages/brand-kit/Header/index.tsx +++ b/src/pages/brand-kit/Header/index.tsx @@ -39,7 +39,7 @@ const Header = () => { ({ container: { - marginTop: "-6.5rem", - paddingTop: "6.5rem", overflow: "hidden", - background: "#FFEEDA", + background: theme.palette.themeBackground.brand, }, })) diff --git a/src/pages/bridge/FAQ/index.tsx b/src/pages/bridge/FAQ/index.tsx index abb38899a..f3f15781c 100644 --- a/src/pages/bridge/FAQ/index.tsx +++ b/src/pages/bridge/FAQ/index.tsx @@ -43,8 +43,8 @@ const FAQ = () => { 3. Select the token (for ex. ETH) you wish to transfer. - 4. Click on Send. A pop up window form will ask you for the transfer confirmation. If this is your first time transferring ETH, you will be - prompted to approve the Scroll Bridge contract to access your ETH token. + 4. Click on Deposit funds/Withdraw funds. A pop up window form will ask you for the transfer confirmation. If this is your first time + transferring ETH, you will be prompted to approve the Scroll Bridge contract to access your ETH token. 5. Once the transaction is confirmed, the token will be deducted from your wallet. diff --git a/src/pages/bridge/FAQ/link.tsx b/src/pages/bridge/FAQ/link.tsx index 8e0beb2ef..7876da537 100644 --- a/src/pages/bridge/FAQ/link.tsx +++ b/src/pages/bridge/FAQ/link.tsx @@ -3,8 +3,8 @@ import { Link } from "react-router-dom" import { Stack, SvgIcon } from "@mui/material" import { styled } from "@mui/system" -import { ReactComponent as LinkSvg } from "@/assets/svgs/bridge/external-link.svg" -import { isProduction } from "@/utils" +import { ReactComponent as LinkSvg } from "@/assets/svgs/common/external-link.svg" +import { isMainnet } from "@/utils" const FAQsLink = styled(Link)(({ theme }) => ({ color: "#6D6D6D", @@ -24,7 +24,7 @@ const BridgeLinks = () => { FAQs - {isProduction && ( + {isMainnet && ( Testnet Bridge diff --git a/src/pages/bridge/Send/Claim.tsx b/src/pages/bridge/Send/Claim.tsx index deec746f5..d02fed5b8 100644 --- a/src/pages/bridge/Send/Claim.tsx +++ b/src/pages/bridge/Send/Claim.tsx @@ -4,7 +4,7 @@ import { makeStyles } from "tss-react/mui" import { Box } from "@mui/material" import { CLAIM_TABLE_PAGE_SIZE } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" import useClaimStore from "@/stores/claimStore" @@ -40,10 +40,10 @@ const useStyles = makeStyles()(theme => ({ const Claim = (props: any) => { const { classes } = useStyles() - const { walletCurrentAddress, chainId } = useRainbowContext() + const { walletCurrentAddress } = useRainbowContext() const { claimHistory: { refreshPageTransactions }, - } = useBrigeContext() + } = useBridgeContext() const { page, total, pageTransactions, loading, clearTransactions } = useClaimStore() @@ -63,7 +63,7 @@ const Claim = (props: any) => { return ( - {chainId ? ( + {walletCurrentAddress ? ( ({ + title: { + fontSize: "1.8rem", + lineHeight: "3.6rem", + fontWeight: 500, + textAlign: "left", + cursor: "pointer", + color: "#101010", + [theme.breakpoints.down("md")]: { + lineHeight: "1", + }, + }, + disabledButton: { + pointerEvents: "none", + color: "#EBC28E", + }, + readOnlyButton: { + pointerEvents: "none", + }, +})) + +const CustomiseRecipient = props => { + const { handleChangeRecipient, bridgeWarning, disabled, readOnly } = props + const { classes, cx } = useStyles() + const [enableCustomRecipient, setEnableCustomRecipient] = useState(false) + const { + ens, + inputValue: addressInputValue, + isValidInput, + isValidEns, + isValidAddress, + resolvingEns, + ensServerError, + setInputValue: setAddressInputValue, + } = useInputAddress({ + onAddressChange: handleChangeRecipient, + }) + + useEffect(() => { + if (!enableCustomRecipient) setAddressInputValue("") + }, [enableCustomRecipient]) + + const invalidUseInputAddressErrorMessage = useMemo(() => { + if (isValidInput) return + if (resolvingEns) return "Resolving ENS..." + if (ensServerError) return ensServerError + if (ens && !isValidEns) return "Invalid ENS name" + if (!isValidAddress && !isValidEns) return "Invalid wallet address or ENS name" + if (!isValidAddress) return "Invalid wallet address" + if (!isValidEns) return "Invalid ENS name" + }, [resolvingEns, isValidInput, isValidAddress, isValidEns, ensServerError]) + + const showErrorMessage = useMemo(() => { + return resolvingEns || (!isValidInput && !(!!bridgeWarning && bridgeWarning !== ">0")) + }, [isValidInput, bridgeWarning, resolvingEns]) + + return ( + 0" ? "0.3" : 1 }}> + {enableCustomRecipient ? ( + + + + Customise recipient + + setEnableCustomRecipient(false)} className={classes.title}> + + Remove + + + + setAddressInputValue(v.target.value)} + placeholder="Enter a different wallet address or ENS name" + value={addressInputValue} + /> + + + ) : ( + setEnableCustomRecipient(true)} + > + Customise recipient + + + )} + {showErrorMessage ? ( + + + + {invalidUseInputAddressErrorMessage} + + + ) : null} + + ) +} + +export default CustomiseRecipient diff --git a/src/pages/bridge/Send/SendTransaction/DepositSelector/EconomyTooltip.tsx b/src/pages/bridge/Send/SendTransaction/DepositSelector/EconomyTooltip.tsx new file mode 100644 index 000000000..68fb01ef4 --- /dev/null +++ b/src/pages/bridge/Send/SendTransaction/DepositSelector/EconomyTooltip.tsx @@ -0,0 +1,39 @@ +import { useMemo } from "react" + +// import { makeStyles } from "tss-react/mui" +import { SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as InfoSvg } from "@/assets/svgs/common/info.svg" +import useBatchBridgeStore from "@/stores/batchBridgeStore" +import { toTokenDisplay } from "@/utils" + +const EconomyTooltip = props => { + const { selectedToken } = props + const { batchDepositConfig } = useBatchBridgeStore() + + const minAmount = useMemo(() => { + if (batchDepositConfig.minAmountPerTx) { + return toTokenDisplay(batchDepositConfig.minAmountPerTx, selectedToken.decimals, selectedToken.symbol) + } + }, [batchDepositConfig]) + + return ( + + You can only use "Economy" + for deposit more than {minAmount} + + ) +} + +export default EconomyTooltip diff --git a/src/pages/bridge/Send/SendTransaction/DepositSelector/index.tsx b/src/pages/bridge/Send/SendTransaction/DepositSelector/index.tsx new file mode 100644 index 000000000..f437bb51f --- /dev/null +++ b/src/pages/bridge/Send/SendTransaction/DepositSelector/index.tsx @@ -0,0 +1,269 @@ +import { useCallback, useEffect, useMemo, useState } from "react" +import { makeStyles } from "tss-react/mui" + +import { Box, Card, Grid, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as SelectedSvg } from "@/assets/svgs/bridge/approve-token-selected.svg" +import { ETH_SYMBOL } from "@/constants" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useBatchBridgeStore, { DepositBatchMode } from "@/stores/batchBridgeStore" +import useBridgeStore from "@/stores/bridgeStore" +import { BNToAmount, checkApproved, toTokenDisplay } from "@/utils" +import { formatAmount } from "@/utils" + +import EconomyTooltip from "./EconomyTooltip" + +type TransactionValue = bigint | null + +const DEPOSIT_OPTIONS = [ + { + title: "Economy 💰", + type: DepositBatchMode.Economy, + time: "30 min ~ 1 hour", + }, + { + title: "Fast ⚡️", + type: DepositBatchMode.Fast, + time: "20 min", + }, +] + +const useStyles = makeStyles()(theme => ({ + cardRoot: { + position: "relative", + borderRadius: "2rem", + backgroundColor: theme.palette.themeBackground.light, + padding: "2.7rem 1.5rem 3.1rem", + display: "flex", + overflow: "visible", + cursor: "pointer", + flex: 1, + border: "1px solid transparent", + transition: "backgroundColor 0.3s ease", + + "&:hover": { + backgroundColor: theme.palette.background.default, + }, + + [theme.breakpoints.down("sm")]: { + aspectRatio: "unset", + justifyContent: "center", + }, + }, + invaildCard: { + opacity: 0.6, + pointerEvents: "none", + }, + selectedCard: { + border: `1px solid ${theme.palette.text.primary}`, + backgroundColor: theme.palette.background.default, + }, + selectedIcon: { + fontSize: "3.2rem", + position: "absolute", + right: "0.8rem", + top: "0.8rem", + }, + label: { + fontSize: "1.6rem", + lineHeight: "2.4rem", + fontWeight: 700, + fontFamily: "var(--default-font-family) !important", + }, + info: { + fontSize: "1.6rem", + lineHeight: "2.4rem", + display: "flex", + justifyContent: "flex-end", + }, + price: { + fontSize: "1.4rem", + lineHeight: "2.4rem", + color: "#5B5B5B", + marginLeft: "0.6rem", + }, + subheader: { + fontSize: "1.2rem", + lineHeight: "2.4rem", + color: "#5B5B5B", + fontWeight: 700, + textTransform: "uppercase", + fontFamily: "var(--default-font-family) !important", + }, +})) + +const CustomTypography = ({ isError, ...props }) => + +const DepositSelector = props => { + const { amount, feeError, l1GasFee, l2GasFee, l1EconomyGasFee, l2EconomyGasFee, needApproval, selectedToken, isVaild } = props + const { isMobile } = useCheckViewport() + const { classes, cx } = useStyles() + + const [selectedType, setSelectedType] = useState(DepositBatchMode.Economy) + const { isNetworkCorrect } = useBridgeStore() + const { changeDepositBatchMode, depositBatchMode } = useBatchBridgeStore() + const { tokenPrice } = useBridgeContext() + + const handleSelect = value => { + setSelectedType(value) + } + + useEffect(() => { + changeDepositBatchMode(selectedType) + }, [selectedType]) + + const allowDisplayValue = useMemo(() => { + return isNetworkCorrect && amount && !feeError + }, [isNetworkCorrect, amount, feeError, depositBatchMode]) + + const showFeeError = useMemo(() => { + return !!feeError && amount && !needApproval + }, [feeError, amount, needApproval]) + + const getDisplayedPrice = useCallback( + (amount = "", tokenAddress = "ethereum") => { + if (allowDisplayValue && tokenPrice.price?.[tokenAddress.toLowerCase()]) { + return (+amount * tokenPrice.price[tokenAddress.toLowerCase()].usd).toFixed(2) + } + return "" + }, + [allowDisplayValue, showFeeError, tokenPrice], + ) + + const getDisplayedValue = useCallback( + (value: TransactionValue = BigInt(0), decimals = BigInt(18), symbol = ETH_SYMBOL) => { + if (allowDisplayValue) { + return toTokenDisplay(value, decimals, symbol) + } + return - + }, + [allowDisplayValue, showFeeError], + ) + + const displayedL1Fee = useMemo(() => { + let displayedFee = "-" + let displayedPrice = "" + if (checkApproved(needApproval, DepositBatchMode.Fast) && allowDisplayValue) { + displayedFee = getDisplayedValue(l1GasFee) as any + displayedPrice = getDisplayedPrice(BNToAmount(l1GasFee as bigint)) + } + let displayedBatchFee = "-" + let displayedBatchPrice = "" + if (checkApproved(needApproval, DepositBatchMode.Economy) && allowDisplayValue) { + displayedBatchFee = getDisplayedValue(l1EconomyGasFee) as any + displayedBatchPrice = getDisplayedPrice(BNToAmount(l1EconomyGasFee as bigint)) + } + return { + [DepositBatchMode.Fast]: { + value: displayedFee, + price: displayedPrice, + }, + [DepositBatchMode.Economy]: { + value: displayedBatchFee, + price: displayedBatchPrice, + }, + } + }, [l1GasFee, l1EconomyGasFee, getDisplayedValue, getDisplayedPrice, needApproval, allowDisplayValue]) + + const displayedL2Fee = useMemo(() => { + let displayedFee = "-" + let displayedPrice = "" + if (checkApproved(needApproval, DepositBatchMode.Fast) && allowDisplayValue) { + displayedFee = getDisplayedValue(l2GasFee) as any + displayedPrice = getDisplayedPrice(BNToAmount(l2GasFee as bigint)) + } + let displayedBatchFee = "-" + let displayedBatchPrice = "" + if (checkApproved(needApproval, DepositBatchMode.Economy) && allowDisplayValue) { + displayedBatchFee = getDisplayedValue(l2EconomyGasFee, selectedToken.decimals, selectedToken.symbol) as any + displayedBatchPrice = getDisplayedPrice(BNToAmount(l2EconomyGasFee as bigint)) + } + return { + [DepositBatchMode.Fast]: { + value: displayedFee, + price: displayedPrice, + }, + [DepositBatchMode.Economy]: { + value: displayedBatchFee, + price: displayedBatchPrice, + }, + } + }, [l2GasFee, l2EconomyGasFee, getDisplayedValue, getDisplayedPrice, needApproval, allowDisplayValue]) + + return ( + + + {DEPOSIT_OPTIONS.map((item, idx) => ( + handleSelect(item.type)} + > + {item.type === selectedType && } + + + {item.title} + + + + Time + + + {item.time} + + + + Gas fee + + + + Ethereum + + + {displayedL1Fee[DepositBatchMode[item.type]].value} + + {displayedL1Fee[DepositBatchMode[item.type]]?.price ? ` $${formatAmount(displayedL1Fee[DepositBatchMode[item.type]].price)}` : ""} + + + + + + + Scroll + + + {displayedL2Fee[DepositBatchMode[item.type]].value} + + {displayedL1Fee[DepositBatchMode[item.type]]?.price + ? ` $${formatAmount(displayedL2Fee[DepositBatchMode[item.type]].price)}` + : " "} + + + + + + ))} + + {!isVaild && } + + ) +} + +export default DepositSelector diff --git a/src/pages/bridge/Send/SendTransaction/InfoTooltip/DetailRow.tsx b/src/pages/bridge/Send/SendTransaction/InfoTooltip/DetailRow.tsx index bc16b110b..5eef76f8c 100644 --- a/src/pages/bridge/Send/SendTransaction/InfoTooltip/DetailRow.tsx +++ b/src/pages/bridge/Send/SendTransaction/InfoTooltip/DetailRow.tsx @@ -4,6 +4,7 @@ import { makeStyles } from "tss-react/mui" import { BoxProps, Typography } from "@mui/material" import useCheckViewport from "@/hooks/useCheckViewport" +import { formatAmount } from "@/utils" export type DetailRowProps = { title: string @@ -83,14 +84,14 @@ const DetailRow: FC = props => { {isMobile ? ( - {price ? ` $${price}` : ""} + {price ? ` $${formatAmount(price)}` : ""} ) : null} {isMobile ? null : ( - {price ? ` $${price}` : ""} + {price ? ` $${formatAmount(price)}` : ""} )} diff --git a/src/pages/bridge/Send/SendTransaction/TokenList.tsx b/src/pages/bridge/Send/SendTransaction/TokenList.tsx index ec55c8b3d..d2e18d72a 100644 --- a/src/pages/bridge/Send/SendTransaction/TokenList.tsx +++ b/src/pages/bridge/Send/SendTransaction/TokenList.tsx @@ -12,6 +12,7 @@ import ListItemText from "@mui/material/ListItemText" import { EXPLORER_URL } from "@/constants" import { useRainbowContext } from "@/contexts/RainbowProvider" import useAddToken, { TOKEN_LEVEL } from "@/hooks/useAddToken" +import { tokenList } from "@/pages/sessions-one/SessionZeroMarks/tokenList" import useBridgeStore from "@/stores/bridgeStore" import { generateExploreLink, truncateHash } from "@/utils" @@ -110,6 +111,21 @@ const ListAddressStyled = styled(Link)(({ theme }) => ({ textDecorationLine: "underline", textDecorationColor: "unset", })) +const EarnMarksLabel = styled(Typography)(() => ({ + display: "inline", + color: "#0F8E7E", + textAlign: "center", + fontFamily: "var(--developer-page-font-family)", + fontSize: "12px", + fontStyle: "normal", + fontWeight: 600, + lineHeight: "16px", + letterSpacing: "0.12px", + marginLeft: "4px", + padding: "4px 8px", + borderRadius: "12px", + background: "#DFFCF8", +})) const ListItemTextStyled = styled(ListItemText)(({ theme }) => ({ fontSize: "2.4rem", @@ -173,6 +189,7 @@ const MenuItemComponent = ({ token, isSelected, selectToken, txType }) => ( <> {token.symbol} {token.name} + {token.earnMarks && Earn marks} } secondary={ @@ -257,7 +274,14 @@ function List(props: TokenListProps) { }, [newToken, filteredTokens]) const listedbyScroll = useMemo(() => { - return filteredTokens?.filter((token: any) => !token.tokenLevel) + return filteredTokens + ?.filter((token: any) => !token.tokenLevel) + .map((token: any) => { + return { + ...token, + earnMarks: tokenList.some(t => t.symbol === token.symbol || t.additionalToken === token.symbol), + } + }) }, [filteredTokens]) const listedbyUser = useMemo(() => { diff --git a/src/pages/bridge/Send/SendTransaction/TransactionSummary.tsx b/src/pages/bridge/Send/SendTransaction/TransactionSummary.tsx index 1d166c2e6..b3a3bb034 100644 --- a/src/pages/bridge/Send/SendTransaction/TransactionSummary.tsx +++ b/src/pages/bridge/Send/SendTransaction/TransactionSummary.tsx @@ -4,7 +4,7 @@ import { makeStyles } from "tss-react/mui" import { Typography } from "@mui/material" import { ETH_SYMBOL } from "@/constants" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" import useBridgeStore from "@/stores/bridgeStore" import { BNToAmount, amountToBN, toTokenDisplay } from "@/utils" @@ -56,7 +56,7 @@ const CustomTypography = ({ isError, ...props }) => = props => { const { classes: styles } = useStyles() const { txType, isNetworkCorrect } = useBridgeStore() - const { tokenPrice } = useBrigeContext() + const { tokenPrice } = useBridgeContext() const { amount, feeError, selectedToken, l1GasFee, l2GasFee, l1DataFee, needApproval } = props @@ -80,8 +80,8 @@ const TransactionSummary: FC = props => { const getDisplayedPrice = useCallback( (amount = "", tokenAddress = "ethereum") => { - if (allowDisplayValue && tokenPrice.price?.[tokenAddress.toLowerCase()]) { - return (+amount * tokenPrice.price[tokenAddress.toLowerCase()].usd).toFixed(2) + if (allowDisplayValue && tokenPrice.price?.[tokenAddress]) { + return (+amount * tokenPrice.price[tokenAddress].usd).toFixed(2) } return "" }, @@ -96,7 +96,8 @@ const TransactionSummary: FC = props => { getDisplayedValue((l1GasFee ?? BigInt(0)) + l2GasFee + (l1DataFee ?? BigInt(0))) let displayedPrice = "" - if (tokenPrice.price?.[selectedToken.address.toLowerCase()]) { + + if (tokenPrice.price?.[selectedToken.address]) { displayedPrice = ( Number(getDisplayedPrice(amount, selectedToken.address)) + Number(getDisplayedPrice(BNToAmount((l1GasFee ?? BigInt(0)) + l2GasFee + (l1DataFee ?? BigInt(0))))) diff --git a/src/pages/bridge/Send/SendTransaction/hooks/useBatchDeposit.ts b/src/pages/bridge/Send/SendTransaction/hooks/useBatchDeposit.ts new file mode 100644 index 000000000..a286fa5d5 --- /dev/null +++ b/src/pages/bridge/Send/SendTransaction/hooks/useBatchDeposit.ts @@ -0,0 +1,54 @@ +import { ethers } from "ethers" +import { useEffect, useMemo } from "react" + +import { BATCH_DEPOSIT_TOKENS, CHAIN_ID } from "@/constants" +import { useBridgeContext } from "@/contexts/BridgeContextProvider" +import useBatchBridgeStore, { BridgeSummaryType } from "@/stores/batchBridgeStore" +import useBridgeStore from "@/stores/bridgeStore" +import { BNToAmount } from "@/utils" + +export default function useBatchDeposit(props) { + const { selectedToken, amount } = props + const { networksAndSigners } = useBridgeContext() + const { txType, isNetworkCorrect } = useBridgeStore() + const { batchDepositConfig, changeBatchDepositConfig, changeBridgeSummaryType } = useBatchBridgeStore() + + const getBatchDepositConfigsByToken = async selectedToken => { + return networksAndSigners[CHAIN_ID.L1].batchBridgeGateway.configs(selectedToken.address || ethers.ZeroAddress) + } + + const enableBatchDeposit = useMemo(() => { + return BATCH_DEPOSIT_TOKENS.includes(selectedToken.symbol) + }, [selectedToken]) + + // < 0.001 need special check for economy mode + const depositAmountIsVaild = useMemo(() => { + const minAmount = BNToAmount(batchDepositConfig.minAmountPerTx, selectedToken.decimals) + if (amount && txType === "Deposit" && enableBatchDeposit) { + return Number(amount) >= Number(minAmount) + } + return true + }, [batchDepositConfig, amount, selectedToken, txType, enableBatchDeposit]) + + useEffect(() => { + if (txType === "Deposit" && enableBatchDeposit) { + changeBridgeSummaryType(BridgeSummaryType.Selector) + if (networksAndSigners[CHAIN_ID.L1].signer) { + getBatchDepositConfigsByToken(selectedToken) + .then(configs => { + changeBatchDepositConfig(configs) + }) + .catch(err => { + console.error("getBatchDepositConfigsByToken", err) + }) + } + } else { + changeBridgeSummaryType(BridgeSummaryType.Summary) + } + }, [txType, isNetworkCorrect, enableBatchDeposit, networksAndSigners, selectedToken]) + + return { + getBatchDepositConfigsByToken, + depositAmountIsVaild, + } +} diff --git a/src/pages/bridge/Send/SendTransaction/index.tsx b/src/pages/bridge/Send/SendTransaction/index.tsx index 3ebff37a8..5b59f7735 100644 --- a/src/pages/bridge/Send/SendTransaction/index.tsx +++ b/src/pages/bridge/Send/SendTransaction/index.tsx @@ -1,14 +1,13 @@ import { useEffect, useMemo, useState } from "react" -import useStorage from "squirrel-gill" +import { useSearchParams } from "react-router-dom" import { Box, Stack, SvgIcon, Typography } from "@mui/material" import { ReactComponent as WarningSvg } from "@/assets/svgs/bridge/warning.svg" import Button from "@/components/Button" import TextButton from "@/components/TextButton" -import { ETH_SYMBOL } from "@/constants" -import { BRIDGE_TOKEN_SYMBOL } from "@/constants/storageKey" -import { useBrigeContext } from "@/contexts/BridgeContextProvider" +import { ETH_SYMBOL, NATIVE_TOKEN_LIST } from "@/constants" +import { BRIDGE_TOKEN } from "@/constants/searchParamsKey" import { usePriceFeeContext } from "@/contexts/PriceFeeProvider" import { useRainbowContext } from "@/contexts/RainbowProvider" import { useAsyncMemo, useBalance } from "@/hooks" @@ -18,24 +17,30 @@ import useCheckViewport from "@/hooks/useCheckViewport" import useGasFee from "@/hooks/useGasFee" import { useSendTransaction } from "@/hooks/useSendTransaction" import useSufficientBalance from "@/hooks/useSufficientBalance" +import useBatchBridgeStore, { BridgeSummaryType, DepositBatchMode } from "@/stores/batchBridgeStore" import useBridgeStore from "@/stores/bridgeStore" -import { amountToBN, switchNetwork, trimErrorMessage } from "@/utils" +import { amountToBN, checkApproved, switchNetwork, trimErrorMessage } from "@/utils" import ApprovalDialog from "./ApprovalDialog" import BalanceInput from "./BalanceInput" +import CustomiseRecipient from "./CustomiseRecipient" +import DepositSelector from "./DepositSelector" import NetworkDirection from "./NetworkDirection" import TransactionSummary from "./TransactionSummary" +import useBatchDeposit from "./hooks/useBatchDeposit" const SendTransaction = props => { - const { chainId, connect } = useRainbowContext() - // TODO: extract tokenList - const { tokenList } = useBrigeContext() + const [searchParams, setSearchParams] = useSearchParams() + const token = searchParams.get(BRIDGE_TOKEN) + const tokenSymbol = useMemo(() => token || ETH_SYMBOL, [token]) + + const { chainId, connect, walletCurrentAddress } = useRainbowContext() const { isMobile } = useCheckViewport() - const [tokenSymbol, setTokenSymbol] = useStorage(localStorage, BRIDGE_TOKEN_SYMBOL, ETH_SYMBOL) const { gasLimit, gasPrice, errorMessage: relayFeeErrorMessage, fetchData: fetchPriceFee, getL1DataFee } = usePriceFeeContext() - const { txType, isNetworkCorrect, fromNetwork, changeTxResult } = useBridgeStore() + const { txType, isNetworkCorrect, fromNetwork, changeTxResult, tokenList } = useBridgeStore() + const { bridgeSummaryType, depositBatchMode, batchDepositConfig } = useBatchBridgeStore() const [amount, setAmount] = useState("") @@ -45,6 +50,7 @@ const SendTransaction = props => { const [inputError, setInputError] = useState(false) const [approvalVisible, setApprovalVisible] = useState(false) + const [recipient, setRecipient] = useState(null) const validAmount = useMemo(() => (Number(amount) > 0 ? amount : ""), [amount]) @@ -52,8 +58,12 @@ const SendTransaction = props => { return fromNetwork.chainId ? tokenList.filter(item => item.chainId === fromNetwork.chainId) : [] }, [tokenList, fromNetwork]) - const selectedToken: any = useMemo(() => tokenOptions.find(item => item.symbol === tokenSymbol) ?? {}, [tokenOptions, tokenSymbol]) - + const selectedToken: any = useMemo( + () => + tokenOptions.find(item => item.symbol.toLowerCase() === tokenSymbol.toLowerCase()) ?? + NATIVE_TOKEN_LIST.find(item => item.chainId === fromNetwork.chainId), + [tokenOptions, tokenSymbol, fromNetwork], + ) // const { balance, isLoading: balanceLoading } = useBalance(selectedToken.address) const { balance, loading: balanceLoading } = useBalance(selectedToken, fromNetwork) @@ -63,6 +73,7 @@ const SendTransaction = props => { isRequested: isRequestedApproval, isLoading: approveLoading, } = useApprove(fromNetwork, selectedToken, validAmount) + const { send: sendTransaction, isLoading: sendLoading, @@ -70,10 +81,20 @@ const SendTransaction = props => { } = useSendTransaction({ amount: validAmount, selectedToken, + receiver: recipient, + needApproval, }) + const { depositAmountIsVaild } = useBatchDeposit({ selectedToken, amount: validAmount }) + // fee start - const { gasFee: estimatedGasCost, gasLimit: txGasLimit, error: gasFeeErrorMessage, calculateGasFee } = useGasFee(selectedToken, needApproval) + const { + gasFee: estimatedGasCost, + batchDepositGasFee: estimatedBatchDepositGasCost, + gasLimit: txGasLimit, + error: gasFeeErrorMessage, + calculateGasFee, + } = useGasFee(selectedToken, needApproval) const l1DataFee = useAsyncMemo( async () => @@ -82,11 +103,25 @@ const SendTransaction = props => { : BigInt(0), [amount, selectedToken, txGasLimit, txType], ) - const relayFee = useMemo(() => gasLimit * gasPrice, [gasLimit, gasPrice]) + + const l1GasFee = useMemo(() => { + if (depositBatchMode === DepositBatchMode.Economy && bridgeSummaryType === BridgeSummaryType.Selector) { + return estimatedBatchDepositGasCost + } + return estimatedGasCost + }, [depositBatchMode, bridgeSummaryType, estimatedBatchDepositGasCost, estimatedGasCost]) + + const l2GasFee = useMemo(() => { + if (depositBatchMode === DepositBatchMode.Economy && bridgeSummaryType === BridgeSummaryType.Selector) { + return batchDepositConfig.feeAmountPerTx + } + return relayFee + }, [depositBatchMode, bridgeSummaryType, batchDepositConfig, relayFee]) + const totalFee = useMemo( - () => (estimatedGasCost && !relayFeeErrorMessage ? estimatedGasCost + relayFee + (l1DataFee ?? BigInt(0)) : null), - [estimatedGasCost, relayFeeErrorMessage, relayFee, l1DataFee], + () => (l1GasFee && !relayFeeErrorMessage ? l1GasFee + l2GasFee + (l1DataFee ?? BigInt(0)) : null), + [l1GasFee, relayFeeErrorMessage, l2GasFee, l1DataFee], ) const { insufficientWarning } = useSufficientBalance( @@ -99,7 +134,7 @@ const SendTransaction = props => { useEffect(() => { let nextBridgeWarning let nextInputError = false - if (!chainId) { + if (!walletCurrentAddress) { nextBridgeWarning = ( Connect wallet @@ -146,8 +181,8 @@ const SendTransaction = props => { // fee end const necessaryCondition = useMemo(() => { - return validAmount && !bridgeWarning - }, [validAmount, bridgeWarning]) + return validAmount && !bridgeWarning && (depositAmountIsVaild || (!depositAmountIsVaild && depositBatchMode === DepositBatchMode.Fast)) + }, [validAmount, bridgeWarning, depositAmountIsVaild, depositBatchMode]) const sendText = useMemo(() => { if (txType === "Deposit" && sendLoading) { @@ -186,7 +221,7 @@ const SendTransaction = props => { }, [isRequestedApproval]) const handleChangeTokenSymbol = symbol => { - setTokenSymbol(symbol) + setSearchParams({ [BRIDGE_TOKEN]: symbol }) } const handleChangeAmount = value => { @@ -209,8 +244,12 @@ const SendTransaction = props => { approve(isMaximum) } + const handleChangeRecipient = recipient => { + setRecipient(recipient) + } + const renderButton = () => { - if (!chainId) { + if (!walletCurrentAddress) { return ( + + )} + + ) +} +export default BadgeList diff --git a/src/pages/canvas-badge/Badges/index.tsx b/src/pages/canvas-badge/Badges/index.tsx new file mode 100644 index 000000000..1dd5e2d85 --- /dev/null +++ b/src/pages/canvas-badge/Badges/index.tsx @@ -0,0 +1,152 @@ +import { useMemo, useState } from "react" +import { useDebounce } from "react-use" +import { makeStyles } from "tss-react/mui" + +import { Box, Typography } from "@mui/material" +import useScrollTrigger from "@mui/material/useScrollTrigger" + +import SectionWrapper from "@/components/SectionWrapper" +import { CANVAS_AND_BADGES_PAGE_SYMBOL, CATEGORY_LIST, NORMAL_HEADER_HEIGHT, SORT_LIST } from "@/constants" +import SearchInput from "@/pages/ecosystem/Protocols/SeachInput" + +import Select from "../components/Select" +import BadgeList from "./BadgeList" + +const useStyles = makeStyles()((theme, { stickyTop }) => ({ + grid: { + width: "100%", + display: "grid", + gridTemplateColumns: "max-content 1fr max-content max-content", + gridTemplateRows: "max-content", + rowGap: "4rem", + columnGap: "1.6rem", + alignItems: "center", + marginBottom: "1.4rem", + backgroundColor: theme.palette.themeBackground.dark, + padding: "1.8rem 0", + + [theme.breakpoints.down("lg")]: { + gridTemplateColumns: "1fr repeat(2, max-content)", + gridTemplateRows: "repeat(2, min-content)", + rowGap: "2.4rem", + columnGap: "0.8rem", + marginBottom: "0.6rem", + }, + + [theme.breakpoints.down("md")]: { + gridTemplateColumns: "max-content minmax(12.9rem, 1fr)", + gridTemplateRows: "repeat(3, min-content)", + // rowGap: "2.4rem", + columnGap: "0.8rem", + }, + + [theme.breakpoints.up("md")]: { + position: "sticky", + top: stickyTop, + zIndex: 1, + }, + }, + search: { + justifySelf: "flex-end", + width: "100%", + [theme.breakpoints.down("lg")]: { + justifySelf: "stretch", + }, + [theme.breakpoints.down("md")]: { + gridColumn: "1 / 3", + }, + }, + sort: { + [theme.breakpoints.down("md")]: { + gridColumn: "1 / 1", + }, + }, + category: { + [theme.breakpoints.down("md")]: { + gridColumn: "2 / 3", + }, + [theme.breakpoints.down("sm")]: {}, + }, +})) + +const Badges = () => { + const trigger = useScrollTrigger() + const stickyTop = useMemo(() => (trigger ? 0 : NORMAL_HEADER_HEIGHT), [trigger]) + + const { classes } = useStyles({ stickyTop }) + const [searchInput, setSearchInput] = useState("") + + const [searchParams, setSearchParams] = useState({ + category: CATEGORY_LIST[0].key, + sort: SORT_LIST[0].key, + keyword: "", + page: 1, + }) + + useDebounce( + () => { + setSearchParams(pre => ({ + ...pre, + page: 1, + keyword: searchInput.trim(), + })) + }, + 5e2, + [searchInput], + ) + + const handleChangeKeyword = e => { + e.preventDefault() + setSearchInput(e.target.value) + } + + const handleChangeSelect = (value, field) => { + setSearchParams(pre => ({ + ...pre, + page: 1, + [field]: value, + })) + } + + const handleChangePage = () => { + setSearchParams(pre => ({ + ...pre, + page: pre.page + 1, + })) + } + + return ( + +
    + + + Discover Badges + + + + + + +
    + ) +} + +export default Badges diff --git a/src/pages/canvas-badge/FeaturedBadges/index.tsx b/src/pages/canvas-badge/FeaturedBadges/index.tsx new file mode 100644 index 000000000..daa9de749 --- /dev/null +++ b/src/pages/canvas-badge/FeaturedBadges/index.tsx @@ -0,0 +1,61 @@ +import { Box, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ExternalLinkSvg } from "@/assets/svgs/canvas-badge/external-link.svg" +import { ReactComponent as PassportSvg } from "@/assets/svgs/canvas-badge/passport-logo.svg" +import SectionWrapper from "@/components/SectionWrapper" +import Button from "@/pages/canvas/components/Button" + +const FeaturedBadges = () => { + return ( + + + + Featured badges + + + + + + Show your ZK talent + + + Developer empowerment through onchain attestation. Mint your ZK privacy, infra or rollup talent badge! + + + + + + + ) +} + +export default FeaturedBadges diff --git a/src/pages/canvas-badge/Header/Counter.tsx b/src/pages/canvas-badge/Header/Counter.tsx new file mode 100644 index 000000000..8933dba26 --- /dev/null +++ b/src/pages/canvas-badge/Header/Counter.tsx @@ -0,0 +1,43 @@ +import { Flip } from "number-flip" +import { useEffect, useRef } from "react" +import { usePrevious } from "react-use" + +const Counter = props => { + const { number } = props + const numberNodeRef = useRef(null) + const numberFlipRef = useRef() + const preNumber = usePrevious(number) + + useEffect(() => { + numberFlipRef.current = new Flip({ + node: numberNodeRef.current, + from: 0, + to: number, + duration: 1, + separator: ",", + }) + }, []) + + useEffect(() => { + if (numberFlipRef.current && numberNodeRef.current) { + if (String(number).length === String(preNumber).length) { + numberFlipRef.current.flipTo({ + to: number, + }) + } else { + numberNodeRef.current.querySelectorAll("*").forEach(n => n.remove()) + numberFlipRef.current = new Flip({ + node: numberNodeRef.current, + from: Number("1" + new Array(String(number).length - 1).fill("0").join("")), + to: number, + duration: 1, + separator: ",", + }) + } + } + }, [number]) + + return
    +} + +export default Counter diff --git a/src/pages/canvas-badge/Header/Statistic.tsx b/src/pages/canvas-badge/Header/Statistic.tsx new file mode 100644 index 000000000..1cc71f008 --- /dev/null +++ b/src/pages/canvas-badge/Header/Statistic.tsx @@ -0,0 +1,45 @@ +import { Skeleton, Stack, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import NumberTypography from "@/components/NumberTypography" + +const StatisticSkeleton = styled(Skeleton)(({ theme }) => ({ + borderRadius: "1rem", + width: "50%", + display: "inline-block", +})) + +const Statistic = props => { + const { label, children, loading } = props + + return ( + + + {label} + + + {loading ? : <>{children}} + + + ) +} + +export default Statistic diff --git a/src/pages/canvas-badge/Header/index.tsx b/src/pages/canvas-badge/Header/index.tsx new file mode 100644 index 000000000..a2acb7f80 --- /dev/null +++ b/src/pages/canvas-badge/Header/index.tsx @@ -0,0 +1,200 @@ +import { useQuery } from "@tanstack/react-query" +import { motion } from "framer-motion" +import { useEffect, useRef, useState } from "react" +import Img from "react-cool-img" +import { useLocation } from "react-router-dom" + +import { Box, Container, Stack, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import { retrieveCanvasBadgeURL } from "@/apis/canvas-badge" +import Button from "@/components/Button" +import { CANVAS_AND_BADGES_PAGE_SYMBOL, CANVAS_URL, HEADER_BADGES, HEADER_STARS, ISSUE_BADGES_URL } from "@/constants" +import useCheckViewport from "@/hooks/useCheckViewport" + +import Counter from "./Counter" +import Statistic from "./Statistic" + +const ImageWrapper = motion(Box) + +const BadgesButton = styled(Button)(({ theme }) => ({ + backgroundColor: theme.palette.themeBackground.dark, + [theme.breakpoints.down("sm")]: { + width: "100%", + }, +})) + +const Header = () => { + const { hash } = useLocation() + const { isMobile } = useCheckViewport() + const [badgesScale, setBadgesScale] = useState(1) + const [starsScale, setStarsScale] = useState(1) + + const badgesContainerRef = useRef() + + const { data } = useQuery({ + queryKey: ["totalCount"], + queryFn: async () => { + const data = await scrollRequest(retrieveCanvasBadgeURL, { + method: "POST", + body: JSON.stringify({ + canvas: true, + badges: true, + }), + }) + return data + }, + refetchInterval: 18e4, // 3 mins + placeholderData: { canvasCount: 100000, badgesCount: 100000 }, + }) + + useEffect(() => { + if (hash) { + const targetEl = document.getElementById(`${CANVAS_AND_BADGES_PAGE_SYMBOL}-${hash.slice(1)}`) + if (targetEl) { + targetEl.scrollIntoView({ + behavior: "instant", + }) + } + } + }, [hash]) + + useEffect(() => { + const handleWindowResize = () => { + if (badgesContainerRef.current?.clientWidth && badgesContainerRef.current.clientWidth < 1328) { + setBadgesScale(badgesContainerRef.current.clientWidth / 1328) + } else { + setBadgesScale(1) + } + if (window.screen.width < 1512) { + setStarsScale((window.screen.width - 120) / 1512) + } else { + setStarsScale(1) + } + } + handleWindowResize() + + window.addEventListener("resize", handleWindowResize) + + return () => { + window.removeEventListener("resize", handleWindowResize) + } + }, []) + + return ( + ({ + [theme.breakpoints.down("lg")]: { + height: "76vw", + }, + [theme.breakpoints.down("md")]: { + height: "75rem", + }, + [theme.breakpoints.down("sm")]: { + height: "62rem", + }, + }), + ]} + > + + {HEADER_STARS.map(({ icon, size, left, top }) => ( + + + + ))} + + + Canvas and Badges + + + + Build your on-chain persona and collect badges across Scroll’s ecosystem + + + + + + + + + + + + Visit Canvas + + + Issue Badges + + + + + + {HEADER_BADGES.map(({ image, top, left, width }, index) => ( + + + + ))} + + + + ) +} + +export default Header diff --git a/src/pages/canvas-badge/Introduction/index.tsx b/src/pages/canvas-badge/Introduction/index.tsx new file mode 100644 index 000000000..ec384330d --- /dev/null +++ b/src/pages/canvas-badge/Introduction/index.tsx @@ -0,0 +1,74 @@ +import { Box, Stack, SvgIcon, Typography } from "@mui/material" + +import Button from "@/components/Button" +import Link from "@/components/Link" +import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" +import SectionWrapper from "@/components/SectionWrapper" +import { CANVAS_BADGE_INTRODUCTIONS, CANVAS_URL, ISSUE_BADGES_URL } from "@/constants" +import useCheckViewport from "@/hooks/useCheckViewport" + +const Introduction = () => { + const { isMobile, isPortrait } = useCheckViewport() + return ( + + + + Attested Badges, Not Tokens + + + Unlike NFTs, badges are non-transferable proofs of your unique traits, status and achievements, thanks to integration with{" "} + + Ethereum Attestation Service + + . + + + + {CANVAS_BADGE_INTRODUCTIONS.map(({ key, icon, label, items }) => ( + + {icon} + {label} + + {items.map(({ icon, title, content }, index) => ( + + + + {title} + + + {content} + + + ))} + + {key === "user" ? ( + + ) : ( + + )} + + + + ))} + + + ) +} + +export default Introduction diff --git a/src/pages/canvas-badge/components/Select.tsx b/src/pages/canvas-badge/components/Select.tsx new file mode 100644 index 000000000..7ddf4b925 --- /dev/null +++ b/src/pages/canvas-badge/components/Select.tsx @@ -0,0 +1,99 @@ +import { makeStyles } from "tss-react/mui" + +import { MenuItem, Select as MuiSelect, Typography } from "@mui/material" + +import { ReactComponent as TriangleDownIcon } from "@/assets/svgs/common/triangle-down.svg" + +const useStyles = makeStyles()(theme => ({ + root: { + width: "24rem", + [theme.breakpoints.down("sm")]: { + width: "100%", + }, + }, + select: { + padding: "0.6rem 2.4rem 0.6rem 2.4rem !important", + + backgroundColor: `${theme.palette.themeBackground.tag} !important`, + borderRadius: "2.4rem !important", + p: { + color: theme.palette.primary.contrastText, + overflow: "hidden", + whiteSpace: "nowrap", + textOverflow: "ellipsis", + }, + [theme.breakpoints.down("sm")]: { + padding: "1.1rem 4.2rem 1.1rem 1.6rem !important", + }, + }, + icon: { + top: "50%", + transform: "translateY(-50%)", + right: "2.4rem", + willChange: "transform", + transition: "transform .3s ease-in-out", + color: theme.palette.primary.contrastText, + [theme.breakpoints.down("sm")]: { + right: "2rem", + }, + }, + iconOpen: { + transform: "translateY(-50%) rotate(180deg)", + }, + popover: { + borderRadius: "0.5rem", + marginTop: "0.8rem", + }, + menuList: { + padding: "0.8rem 0", + }, +})) + +const Select = props => { + const { className, items = [], ...restProps } = props + const { classes, cx } = useStyles() + + return ( + + {items.map(({ key, label }) => ( + + + {label} + + + ))} + + ) +} + +export default Select diff --git a/src/pages/canvas-badge/index.tsx b/src/pages/canvas-badge/index.tsx new file mode 100644 index 000000000..1c66b44fe --- /dev/null +++ b/src/pages/canvas-badge/index.tsx @@ -0,0 +1,17 @@ +import Badges from "./Badges" +import FeaturedBadges from "./FeaturedBadges" +import Header from "./Header" +import Introduction from "./Introduction" + +const CanvasBadge = () => { + return ( + <> +
    + + + + + ) +} + +export default CanvasBadge diff --git a/src/pages/canvas/Dashboard/ActionBox/index.tsx b/src/pages/canvas/Dashboard/ActionBox/index.tsx new file mode 100644 index 000000000..bda3dec70 --- /dev/null +++ b/src/pages/canvas/Dashboard/ActionBox/index.tsx @@ -0,0 +1,431 @@ +import copy from "copy-to-clipboard" +import { motion } from "framer-motion" +import { Fragment, useCallback, useMemo, useState } from "react" +import { useNavigate, useParams } from "react-router-dom" + +import { Badge, Box, CircularProgress, Menu, MenuItem, Slide, Stack, SvgIcon } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as BadgesSvg } from "@/assets/svgs/canvas/badges.svg" +import { ReactComponent as CopySuccessSvg } from "@/assets/svgs/canvas/copy-success.svg" +import { ReactComponent as EthSvg } from "@/assets/svgs/canvas/eth.svg" +import { ReactComponent as GiftSvg } from "@/assets/svgs/canvas/gift.svg" +import { ReactComponent as ShareSvg } from "@/assets/svgs/canvas/share.svg" +import { ReactComponent as ExternalLinkSvg } from "@/assets/svgs/common/external-link.svg" +import { ReactComponent as TwitterSvg } from "@/assets/svgs/nft/twitter.svg" +import { ISSUE_BADGES_URL } from "@/constants" +import { EXPLORE_BADGES_URL } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import Button from "@/pages/canvas/components/Button" +import useCanvasStore, { BadgesDialogType } from "@/stores/canvasStore" +import usePerkStore from "@/stores/perksStore" +import { generateShareTwitterURL, requireEnv } from "@/utils" + +const MotionMenuItem = motion(MenuItem) + +interface Action { + label: string | (() => React.ReactNode) + icon: React.ComponentType + color: "primary" | "secondary" + onClick: (event?) => void + visible: boolean + withBadge?: boolean + menu?: { + anchorEl: HTMLElement | null + open: boolean + onClose: () => void + items: Array<{ + key: string + label: string | (() => React.ReactNode) + extra?: React.ReactNode + disabled?: boolean + external?: boolean + onClick: () => void + }> + } +} + +const Container = styled(Box, { shouldForwardProp: prop => prop !== "othersWalletAddress" })(({ theme, othersWalletAddress }) => ({ + display: "grid", + gridTemplateColumns: `repeat(${othersWalletAddress ? 1 : 4}, 15.6rem)`, + width: "100%", + justifyContent: "center", + gap: "0.8rem", + position: "absolute", + bottom: 0, + [theme.breakpoints.down("md")]: { + gridTemplateColumns: `repeat(${othersWalletAddress ? 1 : 2}, 15.6rem)`, + zIndex: 99, + padding: "2.4rem 2rem", + bottom: 0, + "& > button": { + width: "100%", + }, + }, + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: `repeat(${othersWalletAddress ? 1 : 2}, 1fr)`, + }, +})) + +const ActionButton = styled(Button)(({ theme }) => ({ + width: "15.6rem", + height: "4rem", + borderRadius: "0.4rem", + fontSize: "1.6rem", + ".MuiButton-startIcon>*:nth-of-type(1)": { + fontSize: "2rem", + }, + ".MuiButton-startIcon": { + position: "relative", + [theme.breakpoints.down("sm")]: { + marginRight: "4px", + }, + }, +})) + +const CustomMenu = styled(Menu, { shouldForwardProp: prop => prop !== "dropdownWidth" })(({ theme, dropdownWidth }) => ({ + "& .MuiPaper-root": { + borderRadius: "0.5rem", + padding: "0 0.8rem", + marginTop: "-0.8rem", + minWidth: "15.6rem", + [theme.breakpoints.down("sm")]: { + minWidth: dropdownWidth, + }, + }, + "& .MuiMenu-list": { + [theme.breakpoints.down("sm")]: { + padding: 0, + }, + }, +})) + +const CustomiseItem = styled(MotionMenuItem, { shouldForwardProp: prop => prop !== "external" })(({ theme, external }) => ({ + position: "relative", + display: "flex", + justifyContent: external ? "flex-start" : "space-between", + gap: "0.8rem", + padding: "0.8rem", + backgroundColor: "#FFFFFF", + color: "#000000", + fontSize: "1.6rem", + fontWeight: 600, + "&:hover": { + backgroundColor: "#FFFFFF", + color: theme.palette.primary.main, + }, + "&.Mui-disabled": { + opacity: 0.6, + }, +})) + +const BadgeCount = styled("span")(({ theme, round }) => ({ + display: "inline-block", + // height: "1.6rem", + minWidth: "1.6rem", + borderRadius: round ? "0.8rem" : "0.4rem", + padding: round ? "0 3px" : "4px 8px", + backgroundColor: theme.palette.primary.main, + color: theme.palette.primary.contrastText, + fontFamily: "var(--developer-page-font-family)", + fontSize: "1rem", + lineHeight: "1.6rem", + textAlign: "center", + marginLeft: "0.8rem", +})) + +const ActionBox = () => { + const { address: othersWalletAddress } = useParams() + const navigate = useNavigate() + + const { walletCurrentAddress } = useRainbowContext() + const { + changeCustomizeDisplayDialogVisible, + + changeReferDialog, + changeBadgesDialogVisible, + upgradableBadges, + pickUpgradableBadgesLoading, + notifiableBadgesLoading, + notifiableBadges, + } = useCanvasStore() + const { changePerksDialogVisible, newPerksIds } = usePerkStore() + + const { isPortrait } = useCheckViewport() + + const [copied, setCopied] = useState(false) + + const canvasUrl = useMemo( + () => `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas/${othersWalletAddress || walletCurrentAddress}`, + [othersWalletAddress, walletCurrentAddress], + ) + + const shareTwitterURL = useMemo(() => { + const myText = "Build your onchain story. I just minted my Scroll Canvas and collected my first badge!" + const othersText = "Check out this Scroll Canvas!" + const text = othersWalletAddress ? othersText : myText + return generateShareTwitterURL(canvasUrl, text) + }, [canvasUrl, othersWalletAddress]) + + const handleCopyLink = useCallback(() => { + copy(canvasUrl) + setCopied(true) + setTimeout(() => { + setCopied(false) + }, 3e3) + }, []) + + const handleCloseShare = () => { + setShareAnchorEl(null) + setCopied(false) + } + + const [badgesAnchorEl, setBadgesAnchorEl] = useState(null) + const [isHovering, setIsHovering] = useState("") + + const badgesOpen = Boolean(badgesAnchorEl) + + const handleCloseMenu = () => { + setBadgesAnchorEl(null) + } + + const [shareAnchorEl, setShareAnchorEl] = useState(null) + const [dropdownWidth, setDropdownWidth] = useState() + + const shareOpen = Boolean(shareAnchorEl) + + const actions: Action[] = useMemo(() => { + return [ + { + label: "Invite & Give", + icon: EthSvg, + color: "primary", + onClick: () => changeReferDialog(true), + visible: !othersWalletAddress, + }, + { + label: "Badges", + icon: BadgesSvg, + color: "secondary", + onClick: event => { + setBadgesAnchorEl(event.currentTarget) + if (event.currentTarget) { + setDropdownWidth(event.currentTarget.getBoundingClientRect().width + "px") + } + }, + visible: !othersWalletAddress, + withBadge: !!upgradableBadges.length || !!notifiableBadges.length, + loading: pickUpgradableBadgesLoading || notifiableBadgesLoading, + menu: { + anchorEl: badgesAnchorEl, + open: badgesOpen, + onClose: handleCloseMenu, + items: [ + { + key: "customize", + label: "Customize display", + extra: notifiableBadgesLoading ? ( + + ) : notifiableBadges.length ? ( + {notifiableBadges.length} Gifted + ) : null, + disabled: notifiableBadgesLoading, + onClick: () => { + handleCloseMenu() + changeCustomizeDisplayDialogVisible(true) + }, + }, + ...(upgradableBadges.length + ? [ + { + key: "upgrade", + label: "Upgrade badges", + extra: upgradableBadges.length ? ( + {upgradableBadges.length > 99 ? "99+" : upgradableBadges.length} + ) : null, + onClick: () => { + handleCloseMenu() + changeBadgesDialogVisible(BadgesDialogType.UPGRADE) + }, + }, + ] + : []), + { + key: "explore", + label: "Explore badges", + onClick: () => { + navigate(EXPLORE_BADGES_URL) + }, + }, + { + key: "issue", + label: "Issue badges", + external: true, + onClick: () => { + window.open(ISSUE_BADGES_URL) + }, + }, + ], + }, + }, + { + label: "Perks", + icon: GiftSvg, + color: "secondary", + withBadge: !!newPerksIds.length, + onClick: () => changePerksDialogVisible(true), + visible: !othersWalletAddress, + }, + + { + label: "Share Canvas", + icon: ShareSvg, + color: "secondary", + onClick: event => { + setShareAnchorEl(event.currentTarget) + if (event.currentTarget) { + setDropdownWidth(event.currentTarget.getBoundingClientRect().width + "px") + } + }, + visible: true, + menu: { + anchorEl: shareAnchorEl, + open: shareOpen, + onClose: handleCloseShare, + items: [ + { + key: "twitter", + label: () => ( + + <>Share to + + + ), + onClick: () => { + handleCloseShare() + window.open(shareTwitterURL) + }, + }, + { + key: "link", + label: () => ( + <> + {copied ? "Link copied" : "Copy link"} + {copied && } + + ), + onClick: handleCopyLink, + }, + ], + }, + }, + ] + }, [ + othersWalletAddress, + shareTwitterURL, + badgesAnchorEl, + badgesOpen, + shareAnchorEl, + shareOpen, + handleCopyLink, + copied, + upgradableBadges.length, + pickUpgradableBadgesLoading, + notifiableBadgesLoading, + notifiableBadges, + ]) + + const handleMouseEnter = item => { + if (item.external) { + setIsHovering(item.key) + } + } + + const handleMouseLeave = () => { + setIsHovering("") + } + + const renderActionIcon = action => { + if (action.withBadge) { + return ( + + + + ) + } else if (action.loading) { + return ( + <> + + + + ) + } + return + } + + return ( + + + {actions + .filter(action => action.visible) + .map((action, index) => ( + + renderActionIcon(action))()}> + {typeof action.label === "function" ? action.label() : action.label} + + {action.menu && ( + + {action.menu.items.map((item, index) => ( + handleMouseEnter(item)} + onHoverEnd={handleMouseLeave} + disabled={item.disabled} + animate={isHovering === item.key ? "active" : "inactive"} + > + {typeof item.label === "function" ? item.label() : item.label} + {item.extra} + {item.external && ( + + + + )} + + ))} + + )} + + ))} + + + ) +} + +export default ActionBox diff --git a/src/pages/canvas/Dashboard/BadgeDetailDialog/UpgradeAction.tsx b/src/pages/canvas/Dashboard/BadgeDetailDialog/UpgradeAction.tsx new file mode 100644 index 000000000..09ec167af --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeDetailDialog/UpgradeAction.tsx @@ -0,0 +1,50 @@ +import { Box } from "@mui/material" +import { styled } from "@mui/material/styles" + +import Button from "@/pages/canvas/components/Button" + +const UpgradedBox = styled(Box)(({ theme }) => ({ + display: "inline-flex", + width: "max-content", + gap: "1.6rem", + backgroundColor: theme.palette.primary.main, + padding: "0 1.6rem", + height: "4.8rem", + alignItems: "center", + color: "#FFEBD7", + fontSize: "1.6rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + gap: "0.8rem", + }, +})) + +const UpgradedButton = styled(Button)(({ theme }) => ({ + borderRadius: "0.4rem", + fontSize: "1.6rem", + fontWeight: 600, + height: "3.4rem !important", + width: "12.2rem", + border: "1px solid #FFEBD7", + color: "#FFEBD7", + padding: 0, + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + width: "10rem", + }, +})) + +const UpgradeAction = props => { + const { sx, loading, onClick } = props + return ( + + UPGRADE AVAILABLE + + {loading ? "Upgrading" : "Upgrade now"} + + + ) +} + +export default UpgradeAction diff --git a/src/pages/canvas/Dashboard/BadgeDetailDialog/index.tsx b/src/pages/canvas/Dashboard/BadgeDetailDialog/index.tsx new file mode 100644 index 000000000..24979f2b2 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeDetailDialog/index.tsx @@ -0,0 +1,322 @@ +import { useQuery } from "@tanstack/react-query" +import { forwardRef, useEffect, useMemo, useRef, useState } from "react" +import { useNavigate, useParams } from "react-router-dom" + +import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined" +import { Avatar, Box, Stack, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as ShareSvg } from "@/assets/svgs/canvas/share.svg" +import ScrollButton from "@/components/Button" +import Link from "@/components/Link" +import Skeleton from "@/components/Skeleton" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useSnackbar from "@/hooks/useSnackbar" +import Dialog from "@/pages/canvas/components/Dialog" +import { checkBadgeUpgradable, fetchIssuer, fetchNotionBadgeByAddr, mintBadge } from "@/services/canvasService" +import useCanvasStore, { BadgeDetailDialogType, BadgesDialogType } from "@/stores/canvasStore" +import { generateShareTwitterURL, ipfsToBrowserURL, requireEnv, sentryDebug } from "@/utils" + +import BadgeDesc from "../../components/BadgeDesc" +import BadgeImage from "../../components/BadgeImage" +import UpgradeAction from "./UpgradeAction" + +const ButtonContainer = styled(forwardRef((props, ref) => ))(({ theme }) => ({ + position: "relative", + display: "flex", + gap: "1.6rem", + alignItems: "center", + [theme.breakpoints.down("sm")]: { + width: "100%", + padding: "2.4rem 2rem", + display: "grid", + gridTemplateColumns: "1fr min-content", + position: "fixed", + bottom: 0, + "& > div": { + width: "100%", + }, + "& .viewBtn": { + gridColumn: "span 2", + }, + "& .mintBtn": { + gridColumn: "span 2", + }, + "& .tip": { + gridColumn: "span 2", + }, + }, +})) + +const BadgeDetailDialog = () => { + const { walletCurrentAddress, provider } = useRainbowContext() + const { + canvasUsername, + badgeDetailDialogVisible, + changeBadgeDetailDialog, + selectedBadge, + changeBadgesDialogVisible, + queryVisibleBadges, + isBadgeMinting, + isBadgeUpgrading, + changeIsBadgeMinting, + changeIsBadgeUpgrading, + changeSelectedBadge, + upgradeBadgeAndRefreshUserBadges, + } = useCanvasStore() + const navigate = useNavigate() + const { address: othersWalletAddress } = useParams() + + const alertWarning = useSnackbar() + const { isMobile } = useCheckViewport() + + const [actionHeight, setActionHeight] = useState("auto") + const actionsRef = useRef() + + const { data: badgeIssuer, isFetching } = useQuery({ + queryKey: ["notionBadge", selectedBadge.badgeContract], + queryFn: async () => { + const badge = await fetchNotionBadgeByAddr(selectedBadge.badgeContract) + if (badge.issuer) { + return badge.issuer + } else if (selectedBadge.issuerName) { + const issuer = await fetchIssuer(selectedBadge.issuerName) + return issuer + } + return {} + }, + initialData: {}, + }) + + const shareBadgeURL = useMemo(() => { + const viewURL = `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas/badge/${selectedBadge.id}` + const myText = `I just minted ${selectedBadge.name} badge. Find out your eligibility on Scroll Canvas, too!` + const othersText = "Checkout this badge and check your eligibility!" + return generateShareTwitterURL(viewURL, othersWalletAddress ? othersText : myText) + }, [selectedBadge, othersWalletAddress, canvasUsername]) + + const shareBadgeContractURL = useMemo(() => { + const viewURL = `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas/badge-contract/${selectedBadge.badgeContract}` + return generateShareTwitterURL(viewURL, `Find out your eligibility to mint a ${selectedBadge.name} badge on Scroll Canvas.`) + }, [selectedBadge]) + + useEffect(() => { + if (badgeDetailDialogVisible !== BadgeDetailDialogType.HIDDEN && actionsRef?.current) { + setActionHeight((actionsRef.current as HTMLDivElement).getBoundingClientRect().height + "px") + } + }, [badgeDetailDialogVisible]) + + const handleClose = () => { + changeBadgeDetailDialog(BadgeDetailDialogType.HIDDEN) + changeBadgesDialogVisible(BadgesDialogType.HIDDEN) + } + + const handleMint = async () => { + changeIsBadgeMinting(selectedBadge.badgeContract, true) + try { + const result = await mintBadge(provider, walletCurrentAddress, selectedBadge) + if (result) { + await queryVisibleBadges(provider, walletCurrentAddress) + alertWarning( + <> + {selectedBadge.name} minted successfully!

    + + View badge details + + , + "success", + ) + changeBadgeDetailDialog(BadgeDetailDialogType.HIDDEN) + } + } catch (e) { + alertWarning(e.message) + } finally { + changeIsBadgeMinting(selectedBadge.badgeContract, false) + } + } + + const handleViewCanvas = () => { + changeBadgeDetailDialog(BadgeDetailDialogType.HIDDEN) + navigate("/canvas") + } + + const handleViewBadge = () => { + changeBadgeDetailDialog(BadgeDetailDialogType.HIDDEN) + changeBadgesDialogVisible(BadgesDialogType.HIDDEN) + navigate(`/canvas/badge/${selectedBadge.id}`) + } + + const handleViewBadgeContract = () => { + changeBadgeDetailDialog(BadgeDetailDialogType.HIDDEN) + changeBadgesDialogVisible(BadgesDialogType.HIDDEN) + navigate(`/canvas/badge-contract/${selectedBadge.badgeContract}`) + } + + const handleBack = () => { + changeBadgeDetailDialog(BadgeDetailDialogType.HIDDEN) + } + + const handleUpgradeBadge = async () => { + try { + const metadata = await upgradeBadgeAndRefreshUserBadges(provider, selectedBadge) + const checkedBadge = await checkBadgeUpgradable(provider, selectedBadge) + changeSelectedBadge({ ...selectedBadge, ...metadata, upgradable: checkedBadge.upgradable }) + alertWarning(`You have successfully upgraded ${selectedBadge.name} to ${metadata.name}`, "success") + } catch (e) { + alertWarning(`Something wrong, try again later`) + sentryDebug(`upgrade badge: ${selectedBadge.id}-${e.message}`) + } finally { + changeIsBadgeUpgrading(selectedBadge.id, false) + } + } + + const renderMintTip = () => { + return ( + <> + {[BadgeDetailDialogType.NO_CANVAS].includes(badgeDetailDialogVisible) && ( + + + + You need a Scroll Canvas in order to mint your {selectedBadge.name} Badge. + + + )} + {[BadgeDetailDialogType.MINT].includes(badgeDetailDialogVisible) && selectedBadge.airdrop && ( + + + + You are eligible. Your badge will be airdroped by the issuer. + + + )} + + ) + } + + return ( + theme.zIndex.modal + 1 }} + disablePortal={isMobile} + open={badgeDetailDialogVisible !== BadgeDetailDialogType.HIDDEN} + roof={ + selectedBadge.upgradable && ( + + ) + } + onBack={handleBack} + onClose={handleClose} + > + + + {[BadgeDetailDialogType.MINT, BadgeDetailDialogType.VIEW, BadgeDetailDialogType.NO_CANVAS].includes(badgeDetailDialogVisible) && ( + <> + + {selectedBadge.name} + + theme.multilineEllipsis, + ]} + > + {selectedBadge.description} + + + + {isFetching ? ( + + ) : ( + <> + + + {badgeIssuer.name || "Unknown"} + + + )} + + + )} + {!isMobile && renderMintTip()} + + + {[BadgeDetailDialogType.MINT].includes(badgeDetailDialogVisible) && ( + + {isBadgeMinting.get(selectedBadge.badgeContract) ? "Minting" : "Mint badge"} + + )} + {isMobile && renderMintTip()} + + {[BadgeDetailDialogType.NO_CANVAS].includes(badgeDetailDialogVisible) && ( + + View Scroll Canvas + + )} + + {[BadgeDetailDialogType.MINT].includes(badgeDetailDialogVisible) && ( + + View details + + )} + {[BadgeDetailDialogType.VIEW].includes(badgeDetailDialogVisible) && ( + + View details + + )} + + {[BadgeDetailDialogType.VIEW].includes(badgeDetailDialogVisible) && ( + + + + )} + {[BadgeDetailDialogType.MINT].includes(badgeDetailDialogVisible) && ( + + + + )} + + + + ) +} + +export default BadgeDetailDialog diff --git a/src/pages/canvas/Dashboard/BadgeWall/Avatar/AvatarTooltip.tsx b/src/pages/canvas/Dashboard/BadgeWall/Avatar/AvatarTooltip.tsx new file mode 100644 index 000000000..6d13d8f9c --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Avatar/AvatarTooltip.tsx @@ -0,0 +1,35 @@ +import { Box } from "@mui/material" + +import Tooltip from "@/pages/canvas/components/Tooltip" + +const AvatarTooltip = props => { + const { children, title } = props + return ( + { + if (placement === "bottom") { + return [popper.width / 4, 27] + } else { + return [popper.width / 4, 12] + } + }, + }, + }, + ], + }, + }} + > + {children} + + ) +} + +export default AvatarTooltip diff --git a/src/pages/canvas/Dashboard/BadgeWall/Avatar/HeartbeatAvatar.tsx b/src/pages/canvas/Dashboard/BadgeWall/Avatar/HeartbeatAvatar.tsx new file mode 100644 index 000000000..9ad429489 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Avatar/HeartbeatAvatar.tsx @@ -0,0 +1,28 @@ +import Img from "react-cool-img" + +import { Box } from "@mui/material" + +import { getHeartbeatURL } from "@/apis/canvas" +import { useRainbowContext } from "@/contexts/RainbowProvider" + +import AvatarTooltip from "./AvatarTooltip" + +const HeartbeatAvatar = props => { + const { walletCurrentAddress } = useRainbowContext() + + return ( + + Activity Heartbeat: +

    + Heart beats faster when you are more active on Scroll +
    + } + > + avatar + + ) +} + +export default HeartbeatAvatar diff --git a/src/pages/canvas/Dashboard/BadgeWall/Avatar/NFTAvatar.tsx b/src/pages/canvas/Dashboard/BadgeWall/Avatar/NFTAvatar.tsx new file mode 100644 index 000000000..dd9688e69 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Avatar/NFTAvatar.tsx @@ -0,0 +1,74 @@ +import { motion } from "framer-motion" +import { useState } from "react" +import Img from "react-cool-img" + +import { Box, Stack } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" + +const MotionBox = motion(Box) + +const NFTAvatar = props => { + const { src, sx, imgStyle } = props + const { isMobile } = useCheckViewport() + + const [layoutStyle, setLayoutStyle] = useState({ width: "100%", height: "auto" }) + const [loaded, setLoaded] = useState(false) + + const handleLoadNFTImage = event => { + const { naturalWidth, naturalHeight } = event.target + setLoaded(true) + + if (naturalWidth > naturalHeight) { + setLayoutStyle({ width: "100%", height: "auto" }) + } else { + setLayoutStyle({ width: "auto", height: "100%" }) + } + } + + return ( + + + {loaded && ( + + )} + + + NFT avatar + + + ) +} + +export default NFTAvatar diff --git a/src/pages/canvas/Dashboard/BadgeWall/Avatar/PictureAvatar.tsx b/src/pages/canvas/Dashboard/BadgeWall/Avatar/PictureAvatar.tsx new file mode 100644 index 000000000..0b016a9c3 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Avatar/PictureAvatar.tsx @@ -0,0 +1,8 @@ +import Img from "react-cool-img" + +const PictureAvatar = props => { + const { src } = props + return avatar +} + +export default PictureAvatar diff --git a/src/pages/canvas/Dashboard/BadgeWall/Avatar/index.tsx b/src/pages/canvas/Dashboard/BadgeWall/Avatar/index.tsx new file mode 100644 index 000000000..5771ef88f --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Avatar/index.tsx @@ -0,0 +1,80 @@ +import { useQuery } from "@tanstack/react-query" +import Img from "react-cool-img" + +import { Box } from "@mui/material" + +import { fetchAvatarURL, generateNFTURL } from "@/apis/canvas-profile" +import FlipCard from "@/components/FlipCard" +import { useRainbowContext } from "@/contexts/RainbowProvider" + +import AvatarTooltip from "./AvatarTooltip" +import HeartbeatAvatar from "./HeartbeatAvatar" +import NFTAvatar from "./NFTAvatar" +import PictureAvatar from "./PictureAvatar" + +const Avatar = props => { + const { sx } = props + + const { walletCurrentAddress } = useRainbowContext() + + const { data: avatarObj, isLoading } = useQuery({ + queryKey: ["canvasAvatar", walletCurrentAddress], + queryFn: () => { + return scrollRequest(fetchAvatarURL(walletCurrentAddress)) + }, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + }) + + const { data: avatarNFT, isLoading: avatarNFTLoading } = useQuery({ + queryKey: ["NFTAvatarImageURL", walletCurrentAddress, avatarObj], + queryFn: () => { + return scrollRequest(generateNFTURL(walletCurrentAddress)) + }, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + enabled: !!avatarObj?.tokenID, + }) + + const renderAvatar = () => { + if (isLoading) { + return avatar-loading + } + + if (avatarObj?.tokenID) { + return ( + + + + } + backContent={} + > + ) + } + + if (avatarObj?.avatar) { + return ( + + + + } + backContent={} + > + ) + } + + return + } + + return {renderAvatar()} +} + +export default Avatar diff --git a/src/pages/canvas/Dashboard/BadgeWall/Badge/GracePeriodBadge.tsx b/src/pages/canvas/Dashboard/BadgeWall/Badge/GracePeriodBadge.tsx new file mode 100644 index 000000000..0ef52e4ab --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Badge/GracePeriodBadge.tsx @@ -0,0 +1,58 @@ +import dayjs from "dayjs" +import Countdown from "react-countdown" + +import { Box, Typography } from "@mui/material" + +import GracePeriodGif from "@/assets/images/canvas/grace-period.gif" +import { GRACE_PERIOD_DURATION } from "@/constants" +import { ipfsToBrowserURL } from "@/utils" + +import BadgeImage from "../../../components/BadgeImage" +import ToolTip from "../../../components/Tooltip" + +const GracePeriodBadge = props => { + const { badge } = props + + const renderCountDown = ({ hours, days, minutes, seconds, completed }) => { + return ( + + {completed ? "" : `${days ? days + "d " : ""}${hours ? hours + "h " : ""}${minutes ? minutes + "m " : ""}${seconds}s `} + + ) + } + return ( + + Your SCR holding badge has been revoked. Regain it within{" "} + + to avoid paying a gas fee to display it again on your canvas. +
    + } + > + + + + + + ) +} + +export default GracePeriodBadge diff --git a/src/pages/canvas/Dashboard/BadgeWall/Badge/NormalBadge.tsx b/src/pages/canvas/Dashboard/BadgeWall/Badge/NormalBadge.tsx new file mode 100644 index 000000000..684c24fb8 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Badge/NormalBadge.tsx @@ -0,0 +1,29 @@ +import { + // Avatar, + Box, + Badge as MuiBadge, +} from "@mui/material" + +import { ipfsToBrowserURL } from "@/utils" + +import BadgeImage from "../../../components/BadgeImage" +import ToolTip from "../../../components/Tooltip" + +const NormalBadge = props => { + const { badge, upgradable } = props + return ( + {badge.metadata?.name}
    }> + + + {/* {badge.metadata?.id.slice(0, 4)} */} + + + ) +} + +export default NormalBadge diff --git a/src/pages/canvas/Dashboard/BadgeWall/Badge/index.tsx b/src/pages/canvas/Dashboard/BadgeWall/Badge/index.tsx new file mode 100644 index 000000000..9cfd084c6 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Badge/index.tsx @@ -0,0 +1,55 @@ +import { useMemo } from "react" + +import { Box } from "@mui/material" + +import { isInGracePeriod } from "@/services/canvasService" +import useCanvasStore, { BadgeDetailDialogType } from "@/stores/canvasStore" + +import GracePeriodBadge from "./GracePeriodBadge" +import NormalBadge from "./NormalBadge" + +const Badge = ({ badge, index, badgewidth }) => { + const { changeBadgeDetailDialog, changeSelectedBadge, upgradableBadges } = useCanvasStore() + + const handleShowBadgeDetailDialog = () => { + changeSelectedBadge({ ...badge.metadata, upgradable }) + changeBadgeDetailDialog(BadgeDetailDialogType.VIEW) + } + const upgradable = useMemo(() => upgradableBadges.find(item => item.id === badge.metadata?.id)?.upgradable, [upgradableBadges, badge]) + + return ( + + {isInGracePeriod({ revokeTime: badge.metadata?.revokeTime }) ? ( + + ) : ( + + )} + + ) +} + +export default Badge diff --git a/src/pages/canvas/Dashboard/BadgeWall/EditProfile.tsx b/src/pages/canvas/Dashboard/BadgeWall/EditProfile.tsx new file mode 100644 index 000000000..c163dfbf3 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/EditProfile.tsx @@ -0,0 +1,222 @@ +import { useQueryClient } from "@tanstack/react-query" +import { useMemo, useRef } from "react" + +import { Box, IconButton, Menu, MenuItem, Stack, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import { ReactComponent as EditProfileSvg } from "@/assets/svgs/canvas/edit-profile.svg" +import { ReactComponent as LockSvg } from "@/assets/svgs/canvas/lock.svg" +import Link from "@/components/Link" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasProfileStore, { ENSSubdomainDialogTypeEnum, NFTsDialogTypeEnum } from "@/stores/canvasProfileStore" +import useCanvasStore from "@/stores/canvasStore" +import usePerkStore from "@/stores/perksStore" + +import Tooltip from "../../components/Tooltip" + +const VisuallyHiddenInput = styled("input")({ + clip: "rect(0 0 0 0)", + clipPath: "inset(50%)", + height: 1, + overflow: "hidden", + position: "absolute", + bottom: 0, + left: 0, + whiteSpace: "nowrap", + width: 1, +}) + +const EditMenu = styled(Menu)(({ theme }) => ({ + "& .MuiPaper-root": { + borderRadius: "0.5rem", + padding: "0.8rem", + marginTop: "0.6rem", + }, + "& .MuiMenu-list": { + padding: 0, + }, +})) + +const EditProfile = props => { + const { sx } = props + + const { walletCurrentAddress } = useRainbowContext() + + const queryClient = useQueryClient() + + const { changeProfileDialog } = useCanvasStore() + const { perks } = usePerkStore() + const { + changePreviewAvatarURL, + changeCropAvatarDialogVisible, + changeNFTsDialogType, + changeENSSubdomainDialogType, + editProfileVisible, + changeEditProfileVisible, + } = useCanvasProfileStore() + + const editButtonRef = useRef(null) + + const ensSubdomain = queryClient.getQueryData(["ensSubdomain", walletCurrentAddress]) + + const isNFTEligible = useMemo(() => { + return perks.find(item => item.id === "nft-profile-setup")?.claimable + }, [perks]) + + const handleOpenEditMenu = e => { + changeEditProfileVisible(true) + } + const handleCloseEditMenu = () => { + changeEditProfileVisible(false) + } + const handleOpenUserNameDialog = () => { + changeProfileDialog(true) + handleCloseEditMenu() + } + const handlePickPicture = event => { + const file = event.target.files[0] + + if (!file) { + return + } + + const reader = new FileReader() + reader.addEventListener( + "load", + () => { + changePreviewAvatarURL(reader.result) + changeCropAvatarDialogVisible(true) + handleCloseEditMenu() + }, + false, + ) + + reader.readAsDataURL(file) + } + const handleOpenPickNFTDialog = () => { + const avatarObj: any = queryClient.getQueryData(["canvasAvatar", walletCurrentAddress]) + if (avatarObj?.nftAvatarClaimed) { + changeNFTsDialogType(NFTsDialogTypeEnum.SET_UP) + } else { + changeNFTsDialogType(NFTsDialogTypeEnum.CLAIM) + } + handleCloseEditMenu() + } + + const handleOpenChangeENSSubdomainNameDialog = () => { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.UPDATE_SUBDOMAIN) + handleCloseEditMenu() + } + + const editMenuItems = useMemo( + () => [ + ensSubdomain + ? { + label: "Change subdomain name", + action: handleOpenChangeENSSubdomainNameDialog, + } + : { + label: "Change name", + action: handleOpenUserNameDialog, + }, + { + label: "Upload a profile picture", + upload: true, + }, + { label: "Set an NFT as profile", disabled: !isNFTEligible, perk: true, action: handleOpenPickNFTDialog }, + ], + [ensSubdomain, isNFTEligible], + ) + + return ( + <> + + + + + {editMenuItems.map(({ label, action, upload, perk, disabled }) => ( + + + Unlock{" "} + + Ethereum year badge + {" "} + to unlock this perk. + +
    + } + // PopperProps={{ + // popperOptions: { + // modifiers: [ + // { + // name: "offset", + // options: { + // offset: ({ placement, reference, popper }) => { + // return [(reference.width - popper.width) / 2, 12] + // }, + // }, + // }, + // ], + // }, + // }} + > + void 0 : action} + > + {label} + {!!upload && } + {perk && ( + + {disabled && } + Scroll Perk + + )} + + + ))} + + + ) +} + +export default EditProfile diff --git a/src/pages/canvas/Dashboard/BadgeWall/Name/ENSSubdomain.tsx b/src/pages/canvas/Dashboard/BadgeWall/Name/ENSSubdomain.tsx new file mode 100644 index 000000000..d5ce2aced --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Name/ENSSubdomain.tsx @@ -0,0 +1,53 @@ +import emojiRegex from "emoji-regex" +import { useEffect } from "react" + +import { Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +const ENSName = styled(Typography)(({ theme }) => ({ + textAlign: "center", + fontSize: "2.4rem", + fontStyle: "normal", + fontWeight: 600, + lineHeight: "3.2rem", + alignSelf: "center", + flexShrink: 0, + background: "linear-gradient(90deg, #FF684B, #FCE595, #4BFFE7, #45099d)", + backgroundSize: "400%", + WebkitBackgroundClip: "text", + WebkitTextFillColor: "transparent", + animation: "gradientAnimation 5s infinite", + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + lineHeight: "2rem", + }, + "@keyframes gradientAnimation": { + "0%": { + backgroundPosition: "0% 50%", + }, + "50%": { + backgroundPosition: "100% 50%", + }, + "100%": { + backgroundPosition: "0% 50%", + }, + }, +})) + +const ENSSubdomain = props => { + const { children, ...restProps } = props + + useEffect(() => { + const element = document.querySelector(".ens-subdomain") + if (!element) return + element.innerHTML = element.textContent?.replace(emojiRegex(), match => `${match}`) as string + }, []) + + return ( + + {children} + + ) +} + +export default ENSSubdomain diff --git a/src/pages/canvas/Dashboard/BadgeWall/Name/index.tsx b/src/pages/canvas/Dashboard/BadgeWall/Name/index.tsx new file mode 100644 index 000000000..a10c1d4e6 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/Name/index.tsx @@ -0,0 +1,120 @@ +import { useQuery } from "@tanstack/react-query" +import copy from "copy-to-clipboard" +import { useRef, useState } from "react" + +import { Tooltip, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import { fetchENSNameURL } from "@/apis/canvas-profile" +import Skeleton from "@/components/Skeleton" +import { useRainbowContext } from "@/contexts/RainbowProvider" + +// import { restoreAllEmojis } from "@/utils" +import ENSSubdomain from "./ENSSubdomain" + +const COPY_TIP_MAP = { + "to-copy": "Click to copy", + copied: "ENS subdomain copied", +} + +const UserName = styled(Typography)(({ theme }) => ({ + color: "#FFFFFF", + textAlign: "center", + fontSize: "3.2rem", + fontStyle: "normal", + fontWeight: 600, + lineHeight: "4.4rem", + alignSelf: "center", + flexShrink: 0, + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + lineHeight: "2rem", + }, +})) + +const Name = props => { + const { defaultValue, loading } = props + + const { walletCurrentAddress } = useRainbowContext() + const [copyTipVisible, setCopyTipVisible] = useState(false) + const [copyTipType, setCopyTipType] = useState("to-copy") + const timer = useRef(null) + + const { + data: ensSubdomain, + isError, + isFetching, + } = useQuery({ + queryKey: ["ensSubdomain", walletCurrentAddress], + queryFn: async () => { + const result = await scrollRequest(fetchENSNameURL(walletCurrentAddress)) + return result?.name ?? "" + }, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: 5e3, + }) + + const handleCopySubdomainName = () => { + copy(ensSubdomain) + setCopyTipType("copied") + setCopyTipVisible(true) + timer.current = setTimeout(() => { + setCopyTipType("to-copy") + setCopyTipVisible(false) + }, 6e3) + } + + const handelOpenCopyTip = () => { + setCopyTipType("to-copy") + setCopyTipVisible(true) + } + + const handleCloseCopyTip = () => { + if (timer.current) { + clearTimeout(timer.current) + timer.current = null + } + setCopyTipVisible(false) + } + + if (loading || isFetching) { + return + } + + if (ensSubdomain) { + const [name] = ensSubdomain.split(".") + return ( + +
    + + {name}.​scroll.eth + +
    +
    + ) + } + + if (isError) { + return -- + } + + return {defaultValue || "--"} +} + +export default Name diff --git a/src/pages/canvas/Dashboard/BadgeWall/index.tsx b/src/pages/canvas/Dashboard/BadgeWall/index.tsx new file mode 100644 index 000000000..419dbb9bc --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgeWall/index.tsx @@ -0,0 +1,157 @@ +import React, { useEffect, useMemo, useRef, useState } from "react" +import { useParams } from "react-router-dom" + +import { Box } from "@mui/material" +import { styled } from "@mui/system" + +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasStore from "@/stores/canvasStore" +import { sentryDebug } from "@/utils" + +import Avatar from "./Avatar" +import Badge from "./Badge/index" +import EditProfile from "./EditProfile" +import Name from "./Name" + +interface BadgeType { + attester: string + attributes: Array + badgeContract: string + data: string + description: string + id: string + image: string + name: string + time: number + txid: string +} + +interface BadgeWallProps { + badgewidth: number + gridNum: number + windowDimensions: { width: number; height: number } +} + +interface BadgePosition { + metadata: BadgeType + left: number + top: number +} + +const Profile = styled(Box)(({ theme }) => ({ + backgroundColor: "#101010", + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + // TODO: ??? + transform: "translate(0.25px, 0.25px)", + [theme.breakpoints.down("lg")]: { + transform: "translate(0.5px, 0.5px)", + }, + [theme.breakpoints.down("sm")]: { + transform: "translate(0.25px, 0.25px)", + justifyContent: "space-evenly", + paddingTop: "0.8rem", + }, +})) + +const BadgeWall: React.FC = props => { + const { address: othersWalletAddress } = useParams() + const { badgewidth, gridNum, windowDimensions } = props + const divRef = useRef(null) + + const { canvasUsername, queryUsernameLoading, userBadges, orderedAttachedBadges } = useCanvasStore() + const [badges, setBadges] = useState([]) + const { walletCurrentAddress } = useRainbowContext() + + const profileSize = useMemo(() => (badgewidth * gridNum) / 2 - 1, [badgewidth, gridNum]) + + const visibleBadges = useMemo(() => { + return orderedAttachedBadges.map(badgeId => userBadges.find(badge => badge.id === badgeId)) + }, [userBadges, orderedAttachedBadges]) + + useEffect(() => { + setBadges(generatedBadges()) + }, [badgewidth, windowDimensions, visibleBadges, userBadges]) + + useEffect(() => { + if (userBadges.length < orderedAttachedBadges.length) { + sentryDebug(`EAS data loss:${othersWalletAddress || walletCurrentAddress}`) + } + }, [orderedAttachedBadges, userBadges, walletCurrentAddress, othersWalletAddress]) + + const generateBadgePositions = (divRect: DOMRect, badgewidth: number, badges: BadgeType[]): BadgePosition[] => { + const positions: BadgePosition[] = [] + let cursor = { x: divRect.left, y: divRect.top - badgewidth } + let direction = 0 // 0: right, 1: down, 2: left, 3: up + const limits = { left: divRect.left, right: divRect.right, top: divRect.top - badgewidth, bottom: divRect.bottom } + + badges.slice(0, 48).forEach(badge => { + positions.push({ metadata: badge, left: cursor.x, top: cursor.y }) + + switch (direction) { + case 0: // right + cursor.x += badgewidth + if (cursor.x > limits.right) { + limits.right += badgewidth + direction = 1 + } + break + case 1: // down + cursor.y += badgewidth + if (cursor.y > limits.bottom) { + limits.bottom += badgewidth + direction = 2 + } + break + case 2: // left + cursor.x -= badgewidth + if (cursor.x < limits.left) { + limits.left -= badgewidth + direction = 3 + } + break + case 3: // up + cursor.y -= badgewidth + if (cursor.y < limits.top) { + limits.top -= badgewidth + direction = 0 + } + break + } + }) + + return positions + } + + const generatedBadges = (): BadgePosition[] => { + if (divRef.current) { + const divRect = divRef.current.getBoundingClientRect() + return generateBadgePositions(divRect, badgewidth, visibleBadges) + } + return [] + } + + return ( + <> + + + + + + {badges.map((badge, index) => ( + + ))} + + ) +} + +export default BadgeWall diff --git a/src/pages/canvas/Dashboard/BadgesDialog/BadgeItem.tsx b/src/pages/canvas/Dashboard/BadgesDialog/BadgeItem.tsx new file mode 100644 index 000000000..0f31a6766 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgesDialog/BadgeItem.tsx @@ -0,0 +1,99 @@ +import Img from "react-cool-img" + +import { Avatar, ListItem, ListItemAvatar, ListItemText, Typography } from "@mui/material" +import { styled } from "@mui/system" + +const StyledListItem = styled(ListItem)(({ theme }) => ({ + width: "100%", + padding: "0", + cursor: "pointer", + "& *": { + cursor: "pointer !important", + }, + "& .MuiListItemSecondaryAction-root": { + right: "0", + }, +})) + +const StyledListItemAvatar = styled(ListItemAvatar)(({ theme }) => ({ + "& img": { + width: "8rem", + height: "8rem", + backgroundColor: "#000", + [theme.breakpoints.down("sm")]: { + width: "4.8rem", + height: "4.8rem", + }, + }, + "& .MuiAvatar-img": { + objectFit: "contain !important", + }, +})) + +const StyledListItemText = styled(ListItemText)(({ theme }) => ({ + margin: 0, + "& .MuiListItemText-primary": { + fontSize: "2.4rem", + fontWeight: 600, + lineHeight: "3.2rem", + color: "#fff", + [theme.breakpoints.down("sm")]: { + fontSize: "1.8rem", + lineHeight: "2.8rem", + }, + }, + "& .MuiListItemText-secondary": { + fontSize: "1.8rem", + fontWeight: 600, + lineHeight: "2.4rem", + color: "#fff", + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + lineHeight: "2.4rem", + }, + }, +})) + +const BadgeItem = props => { + const { badge, action } = props + + return ( + + + + + + Issued by + + {badge.issuer?.name} + + } + /> + {action} + + ) +} + +export default BadgeItem diff --git a/src/pages/canvas/Dashboard/BadgesDialog/index.tsx b/src/pages/canvas/Dashboard/BadgesDialog/index.tsx new file mode 100644 index 000000000..0818ec619 --- /dev/null +++ b/src/pages/canvas/Dashboard/BadgesDialog/index.tsx @@ -0,0 +1,110 @@ +import { Fragment } from "react" +import Img from "react-cool-img" + +import { List } from "@mui/material" +import { styled } from "@mui/system" + +import Link from "@/components/Link" +import LoadingPage from "@/components/LoadingPage" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useSnackbar from "@/hooks/useSnackbar" +import Button from "@/pages/canvas/components/Button" +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasStore, { BadgesDialogType } from "@/stores/canvasStore" + +import BadgeItem from "./BadgeItem" + +const StyledList = styled(List)(({ theme }) => ({ + width: "57.6rem", + height: "53.8rem", + display: "flex", + flexDirection: "column", + gap: "2.4rem", + padding: "2.4rem 0 0", + "&::-webkit-scrollbar-thumb": { + backgroundColor: "rgba(209, 205, 204, 0.30)", + borderRadius: "8px", + }, + "&::-webkit-scrollbar": { + width: "6px", + }, + // Firefox + scrollbarWidth: "thin", + scrollbarColor: "rgba(209, 205, 204, 0.30) transparent", + + "& .MuiListItem-root": { + gap: "1.6rem", + }, + + [theme.breakpoints.down("sm")]: { + height: "100%", + maxHeight: "unset", + }, +})) + +const BadgesDialog = props => { + const { badges, loading } = props + const { provider } = useRainbowContext() + const { isMobile } = useCheckViewport() + const alertWarning = useSnackbar() + + const { isBadgeUpgrading, badgesDialogVisible, changeBadgesDialogVisible, upgradeBadgeAndRefreshUserBadges } = useCanvasStore() + + const handleClose = () => { + changeBadgesDialogVisible(BadgesDialogType.HIDDEN) + } + + const handleUpgradeBadge = async badge => { + await upgradeBadgeAndRefreshUserBadges(provider, badge) + alertWarning( + <> + {badge.name} upgraded successfully!

    + + View badge details + + , + "success", + ) + } + + if (loading) { + return ( + + + } + > + + + ) + } + + return ( + + + {badges.map((badge, index) => ( + + + Upgrade now + + } + /> + + ))} + + + ) +} + +export default BadgesDialog diff --git a/src/pages/canvas/Dashboard/CropAvatarDialog/AvatarCropper.tsx b/src/pages/canvas/Dashboard/CropAvatarDialog/AvatarCropper.tsx new file mode 100644 index 000000000..f50fb21e7 --- /dev/null +++ b/src/pages/canvas/Dashboard/CropAvatarDialog/AvatarCropper.tsx @@ -0,0 +1,101 @@ +import { getAbsoluteZoom, getZoomFactor } from "advanced-cropper/extensions/absolute-zoom" +import { forwardRef } from "react" +import { CropperFade, FixedCropper, FixedCropperProps, FixedCropperRef, ImageRestriction } from "react-advanced-cropper" + +import { IconButton, Slider, Stack, SvgIcon } from "@mui/material" + +import { ReactComponent as ZoomInSvg } from "@/assets/svgs/canvas/zoom-in.svg" +import { ReactComponent as ZoomOutSvg } from "@/assets/svgs/canvas/zoom-out.svg" + +import "./cropper.css" + +const AvatarCropper = forwardRef((props: FixedCropperProps, ref) => { + const { stencilProps, ...restProps } = props + return ( + + ) +}) + +const CustomWrapper = props => { + const { cropper, children, loaded } = props + const state = cropper.getState() + + const settings = cropper.getSettings() + + const absoluteZoom = getAbsoluteZoom(state, settings) + + const onZoom = (value: number, transitions?: boolean) => { + cropper.zoomImage(getZoomFactor(state, settings, value), { + transitions: !!transitions, + }) + } + + return ( + + {children} + + + ) +} + +const Navigation = props => { + const { onZoom, zoom } = props + + const handleZoomIn = () => { + if (onZoom) { + onZoom(Math.min(1, zoom + 0.25), true) + } + } + + const handleZoomOut = () => { + if (onZoom) { + onZoom(Math.max(0, zoom - 0.25), true) + } + } + + return ( + + + + + onZoom(newValue as number)} + > + + + + + ) +} + +export default AvatarCropper diff --git a/src/pages/canvas/Dashboard/CropAvatarDialog/cropper.css b/src/pages/canvas/Dashboard/CropAvatarDialog/cropper.css new file mode 100644 index 000000000..fcad67436 --- /dev/null +++ b/src/pages/canvas/Dashboard/CropAvatarDialog/cropper.css @@ -0,0 +1,17 @@ +.canvas-avatar-cropper.advanced-cropper-boundary { + width: 320px; + height: 320px; + overflow: hidden; + cursor: move; +} +.canvas-avatar-cropper .advanced-cropper-stencil-overlay { + color: rgba(16, 16, 16, 0.6); +} + +@media screen and (max-width: 600px) { + .canvas-avatar-cropper.advanced-cropper-boundary { + width: 240px; + height: 240px; + overflow: hidden; + } +} diff --git a/src/pages/canvas/Dashboard/CropAvatarDialog/index.tsx b/src/pages/canvas/Dashboard/CropAvatarDialog/index.tsx new file mode 100644 index 000000000..aef458ca7 --- /dev/null +++ b/src/pages/canvas/Dashboard/CropAvatarDialog/index.tsx @@ -0,0 +1,140 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query" +import { useRef } from "react" +import { CircleStencil } from "react-advanced-cropper" +import "react-advanced-cropper/dist/style.css" +import { useWalletClient } from "wagmi" + +import { Stack, Typography } from "@mui/material" + +import { setCanvasAvatarURL } from "@/apis/canvas-profile" +import { CANVAS_AVATAR_MAX_SIZE } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useSnackbar from "@/hooks/useSnackbar" +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasProfileStore from "@/stores/canvasProfileStore" +import { calculateSHA256FromBlob, generateTypedData } from "@/utils" + +import PerksButton from "../../components/PerksButton" +import AvatarCropper from "./AvatarCropper" + +interface MutationVariables { + walletAddress: `0x${string}` | undefined +} + +const CropAvatarDialog = () => { + const { walletCurrentAddress } = useRainbowContext() + const { data: client } = useWalletClient() + const queryClient = useQueryClient() + + const { isMobile } = useCheckViewport() + + const { cropAvatarDialogVisible, previewAvatarURL, changeCropAvatarDialogVisible, changeEditProfileVisible } = useCanvasProfileStore() + + const alertWarning = useSnackbar() + + const cropperRef = useRef() + + const { mutateAsync: setImageMutation, isPending } = useMutation({ + mutationFn: ({ walletAddress }: MutationVariables) => { + return new Promise((resolve, reject) => { + cropperRef.current.getCanvas()?.toBlob(async blob => { + try { + if (blob.size > CANVAS_AVATAR_MAX_SIZE) { + reject(new Error("The image size is too large. please try again with a smaller image.")) + } + const sha256 = await calculateSHA256FromBlob(blob) + const timestamp = Date.now().toString() + const signature = await client?.signTypedData(generateTypedData(walletAddress, sha256, undefined, undefined, timestamp) as any) + const formData = new FormData() + formData.append("sha256", sha256) + formData.append("signature", signature || "") + formData.append("image", blob) + formData.append("timestamp", timestamp) + + const { avatar } = await scrollRequest(setCanvasAvatarURL(walletAddress), { + method: "POST", + body: formData, + }) + resolve(avatar) + } catch (e) { + reject(e) + } + }, "image/webp") + }) + }, + onSuccess: data => { + handleCloseCropAvatarDialog() + const canvasAvatar = queryClient.getQueryData(["canvasAvatar", walletCurrentAddress]) + queryClient.setQueryData(["canvasAvatar", walletCurrentAddress], { + avatar: data, + nftAvatarClaimed: Boolean((canvasAvatar as any)?.nftAvatarClaimed), + }) + // queryClient.invalidateQueries({ + // queryKey: ["canvasAvatar", walletCurrentAddress], + // }) + changeEditProfileVisible(false) + }, + onError: error => { + if (error.name !== "UserRejectedRequestError") { + alertWarning(error.message) + // alertWarning("Something went wrong, please try again later.") + } + }, + }) + + const handleCloseCropAvatarDialog = () => { + changeCropAvatarDialogVisible(false) + } + + const handleApplyAvatar = () => { + setImageMutation({ walletAddress: walletCurrentAddress }) + } + + return ( + + + + Edit profile + + + + + + Sign and Apply + + + + ) +} + +export default CropAvatarDialog diff --git a/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/Item.jsx b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/Item.jsx new file mode 100644 index 000000000..f57286ced --- /dev/null +++ b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/Item.jsx @@ -0,0 +1,151 @@ +import { forwardRef, useEffect } from "react" +import { makeStyles } from "tss-react/mui" + +import { + // Avatar, + Box, +} from "@mui/material" + +import GracePeriodGif from "@/assets/images/canvas/grace-period.gif" +import BadgeImage from "@/pages/canvas/components/BadgeImage" +import { isInGracePeriod } from "@/services/canvasService" +import { ipfsToBrowserURL } from "@/utils" + +const getTranslateX = transform => { + return transform ? `${Math.round(transform.x)}px` : undefined +} + +const getTranslateY = transform => { + return transform ? `${Math.round(transform.y)}px` : undefined +} + +const getScaleX = transform => { + return transform?.scaleX ? `${transform.scaleX}` : undefined +} + +const getScaleY = transform => { + return transform?.scaleY ? `${transform.scaleY}` : undefined +} + +const useStyles = makeStyles()((theme, { transform }) => ({ + "@keyframes pop": { + "0%": { + transform: "scale(1)", + }, + "100%": { + transform: "scale(1.05)", + }, + }, + + "@keyframes fadeIn": { + "0%": { + opacity: 0, + }, + "100%": { + opacity: 1, + }, + }, + wrapper: { + display: "flex", + boxSizing: "border-box", + transform: `translate3d(${getTranslateX(transform) || 0}, ${getTranslateY(transform) || 0}, 0) scaleX(${getScaleX(transform) || 1}) scaleY(${ + getScaleY(transform) || 1 + })`, + transformOrigin: "0 0", + touchAction: "manipulation", + "&.dragOverlay": { + zIndex: 999, + }, + }, + fadeIn: { + animation: "$fadeIn 500ms ease", + }, + + item: { + position: "relative", + width: "100%", + transformOrigin: "50% 50%", + transform: "scale(1)", + transition: "box-shadow 200ms cubic-bezier(0.18, 0.67, 0.6, 1.22)", + }, + dragging: { + opacity: 0.5, + zIndex: 0, + + "&:not(.dragOverlay)": { + opacity: 0.5, + zIndex: 0, + }, + "&.dragOverlay": { + cursor: "inherit", + animation: "$pop 200ms cubic-bezier(0.18, 0.67, 0.6, 1.22)", + transform: "scale(1.05)", + opacity: 1, + position: "relative", + }, + }, +})) + +const Item = forwardRef((props: any, ref) => { + const { + sx, + className, + fadeIn, + dragging, + transition, + transform, + listeners, + name, + // id, + image, + revokeTime, + dragOverlay, + } = props + const { cx, classes } = useStyles({ transform }) + useEffect(() => { + if (!dragOverlay) { + return + } + + document.body.style.cursor = "grabbing" + + return () => { + document.body.style.cursor = "" + } + }, [dragOverlay]) + return ( + + + {isInGracePeriod({ revokeTime }) && ( + + )} + + + {/* {id.slice(0, 4)} */} + + + ) +}) + +export default Item diff --git a/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/Overlay.tsx b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/Overlay.tsx new file mode 100644 index 000000000..b7dd1f572 --- /dev/null +++ b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/Overlay.tsx @@ -0,0 +1,8 @@ +import Item from "./Item" + +const TransferItemDragOverlay = props => { + const { name, image, id } = props + return +} + +export default TransferItemDragOverlay diff --git a/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/TransferItem.tsx b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/TransferItem.tsx new file mode 100644 index 000000000..82ae7ca59 --- /dev/null +++ b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/TransferItem.tsx @@ -0,0 +1,73 @@ +import { useSortable } from "@dnd-kit/sortable" +import { useEffect, useState } from "react" + +import { Badge, Box } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" +import ToolTip from "@/pages/canvas/components/Tooltip" +import useCanvasStore from "@/stores/canvasStore" + +import Item from "./Item" + +const TransferItem = props => { + const { id, disabled, name, image, revokeTime, dragOverlay, containerId } = props + + const { setNodeRef, listeners, isDragging, transform, transition } = useSortable({ + id, + disabled, + }) + const { isDesktop } = useCheckViewport() + + const mounted = useMountStatus() + const mountedWhileDragging = isDragging && !mounted + + const { notifiableBadges } = useCanvasStore() + + useEffect(() => { + if (!dragOverlay) { + return + } + + document.body.style.cursor = "grabbing" + + return () => { + document.body.style.cursor = "" + } + }, [dragOverlay]) + + return ( + {name}
    } disableHoverListener={!isDesktop}> + + + + + + + ) +} + +function useMountStatus() { + const [isMounted, setIsMounted] = useState(false) + + useEffect(() => { + const timeout = setTimeout(() => setIsMounted(true), 500) + + return () => clearTimeout(timeout) + }, []) + + return isMounted +} + +export default TransferItem diff --git a/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/TransferList.tsx b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/TransferList.tsx new file mode 100644 index 000000000..ddb780de7 --- /dev/null +++ b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/TransferList.tsx @@ -0,0 +1,76 @@ +import { AnimateLayoutChanges, SortableContext, defaultAnimateLayoutChanges, useSortable } from "@dnd-kit/sortable" +import { CSS } from "@dnd-kit/utilities" + +import { Box, Typography } from "@mui/material" + +const animateLayoutChanges: AnimateLayoutChanges = args => defaultAnimateLayoutChanges({ ...args, wasDragging: true }) + +const TransferList = props => { + const { id, label, items, children, ...restProps } = props + + const { attributes, isDragging, listeners, setNodeRef, transition, transform } = useSortable({ + id, + data: { + type: "container", + children: items, + }, + animateLayoutChanges, + }) + + return ( + + + {label} + + + + {children} + + + + ) +} + +export default TransferList diff --git a/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/index.tsx b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/index.tsx new file mode 100644 index 000000000..7d66fff76 --- /dev/null +++ b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/Transfer/index.tsx @@ -0,0 +1,321 @@ +import { + CollisionDetection, + DndContext, + DragOverlay, + DropAnimation, + MeasuringStrategy, + UniqueIdentifier, + closestCenter, + defaultDropAnimationSideEffects, + getFirstCollision, + pointerWithin, + rectIntersection, +} from "@dnd-kit/core" +import { arrayMove } from "@dnd-kit/sortable" +import { useCallback, useEffect, useRef, useState } from "react" +import { createPortal } from "react-dom" + +import { Box } from "@mui/material" + +import useSnackbar from "@/hooks/useSnackbar" + +import TransferItemDragOverlay from "./Overlay" +import TransferItem from "./TransferItem" +import TransferList from "./TransferList" + +const BADGE_MAX_NUMBER = 48 + +const dropAnimation: DropAnimation = { + sideEffects: defaultDropAnimationSideEffects({ + styles: { + active: { + opacity: "0.5", + }, + }, + }), +} + +const BadgeTransfer = props => { + const { titles, value, data, sx, onChange } = props + + const initialIds = { + left: data.filter(({ id }) => !value.includes(id)).map(item => item.id), + right: value, + } + + const alertWarning = useSnackbar() + + const dataMap = new Proxy(data, { + get(target, prop) { + return target.find(item => item.id === prop) + }, + }) + + const [items, setItems] = useState(initialIds) + + const [clonedItems, setClonedItems] = useState(null) + const [containers, setContainers] = useState(Object.keys(items) as UniqueIdentifier[]) + + const [activeId, setActiveId] = useState(null) + const lastOverId = useRef(null) + const recentlyMovedToNewContainer = useRef(false) + + const [disabledDisplayed, setDisabledDisplayed] = useState(false) + + useEffect(() => { + if (items.right.length < BADGE_MAX_NUMBER) { + setDisabledDisplayed(false) + } else { + setDisabledDisplayed(true) + } + onChange(items.right) + requestAnimationFrame(() => { + recentlyMovedToNewContainer.current = false + }) + }, [items]) + + const findContainer = (id: UniqueIdentifier) => { + if (id in items) { + return id + } + + return Object.keys(items).find(key => items[key].includes(id)) + } + + const getIndex = (id: UniqueIdentifier) => { + const container = findContainer(id) + + if (!container) { + return -1 + } + + const index = items[container].findIndex(item => item.id === id) + + return index + } + + const onDragCancel = () => { + if (clonedItems) { + setItems(clonedItems) + } + + setActiveId(null) + setClonedItems(null) + } + + const collisionDetectionStrategy: CollisionDetection = useCallback( + args => { + if (activeId && activeId in items) { + return closestCenter({ + ...args, + droppableContainers: args.droppableContainers.filter(container => container.id in items), + }) + } + + // Start by finding any intersecting droppable + const pointerIntersections = pointerWithin(args) + const intersections = + pointerIntersections.length > 0 + ? // If there are droppables intersecting with the pointer, return those + pointerIntersections + : rectIntersection(args) + let overId = getFirstCollision(intersections, "id") + + if (overId != null) { + if (overId in items) { + const containerItems = items[overId] + + // If a container is matched and it contains items (columns 'A', 'B', 'C') + if (containerItems.length > 0) { + // Return the closest droppable within that container + overId = closestCenter({ + ...args, + droppableContainers: args.droppableContainers.filter(container => container.id !== overId && containerItems.includes(container.id)), + })[0]?.id + } + } + + lastOverId.current = overId + + return [{ id: overId }] + } + + // When a draggable item moves to a new container, the layout may shift + // and the `overId` may become `null`. We manually set the cached `lastOverId` + // to the id of the draggable item that was moved to the new container, otherwise + // the previous `overId` will be returned which can cause items to incorrectly shift positions + if (recentlyMovedToNewContainer.current) { + lastOverId.current = activeId + } + + // If no droppable is matched, return the last match + return lastOverId.current ? [{ id: lastOverId.current }] : [] + }, + [activeId, items], + ) + + return ( + { + if (!active) { + return + } + + setActiveId(active.id) + setClonedItems(items) + }} + onDragOver={({ active, over }) => { + const overId = over?.id + + if (overId == null || active.id in items) { + return + } + + const overContainer = findContainer(overId) + const activeContainer = findContainer(active.id) + + if (!overContainer || !activeContainer) { + return + } + + if (activeContainer !== overContainer) { + setItems(items => { + const activeItems = items[activeContainer] + const overItems = items[overContainer] + const overIndex = overItems.indexOf(overId) + const activeIndex = activeItems.indexOf(active.id) + + let newIndex: number + + if (overId in items) { + newIndex = overItems.length + 1 + } else { + const isBelowOverItem = over && active.rect.current.translated && active.rect.current.translated.top > over.rect.top + over.rect.height + + const modifier = isBelowOverItem ? 1 : 0 + + newIndex = overIndex >= 0 ? overIndex + modifier : overItems.length + 1 + } + + recentlyMovedToNewContainer.current = true + + return { + ...items, + [activeContainer]: items[activeContainer].filter(item => item !== active.id), + [overContainer]: [ + ...items[overContainer].slice(0, newIndex), + items[activeContainer][activeIndex], + ...items[overContainer].slice(newIndex, items[overContainer].length), + ], + } + }) + } + }} + onDragEnd={({ active, over }) => { + // over -> new + // active -> old + if (active.id in items && over?.id) { + setContainers(containers => { + const activeIndex = containers.indexOf(active.id) + const overIndex = containers.indexOf(over.id) + + return arrayMove(containers, activeIndex, overIndex) + }) + } + + const activeContainer = findContainer(active.id) + + if (!activeContainer) { + setActiveId(null) + return + } + + const overId = over?.id + + if (overId == null) { + setActiveId(null) + return + } + + const overContainer = findContainer(overId) + + if (overContainer) { + const activeIndex = items[activeContainer].indexOf(active.id) + const overIndex = items[overContainer].indexOf(overId) + + if (activeIndex !== overIndex) { + const overContainerIds = arrayMove(items[overContainer], activeIndex, overIndex) + + setItems(items => ({ + ...items, + [overContainer]: overContainerIds, + })) + if (overContainer === "right" && overContainerIds.length >= BADGE_MAX_NUMBER) { + alertWarning("The maximum number of badges that Canvas can display has been reached.", "success") + } + } + } + + setActiveId(null) + }} + onDragCancel={onDragCancel} + > + ({ + [theme.breakpoints.down("sm")]: { + height: "calc(100% - 6.4rem)", + }, + }), + ]} + > + {containers.map((containerId, index) => ( + + {items[containerId].map(item => ( + + ))} + + ))} + + {createPortal( + + {activeId ? ( + containers.includes(activeId) ? null : ( + + ) + ) : null} + , + document.body, + )} + + ) +} + +export default BadgeTransfer diff --git a/src/pages/canvas/Dashboard/CustomizeDisplayDialog/index.tsx b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/index.tsx new file mode 100644 index 000000000..a1ebe1880 --- /dev/null +++ b/src/pages/canvas/Dashboard/CustomizeDisplayDialog/index.tsx @@ -0,0 +1,208 @@ +import { isEqual } from "lodash" +import { useEffect, useState } from "react" + +import { Box, Dialog, DialogContent, DialogTitle, IconButton, Stack, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as CloseSvg } from "@/assets/svgs/canvas/close.svg" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" +import Button from "@/pages/canvas/components/Button" +import { default as CanvasDialog } from "@/pages/canvas/components/Dialog" +import { customiseDisplay } from "@/services/canvasService" +import useCanvasStore from "@/stores/canvasStore" +import { isUserRejected, sentryDebug, trimErrorMessage } from "@/utils" + +import Empty from "../../components/Empty" +import Transfer from "./Transfer" + +const StyledDialog = styled(Dialog)(({ theme }) => ({ + borderRadius: "1.6rem", + "& .MuiBackdrop-root": { + backgroundColor: "rgba(16, 16, 16, 0.60)", + }, + "& .MuiDialog-paper": { + background: "linear-gradient(127deg, #2A2A2A 0.6%, #101010 100%)", + width: "112rem", + [theme.breakpoints.down("sm")]: { + margin: 0, + borderRadius: 0, + maxHeight: "unset", + maxWidth: "unset", + height: "100%", + width: "100%", + }, + }, +})) + +const StyledDialogContent = styled(DialogContent)(({ theme }) => ({ + padding: "0 3.2rem 4.8rem", + display: "flex", + flexDirection: "column", + alignItems: "center", + [theme.breakpoints.down("sm")]: { + padding: "0 2rem 2.4rem", + }, +})) + +const CustomizeDisplayDialog = props => { + const { walletCurrentAddress } = useRainbowContext() + const { + userBadges, + attachedBadges, + orderedAttachedBadges, + badgeOrder, + customizeDisplayDialogVisible, + changeCustomizeDisplayDialogVisible, + sortedBadges, + profileContract, + queryAttachedBadges, + changeSortedBadges, + repersistUserBadges, + } = useCanvasStore() + const alertWarning = useSnackbar() + + const [loading, setLoading] = useState(false) + + useEffect(() => { + if (customizeDisplayDialogVisible) { + changeSortedBadges(orderedAttachedBadges) + } + }, [customizeDisplayDialogVisible]) + + const handleClose = () => { + changeCustomizeDisplayDialogVisible(false) + repersistUserBadges(walletCurrentAddress) + } + + const handleSave = () => { + updateDataAndOrder() + } + + const simulateThenAttachedBadges = (attachedBadges, hiddenToDisplayed, displayedToHidden) => { + const badgesAfterAttach = [...attachedBadges, ...hiddenToDisplayed] + if (displayedToHidden) { + displayedToHidden.forEach(id => { + const deleteIndex = badgesAfterAttach.indexOf(id) + if (deleteIndex < badgesAfterAttach.length - 1) { + badgesAfterAttach.splice(deleteIndex, 1, badgesAfterAttach[badgesAfterAttach.length - 1]) + } + badgesAfterAttach.pop() + }) + } + return badgesAfterAttach + } + + const calculateBadgeOrder = (curAttachedBadges, nextAttachedBadges) => { + return nextAttachedBadges.map((id, index) => { + return BigInt(curAttachedBadges.indexOf(id) + 1) + }) + } + + const handleTransferChange = value => { + changeSortedBadges(value) + } + + const updateDataAndOrder = async () => { + setLoading(true) + + try { + const displayedToHidden = attachedBadges.filter(id => !sortedBadges.includes(id)) + const hiddenToDisplayed = sortedBadges.filter(id => !attachedBadges.includes(id)) + + const nextAttachedBadges = simulateThenAttachedBadges(attachedBadges, hiddenToDisplayed, displayedToHidden) + const newBadgeOrder = calculateBadgeOrder(sortedBadges, nextAttachedBadges) + + // if the badge that is decided to be displayed is in attachedBadges but not in the Displayed panel, still needs to be trigger "AttachBadge". + const fakeHiddenToDisplayed = sortedBadges.filter(id => attachedBadges.includes(id) && !orderedAttachedBadges.includes(id)) + + const finalHiddeToDisplayed = [...hiddenToDisplayed, ...fakeHiddenToDisplayed] + console.log(userBadges, attachedBadges, badgeOrder, "now data") + console.log(finalHiddeToDisplayed, nextAttachedBadges, newBadgeOrder, "updateDataAndOrder") + // return + await customiseDisplay({ + profileContract: profileContract!, + attachBadges: finalHiddeToDisplayed.length > 0 ? finalHiddeToDisplayed : null, + detachBadges: displayedToHidden.length > 0 ? displayedToHidden : null, + order: isEqual(badgeOrder, newBadgeOrder) ? null : newBadgeOrder, + }) + + changeCustomizeDisplayDialogVisible(false) + queryAttachedBadges() + } catch (error) { + if (!isUserRejected(error)) { + sentryDebug(`customise display:${walletCurrentAddress}-${error.message}`) + alertWarning(trimErrorMessage(error.message)) + } + } finally { + setLoading(false) + } + } + + if (!userBadges.length) { + return ( + + + + + + ) + } + + return ( + + + + Drag badges to customize + + + + + + + + ({ + [theme.breakpoints.down("sm")]: { + position: "fixed", + bottom: 0, + width: "100%", + p: "2.4rem 2rem", + "& > *": { + width: "50%", + }, + }, + })} + > + + + + + + ) +} + +export default CustomizeDisplayDialog diff --git a/src/pages/canvas/Dashboard/ENSSubdomainDialog/ClaimENS.tsx b/src/pages/canvas/Dashboard/ENSSubdomainDialog/ClaimENS.tsx new file mode 100644 index 000000000..e0a069255 --- /dev/null +++ b/src/pages/canvas/Dashboard/ENSSubdomainDialog/ClaimENS.tsx @@ -0,0 +1,139 @@ +import { useMemo } from "react" + +import { Box, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ArrowlSvg } from "@/assets/svgs/canvas-perks/arrow.svg" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useCanvasProfileStore, { ENSSubdomainDialogTypeEnum } from "@/stores/canvasProfileStore" +import usePerkStore from "@/stores/perksStore" +import { truncateAddress } from "@/utils" + +import PerksBadge from "../../components/PerksBadge" +import PerksButton from "../../components/PerksButton" +import PerksClaimedLabel from "../../components/PerksClaimedLabel" + +const ClaimENS = () => { + const { walletCurrentAddress } = useRainbowContext() + const { isMobile } = useCheckViewport() + + const { changeENSSubdomainDialogType } = useCanvasProfileStore() + + const { perks } = usePerkStore() + + const perk = useMemo(() => { + return perks.find(perk => perk.id === "claim-ens-subdomain")! + }, [perks]) + + console.log(perk, "perk") + + const handleGoToConfirm = () => { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.CREATE_SUBDOMAIN, true) + } + + return ( + <> + + Claim your ENS subdomain + + + + Make your {truncateAddress(walletCurrentAddress as string)} address readable for free! This is your personalized address that people can send + crypto to. + + + + + {truncateAddress(walletCurrentAddress as string)} + + + + + + name + + .scroll.eth + + + + + Collect the following badge(s) to qualify: + + + {perk.metadata.map(({ imageURL, badgeContract, name, owned }, index) => ( + + ))} + + + {perk.claimed ? ( + + ) : ( + + Claim Now + + )} + + ) +} + +export default ClaimENS diff --git a/src/pages/canvas/Dashboard/ENSSubdomainDialog/CongratsENS.tsx b/src/pages/canvas/Dashboard/ENSSubdomainDialog/CongratsENS.tsx new file mode 100644 index 000000000..3fe3b97db --- /dev/null +++ b/src/pages/canvas/Dashboard/ENSSubdomainDialog/CongratsENS.tsx @@ -0,0 +1,66 @@ +import { useQueryClient } from "@tanstack/react-query" + +import { Box, Stack, Typography } from "@mui/material" + +import CongratBgMobileSvg from "@/assets/svgs/canvas-perks/congrat-bg-mobile.svg" +import CongratBgSvg from "@/assets/svgs/canvas-perks/congrat-bg.svg" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasProfileStore, { ENSSubdomainDialogTypeEnum } from "@/stores/canvasProfileStore" + +import PerksButton from "../../components/PerksButton" +import ENSSubdomain from "../BadgeWall/Name/ENSSubdomain" +import ConfettiComponent from "./components/ConfettiComponent" + +const CongratsENS = () => { + const { walletCurrentAddress } = useRainbowContext() + + const { changeENSSubdomainDialogType } = useCanvasProfileStore() + + const queryClient = useQueryClient() + + const ensSubdomain = queryClient.getQueryData(["ensSubdomain", walletCurrentAddress]) as string + + const handleCloseDialog = () => { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.HIDDEN) + } + + return ( + <> + + Congrats! + + + {ensSubdomain} is ready to receive crypto. + + + + {ensSubdomain} + + + Done + + + + + ) +} + +export default CongratsENS diff --git a/src/pages/canvas/Dashboard/ENSSubdomainDialog/CreateENS.tsx b/src/pages/canvas/Dashboard/ENSSubdomainDialog/CreateENS.tsx new file mode 100644 index 000000000..f509dcbb8 --- /dev/null +++ b/src/pages/canvas/Dashboard/ENSSubdomainDialog/CreateENS.tsx @@ -0,0 +1,155 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query" +import { useState } from "react" +import { useWalletClient } from "wagmi" + +import { Box, InputBase, Stack, Typography } from "@mui/material" + +import { claimENSNameURL } from "@/apis/canvas-profile" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" +import useValidateENSSubdomain from "@/hooks/useValidateENSSubdomain" +import PerksButton from "@/pages/canvas/components/PerksButton" +import useCanvasProfileStore, { ENSSubdomainDialogTypeEnum } from "@/stores/canvasProfileStore" +import { generateENSSubdomainTypedData } from "@/utils" + +interface MutationVariables { + walletAddress: `0x${string}` | undefined + name: string +} + +const EDIT_SUBDOMAIN_COPY = { + [ENSSubdomainDialogTypeEnum.CREATE_SUBDOMAIN]: { + title: "Create your subdomain name", + description: "Your Canvas username will be replaced by your subdomain, which you can change for free anytime.", + actionText: "Create for free", + }, + [ENSSubdomainDialogTypeEnum.UPDATE_SUBDOMAIN]: { + title: "Change your subdomain name", + description: "You can change for free anytime.", + actionText: "Change for free", + }, +} + +const CreateENS = () => { + const { data: client } = useWalletClient() + + const { walletCurrentAddress } = useRainbowContext() + const { changeENSSubdomainDialogType, ENSSubdomainDialogType } = useCanvasProfileStore() + + const queryClient = useQueryClient() + + const alertWarning = useSnackbar() + + const ensSubdomain = queryClient.getQueryData(["ensSubdomain", walletCurrentAddress]) + + const [defaultSubdomainName] = ((ensSubdomain as string) ?? "").split(".") + + const [subdomainName, setSubdomainName] = useState(defaultSubdomainName || "") + + const { helpText, validating, renderValidation } = useValidateENSSubdomain(subdomainName) + + const { mutateAsync: claimENSSubdomain, isPending } = useMutation({ + mutationFn: async ({ walletAddress, name }: MutationVariables) => { + const timestamp = Date.now().toString() + + const signature = await client?.signTypedData(generateENSSubdomainTypedData(walletAddress, name, timestamp) as any) + + return scrollRequest(claimENSNameURL(walletAddress), { + method: "POST", + body: JSON.stringify({ + signature, + name, + timestamp, + }), + }) + }, + onSuccess: async data => { + await queryClient.invalidateQueries({ + queryKey: ["ensSubdomain", walletCurrentAddress], + }) + if (ENSSubdomainDialogType === ENSSubdomainDialogTypeEnum.CREATE_SUBDOMAIN) { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.SUCCESS) + } else { + alertWarning(`Your subdomain has been successfully updated to ${subdomainName}.scroll.eth`, "success") + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.HIDDEN) + } + }, + onError: error => { + if (error.name !== "UserRejectedRequestError") { + alertWarning("Something went wrong, please try again later.") + } + }, + }) + + const handleChangeSubdomainName = e => { + setSubdomainName(e.target.value.trim()) + } + + const handleClaimENSSubdomain = () => { + claimENSSubdomain({ walletAddress: walletCurrentAddress, name: subdomainName as string }) + } + + return ( + <> + + {EDIT_SUBDOMAIN_COPY[ENSSubdomainDialogType].title} + + + {EDIT_SUBDOMAIN_COPY[ENSSubdomainDialogType].description} + + + + input?.focus()} + readOnly={isPending} + placeholder="name" + inputProps={{ + maxLength: 15, + minLength: 4, + }} + sx={{ + fontSize: ["2.4rem", "4.8rem"], + lineHeight: ["4rem", "5.6rem"], + fontWeight: 600, + color: "primary.contrastText", + ".MuiInputBase-input": { + textAlign: "center", + }, + }} + onChange={handleChangeSubdomainName} + > + + .scroll.eth + + + {renderValidation()} + + + + + {EDIT_SUBDOMAIN_COPY[ENSSubdomainDialogType].actionText} + + + ) +} + +export default CreateENS diff --git a/src/pages/canvas/Dashboard/ENSSubdomainDialog/components/ConfettiComponent.tsx b/src/pages/canvas/Dashboard/ENSSubdomainDialog/components/ConfettiComponent.tsx new file mode 100644 index 000000000..1d60e3f31 --- /dev/null +++ b/src/pages/canvas/Dashboard/ENSSubdomainDialog/components/ConfettiComponent.tsx @@ -0,0 +1,71 @@ +import confetti from "canvas-confetti" +import React, { useEffect, useRef } from "react" + +const ribbon = confetti.shapeFromPath({ + path: "M25.6153 6.22043L30.3054 1.53375L36.3336 7.57307L28.1322 15.7792C26.0707 17.8408 23.2724 19.0004 20.3577 19.0004C16.9081 19.0004 13.6011 20.3709 11.1646 22.8075L7.93287 26.0395L1.91259 20.001L10.106 11.7948L10.1065 11.7942C12.1679 9.73295 14.966 8.57353 17.8804 8.57353H19.9405C22.0687 8.57353 24.1104 7.72536 25.615 6.22072C25.6151 6.22063 25.6152 6.22053 25.6153 6.22043Z", +}) +const shortRibbon = confetti.shapeFromPath({ + path: "M17.9416 23.6672L1.79087 7.51511L7.40444 1.90109L23.5552 18.0532L17.9416 23.6672Z", +}) + +const ConfettiComponent = () => { + const canvasRef = useRef(null) + + useEffect(() => { + fireConfetti() + }, []) + + const fireConfetti = () => { + const canvas = canvasRef.current + + if (!canvas) return + + canvas.width = 640 + canvas.height = 760 + + const myConfetti = confetti.create(canvas, { + resize: true, + }) + const count = 60 + + const fire = (particleRatio: number, opts: object) => { + myConfetti({ + ...opts, + particleCount: Math.floor(count * particleRatio), + origin: { + y: 0.8, + }, + shapes: [ribbon, shortRibbon], + colors: ["#FF684B", "#90F8EA", "#E8BF8B"], + }) + } + + fire(0.25, { + spread: 26, + startVelocity: 55, + }) + fire(0.2, { + spread: 60, + scalar: 1.4, + }) + fire(0.35, { + spread: 100, + decay: 0.91, + scalar: 1.8, + }) + fire(0.1, { + spread: 120, + startVelocity: 25, + decay: 0.92, + scalar: 1.2, + }) + fire(0.1, { + spread: 120, + startVelocity: 45, + }) + } + + return +} + +export default ConfettiComponent diff --git a/src/pages/canvas/Dashboard/ENSSubdomainDialog/index.tsx b/src/pages/canvas/Dashboard/ENSSubdomainDialog/index.tsx new file mode 100644 index 000000000..011b0785e --- /dev/null +++ b/src/pages/canvas/Dashboard/ENSSubdomainDialog/index.tsx @@ -0,0 +1,63 @@ +import { Stack } from "@mui/material" + +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasProfileStore, { ENSSubdomainDialogTypeEnum } from "@/stores/canvasProfileStore" +import usePerkStore from "@/stores/perksStore" + +import ClaimENS from "./ClaimENS" +import CongratsENS from "./CongratsENS" +import CreateENS from "./CreateENS" + +const ENSSubdomainDialog = () => { + const { changeENSSubdomainDialogType, ENSSubdomainDialogType, ENSSubdomainDialogAllowBack } = useCanvasProfileStore() + const { changePerksDialogVisible } = usePerkStore() + + const handleClose = () => { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.HIDDEN) + } + + const handleBack = () => { + if (ENSSubdomainDialogType === ENSSubdomainDialogTypeEnum.CLAIM) { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.HIDDEN) + changePerksDialogVisible(true) + } else if (ENSSubdomainDialogType === ENSSubdomainDialogTypeEnum.CREATE_SUBDOMAIN) { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.CLAIM, true) + } + } + + return ( + + + {ENSSubdomainDialogType === ENSSubdomainDialogTypeEnum.CLAIM && } + {[ENSSubdomainDialogTypeEnum.CREATE_SUBDOMAIN, ENSSubdomainDialogTypeEnum.UPDATE_SUBDOMAIN].includes(ENSSubdomainDialogType) && ( + + )} + {ENSSubdomainDialogType === ENSSubdomainDialogTypeEnum.SUCCESS && } + + + ) +} + +export default ENSSubdomainDialog diff --git a/src/pages/canvas/Dashboard/FirstBadgeMask.tsx b/src/pages/canvas/Dashboard/FirstBadgeMask.tsx new file mode 100644 index 000000000..7f9551208 --- /dev/null +++ b/src/pages/canvas/Dashboard/FirstBadgeMask.tsx @@ -0,0 +1,58 @@ +import { motion } from "framer-motion" +import { useEffect } from "react" +import Img from "react-cool-img" + +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useCanvasStore from "@/stores/canvasStore" + +const FirstBadgeMask = props => { + const { badgeWidth } = props + const { isMobile, isPortrait } = useCheckViewport() + + const { provider } = useRainbowContext() + const { firstBadgeWithPosition, changeBadgeAnimationVisible, addFirstBadge, queryFirstMintUsername, orderedAttachedBadges } = useCanvasStore() + const headerHeight = isPortrait ? 0 : 65 + const left = window.innerWidth / 2 - badgeWidth + badgeWidth * 0.15 + const top = (window.innerHeight - headerHeight) / 2 + headerHeight - 2 * badgeWidth + badgeWidth * 0.15 + + useEffect(() => { + if (orderedAttachedBadges.includes(firstBadgeWithPosition.id)) { + setTimeout(() => { + changeBadgeAnimationVisible(false) + }, 1000) + } + }, [orderedAttachedBadges]) + + const handleAnimationComplete = async () => { + addFirstBadge(provider, firstBadgeWithPosition.id, firstBadgeWithPosition.image, firstBadgeWithPosition.badgeContract) + const signer = await provider!.getSigner(0) + queryFirstMintUsername(signer) + } + return ( + + Ethereum Year + + ) +} + +export default FirstBadgeMask diff --git a/src/pages/canvas/Dashboard/NFTsDialog/SetUpNFTProfile.tsx b/src/pages/canvas/Dashboard/NFTsDialog/SetUpNFTProfile.tsx new file mode 100644 index 000000000..212c29e2a --- /dev/null +++ b/src/pages/canvas/Dashboard/NFTsDialog/SetUpNFTProfile.tsx @@ -0,0 +1,92 @@ +import { useMemo } from "react" + +import { Stack, Typography } from "@mui/material" + +import AdvertisingNFT1 from "@/assets/images/canvas/advertising-nft-1.webp" +import AdvertisingNFT2 from "@/assets/images/canvas/advertising-nft-2.png" +import AdvertisingNFT3 from "@/assets/images/canvas/advertising-nft-3.webp" +import useCheckViewport from "@/hooks/useCheckViewport" +import useCanvasProfileStore, { NFTsDialogTypeEnum } from "@/stores/canvasProfileStore" +import usePerkStore from "@/stores/perksStore" + +import PerksBadge from "../../components/PerksBadge" +import PerksButton from "../../components/PerksButton" +import PerksClaimedLabel from "../../components/PerksClaimedLabel" +import NFTAvatar from "../BadgeWall/Avatar/NFTAvatar" + +const ADVERTISING_NFT_LIST = [ + { url: AdvertisingNFT1, rotate: "-15deg", y: "15%", x: "8%" }, + { url: AdvertisingNFT2, rotate: "0deg", y: "0", zIndex: 1 }, + { url: AdvertisingNFT3, rotate: "15deg", y: "15%", x: "-8%" }, +] + +const SetUpNFTProfile = props => { + // NFTsDialogAllowBack means from PerksDialog then prevent from re-claiming + const { changeNFTsDialogType, NFTsDialogAllowBack } = useCanvasProfileStore() + const { isMobile } = useCheckViewport() + + const { perks } = usePerkStore() + + const NFTPerk = useMemo(() => perks.find(perk => perk.id === "nft-profile-setup")!, [perks]) + + const handleGoToConfirm = () => { + changeNFTsDialogType(NFTsDialogTypeEnum.SET_UP) + } + + return ( + <> + + Set up an NFT profile + + + Set your profile picture to an NFT you own to show off your prized possessions. + + + + {ADVERTISING_NFT_LIST.map(({ url, rotate, x, y, zIndex }) => ( + + ))} + + + Collect the following badge(s) to qualify: + + + + + {NFTPerk.claimed && NFTsDialogAllowBack ? ( + + ) : ( + + Claim Now + + )} + + ) +} + +export default SetUpNFTProfile diff --git a/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/Error.tsx b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/Error.tsx new file mode 100644 index 000000000..584964997 --- /dev/null +++ b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/Error.tsx @@ -0,0 +1,18 @@ +import { Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ErrorSvg } from "@/assets/svgs/ecosystem/error.svg" +import useCheckViewport from "@/hooks/useCheckViewport" + +const Error = props => { + const { dark, title, description, action, ...restProps } = props + const { isMobile } = useCheckViewport() + return ( + + + {title} + {action} + + ) +} + +export default Error diff --git a/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/NFTCard.tsx b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/NFTCard.tsx new file mode 100644 index 000000000..1914a30fe --- /dev/null +++ b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/NFTCard.tsx @@ -0,0 +1,47 @@ +import Img from "react-cool-img" + +import { Stack, Typography } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" + +const NFTCard = props => { + const { name, collectionName, tokenId, imageUrl, sx, active, ...restProps } = props + const { isMobile } = useCheckViewport() + + return ( + + {name} + + {name || `${collectionName} ${tokenId}`} + + + ) +} + +export default NFTCard diff --git a/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/NoData.tsx b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/NoData.tsx new file mode 100644 index 000000000..351ef1d94 --- /dev/null +++ b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/NoData.tsx @@ -0,0 +1,23 @@ +import Img from "react-cool-img" + +import { Stack, Typography } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" + +const NoData = props => { + const { title, description, ...restProps } = props + const { isMobile } = useCheckViewport() + + return ( + + Empty + + {title} + + + ) +} + +export default NoData diff --git a/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/index.tsx b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/index.tsx new file mode 100644 index 000000000..22d002a09 --- /dev/null +++ b/src/pages/canvas/Dashboard/NFTsDialog/ViewNFTs/index.tsx @@ -0,0 +1,246 @@ +import { useInfiniteQuery, useMutation, useQueryClient } from "@tanstack/react-query" +import { useEffect, useRef, useState } from "react" +import Img from "react-cool-img" +import { useInView } from "react-intersection-observer" +import { useWalletClient } from "wagmi" + +import { Box, Skeleton, Stack, Typography } from "@mui/material" + +import { fetchUserNFTsURL, setCanvasAvatarURL } from "@/apis/canvas-profile" +import LoadingButton from "@/components/LoadingButton" +import LoadingPage from "@/components/LoadingPage" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useSnackbar from "@/hooks/useSnackbar" +import PerksButton from "@/pages/canvas/components/PerksButton" +import useCanvasProfileStore, { NFTsDialogTypeEnum } from "@/stores/canvasProfileStore" +import { generateTypedData } from "@/utils" + +import Error from "./Error" +import NFTCard from "./NFTCard" +import NoData from "./NoData" + +interface NFTMutationVariables { + walletAddress: `0x${string}` | undefined + contractAddress: string + contractType: string + tokenId: string +} + +interface NFTAvatar { + contractType: string + contractAddress: string + tokenId: string + imageUrl: string +} + +const ViewNFTs = () => { + const { walletCurrentAddress } = useRainbowContext() + const { data: client } = useWalletClient() + + const { NFTsDialogType, changeNFTsDialogType } = useCanvasProfileStore() + const { ref, inView } = useInView() + const { isMobile } = useCheckViewport() + + const alertWarning = useSnackbar() + + const [page, setPage] = useState(1) + const [dots, setDots] = useState("") + + const pageSize = useRef(8) + + const [selectedNFT, setSelectedNFT] = useState>({}) + + const queryClient = useQueryClient() + const { data, isLoading, isFetching, isFetchingNextPage, error, refetch, hasNextPage, fetchNextPage } = useInfiniteQuery({ + queryKey: ["userNFTs", walletCurrentAddress], + queryFn: async ({ pageParam = 1 }): Promise<{ assets: any[]; nextPage: number }> => { + const { total, assets } = await scrollRequest(fetchUserNFTsURL("0x25dbB9439BE70C2A4E047e5dB42177946957a1aD", pageParam, pageSize.current)) + let nextPage = 0 + if (total > pageSize.current * page) { + setPage(page + 1) + nextPage = page + 1 + } + return { assets, nextPage } + }, + initialPageParam: 1, + getNextPageParam: lastPage => lastPage?.nextPage || undefined, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + enabled: NFTsDialogType === NFTsDialogTypeEnum.SET_UP, + gcTime: 2e3, + }) + + const { mutateAsync: setNFTAvatarMutation, isPending } = useMutation({ + mutationFn: async ({ walletAddress, contractAddress, contractType, tokenId }: NFTMutationVariables) => { + const timestamp = Date.now().toString() + const signature = await client?.signTypedData(generateTypedData(walletAddress, undefined, contractAddress, tokenId, timestamp) as any) + const formData = new FormData() + formData.append("nftContract", contractAddress) + formData.append("nftContractType", contractType) + formData.append("signature", signature || "") + formData.append("tokenID", tokenId) + formData.append("timestamp", timestamp) + + return await scrollRequest(setCanvasAvatarURL(walletAddress), { + method: "POST", + body: formData, + }) + }, + onSuccess: data => { + handleCloseNFTsDialog() + queryClient.setQueryData(["canvasAvatar", walletCurrentAddress], { + tokenID: selectedNFT.tokenId, + contract: selectedNFT.contractAddress, + contractType: selectedNFT.contractType, + nftAvatarClaimed: true, + }) + queryClient.setQueryData(["NFTAvatarImageURL", walletCurrentAddress], { image: selectedNFT.imageUrl }) + // queryClient.invalidateQueries({ + // queryKey: ["canvasAvatar", walletCurrentAddress], + // }) + }, + onError: error => { + if (error.name !== "UserRejectedRequestError") { + alertWarning("Something went wrong, please try again later.") + } + }, + }) + + useEffect(() => { + if (inView) { + fetchNextPage() + } + }, [fetchNextPage, inView]) + + useEffect(() => { + const interval = setInterval(() => { + setDots(prevDots => (prevDots.length < 3 ? prevDots + "." : "")) + }, 500) + + return () => clearInterval(interval) + }, []) + + const handleReQuest = () => { + refetch() + } + + const handleApplyNFT = () => { + const { contractType, contractAddress, tokenId } = selectedNFT as NFTAvatar + setNFTAvatarMutation({ + walletAddress: walletCurrentAddress, + contractType, + contractAddress, + tokenId, + }) + } + + const handleCloseNFTsDialog = () => { + changeNFTsDialogType(NFTsDialogTypeEnum.HIDDEN) + setPage(1) + setSelectedNFT({}) + queryClient.removeQueries({ queryKey: ["userNFTs", walletCurrentAddress], exact: true }) + } + + const handlePickNFT = item => { + if (isSelectedNFT(item)) { + setSelectedNFT({}) + return + } + setSelectedNFT({ + contractType: item.contractType, + contractAddress: item.contractAddress, + tokenId: item.tokenId, + imageUrl: item.imageUrl, + }) + } + + const isSelectedNFT = item => { + const { contractType, contractAddress, tokenId } = selectedNFT + if (contractType === item.contractType && contractAddress === item.contractAddress && tokenId === item.tokenId) { + return true + } + return false + } + + return ( + <> + + Choose an NFT + + {isLoading && ( + } + > + )} + {!isFetching && data?.pages.every(page => !page.assets.length) && ( + + + + )} + {error && !data?.pages.length && ( + + + Try again + + } + > + + )} + {data?.pages.some(page => page.assets.length) && ( + <> + + {data.pages.map(page => ( + <> + {(page as any)?.assets.map(item => ( + handlePickNFT(item)} + > + ))} + + ))} + {(hasNextPage || isFetchingNextPage) && ( + + + loading{dots} + + )} + + + Sign and Apply + + + )} + + ) +} + +export default ViewNFTs diff --git a/src/pages/canvas/Dashboard/NFTsDialog/index.tsx b/src/pages/canvas/Dashboard/NFTsDialog/index.tsx new file mode 100644 index 000000000..6f432059f --- /dev/null +++ b/src/pages/canvas/Dashboard/NFTsDialog/index.tsx @@ -0,0 +1,56 @@ +import { Stack } from "@mui/material" + +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasProfileStore, { NFTsDialogTypeEnum } from "@/stores/canvasProfileStore" +import usePerkStore from "@/stores/perksStore" + +import SetUpNFTProfile from "./SetUpNFTProfile" +import ViewNFTs from "./ViewNFTs" + +const NFTsDialog = () => { + const { NFTsDialogType, NFTsDialogAllowBack, changeNFTsDialogType } = useCanvasProfileStore() + + const { changePerksDialogVisible } = usePerkStore() + + const handleCloseNFTsDialog = () => { + changeNFTsDialogType(NFTsDialogTypeEnum.HIDDEN) + } + + const handleBackPerksDialog = () => { + changeNFTsDialogType(NFTsDialogTypeEnum.HIDDEN) + changePerksDialogVisible(true) + } + + return ( + + + {NFTsDialogType === NFTsDialogTypeEnum.CLAIM && } + {NFTsDialogType === NFTsDialogTypeEnum.SET_UP && } + + + ) +} + +export default NFTsDialog diff --git a/src/pages/canvas/Dashboard/NameDialog/index.tsx b/src/pages/canvas/Dashboard/NameDialog/index.tsx new file mode 100644 index 000000000..a376961ce --- /dev/null +++ b/src/pages/canvas/Dashboard/NameDialog/index.tsx @@ -0,0 +1,159 @@ +import { useEffect, useState } from "react" + +import { Box, InputBase, Stack, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import useValidateCanvasName from "@/hooks/useValidateCanvasName" +import Button from "@/pages/canvas/components/Button" +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasStore from "@/stores/canvasStore" + +const StyledInputBase = styled(InputBase)(({ theme }) => ({ + "& .MuiInputBase-input": { + textAlign: "center", + fontSize: "6.4rem", + height: "7.2rem", + fontWeight: 600, + color: theme.palette.primary.contrastText, + "&.Mui-disabled": { + "-webkit-text-fill-color": "unset", + }, + [theme.breakpoints.down("sm")]: { + fontSize: "3.2rem", + lineHeight: "4.8rem", + }, + }, +})) + +const NameDialog = () => { + const { profileDialogVisible, changeProfileDialog, username, profileContract, queryUsername } = useCanvasStore() + + const [loading, setLoading] = useState(false) + + const [profileName, setProfileName] = useState(username) + + const { helpText, clearHelpText, validating, renderValidation } = useValidateCanvasName(profileName) + + useEffect(() => { + if (profileDialogVisible) { + clearHelpText() + setProfileName(username) + } + }, [profileDialogVisible, username]) + + const handleClose = () => { + changeProfileDialog(false) + } + + const handleChange = (e: React.ChangeEvent) => { + setProfileName(e.target.value.trim()) + } + + const changeUsername = async () => { + setLoading(true) + try { + const tx = await profileContract!.changeUsername(profileName) + const txReceipt = await tx.wait() + if (txReceipt.status === 1) { + queryUsername() + handleClose() + } else { + return "due to any operation that can cause the transaction or top-level call to revert" + } + } catch (error) { + console.error("Failed to change username:", error) + } finally { + setLoading(false) + } + } + + const handleKeydown = async e => { + if (e.keyCode === 13) { + changeUsername() + } + } + + return ( + + + + Change name + + + + + {renderValidation()} + + + ({ + [theme.breakpoints.down("sm")]: { + position: "absolute", + width: "calc(100% - 4rem)", + bottom: "2.4rem", + "& > div": {}, + }, + }), + ]} + > + + + + + + ) +} + +export default NameDialog diff --git a/src/pages/canvas/Dashboard/PerksDialog/PerkItem.tsx b/src/pages/canvas/Dashboard/PerksDialog/PerkItem.tsx new file mode 100644 index 000000000..238ff3208 --- /dev/null +++ b/src/pages/canvas/Dashboard/PerksDialog/PerkItem.tsx @@ -0,0 +1,74 @@ +import { Badge, Stack, Typography } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" +import usePerkStore from "@/stores/perksStore" + +import PerksBadge from "../../components/PerksBadge" + +const PerkItem = props => { + const { perk, onClick } = props + const { title, description, claimed, metadata } = perk + + const { isMobile } = useCheckViewport() + const { newPerksIds } = usePerkStore() + + return ( + + + {claimed && ( + + Claimed + + )} + + {title} + + + {description} + + + {metadata.map(({ imageURL, owned }) => ( + + ))} + + + + ) +} + +export default PerkItem diff --git a/src/pages/canvas/Dashboard/PerksDialog/index.tsx b/src/pages/canvas/Dashboard/PerksDialog/index.tsx new file mode 100644 index 000000000..ec1b4c916 --- /dev/null +++ b/src/pages/canvas/Dashboard/PerksDialog/index.tsx @@ -0,0 +1,99 @@ +import { useQueryClient } from "@tanstack/react-query" +import "@tanstack/react-query" +import { isNil } from "lodash" +import { useEffect } from "react" + +import { Stack } from "@mui/material" + +import { useRainbowContext } from "@/contexts/RainbowProvider" +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasProfileStore, { ENSSubdomainDialogTypeEnum, NFTsDialogTypeEnum } from "@/stores/canvasProfileStore" +import useCanvasStore from "@/stores/canvasStore" +import usePerkStore from "@/stores/perksStore" + +import PerkItem from "./PerkItem" + +const PerksDialog = () => { + const { walletCurrentAddress } = useRainbowContext() + + const { userBadges } = useCanvasStore() + const { changeNFTsDialogType, changeENSSubdomainDialogType } = useCanvasProfileStore() + const { perksDialogVisible, changePerksDialogVisible, perks, generatePerks, appendNewPerksIds, newPerksIds } = usePerkStore() + const queryClient = useQueryClient() + + const ensSubdomain = queryClient.getQueryData(["ensSubdomain", walletCurrentAddress]) + + const avatarObj = queryClient.getQueryData(["canvasAvatar", walletCurrentAddress]) + + useEffect(() => { + if (!isNil(ensSubdomain) && avatarObj) { + generatePerks({ walletCurrentAddress, userBadges, ensClaimed: !!ensSubdomain, nftClaimed: Boolean((avatarObj as any)?.nftAvatarClaimed) }) + } + }, [walletCurrentAddress, userBadges, ensSubdomain, avatarObj]) + + const actionList = [ + { + id: "claim-ens-subdomain", + action: () => { + changeENSSubdomainDialogType(ENSSubdomainDialogTypeEnum.CLAIM, true) + handleClosePerksDialog() + }, + }, + { + id: "nft-profile-setup", + action: () => { + changeNFTsDialogType(NFTsDialogTypeEnum.CLAIM, true) + handleClosePerksDialog() + }, + }, + ] + + const pickPerkAction = id => { + const actionItem = actionList.find(item => item.id === id) + if (actionItem) { + return actionItem.action + } + return () => void 0 + } + + const handleClosePerksDialog = () => { + changePerksDialogVisible(false) + if (newPerksIds.length > 0) { + appendNewPerksIds() + } + } + + return ( + + + {perks.map((perk, index) => ( + + ))} + + + ) +} + +export default PerksDialog diff --git a/src/pages/canvas/Dashboard/ReferDialog/coupon.tsx b/src/pages/canvas/Dashboard/ReferDialog/coupon.tsx new file mode 100644 index 000000000..66f15094e --- /dev/null +++ b/src/pages/canvas/Dashboard/ReferDialog/coupon.tsx @@ -0,0 +1,216 @@ +import copy from "copy-to-clipboard" +import { useState } from "react" +import useSWR from "swr" +import { makeStyles } from "tss-react/mui" + +import { Box, Button, Menu, MenuItem, Stack, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { fetchCodeByAdd, getInviteUrlByCode } from "@/apis/canvas" +import { ReactComponent as CopySuccessSvg } from "@/assets/svgs/canvas/copy-success.svg" +import couponMobileBackground from "@/assets/svgs/canvas/coupon-mobile.svg" +import couponBackground from "@/assets/svgs/canvas/coupon.svg" +import { ReactComponent as LogoSvg } from "@/assets/svgs/canvas/logo.svg" +import { ReactComponent as ShareSvg } from "@/assets/svgs/canvas/share.svg" +import { ReactComponent as TwitterSvg } from "@/assets/svgs/nft/twitter.svg" +import Skeleton from "@/components/Skeleton" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" +import useCanvasStore from "@/stores/canvasStore" +import { generateShareTwitterURL } from "@/utils" + +const CouponBox = styled(Box)(({ theme }) => ({ + background: `url(${couponBackground}) no-repeat center center`, + width: "65.2rem", + height: "26.2rem", + margin: "0 15.4rem 9.6rem", + display: "flex", + alignItems: "center", + justifyContent: "space-between", + padding: "2.4rem 1.6rem", + [theme.breakpoints.down("sm")]: { + width: "100%", + height: "auto", + aspectRatio: "320/158", + background: `url(${couponMobileBackground}) no-repeat center center`, + backgroundSize: "contain", + padding: "1.4rem 1.2rem", + margin: 0, + gap: "3rem", + }, +})) + +const DescriptionBox = styled(Box)(({ theme }) => ({ + border: "1px solid #000", + background: "#FDE9D5", + height: "22.2rem", + width: "23.2rem", + display: "flex", + alignItems: "center", + justifyContent: "center", + flexDirection: "column", + [theme.breakpoints.down("sm")]: { + height: "13.4rem", + flex: 110, + padding: "1rem 1rem 0", + }, +})) + +const useStyles = makeStyles()((theme, { dropdownWidth }) => ({ + paper: { + borderRadius: "0.5rem", + marginTop: "0.5rem", + transformOrigin: "50% 0px !important", + }, + list: { + padding: 0, + width: "34rem", + [theme.breakpoints.down("sm")]: { + width: dropdownWidth, + }, + }, + item: { + width: "100%", + padding: "0.8rem 1.6rem", + fontSize: "1.6rem", + fontWeight: 600, + lineHeight: "2.4rem", + justifyContent: "center", + [theme.breakpoints.down("sm")]: { + minHeight: "unset", + }, + }, + codeWrapper: { + borderRadius: "0.6rem", + border: `0.15rem solid ${theme.palette.text.primary}`, + background: theme.palette.background.default, + width: "34rem", + height: "7.2rem", + [theme.breakpoints.down("sm")]: { + width: "100%", + height: "4rem", + }, + }, +})) + +let copyTimer: any + +const Coupon = props => { + const { shouldFetch } = props + const [dropdownWidth, setDropdownWidth] = useState() + + const { classes } = useStyles({ dropdownWidth: dropdownWidth ? dropdownWidth : "auto" }) + const { walletCurrentAddress } = useRainbowContext() + const [copied, setCopied] = useState(0) + + const { username } = useCanvasStore() + const alertWarning = useSnackbar() + + const [anchorEl, setAnchorEl] = useState(null) + + const fetchCode = url => scrollRequest(url) + + const { data: { code } = {}, isLoading } = useSWR(() => (shouldFetch ? fetchCodeByAdd(walletCurrentAddress) : null), fetchCode, { + revalidateIfStale: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + shouldRetryOnError: false, + onError: e => { + alertWarning("Failed to fetch Scroll Canvas Coupon") + }, + }) + + const handleDropdown = e => { + setAnchorEl(e.currentTarget) + if (e.currentTarget) { + setDropdownWidth(e.currentTarget.getBoundingClientRect().width + "px") + } + } + + const handleClose = () => { + setAnchorEl(null) + setCopied(0) + } + + const handleShareToX = () => { + const inviteUrl = getInviteUrlByCode(code) + const text = "Use my invite code to save 50% on Scroll Canvas mint!" + const shareUrl = generateShareTwitterURL(inviteUrl, text) + window.open(shareUrl) + handleClose() + } + const handleCopyLink = () => { + const inviteUrl = getInviteUrlByCode(code) + copy(inviteUrl) + setCopied(1) + clearTimeout(copyTimer) + copyTimer = setTimeout(() => { + setCopied(0) + }, 15e2) + } + + const handleCopyCode = () => { + copy(code) + setCopied(2) + clearTimeout(copyTimer) + copyTimer = setTimeout(() => { + setCopied(0) + }, 15e2) + } + + return ( + + + From: {username} + 50% OFF + + Mint Fee + + + + + Invite Code + + {isLoading ? ( + + ) : ( + {code} + )} + + + + + + Share to + + + {copied === 1 && } + <>{copied === 1 ? "Link copied" : "Copy link"} + + + {copied === 2 && } + <>{copied === 2 ? "Code copied" : "Copy code"} + + + + + ) +} + +export default Coupon diff --git a/src/pages/canvas/Dashboard/ReferDialog/index.tsx b/src/pages/canvas/Dashboard/ReferDialog/index.tsx new file mode 100644 index 000000000..5c14fb22a --- /dev/null +++ b/src/pages/canvas/Dashboard/ReferDialog/index.tsx @@ -0,0 +1,59 @@ +import { Box, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasStore from "@/stores/canvasStore" + +import Coupon from "./coupon" +import Record from "./record" + +const Title = styled(Typography)(({ theme }) => ({ + color: "#FFFFFF", + textAlign: "center", + fontSize: "3.2rem", + fontWeight: 600, + lineHeight: 1, + marginBottom: "1.6rem", + [theme.breakpoints.down("sm")]: { + fontSize: "2rem", + lineHeight: "3.2rem", + marginBottom: "0.8rem", + }, +})) + +const SubTitle = styled(Typography)(({ theme }) => ({ + color: "#EEEEEE", + textAlign: "center", + fontSize: "1.8rem", + fontWeight: 400, + lineHeight: "2.8rem", + marginBottom: "3.2rem", + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + lineHeight: "2.4rem", + marginBottom: "2.4rem", + }, +})) + +const ReferDialog = () => { + const { referDialogVisible, changeReferDialog } = useCanvasStore() + + const handleClose = () => { + changeReferDialog(false) + } + + return ( + + + Invite friends & you both receive + + Your friend gets 50% off the Canvas mint fee

    and you receive 0.0005 ETH per successful referral +
    + + +
    +
    + ) +} + +export default ReferDialog diff --git a/src/pages/canvas/Dashboard/ReferDialog/record.tsx b/src/pages/canvas/Dashboard/ReferDialog/record.tsx new file mode 100644 index 000000000..a68537424 --- /dev/null +++ b/src/pages/canvas/Dashboard/ReferDialog/record.tsx @@ -0,0 +1,119 @@ +import { formatEther } from "ethers" +import { useEffect, useState } from "react" + +import { Box, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import Skeleton from "@/components/Skeleton" +import { useCanvasContext } from "@/contexts/CanvasContextProvider" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" +import { getReferrerData } from "@/services/canvasService" + +const RecordBox = styled(Box)(({ theme }) => ({ + borderRadius: "0.8rem", + background: "#3B3B3B", + padding: "0.8rem 2.4rem", + display: "flex", + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + width: "max-content", + margin: "0 auto 6rem", + gap: "4rem", + [theme.breakpoints.down("sm")]: { + flexDirection: "column", + justifyContent: "space-between", + gap: "1.8rem", + margin: "0 0 2.4rem", + width: "100%", + }, +})) + +const Item = styled(Box)(({ theme }) => ({ + display: "flex", + alignItems: "center", + gap: "1.6rem", + flex: 1, + [theme.breakpoints.down("sm")]: { + width: "100%", + }, +})) + +const Description = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.contrastText, + fontSize: "1.6rem", + fontWeight: 500, + lineHeight: "2.4rem", +})) + +const Value = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.contrastText, + fontSize: "4.8rem", + fontWeight: 600, + lineHeight: "6.4rem", + [theme.breakpoints.down("sm")]: { + fontSize: "3.2rem", + lineHeight: "4.8rem", + textAlign: "center", + width: "100%", + }, +})) + +const Record = () => { + const { walletCurrentAddress } = useRainbowContext() + + const { profileRegistryContract } = useCanvasContext() + const alertWarning = useSnackbar() + + const [loading, setLoading] = useState(false) + const [count, setCount] = useState(0) + const [earnedETH, setEarnedETH] = useState("0") + + useEffect(() => { + if (profileRegistryContract && walletCurrentAddress) { + setLoading(true) + getReferrerData(profileRegistryContract, walletCurrentAddress) + .then(data => { + setCount(Number(data[0])) + setEarnedETH(formatEther(data[1])) + }) + .catch(() => { + alertWarning("Falied to get referrer data") + }) + .finally(() => { + setLoading(false) + }) + } + }, [profileRegistryContract, walletCurrentAddress]) + + return ( + + + + Friends
    + Referred +
    + {loading ? ( + + ) : ( + {count} + )} +
    + + + ETH +
    + Received +
    + {loading ? ( + + ) : ( + {earnedETH} + )} +
    +
    + ) +} + +export default Record diff --git a/src/pages/canvas/Dashboard/index.tsx b/src/pages/canvas/Dashboard/index.tsx new file mode 100644 index 000000000..9d1f87891 --- /dev/null +++ b/src/pages/canvas/Dashboard/index.tsx @@ -0,0 +1,202 @@ +import { BrowserProvider } from "ethers" +import React, { useCallback, useEffect, useMemo, useState } from "react" +import { isDesktop } from "react-device-detect" +import { Helmet } from "react-helmet-async" +import { Navigate, useNavigate, useParams } from "react-router-dom" + +import Scrolly from "@/components/Scrolly" +import { useCanvasContext } from "@/contexts/CanvasContextProvider" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useShowScrolly from "@/hooks/useShowScrolly" +import useSnackbar from "@/hooks/useSnackbar" +import { checkIfProfileMinted } from "@/services/canvasService" +import useCanvasStore, { BadgesDialogType } from "@/stores/canvasStore" +import { requireEnv } from "@/utils" + +import GridBg from "../components/GridBg" +import LoadingPage from "../loading" +import ActionBox from "./ActionBox" +import BadgeDetailDialog from "./BadgeDetailDialog" +import BadgeWall from "./BadgeWall" +import BadgesDialog from "./BadgesDialog" +import CropAvatarDialog from "./CropAvatarDialog" +import CustomizeDisplayDialog from "./CustomizeDisplayDialog" +import ENSSubdomainDialog from "./ENSSubdomainDialog" +import FirstBadgeMask from "./FirstBadgeMask" +import NFTsDialog from "./NFTsDialog" +import NameDialog from "./NameDialog" +import PerksDialog from "./PerksDialog" +import ReferDialog from "./ReferDialog" + +const Dashboard = props => { + const { walletCurrentAddress } = useRainbowContext() + + const { address: othersWalletAddress } = useParams() + const navigate = useNavigate() + + const { unsignedProfileRegistryContract, publicProvider } = useCanvasContext() + + const { + canvasUsername, + orderedAttachedBadges, + fetchCurrentCanvasDetail, + fetchOthersCanvasDetail, + profileAddress, + changeProfileDetailLoading, + profileDetailLoading, + badgeAnimationVisible, + initialMint, + badgesDialogVisible, + upgradableBadges, + pickUpgradableBadges, + pickUpgradableBadgesLoading, + queryNotifiableBadges, + } = useCanvasStore() + + const { open: scrollyOpen, data: scrollyAlert } = useShowScrolly() + + const metadata = { + title: `Scroll - ${canvasUsername}'s Canvas`, + description: "Collect onchain badges and build your story on Scroll", + image: `${requireEnv("REACT_APP_CANVAS_BACKEND_URI")}/canvas/${othersWalletAddress || walletCurrentAddress}.png`, + } + + useEffect(() => { + if (badgesDialogVisible === BadgesDialogType.UPGRADE) { + pickUpgradableBadges(publicProvider) + } + }, [badgesDialogVisible]) + + const [windowDimensions, setWindowDimensions] = useState({ + width: window.innerWidth, + height: window.innerHeight, + }) + + useEffect(() => { + if (unsignedProfileRegistryContract && othersWalletAddress) { + fetchOthers(publicProvider, unsignedProfileRegistryContract, othersWalletAddress) + } + }, [unsignedProfileRegistryContract, othersWalletAddress]) + + // must have minted + useEffect(() => { + if (publicProvider && publicProvider instanceof BrowserProvider && !othersWalletAddress && profileAddress && !initialMint) { + fetchCurrent(publicProvider, walletCurrentAddress, profileAddress) + } + }, [publicProvider, othersWalletAddress, profileAddress, initialMint]) + + const alertWarning = useSnackbar() + + const fetchCurrent = async (provider, walletAddress, profileAddress) => { + try { + changeProfileDetailLoading(true) + const signer = await provider?.getSigner(0) + await fetchCurrentCanvasDetail(signer, walletAddress, profileAddress) + queryNotifiableBadges(walletAddress) + pickUpgradableBadges(provider) + } catch (e) { + alertWarning(e.message) + } finally { + changeProfileDetailLoading(false) + } + } + + const fetchOthers = async (provider, unsignedProfileRegistryContract, othersWalletAddress) => { + try { + changeProfileDetailLoading(true) + await checkAndFetchOthersCanvasDetail(provider, unsignedProfileRegistryContract, othersWalletAddress) + } catch (e) { + alertWarning(e.message) + } finally { + changeProfileDetailLoading(false) + } + } + const checkAndFetchOthersCanvasDetail = async (provider, unsignedProfileRegistryContract, othersWalletAddress) => { + const { minted, profileAddress } = await checkIfProfileMinted(unsignedProfileRegistryContract, othersWalletAddress) + if (!minted) { + navigate("/404") + return + } + await fetchOthersCanvasDetail(provider, othersWalletAddress, profileAddress) + } + + const handleResize = useCallback(() => { + setWindowDimensions({ + width: window.innerWidth, + height: window.innerHeight, + }) + }, []) + + useEffect(() => { + window.addEventListener("resize", handleResize) + return () => window.removeEventListener("resize", handleResize) + }, [handleResize]) + + const gridNum = useMemo(() => (orderedAttachedBadges.length > 12 ? 8 : 4), [orderedAttachedBadges]) + + const badgewidth = useMemo(() => { + const { width, height } = windowDimensions + if (width < height - 62) { + return (width - 62) / gridNum + } else { + return (height - 65 - 80) / gridNum + } + }, [windowDimensions, gridNum]) + + if (othersWalletAddress === walletCurrentAddress) { + return + } + return ( + <> + + {metadata.title} + + + + + + + + + {!!profileDetailLoading ? ( + + ) : ( + + + {isDesktop && !othersWalletAddress && ( + scrollyAlert?.clearData?.()} + canvasId="dashboardCanvas" + /> + )} + {!!othersWalletAddress ? ( + <> + + + + ) : ( + <> + + + + + + + + + + + + )} + + )} + {badgeAnimationVisible && } + + ) +} + +export default Dashboard diff --git a/src/pages/canvas/badge/BackToCanvas.tsx b/src/pages/canvas/badge/BackToCanvas.tsx new file mode 100644 index 000000000..fdbff5127 --- /dev/null +++ b/src/pages/canvas/badge/BackToCanvas.tsx @@ -0,0 +1,36 @@ +import { Link as RouterLink } from "react-router-dom" + +import { Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as BackSvg } from "@/assets/svgs/canvas/back.svg" +import Skeleton from "@/components/Skeleton" + +const BackToCanvas = props => { + const { username, sx, loading, href, ...restProps } = props + return ( + + + + + Back to{" "} + <> + {loading ? ( + + ) : ( + <>{username} + )} + + ’s Canvas + + + + ) +} +export default BackToCanvas diff --git a/src/pages/canvas/badge/BadgeDetail.tsx b/src/pages/canvas/badge/BadgeDetail.tsx new file mode 100644 index 000000000..45d4c42ff --- /dev/null +++ b/src/pages/canvas/badge/BadgeDetail.tsx @@ -0,0 +1,312 @@ +import { useEffect, useRef, useState } from "react" +import Img from "react-cool-img" +import { Helmet } from "react-helmet-async" + +import { Avatar, Box, Link, Stack, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import SectionWrapper from "@/components/SectionWrapper" +import Skeleton from "@/components/Skeleton" +import useCheckViewport from "@/hooks/useCheckViewport" +import UpgradeAction from "@/pages/canvas/Dashboard/BadgeDetailDialog/UpgradeAction" +import useCanvasStore from "@/stores/canvasStore" +import { ipfsToBrowserURL } from "@/utils" + +import BadgeDesc from "../components/BadgeDesc" +import BadgeImage from "../components/BadgeImage" +import Statistic from "../components/Statistic" + +const InfoBox = styled(Box)(({ theme, count }) => ({ + display: "grid", + gridTemplateColumns: count === 1 ? "1fr" : "repeat(3, 1fr)", + rowGap: "3.2rem", + columnGap: "4.8rem", + [theme.breakpoints.down("sm")]: { + gridTemplateColumns: count === 1 ? "1fr" : "repeat(2, 1fr)", + width: "100%", + columnGap: "2.4rem", + rowGap: "1.6rem", + }, +})) + +const DisclaimerBox = styled(Box)(({ theme }) => ({ + padding: "0.8rem 1.2rem", + color: "#FFF", + fontSize: "1.4rem", + lineHeight: "2rem", + borderRadius: "0.4rem", + background: "#262626", + display: "flex", + justifyContent: "center", + alignItems: "center", +})) + +const BadgeDetail = props => { + const { detail, metadata, loading, breadcrumb, property, onUpgrade, children } = props + const { isBadgeUpgrading } = useCanvasStore() + const { isLandscape } = useCheckViewport() + const [actionHeight, setActionHeight] = useState("auto") + const [isOverflow, setIsOverflow] = useState(false) + + const actionsRef = useRef() + + useEffect(() => { + const actionBoxObserver = new ResizeObserver(entries => { + // this will get called whenever div dimension changes + entries.forEach(entry => { + setActionHeight(entry.target.getBoundingClientRect().height + "px") + }) + }) + if (actionsRef.current) { + actionBoxObserver.observe(actionsRef.current as HTMLElement) + } + return () => { + actionBoxObserver.disconnect() + } + }, []) + + useEffect(() => { + if (actionHeight !== "auto") { + const detailContainerEl = document.querySelector(".detail-container") as HTMLElement + setIsOverflow(detailContainerEl.clientHeight < detailContainerEl.scrollHeight) + } + }, [loading, actionHeight]) + + const getCommunityLogo = (communityURL): string => { + if (communityURL.includes("x.com") || communityURL.includes("twitter.com")) { + return "/imgs/canvas/support/x.svg" + } else if (communityURL.includes("discord.com") || communityURL.includes("discord.gg")) { + return "/imgs/canvas/support/discord.svg" + } else if (communityURL.includes("t.me") || communityURL.includes("telegram.me")) { + return "/imgs/canvas/support/telegram.svg" + } else { + return "/imgs/canvas/support/contact.svg" + } + } + + return ( + <> + + {metadata.title} + + + + + + + + + + theme.palette.primary.contrastText, + }, + "@media (max-width: 1280px)": { + gap: "4rem", + gridTemplateColumns: "min-content 1fr", + justifyItems: "center", + }, + + "@media (max-width: 900px)": { + gap: "2rem", + gridTemplateColumns: "1fr", + }, + "@media (max-width: 600px)": { + gap: "1.6rem", + height: "max-content", + }, + }} + > + {!!breadcrumb && {breadcrumb}} + + + {loading ? ( + + ) : ( + + )} + + + + {!loading && detail.upgradable && ( + + )} + {loading ? ( + + ) : ( + + {detail.name} + + )} + {loading ? ( + + ) : ( + + {detail.description} + + )} + + + + {property.includes("owner") && ( + + + + {detail.owner} + + + )} + {property.includes("issuer") && ( + <> + + + + {detail.issuer?.name || "Unknown"} + + + {detail.issuer?.communityURL && ( + + + + Contact + + + )} + + )} + {property.includes("mintedOn") && ( + + {detail.mintedOn} + + )} + {property.includes("rarity") && ( + + {detail.rarity} + + )} + + + {!property.includes("owner") && detail.thirdParty && ( + + warning image + Issuing badge is permissionless - perform due diligence and interact with dApps at your own risk. + + )} + + ({ + [theme.breakpoints.down("sm")]: { + position: "fixed", + padding: "2.4rem 2rem", + bottom: 0, + width: "100%", + rowGap: "1.6rem", + gridTemplateColumns: "1fr min-content", + "& > div": { + width: "100%", + }, + }, + }), + ]} + > + {children} + + + + + + ) +} + +export default BadgeDetail diff --git a/src/pages/canvas/badge/index.tsx b/src/pages/canvas/badge/index.tsx new file mode 100644 index 000000000..128b5e25e --- /dev/null +++ b/src/pages/canvas/badge/index.tsx @@ -0,0 +1,188 @@ +import { useEffect, useMemo, useState } from "react" +import { useNavigate, useParams } from "react-router-dom" + +import { SvgIcon } from "@mui/material" + +import { getSmallHeartbeatURL, viewEASScanURL } from "@/apis/canvas" +import { ReactComponent as ShareSvg } from "@/assets/svgs/canvas/share.svg" +import ScrollButton from "@/components/Button" +import Link from "@/components/Link" +import { BADGE_TYPE, NFT_RARITY_MAP } from "@/constants" +import { useCanvasContext } from "@/contexts/CanvasContextProvider" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" +import { + checkBadgeUpgradable, + fetchIssuer, + fetchNotionBadgeByAddr, + generateBadgeFromAttestation, + queryAttestationByUID, + queryCanvasUsername, + upgradeBadge, +} from "@/services/canvasService" +import useCanvasStore from "@/stores/canvasStore" +import { formatDate, generateShareTwitterURL, isOriginsNFTBadge, requireEnv } from "@/utils" + +import BackToCanvas from "./BackToCanvas" +import BadgeDetail from "./BadgeDetail" + +const BadgeDetailPage = () => { + const { id } = useParams() + const navigate = useNavigate() + + const { walletCurrentAddress } = useRainbowContext() + + const { unsignedProfileRegistryContract, publicProvider } = useCanvasContext() + const { changeIsBadgeUpgrading, username } = useCanvasStore() + + const alertWarning = useSnackbar() + + const [detail, setDetail] = useState({}) + const [loading, setLoading] = useState(false) + + const metadata = useMemo( + () => ({ + title: `Canvas Badge - ${detail.name} Owned by ${detail.owner}`, + description: `I have minted the ${detail.name}`, + image: `${requireEnv("REACT_APP_CANVAS_BACKEND_URI")}/badge/${id}.png`, + }), + [detail], + ) + + const shareBadgeURL = useMemo(() => { + const viewURL = `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas/badge/${id}` + const myText = `I just minted ${detail.name} badge. Find out your eligibility on Scroll Canvas, too!` + const othersText = "Checkout this badge and check your eligibility!" + const text = username && detail.owner && detail.owner === username ? myText : othersText + return generateShareTwitterURL(viewURL, text) + }, [id, detail]) + + useEffect(() => { + if (unsignedProfileRegistryContract) { + fetchBadgeDetailByBadgeId(id) + } + }, [unsignedProfileRegistryContract, id]) + + const fetchProfileUsername = async (provider, walletAddress) => { + try { + const profileAddress = await unsignedProfileRegistryContract.getProfile(walletAddress) + const { name } = await queryCanvasUsername(provider, profileAddress) + return name + } catch (error) { + console.log("Failed to query username:", error) + } + } + + const fetchBadgeDetailByBadgeId = async id => { + setLoading(true) + try { + const attestation = await queryAttestationByUID(publicProvider, id) + if (!attestation.id) { + navigate("/404") + return + } + + const { recipient, time, data } = attestation + + const { badgeContract, description, ...badgeMetadata } = await generateBadgeFromAttestation(publicProvider, { id, data }) + + let badgeWidthIssuer = await fetchNotionBadgeByAddr(badgeContract) + if (!badgeWidthIssuer.issuer) { + const issuer = await fetchIssuer(badgeMetadata.issuerName) + badgeWidthIssuer = { + issuer, + thirdParty: true, + } + } + + const name = await fetchProfileUsername(publicProvider, recipient) + let upgradable = false + if (walletCurrentAddress === recipient) { + const checkedBadge = await checkBadgeUpgradable(publicProvider, { id, badgeContract }) + upgradable = checkedBadge.upgradable + } + const badgeDetail = { + ...badgeMetadata, + category: badgeWidthIssuer.category, + walletAddress: recipient, + owner: name, + ownerLogo: getSmallHeartbeatURL(recipient), + mintedOn: formatDate(Number(time) * 1000), + badgeContract, + issuer: badgeWidthIssuer.issuer, + description: isOriginsNFTBadge(badgeContract) ? badgeWidthIssuer.description : description, + upgradable, + thirdParty: badgeWidthIssuer.thirdParty, + } + if (isOriginsNFTBadge(badgeContract)) { + const rarityNum = badgeMetadata.attributes.find(item => item.trait_type === "Rarity").value + badgeDetail.rarity = NFT_RARITY_MAP[rarityNum] + } + setDetail(badgeDetail) + } catch (e) { + alertWarning("Failed to fetch badge detail") + } finally { + setLoading(false) + } + } + + const viewCanvasURL = useMemo(() => { + // console.log("walletCurrentAddress", walletCurrentAddress, detail) + if (walletCurrentAddress === detail.walletAddress) { + return "/canvas" + } + return `/canvas/${detail.walletAddress}` + }, [walletCurrentAddress, detail]) + + const handleUpgradeBadge = async () => { + try { + const preBadgeName = detail.name + changeIsBadgeUpgrading(id, true) + const metadata = await upgradeBadge(publicProvider, { id, badgeContract: detail.badgeContract }) + if (metadata) { + const checkedBadge = await checkBadgeUpgradable(publicProvider, { id, badgeContract: detail.badgeContract }) + setDetail(pre => ({ ...pre, ...metadata, upgradable: checkedBadge.upgradable })) + alertWarning(`You have successfully upgraded ${preBadgeName} to ${metadata.name}`, "success") + } + } catch (error) { + alertWarning(error.message) + } finally { + changeIsBadgeUpgrading(id, false) + } + } + + return ( + <> + } + onUpgrade={handleUpgradeBadge} + > + {[BADGE_TYPE.GIFTED, BADGE_TYPE.BACKEND_AUTHORIZED, BADGE_TYPE.PERMISSIONLESS].includes(detail.category) && ( + + View on EAS + + )} + + {detail.thirdParty && detail.issuer?.name ? ( + + Visit {detail.issuer?.name} + + ) : ( + + Visit my canvas + + )} + + + + + + + ) +} + +export default BadgeDetailPage diff --git a/src/pages/canvas/badgeContract/Back.tsx b/src/pages/canvas/badgeContract/Back.tsx new file mode 100644 index 000000000..c443c1e63 --- /dev/null +++ b/src/pages/canvas/badgeContract/Back.tsx @@ -0,0 +1,27 @@ +import { useNavigate } from "react-router-dom" + +import { Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as BackSvg } from "@/assets/svgs/canvas/back.svg" + +const Back = props => { + const { sx, ...restProps } = props + const navigate = useNavigate() + + const handleGoBack = () => { + navigate(-1) + } + return ( + + + Back + + ) +} +export default Back diff --git a/src/pages/canvas/badgeContract/index.tsx b/src/pages/canvas/badgeContract/index.tsx new file mode 100644 index 000000000..05dd33a21 --- /dev/null +++ b/src/pages/canvas/badgeContract/index.tsx @@ -0,0 +1,315 @@ +import { useQuery } from "@tanstack/react-query" +import { useEffect, useMemo } from "react" +import { Navigate, useNavigate, useNavigationType, useParams } from "react-router-dom" + +import { CircularProgress, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ValidSvg } from "@/assets/svgs/canvas/check.svg" +import { ReactComponent as WarningSvg } from "@/assets/svgs/canvas/circle-warning.svg" +import { ReactComponent as ShareSvg } from "@/assets/svgs/canvas/share.svg" +import ScrollButton from "@/components/Button" +import Link from "@/components/Link" +import { BADGE_TYPE, CHAIN_ID } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import { useAsyncMemo } from "@/hooks" +import useSnackbar from "@/hooks/useSnackbar" +import { checkBadgeEligibility, checkIfHasBadgeByAddress, fetchNotionBadgeByAddr, mintBadge } from "@/services/canvasService" +import useCanvasStore from "@/stores/canvasStore" +import { generateShareTwitterURL, requireEnv, switchNetwork } from "@/utils" + +import BadgeDetail from "../badge/BadgeDetail" +import Back from "./Back" + +const BadgeContractDetail = props => { + const { address } = useParams() + const navigationType = useNavigationType() + const { walletCurrentAddress, connect, chainId, provider } = useRainbowContext() + const { profileMinted, changeIsBadgeMinting, isBadgeMinting, userBadges, queryEASAttestationsByWalletAddress, queryUserBadgesLoading } = + useCanvasStore() + + const { + data: badgeForMint, + isFetching, + isFetched, + } = useQuery({ + queryKey: ["notionBadge", address], + queryFn: async () => { + const badge = await fetchNotionBadgeByAddr(address) + return badge + }, + initialData: {}, + }) + + const navigate = useNavigate() + const alertWarning = useSnackbar() + + const isL2 = useMemo(() => chainId === CHAIN_ID.L2, [chainId]) + + const isNewTab = useMemo(() => navigationType === "POP", [navigationType]) + + const isOwned = useAsyncMemo(async () => { + if (provider && isL2 && badgeForMint.badgeContract) { + const hasBadge = await checkIfHasBadgeByAddress(provider, walletCurrentAddress, badgeForMint.badgeContract) + return hasBadge + } + }, [provider, isL2, walletCurrentAddress, badgeForMint]) + + const isEligible = useAsyncMemo(async () => { + if (provider && isL2 && badgeForMint.badgeContract) { + const eligibility = await checkBadgeEligibility(provider, walletCurrentAddress, badgeForMint) + return eligibility + } + }, [provider, isL2, walletCurrentAddress, badgeForMint]) + + const shareBadgeURL = useMemo(() => { + const viewURL = `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas/badge-contract/${address}` + return generateShareTwitterURL(viewURL, `Find out your eligibility to mint a ${badgeForMint.name} badge on Scroll Canvas.`) + }, [address, badgeForMint]) + + const metadata = useMemo( + () => ({ + title: `Canvas Badge - ${badgeForMint.name}`, + description: `I found a badge called ${badgeForMint.name} you may like`, + image: `${requireEnv("REACT_APP_CANVAS_BACKEND_URI")}/badge-contract/${address}.png`, + }), + [badgeForMint], + ) + + const badgeId = useMemo(() => userBadges.find(item => item?.badgeContract === address)?.id, [userBadges, address]) + + useEffect(() => { + if (!userBadges.length && isOwned) { + queryEASAttestationsByWalletAddress(provider, walletCurrentAddress) + } + }, [isOwned, userBadges]) + + const handleMint = async () => { + try { + changeIsBadgeMinting(address, true) + + let result = await mintBadge(provider, walletCurrentAddress, badgeForMint) + if (result) { + navigate(`/canvas/badge/${result}`, { replace: true }) + } + } catch (e) { + alertWarning( + <> + {e.message}{" "} + {e.link && ( + + 🔗 + + )} + , + ) + } finally { + changeIsBadgeMinting(address, false) + } + } + + const renderTip = () => { + if (!isL2) { + return null + } else if (isBadgeMinting.get(address)) { + return ( + <> + + + Minting... + + + ) + } else if (profileMinted === false) { + return ( + <> + + + You need a Scroll Canvas before minting a badge. + + + ) + } else if (isEligible === undefined || queryUserBadgesLoading) { + return ( + <> + + + Checking... + + + ) + } else if (profileMinted && isOwned === false && isEligible) { + if (badgeForMint.airdrop) { + return ( + <> + + + You are eligible. Your badge will be airdroped by the issuer. + + + ) + } + return ( + <> + + + You are eligible to mint the badge + + + ) + } else if (profileMinted && isOwned === false && !isEligible) { + if (badgeForMint.airdrop) { + return ( + <> + + + This is an airdrop-only badge. Selected account is not eligible. + + + ) + } + if (badgeForMint.category === BADGE_TYPE.SELF_ATTESTATION) { + return ( + <> + + + This is the badge that is automatically attestated. Selected account is not eligible. + + + ) + } + return ( + <> + + + Selected account is not eligible to mint the badge yet. + + + ) + } else if (profileMinted && isOwned && badgeId) { + return + } + return null + } + + const renderAction = () => { + if (!walletCurrentAddress) { + return ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 3", + }, + })} + color="primary" + onClick={connect} + > + Connect wallet + + ) + } else if (!isL2) { + return ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 3", + }, + })} + color="primary" + onClick={() => switchNetwork(CHAIN_ID.L2)} + > + Switch to Scroll + + ) + } else if (!profileMinted) { + return ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 3", + }, + })} + color="primary" + href="/canvas/mint" + > + Mint Scroll Canvas + + ) + } else if (isOwned && badgeForMint.thirdParty) { + return ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 3", + }, + })} + color="primary" + href="/canvas" + > + Visit Scroll Canvas + + ) + } else if (profileMinted === true && !isOwned) { + return ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 3", + }, + })} + color="primary" + onClick={handleMint} + loading={isBadgeMinting.get(address)} + gloomy={!isEligible || [BADGE_TYPE.SELF_ATTESTATION, BADGE_TYPE.GIFTED].includes(badgeForMint.category)} + > + {isBadgeMinting.get(address) ? "Minting" : "Mint now"} + + ) + } + return null + } + + if (isFetched && !badgeForMint.badgeContract) { + return + } + return ( + }> + {renderAction()} + + {badgeForMint.thirdParty ? ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 2", + }, + })} + href={badgeForMint.issuer?.origin} + target="_blank" + > + Visit {badgeForMint.issuer?.name} + + ) : ( + ({ + [theme.breakpoints.down("sm")]: { + gridColumn: "span 2", + }, + })} + href="/canvas" + > + Visit my canvas + + )} + + + + + + {renderTip()} + + + ) +} + +export default BadgeContractDetail diff --git a/src/pages/canvas/components/BadgeDesc/index.tsx b/src/pages/canvas/components/BadgeDesc/index.tsx new file mode 100644 index 000000000..c72a96f43 --- /dev/null +++ b/src/pages/canvas/components/BadgeDesc/index.tsx @@ -0,0 +1,49 @@ +import ReactMarkdown from "react-markdown" +import rehypeSanitize, { defaultSchema } from "rehype-sanitize" +import remarkGfm from "remark-gfm" + +import { styled } from "@mui/material/styles" + +import Link from "@/components/Link" + +const allowOnlyLinksSchema = { + ...defaultSchema, + tagNames: ["p", "a"], + attributes: { + a: ["href", "title", "target", "rel"], + }, +} + +const CustomLink = styled(Link)(({ theme }) => ({ + color: `${theme.palette.primary.main} !important`, + fontSize: "inherit", + textUnderlineOffset: "2px", + textDecorationThickness: "1px", + fontWeight: 700, +})) + +const BadgeDesc = props => { + const { children } = props + + return ( + + {children} + + ) + }, + }} + > + {children} + + ) +} + +export default BadgeDesc diff --git a/src/pages/canvas/components/BadgeImage/index.tsx b/src/pages/canvas/components/BadgeImage/index.tsx new file mode 100644 index 000000000..fbee6557e --- /dev/null +++ b/src/pages/canvas/components/BadgeImage/index.tsx @@ -0,0 +1,10 @@ +import Img from "react-cool-img" + +// import BadgePlaceholderSvg from "@/assets/svgs/canvas-perks/badge-placeholder.svg" + +const BadgeImage = props => { + const { style, ...restProps } = props + return +} + +export default BadgeImage diff --git a/src/pages/canvas/components/Button/index.tsx b/src/pages/canvas/components/Button/index.tsx new file mode 100644 index 000000000..c18b0fdbc --- /dev/null +++ b/src/pages/canvas/components/Button/index.tsx @@ -0,0 +1,124 @@ +import { makeStyles } from "tss-react/mui" + +import { ButtonProps, CircularProgress, Button as ScrollButton } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" + +interface ScrollButtonProps extends Omit { + width?: string | number + color?: "primary" | "secondary" | "tertiary" | "white" + gloomy?: boolean + loading?: boolean + disabled?: boolean + whiteButton?: boolean + download?: boolean + + // compatibility + target?: string + rel?: string +} + +const backgroundColor = (color, theme) => { + switch (color) { + case "primary": + return theme.palette.primary.main + case "secondary": + return "#262626" + case "tertiary": + return "transparent" + case "white": + return "#ffffff" + default: + return theme.palette.text.primary + } +} + +const cColor = (color, theme) => { + switch (color) { + case "primary": + return theme.palette.primary.contrastText + case "secondary": + return "#ffffff" + case "tertiary": + return "#ffffff" + case "white": + return theme.palette.text.primary + default: + return theme.palette.primary.contrastText + } +} + +const borderColor = (color, theme) => { + switch (color) { + case "primary": + return theme.palette.primary.main + case "secondary": + return "#262626" + case "tertiary": + return "#ffffff" + case "white": + return "#ffffff" + default: + return theme.palette.primary.contrastText + } +} + +const useStyles = makeStyles()((theme, { width, color, disabled, loading, whiteButton }) => ({ + button: { + padding: "0", + height: "4.8rem", + fontSize: "1.8rem", + fontWeight: 600, + background: backgroundColor(color, theme), + color: cColor(color, theme), + borderColor: borderColor(color, theme), + borderRadius: "1rem", + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + height: "4rem", + }, + "&:hover": { + backgroundColor: backgroundColor(color, theme), + color: cColor(color, theme), + borderColor: borderColor(color, theme), + }, + }, + buttonDisabled: { + borderColor: "#EBC28E", + color: "#EBC28E", + }, + buttonLoading: { + opacity: 0.6, + gap: "0.4em", + color: cColor(color, theme), + backgroundColor: backgroundColor(color, theme), + border: `1px solid ${borderColor(color, theme)} !important`, + }, + buttonGloomy: { + opacity: 0.5, + pointerEvents: "none", + }, +})) + +const Button = (props: ScrollButtonProps) => { + const { width, sx, color, loading, disabled, gloomy, children, whiteButton, ...restProps } = props + const { classes, cx } = useStyles({ color, width, disabled, loading, whiteButton }) + + const { isMobile } = useCheckViewport() + + return ( + + {children} {loading && } + + ) +} + +export default Button diff --git a/src/pages/canvas/components/Dialog/index.tsx b/src/pages/canvas/components/Dialog/index.tsx new file mode 100644 index 000000000..350db6bda --- /dev/null +++ b/src/pages/canvas/components/Dialog/index.tsx @@ -0,0 +1,98 @@ +import { Box, Dialog, DialogContent, DialogTitle, IconButton, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as BackSvg } from "@/assets/svgs/canvas/back.svg" +import { ReactComponent as CloseSvg } from "@/assets/svgs/canvas/close.svg" + +const ScrollDialog = props => { + const { title, sx, contentSx = {}, fullWidth, allowBack, noClose, onClose, onBack, children, extra, roof, ...restProps } = props + + return ( + ({ + [theme.breakpoints.down("sm")]: { + "& .MuiDialog-paper": { + margin: 0, + borderRadius: 0, + height: "calc(var(--vh, 1vh) * 100)", + maxHeight: "unset", + minWidth: "unset", + width: "100%", + padding: roof ? "5.9rem 2rem 2.4rem" : "1.1rem 2rem 2.4rem", + }, + }, + }), + ]} + onClose={onClose} + {...restProps} + > + {roof} + + {allowBack && ( + + + + Back + + + )} + + + {title} + + {!noClose && ( + + + + )} + + ({ + [theme.breakpoints.down("sm")]: { + display: "flex", + alignItems: "center", + }, + }), + ]} + > + {children} + + + {extra} + + ) +} + +export default ScrollDialog diff --git a/src/pages/canvas/components/Empty/index.tsx b/src/pages/canvas/components/Empty/index.tsx new file mode 100644 index 000000000..d193efb48 --- /dev/null +++ b/src/pages/canvas/components/Empty/index.tsx @@ -0,0 +1,50 @@ +import Img from "react-cool-img" +import { useNavigate } from "react-router-dom" + +import { Stack, Typography } from "@mui/material" + +import Button from "@/components/Button" +import { EXPLORE_BADGES_URL } from "@/constants" +import useCheckViewport from "@/hooks/useCheckViewport" +import useCanvasStore from "@/stores/canvasStore" + +const Empty = props => { + const { sx, title } = props + const navigate = useNavigate() + const { isMobile } = useCheckViewport() + const { changeCustomizeDisplayDialogVisible } = useCanvasStore() + + const toCanvasAndBadges = () => { + navigate(EXPLORE_BADGES_URL) + changeCustomizeDisplayDialogVisible(false) + } + + return ( + + Empty + + {title} + + + Mint eligible badges or explore badges on the canvas and badges page + + + + + + ) +} + +export default Empty diff --git a/src/pages/canvas/components/GridBg/index.tsx b/src/pages/canvas/components/GridBg/index.tsx new file mode 100644 index 000000000..6456f9bb2 --- /dev/null +++ b/src/pages/canvas/components/GridBg/index.tsx @@ -0,0 +1,58 @@ +import { Box } from "@mui/material" +import { styled } from "@mui/material/styles" + +const Container: any = styled(Box, { shouldForwardProp: prop => prop !== "gridNum" })(({ theme, badgewidth, gridNum }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + width: "100%", + height: "calc(var(--vh, 1vh) * 100 - 6.5rem)", + backgroundColor: "#101010", + backgroundImage: + "linear-gradient(90deg, rgba(255,255,255, 0.3) 1px, transparent 1px), linear-gradient( rgba(255,255,255, 0.3) 1px, transparent 1px)", + backgroundSize: `${badgewidth}px ${badgewidth}px`, + backgroundPosition: `calc(50% - ${badgewidth / 2}px) calc(50% - ${badgewidth / 2}px)`, + + "&::before, &::after": { + content: "''", + height: "100%", + position: "absolute", + top: 0, + width: `calc((100vw - ${badgewidth * gridNum}px) / 2)`, + zIndex: 42, + + [theme.breakpoints.down("md")]: { + width: "100%", + height: `calc((var(--vh, 1vh) * 100 - ${gridNum * badgewidth}px) / 2)`, + }, + }, + "&::before": { + background: "linear-gradient(90deg, #101010 70%, rgba(16, 16, 16, 0) 100%)", + left: 0, + [theme.breakpoints.down("md")]: { + background: "linear-gradient(#101010 75%, rgba(16, 16, 16, 0) 100%)", + }, + }, + "&::after": { + background: "linear-gradient(270deg, #101010 70%, rgba(16, 16, 16, 0) 100%)", + right: 0, + [theme.breakpoints.down("md")]: { + background: "linear-gradient(rgba(16, 16, 16, 0) 0%, #101010 20%)", + top: "unset", + bottom: 0, + }, + }, + [theme.breakpoints.down("md")]: { + marginTop: "-6.2rem", + height: "calc(var(--vh, 1vh) * 100)", + }, +})) + +const GridBg = props => { + const { children, ...restProps } = props + + return {children} +} + +export default GridBg diff --git a/src/pages/canvas/components/PerksBadge/index.tsx b/src/pages/canvas/components/PerksBadge/index.tsx new file mode 100644 index 000000000..96b27cb88 --- /dev/null +++ b/src/pages/canvas/components/PerksBadge/index.tsx @@ -0,0 +1,38 @@ +import { Box } from "@mui/material" + +import BadgePlaceholderSvg from "@/assets/svgs/canvas-perks/badge-placeholder.svg" +import Link from "@/components/Link" + +import BadgeImage from "../BadgeImage" +import Tooltip from "../Tooltip" + +interface PerksBadgeProps { + imageURL: string + gray: boolean // not own the badge + + viewOnly?: boolean // disable tooltip and link + + name?: string // for tooltip + badgeContract?: string // for link + style?: React.CSSProperties // img style +} + +const PerksBadge = (props: PerksBadgeProps & React.ComponentProps) => { + const { name, imageURL, badgeContract, viewOnly, gray, style, ...restProps } = props + return ( + + + + + + + + ) +} + +export default PerksBadge diff --git a/src/pages/canvas/components/PerksButton/index.tsx b/src/pages/canvas/components/PerksButton/index.tsx new file mode 100644 index 000000000..92ecb81e1 --- /dev/null +++ b/src/pages/canvas/components/PerksButton/index.tsx @@ -0,0 +1,15 @@ +import ScrollLoadingButton from "@/components/LoadingButton" + +const PerksButton = props => { + const { sx, children, ...restProps } = props + return ( + + {children} + + ) +} + +export default PerksButton diff --git a/src/pages/canvas/components/PerksClaimedLabel/index.tsx b/src/pages/canvas/components/PerksClaimedLabel/index.tsx new file mode 100644 index 000000000..f693ea962 --- /dev/null +++ b/src/pages/canvas/components/PerksClaimedLabel/index.tsx @@ -0,0 +1,30 @@ +import { Box, Typography } from "@mui/material" + +const PerksClaimedLabel = props => { + const { sx, children } = props + return ( + + + {children ?? "This perk has been claimed"} + + + ) +} + +export default PerksClaimedLabel diff --git a/src/pages/canvas/components/Statistic/index.tsx b/src/pages/canvas/components/Statistic/index.tsx new file mode 100644 index 000000000..492d04c01 --- /dev/null +++ b/src/pages/canvas/components/Statistic/index.tsx @@ -0,0 +1,30 @@ +import { Stack, Typography } from "@mui/material" + +import NumberTypography from "@/components/NumberTypography" +import Skeleton from "@/components/Skeleton" + +const Statistic = props => { + const { label, children, loading, ...restProps } = props + return ( + + + {label} + + + {loading ? : <>{children}} + + + ) +} + +export default Statistic diff --git a/src/pages/canvas/components/Tooltip/index.tsx b/src/pages/canvas/components/Tooltip/index.tsx new file mode 100644 index 000000000..c95cb4702 --- /dev/null +++ b/src/pages/canvas/components/Tooltip/index.tsx @@ -0,0 +1,39 @@ +import { Tooltip as MuiTooltip } from "@mui/material" +import { tooltipClasses } from "@mui/material/Tooltip" + +import useCheckViewport from "@/hooks/useCheckViewport" + +const ToolTip = props => { + const { title, children, disabled, ...restProps } = props + const { isDesktop } = useCheckViewport() + return ( + + {children} + + ) +} + +export default ToolTip diff --git a/src/pages/canvas/index.tsx b/src/pages/canvas/index.tsx new file mode 100644 index 000000000..5f89e217d --- /dev/null +++ b/src/pages/canvas/index.tsx @@ -0,0 +1,42 @@ +import { useMemo } from "react" +import { Navigate, useMatch } from "react-router-dom" + +import { CHAIN_ID } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasStore from "@/stores/canvasStore" + +import Dashboard from "./Dashboard" +import LoadingPage from "./loading" +import WrongNetwork from "./wrongNetwork" + +const CanvasIndex = props => { + const isOthersCanvas = useMatch("/canvas/:address") + const isBadgeDetail = useMatch("/canvas/badge/:id") + + const { walletCurrentAddress, chainId } = useRainbowContext() + const { profileMintedChecking, profileMinted } = useCanvasStore() + const isWrongNetwork = useMemo(() => { + return !isOthersCanvas && !isBadgeDetail && chainId !== CHAIN_ID.L2 + }, [chainId, isOthersCanvas, isBadgeDetail]) + + const renderCanvas = () => { + if (!walletCurrentAddress) { + return + } else if (profileMintedChecking || profileMinted === null) { + return + } else if (profileMinted) { + // if connected user views the invite link, then redirect to canvas + return + } + return + } + + return ( + <> + {renderCanvas()} + {isWrongNetwork && } + + ) +} + +export default CanvasIndex diff --git a/src/pages/canvas/invite/Invite.tsx b/src/pages/canvas/invite/Invite.tsx new file mode 100644 index 000000000..073c1457a --- /dev/null +++ b/src/pages/canvas/invite/Invite.tsx @@ -0,0 +1,26 @@ +import { Navigate } from "react-router-dom" + +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasStore from "@/stores/canvasStore" + +import LoadingPage from "../loading" +import ReadyToMint from "../mint/home" + +const CanvasInvite = props => { + const { code } = props + + const { walletCurrentAddress } = useRainbowContext() + + const { profileMintedChecking, profileMinted, mintFlowVisible } = useCanvasStore() + + if (!mintFlowVisible && walletCurrentAddress && (profileMintedChecking || profileMinted === null)) { + return + } + if (!mintFlowVisible && profileMinted) { + return + } + + return +} + +export default CanvasInvite diff --git a/src/pages/canvas/invite/index.tsx b/src/pages/canvas/invite/index.tsx new file mode 100644 index 000000000..38ccaa088 --- /dev/null +++ b/src/pages/canvas/invite/index.tsx @@ -0,0 +1,40 @@ +import { useMemo } from "react" +import { Helmet } from "react-helmet-async" +import { useParams } from "react-router-dom" + +import { getImgByCode } from "@/apis/canvas" +import { requireEnv } from "@/utils" + +import CanvasMint from "../mint" + +// if currentWallectAddress has minted Canvas then display Canvas profile +// else display input referral code page (the default unminted page) + +const CanvasCoupon = () => { + const { code } = useParams() + const metaImgURI = useMemo(() => getImgByCode(code), [code]) + + const title = "Scroll Canvas - your unique space for onchain presence on Scroll" + const description = "Use my referral code to save 50% on Scroll Canvas mint!" + const url = `${requireEnv("REACT_APP_FFRONTENDS_URL")}/canvas?code=${code}` + + return ( + <> + + Scroll - Canvas Invite + + + + + + + + + + + + + ) +} + +export default CanvasCoupon diff --git a/src/pages/canvas/loading/index.tsx b/src/pages/canvas/loading/index.tsx new file mode 100644 index 000000000..000c9a630 --- /dev/null +++ b/src/pages/canvas/loading/index.tsx @@ -0,0 +1,84 @@ +import { useEffect, useMemo, useState } from "react" +import Img from "react-cool-img" + +import { Box, Stack, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import GridBg from "../components/GridBg" + +const defaultGridNum = 4 + +const LoadingText: any = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.contrastText, + fontSize: "3.2rem", + lineHeight: "4.4rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + lineHeight: "2rem", + }, +})) + +const LoadingPage = () => { + const [windowDimensions, setWindowDimensions] = useState({ + width: window.innerWidth, + height: window.innerHeight, + }) + + const [dots, setDots] = useState("") + useEffect(() => { + const interval = setInterval(() => { + setDots(prevDots => (prevDots.length < 3 ? prevDots + "." : "")) + }, 500) + + return () => clearInterval(interval) + }, []) + useEffect(() => { + const handleResize = () => { + setWindowDimensions({ + width: window.innerWidth, + height: window.innerHeight, + }) + } + handleResize() + window.addEventListener("resize", handleResize) + return () => window.removeEventListener("resize", handleResize) + }, []) + + const badgewidth = useMemo(() => { + const { width, height } = windowDimensions + if (width < height - 62) { + return (width - 62) / defaultGridNum + } else { + return (height - 65 - 80) / defaultGridNum + } + }, [windowDimensions, defaultGridNum]) + return ( + + + + Coding Scrolly + + Loading{dots} + + + ) +} + +export default LoadingPage diff --git a/src/pages/canvas/mint-scr/index.tsx b/src/pages/canvas/mint-scr/index.tsx new file mode 100644 index 000000000..f24960fa5 --- /dev/null +++ b/src/pages/canvas/mint-scr/index.tsx @@ -0,0 +1,101 @@ +import { ethers } from "ethers" +import { useState } from "react" + +import { Stack, TextField } from "@mui/material" + +import ERC20ABI from "@/assets/abis/L1_erc20ABI.json" +import { CHAIN_ID, NORMAL_HEADER_HEIGHT } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSnackbar from "@/hooks/useSnackbar" +import { amountToBN, isUserRejected, requireEnv, sanitizeNumericalString } from "@/utils" + +import PerksButton from "../components/PerksButton" + +const SCR_TOKEN_ADDRESS = "0x22047Da3730F76928dD9A31eb8f3A3d472B69AD7" + +const MintScr = () => { + const { walletCurrentAddress, provider, chainId } = useRainbowContext() + const alertWarning = useSnackbar() + const [scrAmount, setSCRAmount] = useState("") + const [mintLoading, setMintLoading] = useState(false) + const [burnLoading, setBurnLoading] = useState(false) + + const handleChangeSCRAmount = e => { + setSCRAmount(sanitizeNumericalString(e.target.value)) + } + + const handleMintToken = async () => { + if (chainId !== CHAIN_ID.L2) { + alertWarning("please switch to L2") + return + } + try { + setMintLoading(true) + const signer = await provider?.getSigner(0) + const tokenInterface = new ethers.Contract(SCR_TOKEN_ADDRESS, ERC20ABI, signer) + const amount = amountToBN(scrAmount) + const tx = await tokenInterface.mint(walletCurrentAddress, amount) + const txReceipt = await tx.wait() + if (txReceipt?.status === 1) { + alertWarning(`Minted ${scrAmount} SCR successfully`, "success") + setSCRAmount("") + } + } catch (e) { + if (!isUserRejected(e)) { + alertWarning(e.message) + } + } finally { + setMintLoading(false) + } + } + + const handleBurnToken = async () => { + if (chainId !== CHAIN_ID.L2) { + alertWarning("please switch to L2") + return + } + try { + setBurnLoading(true) + const signer = await provider?.getSigner(0) + const tokenInterface = new ethers.Contract(SCR_TOKEN_ADDRESS, ERC20ABI, signer) + const amount = amountToBN(scrAmount) + const tx = await tokenInterface.burn(walletCurrentAddress, amount) + const txReceipt = await tx.wait() + if (txReceipt?.status === 1) { + alertWarning(`Burned ${scrAmount} SCR successfully`, "success") + setSCRAmount("") + } + } catch (e) { + if (!isUserRejected(e)) { + alertWarning(e.message) + } + } finally { + setBurnLoading(false) + } + } + return ( + + + + + Mint + + {requireEnv("NODE_ENV") !== "production" && ( + + Burn + + )} + + + ) +} + +export default MintScr diff --git a/src/pages/canvas/mint/flow/FirstBadgeStep.tsx b/src/pages/canvas/mint/flow/FirstBadgeStep.tsx new file mode 100644 index 000000000..b363ce449 --- /dev/null +++ b/src/pages/canvas/mint/flow/FirstBadgeStep.tsx @@ -0,0 +1,135 @@ +import { useRef } from "react" +import Img from "react-cool-img" + +import { Box, Stack, Typography } from "@mui/material" + +import { EthereumYearBadgeURL, checkBadgeEligibilityURL } from "@/apis/canvas" +import Button from "@/components/Button" +import TextButton from "@/components/TextButton" +import { ETHEREUM_YEAR_BADGE } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import { useAsyncMemo } from "@/hooks" +import useSnackbar from "@/hooks/useSnackbar" +import { mintBadge } from "@/services/canvasService" +import useCanvasStore from "@/stores/canvasStore" +import { truncateAddress } from "@/utils" + +import StepWrapper from "./StepWrapper" + +const FirstBadgeStep = props => { + const { provider, walletCurrentAddress } = useRainbowContext() + + const { + isFirstBadgeMinting, + changeIsFirstBadgeMinting, + changeMintFlowVisible, + recordFirstBadgePosition, + changeBadgeAnimationVisible, + queryFirstMintUsername, + } = useCanvasStore() + const alertWarning = useSnackbar() + + const badgeChecked = useAsyncMemo(async () => { + const data = await scrollRequest(checkBadgeEligibilityURL(ETHEREUM_YEAR_BADGE.baseURL, walletCurrentAddress, ETHEREUM_YEAR_BADGE.badgeContract)) + await fetch(EthereumYearBadgeURL(data.year)) + return data + }, [provider, walletCurrentAddress]) + const firstBadgeRef = useRef() + + const renderTip = () => { + if (!badgeChecked) { + return "Checking" + } else if (badgeChecked.eligibility) { + return `Your wallet (${truncateAddress(walletCurrentAddress as string)})’s first transaction on Ethereum was during the year ${ + badgeChecked.year + }. You are eligible + to mint a “Badge” to attest your past achievement on Scroll Canvas` + } + return `Your wallet (${truncateAddress(walletCurrentAddress as string)}) has no transaction on Ethereum` + } + + const handleMintBadge = async () => { + changeIsFirstBadgeMinting(true) + + try { + const result = await mintBadge(provider, walletCurrentAddress, ETHEREUM_YEAR_BADGE) + + if (result) { + const { left, top } = firstBadgeRef.current!.getBoundingClientRect() + recordFirstBadgePosition({ + left, + top, + id: result, + image: EthereumYearBadgeURL(badgeChecked.year), + badgeContract: ETHEREUM_YEAR_BADGE.badgeContract, + }) + changeBadgeAnimationVisible(true) + changeMintFlowVisible(false) + } + } catch (error) { + alertWarning(error.message) + } finally { + changeIsFirstBadgeMinting(false) + } + } + + const handleViewMyCanvas = async () => { + const signer = await provider?.getSigner(0) + queryFirstMintUsername(signer) + changeMintFlowVisible(false) + } + + return ( + A badge is an attestation of status or achievement, permanently recorded on your Canvas.} + action={ + ({ + [theme.breakpoints.down("sm")]: { + "& > div": { + width: "100%", + }, + }, + }), + ]} + alignItems="center" + > + + + Skip and go to my Canvas + + + } + sx={{ mt: ["2.4rem", "4.6rem"], mb: ["2rem", "8.8rem"], textAlign: "center" }} + > + + {badgeChecked?.code === 1 ? ( + {ETHEREUM_YEAR_BADGE.name} + ) : ( + Ethereum Year Badge + )} + + {ETHEREUM_YEAR_BADGE.name} + {renderTip()} + + ) +} + +export default FirstBadgeStep diff --git a/src/pages/canvas/mint/flow/InsufficientDialog/index.tsx b/src/pages/canvas/mint/flow/InsufficientDialog/index.tsx new file mode 100644 index 000000000..91e4e5416 --- /dev/null +++ b/src/pages/canvas/mint/flow/InsufficientDialog/index.tsx @@ -0,0 +1,91 @@ +import { useMemo } from "react" +import { useNavigate } from "react-router-dom" + +import { Box, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as InsufficientSvg } from "@/assets/svgs/canvas/insufficient.svg" +import ScrollButton from "@/components/Button" +import { CHAIN_ID } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import Dialog from "@/pages/canvas/components/Dialog" +import useCanvasStore from "@/stores/canvasStore" +import { switchNetwork } from "@/utils" + +const StyledDialogContent = styled(Box)(({ theme }) => ({ + width: "100%", + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", +})) + +const ButtonContainer = styled(Box)(({ theme }) => ({ + display: "flex", + gap: "1.6rem", + alignItems: "center", + marginTop: "4rem", + [theme.breakpoints.down("sm")]: { + flexDirection: "column", + gap: "2rem", + marginTop: "1.6rem", + }, +})) + +const InsufficientDialog = ({ open, onClose }) => { + const { chainId, connect } = useRainbowContext() + const navigate = useNavigate() + const { changeProfileName, changeMintFlowVisible } = useCanvasStore() + + const isWrongNetwork = useMemo(() => { + return chainId !== CHAIN_ID.L2 + }, [chainId]) + + const handleGoToBridge = () => { + changeProfileName("") + changeMintFlowVisible(false) + navigate("/bridge") + } + + return ( + + + + + Oops! Not enough ETH
    to pay for transaction fees +
    + + Bridge more ETH to your wallet + + + {chainId ? ( + isWrongNetwork ? ( + switchNetwork(CHAIN_ID.L2)}> + Switch to Scroll + + ) : ( + + Bridge into Scroll + + ) + ) : ( + + Connect Wallet + + )} + +
    +
    + ) +} + +export default InsufficientDialog diff --git a/src/pages/canvas/mint/flow/MintStep.tsx b/src/pages/canvas/mint/flow/MintStep.tsx new file mode 100644 index 000000000..313dd7271 --- /dev/null +++ b/src/pages/canvas/mint/flow/MintStep.tsx @@ -0,0 +1,173 @@ +import { ethers } from "ethers" +import { useEffect, useMemo, useState } from "react" +import Img from "react-cool-img" +import { useSwiper } from "swiper/react" +import useSWR from "swr" + +import { Box, Skeleton, Stack, Typography } from "@mui/material" + +import { fetchSignByCode, getHeartbeatURL, getHeartrate } from "@/apis/canvas" +import Button from "@/components/Button" +import TextButton from "@/components/TextButton" +import { useCanvasContext } from "@/contexts/CanvasContextProvider" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useSnackbar from "@/hooks/useSnackbar" +import useCanvasStore from "@/stores/canvasStore" +import { isUserRejected, recognizeError, requireEnv, sentryDebug, trimErrorMessage } from "@/utils" + +import InsufficientDialog from "./InsufficientDialog" +import StepWrapper from "./StepWrapper" +import TermsAndConditionsDialog from "./TermsAndConditionsDialog" + +const PROFILE_REGISTRY_ADDRESS = requireEnv("REACT_APP_PROFILE_REGISTRY_ADDRESS") + +const MintStep = props => { + const { scrollTarget } = props + const swiper = useSwiper() + const { isMobile } = useCheckViewport() + const { walletCurrentAddress, provider } = useRainbowContext() + const { profileRegistryContract } = useCanvasContext() + + const { changeIsProfileMinting, isProfileMinting, profileName, referralCode, changeReferralCode, checkIfProfileMinted, changeInitialMint } = + useCanvasStore() + const alertWarning = useSnackbar() + + const [insufficientDialogOpen, setInsufficientDialogOpen] = useState(false) + const [tAndODialogVisible, setTAndODialogVisible] = useState(false) + + const heartbeatURL = useMemo(() => getHeartbeatURL(walletCurrentAddress), [walletCurrentAddress]) + + useEffect(() => { + if (heartbeatURL) { + fetch(heartbeatURL) + } + }, [heartbeatURL]) + + const { data, isLoading } = useSWR(getHeartrate(walletCurrentAddress), (url: string) => scrollRequest(url)) + + const checkIsContract = async contractAddress => { + const provider = profileRegistryContract.runner.provider + if (!provider) throw new Error("provider is not defined") + const code = await provider.getCode(contractAddress) + if (code === "0x") throw new Error("You are connected to the wrong network. Please switch to the correct network and refresh.") + } + + const checkBalance = async mintFee => { + const balance = await provider?.getBalance(walletCurrentAddress as `0x${string}`) + if (balance && mintFee < balance) { + return true + } + return false + } + + const handleMintCanvas = async () => { + changeIsProfileMinting(true) + + try { + await checkIsContract(PROFILE_REGISTRY_ADDRESS) + + let codeSignature = "0x" + if (referralCode) { + const { signature } = await scrollRequest(fetchSignByCode(referralCode, walletCurrentAddress)) + codeSignature = signature + } + const mintFee = ethers.parseEther(codeSignature === "0x" ? "0.001" : "0.0005") + const isValidBalance = await checkBalance(mintFee) + if (!isValidBalance) { + setInsufficientDialogOpen(true) + return + } + + const tx = await profileRegistryContract.mint(profileName, codeSignature, { value: mintFee }) + const txReceipt = await tx.wait() + + if (txReceipt.status === 1) { + changeReferralCode("") + changeInitialMint(true) + await checkIfProfileMinted(profileRegistryContract, walletCurrentAddress!) + swiper.slideNext(300) + scrollTarget?.scrollTo({ + top: 0, + behavior: "smooth", + }) + } else { + throw new Error("due to any operation that can cause the transaction or top-level call to revert") + } + } catch (error) { + if (!isUserRejected(error)) { + const message = recognizeError(error) + const errorMessage = typeof message === "string" ? trimErrorMessage(message) : message?.message + alertWarning(errorMessage) + sentryDebug(`mint canvas:${walletCurrentAddress}-${error.message}`) + } + } finally { + changeIsProfileMinting(false) + } + } + + const handleCloseInsufficientDialog = () => { + setInsufficientDialogOpen(false) + } + + const handleOpenTAndODialog = () => { + setTAndODialogVisible(true) + } + + const handleCloseTAndODialog = () => { + setTAndODialogVisible(false) + } + + return ( + + Your Pulse is{" "} + {isLoading ? ( + + ) : ( + <>{data?.heartrate ?? "--"} + )} + + } + description={ + <> + Everyone who uses Scroll has a unique heartbeat. + {!isMobile &&

    } + It beats faster when you are more active onchain. + + } + sx={{ mt: "2.8rem", mb: [0, "10.2rem"] }} + action={ + + + + By continuing to mint Scroll Canvas, +
    you agree to the{" "} + + Terms & Conditions + +
    +
    + } + > + + avatar + + + +
    + ) +} +export default MintStep diff --git a/src/pages/canvas/mint/flow/NameStep.tsx b/src/pages/canvas/mint/flow/NameStep.tsx new file mode 100644 index 000000000..935899d7f --- /dev/null +++ b/src/pages/canvas/mint/flow/NameStep.tsx @@ -0,0 +1,130 @@ +import { useMemo, useState } from "react" +import { useSwiper } from "swiper/react" + +import { Box, InputBase, Stack } from "@mui/material" +import { styled } from "@mui/system" + +import Button from "@/components/Button" +import { CHAIN_ID, L2_NAME } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useValidateCanvasName from "@/hooks/useValidateCanvasName" +import useCanvasStore from "@/stores/canvasStore" +import { switchNetwork } from "@/utils" + +import StepWrapper from "./StepWrapper" + +const StyledInputBase = styled(InputBase)(({ theme, value }) => ({ + maxWidth: "51rem", + width: "100%", + ".MuiInputBase-input": { + textAlign: "center", + height: "8.8rem", + lineHeight: "8.8rem", + fontSize: "7.2rem", + fontWeight: 600, + padding: 0, + color: theme.palette.primary.contrastText, + [theme.breakpoints.down("sm")]: { + height: "4.8rem", + fontSize: "3.2rem", + lineHeight: "4.8rem", + }, + }, +})) + +const NameStep = props => { + const { scrollTarget } = props + const { isMobile } = useCheckViewport() + const swiper = useSwiper() + + const { chainId, connect } = useRainbowContext() + + const { profileName: name, changeProfileName: setName } = useCanvasStore() + + const [placeholder, setPlaceholder] = useState("name") + + const { helpText, validating, renderValidation } = useValidateCanvasName(name) + + // alert only when user is printing letter + const isAllowedNext = useMemo(() => name && !helpText && !validating, [name, helpText, validating]) + + const handleNext = () => { + swiper.slideNext() + scrollTarget?.scrollTo({ + top: 0, + behavior: "smooth", + }) + } + + const handleChangeName = (e: React.ChangeEvent) => { + setName(e.target.value.trim()) + } + + const handleKeydown = async e => { + if (e.keyCode === 13 && isAllowedNext) { + handleNext() + } + } + + const renderAction = () => { + if (chainId === CHAIN_ID.L2) { + return ( + + ) + } else if (chainId) { + return ( + + ) + } + return ( + + ) + } + + return ( + + + setPlaceholder("")} + onBlur={() => setPlaceholder("name")} + /> + + {renderValidation()} + + + + ) +} + +export default NameStep diff --git a/src/pages/canvas/mint/flow/StepWrapper.tsx b/src/pages/canvas/mint/flow/StepWrapper.tsx new file mode 100644 index 000000000..9f48ce77c --- /dev/null +++ b/src/pages/canvas/mint/flow/StepWrapper.tsx @@ -0,0 +1,42 @@ +import { Box, Container, Stack, Typography } from "@mui/material" + +const StepWrapper = props => { + const { sx, title, description, children, action } = props + + return ( + + {title} + {description} + {children} + ({ + [theme.breakpoints.down("sm")]: { + position: "fixed", + padding: "2.4rem 2rem", + bottom: 0, + width: "100%", + "& > div": { + width: "100%", + }, + }, + })} + > + {action} + + + ) +} +export default StepWrapper diff --git a/src/pages/canvas/mint/flow/TermsAndConditionsDialog.tsx b/src/pages/canvas/mint/flow/TermsAndConditionsDialog.tsx new file mode 100644 index 000000000..13dfec3b4 --- /dev/null +++ b/src/pages/canvas/mint/flow/TermsAndConditionsDialog.tsx @@ -0,0 +1,315 @@ +import { Box, Stack, Typography } from "@mui/material" + +import Dialog from "@/pages/canvas/components/Dialog" + +const TermsAndConditionsDialog = props => { + return ( + + + + Scroll Canvas’ Terms & Conditions + + ul > li": { + listStyleType: "decimal", + "&::marker": { + fontWeight: 600, + }, + "& ul": { + paddingLeft: "2em", + "& > li": { + listStyleType: "lower-alpha", + marginTop: "1rem", + "& > ul > li": { + listStyleType: "lower-roman", + marginTop: "0.4rem", + }, + }, + }, + }, + "& h2,b": { + fontWeight: 600, + }, + "& h2": { + margin: "1.2rem 0", + }, + "& p": { + marginTop: "1rem", + }, + "& a": { + fontWeight: 600, + textDecoration: "underline", + whiteSpace: "nowrap", + textUnderlineOffset: "2px", + }, + }} + > +
      +
    • +

      Acceptance of Terms

      +

      + These terms and conditions (the “Scroll Canvas Terms”) are entered into by you (“you”) and Scroll Foundation, a + foundation organized under the laws of the Seychelles, and its subsidiaries and affiliates, as the case may be, from time to time + (collectively referred to as “Scroll”, “we”, or “us”). These Scroll Canvas Terms shall govern your access to and + activities in relation to the use of Scroll Canvas, as defined in Clause 2 (“Canvas”), our website, our technological + platforms, and the services we provide on them (collectively, our “Platform”). They should also be read in conjunction with our{" "} + + Terms of Service + {" "} + and{" "} + + Privacy Policy + + . By using our website, you agree to be bound by all of the aforementioned agreements. +

      +
    • + +
    • +

      About Canvas

      +

      + Canvas is a unique space for you to display your on-chain credentials, status and achievements issued and collected across the Scroll + ecosystem. It highlights your presence on Scroll by offering a platform to exhibit unique, on-chain badges that signify achievements + and traits, verified through the Ethereum Attestation Service. +

      +

      + Users will be able to mint a non-transferrable and unique space with Canvas, where they are able to display Badges (defined below). +

      +

      + Projects in our ecosystem may from time to time issue badges, which may provide users with additional functionalities on their + respective platforms (“Badges”). These Badges are minted by projects on the Scroll ecosystem, or Scroll itself. +

      +

      Canvas also operates a referral rewards mechanism, which is elaborated on in Clause 5.

      +

      You confirm that you have read and understood this Section on Canvas and its purpose.

      +
    • +
    • +

      Eligibility and Participating in Canvas

      +
        +
      • +
        You agree that in order to participate in Canvas, you:
        +
          +
        • Must be at least 18 years of age;
        • +
        • Must not be a U.S. person (defined below);
        • +
        • + Must not reside in a jurisdiction where participation in Canvas may be prohibited, restricted or unauthorized in any form or + manner, whether in full or in part, under the laws, regulatory requirements or rules in the jurisdiction in which the + participant is located; and +
        • +
        • Must not be a Prohibited Person under our Terms of Service.
        • +
        +
      • +
      • +
        + We reserve the right to deny or void your participation in Canvas in any manner we deem fit, including in the event we discover + that you do not fulfill these conditions. +
        +
      • +
      • +
        In these Terms, a “U.S. person” shall mean the following:
        +
          +
        • Any natural person resident in the United States;
        • +
        • Any partnership or corporation organized or incorporated under the laws of the United States;
        • +
        • Any estate of which any executor or administrator is a U.S. person;
        • +
        • Any trust of which any trustee is a U.S. person;
        • +
        • Any agency or branch of a foreign entity located in the United States;
        • +
        • + Any non-discretionary account or similar account (other than an estate or trust) held by a dealer or other fiduciary for the + benefit or account of a U.S. person; +
        • +
        • + Any discretionary account or similar account (other than an estate or trust) held by a dealer or other fiduciary organized, + incorporated, or (if an individual) resident in the United States; and +
        • +
        • + Any partnership or corporation if (A) organized or incorporated under the laws of any foreign jurisdiction and (B) formed by a + U.S. person principally for the purpose of investing in securities not registered under the Act, unless it is organized or + incorporated, and owned, by accredited investors (as defined in § 230.501(a)) who are not natural persons, estates or trusts. +
        • +
        +
      • +
      • + Canvas is only available to users in certain jurisdictions who can participate as permitted under applicable law. You agree that you + will comply with all applicable laws (e.g., local, state, federal and other laws) when using the Services and participating in + Canvas. Without limiting the foregoing, by participating in Canvas, you represent and warrant that: (a) you are not located in a + country , region or territory against which the U.S. Government maintains comprehensive economic or financial sanctions or trade + embargoes; and (b) you are not listed on any U.S. Government list of prohibited, sanctioned, or restricted parties or otherwise the + subject or target of any sanctions administered or enforced the U.S. government. You are solely responsible for ensuring that your + access and use of the Services and participation in Canvas does not violate any applicable laws, including without limitation + applicable economic and trade sanctions and export control laws and regulations, such as those administered and enforced by the EU, + OFSI, OFAC, the U.S. Department of State, the U.S. Department of Commerce, the UN Security Council, and other relevant authorities. + You agree that you will not use a Virtual Private Network (VPN) or similar tool, to circumvent or attempt to circumvent prohibitions + under applicable laws or regulations. We reserve the right, but have no obligation, to monitor where participants to Canvas are + accessed from. Furthermore, we reserve the right, at any time, in our sole discretion, to block access to Canvas, in whole or in + part, from any geographic location, IP addresses and unique device identifiers or disqualify from Canvas any user who we believe is + in breach of these Terms. +
      • +
      • + You shall not access or participate in Canvas for any malicious or illegal purposes. We reserve the right to disqualify you from + Canvas and revoke any and all of Scroll Marks allocated to you under Canvas in the event that you carry out malicious or illegal + activities with respect to Scroll, the Service or Canvas or otherwise violate these Terms (including without limitation the general + prohibitions and restrictions set out in Section 5) or our Terms of Service. +
      • +
      +
    • +
    • +

      Accessing and Participating in Canvas

      +
        +
      • + You will access and use the Platform for informational purposes only and you will participate in Canvas strictly in accordance with + these Terms. You are solely responsible for verifying the accuracy of any information obtained in connection with Scroll, Canvas, + the Platform, or in relation to Canvas before using or participating in any of them. +
      • +
      • + You may access the Canvas interface (the “Interface”) with a third-party cryptocurrency wallet, whether or not custodial, + desktop, mobile, or “hot” or “cold”. These wallet services are third-party services and by using a third-party wallet, you agree + that you are using that wallet under the terms and conditions of the applicable provider of the wallet. Third-party wallets are not + operated by, maintained by, or affiliated with Scroll, and Scroll does not have possession, custody or control over the contents of + or any digital assets in your wallet and has no ability to retrieve or transfer the contents or digital assets in your wallet. +
      • +
      • + We accept no responsibility for, or liability to you, in connection with your use of a third-party wallet and make no + representations or warranties regarding how the Interface, Canvas or the Service will operate with any specific wallet. You are + solely responsible for keeping your wallet secure and you should never share your wallet credentials or seed phrase with anyone. If + you discover an issue related to your wallet, please contact the wallet provider. +
      • +
      • + Canvas may make reference to third party applications or protocols which provide third party services built on Scroll network (“ + Third-Party Protocols”). These Third-Party Protocols are not operated or controlled by Scroll, and your use of these + Third-Party Protocols is entirely at your own risk. In the case where you choose to place transactions through these Third-Party + Protocols and these transactions are not successful due to an error with the Third-Party Protocols, we accept no responsibility or + liability to you for any such failed transactions, or any transaction or gas fees that may be incurred by you in connection with + such failed transactions. Additionally, these Third-Party Protocols may impose a fee or charge for services. We are not responsible + for any fees charged by a third party. +
      • +
      +
    • +
    • +

      Collecting Badges

      +
        +
      • + In your use of the Services and by participating in Canvas, you may be attributed Badges. These are to be seen as social or + reputation indicators, and as an intangible reward. These are to document your activities on the Scroll ecosystem, and do not + represent any right to receive any asset or tokens in the future, or any claim against Scroll. Badges do not represent any value, + availability, fungibility, exchangeability or utility. +
      • +
      • + Badges will not and will never convert to, accrue to, or become any other tokens or virtual assets or distribution thereof. Badges + are virtual items with no monetary value, and do not constitute any currency or property of any type and are not redeemable, + refundable, or eligible for any fiat or virtual currency or anything else of value. +
      • +
      • + Scroll makes no representation or guarantee that any user will receive any property or outcome of value, as a result of holding any + Badge, or otherwise participating in Canvas. +
      • +
      +
    • + +
    • +

      Referrals and Rewards

      +
        +
      • +
        You may receive a reward in the form of ETH for every unique wallet address that:
        +
          +
        • Mints a space on our platform in conjunction with Canvas; and
        • +
        • Inputs your unique invitation code when prompted, while minting a space.
        • +
        +
      • +
      • +
        + Each wallet address that mints a space in the manner described in Clause 5(a) shall also be eligible for a 50% reduction of their + minting fee. This will be reflected in the Canvas interface. +
        +
      • +
      +
    • +
    • +

      Disclaimer

      +

      + YOUR USE OF THE INTERFACE, THE SERVICE AND/OR YOUR PARTICIPATION IN CANVAS ARE AT YOUR SOLE RISK. THE SERVICE, INTERFACE AND CANVAS + ARE PROVIDED ON AN “AS IS” AND “AS AVAILABLE” BASIS. THE INDEMNIFIED PARTIES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND, WHETHER + EXPRESS, IMPLIED OR STATUTORY, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND + NON-INFRINGEMENT. THE INDEMNIFIED PARTIES MAKE NO WARRANTY THAT (A) THE SERVICE, THE INTERFACE OR CANVAS WILL MEET YOUR REQUIREMENTS; + (B) THE SERVICE, INTERFACE, OR CANVAS WILL BE UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE; (C) THE RESULTS THAT MAY BE OBTAINED FROM + THE USE OF THE SERVICE, INTERFACE OR CANVAS OR (D) THE QUALITY OF ANY SERVICES, APPLICATIONS, INFORMATION, OR OTHER MATERIAL OBTAINED + BY YOU THROUGH CANVAS, THE SERVICE, INTERFACE OR CANVAS WILL MEET YOUR EXPECTATIONS. +

      + +

      + YOU AGREE THAT THESE TERMS AND ANY INFORMATION PROVIDED BY OR OBTAINED FROM THE SERVICE, THE INTERFACE OR CANVAS ARE FOR INFORMATIONAL + PURPOSES ONLY, ARE NOT INTENDED TO BE RELIED UPON FOR PROFESSIONAL ADVICE OF ANY SORT, AND ARE NOT A SUBSTITUTE FOR INFORMATION FROM + EXPERTS OR PROFESSIONALS IN THE APPLICABLE AREA. YOU SHOULD NOT TAKE, OR REFRAIN FROM TAKING, ANY ACTION OR DECISION BASED ON ANY + INFORMATION CONTAINED ON OR RECEIVED IN CONNECTION WITH THE SERVICE, THE INTERFACE OR CANVAS. IF, AND BEFORE YOU MAKE ANY FINANCIAL, + LEGAL, OR OTHER DECISIONS, YOU SHOULD SEEK INDEPENDENT PROFESSIONAL ADVICE FROM AN INDIVIDUAL WHO IS LICENSED AND QUALIFIED IN THE + AREA FOR WHICH SUCH ADVICE WOULD BE APPROPRIATE. +

      +

      + THESE TERMS ARE NOT INTENDED TO, AND DO NOT, CREATE OR IMPOSE ANY FIDUCIARY DUTIES ON US. TO THE FULLEST EXTENT PERMITTED BY LAW, YOU + ACKNOWLEDGE AND AGREE THAT WE OWE NO FIDUCIARY DUTIES OR LIABILITIES TO YOU OR ANY OTHER PARTY, AND THAT TO THE EXTENT ANY SUCH DUTIES + OR LIABILITIES MAY EXIST AT LAW OR IN EQUITY, THOSE DUTIES AND LIABILITIES ARE HEREBY IRREVOCABLY DISCLAIMED, WAIVED, AND ELIMINATED. + YOU FURTHER AGREE THAT THE ONLY DUTIES AND OBLIGATIONS THAT WE OWE YOU ARE THOSE SET OUT EXPRESSLY IN THESE TERMS. +

      +
    • +
    • +

      Indemnification

      +

      + You specifically agree that you will be personally responsible for your use of the Service, the Interface and your participation in + Canvas. To the fullest extent permitted by applicable laws, you agree to indemnify, defend and hold harmless Scroll, as well as its + affiliates and service providers, and each of their respective past, present and future officers, directors, members, employees, + consultants, representatives and agents, and each of their respective successors and assigns (the “Indemnified Parties”) from and + against all actual or alleged third party claims, damages, awards, judgments, losses, liabilities, obligations, taxes, penalties, + interest, fees, expenses (including, without limitation, attorneys’ fees and expenses) and costs (including, without limitation, court + costs, costs of settlement and costs of pursuing indemnification and insurance), of every kind and nature whatsoever, whether known or + unknown, foreseen or unforeseen, matured or unmatured, or suspected or unsuspected, in law or equity, whether in tort, contract or + otherwise (collectively, “Claims”), including, but not limited to, damages to property or personal injury, that are caused by, arise + out of or are related to: (a) your use of the Service, the Interface or your participation in Canvas or any site or service accessible + as part of the Service, the Interface or Canvas; (b) your violation of these Terms, our Terms of Service, or Privacy Policy, or + applicable law; (c) your violation of the rights of a third party; (d) your negligence or willful misconduct and (e) any disputes or + issues between you or any third party. You agree to promptly notify us of any third party Claims and cooperate with the Indemnified + Parties in defending such Claims. You further agree that the Indemnified Parties shall have the right to control the defense or + settlement of any third party Claims as they relate to us, if they so choose. +

      +
    • +
    • +

      Limitation of Liability

      +

      + TO THE FULLEST EXTENT ALLOWED BY APPLICABLE LAW, UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + TORT, CONTRACT, STRICT LIABILITY, OR OTHERWISE) SHALL THE INDEMNIFIED PARTIES OR ANY OF THEM BE LIABLE TO YOU OR TO ANY OTHER PERSON + FOR: (A) ANY INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING DAMAGES FOR LOST PROFITS, + BUSINESS INTERRUPTION, LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, ACCURACY OF RESULTS, OR COMPUTER FAILURE OR MALFUNCTION; (B) ANY + SUBSTITUTE GOODS, SERVICES OR TECHNOLOGY; (C) ANY AMOUNT, IN THE AGGREGATE, IN EXCESS OF ONE-HUNDRED (US$100) UNITED STATES DOLLARS; + OR (D) ANY MATTER BEYOND THE REASONABLE CONTROL OF THE INDEMNIFIED PARTIES OR ANY OF THEM. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL OR CERTAIN OTHER DAMAGES, SO THE ABOVE LIMITATIONS AND EXCLUSIONS MAY NOT APPLY + TO YOU. +

      +
    • +
    • +

      Incorporation of General Terms

      +

      + You agree that you have read Clauses 14 to 19 of the Scroll Terms of Service, and that the terms therein shall apply to these Terms, + mutatis mutandis. +

      +
    • +
    +
    +
    +
    + ) +} + +export default TermsAndConditionsDialog diff --git a/src/pages/canvas/mint/flow/index.tsx b/src/pages/canvas/mint/flow/index.tsx new file mode 100644 index 000000000..11ac38b3b --- /dev/null +++ b/src/pages/canvas/mint/flow/index.tsx @@ -0,0 +1,39 @@ +import "swiper/css" +import "swiper/css/pagination" +import { Pagination } from "swiper/modules" +import { Swiper, SwiperSlide } from "swiper/react" + +import SectionWrapper from "@/components/SectionWrapper" + +import FirstBadgeStep from "./FirstBadgeStep" +import MintStep from "./MintStep" +import NameStep from "./NameStep" + +const MintFlow = props => { + const { scrollTarget } = props + + return ( + theme.palette.primary.contrastText } }}> + + + + + + + + + + + + + ) +} + +export default MintFlow diff --git a/src/pages/canvas/mint/home/MintFlowDialog/index.tsx b/src/pages/canvas/mint/home/MintFlowDialog/index.tsx new file mode 100644 index 000000000..daf492eb7 --- /dev/null +++ b/src/pages/canvas/mint/home/MintFlowDialog/index.tsx @@ -0,0 +1,53 @@ +import { useRef } from "react" +import { makeStyles } from "tss-react/mui" + +import { AppBar, CircularProgress, Dialog, IconButton, Stack, SvgIcon, Toolbar, Typography } from "@mui/material" + +import { ReactComponent as CloseSvg } from "@/assets/svgs/nft/flow-close.svg" +import ScrollLogo from "@/components/ScrollLogo" +import useCanvasStore from "@/stores/canvasStore" + +import MintFlow from "../../flow" + +const useStyles = makeStyles()(theme => ({ + paper: { + backgroundColor: theme.palette.text.primary, + + [theme.breakpoints.down("sm")]: { + margin: 0, + }, + }, +})) + +const MintFlowDialog = props => { + const { onClose } = props + const scrollRef = useRef() + const { classes } = useStyles() + const { isProfileMinting, isFirstBadgeMinting } = useCanvasStore() + + return ( + + theme.palette.text.primary, paddingRight: "0 !important" }}> + + + theme.palette.primary.contrastText }}> + Mint Scroll Canvas + + + {isProfileMinting || isFirstBadgeMinting ? ( + + ) : ( + + + + )} + + + + + + + ) +} + +export default MintFlowDialog diff --git a/src/pages/canvas/mint/home/ReferralCodeInput.tsx b/src/pages/canvas/mint/home/ReferralCodeInput.tsx new file mode 100644 index 000000000..36953818c --- /dev/null +++ b/src/pages/canvas/mint/home/ReferralCodeInput.tsx @@ -0,0 +1,217 @@ +import React, { useEffect, useRef } from "react" + +import { Box, InputBase, Stack, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { checkCodeValidation } from "@/apis/canvas" +import { ReactComponent as CheckSvg } from "@/assets/svgs/canvas/check.svg" +import { ReactComponent as ErrorSvg } from "@/assets/svgs/canvas/error.svg" +import { ReactComponent as LoadingSvg } from "@/assets/svgs/canvas/loading.svg" +import useCanvasStore from "@/stores/canvasStore" + +const INVITE_CODE_LENGTH = 5 + +export enum CodeStatus { + VALID = "Valid", + INVALID = "Invalid", + UNKNOWN = "Unknown", + ERROR = "Error", +} + +const Title = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.contrastText, + textAlign: "center", + fontSize: "1.8rem", + fontWeight: 600, + lineHeight: "2.8rem", + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + lineHeight: "2.4rem", + }, +})) + +const ReferralCodeBox = styled(Box)(({ theme }) => ({ + display: "flex", + justifyContent: "center", + marginTop: "1.6rem", + marginBottom: "4rem", + gap: "0.8rem", +})) + +const ReferralCodeInput = styled(InputBase)(({ theme }) => ({ + backgroundColor: "#101010", + color: theme.palette.primary.contrastText, + fontFamily: "var(--developer-page-font-family)", + border: "1px solid #5b5b5b", + borderRadius: "1rem", + width: "7.2rem", + height: "7.2rem", + + fontSize: "4rem", + fontWeight: 600, + textAlign: "center", + "& input": { + textAlign: "center", + padding: 0, + }, + "&.Mui-focused": { + borderColor: theme.palette.primary.contrastText, + }, + "&::placeholder": { + color: "#DCDCDC", + opacity: 1, + }, + [theme.breakpoints.down("sm")]: { + width: "5.6rem", + height: "5.6rem", + fontSize: "3.2rem", + }, +})) + +const StatusBox = styled(Box)(({ theme }) => ({ + position: "absolute", + bottom: "1rem", + left: "50%", + transform: "translateX(-50%)", + [theme.breakpoints.down("sm")]: { + bottom: 0, + }, +})) + +const StatusContent = styled(Typography)(({ theme }) => ({ + fontSize: "1.6rem", + fontWeight: 500, + lineHeight: "2.8rem", + color: "#A5A5A5", + whiteSpace: "nowrap", + [theme.breakpoints.down("sm")]: { + lineHeight: "2.4rem", + }, +})) + +const ReferralCode = ({ isChecking, setIsChecking, code, codeStatus, setCodeStatus }) => { + const inputRefs = useRef>(new Array(INVITE_CODE_LENGTH).fill(null)) + const { changeReferralCode, inputReferralCode: codes, changeInputReferralCode: setCodes } = useCanvasStore() + + useEffect(() => { + if (code) { + const nextCodes = code + .slice(0, INVITE_CODE_LENGTH) + .padEnd(INVITE_CODE_LENGTH, ".") + .split("") + .map(item => (item === "." ? "" : item)) + setCodes(nextCodes) + } + }, [code]) + + useEffect(() => { + const validLength = codes.findIndex(item => !item) + inputRefs.current[validLength === -1 ? INVITE_CODE_LENGTH - 1 : validLength]?.focus() + + if (codes.every(code => code)) { + validateCode(codes.join("")) + } + }, [codes.toString()]) + + const validateCode = async (code: string) => { + try { + setIsChecking(true) + const { active } = await scrollRequest(checkCodeValidation(code)) + if (active) { + changeReferralCode(code) + setCodeStatus(CodeStatus.VALID) + } else { + changeReferralCode("") + setCodeStatus(CodeStatus.INVALID) + } + } catch (e) { + changeReferralCode("") + setCodeStatus(CodeStatus.ERROR) + inputRefs.current[INVITE_CODE_LENGTH - 1]?.focus() + } finally { + setIsChecking(false) + } + } + + const handleInputChange = (index: number, event: React.ChangeEvent) => { + setCodeStatus(CodeStatus.UNKNOWN) + const newCodes = [...codes] + newCodes[index] = (event.target as HTMLInputElement).value + setCodes(newCodes) + + if (event.target.value && index < INVITE_CODE_LENGTH - 1) { + inputRefs.current[index + 1]?.focus() + } + } + + const handleBackspace = (index: number, event: React.KeyboardEvent) => { + if (event.key === "Backspace" && !codes[index] && index > 0) { + inputRefs.current[index - 1]?.focus() + } + } + + const handlePaste = event => { + event.preventDefault() + const paste = event.clipboardData.getData("text") + if (paste.length) { + const pasteArray = paste + .slice(0, INVITE_CODE_LENGTH) + .padEnd(INVITE_CODE_LENGTH, ".") + .split("") + .map(item => (item === "." ? "" : item)) + setCodes(pasteArray) + } + } + + return ( + + + + Canvas has a mint fee of 0.001 ETH to fight spam.<br></br>Enter an invite code to get 50% off! + + + + + {codes.map((code, index) => ( + handleInputChange(index, e)} + onKeyDown={(e: any) => handleBackspace(index, e)} + inputProps={{ maxLength: 1 }} + inputRef={el => (inputRefs.current[index] = el as HTMLInputElement | null)} + /> + ))} + + + {isChecking && codeStatus === CodeStatus.UNKNOWN && ( + + + Checking... + + )} + {codeStatus === CodeStatus.ERROR && ( + + + Network error. Please try again later + + )} + {codeStatus === CodeStatus.INVALID && ( + + + Invalid code. Please try another one + + )} + {codeStatus === CodeStatus.VALID && ( + + + Valid code. You get 50% off mint fee + + )} + + + ) +} + +export default ReferralCode diff --git a/src/pages/canvas/mint/home/index.tsx b/src/pages/canvas/mint/home/index.tsx new file mode 100644 index 000000000..91ea8f7df --- /dev/null +++ b/src/pages/canvas/mint/home/index.tsx @@ -0,0 +1,135 @@ +import { useState } from "react" + +import { Box, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import Button from "@/components/Button" +import { CHAIN_ID } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useCanvasStore from "@/stores/canvasStore" +import { switchNetwork } from "@/utils" + +import MintFlowDialog from "./MintFlowDialog" +import ReferralCodeInput, { CodeStatus } from "./ReferralCodeInput" + +const Container = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + width: "100%", + height: "100%", + minHeight: "calc(100vh - 6.5rem)", + paddingTop: "5.5rem", + paddingBottom: "6rem", + backgroundColor: "#101010", + [theme.breakpoints.down("sm")]: { + height: "calc(var(--vh, 1vh) * 100 - 6.2rem - 9.6rem)", + minHeight: "unset", + padding: "0 1rem", + overflowY: "auto", + }, +})) + +const Title = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.contrastText, + textAlign: "center", + fontSize: "4rem", + fontWeight: 600, + lineHeight: "5.6rem", + marginBottom: "0.8rem", + [theme.breakpoints.down("sm")]: { + fontSize: "2.4rem", + lineHeight: "3.2rem", + }, +})) + +const SubTitle = styled(Typography)(({ theme }) => ({ + color: theme.palette.primary.contrastText, + textAlign: "center", + fontSize: "1.8rem", + fontStyle: "normal", + fontWeight: 400, + lineHeight: "2.8rem", + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + lineHeight: "2.4rem", + }, +})) + +const StickyBox = styled(Box)(({ theme }) => ({ + position: "sticky", + bottom: "0.8rem", + zIndex: 1, + backgroundColor: "#101010", + [theme.breakpoints.down("sm")]: { + position: "fixed", + padding: "2.4rem 2rem", + bottom: 0, + width: "100%", + "& > div": { + width: "100%", + }, + }, +})) + +const MintHome = props => { + const { code } = props + const { isMobile } = useCheckViewport() + const { connect, walletCurrentAddress, chainId } = useRainbowContext() + const { changeProfileName, mintFlowVisible, changeMintFlowVisible } = useCanvasStore() + + const [isChecking, setIsChecking] = useState(false) + const [codeStatus, setCodeStatus] = useState(CodeStatus.UNKNOWN) + + const handleOpenMintFlow = () => { + changeMintFlowVisible(true) + } + + const handleCloseFlow = () => { + changeProfileName("") + changeMintFlowVisible(false) + } + + const renderAction = () => { + if (!walletCurrentAddress) { + return ( + + ) + } else if (chainId !== CHAIN_ID.L2) { + return ( + + ) + } + return ( + + ) + } + + return ( + + Mint your Scroll Canvas + Map your journey and earn badges across the ecosystem. + + heartbeat + + + {renderAction()} + + + ) +} + +export default MintHome diff --git a/src/pages/canvas/mint/index.tsx b/src/pages/canvas/mint/index.tsx new file mode 100644 index 000000000..b03cdcb73 --- /dev/null +++ b/src/pages/canvas/mint/index.tsx @@ -0,0 +1,27 @@ +import { Navigate } from "react-router-dom" + +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCanvasStore from "@/stores/canvasStore" + +import LoadingPage from "../loading" +import ReadyToMint from "./home" + +const CanvasMint = props => { + const { code } = props + + const { walletCurrentAddress } = useRainbowContext() + const { profileMinted, profileMintedChecking, mintFlowVisible } = useCanvasStore() + + const renderMint = () => { + if (!mintFlowVisible && walletCurrentAddress && (profileMintedChecking || profileMinted === null)) { + return + } else if (!mintFlowVisible && profileMinted) { + return + } + return + } + + return <>{renderMint()} +} + +export default CanvasMint diff --git a/src/pages/canvas/wrongNetwork/index.tsx b/src/pages/canvas/wrongNetwork/index.tsx new file mode 100644 index 000000000..0aafb308a --- /dev/null +++ b/src/pages/canvas/wrongNetwork/index.tsx @@ -0,0 +1,92 @@ +import { Box, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as ConnectStickerSvg } from "@/assets/svgs/canvas/connect-sticker.svg" +import ScrollButton from "@/components/Button" +import { CHAIN_ID } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import Dialog from "@/pages/canvas/components/Dialog" +import { switchNetwork } from "@/utils" + +const StyledDialog = styled(Dialog)(({ theme }) => ({ + "& .MuiDialog-paper": { + background: "linear-gradient(114deg, #2A2A2A 0%, rgba(27, 27, 27, 0.60) 100%)", + backdropFilter: "blur(50px)", + + [theme.breakpoints.up("sm")]: { + width: "64rem", + height: "56rem", + }, + }, +})) + +const StyledDialogContent = styled(Box)(({ theme }) => ({ + height: "100%", + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", +})) + +const ButtonContainer = styled(Box)(({ theme }) => ({ + display: "flex", + gap: "1.6rem", + alignItems: "center", + marginTop: "4rem", + [theme.breakpoints.down("sm")]: { + flexDirection: "column", + gap: "2rem", + marginTop: "1.6rem", + }, +})) + +const WrongNetwork = () => { + const { walletCurrentAddress, connect } = useRainbowContext() + + return ( + + + + + Switch to Scroll Network + + + You can only view your Canvas on Scroll Network. + + + {!walletCurrentAddress ? ( + + Connect Wallet + + ) : ( + switchNetwork(CHAIN_ID.L2)}> + Switch to Scroll + + )} + + + + ) +} + +export default WrongNetwork diff --git a/src/pages/career/Header/index.tsx b/src/pages/career/Header/index.tsx index 68b4d3058..e31f1ef8d 100644 --- a/src/pages/career/Header/index.tsx +++ b/src/pages/career/Header/index.tsx @@ -9,18 +9,22 @@ import useCheckViewport from "@/hooks/useCheckViewport" const useStyles = makeStyles()(theme => ({ container: { - marginTop: "-6.5rem", - paddingTop: "6.5rem", + height: "calc(100vh - 6.5rem)", background: theme.palette.themeBackground.normal, "& > .MuiBox-root": { background: theme.palette.themeBackground.normal, }, + [theme.breakpoints.down("sm")]: { + height: "auto", + }, }, root: { display: "grid", gridTemplateColumns: "repeat(2, min-content)", - rowGap: "2.5rem", + rowGap: "2.4rem", columnGap: "4rem", + // paddingTop: "8.8rem !important", + paddingTop: "5% !important", paddingBottom: "5.4rem", justifyContent: "space-between", [theme.breakpoints.down("lg")]: { @@ -30,13 +34,15 @@ const useStyles = makeStyles()(theme => ({ paddingBottom: "4rem", }, [theme.breakpoints.down("sm")]: { - paddingTop: "7.3rem", - paddingBottom: "4rem", + paddingTop: "5rem", + paddingBottom: "2rem", justifyItems: "center", }, }, titleWrapper: { - gridRow: "span 2", + [theme.breakpoints.up("sm")]: { + gridRow: "span 2", + }, }, subTitleWrapper: { width: "68rem", @@ -46,8 +52,10 @@ const useStyles = makeStyles()(theme => ({ }, }, actionGroup: { - marginTop: "3rem", - [theme.breakpoints.between("sm", "lg")]: {}, + marginTop: "2.4rem", + [theme.breakpoints.down("sm")]: { + marginTop: 0, + }, }, })) @@ -60,7 +68,7 @@ const Header = () => { { - Join our team of diverse and talented researchers, engineers, experts and community champions who are passionate about creating the best - L2 Ethereum ecosystem. + Join a group of cryptography researchers, engineers, experts, and community champions to create the best L2 Ethereum ecosystem. -
    diff --git a/src/pages/career/Mission/index.tsx b/src/pages/career/Mission/index.tsx index 474587da5..626a68cbf 100644 --- a/src/pages/career/Mission/index.tsx +++ b/src/pages/career/Mission/index.tsx @@ -97,8 +97,8 @@ const Mission = () => { - Scroll’s mission is to provide an accessible scaling solution that preserves the essence of Ethereum - trust-minimized, secure and - open-source. + Scroll’s mission is to provide an accessible scaling solution that preserves the essence of Ethereum – trust-minimized, secure and open + source. diff --git a/src/pages/career/News/index.tsx b/src/pages/career/News/index.tsx index 38bc011db..5f116c60f 100644 --- a/src/pages/career/News/index.tsx +++ b/src/pages/career/News/index.tsx @@ -74,7 +74,7 @@ const News = () => { const { classes } = useStyles() const handleClick = news => { - window.location.href = news.link + window.open(news.link, "_blank") } return ( diff --git a/src/pages/career/Positions/index.tsx b/src/pages/career/Positions/index.tsx index 1f47d5a01..2e3a777f4 100644 --- a/src/pages/career/Positions/index.tsx +++ b/src/pages/career/Positions/index.tsx @@ -55,7 +55,7 @@ const Positions = () => { Join Scroll and contribute in
    building the best L2 product in the web3 world. -
    diff --git a/src/pages/community/Events/Error.tsx b/src/pages/community/Events/Error.tsx new file mode 100644 index 000000000..56a4ade5a --- /dev/null +++ b/src/pages/community/Events/Error.tsx @@ -0,0 +1,18 @@ +import { Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ErrorSvg } from "@/assets/svgs/ecosystem/error.svg" +import useCheckViewport from "@/hooks/useCheckViewport" + +const Error = props => { + const { title, description, action, ...restProps } = props + const { isMobile } = useCheckViewport() + return ( + + + {title} + {action} + + ) +} + +export default Error diff --git a/src/pages/community/Events/EventCard.tsx b/src/pages/community/Events/EventCard.tsx new file mode 100644 index 000000000..84a18ce7f --- /dev/null +++ b/src/pages/community/Events/EventCard.tsx @@ -0,0 +1,92 @@ +import dayjs from "dayjs" +import { makeStyles } from "tss-react/mui" + +import { Card, Stack, SvgIcon, Typography } from "@mui/material" + +import { communityOrigin } from "@/apis/community" +import { ReactComponent as RegionIcon } from "@/assets/svgs/community/region.svg" +import { ReactComponent as TimeIcon } from "@/assets/svgs/community/time.svg" +import Link from "@/components/Link" + +const useStyles = makeStyles()(theme => ({ + card: { + height: "100%", + cursor: "pointer", + borderRadius: "0", + background: "transparent", + transition: "all 0.3s ease-in-out", + "&:hover": { + transform: "scale(1.01)", + }, + }, + header: { + display: "flex", + flexDirection: "column", + gap: "6.2rem", + [theme.breakpoints.down("md")]: { + flexDirection: "row-reverse", + justifyContent: "space-between", + }, + }, + cover: { + width: "100%", + height: "auto", + objectFit: "cover", + borderRadius: "1.6rem", + marginBottom: "1.6rem", + }, +})) + +const DateTag = props => { + const { startDate, endDate } = props + return ( + + + {!endDate && dayjs(startDate).format("MMMM D, YYYY")} + {endDate && `${dayjs(startDate).format("MMM D")} - ${dayjs(endDate).format("MMM D, YYYY")}`} + + ) +} + +const EventCard = props => { + const { image, city, country, url, ...restProps } = props + + const { classes } = useStyles() + + return ( + + + Event cover + + + + + {city}, {country} + + + + + ) +} + +export default EventCard diff --git a/src/pages/community/Events/List.tsx b/src/pages/community/Events/List.tsx new file mode 100644 index 000000000..ac8bbbf7f --- /dev/null +++ b/src/pages/community/Events/List.tsx @@ -0,0 +1,186 @@ +import { useEffect, useMemo, useState } from "react" +import { makeStyles } from "tss-react/mui" + +import { Box, Button, SvgIcon } from "@mui/material" + +import { communityEventListUrl } from "@/apis/community" +import { ReactComponent as ArrowSvg } from "@/assets/svgs/ecosystem/arrow.svg" +import LoadingButton from "@/components/LoadingButton" +import LoadingPage from "@/components/LoadingPage" +import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" +import { COMMUNITY_REGION_LIST, COMMUNITY_TIME_LIST } from "@/constants/community" + +import Error from "./Error" +import Card from "./EventCard" +import NoData from "./NoData" + +const useStyles = makeStyles()(theme => ({ + flex: { + marginTop: "3rem", + display: "grid", + gridTemplateColumns: "repeat(3, 1fr)", + gridGap: "3rem", + [theme.breakpoints.down(1200)]: { + gridTemplateColumns: "repeat(2, 1fr)", + gridGap: "2rem", + marginTop: "2rem", + }, + [theme.breakpoints.down("md")]: { + gridTemplateColumns: "repeat(1, 1fr)", + }, + }, + large: { + gridColumn: "span 3", + [theme.breakpoints.down("md")]: { + gridColumn: "span 1", + }, + }, + flexItem: { + flex: 1, + alignSelf: "stretch", + }, + action: { + borderRadius: "0.8rem", + padding: "0.8rem 2.4rem", + fontSize: "1.8rem", + height: "4rem", + width: "21.6rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + width: "18.5rem", + }, + }, + buttonBox: { + gridColumn: "span 3", + textAlign: "center", + marginTop: "3rem", + [theme.breakpoints.down(1200)]: { + gridColumn: "span 2", + }, + [theme.breakpoints.down("md")]: { + gridColumn: "span 1", + }, + }, +})) + +const Join = props => { + const { + searchParams: { time, region, page }, + onAddPage, + } = props + const [loading, setLoading] = useState(false) + const { classes } = useStyles() + const [total, setTotal] = useState(false) + const [eventList, setEventList] = useState([]) + const [isError, setIsError] = useState(false) + const [pageSize] = useState(9) + + const queryStr = useMemo(() => { + const searchParams = new URLSearchParams({ + page_number: page, + page_size: pageSize, + } as any) + if (region !== COMMUNITY_REGION_LIST[0]) { + searchParams.set("region", region) + } + if (time !== COMMUNITY_TIME_LIST[0]) { + searchParams.set("when", time.toLowerCase()) + } + + const searchParamsStr = searchParams.toString() + return searchParamsStr ? `?${searchParamsStr}` : "" + }, [region, time, page]) + + const fetchEventList = value => { + setLoading(true) + scrollRequest(`${communityEventListUrl}${value}`) + .then(({ data, total }) => { + setTotal(total) + if (page !== 1) { + setEventList(pre => pre.concat(data)) + } else { + setEventList(data) + } + setIsError(false) + }) + .catch(() => { + setIsError(true) + }) + .finally(() => { + setLoading(false) + }) + } + + const hasMore = useMemo(() => { + return total > eventList.length + }, [total, eventList]) + + useEffect(() => { + fetchEventList(queryStr) + }, [queryStr]) + + const handleRequest = () => { + fetchEventList(queryStr) + } + + const renderList = () => { + if (loading && !eventList.length) { + return + } else if (isError && !eventList.length) { + return ( + + Try again + + } + > + ) + } else if (!eventList.length) { + return ( + + ) + } + return ( + + + {eventList.map((item, idx) => ( + + + + ))} + {hasMore && ( + + + + )} + + + ) + } + + return <>{renderList()} +} + +export default Join diff --git a/src/pages/community/Events/NoData.tsx b/src/pages/community/Events/NoData.tsx new file mode 100644 index 000000000..04be71fbe --- /dev/null +++ b/src/pages/community/Events/NoData.tsx @@ -0,0 +1,18 @@ +import { Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as EmptySvg } from "@/assets/svgs/ecosystem/empty.svg" +import useCheckViewport from "@/hooks/useCheckViewport" + +const NoData = props => { + const { title, description, ...restProps } = props + const { isMobile } = useCheckViewport() + return ( + + + {title} + {description} + + ) +} + +export default NoData diff --git a/src/pages/community/Events/RegionSelect.tsx b/src/pages/community/Events/RegionSelect.tsx new file mode 100644 index 000000000..d202109c7 --- /dev/null +++ b/src/pages/community/Events/RegionSelect.tsx @@ -0,0 +1,36 @@ +import { MenuItem, Typography } from "@mui/material" +import { useTheme } from "@mui/material/styles" + +import { ReactComponent as RegionIcon } from "@/assets/svgs/community/region.svg" +import Select from "@/components/Select" +import { COMMUNITY_REGION_LIST } from "@/constants/community" + +const RegionSelect = props => { + const { value, onChange } = props + const theme = useTheme() + + const handleChangeNetwork = e => { + onChange(e.target.value) + } + + return ( + + ) +} +export default RegionSelect diff --git a/src/pages/community/Events/TimeSelect.tsx b/src/pages/community/Events/TimeSelect.tsx new file mode 100644 index 000000000..4f82aabe5 --- /dev/null +++ b/src/pages/community/Events/TimeSelect.tsx @@ -0,0 +1,35 @@ +import { MenuItem, Typography } from "@mui/material" +import { useTheme } from "@mui/material/styles" + +import { ReactComponent as TimeIcon } from "@/assets/svgs/community/time.svg" +import Select from "@/components/Select" +import { COMMUNITY_TIME_LIST } from "@/constants/community" + +const TimeSelect = props => { + const { value, onChange } = props + const theme = useTheme() + + const handleChangeTime = e => { + onChange(e.target.value) + } + + return ( + + ) +} +export default TimeSelect diff --git a/src/pages/community/Events/index.tsx b/src/pages/community/Events/index.tsx new file mode 100644 index 000000000..c903be306 --- /dev/null +++ b/src/pages/community/Events/index.tsx @@ -0,0 +1,56 @@ +import { useState } from "react" + +import { Stack, Typography } from "@mui/material" + +import SectionWrapper from "@/components/SectionWrapper" +import { COMMUNITY_REGION_LIST, COMMUNITY_TIME_LIST } from "@/constants/community" + +import List from "./List" +import RegionSelect from "./RegionSelect" +import TimeSelect from "./TimeSelect" + +const Join = () => { + const [searchParams, setSearchParams] = useState({ + page: 1, + time: COMMUNITY_TIME_LIST[0], + region: COMMUNITY_REGION_LIST[0], + }) + + const handleChangeTime = value => { + setSearchParams(pre => ({ + ...pre, + page: 1, + time: value, + })) + } + + const handleChangeRegion = value => { + setSearchParams(pre => ({ + ...pre, + page: 1, + region: value, + })) + } + + const handleChangePage = () => { + setSearchParams(pre => ({ + ...pre, + page: pre.page + 1, + })) + } + + return ( + + + All Events + + + + + + + + ) +} + +export default Join diff --git a/src/pages/community/Globe/GlobeComponent.tsx b/src/pages/community/Globe/GlobeComponent.tsx new file mode 100644 index 000000000..a17145688 --- /dev/null +++ b/src/pages/community/Globe/GlobeComponent.tsx @@ -0,0 +1,55 @@ +import { useEffect, useRef, useState } from "react" + +import { Box } from "@mui/material" + +import Data from "./data.json" +import { initCityLabels, renderer, resizeRender } from "./mainscene/scene" + +const MAX_SIZE = 700 + +function Earth() { + const threeDomRef = useRef(null) + const [size, setSize] = useState(Math.min(window.innerWidth - 16, MAX_SIZE)) + + useEffect(() => { + const handleResize = () => { + const newSize = Math.min(window.innerWidth - 16, MAX_SIZE) + setSize(newSize) + if (threeDomRef.current) { + const { left, top } = threeDomRef.current.getBoundingClientRect() + resizeRender(newSize, newSize, left, top) + } + } + + window.addEventListener("resize", handleResize) + handleResize() + + return () => { + window.removeEventListener("resize", handleResize) + } + }, []) + + useEffect(() => { + if (threeDomRef.current) { + threeDomRef.current.appendChild(renderer.domElement) + const { left, top } = threeDomRef.current.getBoundingClientRect() + resizeRender(size, size, left, top) + initCityLabels(Data) + } + }, [size]) + + return ( + + + + ) +} + +export default Earth diff --git a/src/pages/community/Globe/data.json b/src/pages/community/Globe/data.json new file mode 100644 index 000000000..8003d9fa1 --- /dev/null +++ b/src/pages/community/Globe/data.json @@ -0,0 +1,548 @@ +[ + { + "text": "0xBlob", + "region": "APAC", + "latitude": 37.5503, + "longitude": 126.9971, + "name": "Korea", + "city": "Seoul", + "website": "https://www.blobcourse.com/", + "twitter": "https://twitter.com/BlobCourse", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/0xblob.jpg", + "pictures": "0xblob.jpg", + "visible": "No" + }, + { + "text": "Africa Blockchain Club - Universel", + "region": "Africa", + "latitude": -26.2056, + "longitude": 28.0337, + "name": "South Africa", + "city": "Johannesburg", + "website": "https://www.linkedin.com/company/africa-s-blockchain-club/", + "twitter": "https://x.com/africasblock", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/abcafrica.jpg", + "pictures": "abcafrica.jpg", + "visible": "No" + }, + { + "text": "Akindo", + "region": "APAC", + "latitude": 35.6895, + "longitude": 139.6917, + "name": "Japan", + "city": "Tokyo", + "website": "https://www.wavehack.global/", + "twitter": "https://x.com/akindo_io", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/akindo.jpg", + "pictures": "akindo.jpg", + "visible": "No" + }, + { + "text": "ATX Dao", + "region": "North America", + "latitude": 30.2672, + "longitude": -97.7431, + "name": "USA", + "city": "Austin", + "website": "https://www.atxdao.com/", + "twitter": "https://x.com/ATXDAO", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/atx.jpg", + "pictures": "atx.jpg", + "visible": "No" + }, + { + "text": "bewater", + "region": "APAC", + "latitude": 22.3193, + "longitude": 114.1694, + "name": "Hong Kong", + "city": "Hong Kong", + "website": "https://bewater.xyz/", + "twitter": "https://twitter.com/bewaterofficial", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/bewater.jpg", + "pictures": "atx.jpg", + "visible": "No" + }, + { + "text": "biteye", + "region": "APAC", + "latitude": 1.3521, + "longitude": 103.8198, + "name": "Singapore", + "city": "Singapore", + "website": "https://biteye.info/", + "twitter": "https://x.com/BiteyeCN", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/biteye.jpg", + "pictures": "biteye.jpg", + "visible": "No" + }, + { + "text": "Blockchain at Berkeley", + "region": "North America", + "latitude": 37.8715, + "longitude": -122.273, + "name": "USA", + "city": "Berkeley", + "website": "https://blockchain.studentorg.berkeley.edu/", + "twitter": "https://twitter.com/CalBlockchain", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/berkeley.jpg", + "pictures": "berkeley.jpg", + "visible": "No" + }, + { + "text": "Borderless Africa", + "region": "Africa", + "latitude": -8.7832, + "longitude": 34.5085, + "name": "Africa", + "city": null, + "website": "https://borderless.africa/", + "twitter": "https://x.com/borderlessaf", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/borderless.jpg", + "pictures": "borderless.jpg", + "visible": "No" + }, + { + "text": "Buidlers", + "region": "LATAM", + "latitude": -34.6037, + "longitude": -58.3816, + "name": "Argentina", + "city": "Buenos Aires", + "website": null, + "twitter": "https://x.com/Buidlerstech", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/buidlers.jpg", + "pictures": "buidlers.jpg", + "visible": "No" + }, + { + "text": "Cryptist ", + "region": "ASIA", + "latitude": 41.0082, + "longitude": 28.9784, + "name": "Turkey", + "city": "Istanbul", + "website": "https://cryptist.org/", + "twitter": "https://x.com/cryptistanbul", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/cryptist.jpg", + "pictures": "cryptist.jpg", + "visible": "No" + }, + { + "text": "Espacio Cripto", + "region": "LATAM", + "latitude": 19.4326, + "longitude": -99.1332, + "name": "Mexico", + "city": "CDMX", + "website": "https://bento.me/espaciocripto", + "twitter": "https://twitter.com/EspacioCripto", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/espaiocripto.jpg", + "pictures": "espaiocripto.jpg", + "visible": "No" + }, + { + "text": "ETH Barcelona", + "region": "Europe", + "latitude": 41.3874, + "longitude": 2.1686, + "name": "Spain", + "city": "Barcelona", + "website": "https://linktr.ee/ethbarcelona", + "twitter": "https://twitter.com/eth_barcelona", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/barcelona.jpg", + "pictures": "barcelona.jpg", + "visible": "No" + }, + { + "text": "ETH Beijing", + "region": "APAC", + "latitude": 39.9042, + "longitude": 116.4074, + "name": "China", + "city": "Beijing", + "website": "https://www.ethbeijing.xyz/", + "twitter": null, + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/Screenshot_2024-08-20_at_10.03.45_PM.png", + "pictures": "ethbeijing.png", + "visible": "No" + }, + { + "text": "ETH Costa Rica", + "region": "LATAM", + "latitude": 37.3387, + "longitude": -121.8853, + "name": "Costa Rica", + "city": "San Jose", + "website": "https://ethereum.cr/", + "twitter": "https://x.com/EthereumCR", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/CostaRica.jpg", + "pictures": "CostaRica.jpg", + "visible": "No" + }, + { + "text": "CryptoCanal", + "region": "Europe", + "latitude": 52.3676, + "longitude": 4.9041, + "name": "Netherlands", + "city": "Amsterdam", + "website": "https://www.ethdam.com/", + "twitter": "https://x.com/cryptocanal", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/cryptocanal.jpg", + "pictures": "cryptocanal.jpg", + "visible": "No" + }, + { + "text": "ETH Denver", + "region": "North America", + "latitude": 39.7392, + "longitude": -104.9903, + "name": "USA", + "city": "Denver", + "website": "https://www.ethdenver.com/", + "twitter": "https://twitter.com/EthereumDenver", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/ethdenver.jpg", + "pictures": "ethdenver.jpg", + "visible": "No" + }, + { + "text": "ETH Gathering", + "region": "Europe", + "latitude": 41.3874, + "longitude": 2.1686, + "name": "Spain", + "city": "Barcelona", + "website": null, + "twitter": "https://twitter.com/ethgathering", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/ethgathering.jpg", + "pictures": "ethgathering.jpg", + "visible": "No" + }, + { + "text": "Eth Japan", + "region": "APAC", + "latitude": 35.6895, + "longitude": 139.6917, + "name": "Japan", + "city": "Tokyo", + "website": "https://www.ethtokyo.com/", + "twitter": "https://x.com/Ethereum_JP", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/japan.jpg", + "pictures": "japan.jpg", + "visible": "No" + }, + { + "text": "ETH Lima", + "region": "LATAM", + "latitude": -12.0467, + "longitude": -77.0431, + "name": "Peru", + "city": "Lima", + "website": "https://ethlima.org/", + "twitter": "https://x.com/EthereumLima", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/lima.jpg", + "pictures": "lima.jpg", + "visible": "No" + }, + { + "text": "ETH Pad Thai", + "region": "SEA", + "latitude": 15.87, + "longitude": 100.9925, + "name": "Thailand", + "city": null, + "website": "https://ethpadthai.org/", + "twitter": "https://x.com/ethpadthai", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/padthai.jpg", + "pictures": "padthai.jpg", + "visible": "No" + }, + { + "text": "ETH Prague", + "region": "Europe", + "latitude": 50.0755, + "longitude": 14.4378, + "name": "Czech Republic", + "city": "Prague", + "website": "https://ethprague.com/", + "twitter": "https://x.com/EthPrague", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/prague.jpg", + "pictures": "prague.jpg", + "visible": "No" + }, + { + "text": "Eth Samba", + "region": "LATAM", + "latitude": -14.235, + "longitude": -51.9253, + "name": "Brazil", + "city": null, + "website": "https://linktr.ee/ethsamba", + "twitter": "https://x.com/ethsamba", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/ethsamba.jpg", + "pictures": "ethsamba.jpg", + "visible": "No" + }, + { + "text": "ETH Taipei", + "region": "APAC", + "latitude": 25.033, + "longitude": 121.5654, + "name": "Taiwan", + "city": "Taipei", + "website": "https://ethtaipei.org/", + "twitter": "https://x.com/EthTaipei", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/taipei.jpg", + "pictures": "taipei.jpg", + "visible": "No" + }, + { + "text": "Eth Volcano", + "region": "LATAM", + "latitude": 13.7942, + "longitude": -88.8965, + "name": "El Salvador", + "city": null, + "website": "https://t.me/ETHVolcanoCommunity", + "twitter": "https://x.com/ethvolcano_", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/elsalva.jpg", + "pictures": "elsalva.jpg", + "visible": "No" + }, + { + "text": "EthBerlin", + "region": "Europe", + "latitude": 52.52, + "longitude": 13.405, + "name": "Germany", + "city": "Berlin", + "website": null, + "twitter": "https://x.com/ETHBerlin", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/Berlin.jpg", + "pictures": "Berlin.jpg", + "visible": "No" + }, + { + "text": "Ethereum Bogota", + "region": "LATAM", + "latitude": 4.5709, + "longitude": -74.2973, + "name": "Colombia", + "city": null, + "website": null, + "twitter": "https://x.com/ethcobogota", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/bogota.jpg", + "pictures": "bogota.jpg", + "visible": "No" + }, + { + "text": "Ethereum Bolivia", + "region": "LATAM", + "latitude": -16.2902, + "longitude": -63.5887, + "name": "Bolivia", + "city": null, + "website": "https://linktr.ee/ethbolivia", + "twitter": "https://x.com/EthereumBo", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/bolivia.jpg", + "pictures": "bolivia.jpg", + "visible": "No" + }, + { + "text": "Ethereum Guatemala", + "region": "LATAM", + "latitude": 15.7835, + "longitude": -90.2308, + "name": "Guatemala", + "city": null, + "website": "https://linktr.ee/ethereumgt", + "twitter": "https://x.com/ethereumgt", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/guate.jpg", + "pictures": "guate.jpg", + "visible": "No" + }, + { + "text": "Ethereum Tegucigalpa", + "region": "LATAM", + "latitude": 15.2, + "longitude": -86.2419, + "name": "Honduras", + "city": null, + "website": "https://t.co/VzTPJyV2Fh", + "twitter": "https://x.com/ethereumTGU_", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/TGU.jpg", + "pictures": "TGU.jpg", + "visible": "No" + }, + { + "text": "Ethereum Uruguay", + "region": "LATAM", + "latitude": -32.5228, + "longitude": -55.7658, + "name": "Uruguay", + "city": null, + "website": "https://www.ethereumuruguay.org/", + "twitter": "https://x.com/EthereumUruguay", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/uruguay.jpg", + "pictures": "uruguay.jpg", + "visible": "No" + }, + { + "text": "EthKL", + "region": "SEA", + "latitude": 4.2105, + "longitude": 101.9758, + "name": "Malaysia", + "city": null, + "website": "https://www.ethkl.org/", + "twitter": "https://twitter.com/ETHKL1", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/KL.jpg", + "pictures": "KL.jpg", + "visible": "No" + }, + { + "text": "ETHKyiv", + "region": "Europe", + "latitude": 48.3794, + "longitude": 31.1656, + "name": "Ukraine", + "city": null, + "website": "https://www.ethkyiv.org/", + "twitter": "https://x.com/EthKyiv_", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/kyiv.jpg", + "pictures": "kyiv.jpg", + "visible": "No" + }, + { + "text": "EthWarsaw", + "region": "Europe", + "latitude": 51.9194, + "longitude": 19.1451, + "name": "Poland", + "city": null, + "website": "https://www.ethwarsaw.dev/", + "twitter": "https://x.com/ETHWarsaw", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/warsaw.jpg", + "pictures": "warsaw.jpg", + "visible": "No" + }, + { + "text": "FranklinDAO / Penn Blockchain", + "region": "North America", + "latitude": 41.2033, + "longitude": -77.1945, + "name": "USA", + "city": "Pennsylvania", + "website": "https://www.franklindao.xyz/", + "twitter": "https://x.com/franklin_dao", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/franklin.jpg", + "pictures": "franklin.jpg", + "visible": "No" + }, + { + "text": "ITU Blockchain", + "region": "APAC, Europe", + "latitude": 41.0082, + "longitude": 28.9784, + "name": "Turkey", + "city": "Istanbul", + "website": "https://www.itublockchain.com/", + "twitter": "https://x.com/ITUblockchain", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/itu.png", + "pictures": "itu.png", + "visible": "No" + }, + { + "text": "Nonce ", + "region": "APAC", + "latitude": 35.9078, + "longitude": 127.7669, + "name": "Korea", + "city": null, + "website": "https://nonce.community/lighthouse", + "twitter": "https://x.com/nonce_community", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/nonce.jpg", + "pictures": "nonce.jpg", + "visible": "No" + }, + { + "text": "Stanford Blockchain", + "region": "North America", + "latitude": 37.7749, + "longitude": -122.4194, + "name": "USA", + "city": "San Francisco", + "website": "https://blockchain.stanford.edu/", + "twitter": "https://twitter.com/StanfordCrypto", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/sbc.jpg", + "pictures": "sbc.jpg", + "visible": "No" + }, + { + "text": "TUM Blockchain Club", + "region": "Europe", + "latitude": 48.1351, + "longitude": 11.582, + "name": "Germany", + "city": "Munich", + "website": "https://conference.tum-blockchain.com/", + "twitter": "https://twitter.com/tbc_munich", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/tum.jpg", + "pictures": "tum.jpg", + "visible": "No" + }, + { + "text": "Michigan Blockchain", + "region": "North America", + "latitude": 44.3148, + "longitude": -85.6024, + "name": "USA", + "city": "Michigan", + "website": "https://www.michiganblockchain.org/", + "twitter": "https://twitter.com/UMichBlockchain", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/mich.jpg", + "pictures": "mich.jpg", + "visible": "No" + }, + { + "text": "USC Blockchain Club", + "region": "North America", + "latitude": 34.0549, + "longitude": -118.2426, + "name": "USA", + "city": "Los Angeles", + "website": "https://www.blockchainusc.com/", + "twitter": null, + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/usc.svg", + "pictures": "usc.svg", + "visible": "No" + }, + { + "text": "Web3Afrika", + "region": "Africa", + "latitude": 9.082, + "longitude": 8.6753, + "name": "Nigeria", + "city": null, + "website": "https://www.web3afrika.com/", + "twitter": "https://twitter.com/web3afrika", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/web3afrika.jpg", + "pictures": "web3afrika.jpg", + "visible": "No" + }, + { + "text": "Web3Samaj", + "region": "APAC", + "latitude": 20.5937, + "longitude": 78.9629, + "name": "India", + "city": null, + "website": "https://www.web3samaj.com/", + "twitter": "https://twitter.com/web3samaj", + "logo": "Community%20Globe%20-%20Sheet1%20db0444fc12cd473fa31eb68dd6b6e6fd/web3samaj.jpg", + "pictures": "web3samaj.jpg", + "visible": "No" + } +] diff --git a/src/pages/community/Globe/index.tsx b/src/pages/community/Globe/index.tsx new file mode 100644 index 000000000..35becf257 --- /dev/null +++ b/src/pages/community/Globe/index.tsx @@ -0,0 +1,40 @@ +import React, { Suspense, lazy } from "react" +import { makeStyles } from "tss-react/mui" + +import { Box, Typography } from "@mui/material" + +const GlobeComponent = lazy(() => import("./GlobeComponent")) + +const useStyles = makeStyles()(theme => ({ + title: { + color: "#101010", + textAlign: "center", + fontSize: "4.8rem", + fontWeight: 600, + lineHeight: "8.4rem", + marginTop: "7.2rem", + marginBottom: "4rem", + [theme.breakpoints.down("md")]: { + fontSize: "4rem", + lineHeight: "5rem", + marginTop: "6rem", + marginBottom: "3rem", + padding: "0 1.6rem", + }, + }, +})) + +function Earth() { + const { classes } = useStyles() + + return ( + + Scroll Around the World + }> + + + + ) +} + +export default Earth diff --git a/src/pages/community/Globe/mainscene/Tag.tsx b/src/pages/community/Globe/mainscene/Tag.tsx new file mode 100644 index 000000000..beb666e82 --- /dev/null +++ b/src/pages/community/Globe/mainscene/Tag.tsx @@ -0,0 +1,168 @@ +import React, { useEffect, useRef } from "react" +import { CSS2DObject } from "three/examples/jsm/renderers/CSS2DRenderer.js" + +import SvgIcon from "@mui/material/SvgIcon" +import { styled } from "@mui/material/styles" + +import { ReactComponent as ExternalSvg } from "@/assets/svgs/header/External.svg" + +interface TagProps { + data: { + name?: string + eventName?: string + cover?: string + city?: string + eventInfo: any + } + direction?: "up" | "down" | "left" | "right" + onTagReady?: (tag: CSS2DObject) => void +} + +const EventContainer = styled("div")({ + position: "relative", + width: "9px", + height: "9px", + zIndex: "999 !important", +}) + +const Circle = styled("div")({ + width: "9px", + height: "9px", + borderRadius: "50%", + border: "1px solid #101010", + position: "relative", + background: "#ffffff", + zIndex: 99, +}) + +const Title = styled("div")(({ theme }) => ({ + position: "absolute", + width: "fit-content", + fontSize: "14px", + color: "#101010", + padding: "2px 9px", + borderRadius: "20px", + border: "1px solid #101010", + background: "#d2fcf6", + whiteSpace: "nowrap", + transform: "translate(-50%, -60px)", + fontFamily: "var(--developer-page-font-family)", +})) + +const Line = styled("div")<{ direction?: string }>(({ direction }) => ({ + position: "absolute", + width: "1px", + height: "70px", + backgroundColor: "#101010", + top: "60%", + left: "50%", + transformOrigin: "top", + transform: + direction === "up" + ? "translateY(-100%) rotate(0deg)" + : direction === "left" + ? "rotate(-270deg)" + : direction === "right" + ? "rotate(-90deg)" + : "none", +})) + +const EndDiv = styled("div")<{ direction?: string }>(({ direction }) => ({ + width: "183px", + height: "140px", + position: "absolute", + background: "#ffeeda", + borderRadius: "10px", + border: "1px solid #101010", + overflow: "hidden", + zIndex: 20, + top: direction === "up" ? "-60px" : "50%", + bottom: direction === "down" ? "-60px" : undefined, + left: direction === "left" ? "-60px" : undefined, + right: direction === "right" ? "-60px" : undefined, + transform: + direction === "up" + ? "translate(-50%, -100%)" + : direction === "down" + ? "translate(-50%, 50%)" + : direction === "left" + ? "translate(-100%, -50%)" + : direction === "right" + ? "translate(100%, -50%)" + : "none", +})) + +const EndDivImage = styled("img")({ + margin: 0, + padding: 0, + objectFit: "contain", + width: "183px", + height: "110px", + borderBottom: "1px solid #101010", + outline: "none", + display: "block", + background: "#fff", +}) + +const EndDivText = styled("a")(({ theme }) => ({ + margin: 0, + display: "block", + textAlign: "center", + lineHeight: "30px", + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis", + padding: "0 6px", + fontFamily: "var(--developer-page-font-family)", + "&:hover": { + cursor: "pointer", + color: "#ff684b", + "& svg": { + opacity: 1, + marginLeft: "0.8rem !important", + // left: "0.8rem", + }, + }, +})) + +const Tag: React.FC = ({ data, direction, onTagReady }) => { + const divRef = useRef(null) + + useEffect(() => { + if (divRef.current && onTagReady) { + const tagObject = new CSS2DObject(divRef.current) + setTimeout(() => { + onTagReady(tagObject) + }, 0) + } + }, [onTagReady]) + + return ( + + + {data?.city || data?.name} + + + + + + {data?.eventName || ""}{" "} + + + + + ) +} + +export default Tag diff --git a/src/pages/community/Globe/mainscene/countryMesh/delaunator.ts b/src/pages/community/Globe/mainscene/countryMesh/delaunator.ts new file mode 100644 index 000000000..4250d7f7f --- /dev/null +++ b/src/pages/community/Globe/mainscene/countryMesh/delaunator.ts @@ -0,0 +1,518 @@ +const EPSILON = Math.pow(2, -52) +const EDGE_STACK = new Uint32Array(512) + +export default class Delaunator { + _halfedges: Int32Array + private _triangles: Uint32Array + _hashSize: number + _hullPrev: Uint32Array + _hullTri: Uint32Array + _hullNext: any + _hullHash: any + _dists: Float64Array + _ids: Uint32Array + coords: any + triangles: any + hull: any + halfedges: any + _cx: any + _cy: any + private _hullStart: any + trianglesLen: any + + static from(points: string | any[], getX = defaultGetX, getY = defaultGetY) { + const n = points.length + const coords = new Float64Array(n * 2) + + for (let i = 0; i < n; i++) { + const p = points[i] + coords[2 * i] = getX(p) + coords[2 * i + 1] = getY(p) + } + + return new Delaunator(coords) + } + + constructor(coords: string | any[] | Float64Array) { + const n = coords.length >> 1 + if (n > 0 && typeof coords[0] !== "number") throw new Error("Expected coords to contain numbers.") + + this.coords = coords + + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0) + this._triangles = new Uint32Array(maxTriangles * 3) + this._halfedges = new Int32Array(maxTriangles * 3) + + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)) + this._hullPrev = new Uint32Array(n) // edge to prev edge + this._hullNext = new Uint32Array(n) // edge to next edge + this._hullTri = new Uint32Array(n) // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1) // angular edge hash + + // temporary arrays for sorting points + this._ids = new Uint32Array(n) + this._dists = new Float64Array(n) + + this.update() + } + + update() { + const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this + const n = coords.length >> 1 + + // populate an array of point indices; calculate input data bbox + let minX = Infinity + let minY = Infinity + let maxX = -Infinity + let maxY = -Infinity + + for (let i = 0; i < n; i++) { + const x = coords[2 * i] + const y = coords[2 * i + 1] + if (x < minX) minX = x + if (y < minY) minY = y + if (x > maxX) maxX = x + if (y > maxY) maxY = y + this._ids[i] = i + } + const cx = (minX + maxX) / 2 + const cy = (minY + maxY) / 2 + + let minDist = Infinity + let i0: number = 0, + i1: number = 0, + i2: number = 0 + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]) + if (d < minDist) { + i0 = i + minDist = d + } + } + const i0x = coords[2 * i0] + const i0y = coords[2 * i0 + 1] + + minDist = Infinity + + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]) + if (d < minDist && d > 0) { + i1 = i + minDist = d + } + } + let i1x = coords[2 * i1] + let i1y = coords[2 * i1 + 1] + + let minRadius = Infinity + + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]) + if (r < minRadius) { + i2 = i + minRadius = r + } + } + let i2x = coords[2 * i2] + let i2y = coords[2 * i2 + 1] + + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1] + } + quicksort(this._ids, this._dists, 0, n - 1) + const hull = new Uint32Array(n) + let j = 0 + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i] + if (this._dists[id] > d0) { + hull[j++] = id + d0 = this._dists[id] + } + } + this.hull = hull.subarray(0, j) + this.triangles = new Uint32Array(0) + this.halfedges = new Uint32Array(0) + return + } + + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + const i = i1 + const x = i1x + const y = i1y + i1 = i2 + i1x = i2x + i1y = i2y + i2 = i + i2x = x + i2y = y + } + + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y) + this._cx = center.x + this._cy = center.y + + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y) + } + + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1) + + // set up the seed triangle as the starting hull + this._hullStart = i0 + let hullSize = 3 + + hullNext[i0] = hullPrev[i2] = i1 + hullNext[i1] = hullPrev[i0] = i2 + hullNext[i2] = hullPrev[i1] = i0 + + hullTri[i0] = 0 + hullTri[i1] = 1 + hullTri[i2] = 2 + + hullHash.fill(-1) + hullHash[this._hashKey(i0x, i0y)] = i0 + hullHash[this._hashKey(i1x, i1y)] = i1 + hullHash[this._hashKey(i2x, i2y)] = i2 + + this.trianglesLen = 0 + this._addTriangle(i0, i1, i2, -1, -1, -1) + + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k] + const x = coords[2 * i] + const y = coords[2 * i + 1] + + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue + xp = x + yp = y + + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue + + // find a visible edge on the convex hull using edge hash + let start = 0 + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize] + if (start !== -1 && start !== hullNext[start]) break + } + + start = hullPrev[start] + let e = start, + q + while (((q = hullNext[e]), !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]))) { + e = q + if (e === start) { + e = -1 + break + } + } + if (e === -1) continue // likely a near-duplicate point; skip it + + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]) + + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2) + hullTri[e] = t // keep track of boundary triangles on the hull + hullSize++ + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e] + while (((q = hullNext[n]), orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1]))) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]) + hullTri[i] = this._legalize(t + 2) + hullNext[n] = n // mark as removed + hullSize-- + n = q + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (((q = hullPrev[e]), orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]))) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]) + this._legalize(t + 2) + hullTri[q] = t + hullNext[e] = e // mark as removed + hullSize-- + e = q + } + } + + // update the hull indices + this._hullStart = hullPrev[i] = e + hullNext[e] = hullPrev[n] = i + hullNext[i] = n + + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e + } + + this.hull = new Uint32Array(hullSize) + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e + e = hullNext[e] + } + + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen) + this.halfedges = this._halfedges.subarray(0, this.trianglesLen) as any + } + + _hashKey(x: number, y: number) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize + } + + _legalize(a: number) { + const { _triangles: triangles, _halfedges: halfedges, coords } = this + + let i = 0 + let ar = 0 + + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a] + + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - (a % 3) + ar = a0 + ((a + 2) % 3) + + if (b === -1) { + // convex hull edge + if (i === 0) break + a = EDGE_STACK[--i] + continue + } + + const b0 = b - (b % 3) + const al = a0 + ((a + 1) % 3) + const bl = b0 + ((b + 2) % 3) + + const p0 = triangles[ar] + const pr = triangles[a] + const pl = triangles[al] + const p1 = triangles[bl] + + const illegal = inCircle( + coords[2 * p0], + coords[2 * p0 + 1], + coords[2 * pr], + coords[2 * pr + 1], + coords[2 * pl], + coords[2 * pl + 1], + coords[2 * p1], + coords[2 * p1 + 1], + ) + + if (illegal) { + triangles[a] = p1 + triangles[b] = p0 + + const hbl = halfedges[bl] + + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a + break + } + e = this._hullPrev[e] + } while (e !== this._hullStart) + } + this._link(a, hbl) + this._link(b, halfedges[ar]) + this._link(ar, bl) + + const br = b0 + ((b + 1) % 3) + + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br + } + } else { + if (i === 0) break + a = EDGE_STACK[--i] + } + } + + return ar + } + + _link(a: number, b: number) { + this._halfedges[a] = b + if (b !== -1) this._halfedges[b] = a + } + + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0: number, i1: number, i2: number, a: number, b: number, c: number) { + const t = this.trianglesLen + + this._triangles[t] = i0 + this._triangles[t + 1] = i1 + this._triangles[t + 2] = i2 + + this._link(t, a) + this._link(t + 1, b) + this._link(t + 2, c) + + this.trianglesLen += 3 + + return t + } +} + +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx: number, dy: number) { + const p = dx / (Math.abs(dx) + Math.abs(dy)) + return (dy > 0 ? 3 - p : 1 + p) / 4 // [0..1] +} + +function dist(ax: number, ay: number, bx: number, by: number) { + const dx = ax - bx + const dy = ay - by + return dx * dx + dy * dy +} + +// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check +function orientIfSure(px: number, py: number, rx: number, ry: number, qx: number, qy: number) { + const l = (ry - py) * (qx - px) + const r = (rx - px) * (qy - py) + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0 +} + +// a more robust orientation test that's stable in a given triangle (to fix robustness issues) +function orient(rx: any, ry: any, qx: any, qy: any, px: any, py: any) { + const sign = orientIfSure(px, py, rx, ry, qx, qy) || orientIfSure(rx, ry, qx, qy, px, py) || orientIfSure(qx, qy, px, py, rx, ry) + return sign < 0 +} + +function inCircle(ax: number, ay: number, bx: number, by: number, cx: number, cy: number, px: number, py: number) { + const dx = ax - px + const dy = ay - py + const ex = bx - px + const ey = by - py + const fx = cx - px + const fy = cy - py + + const ap = dx * dx + dy * dy + const bp = ex * ex + ey * ey + const cp = fx * fx + fy * fy + + return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0 +} + +function circumradius(ax: number, ay: number, bx: number, by: number, cx: number, cy: number) { + const dx = bx - ax + const dy = by - ay + const ex = cx - ax + const ey = cy - ay + + const bl = dx * dx + dy * dy + const cl = ex * ex + ey * ey + const d = 0.5 / (dx * ey - dy * ex) + + const x = (ey * bl - dy * cl) * d + const y = (dx * cl - ex * bl) * d + + return x * x + y * y +} + +function circumcenter(ax: number, ay: number, bx: number, by: number, cx: number, cy: number) { + const dx = bx - ax + const dy = by - ay + const ex = cx - ax + const ey = cy - ay + + const bl = dx * dx + dy * dy + const cl = ex * ex + ey * ey + const d = 0.5 / (dx * ey - dy * ex) + + const x = ax + (ey * bl - dy * cl) * d + const y = ay + (dx * cl - ex * bl) * d + + return { x, y } +} + +function quicksort(ids: any[] | Uint32Array, dists: Float64Array, left: number, right: number) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i] + const tempDist = dists[temp] + let j = i - 1 + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--] + ids[j + 1] = temp + } + } else { + const median = (left + right) >> 1 + let i = left + 1 + let j = right + swap(ids, median, i) + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right) + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right) + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i) + + const temp = ids[i] + const tempDist = dists[temp] + while (true) { + do i++ + while (dists[ids[i]] < tempDist) + do j-- + while (dists[ids[j]] > tempDist) + if (j < i) break + swap(ids, i, j) + } + ids[left + 1] = ids[j] + ids[j] = temp + + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right) + quicksort(ids, dists, left, j - 1) + } else { + quicksort(ids, dists, left, j - 1) + quicksort(ids, dists, i, right) + } + } +} + +function swap(arr: any[] | Uint32Array, i: number, j: number) { + const tmp = arr[i] + arr[i] = arr[j] + arr[j] = tmp +} + +function defaultGetX(p: any[]) { + return p[0] +} +function defaultGetY(p: any[]) { + return p[1] +} diff --git a/src/pages/community/Globe/mainscene/countryMesh/delaunay.ts b/src/pages/community/Globe/mainscene/countryMesh/delaunay.ts new file mode 100644 index 000000000..a437aa5dc --- /dev/null +++ b/src/pages/community/Globe/mainscene/countryMesh/delaunay.ts @@ -0,0 +1,21 @@ +import Delaunator from "./delaunator" +import { pointInPolygon } from "./pointInPolygon" + +function delaunay(pointsArr: string | any[], polygon: any) { + var indexArr = (Delaunator.from(pointsArr) as any).triangles + + var usefulIndexArr: any = [] + + for (var i = 0; i < indexArr.length; i += 3) { + var p1 = pointsArr[indexArr[i]] + var p2 = pointsArr[indexArr[i + 1]] + var p3 = pointsArr[indexArr[i + 2]] + + var triangleCentroid = [(p1[0] + p2[0] + p3[0]) / 3, (p1[1] + p2[1] + p3[1]) / 3] + if (pointInPolygon(triangleCentroid, polygon)) { + usefulIndexArr.push(indexArr[i + 2], indexArr[i + 1], indexArr[i]) + } + } + return usefulIndexArr +} +export { delaunay } diff --git a/src/pages/community/Globe/mainscene/countryMesh/gridPoint.ts b/src/pages/community/Globe/mainscene/countryMesh/gridPoint.ts new file mode 100644 index 000000000..c30429b57 --- /dev/null +++ b/src/pages/community/Globe/mainscene/countryMesh/gridPoint.ts @@ -0,0 +1,50 @@ +import { pointInPolygon } from "./pointInPolygon" + +function gridPoint(polygon: any[][]) { + var lonArr: any[] = [] + var latArr: any[] = [] + polygon.forEach((elem: any[]) => { + lonArr.push(elem[0]) + latArr.push(elem[1]) + }) + + var [lonMin, lonMax] = minMax(lonArr) + var [latMin, latMax] = minMax(latArr) + + var gap = 3 + var row = Math.ceil((lonMax - lonMin) / gap) + var column = Math.ceil((latMax - latMin) / gap) + var rectPointsArr: any = [] + for (var i = 0; i < row + 1; i++) { + for (var j = 0; j < column + 1; j++) { + rectPointsArr.push([lonMin + i * gap, latMin + j * gap]) + } + } + + var polygonPointsArr: number[][] = [] + rectPointsArr.forEach(function (coord) { + if (pointInPolygon(coord, polygon)) { + polygonPointsArr.push(coord) + } + }) + + return [...polygon, ...polygonPointsArr] +} + +function minMax(arr: any[]) { + arr.sort(compareNum) + + return [Math.floor(arr[0]), Math.ceil(arr[arr.length - 1])] +} + +function compareNum(num1: number, num2: number) { + if (num1 < num2) { + return -1 + } else if (num1 > num2) { + return 1 + } else { + return 0 + } +} + +export { gridPoint } diff --git a/src/pages/community/Globe/mainscene/countryMesh/index.ts b/src/pages/community/Globe/mainscene/countryMesh/index.ts new file mode 100644 index 000000000..f46daf367 --- /dev/null +++ b/src/pages/community/Globe/mainscene/countryMesh/index.ts @@ -0,0 +1,45 @@ +import * as THREE from "three" +// @ts-ignore +import { BufferGeometryUtils } from "three/examples/jsm/utils/BufferGeometryUtils.js" + +import { delaunay } from "./delaunay" +import { gridPoint } from "./gridPoint" +import { lon2xyz } from "./math" + +function countryMesh(R: number, polygonArr: any[]) { + var geometryArr: any[] = [] + polygonArr.forEach(obj => { + var polygon = obj[0] + + var pointsArr = gridPoint(polygon) + + var trianglesIndexArr = delaunay(pointsArr, polygon) + + var spherePointsArr: Iterable | any[] | any = [] + pointsArr.forEach((item, i) => { + var pos = lon2xyz(R, item[0], item[1]) + spherePointsArr.push(pos.x, pos.y, pos.z) + }) + var geometry = new THREE.BufferGeometry() + + geometry.index = new THREE.BufferAttribute(new Uint16Array(trianglesIndexArr), 1) + + geometry.attributes.position = new THREE.BufferAttribute(new Float32Array(spherePointsArr), 3) + geometryArr.push(geometry) + }) + + var newGeometry: any = null + if (geometryArr.length === 1) { + newGeometry = geometryArr[0] + } else { + newGeometry = BufferGeometryUtils.mergeBufferGeometries(geometryArr) + } + newGeometry.computeVertexNormals() + // MeshLambertMaterial MeshBasicMaterial + var material = new THREE.MeshLambertMaterial({ + color: 0xffffff, + }) + var mesh = new THREE.Mesh(newGeometry, material) + return mesh +} +export { countryMesh } diff --git a/src/pages/community/Globe/mainscene/countryMesh/math.ts b/src/pages/community/Globe/mainscene/countryMesh/math.ts new file mode 100644 index 000000000..74d1e9545 --- /dev/null +++ b/src/pages/community/Globe/mainscene/countryMesh/math.ts @@ -0,0 +1,17 @@ +function lon2xyz(R: number, longitude: number, latitude: number) { + var lon = (longitude * Math.PI) / 180 + var lat = (latitude * Math.PI) / 180 + lon = -lon + + var x = R * Math.cos(lat) * Math.cos(lon) + var y = R * Math.sin(lat) + var z = R * Math.cos(lat) * Math.sin(lon) + + return { + x: x, + y: y, + z: z, + } +} + +export { lon2xyz } diff --git a/src/pages/community/Globe/mainscene/countryMesh/pointInPolygon.ts b/src/pages/community/Globe/mainscene/countryMesh/pointInPolygon.ts new file mode 100644 index 000000000..f4c15b398 --- /dev/null +++ b/src/pages/community/Globe/mainscene/countryMesh/pointInPolygon.ts @@ -0,0 +1,15 @@ +function pointInPolygon(point: any[], vs: string | any[]) { + var x = point[0], + y = point[1] + var inside = false + for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { + var xi = vs[i][0], + yi = vs[i][1] + var xj = vs[j][0], + yj = vs[j][1] + var intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi + if (intersect) inside = !inside + } + return inside +} +export { pointInPolygon } diff --git a/src/pages/community/Globe/mainscene/line.ts b/src/pages/community/Globe/mainscene/line.ts new file mode 100644 index 000000000..168d8e7e1 --- /dev/null +++ b/src/pages/community/Globe/mainscene/line.ts @@ -0,0 +1,63 @@ +import * as THREE from "three" + +import { countryMesh } from "./countryMesh/index" +import { lon2xyz } from "./countryMesh/math" + +function countryLine(R: number) { + var loader = new THREE.FileLoader() + loader.setResponseType("json") + var group: any = new THREE.Group() + group.meshArr = [] + + var allPointArr: any[] = [] + + loader.load("/files/world.json", function (data: any) { + data?.features.forEach(function (country: { geometry: { type: string; coordinates: any[] }; properties: { name: string } }) { + if (country.geometry.type === "Polygon") { + country.geometry.coordinates = [country.geometry.coordinates] + } + + country.geometry.coordinates.forEach((polygon: any[][][]) => { + var pointArr: any[] = [] + polygon[0].forEach((elem: any[]) => { + var coord = lon2xyz(R, elem[0], elem[1]) + pointArr.push(coord.x, coord.y, coord.z) + }) + + allPointArr.push(pointArr[0], pointArr[1], pointArr[2]) + for (let i = 3; i < pointArr.length; i += 3) { + allPointArr.push(pointArr[i], pointArr[i + 1], pointArr[i + 2], pointArr[i], pointArr[i + 1], pointArr[i + 2]) + } + allPointArr.push(pointArr[0], pointArr[1], pointArr[2]) + }) + var mesh = countryMesh(R * 1.0, country.geometry.coordinates) + group.add(mesh) + group.meshArr.push(mesh) + mesh.name = country.properties.name + }) + let lineMesh = line(allPointArr) + lineMesh.name = "line" + group.add(lineMesh) + }) + return group +} + +function line(pointArr: any[] | Iterable) { + var geometry = new THREE.BufferGeometry() + + var vertices = new Float32Array(pointArr) + + var attribue = new THREE.BufferAttribute(vertices, 3) + + geometry.attributes.position = attribue + + var material = new THREE.LineBasicMaterial({ + color: 0x000000, + }) + + var line = new THREE.LineSegments(geometry, material) + + return line +} + +export { countryLine } diff --git a/src/pages/community/Globe/mainscene/pointMesh.ts b/src/pages/community/Globe/mainscene/pointMesh.ts new file mode 100644 index 000000000..cb874c175 --- /dev/null +++ b/src/pages/community/Globe/mainscene/pointMesh.ts @@ -0,0 +1,58 @@ +import * as THREE from "three" +import { CSS2DObject } from "three/examples/jsm/renderers/CSS2DRenderer.js" + +import { lon2xyz } from "./countryMesh/math" + +const textureLoader = new THREE.TextureLoader() +const texture = textureLoader.load("/imgs/community/pin.svg") + +const geometry = new THREE.PlaneGeometry(1, 1) + +function createPointMesh(R: number, lon: number, lat: number): THREE.Mesh { + const material = new THREE.MeshBasicMaterial({ + color: 0x22ffcc, + map: texture, + transparent: true, + depthWrite: false, + }) + + const mesh = new THREE.Mesh(geometry, material) + const coord = lon2xyz(R * 1.001, lon, lat) + const size = R * 0.07 + mesh.scale.set(size, size, size) + mesh.position.set(coord.x, coord.y + 6, coord.z) + + const coordVec3 = new THREE.Vector3(coord.x, coord.y, coord.z).normalize() + const meshNormal = new THREE.Vector3(0, 0, 1) + mesh.quaternion.setFromUnitVectors(meshNormal, coordVec3) + + return mesh +} + +function createImg(param: { src: string; style: Partial }): CSS2DObject { + const img = document.createElement("img") + img.src = param.src + + Object.assign(img.style, param.style) + + return new CSS2DObject(img) +} + +function createPointLabel(R: number, lon: number, lat: number): CSS2DObject { + const coord = lon2xyz(R * 1.001, lon, lat) + + const img = createImg({ + src: "/imgs/community/pin.svg", + style: { + height: "20px", + position: "relative", + pointerEvents: "auto", + }, + }) + + img.position.set(coord.x, coord.y, coord.z) + + return img +} + +export { createPointMesh, createPointLabel } diff --git a/src/pages/community/Globe/mainscene/scene.tsx b/src/pages/community/Globe/mainscene/scene.tsx new file mode 100644 index 000000000..4602064f3 --- /dev/null +++ b/src/pages/community/Globe/mainscene/scene.tsx @@ -0,0 +1,254 @@ +import { createRoot } from "react-dom/client" +import * as THREE from "three" +import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js" +import { CSS2DObject, CSS2DRenderer } from "three/examples/jsm/renderers/CSS2DRenderer.js" + +import Tag from "./Tag" +import { countryLine } from "./line" +import { createPointLabel, createPointMesh } from "./pointMesh" + +const MAX_SIZE = 700 +let rendererWidth = Math.min(window.innerWidth, MAX_SIZE) +let rendererHeight = rendererWidth +let moveLeft = 0 +let moveTop = 0 + +let labelPos, labelTitle: CSS2DObject | null + +const R = 110 +const scene = new THREE.Scene() +const earth = new THREE.Group() +const cityslabels = new THREE.Group() +let chooseMesh: THREE.Mesh | null = null + +let renderer = initRenderer() +let labelRenderer = initLabelRenderer(rendererWidth, rendererHeight, moveTop, moveLeft) +let camera = initCamera(rendererWidth, rendererHeight) +initScene() +initControls() +render() + +function initRenderer() { + const renderer = new THREE.WebGLRenderer({ antialias: true }) + renderer.setPixelRatio(window.devicePixelRatio) + renderer.setSize(rendererWidth, rendererHeight) + renderer.setClearColor(0xfef8f4, 1) + return renderer +} + +function initLabelRenderer(width: number, height: number, top: number, left: number) { + const labelRenderer = new CSS2DRenderer() + labelRenderer.setSize(width, height) + labelRenderer.domElement.style.position = "absolute" + labelRenderer.domElement.style.top = `${top - 16}px` + labelRenderer.domElement.style.left = `${left}px` + setTimeout(() => { + const labelElement = document.querySelector("#community-container") + if (!labelElement) return + labelElement.insertBefore(labelRenderer.domElement, labelElement.firstChild) + }, 1000) + return labelRenderer +} + +function initCamera(width: number, height: number) { + const k = width / height + const s = 120 + const camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000) + camera.position.set(300, 185, -200) + camera.lookAt(0, 0, 0) + return camera +} + +function initScene() { + scene.add(earth) + scene.add(cityslabels) + + const ambient = new THREE.AmbientLight(0xffffff, 1) + scene.add(ambient) + + earth.add(createSphereMesh(R)) + earth.add(countryLine(R * 1.001)) + ;(window as any).tours = createTorus() + // earth.add(createTorus()); + earth.add((window as any).tours) +} + +function initControls() { + const controls = new OrbitControls(camera, renderer.domElement) + controls.autoRotate = false + controls.autoRotateSpeed = 0 + controls.enableZoom = false + + controls.addEventListener("change", () => { + resetSelection() + }) +} + +function resetSelection() { + // chooseMesh?.material?.color.set(0xffffff); + // earth.clear(); + ;(chooseMesh?.material as THREE.MeshBasicMaterial)?.color.set(0xffffff) + if (labelTitle) { + earth.remove(labelTitle) + labelTitle = null + } +} + +function createSphereMesh(r: number) { + const geometry = new THREE.SphereGeometry(r, 40, 40) + const material = new THREE.MeshLambertMaterial({ color: 0xedcca2 }) + return new THREE.Mesh(geometry, material) +} + +function createTorus() { + const torusGeometry = new THREE.TorusGeometry(R + 0.2, 0.2, 16, 100) + const torusMaterial = new THREE.MeshBasicMaterial({ color: 0x000000 }) + return new THREE.Mesh(torusGeometry, torusMaterial) +} + +function render() { + requestAnimationFrame(render) + labelRenderer.render(scene, camera) + renderer.render(scene, camera) + ;(window as any).tours.lookAt(camera.position) +} + +function getDirection(x: number, y: number, width: number, height: number) { + if (window.innerWidth < 900) { + // Screen width is less than 900px, return upper or lower part + const centerY = height / 2 + if (y < centerY) { + return "down" + } else { + return "up" + } + } else { + // Screen width is 900px or greater, return left or right side + const centerX = width / 2 + if (x < centerX) { + return "right" + } else { + return "left" + } + } +} + +async function chooseLabel(chooseLabel: any, event: any) { + resetSelection() + + labelPos = new THREE.Vector3(chooseLabel.position.x, chooseLabel.position.y - 12, chooseLabel.position.z) + + const canvas = window.document.querySelector("canvas")! + const rect = canvas.getBoundingClientRect() + const x = event.clientX - rect.left + const y = event.clientY - rect.top + + const direction = getDirection(x, y, rendererWidth, rendererWidth) + + labelTitle = await createTag({ + data: chooseLabel, + direction, + }) + + if (labelTitle) { + earth.add(labelTitle) + setPosition(labelTitle, labelPos) + } else { + console.error("Failed to create labelTitle. It is null.") + } + + chooseMesh = getObjectByName(earth, chooseLabel?.name) + if (chooseMesh) { + ;(chooseMesh.material as THREE.MeshBasicMaterial).color.set(0xd2fcf6) + } +} + +function getObjectByName(root: THREE.Object3D, name: string): THREE.Mesh | null { + if (root.name === name && root instanceof THREE.Mesh) { + return root + } + for (const child of root.children) { + const found = getObjectByName(child, name) + if (found) return found + } + return null +} + +function createTag({ data, direction }: any): Promise { + return new Promise(resolve => { + const container = document.createElement("div") + document.body.appendChild(container) + + const root = createRoot(container) + root.render( + { + resolve(obj) + setTimeout(() => { + root.unmount() + try { + document.body.removeChild(container) + } catch (error) { + console.error("Failed to remove child node:", error) + } + }, 0) + }} + />, + ) + }) +} + +function setPosition(label: CSS2DObject, position: THREE.Vector3) { + label.position.copy(position) +} + +function initCityLabels(citydatas: any[]) { + citydatas.forEach(obj => { + const mesh: any = createPointMesh(R, obj.longitude, obj.latitude) + const label = createPointLabel(R, obj.longitude, obj.latitude) + mesh.linkLabel = label + cityslabels.add(label) + cityslabels.add(mesh) + + mesh.name = obj.name + mesh.visible = false + mesh.eventName = obj.text + mesh.cover = obj.pictures + mesh.city = obj.city + mesh.eventInfo = obj + + label.element.addEventListener("click", e => chooseLabel(mesh, e)) + }) + + function checkVisibility() { + cityslabels.traverse(item => { + if ((item as any).linkLabel) isObjectVisible(item, camera) + }) + + requestAnimationFrame(checkVisibility) + } + + checkVisibility() +} + +function isObjectVisible(object: any, camera: THREE.Camera) { + const distance = calculateDistance(object.position, camera.position) + object.linkLabel.element.style.opacity = distance > 400 ? 0 : 1 +} + +function calculateDistance(pointA: THREE.Vector3, pointB: THREE.Vector3) { + return pointA.distanceTo(pointB) +} + +function resizeRender(width: number, height: number, left: number, top: number) { + labelRenderer.setSize(width, height) + renderer.setSize(width, height) + + labelRenderer.domElement.style.top = `${top - 10}px` + labelRenderer.domElement.style.left = `${left}px` + labelRenderer.domElement.style.overflow = "visible" +} + +export { renderer, resizeRender, initCityLabels, initLabelRenderer } diff --git a/src/pages/community/Join/Card.tsx b/src/pages/community/Join/Card.tsx new file mode 100644 index 000000000..2b9a3fe53 --- /dev/null +++ b/src/pages/community/Join/Card.tsx @@ -0,0 +1,84 @@ +import { makeStyles } from "tss-react/mui" + +import { Box, Card, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ExternaLinkIcon } from "@/assets/svgs/common/external-link.svg" +import Link from "@/components/Link" + +const useStyles = makeStyles()(theme => ({ + card: { + backgroundColor: theme.palette.themeBackground.normal, + height: "100%", + padding: "2.4rem", + paddingBottom: "5.4rem", + borderRadius: "2.5rem", + cursor: "pointer", + "&:hover": { + backgroundColor: theme.palette.themeBackground.highlight, + }, + [theme.breakpoints.down("md")]: { + padding: "2rem", + }, + }, + header: { + display: "flex", + flexDirection: "column", + gap: "6.2rem", + [theme.breakpoints.down("md")]: { + flexDirection: "row-reverse", + justifyContent: "space-between", + }, + }, +})) + +const ContributeCard = props => { + const { title, content, icon, href, ...restProps } = props + + const { classes } = useStyles() + + return ( + + + + + + + + + + + {title} + + + + {content} + + + + + ) +} + +export default ContributeCard diff --git a/src/pages/community/Join/CardLarge.tsx b/src/pages/community/Join/CardLarge.tsx new file mode 100644 index 000000000..c1f201673 --- /dev/null +++ b/src/pages/community/Join/CardLarge.tsx @@ -0,0 +1,99 @@ +import { makeStyles } from "tss-react/mui" + +import { Box, Button, Card, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as CombinationMarkIcon } from "@/assets/svgs/community/combination_mark.svg" +import { ReactComponent as ScrollGenericIcon } from "@/assets/svgs/community/scroll_generic.svg" +import { ReactComponent as ArrowSvg } from "@/assets/svgs/ecosystem/arrow.svg" +import Link from "@/components/Link" + +const useStyles = makeStyles()(theme => ({ + card: { + backgroundColor: theme.palette.themeBackground.normal, + height: "100%", + padding: "4.1rem", + borderRadius: "2.5rem", + cursor: "pointer", + gridColumn: "span 3", + "&:hover": { + backgroundColor: theme.palette.themeBackground.highlight, + }, + [theme.breakpoints.down("md")]: { + padding: "2rem", + }, + }, + action: { + borderRadius: "0.8rem", + padding: "0.8rem 2.4rem", + fontSize: "1.8rem", + height: "4rem", + width: "21.6rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + width: "20rem", + marginBottom: "3.3rem", + }, + }, +})) + +const ContributeCard = props => { + const { title, content, icon, href, ...restProps } = props + + const { classes } = useStyles() + + return ( + + + + + + + Learn, build and innovate + + + Complete our level up challenges and join a study group of dedicated developers + + + + + + + + + + ) +} + +export default ContributeCard diff --git a/src/pages/community/Join/index.tsx b/src/pages/community/Join/index.tsx new file mode 100644 index 000000000..e444cb94b --- /dev/null +++ b/src/pages/community/Join/index.tsx @@ -0,0 +1,55 @@ +import { makeStyles } from "tss-react/mui" + +import { Typography } from "@mui/material" + +import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" +import SectionWrapper from "@/components/SectionWrapper" +import { COMMUNITY_EXPLORER_LIST } from "@/constants/community" + +import Card from "./Card" +import CardLarge from "./CardLarge" + +const useStyles = makeStyles()(theme => ({ + flex: { + marginTop: "4.8rem", + display: "grid", + gridTemplateColumns: "repeat(3, 1fr)", + gridGap: "3rem", + [theme.breakpoints.down("md")]: { + gridTemplateColumns: "100%", + gridGap: "2rem", + marginTop: "2rem", + }, + }, + large: { + gridColumn: "span 3", + [theme.breakpoints.down("md")]: { + gridColumn: "span 1", + }, + }, + flexItem: { + flex: 1, + alignSelf: "stretch", + }, +})) + +const Join = () => { + const { classes } = useStyles() + return ( + + Join our community + + + + + {COMMUNITY_EXPLORER_LIST.map(item => ( + + + + ))} + + + ) +} + +export default Join diff --git a/src/pages/community/index.tsx b/src/pages/community/index.tsx new file mode 100644 index 000000000..0595b9e4e --- /dev/null +++ b/src/pages/community/index.tsx @@ -0,0 +1,29 @@ +import { makeStyles } from "tss-react/mui" + +import { Box } from "@mui/material" + +import Events from "./Events" +import Globe from "./Globe" +import Join from "./Join" + +const useStyles = makeStyles()(theme => ({ + container: { + marginTop: "-6.5rem", + paddingTop: "6.5rem", + overflow: "hidden", + }, +})) + +const Community = () => { + const { classes } = useStyles() + + return ( + + + + + + ) +} + +export default Community diff --git a/src/pages/developer-nft/coming-soon/CheckElegbility/index.tsx b/src/pages/developer-nft/coming-soon/CheckElegbility/index.tsx index 9afcacea7..f790cfd55 100644 --- a/src/pages/developer-nft/coming-soon/CheckElegbility/index.tsx +++ b/src/pages/developer-nft/coming-soon/CheckElegbility/index.tsx @@ -15,7 +15,7 @@ const L2_SCAN_URI = requireEnv("REACT_APP_L2_SCAN_URI") const UNIFRA_API_KEY = requireEnv("REACT_APP_UNIFRA_API_KEY") const CheckElegbility = () => { - const { connect, chainId, walletCurrentAddress } = useRainbowContext() + const { connect, walletCurrentAddress } = useRainbowContext() const { isMobile } = useCheckViewport() @@ -70,7 +70,7 @@ const CheckElegbility = () => { {renderCheck()} ) : ( <> - {chainId ? ( + {walletCurrentAddress ? ( diff --git a/src/pages/developer-nft/coming-soon/Header/index.tsx b/src/pages/developer-nft/coming-soon/Header/index.tsx index 34beef4de..fe4e9c156 100644 --- a/src/pages/developer-nft/coming-soon/Header/index.tsx +++ b/src/pages/developer-nft/coming-soon/Header/index.tsx @@ -65,7 +65,7 @@ const Header = () => { width: ["26rem", "31.2rem"], }} > - {SCROLL_ORIGINS_NFT} + {SCROLL_ORIGINS_NFT} {phrase === "in-progress" ? "Program ends in" : "NFT releases in"} diff --git a/src/pages/developer-nft/coming-soon/index.tsx b/src/pages/developer-nft/coming-soon/index.tsx index 28b97a449..c331200e9 100644 --- a/src/pages/developer-nft/coming-soon/index.tsx +++ b/src/pages/developer-nft/coming-soon/index.tsx @@ -1,10 +1,8 @@ import { Stack } from "@mui/material" import Alert from "@/components/Alert/NFTAlert" -import GlobalComponents from "@/components/GlobalComponents" import SectionWrapper from "@/components/SectionWrapper" import { MintableDate, SCROLL_ORIGINS_NFT } from "@/constants" -import BridgeContextProvider from "@/contexts/BridgeContextProvider" import useNFTStore from "@/stores/nftStore" import { formatDate } from "@/utils" @@ -18,35 +16,32 @@ const ComingSoon = () => { const { phrase } = useNFTStore() return ( - - - theme.palette.primary.contrastText }, - }} - > -
    - {phrase === "in-progress" && } - - - {phrase === "in-progress" ? ( - - ) : ( - - - {SCROLL_ORIGINS_NFT} will be claimable on {formatDate(MintableDate)}. - - - )} -
    -
    + theme.palette.primary.contrastText }, + }} + > +
    + {phrase === "in-progress" && } + + + {phrase === "in-progress" ? ( + + ) : ( + + + {SCROLL_ORIGINS_NFT} will be claimable on {formatDate(MintableDate)}. + + + )} +
    ) } diff --git a/src/pages/developer-nft/mint/home/ReadyToMint.tsx b/src/pages/developer-nft/mint/home/ReadyToMint.tsx index 66b77ee14..55f460259 100644 --- a/src/pages/developer-nft/mint/home/ReadyToMint.tsx +++ b/src/pages/developer-nft/mint/home/ReadyToMint.tsx @@ -1,4 +1,5 @@ import { useState } from "react" +import Countdown, { zeroPad } from "react-countdown" import ReactGA from "react-ga4" import { Box, Stack, Typography } from "@mui/material" @@ -10,7 +11,7 @@ import Button from "@/components/Button" import Link from "@/components/Link" import RequestWarning from "@/components/RequestWarning" import { ANNOUNCING_SCROLL_ORIGINS_NFT, ContractReleaseDate, DESIGNING_SCROLL_ORIGINS } from "@/constants" -import { CHAIN_ID, L2_NAME, SCROLL_ORIGINS_NFT } from "@/constants" +import { CHAIN_ID, L2_NAME, MintableEndDate, SCROLL_ORIGINS_NFT } from "@/constants" import { useRainbowContext } from "@/contexts/RainbowProvider" import useCheckViewport from "@/hooks/useCheckViewport" import useNFTStore from "@/stores/nftStore" @@ -65,14 +66,21 @@ const MintHome = props => { }) } - const renderAction = () => { + const renderAction = (end = false) => { if (chainId === CHAIN_ID.L2) { + if (end) { + return ( + + ) + } return ( ) - } else if (chainId) { + } else if (walletCurrentAddress) { return ( - - - + + ) } export default Header diff --git a/src/pages/ecosystem/Highlights/HighlightList/Card.tsx b/src/pages/ecosystem/Highlights/HighlightList/Card.tsx new file mode 100644 index 000000000..36bf24f93 --- /dev/null +++ b/src/pages/ecosystem/Highlights/HighlightList/Card.tsx @@ -0,0 +1,81 @@ +import { useNavigate } from "react-router-dom" + +import { Box, Button, SvgIcon, Typography } from "@mui/material" +import { styled } from "@mui/system" + +import { ReactComponent as ArrowSvg } from "@/assets/svgs/ecosystem/arrow.svg" +import WebpImage from "@/components/WebpImage" + +const Card = styled(Box)(({ theme }) => ({ + backgroundColor: "#FFF8F3", + borderRadius: "2rem", + display: "flex", + flexDirection: "column", + gap: "2rem", + padding: "16px 16px 24px 16px", + cursor: "pointer", + color: theme.palette.text.primary, + [theme.breakpoints.down("lg")]: { + gap: "2rem", + }, +})) + +const BlogTitle = styled(Typography)(({ theme }) => ({ + fontWeight: 600, + fontSize: "2.4rem", + lineHeight: "3.6rem", + textAlign: "center", + verticalAlign: "bottom", + marginBottom: "0.6rem", + + display: "-webkit-box", + WebkitBoxOrient: "vertical", + WebkitLineClamp: "2", + overflow: "hidden", +})) + +const BlogPoster = styled(WebpImage)(({ theme }) => ({ + width: "100%", + maxHeight: "23rem", + borderRadius: "1rem", + overflow: "hidden", + [theme.breakpoints.down("md")]: { + gridRow: 1, + borderRadius: "1.5rem", + }, +})) + +const ReadButton = styled(Button)(({ theme }) => ({ + gridArea: "action", + alignSelf: "center", + borderRadius: "0.8rem", + padding: "0.8rem 2.4rem", + fontSize: "1.8rem", + height: "4rem", + width: "10.6rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + justifySelf: "flex-start", + fontSize: "1.6rem", + width: "9.6rem", + }, +})) + +const BlogCard = ({ blog }) => { + const navigate = useNavigate() + const handleClick = () => { + navigate("/blog/" + blog.slug) + } + + return ( + + + {blog.title} + }> + Read + + + ) +} + +export default BlogCard diff --git a/src/pages/ecosystem/Highlights/HighlightList/index.tsx b/src/pages/ecosystem/Highlights/HighlightList/index.tsx new file mode 100644 index 000000000..f807be2a8 --- /dev/null +++ b/src/pages/ecosystem/Highlights/HighlightList/index.tsx @@ -0,0 +1,68 @@ +import { Autoplay, Pagination } from "swiper/modules" +import { Swiper, SwiperSlide } from "swiper/react" + +import { styled } from "@mui/system" + +import useCheckViewport from "@/hooks/useCheckViewport" +import Data from "@/pages/blog/data.json" + +import BlogCard from "./Card" + +const StyledSwiper = styled(Swiper)(({ theme }) => ({ + marginTop: "4.4rem", + "&.swiper": { + paddingBottom: "5rem", + }, + "& .swiper-pagination-bullet": { + backgroundColor: "transparent", + border: "1px solid #fff", + width: "1.2rem", + height: "1.2rem", + opacity: 1, + margin: "0 1rem !important", + }, + "& .swiper-pagination-bullet-active": { + backgroundColor: "#fff", + }, + [theme.breakpoints.down("sm")]: { + marginTop: "2.4rem", + }, +})) + +const Carousel = props => { + const { isPortrait, isTabletLandscape } = useCheckViewport() + let slidesPerView = 3 + if (isTabletLandscape) { + slidesPerView = 2 + } else if (isPortrait) { + slidesPerView = 1 + } + + const filteredData = Data.filter(blog => blog.type === "Ecosystem highlights" && blog.language === "en") + + return ( + + {filteredData.map(blog => ( + + + + ))} + + ) +} + +export default Carousel diff --git a/src/pages/ecosystem/Highlights/index.tsx b/src/pages/ecosystem/Highlights/index.tsx new file mode 100644 index 000000000..931190b9c --- /dev/null +++ b/src/pages/ecosystem/Highlights/index.tsx @@ -0,0 +1,66 @@ +import { useEffect } from "react" +import { useLocation, useNavigate } from "react-router-dom" + +import { Stack, Typography } from "@mui/material" + +import Button from "@/components/Button" +import SectionWrapper from "@/components/SectionWrapper" +import { ECOSYSTEM_PAGE_SYMBOL } from "@/constants" +import useCheckViewport from "@/hooks/useCheckViewport" + +import HighlightList from "./HighlightList" + +const Highlights = () => { + const { isMobile, isTablet } = useCheckViewport() + const { hash } = useLocation() + const navigate = useNavigate() + + useEffect(() => { + if (hash) { + const targetEl = document.getElementById(`${ECOSYSTEM_PAGE_SYMBOL}-${hash.slice(1)}`) + if (targetEl) { + targetEl.scrollIntoView({ + behavior: "smooth", + }) + } + } + }, [hash]) + + return ( + + + + Ecosystem highlights + + {isMobile ? null : ( + + )} + + + + ) +} +export default Highlights diff --git a/src/pages/ecosystem/Protocols/ProtocolList/ProtocolCard.tsx b/src/pages/ecosystem/Protocols/ProtocolList/ProtocolCard.tsx index 8c4379918..6c0c57f27 100644 --- a/src/pages/ecosystem/Protocols/ProtocolList/ProtocolCard.tsx +++ b/src/pages/ecosystem/Protocols/ProtocolList/ProtocolCard.tsx @@ -4,7 +4,7 @@ import { makeStyles } from "tss-react/mui" import { Box, Button, Stack, SvgIcon, Typography } from "@mui/material" -import { ecosystemListLogoUrl } from "@/apis/ecosystem" +import { fetchEcosystemProtocolLogo } from "@/apis/ecosystem" import { ReactComponent as ArrowSvg } from "@/assets/svgs/ecosystem/arrow.svg" import { ReactComponent as TwitterSvg } from "@/assets/svgs/ecosystem/twitter.svg" import LinesEllipsis from "@/components/LinesEllipsis" @@ -155,7 +155,7 @@ const ProtocolCard = props => { gridArea: "logo", }} > - {name} + {name} {name} @@ -183,21 +183,25 @@ const ProtocolCard = props => { )} - -  ...  - - More - - - } - basedOn="words" - onReflow={handleReflow} - /> + {desc ? ( + +  ...  + + More + + + } + basedOn="words" + onReflow={handleReflow} + /> + ) : ( + (empty) + )} {!isDesktop && ( diff --git a/src/pages/ecosystem/Protocols/ProtocolList/index.tsx b/src/pages/ecosystem/Protocols/ProtocolList/index.tsx index 7d6b3de21..af4f87842 100644 --- a/src/pages/ecosystem/Protocols/ProtocolList/index.tsx +++ b/src/pages/ecosystem/Protocols/ProtocolList/index.tsx @@ -89,7 +89,7 @@ const ProtocolList = props => { } else { const anchorEl = document.querySelector(".ecosystem-protocols-title") if (isAboveScreen(anchorEl)) { - anchorEl?.scrollIntoView({ behavior: "smooth", block: "start" }) + anchorEl?.scrollIntoView({ behavior: "smooth" }) } setEcosystemList(data) } diff --git a/src/pages/ecosystem/Protocols/SeachInput.tsx b/src/pages/ecosystem/Protocols/SeachInput.tsx index 1d6aade98..fad14bf7e 100644 --- a/src/pages/ecosystem/Protocols/SeachInput.tsx +++ b/src/pages/ecosystem/Protocols/SeachInput.tsx @@ -4,7 +4,7 @@ import { useTheme } from "@mui/material/styles" import { ReactComponent as SearchSvg } from "@/assets/svgs/ecosystem/search.svg" const SearchInput = props => { - const { sticky, top, ...restProps } = props + const { sticky, top, dark, className, ...restProps } = props const theme = useTheme() return ( @@ -22,24 +22,31 @@ const SearchInput = props => { maxWidth: "32rem", height: "4.8rem", borderRadius: "2.4rem", - border: theme => `1px solid ${theme.palette.text.primary}`, - backgroundColor: theme => theme.palette.background.default, + border: theme => (dark ? "none" : `1px solid ${theme.palette.text.primary}`), + backgroundColor: theme => (dark ? theme.palette.themeBackground.tag : theme.palette.background.default), padding: "0.8rem 2.4rem", [theme.breakpoints.down("md")]: { gridRow: "2 / 3", + maxWidth: "100%", }, [theme.breakpoints.down("sm")]: { padding: "0.8rem 1.6rem", }, }} + className={className} > - + (dark ? theme.palette.background.default : theme.palette.text.primary) }} + component={SearchSvg} + inheritViewBox + > (dark ? theme.palette.background.default : theme.palette.text.primary), }} placeholder="Search" {...restProps} diff --git a/src/pages/ecosystem/Protocols/index.tsx b/src/pages/ecosystem/Protocols/index.tsx index 03f4ad319..bb63cefa6 100644 --- a/src/pages/ecosystem/Protocols/index.tsx +++ b/src/pages/ecosystem/Protocols/index.tsx @@ -5,9 +5,8 @@ import { withStyles } from "tss-react/mui" import { Box, Stack, Typography } from "@mui/material" import useScrollTrigger from "@mui/material/useScrollTrigger" -import Button from "@/components/Button" import SectionWrapper from "@/components/SectionWrapper" -import { ECOSYSTEM_NETWORK_LIST, LIST_YOUR_DAPP_LINK, NORMAL_HEADER_HEIGHT } from "@/constants" +import { ECOSYSTEM_NETWORK_LIST, ECOSYSTEM_PAGE_SYMBOL, NORMAL_HEADER_HEIGHT } from "@/constants" import useCheckViewport from "@/hooks/useCheckViewport" import Category from "./Category" @@ -35,7 +34,7 @@ const Grid = withStyles(Box, theme => ({ const Protocols = () => { const trigger = useScrollTrigger() - const { isMobile, isTablet, isLandscape } = useCheckViewport() + const { isLandscape } = useCheckViewport() const [searchInput, setSearchInput] = useState("") const [searchParams, setSearchParams] = useState({ category: "All categories", @@ -73,7 +72,7 @@ const Protocols = () => { setSearchParams(pre => ({ ...pre, page: 1, - keyword: searchInput, + keyword: searchInput.trim(), })) }, 5e2, @@ -81,8 +80,7 @@ const Protocols = () => { ) const handleChangeKeyword = e => { - const nextValue = e.target.value.trim() || "" - setSearchInput(nextValue) + setSearchInput(e.target.value) } const handleChangeNetwork = value => { setSearchParams(pre => ({ @@ -108,11 +106,8 @@ const Protocols = () => { > Browse all protocols - - + diff --git a/src/pages/ecosystem/index.tsx b/src/pages/ecosystem/index.tsx index 3be864abc..b45b0896d 100644 --- a/src/pages/ecosystem/index.tsx +++ b/src/pages/ecosystem/index.tsx @@ -1,11 +1,13 @@ import Contribute from "./Contribute" import Header from "./Header" +import Highlights from "./Highlights" import Protocols from "./Protocols" const Ecosystem = () => { return ( <>
    + diff --git a/src/pages/landingpage/Blog/index.tsx b/src/pages/landingpage/Blog/index.tsx index 817266ac8..ff902a43c 100644 --- a/src/pages/landingpage/Blog/index.tsx +++ b/src/pages/landingpage/Blog/index.tsx @@ -1,5 +1,7 @@ import { makeStyles } from "tss-react/mui" +import { Typography } from "@mui/material" + import Button from "@/components/Button" import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" import SectionHeader from "@/components/SectionHeader" @@ -8,48 +10,74 @@ import StoryCard from "@/pages/ourStory/BuildingStory/StoryCard" const STORIES = [ { - cover: "/imgs/homepage/blog-cover-1.svg", + cover: "/imgs/homepage/landing-blog-1.webp", title: "Build with Scroll: Quickstart Guide", content: "Check out our documentation and start developing and deploying on Scroll right away with all of your favorite tools for building and testing smart contracts.", href: "https://docs.scroll.io/en/home/", imageTitle: ( <> - Build

    - with Scroll + + Build with Scroll + + + Quickstart Guide + ), }, { - title: "Scroll's Security Measures", - content: "At Scroll, security has always been our top priority guiding every decision we make.", - href: "/blog/scrolls-security-measures", + title: "Navigating the Future of Scroll", + content: "Dive into our latest reflections, strategic advancements and plans for the future of Scroll.", + href: "/blog/scroll-everyone-everywhere", }, { - title: "A Letter from Scroll: Mainnet is Here!", - content: "As we open the doors to Mainnet, our co-founders share what it took to reach this milestone and where we go from here. ", - href: "/blog/founderLetter", + title: "Latest Tech Updates", + content: "Explore how Scroll's Darwin upgrade is redefining efficiency by reducing gas fees with advanced proof aggregation.", + href: "/blog/proof-recursion-scrolls-darwin-upgrade", }, { - title: "Announcing the Scroll Origins NFT", + title: "Explore Scroll's Thriving Ecosystem", content: - "To commemorate our launch, we are unveiling Scroll Origins, an NFT mint to celebrate our earliest builders who have been a part of our journey from the beginning.", - href: "/developer-nft", + "Join the growing network of developers and innovators building on Scroll, where over 500 projects leverage our zk-tech and the fastest finality in the market.", + href: "/ecosystem", }, { - title: "Scroll’s Architecture Overview", - content: - "This post provides insights into Scroll's architecture evolution, highlighting the transformation of our zkEVM into a comprehensive zkRollup solution for Ethereum.", - href: "/blog/architecture", + title: "Level Up your Developer Skills", + content: "Level up your Solidity skills and development expertise through a series of challenges and enriching developer content.", + href: "https://www.levelup.xyz/", }, { - cover: "/imgs/homepage/blog-cover-2.svg", - title: "Mainnet Launch Livestream", - content: "Hear from Scroll co-founders, engineering and research teams, ecosystem projects, and more. Join us!", - href: "https://launch.scroll.io/", + cover: "/imgs/homepage/landing-blog-2.webp", + title: "Build Your Onchain Story", + content: + "Create your unique on-chain identity on Scroll Canvas, where you can collect and display badges that celebrate your achievements and contributions within the Scroll ecosystem.", + href: "/canvas-and-badges", imageTitle: ( <> - Mainnet

    Housewarming

    Party + + Scroll Canvas + + + Build Your

    + Onchain Story +
    ), }, @@ -60,7 +88,7 @@ const useStyles = makeStyles()(theme => ({ display: "grid", gridTemplateColumns: "repeat(4, 1fr)", gridGap: "3rem", - marginTop: "11rem", + marginTop: "12.6rem", [theme.breakpoints.between("md", "lg")]: { gridTemplateColumns: "repeat(2, 1fr)", gridTemplateRows: "repeat(4, 1fr)", @@ -104,10 +132,10 @@ const BuildingStory = () => { const { classes, cx } = useStyles() return ( - + Read more diff --git a/src/pages/landingpage/BuildWithScroll/index.tsx b/src/pages/landingpage/BuildWithScroll/index.tsx new file mode 100644 index 000000000..7f873de1d --- /dev/null +++ b/src/pages/landingpage/BuildWithScroll/index.tsx @@ -0,0 +1,74 @@ +import Img from "react-cool-img" + +import { Stack, SvgIcon, Typography } from "@mui/material" +import { Button as MuiButton } from "@mui/material" + +import FeatureImage1 from "@/assets/images/home/feature-img-1.webp" +import FeatureImage2 from "@/assets/images/home/feature-img-2.webp" +import { ReactComponent as ArrowSvg } from "@/assets/svgs/community/arrow.svg" +import Button from "@/components/Button" +import OrientationToView from "@/components/Motion/OrientationToView" +import SectionHeader from "@/components/SectionHeader" +import SectionWrapper from "@/components/SectionWrapper" +import useCheckViewport from "@/hooks/useCheckViewport" + +const FEATURES = [ + { + icon: FeatureImage1, + title: "Deploy an app", + description: "EVM compatibility enables builders to smoothly deploy their existing application on Scroll using their favorite tools.", + href: "https://docs.scroll.io/en/developers", + }, + { + icon: FeatureImage2, + title: "Deploy a chain", + description: "Scroll SDK makes the process of launching a chain seamless. Own your blockspace, we'll take care of the rest.", + href: "https://docs.scroll.io/en/sdk", + }, +] + +const Feature = () => { + const { isMobile } = useCheckViewport() + const renderFeatures = () => { + return FEATURES.map((feature, featureIdx) => { + return ( + + + + {feature.title} + {feature.description} + } + > + Get started + + + + ) + }) + } + + return ( + + + + Start building + + } + > + + + {renderFeatures()} + + + ) +} + +export default Feature diff --git a/src/pages/landingpage/Partners/index.tsx b/src/pages/landingpage/ExploreEcosystem/Carousel.tsx similarity index 72% rename from src/pages/landingpage/Partners/index.tsx rename to src/pages/landingpage/ExploreEcosystem/Carousel.tsx index e2c4b0d72..18cf0cec5 100644 --- a/src/pages/landingpage/Partners/index.tsx +++ b/src/pages/landingpage/ExploreEcosystem/Carousel.tsx @@ -18,10 +18,6 @@ import Logo_14 from "@/assets/images/home/partner_logo_14.svg" import Logo_15 from "@/assets/images/home/partner_logo_15.svg" import Logo_16 from "@/assets/images/home/partner_logo_16.svg" import Logo_17 from "@/assets/images/home/partner_logo_17.svg" -import { FadeInUp } from "@/components/Animation" -import Button from "@/components/Button" -import SectionHeader from "@/components/SectionHeader" -import SectionWrapper from "@/components/SectionWrapper" interface Partner { id: number @@ -121,8 +117,6 @@ const PARTNER_LIST = [ const MarqueeLeft: Partner[] = [].concat(...Array(2).fill(PARTNER_LIST)) const MarqueeRight: Partner[] = [].concat(...Array(2).fill(PARTNER_LIST)).reverse() -const PartnersContainer = styled(Box)(({ theme }) => ({})) - const MarqueeAnimationLeft = keyframes` 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } @@ -141,6 +135,7 @@ const Marquee = styled(Box)(({ theme }) => ({ const CarouselBox = styled(Box)(({ theme }) => ({ position: "relative", + maxWidth: "100vw", "@media (min-width:1900px)": { "&::before, &::after": { content: "''", @@ -151,11 +146,11 @@ const CarouselBox = styled(Box)(({ theme }) => ({ zIndex: 42, }, "&::before": { - background: "linear-gradient(90deg, #fef8f4 30%, rgba(0, 0, 0, 0) 100%) 0% 0% repeat scroll rgba(0, 0, 0, 0)", + background: "linear-gradient(90deg, #101010 30%, rgba(0, 0, 0, 0) 100%) 0% 0% repeat scroll rgba(0, 0, 0, 0)", left: 0, }, "&::after": { - background: "linear-gradient(270deg, #fef8f4 30%, rgba(0, 0, 0, 0) 100%) 0% 0% repeat scroll rgba(0, 0, 0, 0)", + background: "linear-gradient(270deg, #101010 30%, rgba(0, 0, 0, 0) 100%) 0% 0% repeat scroll rgba(0, 0, 0, 0)", right: 0, }, }, @@ -189,45 +184,26 @@ const Logo = styled("img")(({ theme }) => ({ }, })) -const Carousel = () => ( - - - - {MarqueeLeft.map((item, idx) => ( - - ))} - - - - - {MarqueeRight.map((item, idx) => ( - - ))} - - - -) - -const Partners = () => { +const Carousel = props => { + const { sx } = props return ( - - - - - Explore projects - - } - > - - - - + + + + {MarqueeLeft.map((item, idx) => ( + + ))} + + + + + {MarqueeRight.map((item, idx) => ( + + ))} + + + ) } -export default Partners +export default Carousel diff --git a/src/pages/landingpage/ExploreEcosystem/index.tsx b/src/pages/landingpage/ExploreEcosystem/index.tsx new file mode 100644 index 000000000..7d03d0ffe --- /dev/null +++ b/src/pages/landingpage/ExploreEcosystem/index.tsx @@ -0,0 +1,42 @@ +import { useRef } from "react" + +import { Box, Container } from "@mui/material" + +import Button from "@/components/Button" +import ScrollExpandedBg from "@/components/ScrollExpandedBg" +import SectionHeader from "@/components/SectionHeader" + +import Carousel from "./Carousel" + +const ExploreEcosystem = () => { + const sectionRef = useRef(null) + + return ( + + + + + Explore projects + + } + > + + + + + ) +} + +export default ExploreEcosystem diff --git a/src/pages/landingpage/Feature/index.tsx b/src/pages/landingpage/Feature/index.tsx deleted file mode 100644 index bf7ca65eb..000000000 --- a/src/pages/landingpage/Feature/index.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { Box, Typography } from "@mui/material" -import { styled } from "@mui/system" - -import FeatureIcon1 from "@/assets/images/home/feature_icon_1.png" -import FeatureIcon2 from "@/assets/images/home/feature_icon_2.png" -import FeatureIcon3 from "@/assets/images/home/feature_icon_3.png" -import FeatureIcon4 from "@/assets/images/home/feature_icon_4.png" -import { FadeInUp, SlideInLeft, SlideInRight } from "@/components/Animation" -import Button from "@/components/Button" -import SectionHeader from "@/components/SectionHeader" -import SectionWrapper from "@/components/SectionWrapper" -import WebpImage from "@/components/WebpImage" -import useCheckViewport from "@/hooks/useCheckViewport" - -const FEATURES = [ - { - icon: FeatureIcon1, - title: "EVM-compatibility for seamless scaling", - description: - "Scroll is designed by and for Ethereum developers. A swift, reliable and scalable Layer 2 blockchain, Scroll extends Ethereum's capabilities, enabling apps to scale without any surprises. Thanks to bytecode-level compatibility, existing Ethereum apps can migrate onto Scroll as-is, and at a significantly reduced cost.", - }, - { - icon: FeatureIcon2, - title: "Collective vision for Ethereum’s future", - description: - "We’ve been building in the open since day one with the Ethereum community. Our open development approach combines the best ideas among value-aligned contributors and leads to more secure and better-designed systems. Scroll is forging a community-driven path to redefine and evolve Ethereum’s roadmap.", - }, - { - icon: FeatureIcon3, - title: "Unwavering security at every layer", - description: - "Scroll uses advanced zero knowledge proof technology, battle-tested EVM models, and rigorous audits to ensure that our foundation is rooted in security and reliability. By prioritizing code security through open source collaboration, Scroll protects our developers and users against vulnerabilities.", - }, - { - icon: FeatureIcon4, - title: "Rooted in technical rigor and credibility", - description: - "Stability and trustworthiness are the building blocks to our network’s growth. Scroll is steadfast in maintaining credible neutrality to reduce imbalances of power within our ecosystem. In pursuit of our long-term vision, we immerse ourselves in solving meaningful and challenging research problems with a focus on technical detail, accuracy, and results.", - }, -] - -const FeatureBox = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - justifyContent: "center", - gap: "10rem", - paddingBottom: "16rem", - "&:nth-of-type(even)": { - flexDirection: "row-reverse", - }, - [theme.breakpoints.down("md")]: { - flexDirection: "column !important", - alignItems: "flex-start", - paddingBottom: "10rem", - gap: "6rem", - "& *": { - textAlign: "center!important", - }, - }, - [theme.breakpoints.up("xl")]: { - paddingBottom: "20rem", - gap: "20rem", - }, -})) - -const FeatureIcon = styled(WebpImage)(({ theme }) => ({ - width: "100%", - display: "inline-block", - [theme.breakpoints.up("md")]: { - maxWidth: "47.4rem", - }, - [theme.breakpoints.down("md")]: { - width: "60%", - }, - [theme.breakpoints.down("sm")]: { - width: "80%", - }, -})) - -const FeatureTitle = styled(Typography)(({ theme }) => ({ - textAlign: "left", - marginBottom: "1.5rem", - [theme.breakpoints.down("md")]: { - marginBottom: "0.8rem", - textAlign: "center", - }, -})) - -const FeatureTextBox = styled(Box)(({ theme }) => ({ - width: "100%", - display: "flex", - flexDirection: "column", - [theme.breakpoints.up("md")]: { - maxWidth: "47.4rem", - }, - [theme.breakpoints.down("md")]: { - width: "100%", - textAlign: "center", - }, -})) - -const Spacer = styled(Box)(({ theme }) => ({ - height: "6.6vw", - minHeight: "10rem", -})) - -const FeatureDescription = styled(Typography)(({ theme }) => ({ - textAlign: "left", - [theme.breakpoints.down("sm")]: { - fontSize: "1.6rem", - }, -})) - -const Feature = () => { - const { isPortrait } = useCheckViewport() - - const ComponentToRender = (featureIdx, elementIdx, children) => { - if (isPortrait) { - return {children} - } - - const isEven = featureIdx % 2 === 0 - - if (elementIdx === 0) { - return isEven ? {children} : {children} - } else { - return isEven ? {children} : {children} - } - } - - const renderFeatures = () => { - return FEATURES.map((feature, featureIdx) => { - return ( - - {ComponentToRender(featureIdx, 0, )} - {ComponentToRender( - featureIdx, - 1, - - {feature.title} - {feature.description} - , - )} - - ) - }) - } - - return ( - - - - Read our story - - } - /> - - - {renderFeatures()} - - ) -} - -export default Feature diff --git a/src/pages/landingpage/GetStart/index.tsx b/src/pages/landingpage/GetStart/index.tsx deleted file mode 100644 index e40cc9264..000000000 --- a/src/pages/landingpage/GetStart/index.tsx +++ /dev/null @@ -1,220 +0,0 @@ -import React, { useEffect, useRef, useState } from "react" - -import { Box, Container as MuiContainer, Typography } from "@mui/material" -import { styled } from "@mui/system" - -import ScalabilityIcon from "@/assets/images/home/start_bridge.png" -import SecurityIcon from "@/assets/images/home/start_link.png" -import EVMEquivalenceIcon from "@/assets/images/home/start_setting.png" -import { FadeInUp } from "@/components/Animation" -import Button from "@/components/Button" -import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" -import SectionHeader from "@/components/SectionHeader" -import { NETWORKS } from "@/constants" -import { isProduction } from "@/utils" - -const tokenName = isProduction ? "ETH" : "testnet ETH" -const l2NetworkName = isProduction ? NETWORKS[1].name : NETWORKS[1].name + " testnet" - -const STEPS = [ - { - icon: ScalabilityIcon, - title: "Bridge your ETH", - description: `You can bridge your ${tokenName} to ${l2NetworkName} using our native bridge or another ecosystem bridge. For a walkthrough, start with the user guide’s setup page.`, - }, - { - icon: SecurityIcon, - title: "Change RPC provider", - description: `To configure your Ethereum tools to Scroll you’ll just need to point your favorite builder tools to a Scroll RPC Provider.`, - }, - { - icon: EVMEquivalenceIcon, - title: "Build with your usual dev tools", - description: "Start building with your favorite toolkit.", - }, -] - -const Container = styled(Box)(({ theme }) => ({ - borderRadius: "40px 40px 0px 0px", - paddingTop: "15.4rem", - maxWidth: "152rem", - paddingBottom: "16rem", - background: "transparent", - display: "flex !important", - justifyContent: "center", - position: "relative", - margin: "0 auto", - "& .MuiContainer-root": { - position: "relative", - maxWidth: "152rem", - }, - [theme.breakpoints.down("md")]: { - paddingTop: "5.4rem", - paddingBottom: "0", - }, -})) - -const InnerBox = styled(MuiContainer)(({ theme }) => ({ - position: "relative", - width: "100%", -})) - -const Background = styled(Box)(({ theme }) => ({ - position: "absolute", - top: "0", - bottom: "0", - width: "100%", - background: "#101010", - willChange: "width, height", - borderRadius: "40px 40px 0px 0px", -})) - -const StepContainer = styled(SuccessionToView)(({ theme }) => ({ - display: "grid", - gridTemplateColumns: "repeat(3, 1fr)", - gap: "2rem", - marginBottom: "13rem", - "& > div:nth-of-type(1) img": { - width: "2.3rem", - }, - "& > div:nth-of-type(2) img": { - width: "3.4rem", - }, - "& > div:nth-of-type(3) img": { - width: "3.3rem", - }, - [theme.breakpoints.down("md")]: { - rowGap: "5.6rem", - gridTemplateColumns: "repeat(2, 1fr)", - marginBottom: "10rem", - }, - [theme.breakpoints.down("sm")]: { - gridTemplateColumns: "1fr", - marginBottom: "5.6rem", - "& > div:nth-of-type(1) img": { - width: "3.3rem", - }, - "& > div:nth-of-type(2) img": { - width: "3.2rem", - }, - "& > div:nth-of-type(3) img": { - width: "2.8rem", - }, - }, -})) - -const StepBox = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - flex: 1, -})) - -const StepIcon = styled("img")(({ theme }) => ({ - height: "4rem", - objectFit: "contain", - marginBottom: "2.2rem", - [theme.breakpoints.down("md")]: { - marginBottom: "1.8rem", - }, - [theme.breakpoints.down("sm")]: { - height: "3rem", - marginBottom: "1.2rem", - }, -})) - -const StepTitle = styled(Typography)(({ theme }) => ({ - textAlign: "left", - color: theme.palette.primary.contrastText, - marginBottom: "2rem", - [theme.breakpoints.down("md")]: { - marginBottom: "1.4rem", - }, - [theme.breakpoints.down("sm")]: { - marginBottom: "0.8rem", - }, -})) - -const StepDescription = styled(Typography)(({ theme }) => ({ - textAlign: "left", - color: theme.palette.primary.contrastText, - maxWidth: "32.6rem", - [theme.breakpoints.down("sm")]: { - fontSize: "1.6rem", - }, -})) - -const GetStart = () => { - const [, setScrollPosition] = useState(0) - const sectionRef = useRef(null) - - useEffect(() => { - const handleScroll = () => { - setScrollPosition(window.scrollY) - } - - window.addEventListener("scroll", handleScroll) - - return () => { - window.removeEventListener("scroll", handleScroll) - } - }, []) - - const calculateWidth = () => { - if (sectionRef.current) { - const rect = sectionRef.current.getBoundingClientRect() - const viewTop = window.innerHeight - - if (rect.top <= viewTop) { - const scrolledDistance = viewTop - rect.top - const percentageScrolled = Math.min(scrolledDistance / viewTop, 1) - let ratio = 0.5 - if (window.innerWidth <= 1920 && window.innerWidth > 1680) { - ratio = 1 - } - if (window.innerWidth > 1920) { - ratio = 2 - } - const widthIncrease = ratio * percentageScrolled - const targetWidthPercentage = 100 + widthIncrease * 100 - - return `${targetWidthPercentage}%` - } - } - return "100%" //default value - } - - return ( - - - - - - Start building - - } - > - - - - {STEPS.map((feature, idx) => ( - - - - {feature.title} - {feature.description} - - - ))} - - - - ) -} - -export default GetStart diff --git a/src/pages/landingpage/Header/components/TextMarquee.tsx b/src/pages/landingpage/Header/components/TextMarquee.tsx deleted file mode 100644 index 6eed76ab6..000000000 --- a/src/pages/landingpage/Header/components/TextMarquee.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useEffect, useRef, useState } from "react" - -import { Box, Typography } from "@mui/material" -import { keyframes, styled } from "@mui/system" - -const TextSlider: React.FC = () => { - const texts = ["Scalable", "Open-Source", "Cryptographically Secured", "Ethereum Aligned", "Modular", "Live on Mainnet"] - - const [currentIndex, setCurrentIndex] = useState(0) - const textRef = useRef(null) - - useEffect(() => { - const handleAnimationIteration = () => { - setCurrentIndex(prevIndex => (prevIndex + 1) % texts.length) - } - - const initialTimer = window.setTimeout(() => { - setCurrentIndex(prevIndex => (prevIndex + 1) % texts.length) - textRef.current?.addEventListener("animationiteration", handleAnimationIteration) - }, 2000) - - return () => { - clearTimeout(initialTimer) - - textRef.current?.removeEventListener("animationiteration", handleAnimationIteration) - } - }, []) - - return ( - - - {texts[currentIndex]} - - - ) -} - -const slideInOutAnimation = keyframes` - 0% { - transform: translateY(100%); - } - 10% { - transform: translateY(0); - } - 90% { - transform: translateY(0); - } - 100% { - transform: translateY(100%); - } -` - -const slideOutAnimation = keyframes` - 0% { - transform: translateY(0); - } - 80% { - transform: translateY(0); - } - 100% { - transform: translateY(100%); - } -` - -const TextContainer = styled(Box)({ - overflow: "hidden", -}) - -const StyledTypography = styled(Typography)(({ theme }) => ({ - display: "inline-block", - background: "#ffdbb0", - color: "#101010", - borderRadius: "1rem", - lineHeight: "9.4rem", - padding: "0 2rem", - textAlign: "center", - animation: `${slideOutAnimation} 1s linear 1s, ${slideInOutAnimation} 2s linear infinite 2s`, - [theme.breakpoints.down("sm")]: { - lineHeight: "4.7rem", - padding: "0 0.9rem", - }, -})) - -export default TextSlider diff --git a/src/pages/landingpage/Header/index.tsx b/src/pages/landingpage/Header/index.tsx index 121e772b9..b5283dbfd 100644 --- a/src/pages/landingpage/Header/index.tsx +++ b/src/pages/landingpage/Header/index.tsx @@ -1,40 +1,22 @@ -// import { Fade } from "react-awesome-reveal" -import { Box, Typography } from "@mui/material" +import { Box, Container, Stack, Typography } from "@mui/material" import { styled } from "@mui/system" -import { FadeInUp } from "@/components/Animation" import Button from "@/components/Button" - -import TextMarquee from "./components/TextMarquee" - -const Container = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: "center", - alignItems: "center", - flexDirection: "column", - paddingTop: "13.8rem", - paddingBottom: "15.5rem", - [theme.breakpoints.down("md")]: { - padding: "6.8rem 2rem 10rem", - }, -})) +import OrientationToView from "@/components/Motion/OrientationToView" +import useCheckViewport from "@/hooks/useCheckViewport" const Title = styled(Typography)(({ theme }) => ({ - marginBottom: "1rem", + fontSize: "6.4rem", + lineHeight: "8.8rem", + fontWeight: 600, + textAlign: "center", [theme.breakpoints.down("md")]: { + fontSize: "4rem", + lineHeight: "5.6rem", marginBottom: "0.4rem", }, })) -const SubTitle = styled(Typography)(({ theme }) => ({ - marginTop: "2rem", - marginBottom: "5rem", - maxWidth: "77rem", - [theme.breakpoints.down("md")]: { - marginBottom: "4rem", - }, -})) - const ButtonContainer = styled(Box)(({ theme }) => ({ display: "flex", gap: "3rem", @@ -45,28 +27,79 @@ const ButtonContainer = styled(Box)(({ theme }) => ({ })) const Header = () => { + const { isMobile, isLandscape } = useCheckViewport() return ( - - - - Scroll is - - - - - Scroll seamlessly extends Ethereum’s capabilities through zero knowledge tech and EVM compatibility. The L2 network built by Ethereum devs - for Ethereum devs. - - - - - - - + <> + ({ + [theme.breakpoints.up("md")]: { + background: "url(/imgs/homepage/landing-bg.webp) center / cover no-repeat", + aspectRatio: "16 / 9", + marginTop: "-6.5rem", + }, + }), + ]} + > + {isLandscape && ( + + + + )} + ({ + [theme.breakpoints.down("md")]: { paddingTop: "7.2rem" }, + [theme.breakpoints.up("md")]: { + position: "absolute", + top: "10rem", + left: "50%", + transform: "translateX(-50%)", + zIndex: 1, + }, + "@media (min-width: 1680px)": { + top: "calc(100vw*0.06 + 6.5rem)", + }, + })} + > + + + + {isMobile ? ( + <> + Homepage of the<br></br> Multichain World + </> + ) : ( + <> + The Homepage of the<br></br> Multichain World + </> + )} + + + Scroll is the leading zero-knowledge rollup.

    Scaling Ethereum for good.{" "} +
    + + + + +
    +
    +
    +
    + {!isLandscape && ( + + )} + ) } diff --git a/src/pages/landingpage/index.tsx b/src/pages/landingpage/index.tsx index 2f3cff439..83049000b 100644 --- a/src/pages/landingpage/index.tsx +++ b/src/pages/landingpage/index.tsx @@ -1,42 +1,18 @@ -import { Box } from "@mui/material" -import { styled } from "@mui/system" - import Blog from "./Blog" -import Feature from "./Feature" -import GetStart from "./GetStart" +import BuildWithScroll from "./BuildWithScroll" +import ExploreEcosystem from "./ExploreEcosystem" import Header from "./Header" -import Partners from "./Partners" import StartBuilding from "./StartBuilding" -const Container = styled(Box)(({ theme }) => ({ - overflow: "hidden", -})) - -const StyledBox = styled(Box)(({ theme }) => ({ - height: "37rem", - width: "100%", - background: "url(/imgs/homepage/section_1_bg.svg) center / cover no-repeat", - borderRadius: "4rem 4rem 0 0", - [theme.breakpoints.down("md")]: { - height: "50.8rem", - background: "url(/imgs/homepage/section_1_bg_mobile.svg) center / cover no-repeat", - }, - [theme.breakpoints.up("xl")]: { - height: "24vw", - }, -})) - const LandingPage = () => { return ( - + <>
    - - - - + + - + ) } diff --git a/src/pages/ourStory/BuildingStory/StoryCard.tsx b/src/pages/ourStory/BuildingStory/StoryCard.tsx index e9fcfbcbd..93d8b8fcb 100644 --- a/src/pages/ourStory/BuildingStory/StoryCard.tsx +++ b/src/pages/ourStory/BuildingStory/StoryCard.tsx @@ -4,7 +4,6 @@ import { Box, Card, CardContent, CardMedia, SvgIcon, Typography } from "@mui/mat import { ReactComponent as ExternaLinkIcon } from "@/assets/svgs/common/external-link.svg" import Link from "@/components/Link" -import ScrollLogo from "@/components/ScrollLogo" import useCheckViewport from "@/hooks/useCheckViewport" const useStyles = makeStyles()((theme, { cover }) => ({ @@ -23,17 +22,13 @@ const useStyles = makeStyles()((theme, { cover }) => ({ cardMediaTitle: { position: "absolute", - top: "2.4rem", + top: "50%", + transform: "translateY(-50%)", left: "3rem", color: theme.palette.primary.contrastText, fontWeight: 600, - fontSize: "5rem", + fontSize: "4rem", lineHeight: 1, - [theme.breakpoints.down("sm")]: { - fontSize: "3.2rem", - top: "1.6rem", - left: "2rem", - }, }, cardMediaLogo: { position: "absolute", @@ -82,9 +77,17 @@ const useStyles = makeStyles()((theme, { cover }) => ({ withCover: { gridTemplateAreas: ` "title icon" - "content content" + "content ." `, gridTemplateRows: "min-content 1fr", + + [theme.breakpoints.down("md")]: { + gridTemplateAreas: ` + "title icon" + "content content" + `, + }, + ".building-story-card-icon": { alignSelf: "flex-start", marginTop: "8px", @@ -112,13 +115,12 @@ const StoryCard = props => { const { isPortrait } = useCheckViewport() return ( - + {cover && ( {imageTitle} - )} diff --git a/src/pages/ourStory/Header/index.tsx b/src/pages/ourStory/Header/index.tsx index ee7565550..0d6556ea9 100644 --- a/src/pages/ourStory/Header/index.tsx +++ b/src/pages/ourStory/Header/index.tsx @@ -59,7 +59,7 @@ const Header = () => { - Our Story + Our Story diff --git a/src/pages/portal/WalletConfig.tsx b/src/pages/portal/WalletConfig.tsx index b71b80419..b103784f7 100644 --- a/src/pages/portal/WalletConfig.tsx +++ b/src/pages/portal/WalletConfig.tsx @@ -8,7 +8,7 @@ import Link from "@/components/Link" import TextButton from "@/components/TextButton" import { NETWORKS } from "@/constants" import { useRainbowContext } from "@/contexts/RainbowProvider" -import { isProduction, switchNetwork } from "@/utils" +import { isMainnet, switchNetwork } from "@/utils" import Descriptions, { DescriptionItem } from "./Descriptions" @@ -59,7 +59,7 @@ const WalletConfig = () => { return ( <> - + {NETWORKS.map((item, index) => ( Layer{index + 1} diff --git a/src/pages/portal/index.tsx b/src/pages/portal/index.tsx index d6f0b62e7..2f0fe743e 100644 --- a/src/pages/portal/index.tsx +++ b/src/pages/portal/index.tsx @@ -13,7 +13,7 @@ const Portal = () => { return ( - {L2_NAME} + {L2_NAME} Get started with our {networkType} now! ({ [theme.breakpoints.down("md")]: { height: "7.4rem", justifyContent: "space-between", - "& > *:nth-last-of-type(1)": { + "& > *:last-child": { textAlign: "right", marginLeft: "0.4rem", marginRight: "1.6rem", diff --git a/src/pages/rollup/components/Header.tsx b/src/pages/rollup/components/Header.tsx index 3e38e840b..049f26d8f 100644 --- a/src/pages/rollup/components/Header.tsx +++ b/src/pages/rollup/components/Header.tsx @@ -6,7 +6,7 @@ const HeaderContainer = styled(Container)(({ theme }) => ({ })) const Title = styled(Typography)(({ theme }) => ({ - fontSize: "7.8rem", + fontSize: "6.4rem", lineHeight: 1, fontWeight: 600, marginTop: "13.8rem", @@ -16,7 +16,7 @@ const Title = styled(Typography)(({ theme }) => ({ marginBottom: "2rem", }, [theme.breakpoints.down("sm")]: { - fontSize: "4rem", + fontSize: "3.6rem", }, })) diff --git a/src/pages/sessions-one/AnchorNavigation/index.tsx b/src/pages/sessions-one/AnchorNavigation/index.tsx new file mode 100644 index 000000000..926ac57d2 --- /dev/null +++ b/src/pages/sessions-one/AnchorNavigation/index.tsx @@ -0,0 +1,174 @@ +import { Fragment, useEffect, useMemo } from "react" + +import { List, ListItem, ListItemButton, ListItemIcon, ListItemText, SvgIcon } from "@mui/material" +import useScrollTrigger from "@mui/material/useScrollTrigger" + +// import { ReactComponent as ActivitiesSvg } from "@/assets/svgs/sessions/activities.svg" +import { ReactComponent as AssetsSvg } from "@/assets/svgs/sessions/assets.svg" +import { ReactComponent as DexSvg } from "@/assets/svgs/sessions/dex.svg" +import { ReactComponent as GasSvg } from "@/assets/svgs/sessions/gas.svg" +import { ReactComponent as LendingSvg } from "@/assets/svgs/sessions/lending.svg" +import { NORMAL_HEADER_HEIGHT } from "@/constants" +import useSessionsStore from "@/stores/sessionsStore" + +const SESSIONS_SECTION = [ + { + label: "Session One", + key: 1, + items: [ + { + label: "Decentralized Exchanges", + key: "dex", + icon: DexSvg, + }, + { + label: "Lending & Borrowing", + key: "lending", + icon: LendingSvg, + }, + // { + // label: "Platform activities", + // key: "activities", + // icon: ActivitiesSvg, + // }, + ], + }, + { + label: "Session Zero", + key: 0, + items: [ + { + label: "Bridged eligible assets", + key: "assets", + icon: AssetsSvg, + }, + { + label: "Gas spent on Scroll", + key: "gas", + icon: GasSvg, + }, + ], + }, +] + +export const SESSIONS_SECTION_MAP = new Proxy(SESSIONS_SECTION, { + get(target, prop: string) { + const [session, section] = prop.split("-").slice(1) + const sessionTarget = target.find(item => item.key === +session)?.items + return sessionTarget?.find(item => item.key === section) + }, +}) + +const AnchorNavigation = props => { + const { mobile, onSeleted } = props + const trigger = useScrollTrigger() + const { selectedSection, changeSelectedSection } = useSessionsStore() + + const stickyTop = useMemo(() => (trigger ? "2rem" : NORMAL_HEADER_HEIGHT), [trigger]) + + useEffect(() => { + if (!mobile) { + const callback: IntersectionObserverCallback = entries => { + for (const entry of entries) { + if (entry.intersectionRatio === 1 || entry.isIntersecting) { + changeSelectedSection(entry.target.id) + break + } + } + } + const observerOptions: IntersectionObserverInit = { + rootMargin: "0px 0px -55%", + } + + const sectionObserver = new IntersectionObserver(callback, observerOptions) + document.querySelectorAll(".session-section").forEach(section => { + sectionObserver.observe(section) + }) + return () => sectionObserver.disconnect() + } + }, [mobile]) + + const handleClick = (sessionKey, sectionKey) => { + changeSelectedSection(`session-${sessionKey}-${sectionKey}`) + + const targetEl = document.getElementById(`session-${sessionKey}-${sectionKey}`) + const offsetTop = targetEl!.getBoundingClientRect().top + window.pageYOffset + + window.scrollTo({ + top: offsetTop - parseFloat(mobile ? "11.2rem" : NORMAL_HEADER_HEIGHT) * 10 - 20, + behavior: "smooth", + }) + + // targetEl?.scrollIntoView({ + // behavior: "smooth", + // block: "start", + // }) + + onSeleted?.() + } + + const renderItems = (items, sessionKey) => { + return items.map(({ icon, key, label }) => ( + ({ + [theme.breakpoints.up("md")]: { + "&:hover": { + color: "primary.main", + backgroundColor: "unset", + }, + }, + }), + ]} + onClick={() => handleClick(sessionKey, key)} + > + + + + + {label} + + + )) + } + return ( + + {SESSIONS_SECTION.map(item => ( + + + {item.label} + + <>{renderItems(item.items, item.key)} + + ))} + + ) +} + +export default AnchorNavigation diff --git a/src/pages/sessions-one/AnchorNavigation/mobile.tsx b/src/pages/sessions-one/AnchorNavigation/mobile.tsx new file mode 100644 index 000000000..4bf37a103 --- /dev/null +++ b/src/pages/sessions-one/AnchorNavigation/mobile.tsx @@ -0,0 +1,149 @@ +import { useEffect, useMemo, useState } from "react" +import { makeStyles } from "tss-react/mui" + +import { Box, Button, ClickAwayListener, Fade, Popper, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as DownTriangleSvg } from "@/assets/svgs/sessions/downTriangle.svg" +import useCheckViewport from "@/hooks/useCheckViewport" +// import { NORMAL_HEADER_HEIGHT } from "@/constants" +import useSessionsStore from "@/stores/sessionsStore" + +import { default as AnchorNavigation, SESSIONS_SECTION_MAP } from "./index" + +const useStyles = makeStyles()(theme => ({ + button: { + width: "100%", + height: "4.8rem", + borderRadius: "0.8rem", + padding: "0 1.6rem !important", + backgroundColor: theme.palette.themeBackground.normal, + border: "none", + fontWeight: 400, + justifyContent: "flex-start", + "&:hover": { + backgroundColor: theme.palette.themeBackground.normal, + border: "none", + color: theme.palette.text.primary, + }, + [theme.breakpoints.down("sm")]: { + borderRadius: "0.8rem", + }, + }, + openButton: { + borderRadius: "0.8rem 0.8rem 0 0", + }, + startIcon: { + marginLeft: 0, + }, + endIcon: { + position: "absolute", + right: "1.6rem", + willChange: "transform", + transition: "transform .2s ease-in-out", + }, + reverseEndIcon: { + transform: "rotate(180deg)", + }, +})) + +const MobileAnchorNavigation = () => { + const { classes, cx } = useStyles() + const { selectedSection, changeSelectedSection } = useSessionsStore() + + const { isPortrait } = useCheckViewport() + + const [anchorEl, setAnchorEl] = useState() + const [popoverWidth, setPopoverWidth] = useState("auto") + + const seletedNavigation = useMemo(() => { + const item = SESSIONS_SECTION_MAP[selectedSection] + return item + }, [selectedSection]) + + useEffect(() => { + const callback: IntersectionObserverCallback = entries => { + for (const entry of entries) { + if (entry.intersectionRatio === 1 || entry.isIntersecting) { + changeSelectedSection(entry.target.id) + break + } + } + } + const observerOptions: IntersectionObserverInit = { + rootMargin: "0px 0px -50%", + } + + const sectionObserver = new IntersectionObserver(callback, observerOptions) + document.querySelectorAll(".session-section").forEach(section => { + sectionObserver.observe(section) + }) + return () => sectionObserver.disconnect() + }, []) + + const handleClick = event => { + setAnchorEl(event.currentTarget) + setPopoverWidth(event.currentTarget.getBoundingClientRect().width + "px") + } + + const handleClose = () => { + setAnchorEl(null) + } + + const handleSeleted = () => { + handleClose() + } + return ( + + + theme.zIndex.appBar + 1 }} + anchorEl={anchorEl} + transition + disablePortal={isPortrait} + popperOptions={{ + modifiers: [ + { + name: "flip", + enabled: false, + }, + { + name: "preventOverflow", + options: { + padding: 0, + }, + }, + ], + }} + > + {({ TransitionProps }) => ( + + + + + + + + )} + + + ) +} + +export default MobileAnchorNavigation diff --git a/src/pages/sessions-one/Guidance/GuidanceCard.tsx b/src/pages/sessions-one/Guidance/GuidanceCard.tsx new file mode 100644 index 000000000..c8a86ffd1 --- /dev/null +++ b/src/pages/sessions-one/Guidance/GuidanceCard.tsx @@ -0,0 +1,79 @@ +import { makeStyles } from "tss-react/mui" + +import { Box, Card, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as ExternaLinkIcon } from "@/assets/svgs/common/external-link.svg" +import Link from "@/components/Link" + +const useStyles = makeStyles()(theme => ({ + card: { + backgroundColor: theme.palette.themeBackground.normal, + height: "100%", + padding: "2.4rem", + borderRadius: "1.6rem", + cursor: "pointer", + "&:hover": { + backgroundColor: theme.palette.themeBackground.highlight, + }, + [theme.breakpoints.down("md")]: { + padding: "1.6rem 1.6rem 3.2rem 1.6rem", + }, + }, + header: { + display: "flex", + flexDirection: "column", + gap: "6.2rem", + [theme.breakpoints.down("md")]: { + flexDirection: "row-reverse", + justifyContent: "space-between", + }, + }, +})) + +const GuidanceCard = props => { + const { title, content, icon, href, ...restProps } = props + + const { classes } = useStyles() + + return ( + + + + + + + + {title} + + + {content} + + + + + ) +} + +export default GuidanceCard diff --git a/src/pages/sessions-one/Guidance/index.tsx b/src/pages/sessions-one/Guidance/index.tsx new file mode 100644 index 000000000..931fee097 --- /dev/null +++ b/src/pages/sessions-one/Guidance/index.tsx @@ -0,0 +1,24 @@ +import { Box } from "@mui/material" + +import { SESSIONS_EXPLORER_LIST } from "@/constants/sessions" + +import GuidanceCard from "./GuidanceCard" + +const Guidance = () => { + return ( + + {SESSIONS_EXPLORER_LIST.map(item => ( + + ))} + + ) +} + +export default Guidance diff --git a/src/pages/sessions-one/Header/index.tsx b/src/pages/sessions-one/Header/index.tsx new file mode 100644 index 000000000..c5a323e68 --- /dev/null +++ b/src/pages/sessions-one/Header/index.tsx @@ -0,0 +1,143 @@ +import { Box, Typography, keyframes } from "@mui/material" +import { styled } from "@mui/system" + +import useCheckViewport from "@/hooks/useCheckViewport" +import useImagesLoaded from "@/hooks/useImagesLoaded" + +interface FadeInBoxProps { + delay?: string + backgroundurl: string + animation?: string + style?: any +} + +const FadeInDiv = styled("div")(({ theme, delay, backgroundurl, animation, style }) => ({ + animation: `${fadeIn} 1s ease-in-out ${delay ?? ""} forwards ${animation ? `, ${animation}` : ""}`, + opacity: 0, + position: "absolute", + background: `url(${backgroundurl}) no-repeat center / cover`, + ...style, +})) + +const HeroBox = styled(Box)(({ theme }) => ({ + background: ` + url(/imgs/sessions/2-Right-Building-PNG.png) no-repeat right bottom / 36.5%, + url(/imgs/sessions/2-Left-Building-PNG.png) no-repeat left bottom / 32.92%, + url(/imgs/sessions/0-BG-PNG.png) no-repeat center / cover + `, + height: "56.4vw", + width: "100%", + [theme.breakpoints.down("md")]: { + height: "72vw", + }, +})) + +const Floating = keyframes` + 0%, 100% { + transform: translateY(-0.5vw); + } + 50% { + transform: translateY(-1.5vw); + } +` + +const HorizontalFloating = keyframes` + 0%, 100% { + transform: translateX(0); + } + 50% { + transform: translateX(-0.75vw); + } +` + +const fadeIn = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +` + +interface ImageConfig { + url: string + delay?: string + animation?: string + style?: any +} + +const Header = () => { + const sessionImages: { [key: string]: ImageConfig } = { + humans: { url: "/imgs/sessions/3-Humans-png.png", delay: "0.8s", style: { width: "91.21vw", left: "5vw", height: "17.285vw", bottom: 0 } }, + ethScroll: { + url: "/imgs/sessions/Scroll-Eth.png", + delay: "0.8s", + animation: `${Floating} 4s ease-in-out infinite`, + style: { width: "4.66vw", right: "4.4vw", height: "7.67vw", bottom: "36vw" }, + }, + layer2Back: { + url: "/imgs/sessions/Scroll-Layer2-back.png", + delay: "1s", + style: { width: "2.845vw", height: "3.814vw", left: "2.8vw", bottom: "38.56vw" }, + }, + tallTower: { url: "/imgs/sessions/1-Left-TallTower-PNG.png", style: { width: "3.82vw", height: "21.15vw", left: "1.6vw", bottom: "29.2vw" } }, + layer3: { + url: "/imgs/sessions/Scroll-Layer3.png", + delay: "1.1s", + style: { width: "4.12vw", height: "8.8644vw", left: "1.74vw", bottom: "32.15vw" }, + }, + layer1: { url: "/imgs/sessions/Scroll-Layer1.png", delay: "1.2s", style: { width: "3.07vw", height: "3.24vw", left: "2vw", bottom: "42vw" } }, + leftCloud: { + url: "/imgs/sessions/LeftCloud.png", + animation: `${HorizontalFloating} 10s ease-in-out infinite`, + style: { width: "8.95vw", height: "14.68vw", left: "0", bottom: "22vw" }, + }, + } + + const imageUrls = Object.values(sessionImages).map(image => image.url) + const { allLoaded } = useImagesLoaded(imageUrls) + const { isMobile } = useCheckViewport() + + return ( + + {allLoaded && ( + <> + + {Object.entries(sessionImages).map(([key, { url, delay = "0s", animation = "", style }]) => ( + + ))} + + )} + + Scroll + {isMobile ?
    : " "} + Sessions +
    +
    + ) +} + +export default Header diff --git a/src/pages/sessions-one/SessionOneMarks/List.tsx b/src/pages/sessions-one/SessionOneMarks/List.tsx new file mode 100644 index 000000000..39e8aa442 --- /dev/null +++ b/src/pages/sessions-one/SessionOneMarks/List.tsx @@ -0,0 +1,213 @@ +import { isNull, isNumber } from "lodash" +import { useState } from "react" + +import { Avatar, Box, Button, List, ListItem, ListItemIcon, ListItemText, Stack, SvgIcon, Typography } from "@mui/material" +import { useTheme } from "@mui/material/styles" +import { styled } from "@mui/system" + +import { SESSIONS_ONE_ACTIVITIES } from "@/constants" +import { commafy, formatLargeNumber } from "@/utils" + +import MarksTooltip from "../components/MarksTooltip" +import Statistic from "../components/Statistic" +import OthersModal from "./OthersModal" +import { PROJECT_MAP } from "./projectList" + +export enum MarksType { + ELIGIBLE_ASSETS, + GAS_SPENT, +} + +const SectionTitle = styled(Typography)(({ theme }) => ({ + fontSize: "2rem", + lineHeight: "2.8rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + fontSize: "1.8rem", + }, +})) + +const SectionDescription = styled(Typography)(({ theme }) => ({ + fontSize: "1.8rem", + lineHeight: "2.4rem", + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + }, +})) + +const MarkList = props => { + const { id, icon, title, data, description, isLoading } = props + const theme = useTheme() + const [open, setOpen] = useState(false) + + const handleOpenOthersModal = () => { + setOpen(true) + } + + const handleClose = () => { + setOpen(false) + } + + return ( + <> + + + {title} + + {description} + + {data?.map((item, index) => ( + + {item.project === "Others" ? ( + <> + + Others + + {item?.items?.map(({ project, logo, website }) => ( + + ))} + + +
    + + ) : ( + <> + + + + + {PROJECT_MAP[item.project].name} + + + )} + {isNull(item.marks) ? ( + + Coming soon + + ) : ( + + + + + + )} + + {item.project === "Others" ? ( + <> + + + + ) : ( + + )} +
    + ))} +
    + + ) +} + +export default MarkList diff --git a/src/pages/sessions-one/SessionOneMarks/OthersModal.tsx b/src/pages/sessions-one/SessionOneMarks/OthersModal.tsx new file mode 100644 index 000000000..3004ed4bd --- /dev/null +++ b/src/pages/sessions-one/SessionOneMarks/OthersModal.tsx @@ -0,0 +1,119 @@ +import { + Avatar, + Button, + Dialog, + DialogContent, + DialogTitle, + IconButton, + List, + ListItem, + ListItemAvatar, + ListItemText, + SvgIcon, + alpha, +} from "@mui/material" + +import { ReactComponent as CloseSvg } from "@/assets/svgs/bridge/close.svg" + +import { PROJECT_MAP } from "./projectList" + +// TODO: common modal +const OthersModal = props => { + const { data, children, onClose, ...restProps } = props + + return ( + alpha(theme.palette.themeBackground.light, 0.8), + }, + "& .MuiDialog-paper": { + // backgroundColor: theme => theme.palette.themeBackground.dark, + width: "58rem", + maxWidth: "100%", + padding: "2.4rem", + borderRadius: "2rem", + }, + }, + theme => ({ + [theme.breakpoints.down("sm")]: { + "& .MuiDialog-paper": { + margin: 0, + borderRadius: 0, + height: "calc(var(--vh, 1vh) * 100)", + maxHeight: "unset", + minWidth: "unset", + width: "100%", + padding: "1.6rem 2rem 2rem", + }, + }, + }), + ]} + {...restProps} + onClose={onClose} + > + + Others + + + + + + + {data?.map(item => ( + + + + + {PROJECT_MAP[item.project].name} + + + ))} + + + + ) +} + +export default OthersModal diff --git a/src/pages/sessions-one/SessionOneMarks/index.tsx b/src/pages/sessions-one/SessionOneMarks/index.tsx new file mode 100644 index 000000000..83cba2398 --- /dev/null +++ b/src/pages/sessions-one/SessionOneMarks/index.tsx @@ -0,0 +1,79 @@ +import useSWR from "swr" + +import { Divider, Typography } from "@mui/material" + +import { fetchProjectsMarksUrl } from "@/apis/sessions" +import { SESSIONS_ONE_DEX, SESSIONS_ONE_LENDING } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSessionsStore from "@/stores/sessionsStore" +import { sentryDebug } from "@/utils" + +import { SESSIONS_SECTION_MAP } from "../AnchorNavigation" +import Card from "../components/Card" +import MarkList from "./List" +import { defaultProjectList } from "./projectList" + +const SessionOneMarks = () => { + const { walletCurrentAddress } = useRainbowContext() + const { hasSignedTerms } = useSessionsStore() + + const { data: marks, isLoading } = useSWR( + [fetchProjectsMarksUrl(walletCurrentAddress), walletCurrentAddress, hasSignedTerms], + async ([url, walletAddress, signed]) => { + try { + if (!walletAddress || !signed) { + throw new Error("Wallet address or signed terms missing.") + } + + const result = await scrollRequest(url) + return result[0] + } catch (e) { + sentryDebug(`project marks: ${walletCurrentAddress}-${e.message}`) + return defaultProjectList + } + }, + { + fallbackData: defaultProjectList, + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, + ) + + return ( + + + Session One + + + + + + {/* TODO: need to remove at the initial launch */} + {/* + */} + + ) +} + +export default SessionOneMarks diff --git a/src/pages/sessions-one/SessionOneMarks/projectList.ts b/src/pages/sessions-one/SessionOneMarks/projectList.ts new file mode 100644 index 000000000..d62751b11 --- /dev/null +++ b/src/pages/sessions-one/SessionOneMarks/projectList.ts @@ -0,0 +1,205 @@ +export const defaultProjectList = { + dex: [ + { + name: "Ambient", + project: "Ambient", + }, + { + name: "Nuri", + project: "Nuri", + }, + { + name: "Maverick", + project: "Maverick", + }, + { + name: "Vessel", + project: "Vessel", + }, + { + name: "Others", + project: "Others", + items: [ + { + name: "Izumi", + project: "Izumi", + }, + { + name: "Oku Trade", + project: "Oku Trade", + }, + { + name: "SyncSwap", + project: "SyncSwap", + }, + { + name: "Zebra", + project: "Zebra", + }, + { + name: "Wombat", + project: "Wombat", + }, + { + name: "Scribe", + project: "Scribe", + }, + ], + }, + ], + lending: [ + { + name: "Aave", + project: "Aave", + }, + { + name: "Huma", + project: "Huma", + }, + { + name: "Rho Markets", + project: "Rho Markets", + }, + { + name: "Others", + project: "Others", + items: [ + { + name: "Cog Finance", + project: "Cog Finance", + }, + { + name: "Compound", + project: "Compound", + }, + { + name: "LayerBank", + project: "Layerbank", + }, + { + name: "Synonym", + project: "Synonym", + }, + ], + }, + ], + // activities: [ + // { + // name: "Mint Scroll Canvas", + // project: "canvas", + // }, + // ], +} + +const PROJECT_LIST = [ + { name: "Ambient", key: "Ambient", logo: "https://scroll-eco-list.netlify.app/logos/Ambient%20Finance.png", website: "https://ambient.finance/" }, + { + name: "Nuri", + key: "Nuri", + logo: "https://scroll-eco-list.netlify.app/logos/Nuri%20Exchange.jpeg", + website: "https://www.nuri.exchange/swap", + }, + { + name: "Izumi", + key: "Izumi", + logo: "https://scroll-eco-list.netlify.app/logos/iZUMi%20Finance.png", + website: "https://izumi.finance/trade/swap", + }, + { + name: "Oku Trade", + key: "Oku Trade", + logo: "https://scroll-eco-list.netlify.app/logos/Oku%20Trade.jpeg", + website: "https://oku.trade/", + }, + { + name: "SyncSwap", + key: "SyncSwap", + logo: "https://scroll-eco-list.netlify.app/logos/Syncswap.png", + website: "https://syncswap.xyz/", + }, + { + name: "Wombat", + key: "Wombat", + logo: "https://scroll-eco-list.netlify.app/logos/Wombat%20Exchange.png", + website: "https://www.wombat.exchange/", + }, + { + name: "Zebra", + key: "Zebra", + logo: "https://scroll-eco-list.netlify.app/logos/Zebra.png", + website: "https://www.zebra.xyz/", + }, + { + name: "Aave", + key: "Aave", + logo: "https://scroll-eco-list.netlify.app/logos/Aave.svg", + website: "https://app.aave.com/", + }, + + { + name: "Rho Markets", + key: "Rho Markets", + logo: "https://scroll-eco-list.netlify.app/logos/Rho%20Markets.png", + website: "https://dapp.rhomarkets.xyz/", + }, + { + name: "Cog Finance", + key: "Cog Finance", + logo: "https://scroll-eco-list.netlify.app/logos/Cog%20Finance.png", + website: "https://www.cog.finance/", + }, + { + name: "Compound", + key: "Compound", + logo: "https://scroll-eco-list.netlify.app/logos/Compound%20Finance.png", + website: "https://compound.finance/", + }, + { + name: "LayerBank", + key: "Layerbank", + logo: "https://scroll-eco-list.netlify.app/logos/LayerBank.png", + website: "https://scroll.layerbank.finance/bank", + }, + { + name: "Synonym", + key: "Synonym", + logo: "https://scroll-eco-list.netlify.app/logos/Synonym%20Finance.jpg", + website: "https://www.synonym.finance/", + }, + // { + // name: "Mint Scroll Canvas", + // key: "canvas", + // logo: "/imgs/canvas/ScrollCanvas.svg", + // website: "/canvas", + // }, + { + name: "Vessel", + key: "Vessel", + logo: "https://scroll-eco-list.netlify.app/logos/Vessel.jpg", + website: "https://vessel.finance/", + }, + { + name: "Maverick", + key: "Maverick", + logo: "https://scroll-eco-list.netlify.app/logos/Maverick%20Protocol.jpg", + website: "https://app.mav.xyz/add-liquidity?chain=534352", + }, + { + name: "Huma", + key: "Huma", + logo: "/imgs/sessions/tokens/Huma.svg", + website: "https://app.huma.finance/#/", + }, + { + name: "Scribe", + key: "Scribe", + logo: "/imgs/sessions/tokens/Scribe.png", + website: "https://app.scribe.exchange/pools", + }, +] + +export const PROJECT_MAP = new Proxy(PROJECT_LIST, { + get(target, project) { + return target.find(item => item.key === project) + }, +}) diff --git a/src/pages/sessions-one/SessionZeroMarks/List.tsx b/src/pages/sessions-one/SessionZeroMarks/List.tsx new file mode 100644 index 000000000..c2cb1548c --- /dev/null +++ b/src/pages/sessions-one/SessionZeroMarks/List.tsx @@ -0,0 +1,253 @@ +import { isNull, isNumber } from "lodash" + +import { Avatar, Box, Button, Link, List, ListItem, ListItemIcon, ListItemText, Skeleton, Stack, SvgIcon, Typography } from "@mui/material" +import { useTheme } from "@mui/material/styles" +import { styled } from "@mui/system" + +import useCheckViewport from "@/hooks/useCheckViewport" +import { commafy, formatLargeNumber, generateExploreLink, toPrecision, truncateHash } from "@/utils" + +import MarksTooltip from "../components/MarksTooltip" +import Statistic from "../components/Statistic" + +const TOKEN_BASE_URL = "https://scrollscan.com" + +export enum MarksType { + ELIGIBLE_ASSETS, + GAS_SPENT, +} + +const SectionTitle = styled(Typography)(({ theme }) => ({ + fontSize: "2rem", + lineHeight: "2.8rem", + fontWeight: 600, + [theme.breakpoints.down("sm")]: { + fontSize: "1.8rem", + }, +})) + +const SectionDescription = styled(Typography)(({ theme }) => ({ + fontSize: "1.8rem", + lineHeight: "2.4rem", + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + }, +})) + +const ListAddressStyled = styled(Link)(({ theme }) => ({ + color: "#101010", + fontSize: "1.8rem", + fontStyle: "normal", + fontWeight: 400, + lineHeight: "2.4rem", + letterSpacing: "0.15px", + textDecorationLine: "underline", + textDecorationColor: "unset", + [theme.breakpoints.down("sm")]: { + fontSize: "1.4rem", + }, +})) + +const MarkList = props => { + const { id, title, icon, data, description, type = MarksType.ELIGIBLE_ASSETS, isLoading } = props + const theme = useTheme() + const { isLandscape } = useCheckViewport() + + return ( + <> + + + {title} + + {description} + + {data?.map((item, index) => ( + + + + {item.withTokens && ( + + {item.withTokens.map(({ key, logoURI }) => ( + + ))} + + )} + + + {type === MarksType.GAS_SPENT && ( + <> + {isLoading ? ( + + ) : ( + + {isNumber(item.amount) ? (item.amount > 0 ? `${toPrecision(item.amount)} ${item.symbol}` : " Less than $5 ") : "-- ETH"} + + )} + + Gas spent + + )} + + {type === MarksType.ELIGIBLE_ASSETS && ( + <> + + {item.name} + + {item.address && ( + + {truncateHash(item.address)} + + )} + {isLandscape && item.containedTokens && ( + + {item.containedTokens.map(({ symbol, logoURI }) => ( + + ))} + + )} + + )} + + + {isNull(item.marks) ? ( + + Coming soon + + ) : ( + + + = 0 ? formatLargeNumber(item.marks, 2) : "--"} + label="Marks earned" + isLoading={isLoading} + sx={{}} + > + + + )} + + {type === MarksType.ELIGIBLE_ASSETS && ( + + )} + + {type === MarksType.GAS_SPENT && ( + + + Cut-off time + + + Apr 29th, 12pm UTC + + + )} + + ))} + + {/* {type === MarksType.ELIGIBLE_ASSETS && ( + + More eligible assets will be announced soon! + + )} */} + + ) +} + +export default MarkList diff --git a/src/pages/sessions-one/SessionZeroMarks/index.tsx b/src/pages/sessions-one/SessionZeroMarks/index.tsx new file mode 100644 index 000000000..a91ed14d1 --- /dev/null +++ b/src/pages/sessions-one/SessionZeroMarks/index.tsx @@ -0,0 +1,103 @@ +import { isUndefined } from "lodash" +import useSWR from "swr" + +import { Divider, Typography } from "@mui/material" + +import { fetchTokensMarksUrl } from "@/apis/sessions" +import { SESSIONS_ZERO_ASSETS, SESSIONS_ZERO_GAS } from "@/constants" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useSessionsStore from "@/stores/sessionsStore" +import { sentryDebug } from "@/utils" + +import { SESSIONS_SECTION_MAP } from "../AnchorNavigation" +import Card from "../components/Card" +import MarkList, { MarksType } from "./List" +import { gasList, tokenList } from "./tokenList" + +const defaultMarks = { + tokensMarks: tokenList.map(item => ({ ...item, marks: -1 })), + gasMarks: gasList.map(item => ({ + ...item, + amount: null, + marks: -1, + })), +} + +const BridgePoints = () => { + const { walletCurrentAddress } = useRainbowContext() + const { hasSignedTerms } = useSessionsStore() + + const { data: marks, isLoading } = useSWR( + [fetchTokensMarksUrl(walletCurrentAddress), walletCurrentAddress, hasSignedTerms], + async ([url, walletAddress, signed]) => { + try { + if (!walletAddress || !signed) { + throw new Error("Wallet address or signed terms missing.") + } + + const list = await scrollRequest(url) + const tokensMarks = tokenList.map(item => { + const withMarks = list + .filter(item => Object.keys(item).includes("points")) + .find(i => i.bridge_asset.toUpperCase() === item.key.toUpperCase()) + let marks = isUndefined(withMarks?.points) ? 0 : withMarks?.points + + return { + ...item, + marks, + } + }) + const gasMarksResult = list.find(item => item.bridge_asset === "gas-points") + const gasMarks = gasList.map(item => ({ + ...item, + amount: gasMarksResult?.amount ?? 0, + marks: gasMarksResult?.points ?? 0, + })) + + return { + tokensMarks, + gasMarks, + } + } catch (e) { + sentryDebug(`asset marks: ${walletCurrentAddress}-${e.message}`) + return defaultMarks + } + }, + { + fallbackData: defaultMarks, + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, + ) + + return ( + + + Session Zero + + + + + + + + ) +} + +export default BridgePoints diff --git a/src/pages/sessions-one/SessionZeroMarks/tokenList.ts b/src/pages/sessions-one/SessionZeroMarks/tokenList.ts new file mode 100644 index 000000000..c459b6fc3 --- /dev/null +++ b/src/pages/sessions-one/SessionZeroMarks/tokenList.ts @@ -0,0 +1,229 @@ +import ETHSvg from "@/assets/svgs/bridge/network-mainnet.svg" +import { ETH_SYMBOL } from "@/constants" + +// from https://scroll-tech.github.io/token-list/scroll.tokenlist.json +// name: displayed name +// symbol: for going to native badge / earn marks tag +// key: api field +export const tokenList = [ + { + name: "ETH / WETH", + symbol: ETH_SYMBOL, + key: "ETH", + logoURI: ETHSvg, + additionalToken: "WETH", + }, + // { + // name: "Wrapped Ether", + // symbol: "WETH", + // logoURI: "/imgs/sessions/tokens/weth.png", + // address: "0x5300000000000000000000000000000000000004", + // }, + { + name: "USDC", + symbol: "USDC", + key: "USDC", + logoURI: "https://scroll-tech.github.io/token-list/data/USDC/logo.svg", + address: "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4", + }, + { + name: "USDT", + symbol: "USDT", + key: "USDT", + logoURI: "https://scroll-tech.github.io/token-list/data/USDT/logo.svg", + address: "0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df", + }, + { + name: "sUSDe / USDe", + symbol: "sUSDe", + key: "sUSDe", + logoURI: "/imgs/sessions/tokens/sUSDe.svg", + additionalToken: "USDe", + thirdPartyBridge: { + url: "https://stargate.finance/bridge", + name: "Stargate", + }, + }, + { + name: "pufETH", + symbol: "pufETH", + key: "pufETH", + logoURI: "https://scroll-tech.github.io/token-list/data/PufETH/logo.svg", + address: "0xc4d46E8402F476F269c379677C99F18E22Ea030e", + }, + { + name: "weETH", + symbol: "weETH", + key: "weETH", + logoURI: "/imgs/sessions/tokens/weETH.png", + address: "0x01f0a31698C4d065659b9bdC21B3610292a1c506", + thirdPartyBridge: { + url: "https://stargate.finance/bridge", + name: "Stargate", + // name:"etherfi" + }, + }, + { + name: "wrsETH", + symbol: "wrsETH", + key: "wrsETH", + logoURI: "/imgs/sessions/tokens/wrsETH.svg", + address: "0xa25b25548B4C98B0c7d3d27dcA5D5ca743d68b7F", + thirdPartyBridge: { + url: "https://kelpdao.xyz/restake", + name: "Kelp", + }, + }, + { + name: "wstETH", + symbol: "wstETH", + key: "wstETH", + logoURI: "/imgs/sessions/tokens/wstETH.svg", + address: "0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32", + }, + { + name: "agETH", + symbol: "agETH", + key: "agETH", + logoURI: "/imgs/sessions/tokens/agETH.png", + address: "0x1bd0fe8e92a157d3ef66c9fb9e38621252b407c2", + thirdPartyBridge: { + url: "https://app.squidrouter.com/?chains=1%2C534352&tokens=0xe1b4d34e8754600962cd944b535180bd758e6c2e%2C0x1bd0fe8e92a157d3ef66c9fb9e38621252b407c2", + name: "Squid", + }, + }, + { + name: "WBTC", + symbol: "WBTC", + key: "WBTC", + logoURI: "/imgs/sessions/tokens/WBTC.svg", + address: "0x3C1BCa5a656e69edCD0D4E36BEbb3FcDAcA60Cf1", + }, + { + name: "SolvBTC.b", + symbol: "SolvBTC.b", + key: "solvBTC", + logoURI: "/imgs/sessions/tokens/solvBTC.png", + address: "0x3Ba89d490AB1C0c9CC2313385b30710e838370a4", + thirdPartyBridge: { + url: "https://free.tech/", + name: "Free", + }, + }, + { + name: "STONE", + symbol: "STONE", + key: "STONE", + logoURI: "/imgs/sessions/tokens/stone-white.svg", + address: "0x80137510979822322193FC997d400D5A6C747bf7", + thirdPartyBridge: { + url: "https://app.stakestone.io/u/bridge?n=534352", + name: "LayerZero", + }, + }, + { + name: "Assets on Tranchess", + key: "TRANCHESS", + logoURI: "/imgs/sessions/tokens/Tranchess.svg", + containedTokens: [ + { logoURI: "/imgs/sessions/tokens/turPSTONE.svg", symbol: "turPSTONE" }, + { logoURI: "/imgs/sessions/tokens/staYSTONE.svg", symbol: "staYSTONE" }, + { logoURI: "/imgs/sessions/tokens/stoneQueen.svg", symbol: "stoneQueen" }, + ], + thirdPartyBridge: { + url: "https://tranchess.com", + name: "Tranchess", + }, + }, + { + name: "Assets on Pencils Protocol", + key: "PENCILS", + logoURI: "/imgs/sessions/tokens/Pencils.jpeg", + containedTokens: [ + { logoURI: ETHSvg, symbol: ETH_SYMBOL }, + { logoURI: "https://scroll-tech.github.io/token-list/data/USDC/logo.svg", symbol: "USDC" }, + { logoURI: "https://scroll-tech.github.io/token-list/data/USDT/logo.svg", symbol: "USDT" }, + { logoURI: "/imgs/sessions/tokens/weETH.png", symbol: "weETH" }, + { logoURI: "/imgs/sessions/tokens/wrsETH.svg", symbol: "wrsETH" }, + { logoURI: "https://scroll-tech.github.io/token-list/data/wstETH/logo.svg", symbol: "wstETH" }, + { logoURI: "/imgs/sessions/tokens/WBTC.svg", symbol: "WBTC" }, + { logoURI: "/imgs/sessions/tokens/solvBTC.png", symbol: "SolvBTC.b" }, + { logoURI: "/imgs/sessions/tokens/stone-white.svg", symbol: "STONE" }, + ], + thirdPartyBridge: { + url: "https://pencilsprotocol.io/staking", + name: "Pencils", + }, + }, + { + name: "Assets on Mitosis", + key: "MITOSIS", + logoURI: "/imgs/sessions/tokens/Mitosis.png", + containedTokens: [{ logoURI: "/imgs/sessions/tokens/weETH.png", symbol: "weETH" }], + thirdPartyBridge: { + url: "https://app.mitosis.org/?asset=weETH&type=deposit&to=scroll", + name: "Mitosis", + }, + }, + { + name: "Assets on Loop", + key: "LOOPFI", + logoURI: "/imgs/sessions/tokens/Loop.jpg", + thirdPartyBridge: { + url: "https://www.loopfi.xyz/", + name: "Loop", + }, + }, + { + name: "Trust Wallet Campaign", + key: "TRUST", + logoURI: "/imgs/sessions/tokens/Trust.jpg", + withTokens: [{ logoURI: "/imgs/sessions/tokens/Pencils.jpeg", key: "PENCILS" }], + thirdPartyBridge: { + url: "https://trustwallet.com/?utm_source=cryptwerk", + name: "Trust", + }, + }, +] + +export const gasList = [ + { + logoURI: "/imgs/sessions/gas.svg", + symbol: ETH_SYMBOL, + }, +] + +export const tokenMap = new Proxy(tokenList, { + get(target, prop) { + return target.find(item => item.symbol === prop) + }, +}) + +// TODO: fetch from api +export const tokenListWithMarks = [ + { + tokenSymbol: ETH_SYMBOL, + amount: "1.234", + valueInUsd: 3149.55, + points: 1400, + }, + { + tokenSymbol: "wstETH", + amount: "3333", + valueInUsd: 3333, + points: 1000, + }, + { + tokenSymbol: "STONE", + amount: "3333", + valueInUsd: 3333, + points: 0, + }, +] + +export const gasMetricsMark = { + gasSpent: "5.6", + points: 2000, +} + +export default tokenList diff --git a/src/pages/sessions-one/SignatureRequestDialog/index.tsx b/src/pages/sessions-one/SignatureRequestDialog/index.tsx new file mode 100644 index 000000000..bb0664c54 --- /dev/null +++ b/src/pages/sessions-one/SignatureRequestDialog/index.tsx @@ -0,0 +1,220 @@ +import { useEffect } from "react" +import useStorage from "squirrel-gill" +import { makeStyles } from "tss-react/mui" +import { useSignMessage } from "wagmi" + +import { Dialog, DialogContent, DialogTitle, IconButton, Stack, SvgIcon } from "@mui/material" + +import { checkSignStatus, updateSignStatus } from "@/apis/sessions" +import { ReactComponent as CloseSvg } from "@/assets/svgs/bridge/close.svg" +import Button from "@/components/Button" +import { SIGNED_TERMS } from "@/constants/storageKey" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import SessionsTerms from "@/pages/sessions-terms" +import useSessionsStore from "@/stores/sessionsStore" +import { sentryDebug } from "@/utils" + +const useStyles = makeStyles()(theme => ({ + dialogPaper: { + width: "62.8rem", + maxWidth: "unset", + borderRadius: "2rem", + paddingTop: "2.4rem", + backgroundColor: "#fff", + [theme.breakpoints.down("sm")]: { + padding: "2rem 0", + }, + }, + dialogContentRoot: { + padding: "6.4rem 3.2rem 4rem", + display: "flex", + flexDirection: "column", + alignItems: "center", + [theme.breakpoints.down("sm")]: { + padding: "6.4rem 2rem 2rem", + }, + }, + cardRoot: { + position: "relative", + borderRadius: "2rem", + borderColor: "#473835", + padding: "2rem", + aspectRatio: "1 / 1", + display: "flex", + alignItems: "center", + overflow: "visible", + cursor: "pointer", + "*": { + cursor: "pointer !important", + }, + [theme.breakpoints.down("sm")]: { + aspectRatio: "unset", + justifyContent: "center", + }, + }, + selectedCard: { + outline: `1px solid ${theme.palette.text.primary}`, + }, + chipRoot: { + position: "absolute", + backgroundColor: "#90F8EA", + height: "3.4rem", + top: "-1.7rem", + left: "50%", + transform: "translateX(-50%)", + }, + selectedIcon: { + fontSize: "2.4rem", + position: "absolute", + right: "1.2rem", + top: "1.2rem", + }, + chipLabel: { + fontSize: "1.6rem", + fontWeight: 600, + padding: 0, + }, + listRoot: { + paddingBottom: 0, + }, + listItemRoot: { + padding: 0, + gap: 8, + "&:nth-of-type(n + 2)": { + paddingTop: 8, + }, + }, + listItemIconRoot: { + minWidth: "unset", + }, + listItemTextRoot: { + marginTop: 0, + marginBottom: 0, + }, + listItemTextPrimary: { + fontSize: "2rem", + lineHeight: "3.4rem", + [theme.breakpoints.down("sm")]: { + lineHeight: "2.8rem", + }, + }, +})) + +const SignatureRequestDialog = () => { + const { isMobile } = useCheckViewport() + const { classes } = useStyles() + const { walletCurrentAddress } = useRainbowContext() + + const { changeSignatureRequestVisible, signatureRequestVisible, changeHasSignedTerms } = useSessionsStore() + + const { signMessage, isPending, data: signMessageData, reset } = useSignMessage() + const [signedTerms, setSignedTerms] = useStorage(localStorage, SIGNED_TERMS, {}) + + const onClose = () => { + changeSignatureRequestVisible(false) + } + + const signTerms = async () => { + const message = + "By signing this message, you acknowledge that you have read and understood the Scroll Sessions Terms of Use, Scroll Terms of Service and Privacy Policy, and agree to abide by all of the terms and conditions contained therein." + signMessage({ message }) + } + + useEffect(() => { + changeSignatureRequestVisible(false) + changeHasSignedTerms(false) + if (!walletCurrentAddress) { + changeSignatureRequestVisible(false) + changeHasSignedTerms(false) + } else { + ;(async () => { + let hasSigned = !!signedTerms[walletCurrentAddress] + if (!hasSigned) { + try { + const result = await scrollRequest(checkSignStatus(walletCurrentAddress)) + if (result?.errcode === 0) { + hasSigned = true + setSignedTerms({ + ...signedTerms, + [walletCurrentAddress as string]: result.data, + }) + } else { + hasSigned = false + } + } catch (e) { + sentryDebug(`check sign: ${walletCurrentAddress}-${e.message}`) + } + } + changeHasSignedTerms(hasSigned) + })() + } + }, [walletCurrentAddress]) + + useEffect(() => { + if (signMessageData) { + const info = { + address: walletCurrentAddress, + signature: signMessageData, + timestamp: new Date().valueOf(), + } + reset() + onClose() + changeHasSignedTerms(true) + setSignedTerms({ + ...signedTerms, + [walletCurrentAddress as string]: info, + }) + + try { + scrollRequest(updateSignStatus, { + method: "post", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(info), + }) + } catch (e) { + sentryDebug(`update sign: ${walletCurrentAddress}-${e.message}`) + } + } + }, [signMessageData]) + + return ( + + + + + + Scroll Sessions Program Terms of Use + + + + + + + + + ) +} + +export default SignatureRequestDialog diff --git a/src/pages/sessions-one/TotalMarks/index.tsx b/src/pages/sessions-one/TotalMarks/index.tsx new file mode 100644 index 000000000..b0ff88d3d --- /dev/null +++ b/src/pages/sessions-one/TotalMarks/index.tsx @@ -0,0 +1,268 @@ +import { motion } from "framer-motion" +import { isNumber } from "lodash" +import useSWR from "swr" +import { makeStyles } from "tss-react/mui" + +import { Box, Divider, Skeleton, Stack, SvgIcon, Tooltip, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +import { fetchCurrentWalletPointsUrl, fetchPastWalletPointsUrl } from "@/apis/sessions" +import { ReactComponent as QaSvg } from "@/assets/svgs/sessions/qa.svg" +import Button from "@/components/Button" +import Link from "@/components/Link" +import { useRainbowContext } from "@/contexts/RainbowProvider" +import useCheckViewport from "@/hooks/useCheckViewport" +import useSessionsStore from "@/stores/sessionsStore" +import { commafy, formatLargeNumber, sentryDebug } from "@/utils" + +const MARKS_FOR_TOKEN = 200 + +const SESSION_AIRDROP_LINK = "/blog/introducing-scrolls-first-airdrop-a-celebration-of-the-global-community" +const SESSION_2_LINK = "/blog/announcing-scrolls-largest-rewards-program-to-date" + +const useStyles = makeStyles()(theme => ({ + tooltip: { + background: "linear-gradient(180deg, #262626 0%, #111 100%)", + padding: "1.2rem 1.4rem", + fontSize: "1.8rem", + lineHeight: "2.4rem", + fontFamily: "var(--developer-page-font-family)", + }, + notEnoughTooltip: { + backgroundColor: "#111", + padding: "1.6rem", + maxWidth: "35rem", + fontSize: "1.8rem", + lineHeight: "2.8rem", + borderRadius: "2rem", + fontWeight: 400, + }, + notEnoughArrow: { + color: "#111", + }, +})) +const StatisticSkeleton = styled(Skeleton)(({ theme }) => ({ + borderRadius: "1rem", + width: "12rem", + height: "8rem", + display: "inline-block", +})) + +const MotionBox = motion(Box) + +const TotalPoints = () => { + const { classes } = useStyles() + + const { walletCurrentAddress, connect } = useRainbowContext() + const { isMobile, isPortrait } = useCheckViewport() + + const { hasSignedTerms, changeSignatureRequestVisible } = useSessionsStore() + + const { data: currentMarks, isLoading: isCurrentLoading } = useSWR( + [fetchCurrentWalletPointsUrl(walletCurrentAddress), walletCurrentAddress, hasSignedTerms], + async ([url, walletAddress, signed]) => { + try { + if (!walletAddress || !signed) { + throw new Error("Wallet address or signed terms missing.") + } + + const data = await scrollRequest(url) + const points = data[0].points + + return points + } catch (e) { + sentryDebug(`total current marks: ${walletCurrentAddress}-${e.message}`) + return null + } + }, + { + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, + ) + + const { data: pastMarks, isLoading: isPastLoading } = useSWR( + [fetchPastWalletPointsUrl(walletCurrentAddress), walletCurrentAddress, hasSignedTerms], + async ([url, walletAddress, signed]) => { + try { + if (!walletAddress || !signed) { + throw new Error("Wallet address or signed terms missing.") + } + + const data = await scrollRequest(url) + const points = data[0].points + + return points + } catch (e) { + sentryDebug(`total past marks: ${walletCurrentAddress}-${e.message}`) + return null + } + }, + { + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, + ) + + return ( + + {walletCurrentAddress && hasSignedTerms && ( + + + Session 0 & 1 Marks + + + + {isPastLoading ? : <>{isNumber(pastMarks) ? formatLargeNumber(pastMarks, 2) : "--"}} + + + + + Cutoff: Oct 19, 2024, 00:00 UTC + + + {pastMarks < MARKS_FOR_TOKEN ? ( + <> + + Marks carried over to Session 2 + + + Marks below the 200 threshold are carried over to Session 2.{" "} + + Learn more + + + } + > + + + + ) : ( + <> + + Check eligibility{" "} + + here + + + + )} + + + + + Session 2 Marks + + + {isCurrentLoading ? ( + + ) : ( + <>{isNumber(currentMarks) ? formatLargeNumber(currentMarks, 2) : "--"} + )} + + + + Marks are updated every 24 hours + + + Keep engaging in this{" "} + + new phase + + + + + )} + + {!walletCurrentAddress && ( + + Your Marks + + -- + + + + )} + + {walletCurrentAddress && !hasSignedTerms && ( + + Your Marks + + You need to agree to Scroll Sessions Terms of Use to see your Marks and details + + + + )} + + ) +} + +export default TotalPoints diff --git a/src/pages/sessions-one/components/Card/index.tsx b/src/pages/sessions-one/components/Card/index.tsx new file mode 100644 index 000000000..9523ff634 --- /dev/null +++ b/src/pages/sessions-one/components/Card/index.tsx @@ -0,0 +1,18 @@ +import { Stack } from "@mui/material" + +const Card = props => { + const { sx, bottomDiff, ...restProps } = props + return ( + + ) +} + +export default Card diff --git a/src/pages/sessions-one/components/MarksTooltip/index.tsx b/src/pages/sessions-one/components/MarksTooltip/index.tsx new file mode 100644 index 000000000..35fb920ed --- /dev/null +++ b/src/pages/sessions-one/components/MarksTooltip/index.tsx @@ -0,0 +1,43 @@ +import { makeStyles } from "tss-react/mui" + +import { Tooltip } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" + +const useStyles = makeStyles()(theme => ({ + popper: { + zIndex: theme.zIndex.appBar - 1, + }, + tooltip: { + background: "linear-gradient(180deg, #262626 0%, #111 100%)", + padding: "1.2rem 1.4rem", + fontSize: "1.8rem", + lineHeight: "2.4rem", + fontFamily: "var(--developer-page-font-family)", + + [theme.breakpoints.down("md")]: { + marginTop: "0.8rem !important", + }, + }, +})) + +const MarksTooltip = props => { + const { disabled, children, ...restProps } = props + const { classes } = useStyles() + const { isLandscape } = useCheckViewport() + + return ( + + {children} + + ) +} + +export default MarksTooltip diff --git a/src/pages/sessions-one/components/SessionButton/index.tsx b/src/pages/sessions-one/components/SessionButton/index.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/pages/sessions-one/components/Statistic/index.tsx b/src/pages/sessions-one/components/Statistic/index.tsx new file mode 100644 index 000000000..a778675a2 --- /dev/null +++ b/src/pages/sessions-one/components/Statistic/index.tsx @@ -0,0 +1,53 @@ +import { Skeleton, Stack } from "@mui/material" +import { styled } from "@mui/material/styles" + +import NumberTypography from "@/components/NumberTypography" + +const StatisticSkeleton = styled(Skeleton)(({ theme }) => ({ + borderRadius: "1rem", + width: "8rem", + height: ["2.4rem", "2.8rem", "4rem"], + display: "inline-block", +})) + +const Statistic = props => { + const { count, sx, large, isLoading } = props + return ( + + {isLoading ? ( + + ) : ( + + {count} + + )} + + ) +} + +export default Statistic diff --git a/src/pages/sessions-one/index.tsx b/src/pages/sessions-one/index.tsx new file mode 100644 index 000000000..5f9d762f3 --- /dev/null +++ b/src/pages/sessions-one/index.tsx @@ -0,0 +1,43 @@ +import { Container, Stack } from "@mui/material" + +import Guidance from "./Guidance" +import Header from "./Header" +import SignatureRequestDialog from "./SignatureRequestDialog" +import TotalMarks from "./TotalMarks" + +const Sessions = () => { + return ( + <> +
    + + ({ + [theme.breakpoints.down("md")]: { + "& > *:nth-of-type(n + 4)": { + marginTop: "2.4rem", + }, + }, + [theme.breakpoints.down("sm")]: { + "& > *:nth-of-type(n + 4)": { + marginTop: "1.6rem", + }, + }, + }), + ]} + > + + + + + + + ) +} + +export default Sessions diff --git a/src/pages/sessions-restricted/index.tsx b/src/pages/sessions-restricted/index.tsx new file mode 100644 index 000000000..158fb7c9d --- /dev/null +++ b/src/pages/sessions-restricted/index.tsx @@ -0,0 +1,27 @@ +import Img from "react-cool-img" + +import { Container, Typography } from "@mui/material" + +import ScrollySad from "@/assets/images/common/scrolly-sad.png" + +const SessionsRestricted = () => { + return ( + + + + Scroll Sessions is not available

    in your region. +
    +
    + ) +} + +export default SessionsRestricted diff --git a/src/pages/sessions-terms/index.tsx b/src/pages/sessions-terms/index.tsx new file mode 100644 index 000000000..a1be1bcd4 --- /dev/null +++ b/src/pages/sessions-terms/index.tsx @@ -0,0 +1,400 @@ +import { Box, Typography } from "@mui/material" +import { styled } from "@mui/material/styles" + +const Container = styled(Box)(({ theme, isPopup }) => ({ + padding: isPopup ? "1rem" : "14rem 6rem", + overflow: "auto", + "::-webkit-scrollbar-track": { + background: "transparent", + }, + "& *": { + fontSize: isPopup ? "1.8rem" : "2rem", + textAlign: "justify", + [theme.breakpoints.down("sm")]: { + fontSize: "1.6rem", + }, + }, + "& h2": { + fontSize: isPopup ? "2rem" : "2.4rem", + fontWeight: "bold", + margin: isPopup ? "1.2rem 0" : "1.6rem 0", + [theme.breakpoints.down("sm")]: { + fontSize: "2rem", + margin: "2.8rem 0 1.2rem 0", + }, + }, + "& p": { + marginBottom: isPopup ? "1rem" : "1.6rem", + [theme.breakpoints.down("sm")]: { + marginBottom: "1rem", + }, + }, + "& ul": { + listStyle: "decimal", + marginLeft: "1.6rem", + "& ul": { + listStyle: "lower-alpha", + "& ul": { + listStyle: "circle", + }, + }, + "& li": { + paddingLeft: isPopup ? "0.4rem" : "2rem", + margin: "0.8rem 0", + [theme.breakpoints.down("sm")]: { + paddingLeft: "0.4rem", + }, + }, + }, +})) + +const TitleTypography = styled(Typography)(({ theme, isPopup }) => ({ + textAlign: "center", + marginBottom: "2rem", + display: isPopup ? "none" : "block", +})) + +const TOC = props => { + const { isPopup = false } = props + + return ( + + + Scroll Sessions Program Terms of Use + +

    Last updated: May 10, 2024

    +

    + Scroll Foundation, a foundation organized under the laws of the Seychelles (“Scroll Foundation”, “we”, or “ + us”) provides a website-hosted user interface (the “Interface”) for accessing and participating in Scroll + Sessions, a loyalty rewards program in connection with the use of Scroll protocol (the “Program").  +

    +
      +
    • +

      Acceptance of Terms

      +
        +
      • + By using the Interface and assessing and participating in the Program, you agree to be bound by these Terms of Use (these “ + Scroll Sessions Terms” or “Terms”). These Terms shall govern your access to and activities in relation + to the Program, and supplement our Terms of Service and Privacy Policy. By participating in the Program, you agree to be bound by these + Terms and our Terms of Service and Privacy Policy. Certain capitalized terms used but not defined in these Scroll Sessions Terms will + have the meanings ascribed to them in our Terms of Service. +
      • +
      • + We may update the Terms from time to time in our sole discretion. If we do, we will post the changes on this page and will indicate at + the top of this page the date these Terms were last revised. If you continue to participate in the Program after we have posted updated + Terms, it means that you accept and agree to the changes. If you don’t agree to be bound by the changes, you may not participate in the + Program anymore. We may change or discontinue all or any part of the Program, at any time and without notice, at our sole discretion. +
      • +
      +
    • +
    • +

      Eligibility and Participation in the Program

      +
        +
      • + You agree that in order to participate in the Program, you: +
          +
        • Must be at least 18 years of age;
        • +
        • Must not be a U.S. person (defined below);
        • +
        • + Must not reside in a jurisdiction where participation in this Program may be prohibited, restricted or unauthorized in any form or + manner, whether in full or in part, under the laws, regulatory requirements or rules in the jurisdiction in which the participant is + located; and +
        • +
        • Must not be a Prohibited Person under our Terms of Service.
        • +
        +
      • +
      • + We reserve the right to deny or void your participation in the Program in any manner we deem fit, including in the event we discover + that you do not fulfill these conditions. +
      • +
      • + In these Terms, a “U.S. person” shall mean the following: +
          +
        • Any natural person resident in the United States;
        • +
        • Any partnership or corporation organized or incorporated under the laws of the United States;
        • +
        • Any estate of which any executor or administrator is a U.S. person;
        • +
        • Any trust of which any trustee is a U.S. person;
        • +
        • Any agency or branch of a foreign entity located in the United States;
        • +
        • + Any non-discretionary account or similar account (other than an estate or trust) held by a dealer or other fiduciary for the benefit + or account of a U.S. person; +
        • +
        • + Any discretionary account or similar account (other than an estate or trust) held by a dealer or other fiduciary organized, + incorporated, or (if an individual) resident in the United States; and +
        • +
        • + Any partnership or corporation if (A) organized or incorporated under the laws of any foreign jurisdiction and (B) formed by a U.S. + person principally for the purpose of investing in securities not registered under the Act, unless it is organized or incorporated, + and owned, by accredited investors (as defined in § 230.501(a)) who are not natural persons, estates or trusts. +
        • +
        +
      • +
      • + This Program is only available to users in certain jurisdictions who can participate as permitted under applicable law. You agree that + you will comply with all applicable laws (e.g., local, state, federal and other laws) when using the Services and participating in the + Program. Without limiting the foregoing, by participating in this Program, you represent and warrant that: (a) you are not located in a + country , region or territory against which the U.S. Government maintains comprehensive economic or financial sanctions or trade + embargoes; and (b) you are not listed on any U.S. Government list of prohibited, sanctioned, or restricted parties or otherwise the + subject or target of any sanctions administered or enforced the U.S. government. You are solely responsible for ensuring that your + access and use of the Services and participation in the Program does not violate any applicable laws, including without limitation + applicable economic and trade sanctions and export control laws and regulations, such as those administered and enforced by the EU, + OFSI, OFAC, the U.S. Department of State, the U.S. Department of Commerce, the UN Security Council, and other relevant authorities. You + agree that you will not use a Virtual Private Network (VPN) or similar tool, to circumvent or attempt to circumvent prohibitions under + applicable laws or regulations. We reserve the right, but have no obligation, to monitor where participants to the Program are accessed + from. Furthermore, we reserve the right, at any time, in our sole discretion, to block access to the Program, in whole or in part, from + any geographic location, IP addresses and unique device identifiers or disqualify from the Program any user who we believe is in breach + of these Terms. +
      • +
      • + You shall not access the Interface or participate in the Program for any malicious or illegal purposes. We reserve the right to + disqualify you from the Program and revoke any and all of Scroll Marks allocated to you under the Program in the event that you carry + out malicious or illegal activities with respect to Scroll, the Service or the Program or otherwise violate these Terms (including + without limitation the general prohibitions and restrictions set out in Section 5) or our Terms of Service. +
      • +
      +
    • +
    • +

      Accessing the Interface and Participating in the Program

      +
        +
      • + You will access and use the Interface for informational purposes only and you will participate in the Program strictly in accordance + with these Terms. You are solely responsible for verifying the accuracy of any information obtained in connection with Scroll, the + Service, the Interface or in relation to the Program before using or participating in any of them. +
      • +
      • + You may access the Interface with a third-party cryptocurrency wallet, whether or not custodial, desktop, mobile, or “hot” or “cold”. + These wallet services are third-party services and by using a third-party wallet, you agree that you are using that wallet under the + terms and conditions of the applicable provider of the wallet. Third-party wallets are not operated by, maintained by, or affiliated + with Scroll Foundation, and Scroll Foundation does not have possession, custody or control over the contents of or any digital assets in + your wallet and has no ability to retrieve or transfer the contents or digital assets in your wallet. +
      • +
      • + We accept no responsibility for, or liability to you, in connection with your use of a third-party wallet and make no representations or + warranties regarding how the Interface, the Program or the Service will operate with any specific wallet. You are solely responsible for + keeping your wallet secure and you should never share your wallet credentials or seed phrase with anyone. If you discover an issue + related to your wallet, please contact the wallet provider. +
      • +
      • + The Program may make reference to third party applications or protocols which provide third party services built on Scroll network (“ + Third-Party Protocols”). These Third-Party Protocols are not operated or controlled by Scroll Foundation, and your use + of these Third-Party Protocols is entirely at your own risk. In the case where you choose to place transactions through these + Third-Party Protocols and these transactions are not successful due to an error with the Third-Party Protocols, we accept no + responsibility or liability to you for any such failed transactions, or any transaction or gas fees that may be incurred by you in + connection with such failed transactions. Additionally, these Third-Party Protocols may impose a fee or charge for services. We are not + responsible for any fees charged by a third party. +
      • +
      +
    • +
    • +

      Reward of Scroll Marks

      +
        +
      • + In your use of the Services and by participating in the Program, you may be attributed certain points, social or reputation indicators + or other intangible rewards (“Scroll Marks”). Scroll Marks reward users’ participation and engagement in the Scroll + ecosystem and are for tracking activities and loyalty only and do not represent any right to receive any assets or tokens in the future + or any claim against Scroll Foundation. Scroll Foundation makes no guarantees, representations, or warranties regarding the value, + availability, fungibility, exchangeability, or utility of Scroll Marks. +
      • +
      • + Scroll Marks are not, and may never convert to, accrue to, be used as basis to calculate, or become any other tokens or virtual assets + or distribution thereof. Scroll Marks are virtual items with no monetary value. Scroll Marks do not constitute any currency or property + of any type and are not redeemable, refundable, or eligible for any fiat or virtual currency or anything else of value. Scroll Marks are + not transferable between users, and you may not attempt to sell, trade, or transfer any Scroll Marks, or obtain any manner of credit + using any Scroll Marks. Any attempt to sell, trade, or transfer any Scroll Marks or tokens redeemable for or representing any Scroll + Marks will be null and void. +
      • + +
      • + The operation of the Program and allocation of Scroll Marks is dynamic, and will be based, in part, on several factors and criteria to + be determined in the sole discretion of Scroll Foundation. Scroll Foundation makes no representation or guarantee that any user will + receive any Scroll Marks or achieve any particular outcome as a result of holding any Scroll Marks or otherwise participating in the + Program. +
      • +
      +
    • +
    • +

      General Prohibitions and Restrictions

      + You agree that: +
        +
      • + you will not: +
          +
        • + Violate any law, contract, intellectual property or other third-party right, and that you are solely responsible for your conduct + and content while accessing or using the Service or participating in the Program. +
        • +
        • + Distribute any content that: (i) infringes, misappropriates or violates a third party’s patent, copyright, trademark, trade secret, + moral rights or other intellectual property rights, or rights of publicity or privacy; (ii) violates, or encourages any conduct that + would violate, any applicable law or regulation or would give rise to civil liability; (iii) is fraudulent, false, misleading or + deceptive; (iv) is defamatory, obscene, pornographic, vulgar or offensive; (v) promotes discrimination, bigotry, racism, hatred, + harassment or harm against any individual or group; (vi) is violent or threatening or promotes violence or actions that are + threatening to any person or entity; or (vii) promotes illegal or harmful activities or substances; +
        • +
        • + Use, display, mirror or frame the Services, the Program or any individual element within the Services, the Program, Scroll + Foundation’s name, any Scroll trademark, logo or other proprietary information, or the layout and design of any page or form + contained on a page, without Scroll Foundation’s express written consent; +
        • +
        • + Access, tamper with, or use non-public areas of the Services, the Interface, Scroll Foundation computer systems, or the technical + delivery systems of Scroll Foundation providers; +
        • +
        • + Attempt to probe, scan or test the vulnerability of any Scroll Foundation system or network or breach any security or authentication + measures; +
        • +
        • + Avoid, bypass, remove, deactivate, impair, descramble or otherwise circumvent any technological measure implemented by Scroll + Foundation or any of Scroll Foundation providers or any other third party (including another user) to protect the Services or the + Program; +
        • +
        • + Attempt to access or search the Services or download content from the Services using any engine, software, tool, agent, device or + mechanism (including spiders, robots, crawlers, data mining tools or the like) other than the software and/or search agents provided + by Scroll Foundation or other generally available third-party web browsers; +
        • +
        • + Attempt to decipher, decompile, disassemble or reverse engineer any of the software used to provide the Services or the Program; +
        • +
        • + Interfere with, or attempt to interfere with, the access of any user, host or network, including, without limitation, sending a + virus, overloading, flooding, spamming, or mail-bombing the Services or the Program; +
        • +
        • + Collect or store any personally identifiable information from the Services or the Program from other users of the Services or the + Program without their express permission; +
        • +
        • + Engage or assist in any activity that violates any law, statute, ordinance,or regulation, including but not limited to any sanctions + administered or enforced by the U.S. Department of Treasury’s Office of Foreign Assets Control (“OFAC”), or that + involves proceeds of any unlawful activity (including but not limited to money laundering, terrorist financing or deliberately + engaging in activities designed to adversely affect the performance of the Services or participation in or administration of the + Program); +
        • +
        • + Engage in wash trading, sybil attacks, front running, pump and dump trading, ramping, cornering, or other deceptive or manipulative + trading activities while using the Services or participating in the Program; +
        • +
        • Impersonate any person or entity, or falsely state or otherwise misrepresent your affiliation with a person or entity;
        • +
        • Further or promote any criminal activity or enterprise or provide instructional information about illegal activities; and
        • +
        +
      • +
      • + Scroll Foundation is not obligated to monitor access to or use of the Services or participation in the Program or to review or edit any + content. However, we have the right to do so for the purpose of operating the Services and the Program, to ensure compliance with these + Terms and our Terms of Service and to comply with applicable law or other legal requirements. We reserve the right, but are not + obligated, to remove or disable access to any content at any time and without notice, including, but not limited to, if we, at our sole + discretion, consider it objectionable or in violation of these Terms. We have the right to investigate violations of these Terms or our + Terms of Service or conduct that affects the Services. We may also consult and cooperate with law enforcement authorities to prosecute + users who violate the law. +
      • +
      +
    • +
    • +

      Disclaimer

      + YOUR USE OF THE INTERFACE, THE SERVICE AND/OR YOUR PARTICIPATION IN THE PROGRAM ARE AT YOUR SOLE RISK. THE SERVICE, INTERFACE AND PROGRAM + ARE PROVIDED ON AN “AS IS” AND “AS AVAILABLE” BASIS. THE INDEMNIFIED PARTIES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS, + IMPLIED OR STATUTORY, INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT. + THE INDEMNIFIED PARTIES MAKE NO WARRANTY THAT (A) THE SERVICE, THE INTERFACE OR PROGRAM WILL MEET YOUR REQUIREMENTS; (B) THE SERVICE, + INTERFACE, OR PROGRAM WILL BE UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE; (C) THE RESULTS THAT MAY BE OBTAINED FROM THE USE OF THE + SERVICE, INTERFACE OR PROGRAM OR (D) THE QUALITY OF ANY SERVICES, APPLICATIONS, INFORMATION, OR OTHER MATERIAL OBTAINED BY YOU THROUGH THE + SERVICE, INTERFACE OR PROGRAM WILL MEET YOUR EXPECTATIONS. +
      +
      + YOU AGREE THAT THESE TERMS AND ANY INFORMATION PROVIDED BY OR OBTAINED FROM THE SERVICE, THE INTERFACE OR PROGRAM ARE FOR INFORMATIONAL + PURPOSES ONLY, ARE NOT INTENDED TO BE RELIED UPON FOR PROFESSIONAL ADVICE OF ANY SORT, AND ARE NOT A SUBSTITUTE FOR INFORMATION FROM EXPERTS + OR PROFESSIONALS IN THE APPLICABLE AREA. YOU SHOULD NOT TAKE, OR REFRAIN FROM TAKING, ANY ACTION OR DECISION BASED ON ANY INFORMATION + CONTAINED ON OR RECEIVED IN CONNECTION WITH THE SERVICE, THE INTERFACE OR THE PROGRAM. IF, AND BEFORE YOU MAKE ANY FINANCIAL, LEGAL, OR + OTHER DECISIONS, YOU SHOULD SEEK INDEPENDENT PROFESSIONAL ADVICE FROM AN INDIVIDUAL WHO IS LICENSED AND QUALIFIED IN THE AREA FOR WHICH SUCH + ADVICE WOULD BE APPROPRIATE. +
      +
      + THESE TERMS ARE NOT INTENDED TO, AND DO NOT, CREATE OR IMPOSE ANY FIDUCIARY DUTIES ON US. TO THE FULLEST EXTENT PERMITTED BY LAW, YOU + ACKNOWLEDGE AND AGREE THAT WE OWE NO FIDUCIARY DUTIES OR LIABILITIES TO YOU OR ANY OTHER PARTY, AND THAT TO THE EXTENT ANY SUCH DUTIES OR + LIABILITIES MAY EXIST AT LAW OR IN EQUITY, THOSE DUTIES AND LIABILITIES ARE HEREBY IRREVOCABLY DISCLAIMED, WAIVED, AND ELIMINATED. YOU + FURTHER AGREE THAT THE ONLY DUTIES AND OBLIGATIONS THAT WE OWE YOU ARE THOSE SET OUT EXPRESSLY IN THESE TERMS. +
    • +
    • +

      Indemnification

      + You specifically agree that you will be personally responsible for your use of the Service, the Interface and your participation in the + Program. To the fullest extent permitted by applicable laws, you agree to indemnify, defend and hold harmless Scroll, as well as its + affiliates and service providers, and each of their respective past, present and future officers, directors, members, employees, + consultants, representatives and agents, and each of their respective successors and assigns (the “Indemnified Parties”) + from and against all actual or alleged third party claims, damages, awards, judgments, losses, liabilities, obligations, taxes, penalties, + interest, fees, expenses (including, without limitation, attorneys’ fees and expenses) and costs (including, without limitation, court + costs, costs of settlement and costs of pursuing indemnification and insurance), of every kind and nature whatsoever, whether known or + unknown, foreseen or unforeseen, matured or unmatured, or suspected or unsuspected, in law or equity, whether in tort, contract or otherwise + (collectively, “Claims”), including, but not limited to, damages to property or personal injury, that are caused by, arise + out of or are related to: (a) your use of the Service, the Interface or your participation in the Program, or any site or service accessible + as part of the Service, the Interface or the Program; (b) your violation of these Terms, our Terms of Service, or Privacy Policy, or + applicable law; (c) your violation of the rights of a third party; (d) your negligence or willful misconduct and (e) any disputes or issues + between you or any third party. You agree to promptly notify us of any third party Claims and cooperate with the Indemnified Parties in + defending such Claims. You further agree that the Indemnified Parties shall have the right to control the defense or settlement of any third + party Claims as they relate to us, if they so choose. +
    • +
    • +

      Limitation of Liability

      + TO THE FULLEST EXTENT ALLOWED BY APPLICABLE LAW, UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, TORT, + CONTRACT, STRICT LIABILITY, OR OTHERWISE) SHALL THE INDEMNIFIED PARTIES OR ANY OF THEM BE LIABLE TO YOU OR TO ANY OTHER PERSON FOR: (A) ANY + INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING DAMAGES FOR LOST PROFITS, BUSINESS INTERRUPTION, + LOSS OF DATA, LOSS OF GOODWILL, WORK STOPPAGE, ACCURACY OF RESULTS, OR COMPUTER FAILURE OR MALFUNCTION; (B) ANY SUBSTITUTE GOODS, SERVICES + OR TECHNOLOGY; (C) ANY AMOUNT, IN THE AGGREGATE, IN EXCESS OF ONE-HUNDRED (US$100) UNITED STATES DOLLARS; OR (D) ANY MATTER BEYOND THE + REASONABLE CONTROL OF THE INDEMNIFIED PARTIES OR ANY OF THEM. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR + CONSEQUENTIAL OR CERTAIN OTHER DAMAGES, SO THE ABOVE LIMITATIONS AND EXCLUSIONS MAY NOT APPLY TO YOU. +
    • +
    • +

      Representations and Warranties

      + By accessing or using the Service or the Interface or participating in the Program, you represent and warrant that: +
        +
      • You have read and understood these Terms, our Terms of Service and Privacy Policy;
      • +
      • + You have not been identified as a specially designated national or placed on any sanctions list maintained by the U.S government, + including OFAC, and are not otherwise the subject or target of any sanctions administered or enforced by the U.S. government, and you + will not use our Website to conduct any illegal or illicit activity; +
      • +
      • You are not a U.S. person as defined above;
      • +
      • + You are not a resident, citizen, national or agent of, or an entity organized, incorporated or doing business in, Cuba, Iran, North + Korea, Syria, the Crimea region of Ukraine, the so-called Donetsk People’s Republic and Luhansk People’s Republic regions of Ukraine, or + any other country, region or territory against which the United States, the United Kingdom, the European Union or any of its member + states or the United Nations or any of its member states maintain comprehensive economic or financial sanctions or trade embargoes; +
      • +
      • + You understand and agree that you are solely responsible for maintaining the security of your wallet and your control over any + wallet-related authentication credentials, private or public cryptocurrency keys, non-fungible tokens or cryptocurrencies that are + stored in or are accessible through your wallet. Any unauthorized access to your cryptocurrency wallet by third parties could result in + the loss or theft of your assets held in your wallet and any associated wallets, including any linked financial information such as bank + account(s) or credit card(s). We are not responsible for managing and maintaining the security of your cryptocurrency wallet nor for any + unauthorized access to or use of your cryptocurrency wallet. You will notify us immediately If you notice any unauthorized or suspicious + activity in your cryptocurrency wallet that seems to be related to the Service or this Program; +
      • +
      • + You possess adequate financial and technical knowledge to understand the inherent risks associated with using cryptographic and + blockchain-based systems, and purchasing and holding cryptocurrency. You understand that the markets for digital assets are nascent and + highly volatile, and that various risk factors such as adoption, speculation, technology, security, and regulation can impact their + value; +
      • +
      • + You assume full responsibility for all the risks associated with accessing and using the Service, the Interface and/or participating in + the Program, and understand that we are not responsible for any of these variables or risks, do not own or control the protocol, and + cannot be held liable for any losses resulting from your use of the Service, the Interface or your participation in the Program; and +
      • +
      • + You understand that Scroll Foundation makes no representation or guarantee that any user will receive any Scroll Marks or achieve any + particular outcome as a result of holding any Scroll Marks or otherwise participating in the Program. +
      • +
      +
    • +
    • +

      Incorporation of General Terms

      + You agree that you have read Clauses 14 to 19 of the Scroll Terms of Service, and that the terms therein shall apply to these Terms, mutatis + mutandis. +
    • +
    +
    + ) +} + +export default TOC diff --git a/src/pages/sticker-vote/Finalists/data.json b/src/pages/sticker-vote/Finalists/data.json new file mode 100644 index 000000000..fc389a561 --- /dev/null +++ b/src/pages/sticker-vote/Finalists/data.json @@ -0,0 +1,45 @@ +[ + { + "author": "afifridwan", + "images": ["/imgs/sticker/afifridwan1.gif", "/imgs/sticker/afifridwan2.gif"] + }, + { + "author": "Andre", + "images": ["/imgs/sticker/Andre1.jpg", "/imgs/sticker/Andre2.jpg"] + }, + { + "author": "Coincuddle", + "images": ["/imgs/sticker/Coincuddle1.png", "/imgs/sticker/Coincuddle2.png"] + }, + { + "author": "Cozy", + "images": ["/imgs/sticker/Cozy1.png", "/imgs/sticker/Cozy2.png"], + "bg": "#FFF8F3" + }, + { + "author": "EssisW.eth", + "images": ["/imgs/sticker/EssisW.eth1.gif", "/imgs/sticker/EssisW.eth2.jpg"], + "bg": ["#FAECE5", "#FFF3E7"] + }, + { + "author": "fomomonstr", + "images": ["/imgs/sticker/fomomonstr1.png", "/imgs/sticker/fomomonstr2.png"], + "bg": "#FFEEDA" + }, + { + "author": "Magda", + "images": ["/imgs/sticker/Magda1.png", "/imgs/sticker/Magda2.png"] + }, + { + "author": "MillionDollars", + "images": ["/imgs/sticker/MillionDollars1.png", "/imgs/sticker/MillionDollars2.png"] + }, + { + "author": "Shallot", + "images": ["/imgs/sticker/Shallot1.png", "/imgs/sticker/Shallot2.png"] + }, + { + "author": "Yol", + "images": ["/imgs/sticker/Yol1.png", "/imgs/sticker/Yol2.png"] + } +] diff --git a/src/pages/sticker-vote/Finalists/index.tsx b/src/pages/sticker-vote/Finalists/index.tsx new file mode 100644 index 000000000..b2c78a8df --- /dev/null +++ b/src/pages/sticker-vote/Finalists/index.tsx @@ -0,0 +1,58 @@ +import { useRef } from "react" + +import { Box, Typography } from "@mui/material" + +import { ReactComponent as FinalistsSvg } from "@/assets/svgs/sticker-contest/finalists.svg" +import Button from "@/components/Button" +import Link from "@/components/Link" +import ScrollExpandedBg from "@/components/ScrollExpandedBg" +import { STICKER_CONTEST_DISCORD_VOTE_URL, STICKER_CONTEST_NOTION_URL } from "@/constants" +import useCheckViewport from "@/hooks/useCheckViewport" + +import Gallery from "../components/Gallery" +import Title from "../components/Title" +import data from "./data.json" + +const StickerContest = () => { + const { isMobile } = useCheckViewport() + const contentRef = useRef() + + return ( + + `${theme.palette.primary.contrastText} !important` }, + }} + > + + + Thank you all creators! Here are the 10 finalists that are the most creative and fun with great craft. Now, it's time to cast your votes for + the top 5 on Discord! Check out{" "} + + the contest details + {" "} + here. + + + + + + + + + ) +} + +export default StickerContest diff --git a/src/pages/sticker-vote/Header/index.tsx b/src/pages/sticker-vote/Header/index.tsx new file mode 100644 index 000000000..3510950a7 --- /dev/null +++ b/src/pages/sticker-vote/Header/index.tsx @@ -0,0 +1,116 @@ +import { makeStyles } from "tss-react/mui" + +import { Box, Container, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as CalenderSvg } from "@/assets/svgs/sticker-contest/calender.svg" +import Button from "@/components/Button" +import { STICKER_CONTEST_DISCORD_VOTE_URL } from "@/constants" +import useCheckViewport from "@/hooks/useCheckViewport" + +import GridBackground from "../components/GridBackground" + +const useStyles = makeStyles()(theme => ({ + announcement: { + position: "absolute", + top: "-2rem", + left: "50%", + transform: "translateX(-50%)", + border: `3px solid ${theme.palette.text.primary}`, + borderRadius: "1rem", + backgroundColor: "#FFE1DC", + padding: "0.7rem 2rem", + [theme.breakpoints.down("md")]: { + top: "-4rem", + }, + [theme.breakpoints.down("sm")]: { + padding: "0.6rem 2rem", + borderWidth: "2px", + top: "-3rem", + }, + }, + + vote: { + position: "absolute", + bottom: "3.3rem", + left: "50%", + transform: "translateX(-50%)", + [theme.breakpoints.down("sm")]: { + bottom: "2rem", + }, + }, + award: { + padding: "0.8rem 2rem", + border: `3px solid ${theme.palette.text.primary}`, + backgroundColor: theme.palette.themeBackground.light, + borderRadius: "1.6rem", + textAlign: "center", + [theme.breakpoints.down("sm")]: { + borderWidth: "2px", + }, + }, +})) + +const StickerContest = () => { + const { classes } = useStyles() + const { isMobile } = useCheckViewport() + + return ( + + + + + + + + + + + ) +} + +const Announcement = () => { + const { classes } = useStyles() + const { isPortrait } = useCheckViewport() + + return ( + + + + Voting ends:{isPortrait &&

    } Sun, Feb 11, 2024 23:59 UTC +
    +
    + ) +} + +const Award = () => { + const { classes } = useStyles() + const { isPortrait } = useCheckViewport() + + return ( + + + + Top 1 prize: 1000 USD {isPortrait ?

    : "|"} Top 2-5 prize: 200 USD each +
    +
    +
    + ) +} + +export default StickerContest diff --git a/src/pages/sticker-vote/components/Gallery.tsx b/src/pages/sticker-vote/components/Gallery.tsx new file mode 100644 index 000000000..785b51c08 --- /dev/null +++ b/src/pages/sticker-vote/components/Gallery.tsx @@ -0,0 +1,78 @@ +import { useState } from "react" +import { makeStyles } from "tss-react/mui" + +import { Box } from "@mui/material" +import { Typography } from "@mui/material" +import { Stack } from "@mui/system" + +import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" +import useCheckViewport from "@/hooks/useCheckViewport" + +import ImageViewer from "./ImageViewer" +import StickerPicture from "./StickerPicture" + +const useStyles = makeStyles()(theme => ({ + gird: { + display: "grid", + gridTemplateColumns: "repeat(2, 1fr)", + gridColumnGap: "4.8rem", + gridRowGap: "7.2rem", + width: "100%", + + [theme.breakpoints.down("md")]: { + gridTemplateColumns: "1fr", + gridColumnGap: "3.6rem", + gridRowGap: "4.8rem", + }, + + [theme.breakpoints.down("sm")]: { + gridRowGap: "3.2rem", + }, + }, +})) + +const Gallery = props => { + const { data, className } = props + const { classes, cx } = useStyles() + const { isMobile } = useCheckViewport() + + const [image, setImage] = useState<{ src?: string; alt?: string; style?: object }>({}) + + const handleClose = () => { + setImage({}) + } + + const handleViewImage = value => { + setImage(value) + } + + return ( + <> + + {data.map(({ author, images, bg }) => ( + + + + Finalist - {author} + + + {images.map((src, index) => ( + + ))} + + + + ))} + + + + ) +} + +export default Gallery diff --git a/src/pages/sticker-vote/components/GridBackground.tsx b/src/pages/sticker-vote/components/GridBackground.tsx new file mode 100644 index 000000000..3f902b3c7 --- /dev/null +++ b/src/pages/sticker-vote/components/GridBackground.tsx @@ -0,0 +1,150 @@ +import { makeStyles } from "tss-react/mui" + +import { Box, SvgIcon } from "@mui/material" + +import { ReactComponent as CharacterSvg } from "@/assets/svgs/sticker-contest/character.svg" +import { ReactComponent as ContestSvg } from "@/assets/svgs/sticker-contest/contest.svg" +import { ReactComponent as ScrollSvg } from "@/assets/svgs/sticker-contest/scroll.svg" +import { ReactComponent as StickerSvg } from "@/assets/svgs/sticker-contest/sticker.svg" + +const useStyles = makeStyles()(theme => ({ + bg: { + height: "63.4rem", + border: `3px solid ${theme.palette.text.primary}`, + borderRadius: "1.6rem", + backgroundSize: "4rem 4rem", + backgroundOrigin: "border-box", + backgroundColor: theme.palette.themeBackground.light, + backgroundImage: + "linear-gradient(to right, rgba(16, 16, 16, 0.05) 1px, transparent 1px),linear-gradient(to bottom, rgba(16, 16, 16, 0.05) 1px, transparent 1px)", + [theme.breakpoints.down("md")]: { + backgroundSize: "3.2rem 3.2rem", + height: "50rem", + }, + + [theme.breakpoints.down("sm")]: { + backgroundSize: "2rem 2rem", + width: "100%", + height: "32rem", + borderWidth: "2px", + }, + }, + stickerWrapper: { + display: "grid", + justifyContent: "center", + marginTop: "6rem", + gridColumnGap: "3rem", + + gridTemplateColumns: "repeat(2, max-content)", + gridTemplateRows: "13rem repeat(2, max-content)", + + "@media (max-width: 1324px)": { + gridTemplateRows: "15rem repeat(2, max-content)", + }, + [theme.breakpoints.down("lg")]: { + gridTemplateRows: "13rem repeat(2, max-content)", + marginTop: "8rem", + gridColumnGap: "1rem", + }, + [theme.breakpoints.down("md")]: { + gridTemplateRows: "9.8rem repeat(2, max-content)", + }, + [theme.breakpoints.down("sm")]: { + marginTop: "5rem", + gridTemplateRows: "7rem repeat(2, max-content)", + gridColumnGap: 0, + gridRowGap: "1rem", + paddingLeft: "1rem", + }, + }, + sticker: { + "&:nth-of-type(2)": { + gridRow: "2 / 3", + paddingLeft: "34rem", + alignSelf: "center", + }, + "&:nth-of-type(3)": { + paddingLeft: "20rem", + }, + "@media (max-width: 1324px)": { + transform: "scale(0.8)", + transformOrigin: "right", + "&:nth-of-type(2)": { + paddingLeft: "24rem", + }, + "&:nth-of-type(3)": { + paddingLeft: "16rem", + }, + }, + [theme.breakpoints.down("lg")]: { + transform: "scale(1)", + "&:nth-of-type(2)": { + paddingLeft: "16rem", + }, + "&:nth-of-type(3)": { + paddingLeft: "8rem", + }, + }, + [theme.breakpoints.down("md")]: { + transform: "scale(1)", + "&:nth-of-type(2)": { + paddingLeft: "10rem", + }, + "&:nth-of-type(3)": { + paddingLeft: "4rem", + }, + }, + [theme.breakpoints.down("sm")]: { + "&:nth-of-type(2)": { + paddingLeft: "4rem", + }, + "&:nth-of-type(3)": { + paddingLeft: "1.5rem", + }, + }, + }, + character: { + gridColumn: "2 / 3", + gridRow: "1 / 4", + "@media (max-width: 1324px)": { + transformOrigin: "left", + }, + }, +})) + +const GridBackground = props => { + const { className, ...restProps } = props + const { classes, cx } = useStyles() + return ( + + + + + + + + + ) +} + +export default GridBackground diff --git a/src/pages/sticker-vote/components/ImageViewer.tsx b/src/pages/sticker-vote/components/ImageViewer.tsx new file mode 100644 index 000000000..eaf7568a9 --- /dev/null +++ b/src/pages/sticker-vote/components/ImageViewer.tsx @@ -0,0 +1,62 @@ +import { useEffect, useState } from "react" +import Img from "react-cool-img" + +import { CircularProgress, Modal } from "@mui/material" + +import useCheckViewport from "@/hooks/useCheckViewport" + +const ImageViewer = props => { + const { src, alt, imageStyle, onClose, ...restProps } = props + const { isMobile } = useCheckViewport() + const [style, setStyle] = useState({}) + const [loading, setLoading] = useState(true) + + useEffect(() => { + // TODO: modal is supposed to handle eacape listening by default + const handleEscape = e => { + if (e.key === "Escape") { + handleClose() + } + } + window.addEventListener("keydown", handleEscape) + return () => { + window.removeEventListener("keydown", handleEscape) + } + }, []) + + useEffect(() => { + const handleAdjustImage = () => { + if (imageStyle && imageStyle.aspectRatio && window.innerWidth / window.innerHeight > imageStyle.aspectRatio) { + setStyle({ height: `calc(100% - ${isMobile ? "2rem" : "10rem"})` }) + } else { + setStyle({ width: `calc(100% - ${isMobile ? "2rem" : "10rem"})` }) + } + } + handleAdjustImage() + + window.addEventListener("resize", handleAdjustImage) + return () => { + window.addEventListener("resize", handleAdjustImage) + } + }, [imageStyle, isMobile]) + + const handleLoad = () => { + setLoading(false) + } + + const handleClose = () => { + setLoading(true) + onClose() + } + + return ( + + <> + {alt} + {loading && } + + + ) +} + +export default ImageViewer diff --git a/src/pages/sticker-vote/components/StickerPicture.tsx b/src/pages/sticker-vote/components/StickerPicture.tsx new file mode 100644 index 000000000..c242d7447 --- /dev/null +++ b/src/pages/sticker-vote/components/StickerPicture.tsx @@ -0,0 +1,60 @@ +import { useEffect, useState } from "react" +import Img from "react-cool-img" +import { useStyles } from "tss-react/mui" + +import { Box } from "@mui/material" +import { styled } from "@mui/material/styles" + +const Frame = styled(Box, { shouldForwardProp: prop => prop !== "bgColor" })(({ theme, bgColor }) => ({ + aspectRatio: "1 / 1", + flex: 1, + borderRadius: "1rem", + overflow: "hidden", + display: "flex", + justifyContent: "center", + alignItems: "center", + backgroundColor: bgColor, + backdropFilter: "blur(10px)", + transition: "transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1)", + willChange: "transform", + cursor: "pointer", + "@media (hover: hover)": { + "&:hover": { + transform: "scale(1.05)", + }, + }, + "&.unloaded": { + boxShadow: "inset 0 0 0 600px rgba(255, 255, 255, 0.4)", + filter: "blur(2px)", + backgroundColor: "unset", + }, +})) + +const StickerPicture = props => { + const { cx } = useStyles() + const { className, src, alt, bgColor, onClick, ...restProps } = props + const [loaded, setLoaded] = useState(false) + const [style, setStyle] = useState({}) + + useEffect(() => { + const img = new Image() + img.onload = () => { + setLoaded(true) + const isWide = img.width > img.height + setStyle({ + width: isWide ? "100%" : "auto", + height: isWide ? "auto" : "100%", + aspectRatio: img.width / img.height, + }) + } + img.src = src + }, [src]) + + return ( + onClick({ src, alt, style })}> + {loaded && {alt}} + + ) +} + +export default StickerPicture diff --git a/src/pages/sticker-vote/components/Title.tsx b/src/pages/sticker-vote/components/Title.tsx new file mode 100644 index 000000000..146e0f1da --- /dev/null +++ b/src/pages/sticker-vote/components/Title.tsx @@ -0,0 +1,22 @@ +import { Divider, Stack, SvgIcon } from "@mui/material" + +import { ReactComponent as StarSvg } from "@/assets/svgs/sticker-contest/star.svg" + +const Title = props => { + return ( + + + + + + + + ) +} + +export default Title diff --git a/src/pages/sticker-vote/index.tsx b/src/pages/sticker-vote/index.tsx new file mode 100644 index 000000000..347e3fa4b --- /dev/null +++ b/src/pages/sticker-vote/index.tsx @@ -0,0 +1,13 @@ +import Finalists from "./Finalists" +import Header from "./Header" + +const StickerContest = () => { + return ( + <> +
    + + + ) +} + +export default StickerContest diff --git a/src/pages/sticker-winners/Finalists/Winner.tsx b/src/pages/sticker-winners/Finalists/Winner.tsx new file mode 100644 index 000000000..f1f7abd08 --- /dev/null +++ b/src/pages/sticker-winners/Finalists/Winner.tsx @@ -0,0 +1,77 @@ +import { useState } from "react" +import { makeStyles } from "tss-react/mui" + +import { Typography } from "@mui/material" +import { Stack } from "@mui/system" + +import SuccessionToView, { SuccessionItem } from "@/components/Motion/SuccessionToView" +import useCheckViewport from "@/hooks/useCheckViewport" +import ImageViewer from "@/pages/sticker-vote/components/ImageViewer" +import StickerPicture from "@/pages/sticker-vote/components/StickerPicture" + +const useStyles = makeStyles()(theme => ({ + flex: { + display: "flex", + gap: "7.2rem", + padding: "0 10rem", + "& > *": { + flex: 1, + }, + [theme.breakpoints.down("lg")]: { + padding: "0 6rem", + gap: "4.8rem", + }, + + [theme.breakpoints.down("md")]: { + padding: 0, + gap: "2rem", + }, + + [theme.breakpoints.down("sm")]: { + width: "100%", + flexDirection: "column", + gap: "1.6rem", + }, + }, +})) + +const Winner = props => { + const { + data: { author, images, bg }, + } = props + const { classes } = useStyles() + const { isMobile } = useCheckViewport() + const [image, setImage] = useState<{ src?: string; alt?: string; style?: object }>({}) + + const handleViewImage = value => { + setImage(value) + } + const handleClose = () => { + setImage({}) + } + + return ( + <> + + + Finalist - {author} + + + {images.map((src, index) => ( + + + + ))} + + + + + ) +} + +export default Winner diff --git a/src/pages/sticker-winners/Finalists/data.json b/src/pages/sticker-winners/Finalists/data.json new file mode 100644 index 000000000..a6662d458 --- /dev/null +++ b/src/pages/sticker-winners/Finalists/data.json @@ -0,0 +1,49 @@ +{ + "winner": { + "author": "MillionDollars", + "images": ["/imgs/sticker/MillionDollars1.png", "/imgs/sticker/MillionDollars2.png"] + }, + "top2-5": [ + { + "author": "Cozy", + "images": ["/imgs/sticker/Cozy1.png", "/imgs/sticker/Cozy2.png"], + "bg": "#FFF8F3" + }, + { + "author": "Shallot", + "images": ["/imgs/sticker/Shallot1.png", "/imgs/sticker/Shallot2.png"] + }, + { + "author": "Coincuddle", + "images": ["/imgs/sticker/Coincuddle1.png", "/imgs/sticker/Coincuddle2.png"] + }, + { + "author": "fomomonstr", + "images": ["/imgs/sticker/fomomonstr1.png", "/imgs/sticker/fomomonstr2.png"], + "bg": "#FFEEDA" + } + ], + "remaining": [ + { + "author": "EssisW.eth", + "images": ["/imgs/sticker/EssisW.eth1.gif", "/imgs/sticker/EssisW.eth2.jpg"], + "bg": ["#FAECE5", "#FFF3E7"] + }, + { + "author": "Yol", + "images": ["/imgs/sticker/Yol1.png", "/imgs/sticker/Yol2.png"] + }, + { + "author": "Andre", + "images": ["/imgs/sticker/Andre1.jpg", "/imgs/sticker/Andre2.jpg"] + }, + { + "author": "afifridwan", + "images": ["/imgs/sticker/afifridwan1.gif", "/imgs/sticker/afifridwan2.gif"] + }, + { + "author": "Magda", + "images": ["/imgs/sticker/Magda1.png", "/imgs/sticker/Magda2.png"] + } + ] +} diff --git a/src/pages/sticker-winners/Finalists/index.tsx b/src/pages/sticker-winners/Finalists/index.tsx new file mode 100644 index 000000000..9d7d9ad48 --- /dev/null +++ b/src/pages/sticker-winners/Finalists/index.tsx @@ -0,0 +1,53 @@ +import { useRef } from "react" + +import { Box, Typography } from "@mui/material" + +import { ReactComponent as Top2_5Svg } from "@/assets/svgs/sticker-contest-result/top2-5.svg" +import { ReactComponent as WinnerSvg } from "@/assets/svgs/sticker-contest-result/winner.svg" +import { ReactComponent as FinalistsSvg } from "@/assets/svgs/sticker-contest/finalists.svg" +import Link from "@/components/Link" +import ScrollExpandedBg from "@/components/ScrollExpandedBg" +import { STICKER_CONTEST_NOTION_URL } from "@/constants" +import Gallery from "@/pages/sticker-vote/components/Gallery" +import Title from "@/pages/sticker-vote/components/Title" + +import Winner from "./Winner" +import data from "./data.json" + +const StickerContest = () => { + const contentRef = useRef() + + return ( + + `${theme.palette.primary.contrastText} !important` }, + }} + > + + Thank you all creators! Here are the result of our contest which are voted by our community. Check out{" "} + + the contest details + {" "} + here. + + + + + + + + + + ) +} + +export default StickerContest diff --git a/src/pages/sticker-winners/Header/index.tsx b/src/pages/sticker-winners/Header/index.tsx new file mode 100644 index 000000000..8fc12dc26 --- /dev/null +++ b/src/pages/sticker-winners/Header/index.tsx @@ -0,0 +1,103 @@ +import { makeStyles } from "tss-react/mui" + +import { Box, Container, Stack, SvgIcon, Typography } from "@mui/material" + +import { ReactComponent as TadaSvg } from "@/assets/svgs/sticker-contest-result/tada.svg" +import useCheckViewport from "@/hooks/useCheckViewport" +import GridBackground from "@/pages/sticker-vote/components/GridBackground" + +const useStyles = makeStyles()(theme => ({ + announcement: { + position: "absolute", + top: "-2rem", + left: "50%", + transform: "translateX(-50%)", + border: `3px solid ${theme.palette.text.primary}`, + borderRadius: "1rem", + backgroundColor: "#FFE1DC", + padding: "0.7rem 2rem", + [theme.breakpoints.down("sm")]: { + padding: "0.6rem 2rem", + borderWidth: "2px", + }, + }, + + vote: { + position: "absolute", + bottom: "3.3rem", + left: "50%", + transform: "translateX(-50%)", + [theme.breakpoints.down("sm")]: { + bottom: "2rem", + }, + }, + award: { + padding: "1.5rem 2rem", + border: `3px solid ${theme.palette.text.primary}`, + backgroundColor: theme.palette.themeBackground.light, + borderRadius: "1.6rem", + textAlign: "center", + [theme.breakpoints.down("md")]: { + padding: "0.6rem 2rem", + }, + [theme.breakpoints.down("sm")]: { + borderWidth: "2px", + }, + }, +})) + +const StickerContestResult = () => { + return ( + + + + + + + + ) +} + +const Announcement = () => { + const { classes } = useStyles() + + return ( + + + + The winners are here!!! + + + ) +} + +const Award = () => { + const { classes } = useStyles() + const { isPortrait } = useCheckViewport() + + return ( + + + + Top 1 prize: 1000 USD {isPortrait ?

    : "|"} Top 2-5 prize: 200 USD each +
    +
    +
    + ) +} + +export default StickerContestResult diff --git a/src/pages/sticker-winners/index.tsx b/src/pages/sticker-winners/index.tsx new file mode 100644 index 000000000..347e3fa4b --- /dev/null +++ b/src/pages/sticker-winners/index.tsx @@ -0,0 +1,13 @@ +import Finalists from "./Finalists" +import Header from "./Header" + +const StickerContest = () => { + return ( + <> +
    + + + ) +} + +export default StickerContest diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts index eaf42998c..6fe0f4450 100644 --- a/src/react-app-env.d.ts +++ b/src/react-app-env.d.ts @@ -28,3 +28,8 @@ declare module "content-hash" { } declare module "dayjs" + +declare module "*.mp4" { + const src: string + export default src +} diff --git a/src/routes/index.tsx b/src/routes/index.tsx index b1475230d..2ea961606 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -4,13 +4,21 @@ import BlogDetail from "@/pages/blog/detail" import BrandKit from "@/pages/brand-kit" import Bridge from "@/pages/bridge" import BridgeFAQ from "@/pages/bridge/FAQ" +import ScrollCanvas from "@/pages/canvas" +import CanvasAndBadges from "@/pages/canvas-badge" +import CanvasDashboard from "@/pages/canvas/Dashboard" +import CanvasBadge from "@/pages/canvas/badge" +import CanvasBadgeContract from "@/pages/canvas/badgeContract" +import CanvasInvite from "@/pages/canvas/invite" +import MintProfile from "@/pages/canvas/mint" +import MintSCRMock from "@/pages/canvas/mint-scr" import Career from "@/pages/career" +import Community from "@/pages/community" // import ComingSoon from "@/pages/developer-nft/coming-soon" import DeveloperNFT from "@/pages/developer-nft/index" import MintNFT from "@/pages/developer-nft/mint" import Ecosystem from "@/pages/ecosystem" import Home from "@/pages/landingpage" -import OurStory from "@/pages/ourStory" import Portal from "@/pages/portal" import PrivacyPolicy from "@/pages/privacyPolicy" import RollupScanBatch from "@/pages/rollup/batch" @@ -18,6 +26,11 @@ import RollupScanBlock from "@/pages/rollup/block" import RollupScanChunk from "@/pages/rollup/chunk" import RollupScanChunkDetail from "@/pages/rollup/chunk/detail" import RollupScan from "@/pages/rollup/index" +import Sessions from "@/pages/sessions-one" +import SessionsRestricted from "@/pages/sessions-restricted" +import SessionsTerms from "@/pages/sessions-terms" +import StickerVote from "@/pages/sticker-vote" +import StickerWinners from "@/pages/sticker-winners" import Terms from "@/pages/terms" import { isSepolia } from "@/utils" @@ -45,19 +58,16 @@ const sepoliaRoutes = [ { name: "Resources", path: "portal", - fullPath: "/portal", element: , }, { name: "Bridge", path: "/bridge", - fullPath: "/bridge", element: , }, { name: "Bridge FAQ", path: "/bridge/faq", - fullPath: "/bridge/faq", element: , }, { @@ -68,37 +78,31 @@ const sepoliaRoutes = [ { name: "Rollup Explorer", path: "/rollupscan", - fullPath: "/rollupscan", element: , }, { name: "Rollup Explorer: Batch Details", path: "/rollupscan/batch/:batchIndex", - fullPath: "/rollupscan/batch/:batchIndex", element: , }, { name: "Rollup Explorer: Chunk List", path: "/rollupscan/batch/:batchIndex/chunks", - fullPath: "/rollupscan/batch/:batchIndex/chunks", element: , }, { name: "Rollup Explorer: Chunk Details", path: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex", - fullPath: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex", element: , }, { name: "Rollup Explorer: Block Details", path: "/rollupscan/batch/:batchIndex/blocks", - fullPath: "/rollupscan/batch/:batchIndex/blocks", element: , }, { name: "Rollup Explorer: Block Details", path: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex/blocks", - fullPath: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex/blocks", element: , }, ] @@ -109,11 +113,6 @@ const mainnetRoutes = [ path: "/", element: , }, - { - name: "Our Story", - path: "/story", - element: , - }, { name: "Blog", path: "/blog", element: }, { name: "Join Us", @@ -155,75 +154,148 @@ const mainnetRoutes = [ { name: "Resources", path: "portal", - fullPath: "/portal", element: , }, { name: "Bridge", path: "/bridge", - fullPath: "/bridge", element: , }, { name: "Bridge FAQ", path: "/bridge/faq", - fullPath: "/bridge/faq", element: , }, { name: "Ecosystem", path: "/ecosystem", - fullPath: "/ecosystem", element: , }, { name: "Rollup Explorer", path: "/rollupscan", - fullPath: "/rollupscan", element: , }, { name: "Rollup Explorer: Batch Details", path: "/rollupscan/batch/:batchIndex", - fullPath: "/rollupscan/batch/:batchIndex", element: , }, { name: "Rollup Explorer: Chunk List", path: "/rollupscan/batch/:batchIndex/chunks", - fullPath: "/rollupscan/batch/:batchIndex/chunks", element: , }, { name: "Rollup Explorer: Chunk Details", path: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex", - fullPath: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex", element: , }, { name: "Rollup Explorer: Block Details", path: "/rollupscan/batch/:batchIndex/blocks", - fullPath: "/rollupscan/batch/:batchIndex/blocks", element: , }, { name: "Rollup Explorer: Block Details", path: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex/blocks", - fullPath: "/rollupscan/batch/:batchIndex/chunk/:chunkIndex/blocks", element: , }, { name: "Scroll Origins NFT", path: "/developer-nft", - fullPath: "/developer-nft", element: , }, { name: "Scroll Origins NFT", path: "/developer-nft/mint", - fullPath: "/developer-nft/mint", element: , }, + { + name: "Scroll Sticker Vote", + path: "/sticker-vote", + element: , + description: "Vote for your favourite sticker designs.", + }, + { + name: "Scroll Sticker Winners", + path: "/sticker-winners", + element: , + description: "Congratulations to the winners of the sticker contest.", + }, + { + name: "Scroll Sessions", + path: "/sessions", + element: , + description: "Receive Marks for your engagement with Scroll. Join Sessions now!", + }, + { + name: "Scroll Sessions Terms of Use", + path: "/sessions-terms-of-use", + element: , + }, + { + name: "Scroll Sessions Restricted", + path: "/sessions-restricted", + element: , + }, + { + name: "Canvas", + path: "/canvas", + element: , + description: "Earn attestation badges across the ecosystem.", + isHiddenFooter: true, + }, + { + name: "Canvas", + path: "/canvas/mint", + element: , + description: "Earn attestation badges across the ecosystem.", + isHiddenFooter: true, + }, + + { + name: "Canvas", + path: "/canvas/badge/:id", + element: , + isHiddenFooter: true, + }, + { + name: "Canvas", + path: "/canvas/badge-contract/:address", + element: , + isHiddenFooter: true, + }, + { + name: "Canvas Invite", + path: "/canvas/invite/:code", + element: , + isHiddenFooter: true, + }, + { + name: "Canvas", + path: "/canvas/:address", + element: , + isHiddenFooter: true, + }, + // TODO: delete this route + { + name: "Mint SCR", + path: "/canvas/mint-scr", + element: , + isHiddenFooter: true, + }, + { + name: "Canvas And Badges", + path: "/canvas-and-badges", + description: "Build your on-chain persona and collect badges across Scroll’s ecosystem", + element: , + }, + { + name: "Community", + path: "/community", + element: , + }, ] const routes = isSepolia ? sepoliaRoutes : mainnetRoutes diff --git a/src/services/badgeService.ts b/src/services/badgeService.ts new file mode 100644 index 000000000..0d9385387 --- /dev/null +++ b/src/services/badgeService.ts @@ -0,0 +1,11 @@ +import { fetchWhiteListBadgesURL } from "@/apis/canvas-badge" +import { SCR_HOLDING_BADGE_ADDRESS } from "@/constants" + +export const fetchWhiteListBadges = async () => { + try { + const result = await scrollRequest(fetchWhiteListBadgesURL) + return result?.data?.map(item => item.badgeContract).concat(SCR_HOLDING_BADGE_ADDRESS) + } catch (e) { + return [] + } +} diff --git a/src/services/canvasService.ts b/src/services/canvasService.ts new file mode 100644 index 000000000..99e897aa2 --- /dev/null +++ b/src/services/canvasService.ts @@ -0,0 +1,627 @@ +import dayjs from "dayjs" +import { AbiCoder, ethers } from "ethers" +import { readItem, writeItem } from "squirrel-gill/lib/storage" +import { pad } from "viem" + +import { checkBadgeEligibilityURL, claimBadgeURL } from "@/apis/canvas" +import { fetchBadgeByAddrURL } from "@/apis/canvas-badge" +import { fetchEcosystemProtocolByNameURL, fetchEcosystemProtocolLogo } from "@/apis/ecosystem" +import AttestProxyABI from "@/assets/abis/CanvasAttestProxy.json" +import BadgeABI from "@/assets/abis/CanvasBadge.json" +import CanvasBadgeResolverABI from "@/assets/abis/CanvasBadgeResolver.json" +import ProfileABI from "@/assets/abis/CanvasProfile.json" +import ProfileRegistryABI from "@/assets/abis/CanvasProfileRegistry.json" +import { BADGE_TYPE, ETHEREUM_YEAR_BADGE, ORIGINS_NFT_BADGE, SCR_HOLDING_BADGE_ADDRESS, SELF_ATTESTATION_BADGE_ADDRESS_LIST } from "@/constants" +import { FORCE_PAY_GAS_FEE_BADGE_LIST, GRACE_PERIOD_DURATION } from "@/constants" +import { CANVAS_USER_BADGES } from "@/constants/storageKey" +import { DEFAULT_SCR_HOLDING_BADGE_IMAGE } from "@/stores/perksStore" +import { + checkDelegatedAttestation, + decodeBadgePayload, + ipfsToBrowserURL, + isOriginsNFTBadge, + isUserRejected, + recognizeError, + requireEnv, + sentryDebug, + trimErrorMessage, +} from "@/utils" + +const EAS_GRAPHQL_URL = requireEnv("REACT_APP_EAS_GRAPHQL_URL") + +const SCROLL_EAS_ADDRESS = requireEnv("REACT_APP_EAS_ADDRESS") +const SCROLL_BADGE_SCHEMA = requireEnv("REACT_APP_BADGE_SCHEMA") + +const PROFILE_REGISTRY_ADDRESS = requireEnv("REACT_APP_PROFILE_REGISTRY_ADDRESS") + +const SCROLL_BADGE_RESOLVER_ADDRESS = requireEnv("REACT_APP_BADGE_RESOLVER_ADDRESS") + +const REVOKE_TIME = dayjs("2024-12-11 21:34:44").valueOf() + +// TODO: need to be stored in Badge Registry +export const SELF_ATTESTATION_BADGE_LIST = [ + { + name: "SCR Holding Badge", + image: DEFAULT_SCR_HOLDING_BADGE_IMAGE, + description: "This badge is awarded to users who hold SCR tokens, recognizing your active involvement and support for the SCR ecosystem", + badgeContract: SCR_HOLDING_BADGE_ADDRESS, + category: BADGE_TYPE.SELF_ATTESTATION, + thirdParty: false, + issuer: { + name: "Scroll", + logo: "https://scroll.io/static/media/Scroll_Logomark.673577c8260b63ae56867bc9af6af514.svg", + origin: "https://scroll.io", + communityURL: "https://discord.gg/scroll", + }, + }, + ETHEREUM_YEAR_BADGE, +] + +interface Attestation { + attester: string + data: string + id: string + time: string + txid: string +} + +const initializeInstance = async provider => { + const signer = await provider.getSigner(0) + const profileRegistryContract = new ethers.Contract(PROFILE_REGISTRY_ADDRESS, ProfileRegistryABI, signer) + const unsignedProfileRegistryContract = new ethers.Contract(PROFILE_REGISTRY_ADDRESS, ProfileRegistryABI, provider) + return { profileRegistryContract, unsignedProfileRegistryContract } +} + +const initializePublicInstance = async provider => { + const unsignedProfileRegistryContract = new ethers.Contract(PROFILE_REGISTRY_ADDRESS, ProfileRegistryABI, provider) + return unsignedProfileRegistryContract +} + +const queryEASAttestationsByWalletAddress = async userAddress => { + const query = ` + query Attestation { + attestations( + where: { + schemaId: { equals: "${SCROLL_BADGE_SCHEMA}" }, + recipient: { equals: "${userAddress}" }, + revoked: { equals: false }, + } + ) { + attester + data + id + time + txid + } + } + ` + + try { + const response = await fetch(EAS_GRAPHQL_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ query }), + }) + + const { + data: { attestations }, + } = await response.json() + + return attestations + } catch (error) { + sentryDebug(`query user's badges: ${error.message}`) + throw new Error("Failed to query user badges:") + } +} + +// TODO: fetch from backend +const querySelfAttestationsByWalletAddress = async (provider, userAddress, badgeContractList) => { + async function fetchAttestation(userAddress, badgeContract) { + const badgeContractInstance = new ethers.Contract(badgeContract, BadgeABI, provider) + const hasBadge = await badgeContractInstance.hasBadge(userAddress) + if (hasBadge) { + const attestation = await badgeContractInstance.getAttestation(pad(userAddress, { size: 32 })) + return { + attester: attestation.attester, + data: attestation.data, + id: attestation.uid, + time: attestation.time, + txid: attestation.txid, + revokeTime: REVOKE_TIME, + // attached: true, + } + } + + if (isInGracePeriod({ revokeTime: REVOKE_TIME })) { + return { + attester: "0xeF071708e09BECFEac1e3d8AfA1602BB6eB57922", + data: "0x000000000000000000000000ef071708e09becfeac1e3d8afa1602bb6eb57922000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006", + id: "0x000000000000000000000000524e8087c964634625163a50eca80db748cc1388", + revokeTime: REVOKE_TIME, // the time when grace period starts + // attached: true, + badgeTokenURI: "https://nft.scroll.io/canvas/scr-holding/1.json", + time: 1733921850, + } + } + return null + } + const selfAttestationListResult = await Promise.allSettled(badgeContractList.map(badgeContract => fetchAttestation(userAddress, badgeContract))) + return selfAttestationListResult + .filter((item): item is PromiseFulfilledResult => item.status === "fulfilled" && item.value) + .map(item => item.value) + .filter(item => item) +} + +const queryAttestationByUID = async (provider, badgeUID) => { + try { + const badgeResolverInterface = new ethers.Contract(SCROLL_BADGE_RESOLVER_ADDRESS, CanvasBadgeResolverABI, provider) + const attestation = await badgeResolverInterface.getAndValidateBadge(badgeUID) + return { + id: attestation.uid, + data: attestation.data, + time: attestation.time, + recipient: attestation.recipient, + } + } catch (error) { + sentryDebug(`query attestation by uid: ${error.message}`) + return {} + } +} + +const getBadgeMetadata = async (provider, { badgeContract, badgeId, badgeTokenURI }) => { + try { + let tmpBadgeTokenURI = badgeTokenURI + if (!tmpBadgeTokenURI) { + const contract = new ethers.Contract(badgeContract, BadgeABI, provider) + tmpBadgeTokenURI = await contract.badgeTokenURI(badgeId) + } + + const badgeTokenBrowserURL = ipfsToBrowserURL(tmpBadgeTokenURI) + if (badgeTokenBrowserURL.includes("ambient")) { + return {} + } + const metadata = await scrollRequest(badgeTokenBrowserURL, { timeout: 5e3 }) + return metadata + } catch (error) { + return {} + } +} + +const checkIfProfileMinted = async (registryInstance, userAddress) => { + try { + const profileAddress = await registryInstance!.getProfile(userAddress) + const minted = await registryInstance!.isProfileMinted(profileAddress) + return { profileAddress, minted } + } catch (error) { + sentryDebug(`check minted:${userAddress}-${error.message}`) + return { profileAddress: null, minted: null } + } +} + +const checkHasBadge = async (provider, userAddress, badgeContract) => { + try { + const badgeInstance = new ethers.Contract(badgeContract, BadgeABI, provider) + return badgeInstance.hasBadge(userAddress) + } catch (e) { + return false + } +} + +// work with publicProvider +const generateBadgeFromAttestation = async (provider, attestation, withMetadata = true) => { + const { data, id, badgeTokenURI, revokeTime, attached } = attestation + try { + const [badgeContract] = decodeBadgePayload(data) + if (withMetadata) { + const badgeMetadata = await getBadgeMetadata(provider, { badgeContract, badgeId: id, badgeTokenURI }) + return { + id, + badgeContract, + revokeTime, + attached, + ...badgeMetadata, + } + } + return { + id, + badgeContract, + } + } catch (error) { + sentryDebug(`fill badges detail:${error.message}`) + console.error("Failed to decode badge payload:", error) + } +} + +const queryUserBadges = async (provider, userAddress, withMetadata = true) => { + try { + const attestations = await queryEASAttestationsByWalletAddress(userAddress) + const selfAttestations = await querySelfAttestationsByWalletAddress(provider, userAddress, SELF_ATTESTATION_BADGE_ADDRESS_LIST) + // console.log(selfAttestations, "selfAttestations") + const allAttestations = [...attestations, ...selfAttestations] + const generateBadgesPromises = allAttestations.map(attestation => { + return generateBadgeFromAttestation(provider, attestation, withMetadata) + }) + const badges = await Promise.all(generateBadgesPromises) + return badges + } catch (error) { + throw new Error("Failed to query user badges") + } +} + +const queryCanvasUsername = async (provider, profileAddress) => { + try { + const profileContract = new ethers.Contract(profileAddress, ProfileABI, provider) + const name = await profileContract.username() + + return { profileContract, name } + } catch (error) { + sentryDebug(`query username: ${error.message}`) + throw new Error("Failed to fetch username") + } +} + +const isAttachedBadge = badge => { + if (!FORCE_PAY_GAS_FEE_BADGE_LIST.includes(badge.badgeContract)) { + return true + } + if (FORCE_PAY_GAS_FEE_BADGE_LIST.includes(badge.badgeContract) && badge.attached) { + return true + } + return false +} + +const isInGracePeriod = badge => { + const { revokeTime } = badge + if (!revokeTime) { + return false + } + if (dayjs(revokeTime).add(GRACE_PERIOD_DURATION, "m").isBefore(dayjs())) { + return false + } + return true +} + +const getOrderedAttachedBadges = async (profileContract, userBadges) => { + try { + const badgesProxy = await profileContract!.getAttachedBadges() + const validBadgesProxy = await profileContract!.getValidBadges() + const validBadges = Array.from(validBadgesProxy) + const attachedBadges: Array = Array.from(badgesProxy) + + const badgeOrder = await getBadgeOrder(profileContract) + + const orderedAttachedBadges = badgeOrder + .map((order, index) => [Number(order), attachedBadges[index]]) + .sort((a: (string | number)[], b: (string | number)[]) => (a[0] as number) - (b[0] as number)) + .map(item => item[1] as string) + .filter(badgeId => { + const badge = userBadges.find(badge => badge.id === badgeId) + if (!badge) return false + + if (validBadges.includes(badgeId) && isAttachedBadge(badge)) { + return true + } + + if (isInGracePeriod(badge)) { + return true + } + return false + }) + + return { orderedAttachedBadges, attachedBadges, badgeOrder } + } catch (error) { + sentryDebug(`query attached badges: ${error.message}`) + throw new Error("Failed to query attached badges") + } +} + +const getBadgeOrder = async profileContract => { + try { + const badgeOrder = await profileContract.getBadgeOrder() + const badgeOrderArray = Array.from(badgeOrder) + return badgeOrderArray + } catch (error) { + sentryDebug(`query badge order: ${error.message}`) + console.error("Failed to query attached badges:", error) + return [] + } +} + +const fetchCanvasDetail = async (privider, walletAddress, profileAddress) => { + const { profileContract, name } = await queryCanvasUsername(privider, profileAddress) + const userBadges = await queryUserBadges(privider, walletAddress) + const { orderedAttachedBadges, attachedBadges, badgeOrder } = await getOrderedAttachedBadges(profileContract, userBadges) + return { name, profileContract, userBadges, attachedBadges, orderedAttachedBadges, badgeOrder } +} + +const checkBadgeEligibility = async (provider, walletAddress, badge: any) => { + try { + // originsNFT + if (isOriginsNFTBadge(badge.badgeContract)) { + const { validator } = ORIGINS_NFT_BADGE + const eligibility = await validator(provider, walletAddress) + return eligibility + } + if (badge.category === BADGE_TYPE.SELF_ATTESTATION) { + return null + } + + if (!badge.baseURL && !badge.eligibilityCheck) { + return true + } + // permissionless + if (!badge.baseURL && badge.eligibilityCheck) { + const badgeInstance = new ethers.Contract(badge.badgeContract, BadgeABI, provider) + const eligibility = await badgeInstance.isEligible(walletAddress) + return eligibility + } + // backend authorized / airdropped + if (badge.baseURL) { + const data = await scrollRequest(checkBadgeEligibilityURL(badge.baseURL, walletAddress, badge.badgeContract), { + timeout: 1e4, + }) + return data.eligibility ?? false + } + return false + } catch (error) { + sentryDebug(`check badge eligibility: ${badge.badgeContract}-${error.message}`) + return false + } +} + +const mintBackendAuthorizedBadge = async (signer, walletAddress, badgeAddress, attesterProxyAddress, claimBaseUrl) => { + const { tx: unsignedTx } = await scrollRequest(claimBadgeURL(claimBaseUrl, walletAddress, badgeAddress)) + checkDelegatedAttestation(unsignedTx, attesterProxyAddress) + const tx = await signer.sendTransaction(unsignedTx) + const txReceipt = await tx.wait() + if (txReceipt.status === 1) { + return txReceipt.logs[0].data + } else { + throw new Error("due to any operation that can cause the transaction or top-level call to revert") + } +} + +const mintOriginNFTBadge = async (signer, walletCurrentAddress, badgeAddress, nftAddress, nftAbi) => { + const nftContract = new ethers.Contract(nftAddress[0], nftAbi, signer) + const nftV2Contract = new ethers.Contract(nftAddress[1], nftAbi, signer) + let tokenId, nftVersion + + try { + tokenId = await nftContract.tokenOfOwnerByIndex(walletCurrentAddress, 0) + nftVersion = 0 + } catch (error) { + tokenId = await nftV2Contract.tokenOfOwnerByIndex(walletCurrentAddress, 0) + nftVersion = 1 + } + + const abiCoder = new AbiCoder() + const originsBadgePayload = abiCoder.encode(["address", "uint256"], [nftAddress[nftVersion], tokenId]) + const badgePayload = abiCoder.encode(["address", "bytes"], [badgeAddress, originsBadgePayload]) + const easContract = new ethers.Contract(SCROLL_EAS_ADDRESS, AttestProxyABI, signer) + const attestParams = { + schema: SCROLL_BADGE_SCHEMA, + data: { + recipient: walletCurrentAddress, + expirationTime: 0, + revocable: false, + refUID: "0x0000000000000000000000000000000000000000000000000000000000000000", + data: badgePayload, + value: 0, + }, + } + const tx = await easContract.attest(attestParams) + const txReceipt = await tx.wait() + if (txReceipt.status === 1) { + return txReceipt.logs[0].data + } else { + throw new Error("due to any operation that can cause the transaction or top-level call to revert") + } +} + +const mintPermissionlessBadge = async (signer, walletCurrentAddress, badgeAddress) => { + const abiCoder = new AbiCoder() + const badgePayload = abiCoder.encode(["address", "bytes"], [badgeAddress, "0x"]) + const easContract = new ethers.Contract(SCROLL_EAS_ADDRESS, AttestProxyABI, signer) + const attestParams = { + schema: SCROLL_BADGE_SCHEMA, + data: { + recipient: walletCurrentAddress, + expirationTime: 0, + revocable: false, + refUID: "0x0000000000000000000000000000000000000000000000000000000000000000", + data: badgePayload, + value: 0, + }, + } + + const tx = await easContract.attest(attestParams) + const txReceipt = await tx.wait() + if (txReceipt.status === 1) { + return txReceipt.logs[0].data + } else { + throw new Error("due to any operation that can cause the transaction or top-level call to revert") + } +} + +const mintBadge = async (provider, walletCurrentAddress, badge) => { + try { + const { badgeContract, attesterProxy, baseURL } = badge + const signer = await provider!.getSigner(0) + + // Origins NFT Badge + if (isOriginsNFTBadge(badgeContract)) { + const { nftAddress, nftAbi } = ORIGINS_NFT_BADGE + return await mintOriginNFTBadge(signer, walletCurrentAddress, badgeContract, nftAddress, nftAbi) + } + // Backend-authorized Badges + if (attesterProxy) { + return await mintBackendAuthorizedBadge(signer, walletCurrentAddress, badgeContract, attesterProxy, baseURL) + } + + return await mintPermissionlessBadge(signer, walletCurrentAddress, badgeContract) + } catch (error) { + if (isUserRejected(error)) { + return false + } else { + const message = recognizeError(error, badge.issuer) + sentryDebug(`mint badge:${walletCurrentAddress}-${badge.badgeContract}-${error.message}`) + throw typeof message === "string" ? new Error(trimErrorMessage(message)) : message + } + } +} +const upgradeBadge = async (provider, badge) => { + try { + const { id, badgeContract } = badge + const signer = await provider!.getSigner(0) + const badgeInstance = new ethers.Contract(badgeContract, BadgeABI, signer) + const tx = await badgeInstance.upgrade(id) + const txReceipt = await tx.wait() + if (txReceipt.status === 1) { + const badgeMetadataURI = await badgeInstance.badgeTokenURI(id) + const badgeTokenBrowserURL = ipfsToBrowserURL(badgeMetadataURI) + const metadata = await scrollRequest(badgeTokenBrowserURL) + return metadata + } else { + throw new Error("due to any operation that can cause the transaction or top-level call to revert") + } + } catch (error) { + if (isUserRejected(error)) { + return false + } else { + const message = recognizeError(error, badge.issuer) + sentryDebug(`upgrade badge:${badge.id}-${error.message}`) + throw typeof message === "string" ? new Error(trimErrorMessage(message)) : message + } + } +} + +const checkBadgeUpgradable = async (provider, badge) => { + try { + const { id, badgeContract } = badge + + const badgeInstance = new ethers.Contract(badgeContract, BadgeABI, provider) + const upgradable = await badgeInstance.canUpgrade(id) + return { ...badge, upgradable } + } catch (e) { + return { ...badge, upgradable: false } + } +} + +const customiseDisplay = async ({ profileContract, attachBadges, detachBadges, order }) => { + const calls: any = [] + if (attachBadges) { + const attachCallData = profileContract.interface.encodeFunctionData("attach(bytes32[])", [attachBadges]) + calls.push(attachCallData) + } + + if (detachBadges) { + const detachCallData = profileContract.interface.encodeFunctionData("detach", [detachBadges]) + calls.push(detachCallData) + } + + if (order) { + const reorderCallData = profileContract.interface.encodeFunctionData("reorderBadges", [order]) + calls.push(reorderCallData) + } + const txResponse = await profileContract.multicall(calls) + const txReceipt = await txResponse.wait() + + if (txReceipt.status !== 1) { + throw new Error("due to any operation that can cause the transaction or top-level call to revert") + } +} + +const checkIfHasBadgeByAddress = async (provider, userAddress, badgeAddress) => { + try { + const badgeContract = new ethers.Contract(badgeAddress, BadgeABI, provider) + const hasBadge = await badgeContract.hasBadge(userAddress) + return hasBadge + } catch (error) { + return false + } +} + +const getReferrerData = async (registryInstance, userAddress) => { + const referrerData = await registryInstance.referrerData(userAddress) + return referrerData +} + +const fetchNotionBadgeByAddr = async addr => { + try { + if (!addr) { + return {} + } + const data = await scrollRequest(fetchBadgeByAddrURL(addr)) + return data + } catch (e) { + // TODO: delete + const badge = SELF_ATTESTATION_BADGE_LIST.find(item => item.badgeContract === addr) + return badge ?? {} + } +} + +export const fetchIssuer = async issuerName => { + try { + const { data } = await scrollRequest(fetchEcosystemProtocolByNameURL(issuerName)) + if (!data.length) { + return {} + } + const [{ name: issuerFullName, ext, website }] = data + const issuerLogo = fetchEcosystemProtocolLogo(issuerFullName, ext) + const issuer = { + name: issuerFullName, + logo: issuerLogo, + origin: website, + } + return issuer + } catch (error) { + return {} + } +} + +const pickNewObtainedBadges = (walletAddress, userBadgeIds: string[]) => { + let newObtainedBadges: string[] = [] + const preUserBadgesMap = readItem(localStorage, CANVAS_USER_BADGES) + + if (preUserBadgesMap?.[walletAddress]) { + newObtainedBadges = userBadgeIds.filter(id => !preUserBadgesMap[walletAddress].includes(id)) + } else { + newObtainedBadges = userBadgeIds + writeItem(localStorage, CANVAS_USER_BADGES, { ...preUserBadgesMap, [walletAddress]: userBadgeIds }) + } + return newObtainedBadges +} + +const persistUserBadges = (walletAddress, userBadgeIds: string[]) => { + const preUserBadgesMap = readItem(localStorage, CANVAS_USER_BADGES) + writeItem(localStorage, CANVAS_USER_BADGES, { ...preUserBadgesMap, [walletAddress]: userBadgeIds }) +} + +export { + initializeInstance, + initializePublicInstance, + checkIfProfileMinted, + checkHasBadge, + // getBadgeMetadata, + queryEASAttestationsByWalletAddress, + queryUserBadges, + queryAttestationByUID, + queryCanvasUsername, + getOrderedAttachedBadges, + getBadgeOrder, + fetchCanvasDetail, + mintBadge, + upgradeBadge, + checkBadgeUpgradable, + customiseDisplay, + checkIfHasBadgeByAddress, + getReferrerData, + generateBadgeFromAttestation, + checkBadgeEligibility, + fetchNotionBadgeByAddr, + pickNewObtainedBadges, + persistUserBadges, + isInGracePeriod, +} diff --git a/src/services/perksService.ts b/src/services/perksService.ts new file mode 100644 index 000000000..8eda52c39 --- /dev/null +++ b/src/services/perksService.ts @@ -0,0 +1,36 @@ +import { readItem, writeItem } from "squirrel-gill/lib/storage" + +import { CANVAS_PERKS } from "@/constants/storageKey" +import { type Perk } from "@/stores/perksStore" + +export const notifyPerks = (perkList: Perk[]) => { + let firstSeePerks = false + let newPerksIds: string[] = [] + const prePerksIdList = readItem(localStorage, CANVAS_PERKS) + if (prePerksIdList) { + const prePerksIdSet = new Set(prePerksIdList) + newPerksIds = perkList.map(perk => perk.id).filter(id => !prePerksIdSet.has(id)) + } else { + firstSeePerks = true + writeItem( + localStorage, + CANVAS_PERKS, + perkList.map(perk => perk.id), + ) + } + return { + firstSeePerks, + newPerksIds, + } +} + +export const persistPerks = (perksIds: string[], append: boolean = false) => { + if (append) { + // perksIds includes new perks + const prePerksIds = readItem(localStorage, CANVAS_PERKS, []) + writeItem(localStorage, CANVAS_PERKS, [...prePerksIds, ...perksIds]) + } else { + // perksIds includes all perks + writeItem(localStorage, CANVAS_PERKS, perksIds) + } +} diff --git a/src/stores/batchBridgeStore.ts b/src/stores/batchBridgeStore.ts new file mode 100644 index 000000000..d68b45b37 --- /dev/null +++ b/src/stores/batchBridgeStore.ts @@ -0,0 +1,68 @@ +import { create } from "zustand" + +export enum BridgeSummaryType { + Summary = "Summary", + Selector = "Selector", +} + +export enum DepositBatchMode { + Fast = "Fast", + Economy = "Economy", +} + +type BatchDepositConfig = { + feeAmountPerTx: bigint + minAmountPerTx: bigint + maxTxsPerBatch: bigint + maxDelayPerBatch: bigint + safeBridgeGasLimit: bigint +} + +interface BatchBridgeStore { + bridgeSummaryType: BridgeSummaryType + depositBatchMode: DepositBatchMode + batchDepositConfig: BatchDepositConfig + depositAmountIsVaild: boolean + + changeBridgeSummaryType: (depositTpye: BridgeSummaryType) => void + changeDepositBatchMode: (depositBatchMode: DepositBatchMode) => void + changeBatchDepositConfig: (batchDepositConfig: BatchDepositConfig) => void + changeDepositAmountIsVaild: (depositAmountIsVaild: boolean) => void +} + +const useBatchBridgeStore = create()((set, get) => ({ + bridgeSummaryType: BridgeSummaryType.Summary, + depositBatchMode: DepositBatchMode.Fast, + batchDepositConfig: { + feeAmountPerTx: 0n, + minAmountPerTx: 0n, + maxTxsPerBatch: 0n, + maxDelayPerBatch: 0n, + safeBridgeGasLimit: 0n, + }, + depositAmountIsVaild: true, + + changeBridgeSummaryType: bridgeSummaryType => { + set({ + bridgeSummaryType, + }) + }, + + changeDepositBatchMode: depositBatchMode => { + set({ + depositBatchMode, + }) + }, + changeBatchDepositConfig: batchDepositConfig => { + set({ + batchDepositConfig, + }) + }, + changeDepositAmountIsVaild: depositAmountIsVaild => { + set({ + depositAmountIsVaild, + }) + }, +})) + +export default useBatchBridgeStore diff --git a/src/stores/bridgeStore.ts b/src/stores/bridgeStore.ts index 053fb88cc..7dc5c25a3 100644 --- a/src/stores/bridgeStore.ts +++ b/src/stores/bridgeStore.ts @@ -1,6 +1,9 @@ import { create } from "zustand" -import { NETWORKS } from "@/constants" +import { tokenListUrl } from "@/apis/dynamic" +import { NATIVE_TOKEN_LIST, NETWORKS } from "@/constants" +import { USER_TOKEN_LIST } from "@/constants/storageKey" +import { loadState } from "@/utils/localStorage" type TransactionType = "Deposit" | "Withdraw" @@ -26,6 +29,7 @@ interface BridgeStore { withDrawStep: WithDrawStep txResult: TxResult isNetworkCorrect: boolean + tokenList: Array changeFromNetwork: (network: Network) => void changeToNetwork: (network: Network) => void @@ -33,6 +37,7 @@ interface BridgeStore { changeTxResult: (txResult: TxResult | null) => void changeWithdrawStep: (withDrawStep: WithDrawStep) => void changeIsNetworkCorrect: (isNetworkCorrect: boolean) => void + fetchTokenList: () => Promise } const useBridgeStore = create()((set, get) => ({ @@ -43,6 +48,44 @@ const useBridgeStore = create()((set, get) => ({ withDrawStep: "1", txResult: null, isNetworkCorrect: true, + tokenList: NATIVE_TOKEN_LIST, + + fetchTokenList: async () => { + try { + const { tokens: tokensListTokens } = await scrollRequest(tokenListUrl) + const currentUserTokens = loadState(USER_TOKEN_LIST) || [] + + const combinedList = [...NATIVE_TOKEN_LIST, ...tokensListTokens, ...currentUserTokens] + const uniqueList = combinedList.reduce( + (accumulator, token) => { + // If the token doesn't have an address, consider it a native token and add it directly + if (!token.address) { + accumulator.result.push(token) + return accumulator + } + // Convert address to lowercase for case-insensitive deduplication + const lowercaseAddress = token.address.toLowerCase() + // Create a key combining address and chainId to ensure different chainIds are not deduplicated + const key = `${lowercaseAddress}-${token.chainId}` + + if (!accumulator.seen[key]) { + accumulator.seen[key] = true + accumulator.result.push(token) + } + return accumulator + }, + { seen: {}, result: [] }, + ).result + set({ + tokenList: uniqueList, + }) + } catch (e) { + set({ + tokenList: NATIVE_TOKEN_LIST, + }) + throw new Error(e.message) + } + }, changeHistoryVisible: value => { set({ diff --git a/src/stores/canvasProfileStore.ts b/src/stores/canvasProfileStore.ts new file mode 100644 index 000000000..242780443 --- /dev/null +++ b/src/stores/canvasProfileStore.ts @@ -0,0 +1,76 @@ +import { create } from "zustand" + +export enum NFTsDialogTypeEnum { + HIDDEN = "", + CLAIM = "claim", + SET_UP = "set-up", +} + +export enum ENSSubdomainDialogTypeEnum { + HIDDEN = "", + CLAIM = "claim", + CREATE_SUBDOMAIN = "create", + UPDATE_SUBDOMAIN = "update", + SUCCESS = "success", +} + +interface CanvasProfileStore { + cropAvatarDialogVisible: boolean + previewAvatarURL: any + + ENSSubdomainDialogType: ENSSubdomainDialogTypeEnum + ENSSubdomainDialogAllowBack: boolean + + NFTsDialogType: NFTsDialogTypeEnum + NFTsDialogAllowBack: boolean + editProfileVisible: boolean + + changeCropAvatarDialogVisible: (visible: boolean) => void + changePreviewAvatarURL: (base64: any) => void + changeENSSubdomainDialogType: (type: ENSSubdomainDialogTypeEnum, allowBack?: boolean) => void + changeNFTsDialogType: (type: NFTsDialogTypeEnum, allowBack?: boolean) => void + changeEditProfileVisible: (editProfileVisible: boolean) => void +} + +const useCanvasProfileStore = create()((set, get) => ({ + cropAvatarDialogVisible: false, + previewAvatarURL: null, + ENSSubdomainDialogType: ENSSubdomainDialogTypeEnum.HIDDEN, + ENSSubdomainDialogAllowBack: false, + NFTsDialogType: NFTsDialogTypeEnum.HIDDEN, + NFTsDialogAllowBack: false, + editProfileVisible: false, + + changeCropAvatarDialogVisible: cropAvatarDialogVisible => { + set({ + cropAvatarDialogVisible, + }) + }, + changePreviewAvatarURL: previewAvatarURL => { + set({ + previewAvatarURL, + }) + }, + + changeNFTsDialogType: (NFTsDialogType: NFTsDialogTypeEnum, allowBack: boolean = false) => { + set({ + NFTsDialogType, + NFTsDialogAllowBack: allowBack, + }) + }, + + changeENSSubdomainDialogType: (visible: ENSSubdomainDialogTypeEnum, allowBack: boolean = false) => { + set({ + ENSSubdomainDialogType: visible, + ENSSubdomainDialogAllowBack: allowBack, + }) + }, + + changeEditProfileVisible: (editProfileVisible: boolean) => { + set({ + editProfileVisible, + }) + }, +})) + +export default useCanvasProfileStore diff --git a/src/stores/canvasStore.ts b/src/stores/canvasStore.ts new file mode 100644 index 000000000..5bca3026e --- /dev/null +++ b/src/stores/canvasStore.ts @@ -0,0 +1,593 @@ +import { Contract } from "ethers" +import produce from "immer" +import { create } from "zustand" + +import { Badge, ETHEREUM_YEAR_BADGE } from "@/constants" +import { fetchWhiteListBadges } from "@/services/badgeService" +import { + checkBadgeUpgradable, + fetchCanvasDetail, + fetchIssuer, + fetchNotionBadgeByAddr, + getOrderedAttachedBadges, + persistUserBadges, + pickNewObtainedBadges, + queryCanvasUsername, + queryUserBadges, + upgradeBadge, +} from "@/services/canvasService" +import { testAsyncFunc } from "@/utils" + +export enum MintedStatus { + MINTED = "MINTED", + NOT_MINTED = "NOT_MINTED", + UNKNOWN = "UNKNOWN", +} + +export enum BadgeDetailDialogType { + HIDDEN = "", + MINT = "mint", // not in use, only for third party badge example + UPGRADE = "upgrade", + VIEW = "view", + NO_CANVAS = "noCanvas", +} + +export enum BadgesDialogType { + HIDDEN = "", + UPGRADE = "upgrade", +} + +// interface UserBadge { +// badgeContract: string +// description: string +// id: string +// image: string +// name: string +// attributes?: any[] +// } + +export type UpgradableBadge = Badge & { upgradable: boolean; id: string } + +interface CanvasStore { + // /invite/referralCode + referralCode: string + profileDialogVisible: boolean + referDialogVisible: boolean + customizeDisplayDialogVisible: boolean + badgeDetailDialogVisible: BadgeDetailDialogType + badgesDialogVisible: BadgesDialogType + + mintFlowVisible: boolean + sortedBadges: any + selectedBadge: any + + changeReferralCode: (code: string) => void + changeMintFlowVisible: (visible: boolean) => void + changeProfileDialog: (visible: boolean) => void + changeReferDialog: (visible: boolean) => void + changeCustomizeDisplayDialogVisible: (visible: boolean) => void + changeSortedBadges: (badges: any) => void + changeBadgesDialogVisible: (visible: BadgesDialogType) => void + changeBadgeDetailDialog: (visible: BadgeDetailDialogType) => void + changeSelectedBadge: (badge: any) => void + + profileName: string + isProfileMinting: boolean + isBadgeMinting: Map + isBadgeUpgrading: Map + isFirstBadgeMinting: boolean + profileMintedChecking: boolean + profileDetailLoading: boolean + walletDetailLoading: boolean + queryUsernameLoading: boolean + queryUserBadgesLoading: boolean + pickUpgradableBadgesLoading: boolean + notifiableBadgesLoading: boolean + + profileAddress: string | null + profileMinted: boolean | null + username: string + canvasUsername: string + userBadges: Array + attachedBadges: Array + orderedAttachedBadges: Array + upgradableBadges: Array + notifiableBadges: Array + badgeOrder: Array + profileContract: Contract | null + firstBadgeWithPosition: any + badgeAnimationVisible: boolean + initialMint: boolean + + inputReferralCode: Array + badgeList: Array + + changeProfileName: (name: string) => void + changeIsProfileMinting: (isProfileMinting: boolean) => void + changeIsFirstBadgeMinting: (isFirstBadgeMinting: boolean) => void + changeIsBadgeMinting: (id, loading) => void + changeIsBadgeUpgrading: (id, loading) => void + checkIfProfileMinted: (instance: Contract, address: string, test?: boolean) => Promise + fetchCurrentCanvasDetail: (signer, walletAddress, profileAddress) => void + queryNotifiableBadges: (walletAddress) => void + checkAndFetchCurrentWalletCanvas: (prividerOrSigner, unsignedProfileRegistryContract, walletAddress) => Promise + fetchOthersCanvasDetail: (prividerOrSigner, othersAddress, profileAddress) => void + changeProfileMintedLoading: (loading: boolean) => void + changeProfileDetailLoading: (loading: boolean) => void + queryUsername: () => void + queryAttachedBadges: () => void + queryVisibleBadges: (provider, address) => void + queryEASAttestationsByWalletAddress: (provider, address) => void + pickUpgradableBadges: (provider) => void + addFirstBadge: (provider, badgeId, badgeImage, badgeContract) => void + clearCanvas: () => void + recordFirstBadgePosition: (position) => void + changeBadgeAnimationVisible: (visible: boolean) => void + changeInitialMint: (initialMint: boolean) => void + queryFirstMintUsername: (provider) => void + changeInputReferralCode: (inputReferralCode) => void + upgradeBadgeAndRefreshUserBadges: (provider, badge: { id: string; badgeContract: string }) => Promise + repersistUserBadges: (address) => void +} + +const useCanvasStore = create()((set, get) => ({ + referralCode: "", + profileDialogVisible: false, + referDialogVisible: false, + customizeDisplayDialogVisible: false, + badgeDetailDialogVisible: BadgeDetailDialogType.HIDDEN, + badgesDialogVisible: BadgesDialogType.HIDDEN, + sortedBadges: [], + selectedBadge: {}, + + // now + profileAddress: null, + profileContract: null, + profileMinted: null, + + mintFlowVisible: false, + profileName: "", + isProfileMinting: false, + isBadgeMinting: new Map(), + isBadgeUpgrading: new Map(), + isFirstBadgeMinting: false, + profileMintedChecking: false, + profileDetailLoading: false, + queryUsernameLoading: false, + walletDetailLoading: false, + queryUserBadgesLoading: false, + pickUpgradableBadgesLoading: false, + notifiableBadgesLoading: false, + + username: "", + canvasUsername: "", + userBadges: [], + attachedBadges: [], + orderedAttachedBadges: [], + upgradableBadges: [], + notifiableBadges: [], + badgeOrder: [], + firstBadgeWithPosition: {}, + badgeAnimationVisible: false, + initialMint: false, + + inputReferralCode: ["", "", "", "", ""], + + badgeList: [], + + checkIfProfileMinted: async (registryInstance, userAddress, test) => { + try { + set({ + profileMintedChecking: true, + }) + const profileAddress = await registryInstance!.getProfile(userAddress) + const profileMinted = await registryInstance!.isProfileMinted(profileAddress) + if (test) { + set({ + profileAddress, + profileMinted: true, + profileMintedChecking: false, + }) + return { profileAddress, minted: true } + } + set({ + profileAddress, + profileMinted, + profileMintedChecking: false, + }) + return { profileAddress, minted: profileMinted } + } catch (error) { + console.log("Failed to get wallet profile:", error) + + set({ + profileAddress: "", + profileMinted: false, + profileMintedChecking: false, + }) + throw new Error("Failed to check if profile minted") + // return { profileAddress: null, minted: null } + } + }, + fetchOthersCanvasDetail: async (privider, othersAddress, profileAddress) => { + const { name, userBadges, attachedBadges, orderedAttachedBadges, badgeOrder } = await fetchCanvasDetail(privider, othersAddress, profileAddress) + set({ + canvasUsername: name, + userBadges, + attachedBadges, + orderedAttachedBadges, + badgeOrder, + }) + }, + + // fetch wallet profile when viewing others canvas + checkAndFetchCurrentWalletCanvas: async (prividerOrSigner, unsignedProfileRegistryContract, walletAddress) => { + set({ + walletDetailLoading: true, + }) + try { + const { minted, profileAddress } = await get().checkIfProfileMinted(unsignedProfileRegistryContract, walletAddress) + + if (minted) { + const { profileContract, name } = await queryCanvasUsername(prividerOrSigner, profileAddress) + set({ + username: name, + profileContract, + walletDetailLoading: false, + }) + } else { + set({ + username: "", + profileContract: null, + walletDetailLoading: false, + }) + } + return true + } catch (e) { + return e.message + } finally { + set({ + walletDetailLoading: false, + }) + } + }, + + fetchCurrentCanvasDetail: async (signer, walletAddress, profileAddress) => { + const { name, profileContract, userBadges, attachedBadges, orderedAttachedBadges, badgeOrder } = await fetchCanvasDetail( + signer, + walletAddress, + profileAddress, + ) + + set({ + username: name, + canvasUsername: name, + profileContract, + userBadges, + attachedBadges, + orderedAttachedBadges, + badgeOrder, + }) + }, + + queryNotifiableBadges: async walletAddress => { + set({ notifiableBadgesLoading: true }) + const { userBadges } = get() + const newObtainedBadges = pickNewObtainedBadges( + walletAddress, + userBadges.map(badge => badge.id), + ) + if (!newObtainedBadges.length) { + set({ + notifiableBadges: [], + notifiableBadgesLoading: false, + }) + return + } + + const fetchWhiteListBadgesPromise = fetchWhiteListBadges() + // TODO: request whitelist and recognizedlist from server + const fetchRecognizedBadgesPromise = testAsyncFunc([], 2e3) as Promise + + const [whitelistBadges, recognizedBadges] = await Promise.all([fetchWhiteListBadgesPromise, fetchRecognizedBadgesPromise]) + + const notifiableBadges = newObtainedBadges + .map(badgeId => userBadges.find(badge => badge.id === badgeId)!) + .filter(item => whitelistBadges.includes(item.badgeContract) && !recognizedBadges.includes(item.badgeContract)) + .map(item => item.id) + + set({ + notifiableBadges, + notifiableBadgesLoading: false, + }) + }, + + repersistUserBadges: walletAddress => { + const { userBadges } = get() + persistUserBadges( + walletAddress, + userBadges.map(item => item.id), + ) + set({ + notifiableBadges: [], + }) + }, + + changeProfileName: profileName => { + set({ + profileName, + }) + }, + changeIsProfileMinting: isProfileMinting => { + set({ + isProfileMinting, + }) + }, + changeIsBadgeMinting: (badgeContract, loading) => { + const newIsBadgeMinting = new Map(get().isBadgeMinting) + if (loading) { + newIsBadgeMinting.set(badgeContract, true) + } else { + newIsBadgeMinting.delete(badgeContract) + } + set({ + isBadgeMinting: newIsBadgeMinting, + }) + }, + + changeIsBadgeUpgrading: (id, loading) => { + const newIsBadgeUpgrading = new Map(get().isBadgeUpgrading) + if (loading) { + newIsBadgeUpgrading.set(id, true) + } else { + newIsBadgeUpgrading.delete(id) + } + set({ + isBadgeUpgrading: newIsBadgeUpgrading, + }) + }, + + changeIsFirstBadgeMinting: isFirstBadgeMinting => { + set({ + isFirstBadgeMinting, + }) + }, + changeProfileMintedLoading: profileMintedChecking => { + set({ + profileMintedChecking, + }) + }, + + changeProfileDetailLoading: profileDetailLoading => { + set({ + profileDetailLoading, + }) + }, + + // after switching wallet address + clearCanvas: () => { + set({ + referralCode: "", + // close all dialog + mintFlowVisible: false, + profileDialogVisible: false, + referDialogVisible: false, + customizeDisplayDialogVisible: false, + badgeDetailDialogVisible: BadgeDetailDialogType.HIDDEN, + badgesDialogVisible: BadgesDialogType.HIDDEN, + initialMint: false, + // reset profile mint status + profileMinted: null, + profileName: "", + username: "", + canvasUsername: "", + userBadges: [], + attachedBadges: [], + orderedAttachedBadges: [], + badgeOrder: [], + notifiableBadges: [], + }) + }, + + // after calling checkIfProfileMinted, no profileContract + queryFirstMintUsername: async provider => { + set({ + queryUsernameLoading: true, + }) + const { profileContract, name } = await queryCanvasUsername(provider, get().profileAddress) + set({ + username: name, + canvasUsername: name, + profileContract, + + queryUsernameLoading: false, + }) + }, + queryUsername: async () => { + set({ + queryUsernameLoading: true, + }) + const username = await get().profileContract!.username() + set({ + username, + canvasUsername: username, + queryUsernameLoading: false, + }) + }, + + queryAttachedBadges: async () => { + const { userBadges, profileContract } = get() + set({ + queryUserBadgesLoading: true, + }) + const { orderedAttachedBadges, badgeOrder, attachedBadges } = await getOrderedAttachedBadges(profileContract, userBadges) + set({ + attachedBadges, + orderedAttachedBadges, + badgeOrder, + queryUserBadgesLoading: false, + }) + }, + + queryEASAttestationsByWalletAddress: async (provider, walletAddress) => { + set({ + queryUserBadgesLoading: true, + }) + const userBadges = await queryUserBadges(provider, walletAddress, false) + set({ + userBadges, + queryUserBadgesLoading: false, + }) + }, + + // auto attach + queryVisibleBadges: async (provider, walletAddress) => { + set({ + queryUserBadgesLoading: true, + }) + const userBadges = await queryUserBadges(provider, walletAddress) + const { orderedAttachedBadges, badgeOrder, attachedBadges } = await getOrderedAttachedBadges(get().profileContract, userBadges) + set({ + userBadges, + attachedBadges, + orderedAttachedBadges, + badgeOrder, + queryUserBadgesLoading: false, + }) + }, + + pickUpgradableBadges: async provider => { + set({ + pickUpgradableBadgesLoading: true, + }) + const { userBadges } = get() + const checkPromiseList = userBadges.map(badge => checkBadgeUpgradable(provider, badge)) + const asyncCheckedBadges = await Promise.allSettled(checkPromiseList) + const finalUpgradableBadges = asyncCheckedBadges + .filter((item): item is PromiseFulfilledResult => item.status === "fulfilled" && item.value.upgradable) + .map(item => item.value) + + const fetchIssuerPromiseList = finalUpgradableBadges.map(async item => { + let issuer + try { + const badge = await fetchNotionBadgeByAddr(item.badgeContract) + + if (badge.issuer) { + issuer = badge.issuer + } else if (item.issuerName) { + issuer = await fetchIssuer(item.issuerName) + } + return { ...item, issuer } + } catch (e) { + return { ...item } + } + }) + const upgradableBadgesWithIssuer = await Promise.all(fetchIssuerPromiseList) + set({ + pickUpgradableBadgesLoading: false, + upgradableBadges: upgradableBadgesWithIssuer, + }) + }, + + addFirstBadge: async (providerOrSigner, badgeId, badgeImage, badgeContract) => { + set({ + userBadges: [{ id: badgeId, name: ETHEREUM_YEAR_BADGE.name, description: ETHEREUM_YEAR_BADGE.description, image: badgeImage, badgeContract }], + attachedBadges: [badgeId], + orderedAttachedBadges: [badgeId], + badgeOrder: [1], + }) + }, + + upgradeBadgeAndRefreshUserBadges: async (provider, badge) => { + const { changeIsBadgeUpgrading } = get() + changeIsBadgeUpgrading(badge.id, true) + const metadata = await upgradeBadge(provider, badge) + + set( + produce(state => { + const upgradedBadge = state.userBadges.find(item => item.id === badge.id) + const { name, image, description } = metadata + upgradedBadge.name = name + upgradedBadge.image = image + upgradedBadge.description = description + }), + ) + changeIsBadgeUpgrading(badge.id, false) + return metadata + }, + + changeSortedBadges: (badges: any) => { + set({ + sortedBadges: badges, + }) + }, + changeReferralCode: code => { + set({ + referralCode: code, + }) + }, + + changeMintFlowVisible: mintFlowVisible => { + set({ + mintFlowVisible, + }) + }, + + changeProfileDialog: visible => { + set({ + profileDialogVisible: visible, + }) + }, + + changeReferDialog: visible => { + set({ + referDialogVisible: visible, + }) + }, + + changeCustomizeDisplayDialogVisible: visible => { + set({ + customizeDisplayDialogVisible: visible, + }) + }, + + changeBadgesDialogVisible: visible => { + set({ + badgesDialogVisible: visible, + }) + }, + + changeBadgeDetailDialog: visible => { + set({ + badgeDetailDialogVisible: visible, + }) + }, + + changeSelectedBadge: badge => { + set({ + selectedBadge: badge, + }) + }, + recordFirstBadgePosition: firstBadgeWithPosition => { + set({ + firstBadgeWithPosition, + }) + }, + changeBadgeAnimationVisible: badgeAnimationVisible => { + set({ + badgeAnimationVisible, + }) + }, + changeInitialMint: initialMint => { + set({ + initialMint, + }) + }, + + changeInputReferralCode: inputReferralCode => { + set({ + inputReferralCode, + }) + }, +})) + +export default useCanvasStore diff --git a/src/stores/perksStore.ts b/src/stores/perksStore.ts new file mode 100644 index 000000000..619e5bf84 --- /dev/null +++ b/src/stores/perksStore.ts @@ -0,0 +1,195 @@ +import { create } from "zustand" + +import { ETHEREUM_YEAR_BADGE_ADDRESS, SCR_HOLDING_BADGE_ADDRESS } from "@/constants" +import { notifyPerks, persistPerks } from "@/services/perksService" +import { truncateAddress } from "@/utils" + +const DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE = "/imgs/canvas/Badge_Ethereum_Year.png" +export const DEFAULT_SCR_HOLDING_BADGE_IMAGE = "/imgs/canvas/SCR_Holding_Badge.png" + +const SCR_HOLDING_BADGE_NAME = "SCR Holding Badge" +const ETHEREUM_YEAR_BADGE_NAME = "Ethereum Year Badge" + +interface PerkMetadata { + name: string + badgeContract: string + imageURL: string + owned: boolean +} + +export interface Perk { + id: string + title: string + description: string + metadata: PerkMetadata[] + claimable: boolean + claimed: boolean + + checkClaimableFunc: () => void +} + +interface PerksStore { + perks: Perk[] + perksDialogVisible: boolean + firstSeePerks: boolean // check if user see perks for the first time + newPerksIds: string[] // diff new perk list and old perk list + generatePerks: (props: any) => void + appendNewPerksIds: () => void + changePerksDialogVisible: (visible: boolean) => void + + clearPerks: () => void +} + +const usePerkStore = create()((set, get) => ({ + perks: [], + perksDialogVisible: false, + firstSeePerks: false, + newPerksIds: [], + + generatePerks: async props => { + const { walletCurrentAddress, userBadges, ensClaimed, nftClaimed } = props + + // console.log(userBadges, "userBadges") + + const perkList = [ + { + id: "claim-ens-subdomain", + title: "Claim your ENS subdomain", + description: `Make your ${truncateAddress( + walletCurrentAddress, + )} address readable for free! This is your personalized address that people can send crypto to.`, + + metadata: [ + { + name: ETHEREUM_YEAR_BADGE_NAME, + badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + imageURL: DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE, + owned: false, + }, + { + name: SCR_HOLDING_BADGE_NAME, + badgeContract: SCR_HOLDING_BADGE_ADDRESS, + imageURL: DEFAULT_SCR_HOLDING_BADGE_IMAGE, + owned: false, + }, + ], + + checkClaimableFunc: () => { + const yearBadge = userBadges.find(badge => badge.badgeContract === ETHEREUM_YEAR_BADGE_ADDRESS) + const scrBadge = userBadges.find(badge => badge.badgeContract === SCR_HOLDING_BADGE_ADDRESS) + return { + claimable: !!yearBadge && !!scrBadge, + + metadata: [ + { + name: ETHEREUM_YEAR_BADGE_NAME, + badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + imageURL: yearBadge ? yearBadge.image : DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE, + owned: !!yearBadge, + }, + { + name: SCR_HOLDING_BADGE_NAME, + badgeContract: SCR_HOLDING_BADGE_ADDRESS, + imageURL: scrBadge ? scrBadge.image : DEFAULT_SCR_HOLDING_BADGE_IMAGE, + owned: !!scrBadge, + }, + ], + } + }, + claimable: false, + claimed: ensClaimed ?? false, + }, + { + id: "nft-profile-setup", + title: "Set up an NFT profile", + description: "Set your profile picture to an NFT you own to show off your prized possessions.", + metadata: [ + { + name: ETHEREUM_YEAR_BADGE_NAME, + badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + imageURL: DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE, + owned: false, + }, + ], + checkClaimableFunc: () => { + const yearBadge = userBadges.find(badge => badge.badgeContract === ETHEREUM_YEAR_BADGE_ADDRESS) + return { + claimable: !!yearBadge, + metadata: [ + { + name: ETHEREUM_YEAR_BADGE_NAME, + badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + imageURL: yearBadge ? yearBadge.image : DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE, + owned: !!yearBadge, + }, + ], + } + }, + claimable: false, + claimed: nftClaimed ?? false, + }, + // { + // id: "new-perk-1", + // title: "Set up an NFT profile", + // description: "Set your profile picture to an NFT you own to show off your prized possessions.", + // metadata: [ + // { + // name: ETHEREUM_YEAR_BADGE_NAME, + // badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + // imageURL: DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE, + // owned: false, + // }, + // ], + // checkClaimableFunc: () => { + // const yearBadge = userBadges.find(badge => badge.badgeContract === ETHEREUM_YEAR_BADGE_ADDRESS) + // return { + // claimable: !!yearBadge, + // metadata: [ + // { + // name: ETHEREUM_YEAR_BADGE_NAME, + // badgeContract: ETHEREUM_YEAR_BADGE_ADDRESS, + // imageURL: yearBadge ? yearBadge.image : DEFAULT_ETHEREUM_YEAR_BADGE_IMAGE, + // owned: !!yearBadge, + // }, + // ], + // } + // }, + // claimable: false, + // claimed: nftClaimed ?? false, + // }, + ] + + const { firstSeePerks, newPerksIds } = notifyPerks(perkList) + + const perkListWithClaimable = perkList.map(perk => { + const checkResult = perk.checkClaimableFunc() + return { ...perk, ...checkResult } + }) + set({ firstSeePerks, newPerksIds, perks: perkListWithClaimable.sort((a, b) => (a.claimed === b.claimed ? 0 : a.claimed ? 1 : -1)) }) + }, + + appendNewPerksIds: () => { + const { newPerksIds } = get() + persistPerks(newPerksIds, true) + set({ + newPerksIds: [], + }) + }, + + changePerksDialogVisible: visible => { + set({ + perksDialogVisible: visible, + }) + }, + + clearPerks: () => { + set({ + perks: [], + perksDialogVisible: false, + firstSeePerks: false, + newPerksIds: [], + }) + }, +})) + +export default usePerkStore diff --git a/src/stores/sessionsStore.ts b/src/stores/sessionsStore.ts new file mode 100644 index 000000000..ad9ece41c --- /dev/null +++ b/src/stores/sessionsStore.ts @@ -0,0 +1,33 @@ +import { create } from "zustand" + +interface SessionsStore { + hasSignedTerms: boolean + signatureRequestVisible: boolean + selectedSection: string + changeHasSignedTerms: (hasSignedTerms: boolean) => void + changeSignatureRequestVisible: (signatureRequestVisible: boolean) => void + changeSelectedSection: (selectedSection: string) => void +} + +const useSessionsStore = create()((set, get) => ({ + hasSignedTerms: false, + signatureRequestVisible: false, + selectedSection: "session-1-dex", + changeHasSignedTerms: hasSignedTerms => { + set({ + hasSignedTerms, + }) + }, + changeSignatureRequestVisible: signatureRequestVisible => { + set({ + signatureRequestVisible, + }) + }, + changeSelectedSection: selectedSection => { + set({ + selectedSection, + }) + }, +})) + +export default useSessionsStore diff --git a/src/stores/txStore.ts b/src/stores/txStore.ts index 00852be3c..5a8ea10a8 100644 --- a/src/stores/txStore.ts +++ b/src/stores/txStore.ts @@ -21,7 +21,10 @@ const useTxStore = create()( // when user send a transaction addTransaction: (walletAddress, newTx) => { const frontTransactions = get().frontTransactions - const txList = frontTransactions[walletAddress] ?? [] + let txList = frontTransactions[walletAddress] ?? [] + if (!Object.isExtensible(txList)) { + txList = [...txList] + } txList.unshift(newTx) set({ frontTransactions: { ...frontTransactions, [walletAddress]: txList }, diff --git a/src/stores/utils.ts b/src/stores/utils.ts index 485f9fa9c..88fff86b0 100644 --- a/src/stores/utils.ts +++ b/src/stores/utils.ts @@ -50,6 +50,7 @@ export interface Transaction { initiatedAt?: string txStatus?: number msgHash?: string + replayTxHash?: string } export const MAX_OFFSET_TIME = 30 * 60 * 1000 @@ -64,7 +65,8 @@ export const formatBackTxList = (backList, estimatedTimeMap) => { return { txList: [], estimatedTimeMap: nextEstimatedTimeMap } } const txList = backList.map(tx => { - const amount = tx.token_amounts[0] + //message_type: 1 => deposit 2 => withdraw 3 => batch deposit + const amount = tx.message_type === 3 ? (BigInt(tx.token_amounts[0]) - BigInt(tx.batch_deposit_fee)).toString() : tx.token_amounts[0] const toHash = tx.counterpart_chain_tx?.hash const initiatedAt = tx.block_timestamp @@ -75,7 +77,7 @@ export const formatBackTxList = (backList, estimatedTimeMap) => { // 5. if the second deal succeeded, then the first should succeed too. // deposit - if (tx.message_type === 1) { + if (tx.message_type !== 2) { if (tx.block_number > blockNumbers[0] && blockNumbers[0] !== -1 && !nextEstimatedTimeMap[`from_${tx.hash}`]) { const estimatedOffsetTime = (tx.block_number - blockNumbers[0]) * 12 * 1000 if (isValidOffsetTime(estimatedOffsetTime)) { @@ -91,12 +93,13 @@ export const formatBackTxList = (backList, estimatedTimeMap) => { return { hash: tx.hash, + replayTxHash: tx.replay_tx_hash, fromBlockNumber: tx.block_number, toHash, toBlockNumber: tx.counterpart_chain_tx?.block_number, amount, - isL1: tx.message_type === 1, - symbolToken: tx.message_type === 1 ? tx.l1_token_address : tx.l2_token_address, + isL1: tx.message_type !== 2, + symbolToken: tx.message_type !== 2 ? tx.l1_token_address : tx.l2_token_address, claimInfo: tx.claim_info, initiatedAt, txStatus: tx.tx_status, diff --git a/src/theme/light.tsx b/src/theme/light.tsx index 02c2ab083..89f38a156 100644 --- a/src/theme/light.tsx +++ b/src/theme/light.tsx @@ -1,5 +1,5 @@ import type {} from "@mui/lab/themeAugmentation" -import { createTheme, lighten } from "@mui/material/styles" +import { alpha, createTheme, lighten } from "@mui/material/styles" import { boxShadowOptions, paletteOptions, typographyOptions } from "./options" @@ -82,7 +82,7 @@ const lightTheme = createTheme({ padding: "0 3.5rem", height: "4.6rem", textTransform: "inherit", - borderRadius: "2.3rem", + borderRadius: "0.6rem", backgroundColor: "#f0f0f0", boxShadow: boxShadowOptions.none, "&:hover": { @@ -105,6 +105,21 @@ const lightTheme = createTheme({ }, }, }, + { + props: { variant: "contained", color: "secondary" }, + style: { + backgroundColor: paletteOptions.themeBackground.dark, + color: paletteOptions.primary.contrastText, + "&:hover": { + backgroundColor: paletteOptions.themeBackground.dark, + }, + "&.Mui-disabled": { + backgroundColor: paletteOptions.themeBackground.dark, + color: alpha(paletteOptions.primary.contrastText, 0.6), + opacity: 0.8, + }, + }, + }, { props: { variant: "contained", color: "info" }, style: { diff --git a/src/theme/options.ts b/src/theme/options.ts index 71dce9f61..45d168179 100644 --- a/src/theme/options.ts +++ b/src/theme/options.ts @@ -43,15 +43,7 @@ export const paletteOptions = { default: "#FFF", paper: "#FFF", }, - // TODO: delete - scaleBackground: { - primary: "rgba(201, 203, 206, 0.2)", - second: "#C9CBCE33", - disabled: "#EBEBEB", - select: "#C9CBCE33", - disabledSecondary: "#B4B4B4", - gradient: "linear-gradient(180deg, rgba(255, 232, 203, 0.74) 0%, rgba(255, 255, 255, 0) 100%)", - }, + themeBackground: { light: "#FFF8F3", dark: "#101010", @@ -59,6 +51,8 @@ export const paletteOptions = { highlight: "#FFDEB5", optionHightlight: "#FFE6C8", tag: "#262626", + transparent: "transparent", + brand: "#FFEEDA", }, border: { main: "#000", @@ -184,11 +178,11 @@ export const typographyOptions = { // }, H1: { - fontSize: "7.8rem", + fontSize: "6.4rem", lineHeight: "normal", fontWeight: 600, [theme.breakpoints.down("sm")]: { - fontSize: "4rem", + fontSize: "3.6rem", }, }, diff --git a/src/types/index.d.ts b/src/types/index.d.ts index a87b6f90f..0396afabd 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -61,6 +61,8 @@ declare module "@mui/material/styles" { highlight: string optionHightlight: string tag: string + transparent: string + brand: string } link: { main: string @@ -68,14 +70,6 @@ declare module "@mui/material/styles" { border: { main: string } - scaleBackground: { - primary: string - secondary: string - disabled: string - select: string - disabledSecondary: string - gradient: string - } tagSuccess: { light: string main: string @@ -116,6 +110,8 @@ declare module "@mui/material/styles" { highlight: string optionHightlight: string tag: string + transparent: string + brand: string } link?: { main?: string @@ -123,14 +119,6 @@ declare module "@mui/material/styles" { border?: { main?: string } - scaleBackground?: { - primary?: string - secondary?: string - disabled?: string - select?: string - disabledSecondary?: string - gradient?: string - } tagSuccess?: { light?: string main?: string @@ -176,3 +164,9 @@ declare module "@mui/material/Typography" { Body3: true } } + +declare module "@mui/material/Button" { + interface ButtonPropsColorOverrides { + tertiary?: boolean + } +} diff --git a/src/utils/blog.ts b/src/utils/blog.ts new file mode 100644 index 000000000..8db076be8 --- /dev/null +++ b/src/utils/blog.ts @@ -0,0 +1,16 @@ +export const filterBlogsByLanguage = (blogJson, language) => { + if (language === "en") { + return blogJson.filter(item => item.language === language) + } + const suffix = `_lang_${language}` + return blogJson.filter((item, _index, arr) => { + if (item.language === language) { + return true + } else if (item.language !== "en") { + return false + } else if (!arr.find(i => i.slug.slice(0, -suffix.length) === item.slug)) { + return true + } + return false + }) +} diff --git a/src/utils/canvas.ts b/src/utils/canvas.ts new file mode 100644 index 000000000..6865c931a --- /dev/null +++ b/src/utils/canvas.ts @@ -0,0 +1,107 @@ +import { NO_EXPIRATION, SchemaEncoder, ZERO_BYTES32 } from "@ethereum-attestation-service/eas-sdk" +import { EIP712Proxy } from "@ethereum-attestation-service/eas-sdk/dist/eip712-proxy.js" +import { AbiCoder, TransactionDescription, ethers } from "ethers" + +import AttestProxyABI from "@/assets/abis/CanvasAttestProxy.json" +import { requireEnv } from "@/utils" + +const SCROLL_SEPOLIA_BADGE_SCHEMA = requireEnv("REACT_APP_BADGE_SCHEMA") + +// TODO: vercel env +const SCROLL_ORIGINS_BADGE_ADDRESS = "0x2dBce60ebeAafb77e5472308f432F78aC3AE07d9" + +export const ipfsToBrowserURL = ipfsAddress => { + if (!ipfsAddress) return "" + return ipfsAddress.replace(/^ipfs:\/\/(.*)/, "https://dweb.link/ipfs/$1") +} + +export const decodeBadgePayload = encodedData => { + const abiCoder = new AbiCoder() + const decodedPayload = abiCoder.decode(["address", "bytes"], encodedData) + return decodedPayload +} + +export const generateAttestParams = async (signer, walletAddress, attesterProxyAddress, badgeAddress) => { + const easContract = new ethers.Contract(attesterProxyAddress, AttestProxyABI, signer) + const abiCoder = new SchemaEncoder("address badge, bytes payload") + const badgePayload = abiCoder.encodeData([ + { name: "badge", value: badgeAddress, type: "address" }, + { name: "payload", value: "0x", type: "bytes" }, + ]) + + const currentTime = Math.floor(Date.now() / 1000) + const deadline = currentTime + 3600 + + const attestation = { + // attestation data + schema: SCROLL_SEPOLIA_BADGE_SCHEMA, + recipient: walletAddress, + data: badgePayload, + + // unused fields + revocable: false, + refUID: ZERO_BYTES32, + value: BigInt(0), + expirationTime: NO_EXPIRATION, + + // signature details + deadline: BigInt(deadline), + attester: signer.address, + } + + const proxy = new EIP712Proxy(attesterProxyAddress) + const delegatedProxy = await proxy.connect(signer).getDelegated() + const signature = await delegatedProxy.signDelegatedProxyAttestation(attestation, signer) + + const attestParams = { + schema: attestation.schema, + data: { + recipient: attestation.recipient, + expirationTime: 0, + revocable: false, + refUID: "0x0000000000000000000000000000000000000000000000000000000000000000", + data: badgePayload, + value: 0, + }, + signature: signature.signature, + attester: attestation.attester, + deadline: attestation.deadline, + } + const tx = await easContract.attestByDelegation.populateTransaction(attestParams) + return tx +} + +export const checkDelegatedAttestation = (tx, proxyAddress) => { + if (!tx) { + throw new Error("Got empty tx") + } + + if (!tx.to || tx.to.toUpperCase() !== proxyAddress.toUpperCase()) { + throw new Error("Unexpected contract address") + } + const instance = new ethers.Interface(AttestProxyABI) + const parsedTx = instance.parseTransaction(tx) as TransactionDescription + + if (parsedTx.name !== "attestByDelegation") { + throw new Error("Unexpected function name") + } + + if (parsedTx.args[0].length !== 5) { + throw new Error("Unexpected number of arguments") + } + + if (parsedTx.value !== BigInt(0)) { + throw new Error("Unexpected transaction value") + } + return +} + +export const isOriginsNFTBadge = badgeContract => { + return badgeContract === SCROLL_ORIGINS_BADGE_ADDRESS +} + +export function restoreAllEmojis(input) { + return input.replace(/[\u2600-\u26FF\u2700-\u27BF\u1F000-\u1FAFF]/g, match => { + return match.endsWith("\uFE0F") ? match : match + "\uFE0F" + }) +} diff --git a/src/utils/common.ts b/src/utils/common.ts index 44f8d89f3..5ddd3dfe8 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -33,9 +33,9 @@ export const generateExploreLink = (explorer, hash, type = "tx") => { return `${explorer}/${type}/${hash}` } -export const isProduction = requireEnv("REACT_APP_SCROLL_ENVIRONMENT") === requireEnv("REACT_APP_MAIN_ENVIRONMENT") +export const isMainnet = requireEnv("REACT_APP_SCROLL_ENVIRONMENT") === requireEnv("REACT_APP_MAIN_ENVIRONMENT") export const isSepolia = requireEnv("REACT_APP_SCROLL_ENVIRONMENT") === "Sepolia" -export const networkType = isProduction ? "mainnet" : "testnet" +export const networkType = isMainnet ? "mainnet" : "testnet" export const isValidEmail = (email: string): boolean => { const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ @@ -79,18 +79,52 @@ export const convertDateToTimestamp = (dateString: string, isMilliseconds: boole return Math.floor(timestamp) } -export const formatLargeNumber = (value: number): string => { +export const formatLargeNumber = (value: number, decimal: number = 1): string => { if (value.toString().length <= 6) { return new Intl.NumberFormat("en-US").format(value) } return new Intl.NumberFormat("en-US", { - maximumFractionDigits: 1, + maximumFractionDigits: decimal, notation: "compact", }).format(value) } +export const formatAmount = (value: number | string): string => { + return new Intl.NumberFormat("en-US").format(+value) +} + export function isValidTransactionHash(txHash: string): boolean { // A valid transaction hash is a hex string of length 66 characters (including the '0x' prefix) const isValidLength = txHash.length === 66 return isValidLength && isHexString(txHash) } + +export const testAsyncFunc = (value, timeout = 1e3) => { + return new Promise(resolve => { + setTimeout(() => { + resolve(value) + }, timeout) + }) +} + +export function generateShareTwitterURL(url, text, via = "Scroll_ZKP") { + return `https://twitter.com/intent/tweet?original_referer=${encodeURIComponent(window.location.href)}&url=${encodeURIComponent( + url, + )}&text=${encodeURIComponent(text)}&via=${via}` +} + +export function isAndroid(): boolean { + return typeof navigator !== "undefined" && /android/i.test(navigator.userAgent) +} + +export function normalizeAddress(address) { + return address.toLowerCase() +} + +export async function calculateSHA256FromBlob(blob) { + const arrayBuffer = await blob.arrayBuffer() + const hashBuffer = await crypto.subtle.digest("SHA-256", arrayBuffer) + const hashArray = Array.from(new Uint8Array(hashBuffer)) + const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join("") + return hashHex +} diff --git a/src/utils/ethereum.ts b/src/utils/ethereum.ts index 8353a06e4..a03c70a4d 100644 --- a/src/utils/ethereum.ts +++ b/src/utils/ethereum.ts @@ -1,7 +1,13 @@ -import { getNetwork, getWalletClient } from "@wagmi/core" +import { getWalletClient } from "@wagmi/core" +import { isError } from "ethers" +import { isNumber } from "lodash" + +import { CHAIN_ID } from "@/constants" +import { config } from "@/contexts/RainbowProvider/configs" +import { DepositBatchMode } from "@/stores/batchBridgeStore" export const switchNetwork = async (chainId: number) => { - const walletClient = await getWalletClient() + const walletClient = await getWalletClient(config) try { await walletClient?.switchChain({ id: chainId, @@ -9,10 +15,76 @@ export const switchNetwork = async (chainId: number) => { } catch (error) { // 4902 or -32603 mean chain doesn't exist if (~error.message.indexOf("wallet_addEthereumChain") || error.code === 4902 || error.code === -32603) { - const { chains } = getNetwork() + // const { chains } = getNetwork() + const chains = config.chains await walletClient?.addChain({ chain: chains.find(item => item.id === chainId)!, }) } } } + +export const checkApproved = (needApproval, mode: DepositBatchMode) => { + const flag = mode === DepositBatchMode.Economy ? 1 : 2 + return (isNumber(needApproval) && !(needApproval & flag)) || needApproval === false +} + +export const isUserRejected = error => { + return isError(error, "ACTION_REJECTED") +} + +export function generateTypedData(address, sha256 = "", nftContract = "0x0000000000000000000000000000000000000000", tokenID = "", timestamp) { + const domain = { + name: "Scroll Avatar", + version: "1", + chainId: CHAIN_ID.L2, + verifyingContract: "0x0000000000000000000000000000000000000000", + } + + const types = { + Avatar: [ + { name: "address", type: "address" }, + { name: "sha256", type: "string" }, + { name: "nftContract", type: "address" }, + { name: "tokenID", type: "string" }, + { name: "timestamp", type: "string" }, + ], + } + + return { + domain, + types, + account: address, + primaryType: "Avatar", + message: { + address, + nftContract, + sha256, + tokenID, + timestamp, + }, + } +} + +export function generateENSSubdomainTypedData(address, name, timestamp) { + const domain = { + name: "Scroll Subdomain", + version: "1", + chainId: CHAIN_ID.L2, + verifyingContract: "0xb4f49224c3eb5b2360bdad83ef0f6bf5d5b29702", + } + const types = { + UserSubDomainRegistrationRequest: [ + { name: "address", type: "address" }, + { name: "name", type: "string" }, + { name: "timestamp", type: "string" }, + ], + } + return { + domain, + types, + account: address, + primaryType: "UserSubDomainRegistrationRequest", + message: { address, name, timestamp }, + } +} diff --git a/src/utils/format.ts b/src/utils/format.ts index e01214564..11f7a5d02 100644 --- a/src/utils/format.ts +++ b/src/utils/format.ts @@ -48,16 +48,8 @@ export const toTokenDisplay = (num, decimals: bigint = BigInt(18), symbol?: stri } const formattedNum = formatUnits(num, decimals) - const nonDecimalNum = formattedNum.split(".")[0] - let significantDecimals = 0 - if (nonDecimalNum.length < 8) { - significantDecimals = 8 - nonDecimalNum.length - } - let formatted = commafy(formatUnits(num, decimals), significantDecimals) - - // Remove trailing zeros after decimal point - formatted = formatted.replace(/(\.\d*?)0+$/, "$1").replace(/(\.\d+?)0+$/, "$10") + let formatted = toPrecision(formattedNum) if (symbol) { formatted += ` ${symbol}` @@ -66,8 +58,21 @@ export const toTokenDisplay = (num, decimals: bigint = BigInt(18), symbol?: stri return formatted } +export const toPrecision = (amount, precise = 6) => { + const [nonDecimalNum] = String(amount).split(".") + let significantDecimals = 0 + if (nonDecimalNum.length < precise) { + // significantDecimals = precise - nonDecimalNum.length > decimalNum.length ? decimalNum.length : precise - nonDecimalNum.length + significantDecimals = precise - nonDecimalNum.length + } + const withPrecision = commafy(amount, significantDecimals) + // Remove trailing zeros after decimal point + const withoutTrailingZero = withPrecision.replace(/(\.\d*?)0+$/, "$1").replace(/(\.\d+?)0+$/, "$10") + return withoutTrailingZero +} + export function sanitizeNumericalString(numStr: string) { - return numStr.replace(/[^0-9.]|\.(?=.*\.)/g, "") + return numStr.replace(/[^0-9.,]|[.,](?=.*[.,])/g, "").replace(/,/g, ".") } export function maxDecimals(amount: string, decimals: bigint = BigInt(18)) { diff --git a/src/utils/index.ts b/src/utils/index.ts index 397ffa36e..65fa62266 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -4,3 +4,6 @@ export * from "./ethereum" export * from "./sentry" export * from "./nft" export * from "./dom" +export * from "./blog" +export * from "./canvas" +export * from "./txError" diff --git a/src/utils/txError.ts b/src/utils/txError.ts new file mode 100644 index 000000000..16065dd5d --- /dev/null +++ b/src/utils/txError.ts @@ -0,0 +1,103 @@ +import { Interface } from "ethers" + +const abi = [ + "error Unauthorized()", + "error CannotUpgrade(bytes32 uid)", + + // attestation errors + "error BadgeNotAllowed(address badge)", + "error BadgeNotFound(address badge)", + "error ExpirationDisabled()", + "error MissingPayload()", + "error ResolverPaymentsDisabled()", + "error RevocationDisabled()", + "error SingletonBadge()", + "error UnknownSchema()", + + // query errors + "error AttestationBadgeMismatch(bytes32 uid)", + "error AttestationExpired(bytes32 uid)", + "error AttestationNotFound(bytes32 uid)", + "error AttestationOwnerMismatch(bytes32 uid)", + "error AttestationRevoked(bytes32 uid)", + "error AttestationSchemaMismatch(bytes32 uid)", + + // profile errors + "error BadgeCountReached()", + "error LengthMismatch()", + "error TokenNotOwnedByUser(address token, uint256 tokenId)", + + // profile registry errors + "error CallerIsNotUserProfile()", + "error DuplicatedUsername()", + "error ExpiredSignature()", + "error ImplementationNotContract()", + "error InvalidReferrer()", + "error InvalidSignature()", + "error InvalidUsername()", + "error MsgValueMismatchWithMintFee()", + "error ProfileAlreadyMinted()", + + "error AccessDenied()", + + // EAS error + "error DeadlineExpired()", + "error InvalidEAS()", + "error InvalidLength()", + "error NotFound()", +] + +const IDENTIFIED_ERROR_MAP = { + AccessDenied: issuer => ({ + message: `Oops something went wrong. Please reach out to ${issuer.name}’s community for help.`, + link: issuer.communityURL, + }), + SingletonBadge: { + message: "You have already minted this badge. Please wait for a while for Canvas to be updated", + }, + ExpiredSignature: { + message: "Something went wrong. Please try again later", + }, + InvalidSignature: issuer => ({ + message: `Oops something went wrong. Please reach out to ${issuer.name}’s community for help.`, + link: issuer.communityURL, + }), + DeadlineExpired: { + message: "Something went wrong. Please try again later", + }, + ProfileAlreadyMinted: { + message: "You have already minted your Canvas. Please wait for a while for Canvas to be updated", + }, +} + +export const decodeErrorData = errSelector => { + const contract = new Interface(abi) + const parsedError = contract.parseError(errSelector) + return parsedError?.name +} + +// AccessDenied / InvalidSignature only for minting a badge +export const recognizeError = (error, issuer?) => { + if (error.code === "INSUFFICIENT_FUNDS") { + return "Transaction failed due to insufficient funds. Please ensure your wallet has enough ETH" + } + if (error.code === "CALL_EXCEPTION") { + const unrecognized = "Something went wrong. Please try again later" + // execution reverted + if (error.data) { + const type = decodeErrorData(error.data) + if (type) { + if (IDENTIFIED_ERROR_MAP[type]) { + return typeof IDENTIFIED_ERROR_MAP[type] === "function" ? IDENTIFIED_ERROR_MAP[type](issuer) : IDENTIFIED_ERROR_MAP[type] + } + return "Execution reverted due to " + type + } + return unrecognized + } + return unrecognized + } + if (error.code === "UNKNOWN_ERROR" && error.message.startsWith("could not coalesce error")) { + return error.error?.message || error.error?.data?.error?.message || "RPC service is busy. Please try again later" + } + return error.message +} diff --git a/yarn.lock b/yarn.lock index 76095b3b6..c4b671517 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,21 +7,21 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + "@adraffy/ens-normalize@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== -"@adraffy/ens-normalize@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz#60111a5d9db45b2e5cbb6231b0bb8d97e8659316" - integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg== - -"@adraffy/ens-normalize@1.9.4": - version "1.9.4" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62" - integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw== - "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -1077,12 +1077,19 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.17.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" - integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== +"@babel/runtime@^7.19.4": + version "7.24.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: - regenerator-runtime "^0.13.11" + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.20.6": + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57" + integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ== + dependencies: + regenerator-runtime "^0.14.0" "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" @@ -1147,28 +1154,17 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@coinbase/wallet-sdk@^3.6.6": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.7.1.tgz#44b3b7a925ff5cc974e4cbf7a44199ffdcf03541" - integrity sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg== +"@coinbase/wallet-sdk@4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.0.0.tgz#1c492aab4d11dc7b08eed156f21c804ad47e8801" + integrity sha512-7q8k39a2Iuz30dAEeh86AaSAbLgVPW3gfLa1UYh2IqP7gS+X9witoMEMM8o016K6vxP5N++PrM+Lgu/O1KByBA== dependencies: - "@metamask/safe-event-emitter" "2.0.0" - "@solana/web3.js" "^1.70.1" - bind-decorator "^1.0.11" - bn.js "^5.1.1" buffer "^6.0.3" - clsx "^1.1.0" - eth-block-tracker "6.1.0" - eth-json-rpc-filters "5.1.0" - eth-rpc-errors "4.0.2" - json-rpc-engine "6.1.0" - keccak "^3.0.1" - preact "^10.5.9" - qs "^6.10.3" - rxjs "^6.6.3" + clsx "^1.2.1" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" sha.js "^2.4.11" - stream-browserify "^3.0.0" - util "^0.12.4" "@colors/colors@1.5.0": version "1.5.0" @@ -1337,6 +1333,37 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@dnd-kit/accessibility@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz#1054e19be276b5f1154ced7947fc0cb5d99192e0" + integrity sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ== + dependencies: + tslib "^2.0.0" + +"@dnd-kit/core@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/core/-/core-6.1.0.tgz#e81a3d10d9eca5d3b01cbf054171273a3fe01def" + integrity sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg== + dependencies: + "@dnd-kit/accessibility" "^3.1.0" + "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" + +"@dnd-kit/sortable@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@dnd-kit/sortable/-/sortable-8.0.0.tgz#086b7ac6723d4618a4ccb6f0227406d8a8862a96" + integrity sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g== + dependencies: + "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" + +"@dnd-kit/utilities@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz#5a32b6af356dc5f74d61b37d6f7129a4040ced7b" + integrity sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg== + dependencies: + tslib "^2.0.0" + "@emotion/babel-plugin@^11.10.6": version "11.10.6" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead" @@ -1365,11 +1392,6 @@ "@emotion/weak-memoize" "^0.3.0" stylis "4.1.3" -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - "@emotion/hash@^0.9.0": version "0.9.0" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" @@ -1493,22 +1515,59 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.39.0.tgz#58b536bcc843f4cd1e02a7e6171da5c040f4d44b" integrity sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng== -"@ethersproject/abi@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" - integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== - dependencies: - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/abi@^5.5.0": +"@ethereum-attestation-service/eas-contracts@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@ethereum-attestation-service/eas-contracts/-/eas-contracts-1.4.1.tgz#f4e9e5f5b385ac11a7b27dacb7b245b1def0416e" + integrity sha512-c+yaTMrEjOESG3yFztPQnNCGARZOBde6r7RnH4hK/T7BS84rC0Y0BbUv/4tOwGBAhN9ke8MJ7G/qySngVtJk3w== + dependencies: + hardhat "2.22.1" + +"@ethereum-attestation-service/eas-sdk@^1.5.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@ethereum-attestation-service/eas-sdk/-/eas-sdk-1.6.1.tgz#cc0e7cb0ede413c5562dc5c7e10a9f56eb3eb72a" + integrity sha512-7MeT0jiNQ+OPgjycl/Y8QGopZCUbIZBv6+DJ8mzt7mWRtrnlt09sA2ItRxnzywh/qZCKJktVOFna0iqpOIC1uA== + dependencies: + "@ethereum-attestation-service/eas-contracts" "1.4.1" + ethers "^6.11.1" + js-base64 "^3.7.6" + lodash "^4.17.21" + multiformats "9.9.0" + pako "^2.1.0" + semver "^7.6.0" + +"@ethereumjs/common@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-3.2.0.tgz#b71df25845caf5456449163012074a55f048e0a0" + integrity sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA== + dependencies: + "@ethereumjs/util" "^8.1.0" + crc-32 "^1.2.0" + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@^4.1.2", "@ethereumjs/tx@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-4.2.0.tgz#5988ae15daf5a3b3c815493bc6b495e76009e853" + integrity sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw== + dependencies: + "@ethereumjs/common" "^3.2.0" + "@ethereumjs/rlp" "^4.0.1" + "@ethereumjs/util" "^8.1.0" + ethereum-cryptography "^2.0.0" + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@^5.1.2": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -1523,20 +1582,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.5.1": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" - integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/networks" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/web" "^5.5.0" - -"@ethersproject/abstract-provider@^5.5.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -1549,18 +1595,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" - integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - -"@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -1571,18 +1606,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" - integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - -"@ethersproject/address@^5.5.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -1593,46 +1617,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" - integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - -"@ethersproject/base64@^5.5.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" - integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - -"@ethersproject/basex@^5.5.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" - integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -1641,65 +1633,21 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" - integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - -"@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" - integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== - dependencies: - "@ethersproject/abi" "^5.5.0" - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - -"@ethersproject/hash@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" - integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/hash@^5.5.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -1714,89 +1662,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" - integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/pbkdf2" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/wordlists" "^5.5.0" - -"@ethersproject/hdnode@^5.5.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" - integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hdnode" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/pbkdf2" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/json-wallets@^5.5.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" - integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - js-sha3 "0.8.0" - -"@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -1804,135 +1670,26 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== - -"@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.2.tgz#784c8b1283cd2a931114ab428dae1bd00c07630b" - integrity sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/networks@^5.5.0", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" - integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - -"@ethersproject/pbkdf2@^5.5.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" - integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.2.tgz#131ccf52dc17afd0ab69ed444b8c0e3a27297d99" - integrity sha512-hkbx7x/MKcRjyrO4StKXCzCpWer6s97xnm34xkfPiarhtEUVAN4TBBpamM+z66WcTt7H5B53YwbRj1n7i8pZoQ== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/networks" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/web" "^5.5.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.3.tgz#56c2b070542ac44eb5de2ed3cf6784acd60a3130" - integrity sha512-ZHXxXXXWHuwCQKrgdpIkbzMNJMvs+9YWemanwp1fA7XZEv7QlilseysPvQe0D7Q7DlkJX/w/bGA1MdgK2TbGvA== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/basex" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/networks" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/web" "^5.5.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.5.1": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.1.tgz#7cdf38ea93dc0b1ed1d8e480ccdaf3535c555415" - integrity sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/random@^5.5.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" - integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -1940,37 +1697,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" - integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - hash.js "1.1.7" - -"@ethersproject/sha2@^5.5.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" - integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/signing-key@^5.5.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -1982,28 +1709,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" - integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/sha2" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/strings@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" - integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -2012,22 +1718,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" - integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== - dependencies: - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - -"@ethersproject/transactions@^5.5.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -2042,48 +1733,7 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/units@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" - integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/wallet@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" - integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== - dependencies: - "@ethersproject/abstract-provider" "^5.5.0" - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/hdnode" "^5.5.0" - "@ethersproject/json-wallets" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/random" "^5.5.0" - "@ethersproject/signing-key" "^5.5.0" - "@ethersproject/transactions" "^5.5.0" - "@ethersproject/wordlists" "^5.5.0" - -"@ethersproject/web@5.5.1": - version "5.5.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" - integrity sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg== - dependencies: - "@ethersproject/base64" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/web@^5.5.0", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -2094,78 +1744,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" - integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/hash" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/wordlists@^5.5.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@formatjs/ecma402-abstract@1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz#b962dfc4ae84361f9f08fbce411b4e4340930eda" - integrity sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw== - dependencies: - "@formatjs/intl-localematcher" "0.2.25" - tslib "^2.1.0" - -"@formatjs/fast-memoize@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz#e6f5aee2e4fd0ca5edba6eba7668e2d855e0fc21" - integrity sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg== - dependencies: - tslib "^2.1.0" - -"@formatjs/icu-messageformat-parser@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz#a54293dd7f098d6a6f6a084ab08b6d54a3e8c12d" - integrity sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/icu-skeleton-parser" "1.3.6" - tslib "^2.1.0" - -"@formatjs/icu-skeleton-parser@1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz#4ce8c0737d6f07b735288177049e97acbf2e8964" - integrity sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - tslib "^2.1.0" - -"@formatjs/intl-localematcher@0.2.25": - version "0.2.25" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz#60892fe1b271ec35ba07a2eb018a2dd7bca6ea3a" - integrity sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA== - dependencies: - tslib "^2.1.0" - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@humanwhocodes/config-array@^0.11.8": version "0.11.8" @@ -2529,21 +2111,168 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": +"@metamask/eth-json-rpc-provider@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz#3fd5316c767847f4ca107518b611b15396a5a32c" + integrity sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA== + dependencies: + "@metamask/json-rpc-engine" "^7.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@metamask/json-rpc-engine@^7.0.0", "@metamask/json-rpc-engine@^7.3.2": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-engine/-/json-rpc-engine-7.3.3.tgz#f2b30a2164558014bfcca45db10f5af291d989af" + integrity sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg== + dependencies: + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + +"@metamask/json-rpc-middleware-stream@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-6.0.2.tgz#75852ce481f8f9f091edbfc04ffdf964f8f3cabd" + integrity sha512-jtyx3PRfc1kqoLpYveIVQNwsxYKefc64/LCl9h9Da1m3nUKEvypbYuXSIwi237qvOjKmNHQKsDOZg6f4uBf62Q== + dependencies: + "@metamask/json-rpc-engine" "^7.3.2" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + readable-stream "^3.6.2" + +"@metamask/object-multiplex@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/object-multiplex/-/object-multiplex-2.0.0.tgz#aa6e4aa7b4e2f457ea4bb51cd7281d931e0aa35d" + integrity sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA== + dependencies: + once "^1.4.0" + readable-stream "^3.6.2" + +"@metamask/onboarding@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@metamask/onboarding/-/onboarding-1.0.1.tgz#14a36e1e175e2f69f09598e2008ab6dc1b3297e6" + integrity sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ== + dependencies: + bowser "^2.9.0" + +"@metamask/providers@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@metamask/providers/-/providers-15.0.0.tgz#e8957bb89d2f3379b32b60117d79a141e44db2bc" + integrity sha512-FXvL1NQNl6I7fMOJTfQYcBlBZ33vSlm6w80cMpmn8sJh0Lb7wcBpe02UwBsNlARnI+Qsr26XeDs6WHUHQh8CuA== + dependencies: + "@metamask/json-rpc-engine" "^7.3.2" + "@metamask/json-rpc-middleware-stream" "^6.0.2" + "@metamask/object-multiplex" "^2.0.0" + "@metamask/rpc-errors" "^6.2.1" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^8.3.0" + detect-browser "^5.2.0" + extension-port-stream "^3.0.0" + fast-deep-equal "^3.1.3" + is-stream "^2.0.0" + readable-stream "^3.6.2" + webextension-polyfill "^0.10.0" + +"@metamask/rpc-errors@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.2.1.tgz#f5daf429ededa7cb83069dc621bd5738fe2a1d80" + integrity sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw== + dependencies: + "@metamask/utils" "^8.3.0" + fast-safe-stringify "^2.0.6" + +"@metamask/safe-event-emitter@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== -"@metamask/utils@^3.0.1": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-3.6.0.tgz#b218b969a05ca7a8093b5d1670f6625061de707d" - integrity sha512-9cIRrfkWvHblSiNDVXsjivqa9Ak0RYo/1H6tqTqTbAx+oBK2Sva0lWDHxGchOqA7bySGUJKAWSNJvH6gdHZ0gQ== +"@metamask/safe-event-emitter@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.1.tgz#e89b840a7af8097a8ed4953d8dc8470d1302d3ef" + integrity sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw== + +"@metamask/sdk-communication-layer@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.20.2.tgz#7f7fd334b2d26abd1a5a1ec1ffadf823a9589344" + integrity sha512-TN+whYbCClFSkx52Ild1RcjoRyz8YZgwNvZeooIcZIvCfBM6U9W5273KGiY7WLc/oO4KKmFk17d7vMO4gNvhhw== + dependencies: + bufferutil "^4.0.8" + date-fns "^2.29.3" + debug "^4.3.4" + utf-8-validate "^6.0.3" + uuid "^8.3.2" + +"@metamask/sdk-install-modal-web@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.20.2.tgz#1cf0eb3c26291de7598190878fa9a893c4eb2d66" + integrity sha512-0QiaZhV15AGdN1zU2jfTI32eC3YkwEpzDfR9+oiZ9bd2G72c6lYBhTsmDGUd01aP6A+bqJR5PjI8Wh2AWtoLeA== + dependencies: + qr-code-styling "^1.6.0-rc.1" + +"@metamask/sdk@0.20.3": + version "0.20.3" + resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.20.3.tgz#73851d68ffe5d45c1872c024182922530b187b7a" + integrity sha512-HZ9NwA+LxiXzuy0YWbWsuD4xejQtp85bhcCAf8UgpA/0dOyF3RS4dKDdBBXSyRgk3RWPjeJgHxioaH4CmBmiRA== + dependencies: + "@metamask/onboarding" "^1.0.1" + "@metamask/providers" "^15.0.0" + "@metamask/sdk-communication-layer" "0.20.2" + "@metamask/sdk-install-modal-web" "0.20.2" + "@types/dom-screen-wake-lock" "^1.0.0" + bowser "^2.9.0" + cross-fetch "^4.0.0" + debug "^4.3.4" + eciesjs "^0.3.15" + eth-rpc-errors "^4.0.3" + eventemitter2 "^6.4.7" + i18next "22.5.1" + i18next-browser-languagedetector "7.1.0" + obj-multiplex "^1.0.0" + pump "^3.0.0" + qrcode-terminal-nooctal "^0.12.1" + react-native-webview "^11.26.0" + readable-stream "^3.6.2" + rollup-plugin-visualizer "^5.9.2" + socket.io-client "^4.5.1" + util "^0.12.4" + uuid "^8.3.2" + +"@metamask/utils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c" + integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g== dependencies: + "@ethereumjs/tx" "^4.1.2" "@types/debug" "^4.1.7" debug "^4.3.4" semver "^7.3.8" superstruct "^1.0.3" +"@metamask/utils@^8.3.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.4.0.tgz#f44812c96467a4e1b70b2edff6ee89a9caa4e354" + integrity sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg== + dependencies: + "@ethereumjs/tx" "^4.2.0" + "@noble/hashes" "^1.3.1" + "@scure/base" "^1.1.3" + "@types/debug" "^4.1.7" + debug "^4.3.4" + pony-cause "^2.1.10" + semver "^7.5.4" + superstruct "^1.0.3" + uuid "^9.0.1" + "@motionone/animation@^10.15.1": version "10.15.1" resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807" @@ -2755,34 +2484,44 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" - integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== +"@noble/curves@1.3.0", "@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== dependencies: - "@noble/hashes" "1.3.1" + "@noble/hashes" "1.3.3" -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== "@noble/hashes@1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== -"@noble/hashes@1.3.1", "@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" - integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== - "@noble/hashes@1.3.2", "@noble/hashes@~1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/secp256k1@1.7.1": +"@noble/hashes@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@noble/hashes@^1.3.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@~1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== @@ -2808,6 +2547,150 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/edr-darwin-arm64@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.8.tgz#09de1f03c0336670fce959f376f0fe9137545836" + integrity sha512-eB0leCexS8sQEmfyD72cdvLj9djkBzQGP4wSQw6SNf2I4Sw4Cnzb3d45caG2FqFFjbvfqL0t+badUUIceqQuMw== + +"@nomicfoundation/edr-darwin-x64@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.8.tgz#c3ca237c74ed3b6fb800fd7f1de7174f4ad24f72" + integrity sha512-JksVCS1N5ClwVF14EvO25HCQ+Laljh/KRfHERMVAC9ZwPbTuAd/9BtKvToCBi29uCHWqsXMI4lxCApYQv2nznw== + +"@nomicfoundation/edr-linux-arm64-gnu@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.8.tgz#08bd367789e745f4e78a8a87368fc470eea8a7de" + integrity sha512-raCE+fOeNXhVBLUo87cgsHSGvYYRB6arih4eG6B9KGACWK5Veebtm9xtKeiD8YCsdUlUfat6F7ibpeNm91fpsA== + +"@nomicfoundation/edr-linux-arm64-musl@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.8.tgz#9cab5cbec0052cb5812c6c66c463d28a756cd916" + integrity sha512-PwiDp4wBZWMCIy29eKkv8moTKRrpiSDlrc+GQMSZLhOAm8T33JKKXPwD/2EbplbhCygJDGXZdtEKl9x9PaH66A== + +"@nomicfoundation/edr-linux-x64-gnu@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.8.tgz#d4a11b6ebcd1b29d7431d185c6df3e65a2cd4bde" + integrity sha512-6AcvA/XKoipGap5jJmQ9Y6yT7Uf39D9lu2hBcDCXnXbMcXaDGw4mn1/L4R63D+9VGZyu1PqlcJixCUZlGGIWlg== + +"@nomicfoundation/edr-linux-x64-musl@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.8.tgz#b8eef960d06380a365866ddd1e97ecb7fbf6bd70" + integrity sha512-cxb0sEmZjlwhYWO28sPsV64VDx31ekskhC1IsDXU1p9ntjHSJRmW4KEIqJ2O3QwJap/kLKfMS6TckvY10gjc6w== + +"@nomicfoundation/edr-win32-x64-msvc@0.3.8": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.8.tgz#ac7061aeb07cc847c429513080b76bb05297a869" + integrity sha512-yVuVPqRRNLZk7TbBMkKw7lzCvI8XO8fNTPTYxymGadjr9rEGRuNTU1yBXjfJ59I1jJU/X2TSkRk1OFX0P5tpZQ== + +"@nomicfoundation/edr@^0.3.1": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.8.tgz#28fe7ae4f462ae74a16cd1a714ff7b1cd9c22b4c" + integrity sha512-u2UJ5QpznSHVkZRh6ePWoeVb6kmPrrqh08gCnZ9FHlJV9CITqlrTQHJkacd+INH31jx88pTAJnxePE4XAiH5qg== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.3.8" + "@nomicfoundation/edr-darwin-x64" "0.3.8" + "@nomicfoundation/edr-linux-arm64-gnu" "0.3.8" + "@nomicfoundation/edr-linux-arm64-musl" "0.3.8" + "@nomicfoundation/edr-linux-x64-gnu" "0.3.8" + "@nomicfoundation/edr-linux-x64-musl" "0.3.8" + "@nomicfoundation/edr-win32-x64-msvc" "0.3.8" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + "@parcel/watcher-android-arm64@2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz#d82e74bb564ebd4d8a88791d273a3d2bd61e27ab" @@ -2920,19 +2803,18 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== -"@rainbow-me/rainbowkit@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-1.2.0.tgz#8ddcb3acef5408ef375e3df349429144aa230e12" - integrity sha512-XjdeX31GwFdRR/1rCRqPXiO94nbq2qOlnaox5P4K/KMRIUwyelKzak27uWw8Krmor/Hcrd5FisfepGDS0tUfEA== - dependencies: - "@vanilla-extract/css" "1.9.1" - "@vanilla-extract/dynamic" "2.0.2" - "@vanilla-extract/sprinkles" "1.5.0" - clsx "1.1.1" - i18n-js "^4.3.2" - qrcode "1.5.0" - react-remove-scroll "2.5.4" - ua-parser-js "^1.0.35" +"@rainbow-me/rainbowkit@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@rainbow-me/rainbowkit/-/rainbowkit-2.1.2.tgz#57d0eae082fe4132d89f4bffd88cf6edd4c26141" + integrity sha512-nzhS4p7rtE9bAkOKSq+J761+gn6UseVxMdDpRBAr+0+ct/Hv1STErq9TT3GEXNrnAeSldtbxBVIkepa4uGykDA== + dependencies: + "@vanilla-extract/css" "1.14.0" + "@vanilla-extract/dynamic" "2.1.0" + "@vanilla-extract/sprinkles" "1.6.1" + clsx "2.1.0" + qrcode "1.5.3" + react-remove-scroll "2.5.7" + ua-parser-js "^1.0.37" "@remix-run/router@1.5.0": version "1.5.0" @@ -2981,7 +2863,7 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@safe-global/safe-apps-provider@^0.18.1": +"@safe-global/safe-apps-provider@0.18.1": version "0.18.1" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" integrity sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg== @@ -2989,7 +2871,7 @@ "@safe-global/safe-apps-sdk" "^8.1.0" events "^3.3.0" -"@safe-global/safe-apps-sdk@^8.1.0": +"@safe-global/safe-apps-sdk@8.1.0", "@safe-global/safe-apps-sdk@^8.1.0": version "8.1.0" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a" integrity sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w== @@ -3004,6 +2886,11 @@ dependencies: cross-fetch "^3.1.5" +"@scure/base@^1.1.3", "@scure/base@~1.1.4": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d" + integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g== + "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" @@ -3014,6 +2901,15 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + "@scure/bip32@1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.0.tgz#6c8d980ef3f290987736acd0ee2e0f0d50068d87" @@ -3032,6 +2928,23 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.2" +"@scure/bip32@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" + integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + "@scure/bip39@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.0.tgz#a207e2ef96de354de7d0002292ba1503538fc77b" @@ -3048,6 +2961,14 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" + integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== + dependencies: + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + "@sentry-internal/tracing@7.49.0": version "7.49.0" resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.49.0.tgz#f589de565370884b9a13f82c98463de9b2d25dcd" @@ -3082,6 +3003,17 @@ proxy-from-env "^1.1.0" which "^2.0.2" +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + "@sentry/core@7.49.0": version "7.49.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.49.0.tgz#340d059f5efeff1a3359fef66d0c8e34e79ac992" @@ -3091,6 +3023,39 @@ "@sentry/utils" "7.49.0" tslib "^1.9.3" +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + "@sentry/react@^7.43.0": version "7.49.0" resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.49.0.tgz#9a31808d4232d3010019e09d7c706b3d4fe54960" @@ -3111,6 +3076,17 @@ "@sentry/types" "7.49.0" "@sentry/utils" "7.49.0" +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + "@sentry/tracing@^7.43.0": version "7.49.0" resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.49.0.tgz#1ebb6da9b763420e605444511a203e38b6304136" @@ -3118,11 +3094,24 @@ dependencies: "@sentry-internal/tracing" "7.49.0" +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + "@sentry/types@7.49.0": version "7.49.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.49.0.tgz#2c217091e13dc373682f5be2e9b5baed9d2ae695" integrity sha512-9yXXh7iv76+O6h2ONUVx0wsL1auqJFWez62mTjWk4350SgMmWp/zUkBxnVXhmcYqscz/CepC+Loz9vITLXtgxg== +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + "@sentry/utils@7.49.0": version "7.49.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.49.0.tgz#b1b3a2af52067dd27e660c7c3062a31cdf4b94f9" @@ -3139,23 +3128,6 @@ "@sentry/cli" "^1.74.6" webpack-sources "^2.0.0 || ^3.0.0" -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -3180,33 +3152,10 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@solana/buffer-layout@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" - integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== - dependencies: - buffer "~6.0.3" - -"@solana/web3.js@^1.70.1": - version "1.77.3" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.77.3.tgz#2cbeaa1dd24f8fa386ac924115be82354dfbebab" - integrity sha512-PHaO0BdoiQRPpieC1p31wJsBaxwIOWLh8j2ocXNKX8boCQVldt26Jqm2tZE4KlrvnCIV78owPLv1pEUgqhxZ3w== - dependencies: - "@babel/runtime" "^7.12.5" - "@noble/curves" "^1.0.0" - "@noble/hashes" "^1.3.0" - "@solana/buffer-layout" "^4.0.0" - agentkeepalive "^4.2.1" - bigint-buffer "^1.1.5" - bn.js "^5.0.0" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.3" - fast-stable-stringify "^1.0.0" - jayson "^4.1.0" - node-fetch "^2.6.7" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== "@stablelib/aead@^1.0.1": version "1.0.1" @@ -3302,7 +3251,7 @@ "@stablelib/constant-time" "^1.0.1" "@stablelib/wipe" "^1.0.1" -"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": +"@stablelib/random@1.0.2", "@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c" integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== @@ -3333,7 +3282,7 @@ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@stablelib/x25519@^1.0.3": +"@stablelib/x25519@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== @@ -3455,39 +3404,17 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@tanstack/query-core@4.29.14": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.29.14.tgz#569de51719a0f4445fabff775012d5c09a173b96" - integrity sha512-ElEAahtLWA7Y7c2Haw10KdEf2tx+XZl/Z8dmyWxZehxWK3TPL5qtXtb7kUEhvt/8u2cSP62fLxgh2qqzMMGnDQ== - -"@tanstack/query-persist-client-core@4.29.14": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-4.29.14.tgz#5c06a2efc8bea18fbc4f40e4390f460325d0a89a" - integrity sha512-W27en9QsXOu9q1XHBTpkRaXu10RSVllDyVYTnENk2yqck/6TBwRFNKqBpSPqI8hFhaWJ/lRoqnUme0ZVhUUoNA== - dependencies: - "@tanstack/query-core" "4.29.14" - -"@tanstack/query-sync-storage-persister@^4.27.1": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.29.14.tgz#df1ebcc93431244c29dde50519ca177d45547529" - integrity sha512-Z8QpUYuK8YN5FapKiYKPNDDkukOzk271I37/1lAARhSR+WHM97N/hxrmBjgthazFoZuY038CLaoqTVnLyuXDNA== - dependencies: - "@tanstack/query-persist-client-core" "4.29.14" +"@tanstack/query-core@5.28.9": + version "5.28.9" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.28.9.tgz#170a7a8794ab73aeffbaf711ac62126479a5d026" + integrity sha512-hNlfCiqZevr3GRVPXS3MhaGW5hjcxvCsIQ4q6ff7EPlvFwYZaS+0d9EIIgofnegDaU2BbCDlyURoYfRl5rmzow== -"@tanstack/react-query-persist-client@^4.28.0": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.29.14.tgz#ad2be7469d388a173bf712ec0cde86ce701140a0" - integrity sha512-UTzv7R0OPgUGZEtbLXtkSlO3Jgf9lAHB9PjDgcZUcWUgc6/A/c9f+XsRIfsWynaAaM+s8ZCaAbEXLiBweWqPzg== +"@tanstack/react-query@^5.28.9": + version "5.28.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.28.9.tgz#13c2049daa5db6c3137473e279b209f76d39708e" + integrity sha512-vwifBkGXsydsLxFOBMe3+f8kvtDoqDRDwUNjPHVDDt+FoBetCbOWAUHgZn4k+CVeZgLmy7bx6aKeDbe3e8koOQ== dependencies: - "@tanstack/query-persist-client-core" "4.29.14" - -"@tanstack/react-query@^4.28.0": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.29.14.tgz#5e836d470c1c85d1aa3e53a6fc64f788dddb2ee5" - integrity sha512-wh4bd/QIy85YgTDBtj/7/9ZkpRX41QdZuUL8xKoSzuMCukXvAE1/oJ4p0F15lqQq9W3g2pgcbr2Aa+CNvqABhg== - dependencies: - "@tanstack/query-core" "4.29.14" - use-sync-external-store "^1.2.0" + "@tanstack/query-core" "5.28.9" "@testing-library/dom@^7.11.0": version "7.31.2" @@ -3633,6 +3560,20 @@ dependencies: "@babel/types" "^7.3.0" +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -3656,7 +3597,7 @@ "@types/express-serve-static-core" "*" "@types/node" "*" -"@types/connect@*", "@types/connect@^3.4.33": +"@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== @@ -3677,6 +3618,11 @@ dependencies: "@types/ms" "*" +"@types/dom-screen-wake-lock@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz#c3588a5f6f40fae957f9ce5be9bc4927a61bb9a0" + integrity sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw== + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -3736,10 +3682,12 @@ dependencies: "@types/unist" "*" -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" "@types/hoist-non-react-statics@^3.3.0": version "3.3.1" @@ -3826,6 +3774,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + "@types/mdast@^3.0.0": version "3.0.11" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" @@ -3853,16 +3806,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== -"@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - "@types/node@^14.14.31": version "14.18.42" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.42.tgz#fa39b2dc8e0eba61bdf51c66502f84e23b66e114" integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + "@types/node@^20.10.6": version "20.10.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" @@ -3880,6 +3833,13 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + "@types/prettier@^2.1.5": version "2.7.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" @@ -3936,23 +3896,6 @@ hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react-router-dom@^5.0.0": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.20" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" - integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-transition-group@^4.4.5": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" @@ -3981,11 +3924,25 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/sax@^1.2.1": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== + dependencies: + "@types/node" "*" + "@types/scheduler@*": version "0.16.3" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== +"@types/secp256k1@^4.0.1", "@types/secp256k1@^4.0.4": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + "@types/semver@^7.3.12": version "7.3.13" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" @@ -4043,6 +4000,11 @@ dependencies: "@types/jest" "*" +"@types/three@^0.128.0": + version "0.128.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.128.0.tgz#e5ce4c42d138a64dd90e83dbdb9919cf0d424d8e" + integrity sha512-Jwq5XYUkzAcPTo34hlGAQGUyAI0b2F3aCCFWG/v7ZhJBEG5HGcusMSr70GhDlT8Gs0f02QnSPZ2RCA1MrCOa/w== + "@types/trusted-types@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" @@ -4053,12 +4015,10 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" +"@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== "@types/ws@^8.5.1": version "8.5.4" @@ -4191,27 +4151,32 @@ "@typescript-eslint/types" "5.59.0" eslint-visitor-keys "^3.3.0" -"@vanilla-extract/css@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.9.1.tgz#337b79faa5f8f98915a90c3fe3c30b54be746c09" - integrity sha512-pu2SFiff5jRhPwvGoj8cM5l/qIyLvigOmy22ss5DGjwV5pJYezRjDLxWumi2luIwioMWvh9EozCjyfH8nq+7fQ== +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vanilla-extract/css@1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.14.0.tgz#45fab9c04d893e3e363cf2cde7559d21233b7f63" + integrity sha512-rYfm7JciWZ8PFzBM/HDiE2GLnKI3xJ6/vdmVJ5BSgcCZ5CxRlM9Cjqclni9lGzF3eMOijnUhCd/KV8TOzyzbMA== dependencies: - "@emotion/hash" "^0.8.0" + "@emotion/hash" "^0.9.0" "@vanilla-extract/private" "^1.0.3" - ahocorasick "1.0.2" chalk "^4.1.1" - css-what "^5.0.1" + css-what "^6.1.0" cssesc "^3.0.0" csstype "^3.0.7" - deep-object-diff "^1.1.0" + deep-object-diff "^1.1.9" deepmerge "^4.2.2" media-query-parser "^2.0.2" + modern-ahocorasick "^1.0.0" outdent "^0.8.0" -"@vanilla-extract/dynamic@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vanilla-extract/dynamic/-/dynamic-2.0.2.tgz#13a3e461964c8029a52e6b6b631009ca6a8b27f5" - integrity sha512-U4nKaEQ8Kuz+exXEr51DUpyaOuzo24/S/k1YbDPQR06cYcNjQqvwFRnwWtZ+9ImocqM1wTKtzrdUgSTtLGIwAg== +"@vanilla-extract/dynamic@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@vanilla-extract/dynamic/-/dynamic-2.1.0.tgz#316d3bd4adfd5f5c9fb080445c41d55abe3b463c" + integrity sha512-8zl0IgBYRtgD1h+56Zu13wHTiMTJSVEa4F7RWX9vTB/5Xe2KtjoiqApy/szHPVFA56c+ex6A4GpCQjT1bKXbYw== dependencies: "@vanilla-extract/private" "^1.0.3" @@ -4220,83 +4185,60 @@ resolved "https://registry.yarnpkg.com/@vanilla-extract/private/-/private-1.0.3.tgz#7ec72bc2ff6fe51f9d650f962e8d1989b073690f" integrity sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ== -"@vanilla-extract/sprinkles@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@vanilla-extract/sprinkles/-/sprinkles-1.5.0.tgz#c921183ae518bb484299c2dc81f2acefd91c3dbe" - integrity sha512-W58f2Rzz5lLmk0jbhgStVlZl5wEiPB1Ur3fRvUaBM+MrifZ3qskmFq/CiH//fEYeG5Dh9vF1qRviMMH46cX9Nw== +"@vanilla-extract/sprinkles@1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@vanilla-extract/sprinkles/-/sprinkles-1.6.1.tgz#2c8a832757a0d8104dc6bd5d961db2c70d1dbdcb" + integrity sha512-N/RGKwGAAidBupZ436RpuweRQHEFGU+mvAqBo8PRMAjJEmHoPDttV8RObaMLrJHWLqvX+XUMinHUnD0hFRQISw== "@wagmi/chains@1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-1.6.0.tgz#eb992ad28dbaaab729b5bcab3e5b461e8a035656" integrity sha512-5FRlVxse5P4ZaHG3GTvxwVANSmYJas1eQrTBHhjxVtqXoorm0aLmCHbhmN8Xo1yu09PaWKlleEvfE98yH4AgIw== -"@wagmi/connectors@3.1.10": - version "3.1.10" - resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-3.1.10.tgz#830cd788579ef56a2526574914481f2d3aabc9f7" - integrity sha512-ZLJC1QaeiZarkF07Cr9mOlVjPO1Lf5TBx+JKBms2y5fUIXlKrxCfQgO/gDCureboI+Us2X3IRI659+XacSGpbA== - dependencies: - "@coinbase/wallet-sdk" "^3.6.6" - "@safe-global/safe-apps-provider" "^0.18.1" - "@safe-global/safe-apps-sdk" "^8.1.0" - "@walletconnect/ethereum-provider" "2.10.6" - "@walletconnect/legacy-provider" "^2.0.0" +"@wagmi/connectors@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.0.2.tgz#4b70aca8f8a2099a026413500abb02d6d6e8e9e6" + integrity sha512-2YgcgVn6S8kuOe/PVweK0ucxNqO651VqlPWD+MrPxEVwcpEPLNKvtrYdLRDTSnwwUEqEzgnDwEAhcrniK76+Kw== + dependencies: + "@coinbase/wallet-sdk" "4.0.0" + "@metamask/sdk" "0.20.3" + "@safe-global/safe-apps-provider" "0.18.1" + "@safe-global/safe-apps-sdk" "8.1.0" + "@walletconnect/ethereum-provider" "2.13.0" "@walletconnect/modal" "2.6.2" - "@walletconnect/utils" "2.10.2" - abitype "0.8.7" - eventemitter3 "^4.0.7" - -"@wagmi/core@1.4.12": - version "1.4.12" - resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-1.4.12.tgz#84558d1af746b2bcef02337dc3c46108242b1dd7" - integrity sha512-bLcYmmGgjtl3jAGo8X3Sm6oUwsdjbVxFMu9SWnwHdE4S9JdYeWM57dEhQgq8SYul2yQ7yY2/gimBf1Or0Ky3dQ== - dependencies: - "@wagmi/connectors" "3.1.10" - abitype "0.8.7" - eventemitter3 "^4.0.7" - zustand "^4.3.1" - -"@walletconnect/core@2.10.6": - version "2.10.6" - resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.6.tgz#786b0d2e2045c210c917e29bfa0498bbc210be20" - integrity sha512-Z4vh4ZdfcoQjgPEOxeuF9HUZCVLtV3MgRbS/awLIj/omDrFnOwlBhxi5Syr4Y8muVGC0ocRetQYHae0/gX5crQ== - dependencies: - "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-provider" "1.0.13" - "@walletconnect/jsonrpc-types" "1.0.3" - "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/jsonrpc-ws-connection" "1.0.14" - "@walletconnect/keyvaluestorage" "^1.1.1" - "@walletconnect/logger" "^2.0.1" - "@walletconnect/relay-api" "^1.0.9" - "@walletconnect/relay-auth" "^1.0.4" - "@walletconnect/safe-json" "^1.0.2" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.10.6" - "@walletconnect/utils" "2.10.6" - events "^3.3.0" - lodash.isequal "4.5.0" - uint8arrays "^3.1.0" + cbw-sdk "npm:@coinbase/wallet-sdk@3.9.3" -"@walletconnect/crypto@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4" - integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g== +"@wagmi/core@2.10.2": + version "2.10.2" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.10.2.tgz#00e680df650bda8cda010d9077089f98d82a84fd" + integrity sha512-SfQ1F7Azjlx4cKGfmg9+GEUGbukCxraoLYZyCUgTLpKw2OY+4sHsPRwHQENQt/YRWKMyG3/byEYRna2Kv1anpw== dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - "@walletconnect/randombytes" "^1.0.3" - aes-js "^3.1.2" - hash.js "^1.1.7" - tslib "1.14.1" + eventemitter3 "5.0.1" + mipd "0.0.5" + zustand "4.4.1" -"@walletconnect/encoding@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da" - integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag== +"@walletconnect/core@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.13.0.tgz#6b79b039930643e8ee85a0f512b143a35fdb8b52" + integrity sha512-blDuZxQenjeXcVJvHxPznTNl6c/2DO4VNrFnus+qHmO6OtT5lZRowdMtlCaCNb1q0OxzgrmBDcTOCbFcCpio/g== dependencies: - is-typedarray "1.0.0" - tslib "1.14.1" - typedarray-to-buffer "3.1.5" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + "@walletconnect/relay-api" "1.0.10" + "@walletconnect/relay-auth" "1.0.4" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.13.0" + "@walletconnect/utils" "2.13.0" + events "3.3.0" + isomorphic-unfetch "3.1.0" + lodash.isequal "4.5.0" + uint8arrays "3.1.0" "@walletconnect/environment@^1.0.1": version "1.0.1" @@ -4305,23 +4247,23 @@ dependencies: tslib "1.14.1" -"@walletconnect/ethereum-provider@2.10.6": - version "2.10.6" - resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.10.6.tgz#53720771cc2d6accd452916a853ac927f26acbaa" - integrity sha512-bBQ+yUfxLv8VxNttgNKY7nED35gSVayO/BnLHbNKvyV1gpvSCla5mWB9MsXuQs70MK0g+/qtgRVSrOtdSubaNQ== +"@walletconnect/ethereum-provider@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.13.0.tgz#5148851983e0d55fa1c18737b2db22802c82434c" + integrity sha512-dnpW8mmLpWl1AZUYGYZpaAfGw1HFkL0WSlhk5xekx3IJJKn4pLacX2QeIOo0iNkzNQxZfux1AK4Grl1DvtzZEA== dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.7" - "@walletconnect/jsonrpc-provider" "^1.0.13" - "@walletconnect/jsonrpc-types" "^1.0.3" - "@walletconnect/jsonrpc-utils" "^1.0.8" - "@walletconnect/modal" "^2.4.3" - "@walletconnect/sign-client" "2.10.6" - "@walletconnect/types" "2.10.6" - "@walletconnect/universal-provider" "2.10.6" - "@walletconnect/utils" "2.10.6" - events "^3.3.0" + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/modal" "2.6.2" + "@walletconnect/sign-client" "2.13.0" + "@walletconnect/types" "2.13.0" + "@walletconnect/universal-provider" "2.13.0" + "@walletconnect/utils" "2.13.0" + events "3.3.0" -"@walletconnect/events@^1.0.1": +"@walletconnect/events@1.0.1", "@walletconnect/events@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c" integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ== @@ -4329,41 +4271,41 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/heartbeat@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.1.tgz#afaa3a53232ae182d7c9cff41c1084472d8f32e9" - integrity sha512-yVzws616xsDLJxuG/28FqtZ5rzrTA4gUjdEMTbWB5Y8V1XHRmqq4efAxCw5ie7WjbXFSUyBHaWlMR+2/CpQC5Q== +"@walletconnect/heartbeat@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz#e8dc5179db7769950c6f9cf59b23516d9b95227d" + integrity sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw== dependencies: "@walletconnect/events" "^1.0.1" "@walletconnect/time" "^1.0.2" - tslib "1.14.1" + events "^3.3.0" -"@walletconnect/jsonrpc-http-connection@^1.0.4", "@walletconnect/jsonrpc-http-connection@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.7.tgz#a6973569b8854c22da707a759d241e4f5c2d5a98" - integrity sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ== +"@walletconnect/jsonrpc-http-connection@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz#2f4c3948f074960a3edd07909560f3be13e2c7ae" + integrity sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.1" cross-fetch "^3.1.4" - tslib "1.14.1" + events "^3.3.0" -"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.13", "@walletconnect/jsonrpc-provider@^1.0.6": - version "1.0.13" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" - integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== +"@walletconnect/jsonrpc-provider@1.0.14": + version "1.0.14" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz#696f3e3b6d728b361f2e8b853cfc6afbdf2e4e3e" + integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.8" "@walletconnect/safe-json" "^1.0.2" - tslib "1.14.1" + events "^3.3.0" -"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" - integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== +"@walletconnect/jsonrpc-types@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz#ce1a667d79eadf2a2d9d002c152ceb68739c230c" + integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ== dependencies: + events "^3.3.0" keyvaluestorage-interface "^1.0.0" - tslib "1.14.1" "@walletconnect/jsonrpc-types@^1.0.2": version "1.0.2" @@ -4373,7 +4315,15 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": +"@walletconnect/jsonrpc-types@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" + integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== + dependencies: + keyvaluestorage-interface "^1.0.0" + tslib "1.14.1" + +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== @@ -4392,15 +4342,7 @@ events "^3.3.0" ws "^7.5.1" -"@walletconnect/keyvaluestorage@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" - integrity sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ== - dependencies: - safe-json-utils "^1.1.1" - tslib "1.14.1" - -"@walletconnect/keyvaluestorage@^1.1.1": +"@walletconnect/keyvaluestorage@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== @@ -4409,73 +4351,13 @@ idb-keyval "^6.2.1" unstorage "^1.9.0" -"@walletconnect/legacy-client@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-client/-/legacy-client-2.0.0.tgz#9f2c09694789fd4b6c5d68d6423b44bac55aed30" - integrity sha512-v5L7rYk9loVnfvUf0mF+76bUPFaU5/Vh7mzL6/950CD/yoGdzYZ3Kj+L7mkC6HPMEGeQsBP1+sqBuiVGZ/aODA== - dependencies: - "@walletconnect/crypto" "^1.0.3" - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.4" - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/legacy-utils" "^2.0.0" - "@walletconnect/safe-json" "^1.0.1" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" - detect-browser "^5.3.0" - query-string "^6.13.5" - -"@walletconnect/legacy-modal@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-modal/-/legacy-modal-2.0.0.tgz#d0fab01a1337a8f5d88cdb1430cbef2d46072bbf" - integrity sha512-jckNd8lMhm4X7dX9TDdxM3bXKJnaqkRs6K2Mo5j6GmbIF9Eyx40jZ5+q457RVxvM6ciZEDT5s1wBHWdWoOo+9Q== - dependencies: - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/legacy-utils" "^2.0.0" - copy-to-clipboard "^3.3.3" - preact "^10.12.0" - qrcode "^1.5.1" - -"@walletconnect/legacy-provider@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-provider/-/legacy-provider-2.0.0.tgz#08e2db1e4c234743b2f30422bc8100bc42e8fc44" - integrity sha512-A8xPebMI1A+50HbWwTpFCbwP7G+1NGKdTKyg8BUUg3h3Y9JucpC1W6w/x0v1Xw7qFEqQnz74LoIN/A3ytH9xrQ== - dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.4" - "@walletconnect/jsonrpc-provider" "^1.0.6" - "@walletconnect/legacy-client" "^2.0.0" - "@walletconnect/legacy-modal" "^2.0.0" - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/legacy-utils" "^2.0.0" - -"@walletconnect/legacy-types@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-types/-/legacy-types-2.0.0.tgz#224278ae2874c6a2ca805c2d1d062a511dcf7227" - integrity sha512-sOVrA7HUdbI1OwKyPOQU0/DdvTSVFlsXWpAk2K2WvP2erTkBWPMTJq6cv2BmKdoJ3p6gLApT7sd+jHi3OF71uw== - dependencies: - "@walletconnect/jsonrpc-types" "^1.0.2" - -"@walletconnect/legacy-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@walletconnect/legacy-utils/-/legacy-utils-2.0.0.tgz#e3a637c00783f9cd2ae139b640f82223ab78ed9d" - integrity sha512-CPWxSVVXw0kgNCxvU126g4GiV3mzXmC8IPJ15twE46aJ1FX+RHEIfAzFMFz2F2+fEhBxL63A7dwNQKDXorRPcQ== - dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.4" - "@walletconnect/legacy-types" "^2.0.0" - "@walletconnect/safe-json" "^1.0.1" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" - detect-browser "^5.3.0" - query-string "^6.13.5" - -"@walletconnect/logger@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8" - integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ== +"@walletconnect/logger@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.1.2.tgz#813c9af61b96323a99f16c10089bfeb525e2a272" + integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw== dependencies: + "@walletconnect/safe-json" "^1.0.2" pino "7.11.0" - tslib "1.14.1" "@walletconnect/modal-core@2.6.2": version "2.6.2" @@ -4494,7 +4376,7 @@ motion "10.16.2" qrcode "1.5.3" -"@walletconnect/modal@2.6.2", "@walletconnect/modal@^2.4.3": +"@walletconnect/modal@2.6.2": version "2.6.2" resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.6.2.tgz#4b534a836f5039eeb3268b80be7217a94dd12651" integrity sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA== @@ -4502,25 +4384,14 @@ "@walletconnect/modal-core" "2.6.2" "@walletconnect/modal-ui" "2.6.2" -"@walletconnect/randombytes@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" - integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw== - dependencies: - "@walletconnect/encoding" "^1.0.2" - "@walletconnect/environment" "^1.0.1" - randombytes "^2.1.0" - tslib "1.14.1" - -"@walletconnect/relay-api@^1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" - integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== +"@walletconnect/relay-api@1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.10.tgz#5aef3cd07c21582b968136179aa75849dcc65499" + integrity sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw== dependencies: "@walletconnect/jsonrpc-types" "^1.0.2" - tslib "1.14.1" -"@walletconnect/relay-auth@^1.0.4": +"@walletconnect/relay-auth@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c" integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ== @@ -4532,122 +4403,90 @@ tslib "1.14.1" uint8arrays "^3.0.0" -"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": +"@walletconnect/safe-json@1.0.2", "@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77" integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA== dependencies: tslib "1.14.1" -"@walletconnect/sign-client@2.10.6": - version "2.10.6" - resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.10.6.tgz#722d2c2844565e2826dce6a6d3a36c9b3ca1ea91" - integrity sha512-EvUWjaZBQu2yKnH5/5F2qzbuiIuUN9ZgrNKgvXkw5z1Dq5RJCks0S9/MFlKH/ZSGqXnLl7uAzBXtoX4sMgbCMA== +"@walletconnect/sign-client@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.13.0.tgz#f59993f082aec1ca5498b9519027e764c1e6d28b" + integrity sha512-En7KSvNUlQFx20IsYGsFgkNJ2lpvDvRsSFOT5PTdGskwCkUfOpB33SQJ6nCrN19gyoKPNvWg80Cy6MJI0TjNYA== dependencies: - "@walletconnect/core" "2.10.6" - "@walletconnect/events" "^1.0.1" - "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/core" "2.13.0" + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/logger" "^2.0.1" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.10.6" - "@walletconnect/utils" "2.10.6" - events "^3.3.0" + "@walletconnect/logger" "2.1.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.13.0" + "@walletconnect/utils" "2.13.0" + events "3.3.0" -"@walletconnect/time@^1.0.2": +"@walletconnect/time@1.0.2", "@walletconnect/time@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523" integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g== dependencies: tslib "1.14.1" -"@walletconnect/types@2.10.2": - version "2.10.2" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.2.tgz#68e433a29ec2cf42d79d8b50c77bd5c1d91db721" - integrity sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ== - dependencies: - "@walletconnect/events" "^1.0.1" - "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-types" "1.0.3" - "@walletconnect/keyvaluestorage" "^1.0.2" - "@walletconnect/logger" "^2.0.1" - events "^3.3.0" - -"@walletconnect/types@2.10.6": - version "2.10.6" - resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.6.tgz#d9920ed4fd0113e0addbda8e7e73a5176a3163fd" - integrity sha512-WgHfiTG1yakmxheaBRiXhUdEmgxwrvsAdOIWaMf/spvrzVKYh6sHI3oyEEky5qj5jjiMiyQBeB57QamzCotbcQ== - dependencies: - "@walletconnect/events" "^1.0.1" - "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-types" "1.0.3" - "@walletconnect/keyvaluestorage" "^1.1.1" - "@walletconnect/logger" "^2.0.1" - events "^3.3.0" - -"@walletconnect/universal-provider@2.10.6": - version "2.10.6" - resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.10.6.tgz#1a6c42517581f11ce275474bc70d0eb4f1044525" - integrity sha512-CEivusqqoD31BhCTKp08DnrccfGjwD9MFjZs5BNRorDteRFE8zVm9LmP6DSiNJCw82ZajGlZThggLQ/BAATfwA== - dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.7" - "@walletconnect/jsonrpc-provider" "1.0.13" - "@walletconnect/jsonrpc-types" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.7" - "@walletconnect/logger" "^2.0.1" - "@walletconnect/sign-client" "2.10.6" - "@walletconnect/types" "2.10.6" - "@walletconnect/utils" "2.10.6" - events "^3.3.0" - -"@walletconnect/utils@2.10.2": - version "2.10.2" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.2.tgz#1f2c6a2f1bb95bcc4517b1e94aa7164c9286eb46" - integrity sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg== - dependencies: - "@stablelib/chacha20poly1305" "1.0.1" - "@stablelib/hkdf" "1.0.1" - "@stablelib/random" "^1.0.2" - "@stablelib/sha256" "1.0.1" - "@stablelib/x25519" "^1.0.3" - "@walletconnect/relay-api" "^1.0.9" - "@walletconnect/safe-json" "^1.0.2" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.10.2" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" - detect-browser "5.3.0" - query-string "7.1.3" - uint8arrays "^3.1.0" +"@walletconnect/types@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.13.0.tgz#cdac083651f5897084fe9ed62779f11810335ac6" + integrity sha512-MWaVT0FkZwzYbD3tvk8F+2qpPlz1LUSWHuqbINUtMXnSzJtXN49Y99fR7FuBhNFtDalfuWsEK17GrNA+KnAsPQ== + dependencies: + "@walletconnect/events" "1.0.1" + "@walletconnect/heartbeat" "1.2.2" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/keyvaluestorage" "1.1.1" + "@walletconnect/logger" "2.1.2" + events "3.3.0" + +"@walletconnect/universal-provider@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.13.0.tgz#f2b597001245e4d4a06d96dd1bce8d3a8a4dcbbf" + integrity sha512-B5QvO8pnk5Bqn4aIt0OukGEQn2Auk9VbHfhQb9cGwgmSCd1GlprX/Qblu4gyT5+TjHMb1Gz5UssUaZWTWbDhBg== + dependencies: + "@walletconnect/jsonrpc-http-connection" "1.0.8" + "@walletconnect/jsonrpc-provider" "1.0.14" + "@walletconnect/jsonrpc-types" "1.0.4" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/logger" "2.1.2" + "@walletconnect/sign-client" "2.13.0" + "@walletconnect/types" "2.13.0" + "@walletconnect/utils" "2.13.0" + events "3.3.0" -"@walletconnect/utils@2.10.6": - version "2.10.6" - resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.6.tgz#749b37d14e291e346862e7027ec7548463350226" - integrity sha512-oRsWWhN2+hi3aiDXrQEOfysz6FHQJGXLsNQPVt+WIBJplO6Szmdau9dbleD88u1iiT4GKPqE0R9FOYvvPm1H/w== +"@walletconnect/utils@2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.13.0.tgz#1fc1fbff0d26db0830e65d1ba8cfe1a13a0616ad" + integrity sha512-q1eDCsRHj5iLe7fF8RroGoPZpdo2CYMZzQSrw1iqL+2+GOeqapxxuJ1vaJkmDUkwgklfB22ufqG6KQnz78sD4w== dependencies: "@stablelib/chacha20poly1305" "1.0.1" "@stablelib/hkdf" "1.0.1" - "@stablelib/random" "^1.0.2" + "@stablelib/random" "1.0.2" "@stablelib/sha256" "1.0.1" - "@stablelib/x25519" "^1.0.3" - "@walletconnect/relay-api" "^1.0.9" - "@walletconnect/safe-json" "^1.0.2" - "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.10.6" - "@walletconnect/window-getters" "^1.0.1" - "@walletconnect/window-metadata" "^1.0.1" + "@stablelib/x25519" "1.0.3" + "@walletconnect/relay-api" "1.0.10" + "@walletconnect/safe-json" "1.0.2" + "@walletconnect/time" "1.0.2" + "@walletconnect/types" "2.13.0" + "@walletconnect/window-getters" "1.0.1" + "@walletconnect/window-metadata" "1.0.1" detect-browser "5.3.0" query-string "7.1.3" - uint8arrays "^3.1.0" + uint8arrays "3.1.0" -"@walletconnect/window-getters@^1.0.1": +"@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc" integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q== dependencies: tslib "1.14.1" -"@walletconnect/window-metadata@^1.0.1": +"@walletconnect/window-metadata@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5" integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA== @@ -4655,52 +4494,6 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@web3-onboard/common@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@web3-onboard/common/-/common-2.3.1.tgz#69ad0d5167e5103086c34a4f7e8af90681d71be4" - integrity sha512-VRIsJLW92Q+bu6w9WSlTrPIk0vGmFvVwnoAKy1ubKuBvSKKhMUmrnv8N5tusr0mk+gcUuUdDF6gLDCABqrfC7g== - dependencies: - bignumber.js "^9.1.0" - ethers "5.5.4" - joi "17.9.1" - -"@web3-onboard/core@^2.17.0": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@web3-onboard/core/-/core-2.17.0.tgz#5c0a0114e1d53cfc473f9b0aef5bae355b50e502" - integrity sha512-N6LKiNVjHHOqEdh9RrRAhlWid3bm6SqaCyMcfbqcJceWL53V4nFMTleutIX/YGZbqfms27p6oTAk1xZ0470L+g== - dependencies: - "@web3-onboard/common" "^2.3.1" - bignumber.js "^9.0.0" - bnc-sdk "^4.6.7" - bowser "^2.11.0" - ethers "5.5.3" - eventemitter3 "^4.0.7" - joi "17.9.1" - lodash.merge "^4.6.2" - lodash.partition "^4.6.0" - nanoid "^4.0.0" - rxjs "^7.5.5" - svelte "^3.49.0" - svelte-i18n "^3.3.13" - -"@web3-onboard/injected-wallets@^2.2.4": - version "2.8.5" - resolved "https://registry.yarnpkg.com/@web3-onboard/injected-wallets/-/injected-wallets-2.8.5.tgz#5a90452230031bf6a3b32921920f5692e515a865" - integrity sha512-0+Rd4AVsQ40QICV8eh/VLgwJcKf24tjqA4BREENKl7C7Gw35L8ZJTsbwg3mBIrzy9jK0WC36jvNrX0OtBoQvVQ== - dependencies: - "@web3-onboard/common" "^2.3.1" - joi "17.9.1" - lodash.uniqby "^4.7.0" - -"@web3-onboard/react@^2.3.6": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@web3-onboard/react/-/react-2.8.0.tgz#a1ec15cbbf69eda00e4e114262b913121320a613" - integrity sha512-ogZ0menoJmZEdetUgsAtKDWCMLaVOqbjrKuWS5gGMcAmUm8+/sZ6fn9Aca0wRAK1f+L7vKD8fzJikFaO1vOiog== - dependencies: - "@web3-onboard/common" "^2.3.1" - "@web3-onboard/core" "^2.17.0" - use-sync-external-store "1.0.0" - "@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": version "1.11.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" @@ -4837,24 +4630,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abitype@0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.8.7.tgz#e4b3f051febd08111f486c0cc6a98fa72d033622" - integrity sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w== - abitype@0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.3.tgz#294d25288ee683d72baf4e1fed757034e3c8c277" @@ -4865,6 +4645,18 @@ abitype@0.9.8: resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== +abitype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" + integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -4929,21 +4721,23 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +advanced-cropper@~0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/advanced-cropper/-/advanced-cropper-0.17.1.tgz#fedb73d9f48a3eae53a3a80de575a4e5c1febade" + integrity sha512-Z1P0sYOXa2tqZjeY742QtNERofXh1AuOa27LEurO9rbx3IfzLrGQlzy7sWEc5VN9hRg+J/qCiMmnB6tUDLb1TA== + dependencies: + tslib "^2.4.0" aes-js@4.0.0-beta.5: version "4.0.0-beta.5" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== -aes-js@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -4951,15 +4745,6 @@ agent-base@6: dependencies: debug "4" -agentkeepalive@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== - dependencies: - debug "^4.1.0" - depd "^2.0.0" - humanize-ms "^1.2.1" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -4968,11 +4753,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ahocorasick@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ahocorasick/-/ahocorasick-1.0.2.tgz#9eee93aef9d02bfb476d9b648d9b7a40ef2fd500" - integrity sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA== - ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -5012,6 +4792,18 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" @@ -5024,6 +4816,13 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: dependencies: type-fest "^0.21.3" +ansi-escapes@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" + integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== + dependencies: + type-fest "^3.0.0" + ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" @@ -5058,6 +4857,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -5081,7 +4885,7 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -arg@^5.0.2: +arg@^5.0.0, arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== @@ -5472,11 +5276,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - bfj@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" @@ -5497,44 +5296,20 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - -bignumber.js@*: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - bignumber.js@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885" integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ== -bignumber.js@^9.0.0, bignumber.js@^9.1.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bind-decorator@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" - integrity sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg== - -bindings@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== blob-util@^2.0.2: version "2.0.2" @@ -5546,7 +5321,7 @@ bluebird@^3.5.5, bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -5556,16 +5331,6 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -bnc-sdk@^4.6.7: - version "4.6.7" - resolved "https://registry.yarnpkg.com/bnc-sdk/-/bnc-sdk-4.6.7.tgz#138a22e04c95c2c697fb836092358d21957e2114" - integrity sha512-jIQ6cmeRBgvH/YDLuYRr2+kxDGcAAi0SOvjlO5nQ5cWdbslw+ASWftd1HmxiVLNCiwEH5bSc/t8a0agZ5njTUQ== - dependencies: - crypto-es "^1.2.2" - nanoid "^3.3.1" - rxjs "^6.6.3" - sturdy-websocket "^0.1.12" - body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" @@ -5599,20 +5364,25 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -bowser@^2.11.0: +bowser@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -5621,6 +5391,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -5652,7 +5429,12 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -5716,13 +5498,22 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4 node-releases "^2.0.8" update-browserslist-db "^1.0.10" -bs58@^4.0.0, bs58@^4.0.1: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -5745,14 +5536,6 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -5761,10 +5544,18 @@ buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== dependencies: node-gyp-build "^4.3.0" @@ -5824,7 +5615,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0, camelcase@^6.2.1: +camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -5844,6 +5635,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz" integrity sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg== +canvas-confetti@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/canvas-confetti/-/canvas-confetti-1.9.3.tgz#ef4c857420ad8045ab4abe8547261c8cdf229845" + integrity sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g== + case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" @@ -5854,12 +5650,32 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +"cbw-sdk@npm:@coinbase/wallet-sdk@3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.9.3.tgz#daf10cb0c85d0363315b7270cb3f02bedc408aab" + integrity sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw== + dependencies: + bn.js "^5.2.1" + buffer "^6.0.3" + clsx "^1.2.1" + eth-block-tracker "^7.1.0" + eth-json-rpc-filters "^6.0.0" + eventemitter3 "^5.0.1" + keccak "^3.0.3" + preact "^10.16.0" + sha.js "^2.4.11" + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== -chalk@^2.0.0, chalk@^2.4.1: +chalk@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -5909,7 +5725,7 @@ check-types@^11.1.1: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== -chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@3.5.3, chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -5924,11 +5740,31 @@ chokidar@^3.4.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.2.0: version "3.8.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" @@ -5954,6 +5790,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +classnames@^2.2.6: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -5966,16 +5807,10 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-color@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.3.tgz#73769ba969080629670f3f2ef69a4bf4e7cc1879" - integrity sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ== - dependencies: - d "^1.0.1" - es5-ext "^0.10.61" - es6-iterator "^2.0.3" - memoizee "^0.4.15" - timers-ext "^0.1.7" +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cli-cursor@^3.1.0: version "3.1.0" @@ -5984,6 +5819,13 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + cli-table3@~0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" @@ -6001,6 +5843,14 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + clipboardy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" @@ -6028,10 +5878,19 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clsx@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clsx@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== clsx@^1.0.4, clsx@^1.1.0, clsx@^1.2.1: version "1.2.1" @@ -6091,7 +5950,7 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10, colorette@^2.0.16: +colorette@^2.0.10, colorette@^2.0.16, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -6108,7 +5967,22 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@^2.20.0, commander@^2.20.3: +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -6220,6 +6094,11 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" @@ -6227,7 +6106,7 @@ copy-anything@^2.0.1: dependencies: is-what "^3.14.1" -copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.2, copy-to-clipboard@^3.3.3: +copy-to-clipboard@^3.3.1, copy-to-clipboard@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== @@ -6299,6 +6178,11 @@ craco-less@^2.0.0: less "^4.1.1" less-loader "^7.3.0" +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -6342,6 +6226,13 @@ cross-fetch@^3.1.4, cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.11" +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -6368,11 +6259,6 @@ crypto-browserify@^3.12.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-es@^1.2.2: - version "1.2.7" - resolved "https://registry.yarnpkg.com/crypto-es/-/crypto-es-1.2.7.tgz#754a6d52319a94fb4eb1f119297f17196b360f88" - integrity sha512-UUqiVJ2gUuZFmbFsKmud3uuLcNP2+Opt+5ysmljycFCyhA0+T16XJmo1ev/t5kMChMqWh7IEvURNCqsg+SjZGQ== - crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" @@ -6482,12 +6368,7 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== -css-what@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== - -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -6633,14 +6514,6 @@ cypress@*: untildify "^4.0.0" yauzl "^2.10.0" -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -6662,11 +6535,23 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +date-fns@^2.29.3: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + dayjs@^1.10.4, dayjs@^1.11.5: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + debug@2.6.9, debug@^2.1.3, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -6674,7 +6559,7 @@ debug@2.6.9, debug@^2.1.3, debug@^2.6.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -6693,6 +6578,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decimal.js@^10.2.1: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -6705,7 +6595,7 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: +decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -6743,7 +6633,7 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deep-object-diff@^1.1.0: +deep-object-diff@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== @@ -6778,11 +6668,6 @@ defu@^6.1.2, defu@^6.1.3: resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" integrity sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ== -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6793,7 +6678,7 @@ denque@^2.1.0: resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0, depd@^2.0.0: +depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -6826,7 +6711,7 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-browser@5.3.0, detect-browser@^5.3.0: +detect-browser@5.3.0, detect-browser@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== @@ -6874,6 +6759,11 @@ diff-sequences@^29.4.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -7055,6 +6945,15 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +eciesjs@^0.3.15: + version "0.3.18" + resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.3.18.tgz#67b5d73a8466e40a45bbc2f2a3177e71e9c0643d" + integrity sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw== + dependencies: + "@types/secp256k1" "^4.0.4" + futoin-hkdf "^1.5.3" + secp256k1 "^5.0.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -7085,6 +6984,19 @@ elliptic@6.5.4, elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emitter-component@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/emitter-component/-/emitter-component-1.1.1.tgz#065e2dbed6959bf470679edabeaf7981d1003ab6" @@ -7100,6 +7012,16 @@ emittery@^0.8.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + +emoji-regex@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7125,13 +7047,29 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" +engine.io-client@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.3.tgz#4cf6fa24845029b238f83c628916d9149c399bc5" + integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + enhanced-resolve@^5.13.0: version "5.13.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" @@ -7140,6 +7078,14 @@ enhanced-resolve@^5.13.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -7152,6 +7098,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + errno@^0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -7263,59 +7214,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - es6-object-assign@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -7326,21 +7229,21 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: +escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" @@ -7623,11 +7526,6 @@ estree-walker@^1.0.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== -estree-walker@^2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -7638,22 +7536,23 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -eth-block-tracker@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-6.1.0.tgz#0481f97bbb88a100b9d45806fe7e37af741cbefc" - integrity sha512-K9SY8+/xMBi4M5HHTDdxnpEqEEGjbNpzHFqvxyjMZej8InV/B+CkFRKM6W+uvrFJ7m8Zd1E0qUkseU3vdIDFYQ== +eth-block-tracker@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-7.1.0.tgz#dfc16085c6817cc30caabba381deb8d204c1c766" + integrity sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg== dependencies: - "@metamask/safe-event-emitter" "^2.0.0" - "@metamask/utils" "^3.0.1" + "@metamask/eth-json-rpc-provider" "^1.0.0" + "@metamask/safe-event-emitter" "^3.0.0" + "@metamask/utils" "^5.0.1" json-rpc-random-id "^1.0.1" pify "^3.0.0" -eth-json-rpc-filters@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-5.1.0.tgz#f0c2aeaec2a45e2dc6ca1b9843d8e85447821427" - integrity sha512-fos+9xmoa1A2Ytsc9eYof17r81BjdJOUcGcgZn4K/tKdCCTb+a8ytEtwlu1op5qsXFDlgGmstTELFrDEc89qEQ== +eth-json-rpc-filters@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-6.0.1.tgz#0b3e370f017f5c6f58d3e7bd0756d8099ed85c56" + integrity sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig== dependencies: - "@metamask/safe-event-emitter" "^2.0.0" + "@metamask/safe-event-emitter" "^3.0.0" async-mutex "^0.2.6" eth-query "^2.1.2" json-rpc-engine "^6.1.0" @@ -7667,124 +7566,135 @@ eth-query@^2.1.2: json-rpc-random-id "^1.0.0" xtend "^4.0.1" -eth-rpc-errors@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz#11bc164e25237a679061ac05b7da7537b673d3b7" - integrity sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ== - dependencies: - fast-safe-stringify "^2.0.6" - -eth-rpc-errors@^4.0.2: +eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== dependencies: fast-safe-stringify "^2.0.6" -ethers@5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.3.tgz#1e361516711c0c3244b6210e7e3ecabf0c75fca0" - integrity sha512-fTT4WT8/hTe/BLwRUtl7I5zlpF3XC3P/Xwqxc5AIP2HGlH15qpmjs0Ou78az93b1rLITzXLFxoNX63B8ZbUd7g== - dependencies: - "@ethersproject/abi" "5.5.0" - "@ethersproject/abstract-provider" "5.5.1" - "@ethersproject/abstract-signer" "5.5.0" - "@ethersproject/address" "5.5.0" - "@ethersproject/base64" "5.5.0" - "@ethersproject/basex" "5.5.0" - "@ethersproject/bignumber" "5.5.0" - "@ethersproject/bytes" "5.5.0" - "@ethersproject/constants" "5.5.0" - "@ethersproject/contracts" "5.5.0" - "@ethersproject/hash" "5.5.0" - "@ethersproject/hdnode" "5.5.0" - "@ethersproject/json-wallets" "5.5.0" - "@ethersproject/keccak256" "5.5.0" - "@ethersproject/logger" "5.5.0" - "@ethersproject/networks" "5.5.2" - "@ethersproject/pbkdf2" "5.5.0" - "@ethersproject/properties" "5.5.0" - "@ethersproject/providers" "5.5.2" - "@ethersproject/random" "5.5.1" - "@ethersproject/rlp" "5.5.0" - "@ethersproject/sha2" "5.5.0" - "@ethersproject/signing-key" "5.5.0" - "@ethersproject/solidity" "5.5.0" - "@ethersproject/strings" "5.5.0" - "@ethersproject/transactions" "5.5.0" - "@ethersproject/units" "5.5.0" - "@ethersproject/wallet" "5.5.0" - "@ethersproject/web" "5.5.1" - "@ethersproject/wordlists" "5.5.0" - -ethers@5.5.4: - version "5.5.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.4.tgz#e1155b73376a2f5da448e4a33351b57a885f4352" - integrity sha512-N9IAXsF8iKhgHIC6pquzRgPBJEzc9auw3JoRkaKe+y4Wl/LFBtDDunNe7YmdomontECAcC5APaAgWZBiu1kirw== - dependencies: - "@ethersproject/abi" "5.5.0" - "@ethersproject/abstract-provider" "5.5.1" - "@ethersproject/abstract-signer" "5.5.0" - "@ethersproject/address" "5.5.0" - "@ethersproject/base64" "5.5.0" - "@ethersproject/basex" "5.5.0" - "@ethersproject/bignumber" "5.5.0" - "@ethersproject/bytes" "5.5.0" - "@ethersproject/constants" "5.5.0" - "@ethersproject/contracts" "5.5.0" - "@ethersproject/hash" "5.5.0" - "@ethersproject/hdnode" "5.5.0" - "@ethersproject/json-wallets" "5.5.0" - "@ethersproject/keccak256" "5.5.0" - "@ethersproject/logger" "5.5.0" - "@ethersproject/networks" "5.5.2" - "@ethersproject/pbkdf2" "5.5.0" - "@ethersproject/properties" "5.5.0" - "@ethersproject/providers" "5.5.3" - "@ethersproject/random" "5.5.1" - "@ethersproject/rlp" "5.5.0" - "@ethersproject/sha2" "5.5.0" - "@ethersproject/signing-key" "5.5.0" - "@ethersproject/solidity" "5.5.0" - "@ethersproject/strings" "5.5.0" - "@ethersproject/transactions" "5.5.0" - "@ethersproject/units" "5.5.0" - "@ethersproject/wallet" "5.5.0" - "@ethersproject/web" "5.5.1" - "@ethersproject/wordlists" "5.5.0" - -ethers@^6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.6.4.tgz#f03a86effcd55e82aed96a2fb9a56a9febd3e3d5" - integrity sha512-r3myN2hEnydmu23iiIj5kjWnCh5JNzlqrE/z+Kw5UqH173F+JOWzU6qkFB4HVC50epgxzKSL2Hq1oNXA877vwQ== - dependencies: - "@adraffy/ens-normalize" "1.9.2" - "@noble/hashes" "1.1.2" +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" + integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + dependencies: + "@noble/curves" "1.3.0" + "@noble/hashes" "1.3.3" + "@scure/bip32" "1.3.3" + "@scure/bip39" "1.2.2" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethers@6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.12.0.tgz#b0c2ce207ae5a3b5125be966e32ffea7c1f2481a" + integrity sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +ethers@^6.11.1: + version "6.13.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.0.tgz#f342958d0f622cf06559f59fbccdc1d30fa64f50" + integrity sha512-+yyQQQWEntY5UVbCv++guA14RRVFm1rSnO1GoLFdrK7/XRWMoktNgyG9UjwxrQqGBfGyFKknNZ81YpUS2emCgg== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" "@types/node" "18.15.13" aes-js "4.0.0-beta.5" tslib "2.4.0" ws "8.5.0" -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: - d "1" - es5-ext "~0.10.14" + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== eventemitter2@6.4.7: version "6.4.7" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== -eventemitter3@^4.0.0, eventemitter3@^4.0.7: +eventemitter2@^6.4.7: + version "6.4.9" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" + integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== + +eventemitter3@5.0.1, eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0, events@^3.3.0: +events@3.3.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -7812,6 +7722,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -7897,18 +7822,19 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" -ext@^1.1.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extension-port-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extension-port-stream/-/extension-port-stream-3.0.0.tgz#00a7185fe2322708a36ed24843c81bd754925fef" + integrity sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw== + dependencies: + readable-stream "^3.6.2 || ^4.4.2" + webextension-polyfill ">=0.10.0 <1.0" + extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -7930,11 +7856,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -7986,11 +7907,6 @@ fast-shallow-equal@^1.0.0: resolved "https://registry.yarnpkg.com/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b" integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - fastest-stable-stringify@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76" @@ -8046,11 +7962,6 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -8102,6 +8013,21 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -8117,14 +8043,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -8133,6 +8051,11 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" @@ -8143,6 +8066,11 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.12.1: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -8197,6 +8125,16 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" @@ -8216,6 +8154,17 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -8225,6 +8174,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -8270,6 +8228,11 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +futoin-hkdf@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.3.tgz#6c8024f2e1429da086d4e18289ef2239ad33ee35" + integrity sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -8280,6 +8243,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" @@ -8321,6 +8289,11 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -8374,6 +8347,29 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -8428,11 +8424,6 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globalyzer@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" - integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== - globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -8445,10 +8436,10 @@ globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +goober@^2.0.33: + version "2.1.14" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.14.tgz#4a5c94fc34dc086a8e6035360ae1800005135acd" + integrity sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== gopd@^1.0.1: version "1.0.1" @@ -8457,7 +8448,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -8493,6 +8484,55 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +hardhat@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.1.tgz#2640ecc6ff655dea883a25a8b17f1e70e45e6756" + integrity sha512-cTWYIJc5jQ132XUI8oRI/TO9L6oavPoJRCTRU9sIjkVxvkxz0Axz0K83Z3BEdJTqBQ2W84ZRoTekti84kBwCjg== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.3.1" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" @@ -8606,6 +8646,15 @@ hast-util-raw@^7.2.0: web-namespaces "^2.0.0" zwitch "^2.0.0" +hast-util-sanitize@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-5.0.1.tgz#8e90068cd68e651c569960b77a1b25076579b4cf" + integrity sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ== + dependencies: + "@types/hast" "^3.0.0" + "@ungap/structured-clone" "^1.2.0" + unist-util-position "^5.0.0" + hast-util-to-parse5@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" @@ -8644,7 +8693,7 @@ hastscript@^7.0.0: property-information "^6.0.0" space-separated-tokens "^2.0.0" -he@^1.2.0: +he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -8838,12 +8887,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== husky@^8.0.2: version "8.0.3" @@ -8855,14 +8902,19 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -i18n-js@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/i18n-js/-/i18n-js-4.3.2.tgz#ec5391f23c76f5374b53645c83d272914eb81291" - integrity sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA== +i18next-browser-languagedetector@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.1.0.tgz#01876fac51f86b78975e79b48ccb62e2313a2d7d" + integrity sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA== dependencies: - bignumber.js "*" - lodash "*" - make-plural "*" + "@babel/runtime" "^7.19.4" + +i18next@22.5.1: + version "22.5.1" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" + integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== + dependencies: + "@babel/runtime" "^7.20.6" iconv-lite@0.4.24: version "0.4.24" @@ -8920,6 +8972,11 @@ immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== +immutable@^4.0.0-rc.12: + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -8996,23 +9053,20 @@ internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -intl-messageformat@^9.13.0: - version "9.13.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.13.0.tgz#97360b73bd82212e4f6005c712a4a16053165468" - integrity sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/fast-memoize" "1.2.1" - "@formatjs/icu-messageformat-parser" "2.1.0" - tslib "^2.1.0" - -invariant@^2.2.4: +invariant@2.2.4, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + ioredis@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" @@ -9133,6 +9187,18 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -9152,6 +9218,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-installed-globally@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -9205,6 +9276,11 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -9220,11 +9296,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-promise@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -9260,6 +9331,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -9285,7 +9361,7 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" -is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -9342,16 +9418,19 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-unfetch@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + isomorphic-ws@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - isows@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" @@ -9419,24 +9498,6 @@ javascript-natural-sort@0.7.1: resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== -jayson@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" - integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - uuid "^8.3.2" - ws "^7.4.5" - jest-changed-files@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" @@ -9981,16 +10042,10 @@ jiti@^1.20.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== -joi@17.9.1: - version "17.9.1" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.1.tgz#74899b9fa3646904afa984a11df648eca66c9018" - integrity sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" +js-base64@^3.7.6: + version "3.7.7" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" + integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== js-cookie@^2.2.1: version "2.2.1" @@ -10012,6 +10067,13 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -10020,13 +10082,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -10080,7 +10135,7 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: +json-rpc-engine@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== @@ -10113,7 +10168,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -10135,6 +10190,20 @@ jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -10151,11 +10220,6 @@ jsonp@^0.2.1: dependencies: debug "^2.1.3" -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -10193,10 +10257,10 @@ katex@^0.16.0: dependencies: commander "^8.3.0" -keccak@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== +keccak@^3.0.0, keccak@^3.0.2, keccak@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -10212,6 +10276,13 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -10306,6 +10377,11 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lilconfig@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" + integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== + lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -10316,6 +10392,22 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lint-staged@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.2.tgz#ad7cbb5b3ab70e043fa05bff82a09ed286bc4c5f" + integrity sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw== + dependencies: + chalk "5.3.0" + commander "11.1.0" + debug "4.3.4" + execa "8.0.1" + lilconfig "3.0.0" + listr2 "8.0.1" + micromatch "4.0.5" + pidtree "0.6.0" + string-argv "0.3.2" + yaml "2.3.4" + listhen@^1.5.5: version "1.5.5" resolved "https://registry.yarnpkg.com/listhen/-/listhen-1.5.5.tgz#58915512af70f770aa3e9fb19367adf479bb58c4" @@ -10339,6 +10431,18 @@ listhen@^1.5.5: untun "^0.1.2" uqr "^0.1.2" +listr2@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.1.tgz#4d3f50ae6cec3c62bdf0e94f5c2c9edebd4b9c34" + integrity sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.0.0" + rfdc "^1.3.0" + wrap-ansi "^9.0.0" + listr2@^3.8.3: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" @@ -10404,6 +10508,14 @@ loader-utils@^3.2.0: resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -10461,11 +10573,6 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.partition@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.partition/-/lodash.partition-4.6.0.tgz#a38e46b73469e0420b0da1212e66d414be364ba4" - integrity sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -10476,17 +10583,12 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash.uniqby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" - integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== - -lodash@*, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0: +log-symbols@4.1.0, log-symbols@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -10504,6 +10606,17 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +log-update@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== + dependencies: + ansi-escapes "^6.2.0" + cli-cursor "^4.0.0" + slice-ansi "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + longest-streak@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" @@ -10542,12 +10655,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== - dependencies: - es5-ext "~0.10.2" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== lz-string@^1.4.4: version "1.5.0" @@ -10581,11 +10692,6 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-plural@*: - version "7.3.0" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-7.3.0.tgz#2889dbafca2fb097037c47967d3e3afa7e48a52c" - integrity sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw== - makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -10791,19 +10897,10 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.3" -memoizee@^0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" - integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== - dependencies: - d "^1.0.1" - es5-ext "^0.10.53" - es6-weak-map "^2.0.3" - event-emitter "^0.3.5" - is-promise "^2.2.2" - lru-queue "^0.1.0" - next-tick "^1.1.0" - timers-ext "^0.1.7" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge-descriptors@1.0.1: version "1.0.1" @@ -10825,6 +10922,11 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" @@ -11113,7 +11215,7 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@4.0.5, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -11161,6 +11263,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -11183,6 +11290,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.0.6, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.0.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -11195,6 +11309,13 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mipd@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.5.tgz#367ee796531c23f0631f129038700b1406663aec" + integrity sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA== + dependencies: + viem "^1.1.4" + mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -11212,6 +11333,44 @@ mlly@^1.2.0, mlly@^1.4.2: pkg-types "^1.0.3" ufo "^1.3.0" +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.4.0.tgz#ed03db96ee9cfc6d20c56f8e2af07b961dbae261" + integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "8.1.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +modern-ahocorasick@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" + integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== + motion@10.16.2: version "10.16.2" resolved "https://registry.yarnpkg.com/motion/-/motion-10.16.2.tgz#7dc173c6ad62210a7e9916caeeaf22c51e598d21" @@ -11239,7 +11398,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -11252,7 +11411,7 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -multiformats@^9.4.2: +multiformats@9.9.0, multiformats@^9.4.2: version "9.9.0" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== @@ -11287,16 +11446,11 @@ nano-time@1.0.0: dependencies: big-integer "^1.6.16" -nanoid@^3.3.1, nanoid@^3.3.6: +nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -nanoid@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e" - integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== - napi-wasm@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" @@ -11331,11 +11485,6 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@1, next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -11349,6 +11498,11 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + node-addon-api@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e" @@ -11359,6 +11513,13 @@ node-fetch-native@^1.4.0, node-fetch-native@^1.4.1: resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.4.1.tgz#5a336e55b4e1b1e72b9927da09fecd2b374c9be5" integrity sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w== +node-fetch@^2.6.1, node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-fetch@^2.6.11, node-fetch@^2.6.7: version "2.6.11" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" @@ -11401,6 +11562,14 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +notistack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/notistack/-/notistack-3.0.1.tgz#daf59888ab7e2c30a1fa8f71f9cba2978773236e" + integrity sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA== + dependencies: + clsx "^1.1.0" + goober "^2.0.33" + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -11408,6 +11577,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -11422,6 +11598,13 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +number-flip@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/number-flip/-/number-flip-1.2.3.tgz#ebed6be39ba5df96f6c0dabaa637d78ab49cbea5" + integrity sha512-ds88/rUo4yzcTfwWKWOepbPCbiuCL+DmFRkVSEFrQBWJqrPepU74XMaKoW9PuxzYqR7kxr8vyadMOI54XxlqbQ== + dependencies: + vue-template-compiler "^2.7.16" + numbro@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/numbro/-/numbro-2.3.6.tgz#4bd622ebe59ccbc49dad365c5b9eed200781fa21" @@ -11434,6 +11617,15 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== +obj-multiplex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/obj-multiplex/-/obj-multiplex-1.0.0.tgz#2f2ae6bfd4ae11befe742ea9ea5b36636eabffc1" + integrity sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA== + dependencies: + end-of-stream "^1.4.0" + once "^1.4.0" + readable-stream "^2.3.3" + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -11518,6 +11710,11 @@ object.values@^1.1.0, object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + oblivious-set@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566" @@ -11568,6 +11765,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@^8.0.9, open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -11606,6 +11810,11 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + ospath@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" @@ -11616,6 +11825,13 @@ outdent@^0.8.0: resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -11630,6 +11846,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -11666,11 +11889,21 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -11750,7 +11983,12 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -11770,7 +12008,7 @@ pathe@^1.1.0, pathe@^1.1.1: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== -pbkdf2@^3.0.3: +pbkdf2@^3.0.17, pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -11806,6 +12044,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -11889,6 +12132,11 @@ pngjs@^5.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== +pony-cause@^2.1.10: + version "2.1.10" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" + integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== + postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" @@ -12441,10 +12689,10 @@ postcss@^8.0.9, postcss@^8.3.5, postcss@^8.4.17, postcss@^8.4.19, postcss@^8.4.4 picocolors "^1.0.0" source-map-js "^1.0.2" -preact@^10.12.0, preact@^10.5.9: - version "10.15.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" - integrity sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g== +preact@^10.16.0: + version "10.20.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.1.tgz#1bc598ab630d8612978f7533da45809a8298542b" + integrity sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw== prelude-ls@^1.2.1: version "1.2.1" @@ -12631,17 +12879,24 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qrcode@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.0.tgz#95abb8a91fdafd86f8190f2836abbfc500c72d1b" - integrity sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ== +qr-code-styling@^1.6.0-rc.1: + version "1.6.0-rc.1" + resolved "https://registry.yarnpkg.com/qr-code-styling/-/qr-code-styling-1.6.0-rc.1.tgz#6c89e185fa50cc9135101085c12ae95b06f1b290" + integrity sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q== dependencies: - dijkstrajs "^1.0.1" - encode-utf8 "^1.0.3" - pngjs "^5.0.0" - yargs "^15.3.1" + qrcode-generator "^1.4.3" + +qrcode-generator@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode-generator/-/qrcode-generator-1.4.4.tgz#63f771224854759329a99048806a53ed278740e7" + integrity sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw== + +qrcode-terminal-nooctal@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/qrcode-terminal-nooctal/-/qrcode-terminal-nooctal-0.12.1.tgz#45016aca0d82b2818de7af0a06d072ad671fbe2e" + integrity sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg== -qrcode@1.5.3, qrcode@^1.5.1: +qrcode@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== @@ -12658,13 +12913,6 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.10.3: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - qs@~6.10.3: version "6.10.5" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" @@ -12682,16 +12930,6 @@ query-string@7.1.3: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -query-string@^6.13.5: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -12754,6 +12992,25 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-advanced-cropper@^0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/react-advanced-cropper/-/react-advanced-cropper-0.20.0.tgz#be998018f1506b9216d239e36c17fc151a3dc9c6" + integrity sha512-9X5B+1IwFRzNb92xl58iMgrcdDSsQN/hw7048L0tnmL3CdpRXEo4vs+ahmoCM1OtFYf2IT8PE6fTPXTuADsQmg== + dependencies: + advanced-cropper "~0.17.1" + classnames "^2.2.6" + tslib "^2.4.0" + react-app-polyfill@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" @@ -12857,6 +13114,11 @@ react-helmet-async@^1.3.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-intersection-observer@^9.13.1: + version "9.13.1" + resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz#6c61a75801162491c6348bad09967f2caf445584" + integrity sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw== + react-intersection-observer@^9.4.3: version "9.5.2" resolved "https://registry.yarnpkg.com/react-intersection-observer/-/react-intersection-observer-9.5.2.tgz#f68363a1ff292323c0808201b58134307a1626d0" @@ -12912,6 +13174,14 @@ react-markdown@^8.0.3: unist-util-visit "^4.0.0" vfile "^5.0.0" +react-native-webview@^11.26.0: + version "11.26.1" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.26.1.tgz#658c09ed5162dc170b361e48c2dd26c9712879da" + integrity sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw== + dependencies: + escape-string-regexp "2.0.0" + invariant "2.2.4" + react-query@^3.39.2: version "3.39.3" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" @@ -12938,20 +13208,20 @@ react-refresh@^0.11.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== -react-remove-scroll-bar@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" - integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== +react-remove-scroll-bar@^2.3.4: + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== dependencies: react-style-singleton "^2.2.1" tslib "^2.0.0" -react-remove-scroll@2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0" - integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== +react-remove-scroll@2.5.7: + version "2.5.7" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" + integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== dependencies: - react-remove-scroll-bar "^2.3.3" + react-remove-scroll-bar "^2.3.4" react-style-singleton "^2.2.1" tslib "^2.1.0" use-callback-ref "^1.3.0" @@ -13097,7 +13367,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^2.0.1: +readable-stream@^2.0.1, readable-stream@^2.3.3: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -13110,7 +13380,7 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -13119,6 +13389,17 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" +"readable-stream@^3.6.2 || ^4.4.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -13182,6 +13463,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -13255,6 +13541,14 @@ rehype-raw@^6.1.1: hast-util-raw "^7.2.0" unified "^10.0.0" +rehype-sanitize@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz#16e95f4a67a69cbf0f79e113c8e0df48203db73c" + integrity sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg== + dependencies: + "@types/hast" "^3.0.0" + hast-util-sanitize "^5.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -13327,7 +13621,7 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.2: +require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -13380,6 +13674,13 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" @@ -13406,6 +13707,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -13428,6 +13737,13 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -13436,6 +13752,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rlp@^2.2.3: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + rollup-plugin-terser@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" @@ -13446,6 +13769,16 @@ rollup-plugin-terser@^7.0.0: serialize-javascript "^4.0.0" terser "^5.0.0" +rollup-plugin-visualizer@^5.9.2: + version "5.12.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#661542191ce78ee4f378995297260d0c1efb1302" + integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + rollup@^2.43.1: version "2.79.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" @@ -13453,19 +13786,6 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rpc-websockets@^7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" - integrity sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w== - dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - rtl-css-js@^1.14.0: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -13480,21 +13800,14 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.5.1, rxjs@^7.5.5: +rxjs@^7.5.1: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" -sade@^1.7.3, sade@^1.8.1: +sade@^1.7.3: version "1.8.1" resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== @@ -13521,11 +13834,6 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-json-utils@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" - integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== - safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -13619,11 +13927,29 @@ screenfull@^5.1.0: resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba" integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== -scrypt-js@3.0.1: +scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +secp256k1@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7" + integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -13636,6 +13962,11 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -13653,6 +13984,18 @@ semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +semver@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -13672,6 +14015,13 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -13719,6 +14069,11 @@ set-harmonic-interval@^1.0.1: resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -13773,11 +14128,26 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -13806,6 +14176,40 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +socket.io-client@^4.5.1: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.5.tgz#919be76916989758bdc20eec63f7ee0ae45c05b7" + integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -13815,6 +14219,21 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + sonic-boom@^2.2.1: version "2.8.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611" @@ -13841,7 +14260,7 @@ source-map-loader@^3.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-support@^0.5.6, source-map-support@~0.5.20: +source-map-support@^0.5.13, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -13864,7 +14283,7 @@ source-map@^0.5.0, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.7.3: +source-map@^0.7.3, source-map@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -13985,6 +14404,13 @@ stacktrace-js@^2.0.2: stack-generator "^2.0.5" stacktrace-gps "^3.0.4" +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + standard-as-callback@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" @@ -14047,6 +14473,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-argv@0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -14068,7 +14499,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14077,6 +14508,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -14118,7 +14558,7 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -14155,6 +14595,13 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -14175,6 +14622,18 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -14182,18 +14641,11 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -sturdy-websocket@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/sturdy-websocket/-/sturdy-websocket-0.1.12.tgz#84bb779f948b585a695f76961dc7d1c4a5e87629" - integrity sha512-PA7h8LdjaMoIlC5HAwLVzae4raGWgyroscV4oUpEiTtEFINcNa47/CKYT3e98o+FfsJgrclI2pYpaJrz0aaoew== - dependencies: - lodash.defaults "^4.2.0" - style-loader@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899" @@ -14232,16 +14684,18 @@ sucrase@^3.29.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - superstruct@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.3.tgz#de626a5b49c6641ff4d37da3c7598e7a87697046" integrity sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg== +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -14256,13 +14710,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-hyperlinks@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" @@ -14276,23 +14723,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svelte-i18n@^3.3.13: - version "3.6.0" - resolved "https://registry.yarnpkg.com/svelte-i18n/-/svelte-i18n-3.6.0.tgz#0f345d066662dd8f46efefc0e867fb05b71c9dbd" - integrity sha512-qvvcMqHVCXJ5pHoQR5uGzWAW5vS3qB9mBq+W6veLZ6jkrzZGOziR+wyOUJsc59BupMh+Ae30qjOndFrRU6v5jA== - dependencies: - cli-color "^2.0.3" - deepmerge "^4.2.2" - estree-walker "^2" - intl-messageformat "^9.13.0" - sade "^1.8.1" - tiny-glob "^0.2.9" - -svelte@^3.49.0: - version "3.58.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.58.0.tgz#d3e6f103efd6129e51c7d709225ad3b4c052b64e" - integrity sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A== - svg-parser@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" @@ -14440,11 +14870,6 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -14471,6 +14896,11 @@ thread-stream@^0.15.1: dependencies: real-require "^0.1.0" +three@^0.128.0: + version "0.128.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.128.0.tgz#884dacca6a330e45600a09ec5439283f50b76aa6" + integrity sha512-i0ap/E+OaSfzw7bD1TtYnPo3VEplkl70WX5fZqZnfZsE3k3aSFudqrrC9ldFZfYFkn1zwDmBcdGfiIm/hnbyZA== + throat@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" @@ -14486,7 +14916,7 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -"through@>=2.2.7 <3", through@^2.3.8: +through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -14496,21 +14926,12 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timers-ext@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - -tiny-glob@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" - integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: - globalyzer "0.1.0" - globrex "^0.1.2" + os-tmpdir "~1.0.2" tmp@~0.2.1: version "0.2.1" @@ -14642,7 +15063,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@1.14.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@1.14.1, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -14662,6 +15083,11 @@ tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + tss-react@^4.4.1: version "4.8.2" resolved "https://registry.yarnpkg.com/tss-react/-/tss-react-4.8.2.tgz#ea424965e8a6828ac02bc8c8f2a7a75bb87cf0ac" @@ -14685,11 +15111,21 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -14724,6 +15160,16 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -14732,16 +15178,6 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -14751,7 +15187,7 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: +typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -14763,7 +15199,7 @@ typescript@^5.1.6: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== -ua-parser-js@^1.0.33, ua-parser-js@^1.0.35: +ua-parser-js@^1.0.33, ua-parser-js@^1.0.37: version "1.0.37" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== @@ -14773,7 +15209,14 @@ ufo@^1.3.0, ufo@^1.3.1, ufo@^1.3.2: resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== -uint8arrays@^3.0.0, uint8arrays@^3.1.0: +uint8arrays@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.0.tgz#8186b8eafce68f28bd29bd29d683a311778901e2" + integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog== + dependencies: + multiformats "^9.4.2" + +uint8arrays@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== @@ -14800,6 +15243,13 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + unenv@^1.7.4: version "1.8.0" resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.8.0.tgz#0f860d5278405700bd95d47b23bc01f3a735d68c" @@ -14811,6 +15261,11 @@ unenv@^1.7.4: node-fetch-native "^1.4.1" pathe "^1.1.1" +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -14881,6 +15336,13 @@ unist-util-position@^4.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + unist-util-remove-position@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" @@ -14913,6 +15375,11 @@ unist-util-visit@^4.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -15012,6 +15479,11 @@ use-callback-ref@^1.3.0: dependencies: tslib "^2.0.0" +use-debounce@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-10.0.0.tgz#5091b18d6c16292605f588bae3c0d2cfae756ff2" + integrity sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A== + use-sidecar@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" @@ -15020,20 +15492,15 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" -use-sync-external-store@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.0.0.tgz#d98f4a9c2e73d0f958e7e2d2c2bfb5f618cbd8fd" - integrity sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw== - use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== +utf-8-validate@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" + integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== dependencies: node-gyp-build "^4.3.0" @@ -15078,6 +15545,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + uvu@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" @@ -15150,6 +15622,20 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +viem@2.9.31: + version "2.9.31" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.31.tgz#cfe8e1bb81d358c9117e5e1144d26a95d8aab3dd" + integrity sha512-8aJ8Dm/591Czwb/nRayo0z8Ls5KxqC4QYE33fmHwhx2tDUWC/hHcPZqjLRSTWFtAfi0aZKvP7BeB6UZ3ZkTRhQ== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + viem@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/viem/-/viem-1.4.1.tgz#490f39b3f371bf58910b1b338c237e19066805cf" @@ -15165,12 +15651,12 @@ viem@^1.0.0: isomorphic-ws "5.0.0" ws "8.12.0" -viem@^1.10.1: - version "1.16.6" - resolved "https://registry.yarnpkg.com/viem/-/viem-1.16.6.tgz#78118c9269506a59e2bc4deab13f1646e113d3fc" - integrity sha512-jcWcFQ+xzIfDwexwPJRvCuCRJKEkK9iHTStG7mpU5MmuSBpACs4nATBDyXNFtUiyYTFzLlVEwWkt68K0nCSImg== +viem@^1.1.4: + version "1.21.4" + resolved "https://registry.yarnpkg.com/viem/-/viem-1.21.4.tgz#883760e9222540a5a7e0339809202b45fe6a842d" + integrity sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ== dependencies: - "@adraffy/ens-normalize" "1.9.4" + "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0" "@noble/hashes" "1.3.2" "@scure/bip32" "1.3.2" @@ -15179,6 +15665,14 @@ viem@^1.10.1: isows "1.0.3" ws "8.13.0" +vue-template-compiler@^2.7.16: + version "2.7.16" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz#c81b2d47753264c77ac03b9966a46637482bb03b" + integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -15193,17 +15687,14 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wagmi@^1.4.12: - version "1.4.12" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-1.4.12.tgz#e5d31c6d7621ecd9e32eded6c7b1041201223127" - integrity sha512-QRxpjhdMlZmbYTfn9VQkQMKq+l3kwA1O7tF10vaykPrjbGX+IIlyn72ib9oqW9BfQO7n/Sf/mnVz1zbxRhGPWA== +wagmi@^2.9.2: + version "2.9.3" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.9.3.tgz#9ebd892f34a450d13c0c2d97128dab45b5672d91" + integrity sha512-pB2pKQy1h76/ozOnmIVfI1ydNeMuMjRgQ6L6vUAuJi3cx7rg3xKBdj2yur+MWCATWjj4J7fO291dCDhaPIF1NA== dependencies: - "@tanstack/query-sync-storage-persister" "^4.27.1" - "@tanstack/react-query" "^4.28.0" - "@tanstack/react-query-persist-client" "^4.28.0" - "@wagmi/core" "1.4.12" - abitype "0.8.7" - use-sync-external-store "^1.2.0" + "@wagmi/connectors" "5.0.2" + "@wagmi/core" "2.10.2" + use-sync-external-store "1.2.0" walker@^1.0.7: version "1.0.8" @@ -15237,6 +15728,11 @@ web-vitals@^2.1.4: resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== +"webextension-polyfill@>=0.10.0 <1.0", webextension-polyfill@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz#ccb28101c910ba8cf955f7e6a263e662d744dbb8" + integrity sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -15479,6 +15975,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -15653,6 +16156,11 @@ workbox-window@6.5.4: "@types/trusted-types" "^2.0.2" workbox-core "6.5.4" +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -15671,6 +16179,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -15686,17 +16203,12 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - ws@8.12.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== -ws@8.13.0, ws@^8.13.0, ws@^8.5.0: +ws@8.13.0, ws@^8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== @@ -15706,11 +16218,16 @@ ws@8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== -ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: +ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -15721,6 +16238,11 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + xtend@^4.0.1, xtend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -15746,11 +16268,21 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -15764,6 +16296,34 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^15.3.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -15781,18 +16341,18 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.5.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" yauzl@^2.10.0: version "2.10.0" @@ -15812,19 +16372,17 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zustand@^4.1.3: - version "4.3.7" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.7.tgz#501b1f0393a7f1d103332e45ab574be5747fedce" - integrity sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ== +zustand@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" + integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== dependencies: use-sync-external-store "1.2.0" -zustand@^4.3.1: - version "4.3.8" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4" - integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg== - dependencies: - use-sync-external-store "1.2.0" +zustand@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.1.tgz#2bdca5e4be172539558ce3974fe783174a48fdcf" + integrity sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w== zwitch@^2.0.0: version "2.0.4"