From e1742f590e27f916664e6bf0b49b0c4debc18f3d Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 27 Jun 2024 15:57:32 +0200 Subject: [PATCH 001/110] feat: add header --- package-lock.json | 446 +++++++++++------------- package.json | 3 +- src/app/playground/page.tsx | 2 + src/v2/components/Header.tsx | 9 + src/v2/components/Navigator.tsx | 168 +++++++++ src/v2/components/ui/NavigationMenu.tsx | 126 +++++++ 6 files changed, 502 insertions(+), 252 deletions(-) create mode 100644 src/v2/components/Header.tsx create mode 100644 src/v2/components/Navigator.tsx create mode 100644 src/v2/components/ui/NavigationMenu.tsx diff --git a/package-lock.json b/package-lock.json index d31257f565..6100561300 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "@nouns/assets": "^0.4.2", "@phosphor-icons/react": "^2.1.6", "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", @@ -3455,71 +3456,6 @@ "react": ">=18" } }, - "node_modules/@coinbase/waas-sdk-viem": { - "version": "2.1.1", - "resolved": "https://api.developer.coinbase.com/waas/consumer/1994648a1fa8a282f1c3ca917a0379f1f79fbb06/waas-sdk-viem/waas-sdk-viem-2.1.1.tgz", - "integrity": "sha512-u0PsOIXaMwDpNrIVb6uACy8SF97cDqPQdVamW2slnE+pm0LItkZxVlVulEV4MNrfWr7vxvyM2qzPhad9Lxg9cw==", - "license": "ISC", - "peerDependencies": { - "@coinbase/waas-sdk-web": "^2.0.5", - "viem": "~1.19.1" - } - }, - "node_modules/@coinbase/waas-sdk-web": { - "version": "2.1.0", - "resolved": "https://api.developer.coinbase.com/waas/consumer/1994648a1fa8a282f1c3ca917a0379f1f79fbb06/waas-sdk-web/waas-sdk-web-2.1.0.tgz", - "integrity": "sha512-nUlhf5MmzYT1SFLnaKRQO2tRIhhONokHak1l5R9+jmSYMgyhdGl514LarXXceCL6BShZGcna6S0EcIXuEST2wA==", - "bundleDependencies": [ - "tsifrpc", - "@coinbase/corekms" - ], - "license": "ISC", - "dependencies": { - "@bugsnag/js": "^7.22.3", - "@coinbase/corekms": "0.1.9", - "client-analytics": "0.0.8", - "tsifrpc": "../utils/tsifrpc" - }, - "optionalDependencies": { - "@coinbase/cbpay-js": "^1.10.0" - } - }, - "node_modules/@coinbase/waas-sdk-web/node_modules/@coinbase/cbpay-js": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@coinbase/cbpay-js/-/cbpay-js-1.10.0.tgz", - "integrity": "sha512-jQ4rqJFNbsCMZ74ATucAUv2IpkbPFXsY+6AVBvFVNKmG4rEgc10Fa87pw/idm6Tlrs7EERQRXEs21DvJpMzi8A==", - "optional": true, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "regenerator-runtime": "^0.13.9" - }, - "peerDependenciesMeta": { - "regenerator-runtime": { - "optional": true - } - } - }, - "node_modules/@coinbase/waas-sdk-web/node_modules/@coinbase/corekms": { - "version": "0.1.9", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/@coinbase/waas-sdk-web/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "optional": true, - "peer": true - }, - "node_modules/@coinbase/waas-sdk-web/node_modules/tsifrpc": { - "version": "1.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, "node_modules/@coinbase/wallet-sdk": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.3.tgz", @@ -6297,6 +6233,126 @@ "node": ">= 10" } }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz", + "integrity": "sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz", + "integrity": "sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz", + "integrity": "sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz", + "integrity": "sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz", + "integrity": "sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz", + "integrity": "sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz", + "integrity": "sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz", + "integrity": "sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@noble/curves": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", @@ -6725,6 +6781,42 @@ } } }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.0.tgz", + "integrity": "sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-portal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", @@ -6958,6 +7050,44 @@ } } }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@react-native-community/cli": { "version": "13.6.8", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.8.tgz", @@ -9696,11 +9826,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -9846,15 +9971,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, "node_modules/@types/react-transition-group": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", @@ -13637,14 +13753,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" - } - }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -13844,16 +13952,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/client-analytics": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/client-analytics/-/client-analytics-0.0.8.tgz", - "integrity": "sha512-bpatUip8gT8y9r4GkoaIf+0TvVo/3NsSqQ61erMgjVtIfAVnWAj0H6S/IjKxQc6E2Aebj5bX8ZBMueyVj0f6Rg==", - "dependencies": { - "@types/react-router": "^5.1.20", - "md5": "^2.3.0", - "perfume.js": "^9.2.0" - } - }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -14500,14 +14598,6 @@ } } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "engines": { - "node": "*" - } - }, "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", @@ -20709,16 +20799,6 @@ "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz", "integrity": "sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==" }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -23562,22 +23642,6 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, - "node_modules/perfume.js": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/perfume.js/-/perfume.js-9.4.0.tgz", - "integrity": "sha512-YYxGBYm2OcDx68GhzX/N3h4RrtViAz7Whgk7dA6j1bC9NxBGIG8c+rs+K3ql/dW4KReszN8ptAC1ghUGdWNsMQ==", - "dependencies": { - "web-vitals": "^3.5.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/perfume.js/node_modules/web-vitals": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==" - }, "node_modules/pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", @@ -29828,126 +29892,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz", - "integrity": "sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz", - "integrity": "sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz", - "integrity": "sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz", - "integrity": "sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz", - "integrity": "sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz", - "integrity": "sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz", - "integrity": "sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz", - "integrity": "sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } diff --git a/package.json b/package.json index 973998b513..41fa36762b 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,9 @@ "@lexical/utils": "^0.12.0", "@nouns/assets": "^0.4.2", "@phosphor-icons/react": "^2.1.6", - "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-navigation-menu": "^1.2.0", + "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@snyk/protect": "latest", diff --git a/src/app/playground/page.tsx b/src/app/playground/page.tsx index de815cda7d..a62ed104a2 100644 --- a/src/app/playground/page.tsx +++ b/src/app/playground/page.tsx @@ -4,6 +4,7 @@ import { Metadata } from "next" import { PropsWithChildren } from "react" import { ThemeToggle } from "../../v2/components/ThemeToggle" import { DialogExample } from "./_components/DialogExample" +import { Header } from "@/components/Header" export const metadata: Metadata = { title: "Playground", @@ -125,6 +126,7 @@ export default function Page() {
+
) diff --git a/src/v2/components/Header.tsx b/src/v2/components/Header.tsx new file mode 100644 index 0000000000..358dac4679 --- /dev/null +++ b/src/v2/components/Header.tsx @@ -0,0 +1,9 @@ +"use client" + +import { Navigator } from "./Navigator" + +export const Header = () => ( +
+ +
+) diff --git a/src/v2/components/Navigator.tsx b/src/v2/components/Navigator.tsx new file mode 100644 index 0000000000..8cf07ea409 --- /dev/null +++ b/src/v2/components/Navigator.tsx @@ -0,0 +1,168 @@ +"use client" + +import * as React from "react" + +import { cn } from "@/lib/utils" +import { + NavigationMenu, + NavigationMenuContent, + NavigationMenuItem, + NavigationMenuLink, + NavigationMenuList, + NavigationMenuTrigger, +} from "@/components/ui/NavigationMenu" +import { + Book, + CircleWavyCheck, + Code, + DiscordLogo, + House, + Info, + Package, + Palette, + Plus, + Shield, + UsersThree, + File, +} from "@phosphor-icons/react" +import XLogo from "static/icons/x.svg" +import GuildCastle from "components/explorer/AnimatedLogo" +import { buttonVariants } from "@/components/ui/Button" +import { ThemeToggle } from "./ThemeToggle" +import Link from "next/link" + +export function Navigator() { + return ( + + + + + + Guild + + +
+
    +
  • + Navigation +
  • + + + Explore guilds + + + + Create guild + + + + Guild Pins leaderboard + + + + Guide + + + + Case studies + + + + Privacy Policy + + + + Terms of Use + +
+
    +
  • + Other +
  • + + + Discord + + + + Twitter + + + + Code + + + + Guild SDK + + + + Team + + + + Brand kit + +
+
+
+ Theme: + +
+
+
+
+
+ ) +} + +const ListItem = React.forwardRef< + React.ElementRef<"a">, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( +
  • + + + {children} + + +
  • +)) diff --git a/src/v2/components/ui/NavigationMenu.tsx b/src/v2/components/ui/NavigationMenu.tsx new file mode 100644 index 0000000000..41f917e0f5 --- /dev/null +++ b/src/v2/components/ui/NavigationMenu.tsx @@ -0,0 +1,126 @@ +import * as React from "react" +import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" +import { cva } from "class-variance-authority" +import { CaretDown } from "@phosphor-icons/react" + +import { cn } from "@/lib/utils" + +const NavigationMenu = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + +)) +NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName + +const NavigationMenuList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName + +const NavigationMenuItem = NavigationMenuPrimitive.Item + +const navigationMenuTriggerStyle = cva( + "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50" +) + +const NavigationMenuTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children}{" "} + +)) +NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName + +const NavigationMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName + +const NavigationMenuLink = NavigationMenuPrimitive.Link + +const NavigationMenuViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
    + +
    +)) +NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName + +const NavigationMenuIndicator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +
    + +)) +NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName + +export { + navigationMenuTriggerStyle, + NavigationMenu, + NavigationMenuList, + NavigationMenuItem, + NavigationMenuContent, + NavigationMenuTrigger, + NavigationMenuLink, + NavigationMenuIndicator, + NavigationMenuViewport, +} From e39c633ca0faac0e37628c7e630b8dbc6bb778b1 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 27 Jun 2024 17:12:54 +0200 Subject: [PATCH 002/110] chore: configure navigator --- src/app/globals.css | 12 ++++++------ src/v2/components/Navigator.tsx | 26 +++++++++++++------------ src/v2/components/ui/Button.tsx | 1 - src/v2/components/ui/NavigationMenu.tsx | 2 +- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 896de6e8f2..b4606afb49 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -16,11 +16,11 @@ --primary: 239 84% 67%; --primary-foreground: 0 0% 100%; - --secondary: 220 14.3% 95.9%; - --secondary-foreground: 220.9 39.3% 11%; + --secondary: 0, 0%, 98%; + --secondary-foreground: var(--foreground); --muted: 0 0% 100%; - --muted-foreground: 240 4% 46%; + --muted-foreground: 0 0% 50%; --accent: 240 7% 90%; --accent-foreground: 240 4% 16%; @@ -49,11 +49,11 @@ --primary: 238.73 70% 63%; --primary-foreground: 0 0% 100%; - --secondary: 215 27.9% 16.9%; - --secondary-foreground: 210 20% 98%; + --secondary: 240 5% 22%; + --secondary-foreground: var(--foreground); --muted: 240 3% 13%; - --muted-foreground: 240 1% 42%; + --muted-foreground: 240 2% 62%; --accent: 240 2% 35%; --accent-foreground: 0 0% 92%; diff --git a/src/v2/components/Navigator.tsx b/src/v2/components/Navigator.tsx index 8cf07ea409..ba25f0cf81 100644 --- a/src/v2/components/Navigator.tsx +++ b/src/v2/components/Navigator.tsx @@ -9,7 +9,6 @@ import { NavigationMenuItem, NavigationMenuLink, NavigationMenuList, - NavigationMenuTrigger, } from "@/components/ui/NavigationMenu" import { Book, @@ -23,27 +22,30 @@ import { Plus, Shield, UsersThree, - File, + File, List } from "@phosphor-icons/react" import XLogo from "static/icons/x.svg" import GuildCastle from "components/explorer/AnimatedLogo" -import { buttonVariants } from "@/components/ui/Button" +import { Button, buttonVariants } from "@/components/ui/Button" import { ThemeToggle } from "./ThemeToggle" import Link from "next/link" export function Navigator() { + const [isOpen, setIsOpen] = React.useState(false); + return ( - + - - + + +
      -
    • +
    • Navigation
    • @@ -84,7 +86,7 @@ export function Navigator() {
      -
    • +
    • Other
    -
    +
    Theme:
    @@ -157,7 +159,7 @@ const ListItem = React.forwardRef< diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index 647972d8a3..c70ed8c556 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -19,7 +19,6 @@ const buttonVariants = cva( "bg-success text-success-foreground hover:bg-success/90 active:bg-success/70", outline: "border border-input border-2 active:bg-accent/70 hover:bg-accent/50 hover:text-accent-foreground", - secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", ghost: "active:bg-accent/70 hover:bg-accent/50 hover:text-accent-foreground", link: "text-primary underline-offset-4 hover:underline", }, diff --git a/src/v2/components/ui/NavigationMenu.tsx b/src/v2/components/ui/NavigationMenu.tsx index 41f917e0f5..5e48393f3a 100644 --- a/src/v2/components/ui/NavigationMenu.tsx +++ b/src/v2/components/ui/NavigationMenu.tsx @@ -41,7 +41,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName const NavigationMenuItem = NavigationMenuPrimitive.Item const navigationMenuTriggerStyle = cva( - "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50" + "group inline-flex h-10 w-max items-center justify-center rounded-2xl bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50" ) const NavigationMenuTrigger = React.forwardRef< From 06f2b6f94ffed9d0ed71cbe3e5a31f0521f1ba3d Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Thu, 27 Jun 2024 17:20:44 +0200 Subject: [PATCH 003/110] feat: `Providers` component --- src/app/layout.tsx | 16 ++++----------- src/v2/components/Providers.tsx | 32 +++++++++++++++++++++++++++++ src/v2/components/ThemeProvider.tsx | 9 -------- src/v2/components/ThemeToggle.tsx | 10 +++------ 4 files changed, 39 insertions(+), 28 deletions(-) create mode 100644 src/v2/components/Providers.tsx delete mode 100644 src/v2/components/ThemeProvider.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1f2c42be00..c4814eb013 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,8 +1,8 @@ +import Providers from "@/components/Providers" +import clsx from "clsx" +import { dystopian, inter } from "fonts" import type { Metadata } from "next" -import { ThemeProvider } from "@/components/ThemeProvider" -import { inter, dystopian } from "fonts" import "./globals.css" -import clsx from "clsx" interface RootLayoutProps { children: React.ReactNode @@ -19,15 +19,7 @@ export default function RootLayout({ children }: RootLayoutProps) { - - {children} - + {children} ) diff --git a/src/v2/components/Providers.tsx b/src/v2/components/Providers.tsx new file mode 100644 index 0000000000..d35d1c6b4a --- /dev/null +++ b/src/v2/components/Providers.tsx @@ -0,0 +1,32 @@ +"use client" + +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" +import { ThemeProvider } from "next-themes" +import { SWRConfig } from "swr" +import { fetcherForSWR } from "utils/fetcher" +import { WagmiProvider } from "wagmi" +import { wagmiConfig } from "wagmiConfig" + +const queryClient = new QueryClient() + +export default function Providers({ children }: { children: React.ReactNode }) { + return ( + + + + + {children} + + {/* */} + + + + + ) +} diff --git a/src/v2/components/ThemeProvider.tsx b/src/v2/components/ThemeProvider.tsx deleted file mode 100644 index ffac782ef8..0000000000 --- a/src/v2/components/ThemeProvider.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client" - -import * as React from "react" -import { ThemeProvider as NextThemesProvider } from "next-themes" -import type { ThemeProviderProps } from "next-themes/dist/types" - -export function ThemeProvider({ children, ...props }: ThemeProviderProps) { - return {children} -} diff --git a/src/v2/components/ThemeToggle.tsx b/src/v2/components/ThemeToggle.tsx index 23b9de1b0e..9abc2a6cef 100644 --- a/src/v2/components/ThemeToggle.tsx +++ b/src/v2/components/ThemeToggle.tsx @@ -1,17 +1,13 @@ "use client" import { ToggleGroup, ToggleGroupItem } from "@/components/ui/ToggleGroup" -import { Moon, Sun, Desktop } from "@phosphor-icons/react" +import { Desktop, Moon, Sun } from "@phosphor-icons/react" import { useTheme } from "next-themes" -import { useEffect, useState } from "react" +import { useIsClient } from "usehooks-ts" export function ThemeToggle() { const { setTheme, theme } = useTheme() - const [isClient, setIsClient] = useState(false) - - useEffect(() => { - setIsClient(true) - }, []) + const isClient = useIsClient() if (!isClient) { return From 2c179477a9b6448ef83d3c8e2cee3de310cb750e Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 27 Jun 2024 17:25:00 +0200 Subject: [PATCH 004/110] chore: disable navigator on blur --- src/v2/components/Navigator.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v2/components/Navigator.tsx b/src/v2/components/Navigator.tsx index ba25f0cf81..63f8f0c5b2 100644 --- a/src/v2/components/Navigator.tsx +++ b/src/v2/components/Navigator.tsx @@ -34,7 +34,7 @@ export function Navigator() { const [isOpen, setIsOpen] = React.useState(false); return ( - + setIsOpen(!!value)}> + )} + + {!isConnectedAndKeyPairReady ? ( - - +
    +

    {"New to Ethereum wallets? "} - - Learn more - - - + {/* TODO: custom link component with generalised styles */} + Learn more + +

    - +

    {"By continuing, you agree to our "} Privacy Policy {" and "} - + Terms & conditions - - +

    +
    ) : ( - - +
    +

    Signing the message doesn't cost any gas - - +

    +

    {"This site is protected by reCAPTCHA, so the Google "} - Privacy Policy - {" "} + {" "} {"and "} - Terms of Service - + {" apply"} - - +

    +
    )} - - - +
    + + + + ) } diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx index 641ce45565..92b84f2dbf 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx @@ -1,6 +1,6 @@ +import { GuildAvatar } from "@/components/GuildAvatar" +import { Button } from "@/components/ui/Button" import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import Button from "components/common/Button" -import GuildAvatar from "components/common/GuildAvatar" import shortenHex from "utils/shortenHex" const AccountButton = () => { @@ -9,15 +9,9 @@ const AccountButton = () => { if (!address) return null return ( - ) } diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx index 33d9a6242d..9e91947623 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx @@ -1,34 +1,34 @@ -import { ButtonProps, Center, Icon, Img } from "@chakra-ui/react" +import { Button } from "@/components/ui/Button" import { useUserPublic } from "components/[guild]/hooks/useUser" import useConnectorNameAndIcon from "components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon" -import Button from "components/common/Button" import { addressLinkParamsAtom } from "components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton" import { useAtomValue, useSetAtom } from "jotai" import { Wallet } from "phosphor-react" -import { useAccount, type Connector } from "wagmi" +import { Config, useAccount, type Connector } from "wagmi" +import { ConnectMutate } from "wagmi/query" +import { COINBASE_WALLET_SDK_ID } from "wagmiConfig" import { walletLinkHelperModalAtom } from "../../WalletLinkHelperModal" -import { COINBASE_WALLET_SDK_ID } from "../WalletSelectorModal" type Props = { - connector: Connector - pendingConnector: Connector - connect: (args) => void - error?: Error + connector?: Connector + pendingConnector?: Connector + connect: ConnectMutate + error: Error | null } -const connectorButtonProps: ButtonProps = { - w: "full", - size: "xl", - iconSpacing: 4, - justifyContent: "start", - mb: 2.5, - sx: { - "> div.chakra-button__spinner": { - boxSize: 6, - justifyContent: "center", - }, - }, -} +// const connectorButtonProps: ButtonProps = { +// w: "full", +// size: "xl", +// iconSpacing: 4, +// justifyContent: "start", +// mb: 2.5, +// sx: { +// "> div.chakra-button__spinner": { +// boxSize: 6, +// justifyContent: "center", +// }, +// }, +// } const ConnectorButton = ({ connector, @@ -47,40 +47,38 @@ const ConnectorButton = ({ return ( ) } -export { connectorButtonProps } export default ConnectorButton diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx index f3ac90f399..2849d85660 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx @@ -1,18 +1,18 @@ -import { Center, Img, useColorModeValue } from "@chakra-ui/react" +import { Button } from "@/components/ui/Button" import { useConnectors, useIsConnected } from "@fuels/react" import { usePostHogContext } from "components/_app/PostHogProvider" -import Button from "components/common/Button" import { useEffect, useState } from "react" -import { connectorButtonProps } from "./ConnectorButton" const FuelConnectorButtons = () => { const { connectors } = useConnectors() const { isConnected } = useIsConnected() - const fueletLogo = useColorModeValue( - "/walletLogos/fuelet-black.svg", - "/walletLogos/fuelet-white.svg" - ) + // const fueletLogo = useColorModeValue( + // "/walletLogos/fuelet-black.svg", + // "/walletLogos/fuelet-white.svg" + // ) + // TODO: color mode support + const fueletLogo = "/walletLogos/fuelet-black.svg" const connectorIcons: Record = { "Fuel Wallet": "/walletLogos/fuel.svg", @@ -35,6 +35,9 @@ const FuelConnectorButtons = () => { .map((connector) => ( ))} diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx index 51bf936235..c438a75f83 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx @@ -1,6 +1,6 @@ import { Center, Img, Tag, useDisclosure } from "@chakra-ui/react" import Button from "components/common/Button" -import { connectorButtonProps } from "../ConnectorButton" +// import { connectorButtonProps } from "../ConnectorButton" import ExportWaaSModal from "./components/ExportWaaSModal" const GoogleLoginButton = () => { @@ -23,13 +23,13 @@ const GoogleLoginButton = () => { } rightIcon={Deprecated} - {...connectorButtonProps} - sx={{ - ...connectorButtonProps.sx, - "> .chakra-button__icon:last-child": { - marginLeft: "auto!important", - }, - }} + // {...connectorButtonProps} + // sx={{ + // ...connectorButtonProps.sx, + // "> .chakra-button__icon:last-child": { + // marginLeft: "auto!important", + // }, + // }} > Google diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx index 6f9fc2e9c0..903b136217 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx @@ -28,7 +28,7 @@ import { Check, Copy, Wallet } from "phosphor-react" import { useState } from "react" import fetcher from "utils/fetcher" import { useConnect } from "wagmi" -import { connectorButtonProps } from "../../ConnectorButton" +// import { connectorButtonProps } from "../../ConnectorButton" import useDriveOAuth from "../hooks/useDriveOAuth" import { getDriveFileAppProperties, listWalletsOnDrive } from "../utils/googleDrive" @@ -266,7 +266,7 @@ const ExportWaasModal = ({ /> } - {...connectorButtonProps} + // {...connectorButtonProps} > Authenticate with Google diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts index bb71fc2616..efcd47efd8 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts @@ -1,7 +1,6 @@ import { atom } from "jotai" -import WalletSelectorModal, { COINBASE_WALLET_SDK_ID } from "./WalletSelectorModal" +import WalletSelectorModal from "./WalletSelectorModal" export const walletSelectorModalAtom = atom(false) export default WalletSelectorModal -export { COINBASE_WALLET_SDK_ID } diff --git a/src/components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts b/src/components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts index ea4003280b..493ab08863 100644 --- a/src/components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts +++ b/src/components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts @@ -1,7 +1,6 @@ -import { useColorMode } from "@chakra-ui/react" import { useIsConnected } from "@fuels/react" import { useAccount, type Connector } from "wagmi" -import { COINBASE_WALLET_SDK_ID } from "../components/WalletSelectorModal" +import { COINBASE_WALLET_SDK_ID } from "wagmiConfig" const CUSTOM_CONNECTOR_ICONS: Record< string, @@ -34,7 +33,8 @@ const useConnectorNameAndIcon = (connectorParam?: Connector) => { const connector = connectorParam ?? evmConnectorFromHook - const { colorMode } = useColorMode() + // TODO: find a solution for this + const colorMode = "light" const connectorIcon = CUSTOM_CONNECTOR_ICONS[connector?.id]?.[colorMode] ?? @@ -46,8 +46,8 @@ const useConnectorNameAndIcon = (connectorParam?: Connector) => { connector?.name === "Injected" ? "Injected Wallet" : connector?.id === "coinbaseWalletSDK" - ? "Smart Wallet" - : connector?.name || (isFuelConnected ? "Fuel" : ""), + ? "Smart Wallet" + : connector?.name || (isFuelConnected ? "Fuel" : ""), connectorIcon, } } diff --git a/src/fonts/Inter.ttf b/src/fonts/Inter.ttf deleted file mode 100644 index e72470871b8fc198da424b1e17ed729c202829cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 804612 zcmd?S4_stb-T42xcP?}9aA#q5cXnZShuzr~S5#D7QBiS4#T7SFa?wyXWfc__m3C3l z$VMZ>A|u_5jEs!OXd|U0BPB&eqaq_C8;ul=jC>{|!);v0x!?D>GwdJpv3$Ng-{0%^ zdbqsLIrscOpYu8Ao_p_^8PP;!F@_;Ur6UGc#0%gq z$F?qQxc-vQK6*y6c)rjjdfwVgiT~pZR{l*g?i&$r=lc4Kx6~c-#Fh=j?;!qB^?0m& zW7(seH*lU`e`Qni+fP(Zh@8?Ta==d;uD)oC?<3w~kt^#tAHQ--b7Q7o^Af+3_~EOz zTzT=SxmT=L!l3wMNh^esc4QP z+1TRyn`{@qG>WOt_WH|Eu|zU^->wnKi~N0RZZ35BJK~7%b=SvZ{O-pmcYXeX?9w-6 zh3#fC`TD~vl;d}2RXzLnsYFZYa=$wDik{BHFb_ov8B}Yn_bx(ym9jn0%dm%YT{1lQ z>S9cZ?ktk8JDj;SJaf|rH_5Ps9Vb<{%wD~hpsx{5_Lj23v`E$7BE3jZRF(2YzwXld zCM{cJTfmFa)aC=x8u*BwovMn<+>Nk=x+BCtq`|cH!Vl? zqdv4dY?(H<+r2_ZZt3)Sd&ODh3Gen_?P+!0l%nN2J8^qRp=&v~#63^t5TG48?N}s! z)dp2FRkE8}v~1O$bZnK7KP^E0Q33Zvv_&bmilZ&Yty;sM7R12q`Y+*JwTwS)Y0B;T zQx{iTm49x^?fNgnty-)6m#5sWKfUg@T=|DmZr49AEh*){GUaytSJ93zp8RRyl-u=R zJ>Ne3*QDIapTBkb`ASX(<5)VpfwWtbOs_ZX)+H+=o_2fW(2Sp^-G(gB=uf*d}gE97wxGVUA@$E zZpvTNB;;A2cI$GiCta52kq!DIX@Bahr}NY@WRZS*+TSYy{pPgW#6Mk@W=Wx5p7!@i zz8+4yGi9CjTH0;Pq1tfT?U#@?pZ@|W&|1>|S+Y_~%b79b*Un7)2P9LgNV^w`rIn@K zi)5*GP};p%g6NRjN9foZnM=EuNT$4+b}yA&c_!`7+0$R>m|vbs`!B=&P};p*mP>cq zy@ENnBkc~!O4*ur=P}|hPrFw#x~tRfRg9dI((bT?sZpwKtEo?J+Pwys5UWA9$VGAm zu}+gF+zoOW=X?B5k!Jk25^|DUO=#UaV*X?JyT_aN-6R*wm6S1mzHhnj4E-Rn>xg{~ zY4(k|cgWr~uO#-RQcs=tjlai#PmTBZ?Hl*qVpNmoWz3oT#+>)vu=k>U@5qb^rH@JB>k%LO#NJtZP zQTbdfXK~($y_L|5$YmSuFgfg-j|#s`E|C+-smYCf6>*hIm8n9n^|mXl%|wYZWRE16&8w(2s{sS@TTsamA8VVf(*ZOATF{~O#os~!m>J0)q= zvTdBHnkiX_@l&ak?eo(PE_us?I7#YV=-AETsvmmr}J? zeVo!86?YS3UG>kNI_}9?jfsm$o64b(SZ8ylT01Y-!>OSnyjRWkEqA^)TaaiZ);u6(Y+3{#%!%~XrFx$>Nk zf0`@Xl%&o=LaJ7&p5HqpC1+Ll)U2rTQln?9JBO-XQCc%!gFPt^p&l2zI;v*et^Xj^ zBdBi?ay>?lOKZy^oNtjM@hg&}NLz#q_v9CTM}B)kjwSC6$YLES){*+ycgbhpy6j1N zG7@QIeo|UFKZ~aFDWY9U6P5n#i653K;$F>F=wh@+Y37N@SKkS-L^VLu&f1+^r%KDG(ZqH(%d8W@PB`__s9d;Pq}pk961Z-ZTE|_}I;}FU zOEQs6IGxhshz!Xk&H#Bu++3n0BR(l6r6`$@7TMv%IAwk8#8`EPvB^i}skx@>-- z6}mX3$ycI5Y>wcRrdo7RXq4D0zLJzG-6PM+UCu$hHS)aN=d9gvw)ARor{?kXve1pU zN2X2E=``h9$!6)4xuBKYA^ln~YufQ^+hsPMi{0t8BrJz@q2@Q@*sYR?TTY?YCVh#7 zQ>4{O!Z4gNtxOZnm0g2fu9Y~_(nA02a;}YMISukMcBa!LGj4t@GKpg{%?X{4)EKI2>)>k7(}bg1sO&7h9P_C$hPmqcgWkT&V<3QXgf+ilFrfR^7K zoRUG!P-hX%>NVnISKBuml893~fVEwdL2p7@wcH{9th8&!kjlkr88uX9J<4j8u4vpZ zF{ddSpO&~Jq6ncy`lb>|itV1VEHbO#IT@1<+HEAbeO3*i<7ouS>eOmgCCH^-;!PHo z=5O}LokmUS199@1t0AmK60W6HW05G8!MwKLEB)ISO*{EoOS`3#OtvP}?X2qHl$bnp zUHwR@3^Fe33zasJ8K`Y>dd&3E8-e=5&Wvb7b&DX3x%dlj$FIZgS zg!^&{E$_=ME!8Uf^DWf8zk(XJ4>VWOA%mNBLzAJoL;{nhYyP1Y3v;;IAJcM&YcQ?h zS`?~oxPCS)iQ#&~(5jUwiIFNJk(?O0r1UP$Khk2&YPF;JMH5>6XhkgM)QxT?etfh} z#T-?sjM1i@aV<33WX)-tm0PApn`0qKj#O+J*ZWUTjW+VZp9P00|`U3#)Fx0=^Zb@>>jT#>eT9*m$^McO8Jir|gOZq3lFXm1B-Qj}bu6s;C#xAIeUr76I5ss%J&mcNcwF1; znz>Wu$R|8i&Qy>;RS}p%LpSQXq<5;(NH{mXyg~KCbjYC9(}fJny6IvhGdW!{7uJH) z^|6@5U)f1t-}uUUYCba)oD0g1nF8dd&lI2`n8~EmGE;~&1e4yxOv=PeadN^5&Q$4M z>6@uiQdOpO#QF}>H6s=t!zUKTClM=9eH1G|s@2M!^v4bjK7)S|c~-}Y74jIrVd4>Xw+R?=qYg)1ad@iXw_3?nx z(s)p5X*_6HS}-2AVw%L86G`pfT~B-0Nh~otm#YO6vq&SD@Xp56M1+)ri6YgCgwhR5 z59o1u)_B_gjFx2>^sjDIAPvK4q%Hm4V0=!qlqr+mVr$N6uoC21ZB;OwtE|dQT4Ytx zigv3e6jbI)+T~Bg{aS%PK~G6mV(n{AZlKBtIQhYCr5i_9Yl=H!~egv7L(v3+y*Z~;lwQ-;%0y(h$-GPx9OZcR9w zwP3`cmg<7&UgnZB8gr9Vp@lU=U20{A-t6Rap-x?H=I84hl6saTl1Z=Z(v?d`Yei3Z zd8DYO+w_%(=>e(E?lipe`cB<&8h06)&emPJ<=mLCbm2+t-U7XOV{4t!TG4IH_6>DS z&-NJ|31eV$L^lSTBhj+K=JvUPp{6!tZn&l0KRYrqQd&AvP*55jDT|d3k8B<(?HQ>H zmUfLab@}I>Ix}JzW3}!6*jQbsKQebbquVR4sL5|dNq1J>A7#h@`ZUDD%^P1kf- zyI#p}^TuZiZcZj&-9?>av6+JQSYafg#|lxISW(C9Y^*dG9EmmbkB`rWP{-K{iro3~ zy3CdF01b?XdlS**qR6^MMrQxSxHleI`+bT#RzBS|HB(hp)!#2i?3TEae4@R|klx-#TmuElsIVk4SiqbzSjQwhRA$JI;TppU zj|IKV@a0T7<0YgRub>0RE77a*dP{mII5j5JY1FSfEzuIMOhhaF%*2(JR)|Y>L~EH^ zqDs3a!(Jxd0`z~fh$5%vnD?d{NjqJjJ8PzE$ZsaBGlvyZPz*g!%nbyjcP>nkuCenK zPU9scOT5YzBoQR7RZXbXO!oe1ugv)?mP&76A|T0trE3!K6FE>ul;AY3vRsYRPvbL~bKUrFXQ7)09z7 zPNU5PC_^7F!!=HnWVD1RljTXR21EL%8sl2^^bA#;F4m>@m6F$(uwz7y)ndF>5Z7vy zapvp@$!594(fEYym@C&cT^VAv;b+mZ8jFi024(oCb?t2bbW)O`sIJw7qGXjHW~k>E zCbY8)4E3B_O?K{dI%I(Lo(wa8aP;;_wFMVW$IE3DR!vvuW=b-#hUP2l1y?_VbIWBsT@+1BolQqlJF)wUVpu+Ib7<#l2EI1 zcVX66)!g4*SKHO!T-6pG2?nFh1#PjqU{|a;*cQ7nc(c0apu^qTh|yNkW(+lNpBt`k zH%1y;6QdQ8#OUUBWAw(>_;^*s7_W~Q(W*!yTGbz&tQ?F^m9{2cW~!L3ju<9b==$rCKyW&e;Cbqv+&!bU1y zWnBs9QT~;7E5A`<;GZ}>=-X&)Rrk#WVjMOL6=W#W^m>+UdymyvKUI8!WXI; zjD=7N6x9x;b*UcM9^nEUk+%Le zX&-8pkytB}K&z_>X`Q-RPu^@KT6du(vkC5?=D3MSSaJ8Q1v#KkPE(1@m1tb!Qx_li zDwpIg;4>;%-Q>Bef<&v%HDk9A9TbhRSV^RZkh;G0GIj=4@=!V%?tvRyhiW53O|8S5 zBO^7D(W=N;MP$4@G7*eS6h)$?k;(kXBxYS?syH%L89^sz3L-P5k(ug9EF78BBXhZt zIUEHMR7BS!p=iV%Gpaz5XM5%O9V|Sg_iS5M(ee6cnxY-i zSTqca;w9g1?pO!TUF(XgK0W5?eM5|i#xm{H}g13xwJ@IM`w5c z;Lz~M&$t(fPEJk#VJ0^Fx4HPPgppy{{y=a^?ut-exS+78tfI22wy_y?Qz@l88Y?KP zA;*kigs|tYOv?70;7Wz=Z3;2U(*C6XHXKKe$IEvx@7I`eyh#5f=BM;8V}3>d3g+GV5azJ{IOd4{ zB<4@`pJD!7{|)Bzo|8oLoZ>kRv(ocX%qGt@nAdx5!EEykU_R*i0p<@qPhX{Z?sjD?s%1N}0>#%j#{ zjQubVFv>7bGN_4BZk&R7szJMqjmC#CHyOPCHX4kNW8P%6VzwEy&iJZ9-HbuwAp6R^=v))^e zd4=~1%&WXtVP5BL7LWIO@AbHE@ba3^d$aeGnD=<^70t9v@-*|!e9V*0&6pRM7hrzE z{3Pb5%}-P zTQnX(u(r2s%f`LHLP}Q93Sus`mSW~uIfO2=mg5dvw8+}eqGzoGt%EQRu@1vL!eW7G zl~^U1Cs|z5tPR$wm>;k{fO&>>205H(ZN@y`Iv<}4tXkZcSV+~n+(Mq#R%n-GI-C*%5+4_X_3EVeZH{02ot-{C&$>?`)MwZwO{?|9rN_$b}?G2h2<-{hlr ze0TWnz`VLrLxeu!dkpuO@8`Im@jZ+AobPv-Q$BL`&G=?8U-Kbh-(OQ3In>N8 zi`8>VwF*i7<@jE=@5vDR3;$mn=CP?mFHIkX_NQIf#^qk7o85b@p3S})bcIR}u&(=@psL(5xTgu$)I7UC#zD+-7pW_sL zpTk_IpJG;J>-qsqou>qsHqu)X5|G}=y^+)NuHIrD9=c~0FT$XaZKhs<`f8-oSF2S4=a>{Z}$vG*LjSM*(@Hu%;e&%t^ARG$} z``8>7dO1bD%zr#`7Te{aMf&1*KNe)z+w`n`53i9v-{ke_o8I5y_01o8L3#{+#oqh4 z%ieSJ+ZWmW|8RWK?$6V~mnV5zo}t3?vh!@a-~7lvhtECp>3RRAqf&Q|oMrzvhaPf| z<5IS{)m-m4%qy|?IdXDya`hEvR!)vDl;=@rsUv$yaB=pMyiEJsoR@N}c1`7a--lV| zGtH}&ndjA)nEUHX_C3sM_c+VkVy?+vjQezRP1-LNk}@wg-D5>Y%HGHH?{k)p>H3wL z7u(D1<@4cotKDhpcITeMJjYyYp0iTyFWOt|OY{7kpJSh;O!o+_)Xk6?B5b2;*D6yT z%oK;Zhncpwm|KFm!TqwAGO}^M<0#e-O&uX~-t~U$bfFadUa5Rx`@VqqR_H4NygUm? zPG;VI_V>*r^78FR^YS@z?91$?v|F9;KFo9f%i~1zL^BKC

    4*9^KT7^n>*M>|wJB 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%0DCo0&`A-%p#lSZ_a zf;ND!IKnsFen zb;%?G^m)OR3rhH4?HBqS>zXm$PTa4b|r{!-6 z>ZJWfn%wO#W%Y=t`PQr&-wP;n8Odb=^H`QJRD~p`xRzbY6abKIV&}0;$~hcAt}^ z=tn4ufivu____y&!h_6Yl&QlA!F=_tM5B!fiX%;zXfzS|A@^d1AP;ScT7Fv~LP_0C zYh!A-q&cecplDM-ZRo`t@cT*AG_43^y-8@A&MqEpM+eEG5fAhPyTa4tNxhk^lOwF* zz46)rX4AAWQlF{z9*W@P`=M95q#^O`(lrvFz^j(*6dAkR4u@yoaY>2oC}V>-wWhnXb^G?} zD#R&pKY{he<(}Hwf&0i+g1W@GzAkM?;20fV=ZF7rjb25O*BS1iew?{?BD8gxWP^u* zQX(8up>fc}PIe4BvvNAae(u&3ji)ignrC-7t-e!dA~<%2c3X;ev2*|Nfz# z9s_=sYI$hq3TVB2FXaVx(2vh#Z=I}R*7_^X&gF+W6kT}rdTbFM5bP~WRaK{xzxi6d zbFn#4WH`f#v5hiY9ySO0S|-)BiI2vuzPq8$G~q5KHimqwXcT{)#bRSP@N~e7;#2hF zYZY{G71p#4Yf9%gnpJ}`yX^L^l9GXK75a_FTyM1Bv$L;n@U_Ekw|jKwka+^?X3N?t z_LOEJnQ&aB&fE|VZ|LaQP*;H%OwP2Kma(>a)21*Ytu|1K5w7n^9g&r^y97L10n<9w z!~B|M$Bvqs6TxRJOi|H^$cqFXr)utvmfY--(PLt9Ln;<8ibO=&N>bZD2nK_2PRaQC z&Mv6!h@a44Ox!vdi~U&fR;>8fu;SkU7JnUBY%BhpW3cy^fN#0}?{M0EH@CIx;BY7Y zf9sP2M^8Vmw2T;wQ~R%hu_cJ_DF1ZCmWj`~AMShs<^2AStirISvI|xi_^O_ANkQSM zM_=#mXjauH2KPiDF^}%)@9)0DICFE3_t}A=%=4?NzWSx&g;}&!vG}onu+&Q>H+-4( z0DTyXBg5!E$m#}Gi)e)pz+xW4;~!%FjGBshe|fZnk{$kly5zgEosdEe2`eWj*m!*!pZH?P>vAah;cT8)Qw zBc160{2+Aw$$C@K;jTwpFsh$e?&|pSM_&1ZCsiNYyb_sJJNWe|Yn-+DyER{4U9tT9 zW%D9~-7t~x!%ybk(={;A^F&Ka%Wq#999A4ochOawR$(sx&5uGEU@ssBNypcsLY_#3nM}M$pIMupABsKRkdM>r##bBP9xhUXY1uVGfJP z`jjLBRYnGzM*ZOM6&%v$5WdV*32J)5 zNOZ!?s>;c_!lYazq_n9S&|aQLA>g=8x_?r2W_XiQV-QkX3GL-PqZNVzxIRH1kaR!J zWG#kz;~IsdQ)n?IQ?wXkoT<8qslo7;gPoG`jN&y?0pr+r_^t>?_+CFZq;bchd>zyw0Fw^A2GEcbL6U}nWl>M@T-=7ny$(U{75IGgC6lq zyk+|h4JZTcGr)&Tos^)Xp|M{>GrxEV8S#H`=dW<*S8(rnz?$=LXKq93@`CZe-yVf( z^K?hg?H>JyXW;A4Ul^KQ>hY-FpT9Vi{Tb};*()!{oY!2BZwn6&K7VgLI?(12jVM_Q zi@)^Ms;cudhX$VY8hmN~9o_x?dye9-kv)S?sA_XZ_nY=*1((oPqlGT%duREOG?UTs zMAt|GWX~P!F)*1&vCMT~H+Qm^*ijb6&odd9I5S?kuZaRYpI}=vzi2<)_f*GIU?(>! z_l0}kZYf7D0}cYSH12m@RL1UNuM#R+RQ1UZyq1st+;JE9j@94tXxHJQn^q&HN^qqE z;85UGdEat@6)=18ym_C$ZbQvCR%iA7d?n865)AGf{aRlo#;d{>Vjl4DC-(EXKdJuo z>GSiHkKgI*c(~=^-~4&^?iWmsWxwxF?~KkbDqUVtx%Q^bt1zoyBSDm|Hg-4Qraen^ z?>i^MhGQObv*huyNa%y$2O$JhjK`t>>*Hf1AMFp1jE>2fR{OjK3l_|^!b9||W&i#| z6W*fOk;w4=Q25|s-InJ*ds*RGOWp1{s1y&#gI#4g@*EDk936fSjOy)x?^%_wYb#)W zJ78W3m{$Vks{nJdx?Eu2{aBU$9aJ)279WWpr9&m?r7s49uhBPJp4!!XFWH6HS?{J( zHjchirvF6G%jxP`6zl5QMTb?vP<5ULslG$H$>q&m_{EABUfFwOEO(*H<(jLI@%qMD zs;a&adi$fED20oNBLs{x?^jymXI zP0|IPasc2S+_CA4UTGO@i9Xv;*3{J%ot5q0xB?4H;-(v;Xw_i++!gRw%b{W7~SOZp?q@H;?`fM^iagLRVf1WsW z>HitlYON?MoEYl9*N{dIZ$o<<0RE?;Lpk}2+-`TpO5o(L4I%bRc~hP0drB=@- zQbta0-&+Ms{8#dNlOW;rMu5$p+j<^A@;V3l}Y3fO5Q2rgf_lpMaIzi{x6S zdzp?Dj@wi@c636^)+eG7MULx=Rnbn>6~#^c<|*SN2XWR%gbfb8Gc>e68uQn~(5_|Z z5>QC;B1Z(z0iJCURDY^lVhh~jG(WR?W`@F@6;c6$5;sdF9az9-{$u=s^^oy!r_{C? z;>5*&DgX~Mp+e!4RNUL)yB%&rQE(Jr2Q-{(33o5Pa=as+Xv&&2&Y#x-&p)2%CMzzu zC^m)$v8IYdf2z1m*Wb9q|sm zm^E(^)w&5$RuaPC`W1+{0mj`GFz)^aM%|shZ7ad;sc%1hX6NQO^PLM8BrZOr9&c zs`cyjwbt!V4CR$15MJu~HI+MDM^VV*A9gd70OmN7Pmyry9X*EQ{Z960OrzUceUbD^ zTU(Mo*v4{j0Wcx2@=<8nW-P9t7p8s%Ja7#RWOQ*m7*g#nz^0%M`}4`PbSo$rNz;+= z2f>IPhn0+vMv~NZE2eaZsyJOs+-}V(O~kDfA7IcM|D#xy0<1~_R)un3=~MtZ6F3X{ zFBXNrqLq($^eYlX?>Fb1de6pC!3x%nvTK6;A!x;PD)qHQZu;6OL%&P4#APMH3hweH z$7W=6WuRdOaMPp$p`mbV_~vvC@_*^_g|Dl0OFE=@%IS- zoo)1;&PN`3r1PCo-~C>zWU-~F1+$`MGmST&n{-qK~umMxuU z_uYvC{mkUfS7XMtm@(OLmtn?a$7NB<)&GiB8?LN8LyjJE0bs1xWVic#7G|CL`^*7 z8TJ~H&v6#;S6OhB<)2<)vskRtuB9eN$7S-h+@BSRgg*=f!r?=a8P<1u>iU`-*tAU& z?y0gHcmuwTq2fcFJ%ZS?)P0g^8BXr5!lF%&Xv1T_CbdbGccP!=ybY>o5uTwZw4zr+ z(xuvIiP!TTOMAYVLAb7$#~_e2;Ua|#7m^dx&&nZ27?^%msj|hC$Pg((q9MqZ_)cSt zTqSbzCl}~T;Q(C32rogLqv6{pHIbK~$O(tPuDh7+bc8I<} zuYs9+oo;PeAN6WrgP%AwPX;&E$6VcV%=Ah~^JT!rg}}w7z{T0Uy^69HC+f94KM-}y zbvg|d#kTdOf#JfnYuR5li(}(P$IMdOQd=91t}u@}%KYKwrS9m^&`<>xgsn}R5ii#>uM7#N=MR7QkX~ps{EwQ1Y*bH*`o>V!!5G&)t z%FvneCY7SBjJ%^2wgULUR7?bkgtV=|hNWR8$N)KtdQhsCTIKdA^GL9Pl}SL-2H1_H z&Q3mZY%uUY-|Z@@?KI%MsHnl%e-h56!ckyq2k&ExK=U?wqzHKzn^2Q7iQk&KD$%px zChKW*5-NJ4nULaytwNT39=(;K)l#&hdP{WXk(BR5#-H5Vh4Pte3K@t%fpsLAbH_yRS@IE-m*awMv^{7NaBSOH_}v9qpv; z_$ZUMN!w5|BtM?-XV}kCDVpx?^iLJPr{l3y-@RUxrqMF{`yq$?Y5=1Yv=8Fhe;@< z@`g0I552k8(4NXr#A-X&pAfuBk{_H*K#M9VOqQu$V~T6irkL!}M zMYbM`172u!#d(?N?`-sU4zS}?w4H@jodxWm7_J@dC^SR?hE=kgu)Q)>t4eMc>9+FBB@L8ot=zmg;#TIm7sB4KR@OVGpjc+B=sI25DkXfXvcDt$; z5rN!op%dA>7MsgutG^q^GdO}?3tY>NdT~Nl>Wa{M65P!dLH$v5BY;kLFXogAf%NrA zg+LL8?8G!Er$a~*5+|l4Nu@J^X|ygJ)7+v{PG?4sCa##2DOxn7;0nrmVW9lQ`=D7_ zQ)ro5AiAkm^CL)ht>zamF`qMV@0qw4HI+GxXzz@`e1N9AqkxJ8Vgn>2E+4e3q0nBx z=3y%R_*ifiRGTK&pbsHHu0SflIb0ZgKJMDQ8NH#xlwRr+R9RZeKP>=@-G}WyJm)bH z8*_&yIS?c>gnzy}#E3i?(Zv`M)h}EOn7C*}1La_kKh?iuSvGh7V`OCAB;N^sKt>pO z=T3}n9v>YBX8Ce%BwhjY%7ZYg;|N(X*w~lARVcmqCkQ&0rSC~CFuPtXT_SlX%1=g- zB7D&_>*mevdssBG0=0q8(zA4#wP~!)n8o?$SHkM~GIzrD!yNE?#1giMIr(A6K=r`} z$JodR!|dq3JrR3O-lE*Gv0R_eHa4N-v}N65->NB2=bnRcO&J{A)fYk0PsFB&$0VOL zJ}lzr2-YTrn)s+9Ly1-&d}uvi;3P_>VN}{qPYRlCwxzV;y8siD*Q2j>SZ9izE5$mO z(mGFq{4A$4|3aMMc47VjoR@QeilN>j*`Z?-k>^PC5c%~qbEfU#q z39RUsY*+3 zK7YtMF-9>D3L85zVV#J{R^xkGf9Vw?X42VFw+c8SB=%-dp&@d(3Jz{Q1yhpPWiv4a zDk2(AgI%URk!;f^+6W2PWOhd!NYF5i(!}F*F1Zn-guY^SMMD!@GLfw~GlwnFH< zrtQz6Y{Mk!q^z>~_-D94-!ugxBW zP8|Om=21vIHim`;b_C2IjZNX%cSA8eg2ca|33DxG;L{i387B3m@#%jB#hc^iF_DgZ zjC&O04nlBBT^KMwVTLbS0P`lnWUL*Hc{0ApcET1qLMH5q_hIFLEmRmE>rKl}*dme^ z6Dvp5n6ABGvLw+2|LCN7C$*QQZeh(Qjl>SQL>dVWM}aLL|Ck#Pmr4-rTOqafqKGN{ zcWfgf6zCXeeUkngW^#J3Cg(G`E)|HzXeTvQ8MnA$xB@q)pJ%%muiYGP5lwL?z3obw z=hPlUi5?LWPlGL{HvRPWs@dZgG5B(DqB8(x@_5Vxlr5yU!|@`Gb(ibkrz<-zFE4vy zG#ag8w?UC>*5Gx5@`ua%)Slwv{aLfU90z=;z+6ssY^6FWa!Wa~(7}i^^Yc%2&58^R zK=oA#RCu(;)Dq z{N6Xqttk27efthZt=2JJLL^l<-*+D@4%tD3Ld{hWragwD`_2L1eH;%cmwU3+$&1w? zTONS~%m>kGZA_&@^tkOgd5&HN+D_r?XzRy9^q6d&_i_pDtif8AVl4}>mJ}nN``Vu2 zkN3U(kAYaM*5UB`SD<3%=dkIzF}vZ3u1A_08tz4qtk%F9g+G*NXoGzFeOp%|Hlmte zUxVi>8pm#I2fHKl`pZ|Gzew4+6FR*V2wcvk)mrHcxL*E(XxpctnzbXg0fYgq_*uT# z4XmyVeHLo0)+?AoJO7xHC&?K49B5x zC9XucaDl!=cljP#XwSA~WM*b%WBEBmLcx8(kA{bbL$<6O-(4~&qY+LM$v4}9K*m@o zfBq?_p5}I=SaUrN4#xVZSg|&&*czF$Oi z=X>2fAAhg|C{R>Xod5Bj{#_RQZSm*7R^xe9!*8F);RCZ3Wnv`s`(L#G@6K1>IuNe7 zZUusQ=(<09eTnS|ymWhB&#cjub?eT}f;j}`nP)weUAOUjH{bNFy6R7{=>K5xec8{^mAQZFT6bLz6J-0@vOY@E3k<|z#RGkP74 zDUJm`FCr3UJx<{#{6W%oP^E;JMSqennikxI_A9pmb_JasR7{`=^!flPxULx^5{XY~na*)6MNGNO|Y>1Ti||E;eAXnMXjCs9#VqoPPzUJ`v-_|4U}>{15hKdwctvY|)xEYZfh^ zhq(QD%da-_*5s=}2LBpPe+-ifg%|yEBH$`03eP}}z0CdwW#U!-^Ac2vXZY`*$M651 z{`*v!(Kekq=Gb!NoayDrjE0+Z`O-R#8Rxhn=Tp;(oEc3%Gm0W_%4Db7f+lO1oKDZ| z1_u^gqZy~!hCuH)UPooy>8--x6{)f+NwZENt6CDwG(oYc_a}E3By1oHiKF4!oU3rg zPwc_m3DFqM{U4W6*pr}@7$90gaPVG|o(i)svz3se1EMcC^(9_{-_C3?@_=WW-raz4 zt}h>6n#E{FuK9SkG$c6RMdD0hE|Q4Z@?Zs;pSi0~mEO>QTZq}f*N!8G#Avy2nI^g< zeTLVI87`kZ!x=|t>oy|or8QOH@G1%pU~t6Jx%{OO_JY&C2Tpq%VDKGq+D+iJ7k@%s zx96k6s;a8Ok9ydH6$mbb>ju~LxexaIuC1+YN6+i<&hEq%{uNv{!|6QoKdq>$cp2>? za9!r`xBkx&XIEES>w|v3|Cg=5?)rbKGcWoNS0PdXJf(#$hm6_=vcsige!7dIy1xJj z{cE`F!bs#`aA@E!-QC@P85jy4jJTH^9_qb+`_Fra4ln*!DBIWY%~>aG=Q|;B!-fSt zjPE<~I~=URx^ev#|9hK9u?6wD6aVi{<+v}_ADg{?c6#<28$Uc8+8=m#XlQScD)b^v zC=@yn3Vj&*_~S_`{G(Lp15Okj+IRhNdFyAUyKyCR%Xq+jKPGs^s+5wyxU7LE7$vp(0 zTW9c&yj0$iqRmcyey`vguE~4@YYDRkV_(I1DnR>R1?`{H*ZI)4ZQEWM+u!=~bNI6D zJ!RrErQ6!yWwHJ@?Lhc#+nU<`{!V!RAMv+G5MJ?Z{oicr$i?_eF41-@X32G4dc)e! z6`gy=Tu0YKD~z4$x3ahOMYBLCi_RHq)s*eqUp*4zPWV~ZjW##lb@~@K^GfW5aZ(4az3jKjzZJNZ-y4Yw{M72%k%(osJx>Ym4IbP#6bhqQ2bn6`rEjb$ zgH@u1t?^oxtv+KwQ=(CqGg3x#nf2I+z3!UJSFfljzhLgrV<^z#cEUa@cXGRtG?d>w$5bfn2njE}`)IZF!)9Cp{j*&0ga=O|I%+>8ts2n@%VBNu_b zc6*Kz3%`%-3)(wNGIrmfH|%}4%eu~q0OzN1EGFAi#w0A(0DQj&3W0Z3A>QZunX-1 z`TUgUU-!y4%u{@`yOkxZ<-faHc3E?Q8aPo9Cr*wbRANI``{A$t=jP3uJ%cTjy07g&EIi*8{9SuE@LKna zD7b>S^6fA+Noy*+S%FvjLjC3H5WJGCavPV#upN)U{KaQ9)mka?D0_f}kQZ0i>O=<9__B;s@~ ztE#R2W@UjRI=G{y<)OCcd%N0@xHpY~i88pv24yUJj$xy!t*zxYsuhgesF-Tqcx_cj z$0N7l3BDH})DZa|9n-aQ#ztd^iig8%Htffac-SUKkV5P$xYb)yqicZM0Qde+xGE8>Mm;a(IR*1P^Q>Z}dnC#7m$W=aDppO8cZ06e|ELsQCmKylDjKPaumXJ%Q@h5_QsMS~6{+RfM7@ z==fhyuU5v`=s~8IYCd5y{1E$<+WeRhBnVK|T;500GFnmr%P5B+bx9hs7+y@8WFegv ziWGcyTsWF`(#flsW+&ZIA;C^+uH$mCj@SVit1u%ZlGajZ1zAgFLMOhS(?Ei3rjtjJ zVlzd!vK>!|h$j#trs1=>1E41)DbTQ-N^&YBCefhD+fB`j^JvP|2PuHJvtHgd0fiLm zrFoN0X3D6~OxlflSOwXQR26P zwFS|0+D&3@s=bS7m;BoaTN2uH5(KaWt_#L7Ri-6Z+OR2AQqR+^m1$d=yjEo}d?aj3 zfN+Jh6Js%GUKXpBPO;PCNz%e}LxqG)5gE0hXbA+8%K3@)PK9=2-8`(tv@@X;g*gL* zVrdQHxmZsL$mX_!D zMl;VrO@d`gbl)Fa@MtI=P+PKkpn&73a5g8`D_Jh)It_rid%LmeP@4K<%QhJM5ow*< zhlA)>bH{oY3_1UR@uq{-E8j!d=8rFh-@Oek;5VV{cQGonMYf)w$rr_TPz^4jpbxHhu0De<~qGO?m}hwFt&{0ki(&|iz-+v*KUT`FXVGse+3-#qV)~zWtdGw zd~bF2wf|x0?8?6tvH{f9;hD(JJ059kQ(2(1rKRP$09&w%ba9vOaq4SS_bPDR%Cd$J z8_GcCj(zyn;9J2lX3K{{c#7562(6ZO&G*429Fr|Lg$`Ua=9R}|iZ?fVA#PfLV>drQ zEyR7JzNB75^hO@Ir2gtA=y6HZUm-Oz@JP5eN%>90!K?%PZUg)-L@TP1b{62bthaYs z_*GU;13^TWAhmlYD0+_xMXbs6P+UD3iU4@|@gb@5UFkI7^c@GBMi#qeCU9nOaANs( zs=1S4+OB5gFPI8d-;7Yj)(9c`li=!~0#`g2y3?(I&vSs!Re;Yrz=tZioFAQYq`RZ1 z2c?iNIW@TJ&rf%BJa+#twmsI>)z$IB(frtOKfb*-oPXAraL1(u`PR2#YTa!?%(-S# zmuA`c&GS&G(Mr{s?!;=-<(GcEk<(*#k{*qHMJfR*>)aqs+E=Usp+zMLF);xKUoei; z-tpo2U&n5Oa=?cK&s>32XfKc-LVU42eVYWjq7*tn?;0*mg z<=qAADq!WJ4C5gCqkIEZ$TR5D(zw^Xz$=Z$RvFYtGW$UtQ5Lf2x~{Q1G)5dd<0T+5Tjjt>4KaFk^`Pb(;NWwPjS0OqNQ37;cB zFNbOr7%w>V5uo8yGEoBdD9(`_=QUcv2qK43T@9RosuGV|74IxPHiX!Z!J&O2j#TqF zvtX$_f`MmXbfz9`N~WYvP%OB-kc&KLQrLLO&}+6brAo3@GjB!7izFRX)o?w!9V zrQOut21RfEqE#=oDy6scj8Fa92$y?R|;*YkgP4H2=LJtI>YpTIIwHRozWY7o-yL4G@x0bDQL`wvYz67^>l zT6e=~{)Sw%z8rqoKcOgTb9=b>`&4G#P8a(}#>V0~Z?-qn8RGxV9+$3X$kEpTCOwW) zEnevj|0>GBL)2U;zcym;i<6>$29ZS9|H8@(`6J(Qw!(4l|0oacW@lb!NQ`+Ks!B>$ zev>2v+w&|W#p5sZ_3c0*qs_inHG2Yef?%Y_PD9sb!BXI!m&sxu4GzAu|0v9uTVTBb zri59&{^L?UKM@bJV$$|IH z`U$Uo8)}@;!5+tkz?Nwt;6Ek=;Ce|yU=twl7$9&NAn+wX;0u7j(oURq`kDQ&z4T;z z`@=uGud%c91Yz;0hH7`k&Ue82yI#8VQYcyH7oP+vcvz>kqod=kvujXV)5qEJUGgm( zenQoOIzJhmAa9XqBh&x*5X>^eK?+T&qe?7vWvZWqhAbr|)f-l#+7?xld4LXMvqIV#$tiJ z?+4z0FUXEXhj%gwLm))p+?9M*PXG_7a@U2xgNuL%d6Arju#%o)3BA$zn~v(WO7O3! zJ;q}lvw!}2WVpJf>dcRS(@=)eq(7Joqurx#!d#5{&-)ww+yA)t2n&D@TBO(*oxy2= z?GDj0-1Vf~xFq)GeO$`Va<=|u@4J6Ra?{hl>F7TMXpt&@e`f%=bJf3JcablvbpHD= z8@`=gf_#lXkn2=wedcKCPb%2kMndwt(&p03rEajw%cV`yH>J~{&b1&9?M3*e0`OM_ z*h876r5D7QrFvrp`=fM?^saoC?0_P*otWs@VbX#UO!S&mCb|Mp?qNOpMya!ejEN6t z{|Mvy@+Bn~pP|6;jz496r)U(zoBPf0W(t9>G!G=1Yc4TYp>}iTirPv_)Ak*&4||n^ zyLz6)p&L-tvs+qz*V7N-+4uB)9{oRkou7s$mE5WPH99KK%FWFjk9@rMt=-Y!@WJr# zhr!?nAMPJUMCI`F_EAgORLL7do-4m^I5j zD@$VTC3!X-XX;rTb0v6a^#^%%Qm}An=cc43JwAOGR!*57q{m|u4*A1v&_;v{Vl$F0 zO&Lu)02x@M%6-(5r(B~QWbEYF&D6d`i~M9?%XweiP|n*WMmV*fQqfN*myeVBG56Da zH|$P{WXumIV*C?bNgxJ=LK(%Z$ogpqZP30Zp?O%!X>hui=w4$eU+-PuhEfTH=Zle)Z9&vUoTimYW*2 z3gg*7)PE?0Pk%z^jKRujzFtOHc)!;3}j$h{Okar^E;M38CEV$tZ^d zh#k?$(_gS5RFD6aXTtM z=Pg+1TDZ^^9mAGx3aaK!gQ`BS9VZgl?IDGZL5;%*69l9RkZ?na$T-i!SwFJJJQ^RJZOcSg*k8*uD|Lt zh-!(^_WvG~Ql+{PP0TBOZ$0>8vozesRe=+8CT92>qR|HL3S`mzkVLAbd*O{6zl=h8 zBJL`HI29CFXKxAYpY$>vP}Q6{^QyA@0>WJ_NPDn>4t08u6^vW2XFm~{$ni4uRt?@M*T9e`yYU( zKe_*Zm~C^a>Tj8+x%qeR#TTyn#y7sPazQ-sY_soP`RI}HN0*|K8P30w6pLbk@V73Q zWwGR+GA}P1RpQu!1*a}JZNWUJmNzFH9~ugcGwUg5oN-1z_Wk>ZeD^qTjuxs|n=jh) z%RTb)dvkKKGc1|2vNJL=Y?<0JtJQ)k5J#*zR>HW!x8ELodrvT^D5u6yJAH}6I&om{ z-n|FnR{NqN3@S6rdMgqG@8?+dBVd^yShfOKRtzlr46w`+EhvaWAA%dcc**|$;Gx-I zbO}E+{$Ne_J!jtg9AOv$qlw%pZlIMewsHN?c$|dzrGTJ><=gi`~3TmAWs&>V)N&7m-Ga%5gWy$B%~$|1p@f5lsnHk zZ?+}I1=aphnB||$h{s9fQN3~R;t5j7Nwi5^v_;;h3WAVlrz|a4dTJI#(vuu&F9B-( zfSMOjTMwvR38*oY5aFk9*`64*BOr6U8)bXXjqj31t5N#c)&4}!4n&JR{?cIHr`+zq za5lF5_TizPy^D(6ZrUbnbmZq3x%U0F=S^6pT>7q_&U?%g>hAg-CRV1)x}4Mddx(;2pn~Yb_5F$!@Z>cE66Or?*~irU;22SQ?xB{xa6hx-F{O zbXyq?a@%ZMllv^nKK{2az#pSagEX4X91@WeomGLuy?Ko_rHRj&O!K&~qJ_6eeuB^?~LGE<^E% zTK#hUTzx6z+EQ$Ds`2*|QKzQLHpy<^O1WDy_6*Nnyl2m71VIi5M)kRQj>zuefmhxM z4~Gwoj)MVM#z#kwC-1C==H<)vT!cg2>6M4$&s+<%-1+(V&s^tR)Ul%1VDW5J>Kv}4OPX1xGCOc(%>&Jwh z@*UB3Othsk-FQ;=aoVC@HQiP&+QQpI|1^d6TOm)*>E1Du+d?ys`l(BJR zd%N4c5}d>)MQ|a`?Vr|xvC+gBF*4)>qtXwwDX<`9|9&#gk)gI!*Ho?t<56ncT3g|_ z`ee-D_v&Xu`OZ(zXUbm_1M<+i@|$5m7S zieJ}(NqDNp>ohnU4D6);O;&tP3^S2P{tbD%e7bZm3cB4Z^-2NRDqkR9g$vOX zQWb1yk4k&xOxZ4L(bRIXq`{U} z<@yly^7mOCF=*QMj>s2p-mqcAH!pBmM~`Ap(4(=nbPDHkjSlVV`9#uk7P6y%)z!BX zuI|4*cfY?3-oAA?{`UXN-unkORbKz&&%L=x(==^E2@oJafPxh}WZF%pOj9UO5Vbm{ z)m5#IAyag`9r|_--MvYGiWNJp3>|7^omQ>BnN~%HTD5bXW30mtD^@HJAe2}`2_;R_ zqzi%(3KcC$DoO7P@oada^ImZjLIr!y{4_{o5o^nZYB@lz^$`FcS z8l1_p7|7+Yj>SG$bH$b?{NEf4veCBDW5-R-8gI@T6+0F<)_y#ABARTmH25OEj4VsU z;u~z?So-@XOo|(V8g&_UNlAuqSd?_=2#M~lvA1Pp+fPcDx>5WH<@=d0$jsIZOGXA- zLm|@79E#1-V$5Oz$C)m-h_Vha+PEL z>FN7)d&PSlQY5mFK+Dm_XhU>2+B|5<3J)0`D}D0ik6QxN>2?kbkX44#54*9kf0c{2 zt`2eY=6Y)5N7r4Z-&VY}7eL!D->3j$^d1EGU^S8PkK^M&X1_aWnJ+lZ60nYRiRt4; zDX9$`VMSJb9h`M9Fd2S+Xb^!#)!-b7C{moQ} zHg~kOcLqZd$!ydyoM4U}!XyrV8)QZtr$W{-EZn+x?_Qs=lO>J9v2c{p{d?)#1OB5y zmxxjWYowFk_z$-~jo7o_ciaVOV+e!lQb$@W?h9Lt5<;)cAhvZIMA2xpjJKQY<1FT3 zPN<8a&YN&fJOuOU{OHmzE9 zrP2Ro6(tp@0p!w;f>W-!esSfC^=)ttE5lMVj8O_8?~ms~bU~1K^hAG$P?IxS%Z1RZ zxe%UYOK3O3$e%~;*X7~JwvKt|66)*e!1BMkXTQn1cP`)sVf4A7>plIA_E7DH5^8_^ zB3mymVEGgb0f|idvr0eUQIChD=e}U)-9DSGrkjp^;3hS3;DW1eD_(ZZWJ_>&^)nTl zU;T6a_Loc1FjQuevOymaEWXbVJtiBXpjRvwRmM}r2ucBnStn=Ohv|Z5_9&4-Wq z16@#f5e0brH2@^J^inKf&$eS|th*aR6;sA`o>1Zak+ws=uaBi#g9iH~`{ZEeYW#~+lXnstzX8SUk9h$;M7uZ>W;JK)MC`$;C;nXf3^60#B0tke;2Rs z@)me%!=58VG5!>tRXuMleeN}7aI z=_Kc9BnXan-a-}8aEZ5^i!_WuGD=O&myuEEqBtt@C2%;sU!Sd%py1)zW~wJj)xd=V zdnE1qLrU6U$?2y`;6P;tdxi4*LkT4tEF=9?VO=w5Ci>4Izb?q{e8}$=aZSU~6Qg%7 zJv)W-cV+e2Dx4lD#eb@J3OTCc95hcNtm5o7&@-9_O5r$*Gt@%e3h*m^w209u@Z3r2F{klUHMDT2}lp#leeHJCMh=2C>M>P7}LO`wDWo|GB=ao z3nySXVPqW7+t1e!a}R3ef7@buA%O$(WmcB^Hlm&CX5__ zLK<$pHzs!xjZ>XD8(F?UdnL#u$8po58S5|ZYaoA+Myo#g9+?y|#)SKjivwJT$oJ^w z(Q=huY;Pj9`#t+$z9?Z&KxhHt3Rx$!^M^#P6V>SHdAu9CL8bTAabC?hg;%|N9vpkW zBo+|r_}$5N%@=&|*Yw5S_r<h|>(!2~`m%$T|FA z8uDC|QIZwPGfKve4o+dZTt?aU`1lYXkIoEgo{=+JpngI28%6u6ju5>EW!iAc>8>VG zT|@81r4`vtw7$p!q*SXlZhBGuh>7yrJA)ej1Y)f!uY=`U3{LwMpuJX8!w1?AmG_`M z0r9?<_968N9D`9_%k802i5W(@Y#r|HP^He2FASYyq`eDKPn*5E+#-0FcqOH>d|{{z zp~2r{6W$|UQ7Mowcp-m-

    S_9u;_xkUE>~`9o$2X_C-4Un-MWNs^Goxk(~G4?&+# z$$KM22Wja)qaKWQs7+xar7dg=joH#-jPq!PK`+YP%ow+_P#+>MUb167H3+v;D zSYwum?=u{0cC|_!UBhtDSqx7NqCF%2cto=1uf+L#$%T=>zwpeaMGLcZpq?`9cw0zB zUO{C1_eLO>eAX;O=yE07zkjiH z#*7_1%*dLcvZPz|w|J|T>DH1{g09sPHb6Y9zzBx3Is%Oy6u*d7+Uq>bmjZJ zY2VS1F%Z;`v`?^_EM|s+8aUX9I2*4EO~2!KEqS(im`wI`n10*8hQ3 z`q#71?fmO*e_K`6i>z9ald>$7-fB+E18A;7J!1+hi#-N_IP1eX^A@0ca}CfOo6xed z0ugF{fW#TNRKXf36rN~y36aQL_yewpL+6&WDi4#dh9`Y1N=v9^Kfgu@o(f1HWQOZC z+(mYm%Q^{V09{Gqn6Yq=pBn#ISU)I~%i^+Ekp1Hq5 zQCM~^mR7x(_rrTA#)d1k(Bb#j?*`+&dqa~Zs5$+LZpOu9K^)S{ZgG0BHV>Wc)s(lp zb)N<&LCtP)UkP9AgxGfw+AhGBK@Q1Fp?)rl-D;M%Yy@6w6Tk;-rho=L~VQHDtS5!|O0RRKm$L}OX_wD2DIRIaY_osg9SSmiQgg^(Aw zK~}IK8Q=x#`e()Zg@{O~IINpv*K!=z&9vD%8p0#TW>&t`;A;SO#*sb#>soJX623C| zTRz!m%d*+xPz&?3pVsY;5%%Eox_5r7;V;VGX1`bTSy=<*WVw-(_1~2x@NItSKX2w<5qL*5D0+$}F7sKx!p%56J)(HOtf zm6W1lOI)$Mp8ShJff!JMir(uj{dx?#HLKZM7siDP*;~*S|4kvigR|0$!_UH@t(rw& zyFw@f;al8L{Jbop4_|3^^{MAkBQz-aF6=T}fiKjS7U(pk4%WscVJ-Hz$7vjL`Oa!o z7QdUgF<}&cMtafqm=s6fd-3@#-ilfAubNgMNk*2Lou2U!y`UJHsx>r!MdFk4F~+T` zzan9he5!ns>ezwz#O>5i3z`!bpt1``%A*gL1i~ic|n%1fkAW?NBL1Z zc6)3bb{GVQ%@o8nempd-VCJvOsT5w6RM8qU?nARD@!10d2p=hLc74%`7ON@4- zqMhVsNdO6MP^Q@|$*7`*e_7|DZqj7iP%K4F$XE=4J{rka%$?wD2{>B-&Qe|)+07~C zGiS~mePrv48(cDgH21}R4tr=x>{nyT%ZbC~rDR-;t>$c)subJU4V*=7YONNKTBdw`M z$hs)nM~}9Tw~rcWErFG)sz8St3s5_f*qEn$4g`A}>+vk8NB%)1XDE=2A% zp6ZaY0DpxP^nKO5*BfvvI#gQJJt8879828=s^EBE!Z}+G`urK3{Utbi6FB=5aCTfC znD(bH^tSOA&zhCH;OZOm^3I;uPou|rpOyTex{{M#+I}uF!0Pgdl>%d5vCSzz&h~Ew z4Ee8(f3BDF>6s6<{&#A&Vf7PRJwSHYRY3 zM5*X&k(8D;Hz&h9!T#cm-DfD>k#->t?b@+?i_a~WW-R8=L|E9T|Pfrl~Z zB87z!|I6`qJL0D^ixgenRntWG0Co(}Aaucwsev6chwK>s{j$`L@uNBFZ`s?1UoN}F z1dm-FKT3sQ@$KUZ$2EwtBdn`)iMEjeMF{+2E}S&{CTQicjX4$3dF^x$JH-$ZVF)S4 zxFKYNTMRfN@yS}RV)TCU^79qXe>}1%m!wH7GQUjq13XN4lFADUkGhbEtfV3FPB6B& zn=NB(Hfx4evBJ=2X#fNV4jww(k!*=Zk)0}HSnLTw(76Q|d@Sk_!d)IxR4}XXs!S&3 za%69F^ML^AoTOyDNTajR9AO=&~7d<`FOn|Z2g0lKq8mBh3e{D@@ScAYwJF# zM%FTV0?gqquET7TRD9uA)es(7nX}wtPL9nbjv5_NSaBZvBm8M}{e|6+CZ2PMPIUAX ztEy04@gb1%A@Par&76LQmXBVjcz#O***AcvKgRrP^c>tAQVhXkU$^Y@wUONfMf#Wt zWWjPFG<-y%D!^u-o2E>#XunsjquVk2yD)q5*#7{tpNiRM%$#}2D9@#+G!y@3bunWPMW)69<9cRAth?4gJ#mvd4{AXTt_E@oAt zI*{2jZhdw2hbMAwnUA#cgB%78C^V#3mI|V9BjwVMEG;eG!~bk*B&6Mry5`T`2kmgT zShf)9a7pQ=&q@<1C*048I@+ZhH6~J;7rQZjcF%URVtT6I{DzY+<$r&+XjaRI&sS8u zzSFA`8qhru8mT6~CYd$zOzLjQ&IbhwrRmUzB$YNG2E0^32JJvw1E|yDJhHorgzuGY?%U z4=%gL+450EMa7l|AGeTT1Qx;@*gt`jkel%|Pj$U?d%gb_sPA}{f&zY!=DoaoD+eU{kdhn;bpR~2*fZ%Y zo*U~KNLC*X=!ua7&4)y%cQxLi=JyCYxZYpQ;|-Lx!Z}FKsEyD(RWYMcW<4W}z)e+RbgS$eY8pOs2}_<$Ksi$;F(4^)Og)^ z{AH2>K|WCuC4;kkc)@#eqaxV0QaEWVOEyxA|K z3wKvAy#&pR(-mC4GB#0}D&a})6u<9iAlMNMoe20_-R=~Cg88l(0?ZiS?%L%Go3Y?h z!mYdbZxK+!c1f>pS;s8klE6~&q`)gPJyqjpjmla&5aCJa7+>ikg9tZdvU@F`+qD?6 z2vqnnMo=yiRYl_?^Y5OG$QQ2EyYt5(4l}OgHN3u7k{7!<-c;je8Sm~sla59(2)Pp> zDJK>BH8tnDcoaP8x_Hy(JXB7juv#r!FFQdc_u&15n0!;5V%v~fTnqU6XE;hy!tpNl z2@aO;!1#LyMaVuy)V9yh-R@D6lx9uCwh<1JgCwQrYy2wQi6+d4T75^`LtWv{V4DwL zx3!<>!mkhmflft5Fo|OQ5ww3JD-MoX_b9Qm18|8jy2>5z6gyFZKmIizWiTUJA8Gfu z<2AYGYqu)r2GE^X0)|Y{3Pz7GF6L#8LMF>a1ff!>!=KQ~mFN>7UG%9187rJ`#A)*A z64KiQzVWWIbz2Z&DMsY3&dO%cCv-W*0+ZajSu=6`B7a=(SH16}=^q2$2XT7B8f6l1 z;|Mc|4Th4_6Hp_1jTX39|2IZ!Ydz8P%86iW6asv$vk;^~s072kxUuRBPwbXKS}CcQ zg0R{n^xU$r7%RR~S)D*Y%Jc!v@QKq;(`kK2?@&k2=p7BM5FgfmG*PYZXj>1>VuiRn z4Tukigv5vUrCXoz2q*PY9o1>ncZl;p{tl>*s=mX(&(EJghTiF!{V5N?XHOke7lU>= zc)$z5_0iz^7}6Jx9P|adLRVY976wV9_rTX}QaBCMas$!s+w;YTuU4}!-{1DQ)+-W? zHzVyKI`GZqXD=^YN^i3=-TgnnmNoqOHotV7g^zqtJrPK@eXc2ns0`F5G@qI<1;)5n^lr-INQ% zv=Q*VT>P&DbdTNv2`2Oj=t25~;<o|HK53N6E1G}%XkKK3Xf2moziSH?k zjfm98_s~iKNMZiLHN-;j_eXe!EXXVAU#cZy9ZqI$!Us1mhxe1=QHwwHG|EERsX{E4 zX$EM5EN3KgVe$D$kU4*G9*E3En8|}OB=td5DBc}`ty(xKvb(}DJ3zPVz&-K-eFt=#4efsee0VU}uY&0OIF=v1GkPcXi&4>fejP=-o9x(i z^apdJP5e3#?TA?gk0+PDgF*AWqNE*f-tni6zb#uoea3e~4K=7n%8{Jtu(LJV5$(`b zRR6JmyiFqpwW&j&qqdMacmw+_)Nw*f?w`Zzz>BO%Z+Y{Zh`QZ*dsAmvF%5F zem`PZ*c}h;^L}-t-E3}aYY%s?RiM9^PF#%=dhl1GY={b^!*bGvI=iBZ0e%5AC_knc zVp6gZE;>cBn1o2@+ENx>t%KqZD#&0{*B9+Rw7wE-8&X|x%S9`cT)~X#(_V3kVb!a> zG<&r7JZvZJrM^oM7AY^j7q7s_<%0C3Hmc8g82VD%aeD^R-4o8kXTHkM{4dEmC;i<= z9|%ysv4v!v<}s%L`&|7{=beoa-^YkC7&9D_4U+ zX1+M9v{Vr??H-}9*)tDEh6d(~ZO2wr%$hWdEVhxA2?flHg}z0Z9h*f5It5k2Jm}HH z7J0;GGkSGHWRPQugCXLxk_<40?0&*vMi()}z}%wI9P-HUT0btf*zF2Rj(7yG#iJqt zZo*Ul0#8j9{BrTs6Y$i@mS^G-YA2Q1oEFPZK{%5~I)CQ^#0gG3igezl!))AO<%3Qp zE4t;&%gYrZjCW~aEm}!!Iu^!DY747Yx*5=+fUR?&#C&dV24a3V?}}hu^3cM;3+`Qr zmAM_(hy|Fd7@T@7us0EE!2BB&IQuhEaeyPFNeGb7hr(An4M~N(=br0ER_d1IP@@d0 zz$Qhh7)~agRbGjbT;*_t4_4;-Ww_lpi^hzR%4pk|HqbD_GN;;xBTT7Pv6?X4>PF2L zMK>l(lIRPI$u=BCu6sVvZ(A0ce2NY^(b;Z&bF;rwl3d1kb?O6t_hwaQ29`3oaOeyu z3;B$g-bc!`d;+q|64wc{U`)?SDa0`D0qVC>wENNM9?Js9)cF1A)P(!>^&KUS>G2(* zL}z@APaD(gJ<@DJZKSq_2xTIZgG!yVSMYw2E>dk7MzC+A0zo8+>rghz^UC zOP&jWjPVw_D#uLzR$|@Cm5R{p^$1m&9?{nV|9>!6jRn`l$gZxfoegu>0qWq+w1!Yf z6$!11P*C7;!sT4!F=PgVvK$IwTP5+K)g&_?gc^$|h}M>f1iHmg(1=A8i99Ykyj}(3 zcT53WI^gYjulfnzMV~`O&11$-pDvZXF71No#eM z2s5vZ$DYW-(eluG_$X%JNx5ETQ5a8Dd6lJ+Mam1EwkCQB_(>g4+tW9xVl&8Z#OTm^ z5Y_{4g=A!Ae7~d^-#-UA64jnz#8)ToekJBh=hgEtUqXzF2z3!`VhNPV&tvzc%d%_3 zi(8M3=0Pyf&>6c~(OLTzhfMAX9$44X`IN2`&<`!p6fv$dBG98H`kO7g5ti(wnP92yi>;j69%(8_c0badSvdk#g(@GEi8 z9#AYpNn3vBoj<$!qRGf7jY^ixi+F@f7=t_%QpM{H_g{5U(m!@KtaS=<(#%kk*X!+? zHxGyRZ-whnb7d7>I;ZoBJLaMbLOHA8F2t9F->jT1$n-nW>BQbwsw4pi``jy4+YY$c zr?bJtG0~tnFRygGjtJO#ZH zT?Y z+ZHV@{EkcPNLhxBaxE{%R*VN!PhCHP(YY)hfg=Nymt!+1>o>wMExi)bRD^t^@A9LX z1Az89^yfXY{_1%xEs@~YEnl~VVit>~+w0$5zpLdi8u_-t)yg32Q7Q+D4|m$4h491B zM+W|nAERW9wAoNYEwOl-b*-`G z@GcF!)AGYePqH9T=&<>ZVM$xu*!h@Gb_#X)&g+)N64F6B$;?jRQ^Zes5ZuBf{imJC zd-guDp7fuLLjfHf`|W(%h(7z5xL+M{ojQUxXY$Xg_t30Z8ll;~s?j?=W{78JOc$=k zmM#;<7oSKsYWL~uYuT*cr(Jup-u+dJ&fr7`2asA1y2ta&Hal6ZjInEE*6xhu$uzMw z*trVbc$KIyv|x(hHSx{^&hXyE8EP>XdREO&@7+aQ^sIcMa1mC55$Giu-$SsQsGR%` zMp7o21GFLJr~{lFMren9tohxll9!GGG8d-ZP6Vbt1;(MyV9iLDPFPpCxoMnQ z_eMpX_DCc`69~9-QhnYd{??;DCSvbA5ybCes0Sjf#=%udwb&+S zPMGA7geb6QR{RcCWMZO%N~a1FJ?i{sV}1)TzbTks7Up+8=Eso?3bV(n)k}Zz);?Q` z`aye{Xsk{83ljhbm&Tif-1qZH)LMG4)A)tzVh=S_{9c$G6=%5#K4=LOx z7?c3qRv3^9YkH|5iy3K>lHQjT*t57fkw6h{SSV?I$%5IeQr7e(O^=jmmItjoZU>4M z@LIJzBH)|=i~>mwtqgLBk#y=oQEi+iYp$MAc8@8A?XKo!0L^WtSb4ugt@Ui_ zpYSa`LC_L5_YgLBuh)mJ1AKG$^k0;ZlAQW{ICJ+E!M^*50TQ9f(vbTIA;(q=61x5f z5k$_^cS+RLiF*hnS=~eG2irsX>h=Ihv3kDaBP=As+>cInH_84`J4wb_?j&2(yU|IF z-;FD0YG>55Zw~7XSFe>Q3$aTP#IRd$a5x;Pl9CiLPQZe;m^~h9qC|;%g_e;2N{W z)AL6wFaO)urZby|jdq-GwVoq0`{A?WnHIuJ+s}^6tR+unB(MV?q~4ov+Fe`w*}=dU zEiL~w_79SY!B(ENTnI8h>i!5P%Jbs}|3n;h)pG*97C@3@Y^wy`KO52UFyVItNRJ|f zB1#Hkw_?k4PR!H1(NZhrMxEx3vA+M<-_p;Guvu*rXn-I0wrhhjpjr%7`*ENZ_cU(yr*X%$I zXseZLh+r`0(oLQ@bAn6AM2Y9f9u2qqYKtOR{~rHNls9kni{Bpz>}~wpt2=hI z?5uyc2g&PWPf5!i4Gj$%y81Q4svA?G9k@Dm0oaRdB>31^oqQR&4e)yj(x>7J~rLJ~Kb*$)XXHF9-fXneP#qN28mf0NYk zXP{UAw6g^x6BjBKtHy#~vsQ}Xa1R|AGr09(D6!)aB}ob)72|Lq=z%<}?v)2BrvUY^ zW(uG*Kqvz61f3v2H^8M9v5Z5>_mO54lIQ(AQ?aWgC?ahr=Mm}hUxG)3VI>}2!6XJ} z+#FSNpB1anDMvgDRtbLp9OBlwb8O97b1de-a?M4{w*Q24kN3*E#<@p_*6{e$BQRYLsU2$zqv0%BYPx z^;Dgh6FL$SmI(>74W7@X=7bKMw#D6#umQB3(9>mQv7vIW&LpV{Sq`V9Pf@B=Pey3} zyr?x`6t-(DPPjlddn_^TrP4Zp*b6vR2&z@9@rYjA@#k2PYp^28yG9Y+%Rw&@=~JZU z?vLF!St%`Dzxj>26H|}`Hy9ZyswP^?9!Wrnn|d9+LnOvs2`h>&15BkbJIc?<$;jO= z*WWqe5ZriY#Q{Y0;3J-kba+a0Y-Im}3k*PTJ$Z9Z>x94t+2j1aSDq)k9e&-tj+I@x9Bk@>B7hSr}9+vODN``dYO519%Aw| z$u^Pihu9Y-WXz@7BpwWaj_t>GCMob+Ji_rR8v8l-i$O~TyreFS)FCAoyv(9pxQ}D; zRJa19!VS*FhXF3x`j0l3U@#CX|5rVGihtNT1PfW+9F>V|N6M{6-~V}PK5a9eJWJNW z?iU;mieN0oZm2iTgN@yxn$NJmD~IGBRP5DY-_yJvbaFpHWHgK>2}4 zH;c4>6KHJ-cAT;rVNt8rP10|{vhz)*@##PrBf38A{H&>2Q^ya+v7jRB459t4j|g2I z35%9@O z@2{^`4aw`gIInA2h4dR#OZsIljFs2)znS_;RS@04BC$DQwf^S$I8eQgLKSo#>cl!+ zqc6DmlF-@8#1YRm23^bcWnCCxG6B!B75rJD4h#03He8; zbIBb-)sPx^<3>*&a(7f%$*+u_GPut-maWDPU4U+p6;(CcYin!&^gAF=?nNvqpI?h( zKbPEPr(OK;p8!0zT10{sDS-)@nGvK|eeDl+!R2mZD6_Sz?w@Hf{P!Omz*ks>FL z1x^t!VdnSOpeB2=&R{h7{i0qH-MpzHEb|iAWg_~&h^#vt>FVk_iNLl$VoZhwr;p*i z04(wyIyzVaEm~i|SIWUJ{Dqk*e8bKg;k_LO(U3S~h06~p#s zsI~#~;s@S=+1A-Ob>q@K9BKXowR5U^e}ClY)~&hpLqtgyB68RQ710Da3o^8dfm0P= zKz)7v-z$ZuI(_ohY}g+ma8z6T-0s1hk`AwP=&-0bUTX@H-Fi~*1O(Z_Zm zA5gEK7i1#a0pVP-9k{2KoV@UM4P|lohOjs^-x%E|$&paK!rmZgSfOIvjNgm&4Ga=~ zL;jRBpZ*q(OTAmsK=#eRHtQ^P1RTLb&#JFKtV$gf(ng(XeQI~psIA&xacVq}_5xw6Eksw22f0L}ch*16pM5cFc>M+Az4yzutxJpY28lg z(qC)scz=DVv~wMzBW_bx^fMT5pGC8-duTSo(71FDU6kSf=5)xGqS-aTR6niswlvx@G& z_x_tEh8v$-v;K*rK&OVX1dcolj(EV4JHe5= z&X^--lpJ(cTsxCAqH|*GaPvX*Wj<)0R#a3pEq@{+-xKqf#$`radbV62JTK|A;&1~3 zj&H%zs)t2F8vy;UgOBAc{`2kl`DcB9KBWA(66&cZSxgAs2Rb~LoKB`9kVL=F-}+53 z+#NxlL@T}y1W$GkDQhkftyo+TyCk;|>U4>EqvW~dbmAvf!lj2_w zDVB+oO4TOStLKv-t9>=1pKC-h3v9%u&>PCr;vly`!dGAvMe^oA!WTfo$8Wb=YtB^f z4A1tpWJ*%H)!5YyTPG4WTGL^7phlszewXp`-%#fXT+(kYH||2)ofYo189w{6b5%e( zpUvh|QjxzCp{l7}l<>%aIKw6Drb-9a(9Vxbx8{H}m5zgTZZfVttkm(qX|>U6P5%s} zjV2o-A>-+!2YEC@Xr#$74I-x#3%7fMBr&8jl0!e)Vzp4^1MPdHuj6|+-z}()#lzrS z0XRpel7-+LGvos6b*JN{X!Lle;mlZAp`d-sqFlCttr~2x}jK1y-zKdPSSU< z)A1Pvd5xlYG_+^WHwfGe#q(*Q(D85lfn&!{o{sT&&vip>NJFjih`P$N2V3Q2iI8p} zOQhFVw?iFeq)}utl1`wP-aBb_T<;hgAHz$n$47A+t7nvkN$sPBc-~$E6p%A!BQrwN zM0_X}jMF@0r#_>4KXH%tjD7E>&8yGdP~4U71#o2VowTX(JCS{>&8&}oYa{y>4>^NB zL+R56{7g3+@R50d%byn;KjhB;^u*JxUz1U> zp!P_IA$l?tY}tSG+crr^9(s#EH9<1xbSv6`4`Zs?0GQ~=kr^2oBQo%VA-8w6kMe)E zhBV3UU9-jNnq`OLV%>kGC!Y7TQFOEsb~XqtYF_5T0vs@9M#wnUMlU1dtCq(0#}M(c z3mb$cJ~kH!*8;(h(L5Dz1C5@2y3wT#fMKb}t6Gc>V)UuDi?;gvYPFf_>aW%`hPL#3 zwOaq@l|??L_ja~Ex5JHl$DX}~H7JD==2$oA94Q|`dtU9#&mRfImrRH0!iV+4T3}c%2puMtE?f-9A!rO)XswZnd$ERkuEBA0=WAu z^&K`A2%FS<%j{B;L=tAw?1PUk!)Rm?(36A;1TRMOne&Z^lKqDsU5?T5E);bI)P;f< z2vD&|L_8X8#4Jp4E*Y?^7_h6zIvbID4edq%(H1CckOu=)sSpwA6$vnX5vIhcB#b5e zt}O28jlv=H=Yrvb{g4`%^n9ZGYSNL2{iXTR5-^~i34$I?&RarDgAj<*3)?IQT9P!;5(cn1E*aVk`>w-kz7BaK3U1+yry*yseksEXlqgr%@0pIe zQysN^uu-&IY3okYP%>P)GL7TQ<^dw3%y2`^$|M@nxKp&LlfBNz$>P?8`;m#rC#a3n z?x#@{_jC2$FVb^A)hkIud%2;F?W1F`TLslM?kgZ0kWB(E5f50$%=9VD{G9J}TBdBi zIp8{-mI?Pde(KcMUq7>>R)eD3HgDdxv#|HvXz`@Hf1$6A%pHLTy~Su^~7?z za}-XwL%8kaNmyg2Gr&%BP&S4_#?x6>c#9$2cW1j!&wNFn`CroNO+3-?9JELdn~KB< zV>K0C!V!ZIu(}ZHLMU+=)vUin-69JO489YrUXBrHiF=LXBW}li+>pv2LMo?2DzhP# zSp?aW%l>wFN9_whR#t4U-~Y*axwN#b?A1nJ2OUPnp78y6ijQriiXAPo2| z7KL4&$0}J1zn&2R&!97q8`+2Aa`5 zyyA>a8YUikck|}W+YX8L`M2MG`-1Uk_wfq;qu@jbnlk93So&_!WV0!0;Z{H>kA%@a zc1q@yQBcNe?Cm*%!zoDyiu@;=Bn7cGG-E~yKq+kkqCVryQpAto6$VOpXRa%L39kGW zT$v57ToUI>Qecy1Np?2X6J43+dGE{Gnx|x0F5j|!_cj-PG+dTFp6BbETP+9!ryptl zTZM;(QCY7*Y;tZpM>ZiQ2RvU{UEK{7cLTdZfW?}@jQ4?urS=I?~$Chdv1F}wCVpl|RSxkhA8;!INA9#O|tdrL{ z2iJlW)!<+;I7nFzd01Ea(itB+qS=d;9MBa zOP0U~{2rpY+jvimjnETM1DEgwTYt_{0ImYi<6=p#C}!bg5KXi)hFL7*lg~&lloSKf z>ADdf!l#fXAWB+FvN_dc4jk(UMM7BH2@4*T(FR`dZvGU&3s9<4D8BYJ%};h4*+i;U zzMUt3i%w`en8N5d1anA~$UIdw#=xVp)KT8SM(H7?WQ%I|qKKw~F&?y2pcj!0QU!PM zsCT&wfBzutGA$)`UYAx(Lr->!J@S+-fF%fYu+q3`>)%llHr{LKZoyMB zhwce6-fA4Y&Cqg1M*nbs0K3GAHVJLib=EYr?wQTEiAwQu_DLRUs;b+>J&3nnL^zuk zw=?F@z4+qu2vj~um-Ni;=+xrbu=Q~1SNvr0;)fr`pA6gd?A!aIW9Qy-%Po1MqX*u3 z7Uc(C!D-B95?m=dv@wt3Ajmp!zhS<^ZDFR*Ku@#bNi6iuVcJ!)uu;H~M%Y_ai~xE- zua8FYDeJs(sbc8J-o1NU!=h>IdCZ{g6M&Xs5i@oR_;F=i%Rp(PA^HF;vH#_X1%Q41 zl!CiR;kyxzvg?UrhQ1s!ly4)p!De_+0m_K7CkEh?oSvwOSj4eRixhKiX{hRrd)%na zNI2%f*%l8)i*M!pG!Ol+sCdr%3~9Bia*3Cc$Mc$$KM(7@4Ta8dF+VGlh`~6dAtSLb zH!Z|XrfHo&L+dD~a5RrNs`8s%4w*u058dX?&%h$MmoBLsv2DaK*TN)NtGmCru<$D8 zfm!k)qv}+oh&Cav`z&5J;GsOjqT?3+^!A@FutyKPxnaYGKYh(+C{Jtpr97vj!(tIm zc64-fhC7ZQ?+Bedd9=B?9@ zEZN0k3ITSz%JsnbL_%Gz3sBlhhr+QD77K+UNqS?l!RY^{Js3hhSNs0Yn?B!vJfgS3 z0vVmeb}LVjp3^i;xw?wqgw*^EQnM6NQv|6YtbpN(%75#zfESWP;JOX4sq0bh=Qb`a z_gLLM>$~BL?#vncTS>skKFG}U+3omZfVD27`WuC!iTEaDMXDFr< zUF`W>QvR|Eh+8JU9$7R8mUsnS(nC3s#z#=>#Jv!30=oVIar+Rk0y>}UW*a9JU3B<0 z%0>I_$8|eC`#0K;eevb4x{n?!^>`LX{)nl(rZ1QWU9vBpk@OXl;e7BZeSpmnDgriJ z2-u7k0(iF6;ik~H-=1{oP9iILHV#V>_6PBT$SzbjkD~n?aGBSLpG0QoqA+U&HQpLw zbzh5UM;`vu>nWu&P^Sd+;bqRHr|R_C*XE;i!TWs0G{MNCxi;!6Uiu`Ky&w98aUqSi*_d&lXWPrF*S2kcSmP;tUH3!T+kmnhD4aU z5BHo1r(2Vx;WlHW(hzFaST~bOa>+D2+Dc&LC zk&RaSB*!F(lHf{;Lbzah3#gPOqKtia%rzW5WZ6^3rbMEL8XEt-KNv|Ke*qpY5K=>wVchw>W@K@_d#t!4!i_@mf-c@Dxewstj7D))j=6Yjvt*LlVa&H z3%@eKi^U!W(}(l|ny=(xs0U@v+{|MtD!RF-=qhCS!PWv~^RcxiWVqYyW9{})7BjW~ zMW2GlT*&nk6cdQtxciHyFZS;D^538)1JL4p)<4Ir*J9R$5kDWZrh3EXx;?rnYFgAI zB`7fb8zfXx7s%fvSD%I+*bi*szf~%x%9>XJBYv{XHZgMu8o{Zkzd4;syQsAQsQ60& zith+AE2&^q7yIj3kx^B-0~UaH4?*F%T${$r!U!tH^G1XP`xlP^7f#`Wv4;=t--8Q! z!rzA46;u21_HWw0`KC=WB=zBp2W$cS^D#vi?KWB!lWnvE*;11;nFz>he`a~s8f*qa zo`g$PmZ_3TKAZl&a2ezxiR3;|7J*O+kZZAt?ESbS9A!l{+n>sf{s3IZZF%*E3E(=_ zZOzN@`2ya*)qG?GR`=tIt<9*$5*KtcuZShEx!C4^1V}GkzY<=o^W@TjFarR;x+9@B zG_}-cWg0$5&kz_}B-pcNnW2%)Bj!U1@g5`Ka5GGzY7Zj629Kw@`Wfgn$d-a+wwJ1^ z-r42FFI1_HJ~jfA=O5i&k(L(Zq8;=Hpw1xNBLAHvfjr$YmNj*9=A`js(DfC+(-H1^ zok}Y@e^7=Q$@h05-ew20=6>nfmlei*xe%26Q?_m06Sk)`No&HC<$ zgSAR>?cXrTZ8h27o8?Lxf;cto5$WPKP-hW8IER2rHlysr1%eZoogE&OdV&)sL?D>G zQke$}X9KI`*GsGt`qVuHSv6_C6i%-tg2%IvYxhezQi*t+iOVr0=?x%nxQs;~I}g&# zLMYhU-qG3KeymNBj05r`i~)u+u;e@fN$D*}{j=I_qit5|uSw)GkcYgB8UtXzLKL=3!3DIyg44KJ7zP2=(_ox@@5c{0*%R*h2wHMP7!2<+d{rjiyL|b4whnt#P)HLN3%?WUggV(N zEK{&?Ry^~Vhkxj7_Lfo@`i__*Y1TsO=1^3WN2{MJV2^Iq&#!g5H)KSkw$b)68A&6@ zOR?kOu2}N0k#2?e=t1{(-rFM_HMmnGsXYLwKjQv?+#`9XtIfSZl};z-JQLD64$`U3 z*|`4FOD`Sq)r;lp=0oS+gKH`Jb`%1aaJRS~wYg&7M<=QW{^$CcFl4eXn$JGMg=yp3 z22zx`Q4HCD>P7z=Ubtc*e5Cuhi;cRAHK0@IZnlH%z;p{BTcs^_neuJrU?p}eJUW=Jhk8LZsOO>(AR6+4HJIb0NcUUbU?96xCHACzJ zIFCd7&jHto)BShc1WjKGP0yrti94w0JY!*W~Dpp0b&^a}UbCh@j=_ zy?G=}iU=aez#l-BS1pQ}`20Kyi&}fD6#kWv(fcl^%s`9T(|9d@OruyEJx2?ViLv`> z^8)?@$SNL74bZ+Ni+27=i^*wmTrC#NLlw0Dp;9B?c}`2k#AlF&N{xydnqQ2lcUQ@e zh%!9{rzIqr>NFW0B4X(}e3l?Bl}_fBiH&Py7E;S=R3jr9EvJNtq{t|_gEvsWH=uV@ zA8F9|$^CY{{EX)Z^zxH>-=uR%%JyO3ja3sjaY0YhcBG#CGUb{c`#8Jh)7EsarN|)S4a}H4>SR?Nt{u z^J_A8ltdd9B`I7`l5W$(4-}Gxy6C$O*} zI+qX%xlFL)n|AMR`r_*YUe7w{5Y;|ihIy{WJPCK|#5^y?Jd=CM3MLjD94({Z;2;!; z`xC7F$`6u1K{HPWAPzTAdF8=g^R!=WLYSv#O20EOP6r~bww?2ug-}nFfHY8LLnth+ zvIb@V4&G%d6Q-Jyb>a3lQ4F*l@wJBotxTWJ(~bm5gjZ?&*zx1Xj~SjOx{>@(6%YNC zbVj+UkEqOo;Tq+J>)44shU+Q(gWak}IrT_nJuy<1cJeoC*o2&OhYY3tlX*x|qkhfhH{X{c02df5Ou>GKvT2sdwrPk}0SXe=(0;&3BGk;M?0)m?OP@k@o|MgX8v67dSE-Jp9e|JH zpetU-NvnaIf|-);r@B);*eO-_W9%BP`txNPz6RJSFJY&oG4yIc^SnMB)i|SaG|m~) z_;JqkB2bp%o@;Q=AK{)qh6cPAyvZ)h9DVZ3rq^J+JzrD%dl^yP?M)q1vr5*z-5i6f z%MxIdX3Ur|vaRXG$FUuYRwoJ&Jq`;Pm+5*(?8EI_YyZ;p^)bXJ1NAS&U0-Q0c~fRD zS~Tyn?8)ePD2;PFSwO09I%>^Z1cUi&oXfw41-+crvb{K&NAUk&>;+*QsIe76c>8-lY4*7yz<7QqB#DIriw;=&i5IlkqQ;^-dn!M|RhrHs#8aT=2^UcF; zc85J35$a&@1S;Y)J-Vy0;J1goz7tGBgdjb|Xoz)&x+FIYASwde8R`@ec0=u?ZkJAg zchaRxLSsJus&lb!x2Yu*>gbX>+k&x(DpE4)^b_e&XG%tg{o0;ekL$`@UVfc74`Rbo;lI(ErSCTj2LmYcgQyxx2KUN_f!c(>XiChWWw_gnx_;MsDBW)Si zjS$V5J=YDf2hLIQ&}Vc|$x~8A*3~5;IF~VEyltdOIU7mDQt7QntWO5|#OL#R51xpeg`}=!(e-B{tg1Fg7z+^O)S@$mY|3}ih zW!=?~*&oCM&kLaoa!@x~?an?82@H!fs?SYv>H>iiU5}8)3=O42XZiQ@Wa7fwAb#h1X*>^tX##G=>ZuY6!U% z1{DUyU;5p{sc6Zu-44}W)a*FABiU;GZc0`hj6D9heJqo{ zHc_KG#{zAR{HC}cOq~I2uwL3Y)Nwnsas6qdS*U&QR<4eM&sn7?H@>tate&SN+K~N3 z_99$Tu!yT^9G@U|fAB)(g4SVEvrqfjTu>Zx?$_wz9DGrCJ z=_9zs<;S+vswLf4jr~(&cna*hcbkHC2){KDA=I9(sc};&-Z#xU4ts-Ta`t8O7A?BO z`;r#Se4#!NahZ;N-Sn5*t=m70Ij*0h+JI0;PPbV9`%#N<^KGnC7>0OD20MxXbsg-w z5TJQa>zt{LXtp2;qu6_C`BM+SxBdM+p+#f&H0_xV_~UkzWuh(~+_qyiuH^1R^=~|1 zRr5FdHE}ym_;tRM$!Udnu=E)PH{MWCaCt^Ex|4GYQ21SiTUd0*Y(&CvO}TIJS>V}n&l!5S43`;7;N3Qf8UX| zj!-8ouVDMPfws19fu$Ulkzs*kE7iiGnC(D6W^JtUdobFiAMsjgu{k~uv+EiDDd z;Dd(_eH%bElxoh4UxOE#rTruD!U=YQDz}psfrAWsczctvb<8PDue1%vG;m}$6u%-A#-!is`^sV+1LZ9jfekxVDq$?ZaU71r63(hmR(!UjFP7;rP)zrMJ zw&tDsx)zr>Hq$i+wQ@N2HTAK&orl6g`<~DD$EFwjNEL@o>?Sww*rta}ydH603u~eU zuqIqWvT&iWh+h{0X?utq{J4<0WV6jJC@8)ucg6wqw0f_ZN)L5@i9pnFXD(`R)DR4s zc@@#??{uX%zgOpt=_TWN^MCx4+n3+*Mf!aAR z#VCxF$)0rUR?70q`G`+_9LEEoRVphn-+${hxic@YB?X)6s!QWKEMslime-!Ic;T(O zUB1rLsWazY|I_>ECY!jtyv3e!!|ZVBAuO<<*Krt<3tv5s1vlTo8yh(H4X z7H2e>^e&rTI&|>xp@S$IX-+kYkxT!_clkis@hoM3nC$T7f%uokY7>cxnu(>FE|rhKYU@vW>~ioMb~2izL<^2_vcz z@_p6Z{4Ji7ijqLyVu&-+sS<_2Vvnn~!sU>nD#9EJ$@>r)!&b z{-bI8+q(iC))_OPij-TK9YRdr_GP4c|~S`%y9pV~@xJ zkQeEu5#z>>ALp1PGC@Sq6jS`S2mzoov`UBNpabn}R7vnM(1Gf&T8a_tPtUpZn!>`H ze|G2p+*MpW1Z8#r%Z1j1iB+N=RPBG=_=JJf*l0{C#3 zoB=N&T904}JTu(q4T~VQ#M+Jp14r6A!vIH}$|ERCSR&Z7T__TWC>1emxFgdx47DAC#kcY7f`bERkj=U z=IClV?`yX)bR&ege;2f9cD^%@V$EHupH12u3>dB{|82{2~{mu_(&6;(| zWb=upe>6O>GShgp2Cb6bId09q-05_Fv1N1l?yyf)vL2rkW9+c z)tmkRt+%DR`fqJ6GxZ~(S}Qt(*?f}*fd2W!$QK*p0O(=v=d1R?|_ZP*t%)qQ-QOO{=gny%EA}xiV#Jy=N#Rg{2!wE>mzrJX> z#&Q7QnZNifm-+u}~%u`3qk z34=o0U{-bsqr?{_6zEF;I+$J=d^L?lEqA{qu@ zk}xVVGhOK&{sa5>A86SdMIkmpjCAndk~xTa^XlC5G4~rVcj}Bh5pzEebJyAJ8#g9y zNT(QB(u1P-;QwRq?cDu!B1D4~QBN=Vb3@B2C@ zX$u1G`}%$V{PoZz4d>y$ulu^M=LeN?UPQ`5AHsqtfc`sSOQ@``uLSY9xEP=@XJw(M zmH544*K;}xQs>Ug)=_|40(aJ-Tdeo|%v(KU1lQIBQe?3r3&gOUBpn!0hA@TYw5p1+ zO0~)b#lnFMY=|@t#G$-X;QSKV5}6wuzgIAr)i^4Q@vVBmspX{r)R-JLPjIS zpfl2P6no;Z*0|kmAl{OdEf+4XQ3uJMMc{PV-hLne4SRxurogG}6Ww<;x zJMwlH0+Q1K$#KANSVdV%Nl7g>_o79!7S6j-jm!Pikh8Fabx6$Z;{E<(PF~;FEOFa6 zP_H*SRL=Js!kYgX_Zis#E{SEjc$*E3a!d*W zQ%Vb=%5^BmyKIGvdGoLWq9BTh(~KzzkMHPEzSVg?0*~C*>UsvQS;{Ygq7Vs6xk2lG{BM76ew}kHuc3i$+QiJvOJ+>93h^m+KlrlXB#*9^M<`~n4{>?DeV{04`!Yx}uZDjH%zzJ_3gB-Y zJez1It)aM0DIPDTF*cjcYKEd*t3q}zCUT37AyQn;=t~D=OCIPz*krIL_V5Zu0dirI%go10|o<*gOUr$vD`VP*LTd{d+cN=466x#EThcv z@j9K`1+Gl!3^NwG%2=&#*d`1H^Terk`$V(Bg-+ZW)L_Qw47gnct#@SflqLKn&Q$_@ zyaZ6Q0UvFES{_+^q{Q6Zs;b=F!on*Y*UZ2ciE0AccLH`tF2HuLB<#u0-*XWpRCTxOUPT8AhNdSmVaSBv>!qF0Ud8N}jJMD)E9hp#J9C{*-H;%+19RE%S&bWM4h z2n#zATu}SrhYj=37z~ETxKN$d_81ft9y(%Hu`7n*U{bHhj9oEI4@b^t=zIq&AD$0T zu`qH&A{uhIua_#&ME>@?@!*+2#>`kS> z*Ct}2g;5yBu8zqrBuyw+Z|LCc$|ov=yo+m6s^uu%*1AwSVF>;g<10{&&YC6R(|6CW z8d_z^s9rR3xTtq9 z$1U>1JQ~s&&6OUeVl)ELhF9Uc*m+@YJrY6$)gcH~b-<=gYoA98!Fd58h>+L=Bu<|F ztg}a1ukM6p>P{FbeICScX{W|wkw;#qJPB4LiUm+U!@0YQqxxZr;Hn6{1S-0oU`un1 zU9U#(Hi2TBNG5^D6f8al8M>UO_c+?cU#w#UX&KmdG&+dvnd&PyHef}BO#I8j2nmS`e(kDdb4-CyX1<;xRXrZ>5 z8a0h^!v)K`tywU132iNztVVL@QO`SfA#3MM;LHsuJ5gA;0ZUkc|ANHa>UKbp5`n3r z=E0X=e$e%ZOQZ96boAbznhJ$cnc;Xm%Zg`>8u2VX%Zl)m6?|q3y3MZ=m4{K_vzs+Q ztOb&_^BW2a9V~#G)6=L|sGC9Y6-oMi__o^~riX-Vwh+A=ySvHctvoHpkqDl{6rl}I z02UM~gC{bKpR>=8;f=DN`6~5%ECU{|qIVSOVzGxaFso}Yt4VkYWl$snf}9=DTa(z) zmMi+Y3ahF!+r1mGC!Ki_f5b24MSKyTOR@FAD7Q@B0h?b*aWf*-`Q^)+&@+K6;yV^D zh7Aytrpi2sf5BC#+7fW(MXDp!F#y1&sQ@DOE{I}bq3C)N5@c&@n0}p5;N6u7_H{eC z4CLixWVpDdCijy=5c)2S6*17LtlxpBs~}R&rn zt~_ojx0LWIPMH)`_&r#1GVn1g+f$(kkiY)aC6(A~= zqUU_)iWv76`5N^KU+fvf`g{ySNA84SDTbH?=F$+G%Sb6^GFEyTR(dQ(M%}q6mjc_9 zYetXdMHHCFS(}MGcM9!ZQ7ejFqKL>5KtYL;#0HAW3!0uPm+5? zJ_XOmEZT4z+Sn?;13!rE>KLbuQB~zChrCRr>l6YFJq1_d(h*mY?5o54N74=nSGW-; z0&=MSC~NX_oVgrlqOv5j15z0nm4j_I-a9QV^M+gQ#m~xoq@8bNb=+(p5-3f}?!Eac zXcP7^1K%FZcd%+rkHA(+qQ>p6SyzAv2F2Oz%#E?@M1;l7ES%xY*M9969AmO_8%szVJLH3psmf9 z#5syb_Zeh4Z&N-sI{Bo_9gawkI6Kk{O0)pxL&b$ok2>^mlY`?WN2C|eO6R=Zo3Zjg zM!TKa%8@S9ks<#8rpJ0YUAH^`M|UBygz`*q=zjn61;Mpzce`E`^)PcB^>%l6JCl*{ zoXQO5b-<4sfozEr-S zcZxpH7%()6Z~i*yHZGq#&|*MVd*cSQ;`Q?m#|C0_+1xeUc$kui?n|68H6KYgt?W(y zep?eraSiUtmoA!tEKY*LRCyZml4m1J{}u$GtckM0LS$bp0lYHhNvQ6og#wB;m0^kJ zVKyBdLAkN+ue*=?P+S45lJ%VqM_g`L>Y?FFpk)#l;mX8hfG9nE@>pYtq5MccOH4Fs za4$H;5d?^n_{fl7w+vAEUqEFIpmGbKvfz85l67m;xum-_ON;iGTCibZBR*`L1;EXU z=DN=kF9tgG&cz9i4sQAC@HF3^5j_kxR z)L!D!^Q~=Uu)nXjr`LBJzKqCVu+N9jNZ*yuU31rYx=4sK&VvTJ!4Pi{A_5DY9@Gtn zVIfjKpNk$Nhd9(MLZMyv0ArQ_W2l1^MFLO`*E#!0-_}xm%eA3B&m(YEzD9mfyKZys zU;nnvAwS5w{{faT_WV0bzj)a+SR3LpD5Ay5!xKeYrh#kjId{7yIvm^IeE-wde}CMz z>m#3Tej%bxTDT(aN32(5_Ve#NeabbL0#B}-KMOA9E9GR_2)__~38f21Y{w#?@X&S? z9(;N0z5n|owi%9AI<~Qw;aGh#>WLHCz4E5umv zKPi|w!903GT5li(CKcVVZj*rYE1WJM>LMbn6Vp)r$v!2zZ!Hmg&uiimJ+S?J+0Bdw zF1kn$kpqE~VBlJ(tjJAR5z5A;8ji85T#7XcDY^TOp4hkTy@P?i6dMAR`KBFK@?`!T zan_Y@B9e`n6%QvfUxd^t1}Uz#7JMk~p3z;l#DQ;H>YHJELJ^DlLgq)b(tPd;b^t`L zR$|pkS6(y(yD;_BIBYh@#kSf=68O+LBygNCcC6uiTg6pz4jCMe@OUq^_n9_rYHDIc zK)sQWker+dB};nf9Ac=zF(xaFl_FI{rIPPx#%GVtrjD-ZyQ7QECiW~<^2t%p-=v-& zeGr}zlYB;AH7s9tsaF+_xQZa5KYa&c?&lw|BA$ty<9s9j|0RL*Ndkn;G2P`XY!${RNWMoLn(AP&u%I9BQzlx8h^Q~?!?mY+8kUSbBTa%n;c>BfY-#+-+w&yle zUBZ~%K$kVcChW(p;KmOWg6F)zHnO!qQVV1?SQ8{ZXR^V~S$|l>)+0(rgk1b0-rJy3 zxAU8d;93gE4d8GK?gDMOLC)7|+<+{lvW@lSbjAuyK8r4nEB(mwZG1aTaML*oE@ z6RhN21ZF&g=pMxuAr`PLa3!^owNEnu%X?HvL*mhB6g-NgPEJj-fMdg4!4lEW3}^B1 z#3^DSuIgC?`M{Cjk z-o*YM-`Cx|bbeLBiNF*m)QyME;ic&o%Vl$aT$tM@j7zr*uvnc(v_!F#xa5S#&c|6V z1>VgB-i^kZC1TBzux4>c$v~JMel?oR%*Dm3KRTPMs1+H?%GI)Jk*&#t_j{>0;#AJ> zpAGfV2k;~O345|iIm;pEhzPmDk~E8gSc9My#l$6)A|w`u0#V~jv7|^Ei_h4v}siwPb4uL5o)8 zf>^o=W)iU`3I$CmoTd4Q-drjdyPk?OF)iw-G2hq}NoVn+jCIK5ddlJppyeSP#2p>s zu+M6pWDZh=sc2=Jm6+jb%#iFAQ!&G-m?1@G+T_deT8zZi`#9&O*?7cV&}fTcuZ+kG zgiWV^ahA2Fc;aDPoypfO6f* zYT%H!b7MF}aUsn`3xDWDE|ylJQ$X17nxxFo|s?)pI#7>2*z8e0+9i>d^92Ug;Luo72eB`Cw_60C$K8?jz< z5R{6zTnti8tNgw3iOnBnXJcnAE-o%m;^(sEY!p-kp)Hk?EtdMaKjX58%9B&@^e^jK zWj^h>C`w}2$xGcVr5N~5$CFTkst~65ngY13NE>kr*QKN&_LQn@0m2mdj}578N#HvG zC~>RS&O$XhH4gC+$Zv=p(d4ZnjK_ABb0pOJqz%iO-5j;~E`^z>5dRfB2()VE$`9qz z?{4ZEX>{KS-_gL}N%T@qG8xbK*@#UppwtEB(^3kylZy*ImWGJww8=Kxq)9e|UT@GN zm-}og;6yM0G6AYoIG-zbsMKIPQ3FxQ5hMd5*$p8DgGhiBT{{0 zQ!BuvV_j3RuG(`JkE7b}t2J#|)zxHm$uXI5TM*0dESzZYwfcMkt2N+rnMcLQERkC1 zj2e*8StCg(zYwXVoSjw60W8RO=&8nDY9}86`_2*+u};_nJ8^gjaq!yd+7u$vCm(vlLZ_0DC>)E@5HU=zzE zu`o&)$s+iYlTR)DHHbbpuh#)%@U8D6?mc?kL$~9e{esFdjG&VE%XK&1f=}VLaHByY zN5e3(lq=`n=Dx(y#4ThkEXYma?m-Z7CHFMf$o-RR#_ulfeQrM&RDw)A9*1l|EasXu zs4k|EOfkx4;)<NR5?_9ff$rjfum%O3)u@>}FGa>e0C)fqS($ysh0lVuJb>~v7-aM@4R8ZE; z=nkBaD~h>Z&%4heN__MC9w`poJvzJmyYc=a?YvNLn<7`W7O-)U!B|8&HwL@|lAt=n9Y3|#Pa| zPPcBpxotC^=~C_k>KN^`ocx=j%;auVJ%^z^l9K7TYuU18uIF510zrlX{{?HXNX@}G;eB)={@0pXj@S0~ z@`u#BrUACNDNDv(l`31zbH9_bxp7mw5C7Jh>37Itx!u zz3n!qv$3(c({~Ehi0$TnUuSdU(xpF|;M<8vb0xDwzwRC1gp!}3@Uw2){Q28he4JA- zn%Jp+r*Qfdv!XJPQr$%OWg6@LbJUQ{ZR~PcCnzE<$n4OMLUs{S&T|@8PicRZrsa;T zw3ArxlWAEF*f=X?2Rz25`K*<*u~tnft18uea%Jxcr*P6wEminY$*&fnqNRZ22F&C` zL{Eg-hhjo*N=j}<-^&%16|eMX-dhOs3H^UzibochiPV z?@`zp^~#PmtsV%NO@i7$8$MsH$u%W_bWNri48UcCF1ftX6sKWfesr33;ur%P=sDE& z?Xfd1g!sk!Zik&nr11yQ2L)wT(7`x-$~A==@PtDQeX#|GBm%TfMghD4YO!>7_J$1; z(yg|MX57Q)4><+iU@}lPs2{u1DFl0cy{8e7XH=`D*nx|7tR4Es10OZ`1%1^K@)7=R zm<1O}DFiWOl|^=d?7>u5f<09&4xKZbZ3pEukzmMKc`Lcb`Gtr;knN%#h$C7Z4l4y3 zQq*Asv;;kB$D8{4OeqpeaXl6vNl%aTm`pwGkx08Mnh!V@V;YAsktP${A6mrt;|Hk2 zGU4Pjmtz}LJEPwgGOxUYGs|791@ztS#2~Ow@ zcnZZ0kH*YR@kqxb22KdYYb$FE4Lf$sf~&~Ow#r^W!i$*wMW8yF2rH)mfnL^(lp<3+ z4K8-sY)EmH_&$TfzTg(}+2QOwFoY%ys8wEO$hD#WPeyJo)6|J#T>+4Z(7XjjU?JGr z3F(oI>e^uL;`uH^db%MJHu2reZV=#S)0H!uq_dg2x=ez>sWHIT?%JSmbSIv*jxl)O zcz6w>-cC8k(D1>35WRZf!^U~2b}<8W_zA(OVDdDWRdVE?2pe8+eBG)#3On0&ac{rn``f$9|<; zs>j*eTs%S%D%iidNjS5Jo6Akc=QZ3KSizZtYn77FpJ9JTk8UFBm8MVB^?3esumEW| zbUe!2dUnskm}W+g2l(ARwmkMI+qX`)ZQHibj5B{c3ssq3jvkMgempa-b=$su`+Sy} zbK%M@W7MFiOuJ(4%+W{psVGFG_LV8Nk@vYC72kqou^oz#+LzWzb2mRJhK?K`A-HOlBTm8!JLOm$%pvgWo6}2ZwNjR00roxz7_Rsz4oWY`1xrb z*1levi*LR_V1SxIXN7(5@2q~E!bIX0&hR7g?KA(3h0(vSj)$xCbo|u|he7?k6z4sD zhIF#f2`@f-4|QO{zwvt4k-fwPD+WS@BNTO9A;qB{BGQgWC8b#LdCFy1WMy5EG10p2 zd6gTAfL&E|Kaku=J-49k=Yd%7O1Sfqj0{`S8SlQG4XB`;514@6CDzqJ7c9Je(H%cb z@cw%XI+gzpqUCS3kG#=_cxee$PQf>EtPys2x{iaco;mi7XD4ZW%J&ct3z6i#M)P9F z*k2dGk6(x13e7G04m{wG_@6>I1p{FPR>W<9O!My}<_yPuML;_=W5BTkqPDG<-w5yUHGKKjt&YeZ6G}sW@NIAAB6QDTZ~i~PY0=yt45ET>Fnh*~G`=Y~HaqAt z`Te!E&5(EHiG_<-%|)rGx1!RypY$I39G9DGc^8J9x6>BS0k8au8^`6)fi%im%bGR0 zx!HC*{!O)wx0o$skafG}{|Uy6W{h;i5Bva7o|ft>Dk@*_rsS?JWVP6bbkyos=cagH zsH~_^oV>aX)gJ^?avv;+`lZWs_gs|{{GfWnEfA$E74u80BH>Uqm^ab5=3$s>sCxDr z_`6L6wS4a~KUmGz-}W3m+T-&d>p5~1wF2;s-`~1#|JU9=&WI|b1HE3)fA+P)vKNsM zSEA#!MuS0?4H82C&$or1(47ehhGeu*n_+{iB=3rh>GsJsn=O6H^o%R=3X6(tw&Hm= zX4))Nv@c{BXUqKIykgtqkRjf?2&T4dC(jSRh%|D1fTsZe$`I#>>&h?^{8RT;Y*&oL zbCI{Py+CiFnH3N1DB4)qQTU}dg|``j<*~hN1eTL6fEgTIwi0Nq2{f_Xp$qVR#4j>E zz6eP8H~e(kWk&21x`UDS+qMovLh z!!tPF9R!2fjv)4OA<#wWGjs*0rv&UNN4^iC&xkP)6yq_5c;HVw)?L`qObAr2Sy8HD zP`O}LPzX#Lm$;UVSK6dSgR_5#=Mt~rGcJK+24apjBcrXY5v61l zIVSP(552<7c@S@AO$dkU>hhH^vIk9QAkpw%yEl|PIRg*jZ21KsT}lH0^inND+QK%!6mCf>4>^K1YW6$iJzfG1u~B0oqF_7HTO! z;zb{xoA@0<;VkwKMY&=S{MYl@!j63TCK#c-Fn6og>}=u5miD7(5UqI>A;-3oIZ)K= zNgq_GG;Ht*4?1j--EcbmXM_@4c-Mwl{^o{VVb`l#-6+(_ zNtKdp6UHSO29bLG&5=G7&l)?yCMDuOM#by2I-Q1TbXu)T0|UPaA;qfWI)5oj^j`*kRulv47r{I#MUdj?dMow>S#>1 zm3*u)b(^uIr{`x(oi;VoKJRi(_h;2ryL*p*yy+%LnF}D=FM)&SPN=Gj;XTQv=9eOK zQhceOJqVeUI(TgdL*5Z*jguig-I#pi6|mi>%mMu0j{fgUIMeS=XlwJGIO6$gXH)YB zhr@I7;7@Pnmm4PD47s)qEE`=)ag1WeaOZ>grUNeffCyn850lgJ=&Pb$2KdW3;gpmA zNZbqKEBnC71=t**Ktc5XFT=Sr;GWPehKv4X_4k!j}C^i*3$8Ysu;Q(-?$XywBQ!guq^oTcu>qJ9Paf7x~S*SV8r9WxBELh zZnTSkL>L4$CXcS)jfx#QHSazi>o$_B5PyRg4*}SYNE`SHm&w&Z>LgA8!=myA^8@~} z1Q8mcQrh!Jf5@e@plT!&idz8OY#{~gDET&cQK<;3HbI+JyST(W_^fVjq!ZHMrPwNM z$`QaKmBwv>PXC_|UwW*fb1t^eZ21cLlBfLUcrSN>V}OVC1+w z1!|`IjiXNP6Zb4^XgL2O$099}T@u&1b)M4wXbl?ul`6-tpd+n7xcQr4xy$Eq9z^i| zmiqwjbiBmPK`zOwS{Ml@W&CIXkSoBlxq7HC8Qc$}WxA%~jFV&*!Lg4WS@&#^Wajr1OGuG0(8vB=R4sSsHk?;!7j6J zf9J8jkbaaoVX&{a`{4ezy@G*1L+y;d?e6LA^PdRmTquwc4xT|BWVp(>3dEZL>mn6) zo?kLABRMfaui-T&^Qgqp_QEARZyGZJ6|}~{j&2z@VXO&xu^M5W24;7@44=T(G%9`+ zV2u}Gjnjd*(?J`oz_H|_qL!Abs-jdMFtm4KQB~36HPL8d;U`5^z%3`SqiV>!6;Hp_ z`eiRjrs^#DrFK)R4y)kOR8}rpq;L>J#j8AOx$v)6%w@X}B~c2ikwH0%!*6jga8W_^#bg!`Ou~cx_!_o6Y8` zc8*C&=|$0yzWyK_MzC0UkM(nC-RN2;48Tru#;uV)wh0y(N2PcSHqByI za>fOzTE+WuHja(AskXzIWD&IzvLXk94VtTbD3}kqPKte9iH6r~DL7_^$O>UsYJj(5%7#Trsq3cbaWm|`&qAtjwyBZ`@sWNTa|U&GmK zRL*%3aP%(uCJ}L5EUYLfnuq?;)QC_hm?B&(teW_-%6#L-bq@KDE`2a47+?st6`+l@ zfe1AfF@c-k&MksTv=BQoo4b;`nwt#*UJqFWc5)m$`9EZYVdueT7ZVETomQI<+g3W* z+fbddw6(RbeKDp`-6?PrP!bpi7X@C)X@CXS6i)7X!}Y8w(%pSD&>x849omfnZz(B( zqv&?y1kvQy^QXgLnt~nm4zy0rZg=bLcJ#Lsk|(*IRacfGK&}U*2-~UKoEebHi*!f2 zh0UAav_mokTEKzc^UJ1!n66=$=2Oe-2aIIV`jg2>S zwa-J&P#5fxR=%2V;8z1OyAbAF2?|5kStM@xauQ(ku;&-LhfGzRn5E7+H&=PrW{IdC zD7rQ#k^K(zHQ4J9;tds}bgqqV$gQXlhlC1=>*{i=wG(61oyUC0nxVvwa+Tl@VwAdb zjTl22NPB2Fc62SEunACDf%C~aumn&LP)jl^hYGr^vRA&}rMcAMa9IA+TwL7joeJYz zX0ZMBs&$pQ*Oz@8KOPN}8MVH}Yy1I9TW;UJ zeJ^i!JQ%II#4VpDaf1k)Qx~y-|E!YCv9^aG?()V2gK< z^WTi$H&O6^^-oaUVtTNB$Fq;1EWT1!$R$LyW}~J|fDN^K;zK9>fk>Fi$Nfi6 zx+eur56YW;g+X+HLJ6Nq;|vn&s3w{d6QI-U1=w^LAL>(z?jxk# zC1?ixrw7Y~@G1YPa5*fT&Ujsd*`&dFN#?O8_f=+N{OA9Z#Su-c4B+LC_IF=HP zeE8(CW4>cOJ^sKM9s~${=CnQ>{s!gOcwzYNNhzqPkFgs~MvR^A9`FSYqxdJP9O~oT z>JFQNFx|HqG=Z;2-%*4oUurY8r9{x=YegzCuDPg2bq0xPU(hwQ)G@ZM6XBF%&lID|7 z9(cfsdM*-6mAJKQ-3g|siw2X&CkGU=%z!=PCryhE{&5#6jH(Js**5l`vX83tSNH?X)ip0pRbuKY=O`T7 zEN5e4&GZ?}4wK8(Bgf~g@+Gw!X@cWZ5ZP2*s*SG zr%?Z?0XJvVJ(h&(`av{^KizxOXV6CiN51wrIWu5KHUvQ;d%sc(PmLkW1{|pqBXxjF z1so~PG2UVkxa8^6(B@&`!UFJt2hoIkh33y4uwlS(uZDBn&qC_zAD)K^Zm?Q*dj$cr75 zA7M?Xd~JWfAu+`vmvD^`8SjKu;4Vav-p{RP6a$U`C~8c9n|zae54T|}GD+JczUlS0 zG6O0%U!QwrmfbrCmikJ$6@licH;u@7kz39ju;_`iu`TF$MT!2bmK@x6iC=ZwgJOAk^1$S_mUt9R&i;FrB20un6l9 zmW>W0PI9b;Qc#P+VY3nY1}CXINyq>#{6P4pWe6|{Lt;gW9 zI$_J52RY{hVsSWjLkZ92Yyia*Jc@&oC#@aK21SQ>n+^K^LMe&tK&Ai~IDUG1! zzC)gMsuz1I)@=&*3DN7Aoi$IsQFfS8Qi8#vqUvfY)&{hk4R*8;O2tCNuYqEh8}y8$ z^gN!20~($qGj`5)_*+n68;sjYJBQUN+XO07-Ps!m1p9H;hp-GBzCIguSYZYU|oDEC>k3ie-CNh0OT5YOU+p0A+DertWRK$&9 zG934N;6v@Emp$|X{ZBC`7={UY4ZM<`BfCstwP*+*mRzhdk)HSDM$cz-%Qx z(E`)n9&o^?4ENu8y~%X7qwx2n3O=Q|A`rl^k-Wn-fh72#K4g^6Liloxay-S#;vXoj zu6wry+aX}hSVt7CdGw+ir`c?_Dbp{@!Y(5hf6|Rh^T1u(G-4$v+H(_;uw=Tb&}OOF?C$B*?;oXX$0F1 z@VWiJpk7%Yi?fl zJy7SwO4kb$`*phh3&S0v+__LswFH9}gq@ui@+gAxf(pB<0lOaqc2fYm7*L)s8J&%8QE1604JO`rPLIap8! zqq#iAdg~k}fqHHO%D_(rGFQj1wBB9-we1WG!d55<4lV;bj?l5ahHR3m@$nb(AL5^^ zS-Pn3YSb$x1q*7BOhAith^uOEH1t87s!FWeTGo6fl#_bRB-V?%O{^7?Dih@ zc@KAg^7-eV?*8DzJzpH?K5(F$@P*T9ow^7`GH@tl$ZIMl_&gnZKgO8%esQ29JaGCH zf_#o2@dkaqAkL5CBFX=Y&cP?aVzJx#0wweLZT3piAB#(7U6v4uOuXg(rA0SbdA>Uj zHv2lnfAvcsa1dRcqt6Q`5QV0uMYE!jJ$K74c}?6Khx(EojJ+bNXm;!tzFAX>+!vVF~aK0VOcb=ceWP3N9ZKmGRyJKx*= z*}l$w`#OP2=K^hF7(ojc1{`il_OVGej!m{PNcw7gB6(-^DC|WvTHuSS(hFd%4Z|o4 ziw!D#5oI3wZ)Tar<*>!v8nyue*v&u=<=3f-STRv6_73U&vG~TuO`Fu;#zxm;5@)l~ z?>bfUxB_Fz!dQrFkOhijCF9}x!%)=mpJ1O^H&8FRuT5`aPxhO#i&Tp&^gKk<8VX6++g$3>bHr{A*2pG0P;~Q!12mqk@cT zI(C1@bUYL~szbAw!M%-76~VZqFgI4qYSlnuLwRi@MQg)SP*!EHdqXdzdKGM~VORv6S(Y3~9+T6YoH=%TP0vRt}0r(OU&0)AYG z6CMW8!(%T1oOPR3I)5E-X*O_)b_8`gAP>X^VZ#G9t_wrO^?gv$Y{+ISz7H0zi@;(C zPgd00XLdGYc@t0t}2D9jylrA3NUb4~OPJ z*1ZufrW;W9;#YF5{0n2Gb;}b^JW=~O48?g=uty(BzH;{LIin*Ea@HzgS*pe2cl^^Y zRKmgoy058u^;6$PaLT0^taNLZ-~E%)(#3O?O}8AmV!!0BX2+qvH8LMp{2TJcLxRV@ ze`iz-!suwRo1!QmU2_@&GxA)YbhIMs) zbi<}g#y;b2bw_^R4Vg0B=I?=<4SU)}O>P?%fNQ&oLw-kcTC_$d`gPIpXB9$6N z`qnNXC1w1#tt9Eg6XP^hRM_q8BIL0WDYvjXbM>g`fp<9wN6w#w&l5}upWlqM&PAm4 zK;f&xrz;|-Bl{!mk^S;Sc@ZCkoySSxw)MQn12fS@sevnMOBhvHXtR9>>~X_jcWrS_ z=BAZd0KyBBBCdIzdi^zEZVKb8B@kt zOgh1!3;De#wYvWP6Q_0Y8r0xGi~@H8F08T1PLxQNxP*8oXG)N`o?hrhL05*w@3$BX zmZ^68ID;V^?D^XBb=Ps2R3jRAo5MkaPQV8qiy^(N(rt=P7-dsqj3{|XM>1#h@Jz+c zFaX%oH5+#v0^}@~GENi=lz@>}*>k2p{o=OkX3UrYZkKlRFA8BY*^d0=y=*V+_K*Re zpUA_EZA}?v)D9qO5}90y*cGJa3wU9?^!&JR7%GX!*B8`a!@zuWSW|Ijm^loy%2dGN>&!D z6z(ndeu!)`VpTtpAB=m=<2eywr8{<%x{O6*yP*8HwV$@mr>wdLc>U@czD}~iJu3KE8X0y`o*+-i}Cn6eE-*K^~ja)uDrPYm(D^E^_SRmUm~dKVSd@NwS{nukQ&p# z9#6O<+tRlaTlVjJz24m$0T7KPC&%J?WqM*tJc^emB^!dLLP%d6Wu0Qb>Jm$01nsWj zyFN*o`vL-p&G4!P;7A^a&8UMz7oGOFQOW9N6;{Uk{7}CeKJbw0n0gY`QQ`D90a+wflO4==&J*?Ra<&Y@(M& zH;4_y>_(^}Dr&x9{BMGmk@S$RzaK`_~sfr=e$WONVLV7>$sxP_hl0o6Q}6 zE`M z!QFUGW4%~|%J|zNJBd1fno(N1b`Ao|U`tYtCK&fBb<3~9t}_?R#X}m9Pm+!p1@)MX z@L-aMp~xY)ac0h(k}_RqeMQNQljEI+f#ZkTORh18!}$uuUabigx2MuTRZDDxW>rbY z-wRrVAdK2*`gxHx)C9izVaU4p!9vhA71f^6u3Bsh?W%F@yuO=pGV*;QAR&TA!-qq` z0nT8GL!Z5%phs`?^z;d%givqiA%$?W1nZRaDQStUAKldv9|1$7ie_>|;?ZWuN#c*h zAq^Ko47sPBFhWS6C{DD>p}*ZayC7)e63k_~fj*zfsMEN#k%1su@kps?p%XC$g%sl6 z$);dmH<-ndATy^-w!2=%{T@}R(4T;j>w%GX0V9c*&jm&@tFp&NJ=@%TbV9}7dlT_9 z*wOrQ0kW=?%9Hx1o`Ot!V)vsl_rh)RZ!}LmFQQlDVw_P-4P?tDDdC&FdzbtqLl8{k z?MRq%8YbVoc*&A|`;7k+P5IO;6f)nVZNC_J_j8aUlTIVJ^lh+agu~u8_(S!#gXj7E z(|E+?NUh!YnLf&^|%X8R5y->-33Z##$_qh%P1FmY$5D@E+e$U#~Gv zug8t3X@V0)im>vy3-0Aa3?rezr8-@lDbe2-<`Hog0T2;prr}r*8n2EW*uQW8NmImf z+04x8_OOi9s@RRV@7_qo3F0m>`K|;wL9wXjl*8{JyKdX3k(5bOfKxZ-=A$|Z4q-!o z>ZLy|fXPld;(k4ATE^8kmE_;H)`1R3#cUr~%NUa9+sM;FK8=Us9$a#p{hN=Pn$VYoglhIaaxO$m ze)zS=tEwJ%q0sIIh)`m_6!@&Xf41?Y{${aW| zc-j}_1OsBJ0)g<@X=&3YZ~?Qv|ETBSp|8J!`yEb{p!6(hJLQBLitP4FtmAL6xAU;K z$+CSl?QMjZtw8;yHHL;ZE(4a3z@Oo^RPv4pOw=)IjzT%-(1s*piK5cg|7`Ds{ip#0 zK8S8?ii%{|(i5D12W+Zcv62}MCK^26!zaRWP^*W8m*`@R`5^aSvxZT>aG2i`Me#Z0 z#Tx4Bwr`)OumQ3djpc0c397>L%i5n64!-p=WCORvQCQG(s6j&#e;4%FwYlbo*{USN zEbszC5CnI#!wK5l_|_p42MI7^v1?RY+lPMx*KcU?^d$jLi)JZ!rN)DAH$Xeh9)HTy zggkR)YTV=7UFC3#GkLwbDJ!Og!>12@-uBrcg!YV?U^XKh&;l1_ICwe)SK1)O2cvsQ zIm(1psk^TN^N?kAZlon@o0{62cK@XijczD(>^^yw>GAiwI{QXVwoU43`oyEq zSbcVOWu+Y&Hu%5D`9e-~;}H^)M;VQIU_igpJmWFK1FC8kk5j0f0T_-y-I}FK=l`e( z+r0{IYf9@6bBVyM8e>-W1nR11K})`2+bZJY`KBh|TC);DY^MK7Z+b8bhT`KR1|CfvaPj?pPn&24U7iBDug{HYDbUK z{q>A{M3)?jJJH)8k;d{`fs1r?`9gf+#I%VPG;L&&l#~e0)u3taK!5+4L6-(C?gS?r zd_?0zDN`v)YY_DKzi`TU3j#V1dyn+EQ4GSZ67hA!Mpz`8=`I4|Re*RQAWrp%Zvey- zEji1JEHf_0R=7OBk5sq!{Ea84pBRvar-@;rGOCfe-@hhU(6>%I1EkGLw=&yw$t$dO}mNyIDP%=IoQ07<2z%y`Q+fvr&M zwj93(871$4!&wGJ4b3>i<^P?O&8ngngv?zgqCoSN~D-JxAmtkSh;fL&q`*`zLT=X z-v%M?VP7H6XVr|zzUScD8?|N2_JjS#>;(%JUEFmRjY)Z18^?MJYk^_9}*!HABL$mh*c0O7MTn21`Sk<^D_}he2C#Z4;$KR-QQRl-m;4x5_d6_MIU{e&x zTvaOwK5E$FSWK^6<0=ZZI>t`3j}2>nbp5QtS^2l3A@;xE$vck!SOq?FnS86}rLNJx z&IdznV1L&vPw4t<9#W7l6Pa1U{;%YkQ-~Fyz#zNHX|QDoz5wDkb~xnUYY;QnUWlA- zRnEViZ)6KdFjFz+Ni@e(_BvlEG~^Mp&@5WCT>-Jd{{6`g5TSZxKLUso^vG|Q!LCdekx)gP&TaxZigcw7pW;Cs&Kin zB-oG7NqkBGT^!MC%7ls@IxMhrbRQZNvd|G+@NIyZCSo^^H@N<$@PI#J>cIxWXa5rgP!meHWPjjxs%8I{q z2pNliyK43QH|OLc&V7x%dbD7^^2hft|3z_XxU+FX)swG$+Q-&_9f-PJO|L#)4(p4g z2Ix8kY#E3?8nX!+hA}gZm;h_av25(NaA_9^u_c>d;bg7f97|(1pBxfpZ~X zg_AOPbV3iopo%7NVT1n6v2VRy-N^Y$NwcPI&aZr;(p}k{mBsqk@JO+w z=!W5LHWU*P%TA}bb2TOcHO6onK@uy5^Q{u*E(aPgOP#(V0u3p)E)|E(o z9(m=+y0JzZGNNr!>{!sr1ynroWFxFk_7k02?q#@nqs<`R*+VJR*)_y2+;L-x6%#D)u)$Z9bUmY+zv|qQ{15dcQAVW@7BH1 z`1+3K<|iHUFE1CxigjB)?KU{>DZTqfqt6@ccyC)nL&MAO`@G(8Qtlm#Zl4j@^Bhu$ za&oS<>k;QP3Ua7!JZfm8t>u+DIrV6*yFyV{7wgN~jMv|{YUK)Pl;zTEvnE^vkqTzI zLx!yT@>PY6TYZ%i(GIY7EGoX`W=P_S*ax}bFVITff{fCp=%D*qW5REW65e^d>hWjZ z_btk~WFGnR$lUsO*l~mr*XVB96&Ur zsjIq%%5>G?z9g6W*>=s+ob=sM{RZjWmrd}u{T&h?&h>8-XUjK73umPxaCo7_i*Nhg zdKe9+hdMukQm)tx%nwypceFI%qSrs`Jef2lJzWii{ue5`J{G_B7kSgBO+(n(?JL$6 zqXxR_DBKGB^crMKr?WN4P)7|O*SpfS1K1y&ED)U;`EBG{5m`ruKY5BG}GGo&{8{WuMkU%L(*IPlds-IAvF zG`a%7X!#=J9#`>b0`SNNJQ@Q$q8NCpd%&p6kD+&2{WH(Zo{bDqGR7caonqEm10`14 zQ317*yhtRe=aMv!G$IfF!Hp|25lz?VwF0Ib==!coQ3xL(dWvUPO7KQPNMb>JO?$Wj z&nLgh19<+g@ci5Hd~WmR+mQ-i3b)4!n2(nrHtY_B@>(Lhm7`mpgl}e0aWmzx%X#vW zc=35u#@Sl;k>CIN=Gl?GbjTV6Y%Gyi>)z?@?LGGGKMJ53-Xd!vd*O#`l5|k)B9YSp z)!e^@;n3b`{Oa|m;doptyt2phRj)JQ_(2cE<&&ZQ;uHOO_FR{Z20~>@#lXB`!@S`};?*o;7aoodAVI5o=3a717js;vgSoUdH7i*%& zQ*g>{05(6y{)%Fwbo>r2l}#{LKC2i>$xvF$4&uJExZiWIej|C>@Cni|Bl^U06cIv= z07Rv1+11K&7S6pkBLgO*{(uyB?7+VE_EU$8O70;8DcM$cv5j%1B}G^Cz0=U}&84m% z;rTmZ5T~O9=FwN-6;aFQyasqwvq$x7AN<)R!M;zR3jUssxMy1Xf}?-9xb)s%KsiYY z20YuJ-~4>zfxe(AYi{w)SD9Ro>0yDAS%@s1VQ9SQFU${yLZDZ!YYnLeY9je))6;)8>-gx<W8byrqs%TI1HOyQyOn>0iH`RP#yvtxL8%U-$NB2RvHng>y=0Z#CvFEI=te zi~m3)YW(Ry-P(V{8KmW%qvTWG zq|6Ldsu-^e>Fmg}72*))u{2**|Fm~!26pb;>0$vYhEdIy0(+=-H;P>f_hoWBs>z;1kPm#xePx!%RF6zq7@vL+ee^wSO^@yh^x?S$9+mTK%=tliMA zMM$D+f&o=8&m7y|^3IF3FTUN@^7eBNi=z1C>&>6{MB<#<_=#8M-iqiA!uE=U|6Q1y zTk=yB9L=4H3akjBfN7O;X*qJXV}rnNrWi^p#__ztVA6&9k9BwL?FzEfQ2oL@thng> zFet@qH8Q&2^>uf84xf_Z1|mA-ex5ne*XIH;Wg3Jag@CAnF;UOUPA#WT7?r4VaRUQ{ zYlLUz($#+d@qSK79Gfy$9|*%EJAmSLgG?iEGAza+=zL^3hC>i-pgo?iy8}UVlpsz| z79827#b&@!35)~+0c$H1x@WYhdLYSBq=^mbf%onk(gT;VHKYeZFhYnxKVC-YfSUn@ zXMlhA;QF8A`h~#1xNW<>!AK@tF}^d8j9}d6hYL_0feIeX62xtL1AzicnnBXguZ2yW zmdpu~!1ynLYj z#VBqjKI!v)+jEKyp(H|8f?n_Czl$QJPDRR8mucyo@qkpyOj~f*E=1Nm$GW)$P_zUl zak(f24YM(^jZwE>c}+0$#>vRLO(|Md@WZE(>})eOBDjCb`d6Di z{WhdU@uEP$+t&Q%^EEYXg7ED&M3AjPKCW*3%$yQfvs}#0+~$?Hqzi(r=$wstJNY!SjUxVA~G;iYY&IxlZ>Eodef*xqu}IE96l;> z-}bnfu+EtbHxe43C^Hz;87vd6R-MET41}HkhqdMYitcTDk&AUyv7zO8MV~1Wv$!G7VF-bJK&!vscf^BjEstmH7YVJGBPr9S=Ti( zQZiJ;QPD;malm2b`#ty0D4Op3e((2j92f`AJ?A{F`a-%MT6M9EC-UOUV z))YKJ&Sx|mcuBT_8}PSWGcvM29KC$Qh7DgI_YImSrO5RI|1|CkcFnzu?@N!@QRJX* zQtpDBalXCpRp%|5pWyrP6I|!;c6mbeY%@Dbw%(-V;hxhtq`VrN^p6Poy@hgupq2>< zpnSgMMPaNH3QVTqQFL1*f>Mr3kW>X3vx_ni;|QbECigy7 z{?xOd`hY%-K48aRLSpDI{C@Lq(s2nkYHDBnu-lvPKnB>mwd_UpZ&PO!!1*4B{EC!G z!eGFq_8mRu_ummFiN-%npKusdQfC6iQ@6wIK=uR`HhVlL&$_fAk=&pfu6YO`Khw3N zd1HC_X1${9<&U;+uV1%rUH!IQhfaFEfjIGUj8M3k@50Bk($@tkoQ$!7{z53WMecM8tU3fK4wcA0L! zx!7gWNt3sW`k9)49rgQ_yqAweJ@fh5z~KIm)^FWBcDuw!}Paj2Y)aS#SZh52q>^1VH zCrq3ac4;si4|24eg+mwY$_(UjO2-qp(F0F9_6 znKQFt^So``68Zlk10wtyE;GO8zPFIA`Uqghj2=(al@nRY?~01%PPu`IkNVj6`~3c~ zVUlC{!}M`SfJL|{732W%0f{+}2AW#j6C=mRxqt$M2NBxy{vkow4Y^}eOWWa7y}jV- z`@45;tAjUJ$?yS`WE+u`dh??E{F}$YmPJ&^MNNBm>Qswn0EqChb4n0NJOjrOa0a!e zHriky0YS|T1VSOA2d4%#!$!u($AORqIZ4Zr)*GrN=f|muiQ~o~8Sj;LyZ!p)D{Yp9 z1jPSMNxm|1LLzc`PMv!7#IbQ86!GK7kDokcGT4~OlMtFYnI$n zqR=15eHOUto`s8k6)Rw%L}7f+9ob{N-~GKR_wKpz-n}2KU%wv7P#))>ZbFWYZ4f(L zQ3o2f90X-k>)>5l3jVo*J*R*2!N>kTQVXuQ_%>u#nZhODf--}t*Kj5-g|o3<7_7HK z@UCWSRYmh|S(*VBtCIaq`@8W0-t)!AMv6p#!<;{T;Q2Mrzw~7QcCqF_{qhydk67^By{6R_49RS`(i97bSZd;4s}hh7`juHPIb)7m-Nsv!|Bs|c8zDW?XHSjt?A-nD?X5fiwX4l@=*WrVM-O}c zPqfGhov-XRgX#oGjr8#qJxmAo3(1=Ooj-JR>^*SI`+p`@pM|Zbq$i5#tj=q_H{b>% zefe7AY{6hziOV`6T|!$P;n5U5`;BrxzWV=NuR^6)>*acpUd>>;C=-#LZ4{{=Zf>5k zM3j)OT$!jhJW=HgM)c$t%oKTml)%@k^C~fJLhE_NuC|hGyhPyHg#r9kV9-f~VsxqlRgttyaI^%CXx%TAMNCnHC5C#!^&Rd~BqUjT2x=RtHDpvWkT z%ez+NO`a5M8l?~Pc#j5Def!%wU~YwpQp$kZq>VL1W&d(?fBV*VYpPzH2Ng#VF2i4f zG^QcJ^CHN4zlVe^x}SN!y?5k{I|^pWeV`kY+^WD?#y>0Yutp88oEQumA0Yl3|cae+&%9!!L~utZ-i8 z?dd&r)|6neKm%pcB9Es|1^7dPKwNnLnX?d}Iyxi>FoGH)Fq{~1P{A%R_^*SXWMB$7 zMV6tOAh%!_Cu0{Ww+qErSxBq6W)1AmYo0@h)LLlTLhViK%HjLTiX=Wjc@q1LsZK64 zf0iP>0#S-2C8oN*exAGs?NEU9LAB?XU2QN5yiA%6nM)}M!;7PfJXg&U-`aZA#UJws zPF6);u4cL2z*b4TMHJE-wUxE=v`3a5J%o5cl6_T7UgB_&?yV%d%8f{fV(JHxUYTY<@)m)&$kT1bkEXssjX zh6l7{&waiYfC-=T2CPdyLYT^z{%P$1(S>KL`I3wyz@OCQhM}U zs>j6?NS+rod*b<-)nHNQD3DyzU0xCOjEqI}HQW=lOP-%+$Y_egdw5ls8PRoaM3zio zJU1e$nwFl2;m<~d5=kDo@pfruSaZpg49I|Ic6(3rFj@*Se`&~}%J)VV>Vq05kySwehlwvbV|eg_1;4 zrYx_Oo)DSwxqFtLu#t9@23Jr)8JwOnbiLF&=2GL!_&~jr8G&lZ=$fIU4~5sc(N!Ko z3hJz2MP%ssi+c{mrtlsSVqk(6@R^YfasoFlH)q0+C{O}X<(Y?`vOSBpSi*BQ17bF* zi~|w?Lqtv>5cViO0g=Er(Agz-+5^R;87!SpioXB-ohV}JHVLV=n zeO-=yy#cGE{7B@#gc@y`6pV zB>fk~7x7DE-3Q*~C z1y^Itkgu~2?%@teOCe`z=FW(ZlJH8WISmeR?=d-O4W3d<3=TN+y(k;S>U89F4yb&5 zRC;@2uffpkqc|`Gg{cHzU;lu=-+$WBGdRp*9VPS_PQhpR*dVwq3Mk+ZV8Fwr910&& zougt9$4gqu{$Td`2VK@dzt0Q<6~2r5 zXU5*C>}%Gbs?ZWJFMq-Jg3uDps=qg#w%Zx3Mo#A(L|U$pJ-~CZt65x+&&4|N8;N=6 zBTbu$i-p^;pNnFrh)e>UsI#GR^m-u$3FysgunlCVXo9A?R%406?K>j}e1QlbEXte@-BobC}gO)`n!kFs})`7Wti= z&&%tI+*lW!INaB?f>M!E{9-clnRB6!a^?)S3pwPoPoh z=D%>%a%EIvAkraiD&xw-Dz{do*9A8SS2v^=^PpFlV>mzG$Qm!~2QsLv(Wk6&Xt(p@ zMX2F9+QK~?=?5Uu9Dm+#=v^71zw)A3Jw{aCwF5fmu5&OD=Vwd3Bcoo}`+fA5$>6zR zWhP<>gf2gFS$JfYNBeSaWH1uvM;;2N$jBl*kHc_UI%K^f12^$M^|VELrd-eyOvU-0 zLve}jjfm{TZY5k&JbjSt7IVIkvmhvP0ch>n&-d#5+|S|h%*YHPWgySbfM6EEMd}&B z=5*E)*)8OICS+8KNb(f59p_ZaefyO)#z1Li%}u zzrC$11JtmP6GUhgRsG0_V;}T!YmuVkUW85}CW7mMf@ELY90;i&K-{FZi8UZ6@Bs6q z2OU8N9N9}ke^x!eA$RF~I1E?eMybag(gqnyiNW}Ut<%(R#9i_l!r_-e`YZ{F2*`0b zL1SEZ6 zAbBj6iyaH6Nj|V?lUx29+AVl6gP1GvX9a*cSptOW#{G5AQf@1_280sho=3Wpu4AYB z{b!Eu*i`dM+s>VB4RetAF%z+7v!N4S6?%Mx)9o&;`f5+s^|xfrH*R0I0~RP1Tjykb z%)%ZR{FvZ7@7;Zo6!JPo=UK_eT>v~ymjg? zCl4GvB0=xNFZt~Qvk}|W&S9ni{?oD3v$Io$ei$*$$*`GcW@l&qVLmoU$(Hvr2CD(g zcj2P`7kgc|D6R7&WD@9sEdx1=d3eKsQLILd5(lMFmRnBDi_Hwd%+Mcfe!XtzDHq?@ z(-XeCRO@{+3LWsfRi5rPJhot>MsP%rNsNgzEQ6LoHOH*!k>+BwT5Ke>4ZyuJ-6IPY zESNd-hT9&S0}!vr17r^w_DxJy*0gEA7{_^byi>jIMR7i?%l9D)Y8tq#naJF74{qv* zQAnahEw1{cYh;%6$@PKwk+!jMYPdU-qlgNjhl6KP^9s;s?$A3kN*3^hQ@9G z+_Ck8t=qQwcp+L1M--?d5Q{iaD)2BM@GD4{Jjgi>>XW|SGcaHU&kBCdsS1LuxZ?)) z{eZL&C;Avn5=h;D%8NgNQ67=Fs6yu*)D4I2{fZH>MvW6HYc(ov^X8G!u-;0aC=_l1 zc7}3zQIz@wU=ihcOAmGhyO6pzoj5`s5kX7s&DP1-uKHU5IzFGm#6|80SPWV#aBzM}4k~nVCup zD!%~+_!{sY?>=zgP&k3TTlgJ#?`5$iFwk{1{m zhVb;*uDv~YW=z85WUB%D6c{wvC~)~^FyuEY{s_YI-PYvAr1`3n+w+{G)2#-t{%v&T z?U=y3@Y_;KfxLj<{~c6lCHpgb4fGBU-H5?>TeT=9>VsKwSreqJRlUPa|L<8iRG@m$ z>#%&M$R`;FT^e66jA&!kE_Qo5+s!5NId}fWfrl&MzzwR$)6xz&5b-9{lF$-vdnc?4 zi3Z`C0wiiIoE7Ky?SwK=<`hR%Y})DVY9ZIIO&vb}@L!<-tvx}&pG)fy$TJxs;sVUL zaVAt*=2bf5FfFe+dSHL|(e8ss2LwKDO6tt(Cun@AH(}`biLA7t!BZaiZ3Q5bw1uGieK;%BD|;0>p{pr`a*dwN$v*?^<{cR?tVC@qNk#hkU0zgHm*z2 zWEt`~1WwyS(`hs?YDjkv4-9#(4*|z0hLmi7RI!F)52IQ(zfoD4zi8O5x97l|ryQ<3 z5a(VP)llVp#%m@92q7>XZj98)e0L#2Ybm0o4EOgygXEId`(8B<<^`0w!QCG zKeu+>+VYPzLjAh0+q=wDQbtDE{Q4Nw?a7ACHU?+ky`HL`^36n<*0t6Pzw6faSWyS%1R_s@d3(FjC+HukZC znPXX+X;PAYlp!HbXY%q|cRJC9*rJTYM0snRwou5yBz|P##Drik{C$7e8#pGa+hXVjCaU)GafIoZc_|ap>dybwA z1--|6`v&NsBeWc;2c(r6{~1QrWXd7QfaVS$}~QS_G~5gY&!Og;(k%4oatZ-I!GC& z&YO{y0PADm%$WnhX7aL=;jR{24ZYVOc}o>F{!bHybos3y>0yjYysh~DTkc%Ch}=Iv zl&`lBK{ZyZif^AZ!XYOOiDLWNt5LFL*ms~OpkdnhD-b23M-mcVQVH>9eW?a~J3lZmh+r`k2!_i5tX?|32L5Wg z<)xZ{*W)>H8u7x2C!)D)bn&3=NH-tlKZ?ypY=38``(5SqWn(8PTWBJ7G7&o|--nc3 zgKuf+%!0j@+8Eq^@zAW;LQ_z0DIVs9yHr)3onVwT;cL(}7l`TtL=<<%yimTnYY^!3 zF)G|h>0B0<1r12*EnL3bW}~u%ox1}riMeoW{1p@_$?OY0H5CkZ72SXEFmjR0*>;d- z1>~@ga?K}Pkh@s9WS1|%a~EIT>j3K;H7i_0r1-UF`Qj70dwP!c969U>YV|rp-vKyj zA*8aD2`*0UmxcxR?E{Uqj86o3MqB)6k+#Dkt(B?LoG@G_0WQA)Tquib^vv>SRZ`CWd4{(NPrzUXR)7yRc z6rS%z;JArTRxfUfW>d4xc@;Bzz@28*bK35gTN#K1QV zw18K`sdA8FltTe2oY98v8M-enh{wUI^tfL5Cd?i`!anPMS?s#NYC-b(g+1Std&)P| zf9M;LcB${s`z9S*q7Q3MfJDqhniB|`@SRgcH>5Bln(*yrW? zON@;u3wiA73&vIyOy_or=6#8=tIm(@xnOMYmluppIHLa9PLHRNT^EdNJl9b^ftSXu znaYeCFX%}KtSndV8R16=S`_tk&dO4#59>m>HWO(=kb4SyEW>XL9IY`?4%WeN%+saE z599VWWqgEe(%va5g$p3|Gu*bb0}8b5At8(>;gb>W4Teab{blf^BfM7)7p(lEy}Id~Sdge-MMXtA#L(6R5^zuUXx{dthbGeg%woTR|dI}x6{7~db~D-no+a$%XM z<}x{?rzXm2uJqX;NrEPLV$b)-T`@i1G`IZg$f*Ml{Py}&ZAb|9K=|hQovPZK0$))% z>X=(H!+jgES`fnGP=4ff?hCF(ZlB}*16&F_#FlIBge^JyMpF*7W0O$ux{xbEy9xgF zDbOu{L+k-0<|Ev1xDDKEklD~6rx~2!W^>u|aJ(7;+Q_?%(W58WlCMHB+ug_Ywv=TV z%FU(vol)qR4MMEss~R5cf=prMvL6b2eyZ=C#JWF1ogG=M&^){Om~MRb<6!jS3UY6- z>P~FI-S&xxCCmn&czc#TWC6pVGirgUJjVh-;?qkfHZg>r~0A5YUHaob+r^qIwlgZ_AE(q5jBCYR-*eD7A&(6L><~AH$ zGy;a6M(3y5X4I2+pj6V^Y=D~xkF1Go0PcHBzhq61q$|so>-C;O<@$k4IbkXMz99rg#TF%!38P0>8N#T$>Zh%iz*aIk;9h4d9~2*~Y~iOvWgU$_YI{l+hG}yj$3lm2b+l zw-U>E4?8dyJ8)h2T(Pxt5pwhs&eCaUrA`5C52#i{@SPn7Z8rSZOEjxrudS_pea{`3 zCu(=fEeZ!O1-q1|s8)hK)R3uRPH3@a?dFDtx=(T1VD%Pe&YP0(&kTiZYCh^LFHf;W zqiB2-8y@Er;)b&*txFSaODQk!M3N7gtyix(oG@kHOzAQ9G4~Aj4)-osCATcjh*%$m z;udh!a=EKnfE~oDo(1drSNx22SZ?6o0KJ3L7 z`n#`yDj)3+#{IHD+Tp{@di9x$^hBBK;%W-_ZUdS1aR?%sHjAic5As$IB4!cwz6|Lwh&;=icPQcwukr zklx%-pU-~9(D7S`c3&LnF0Xwk?&xevq`Qnen+SIliy#uQV*%iU?QFa3QfUv3 zW#nyS4=spr!Ne4kztOpfdEg)<^rDbOBr;M4E%*t}Eg#h~5KP(#`b-SvhJW4_@!PoM zlaTl)j7;*A7_nBFcL>Mt>?obwL~pL@XklCx5fPkEC6(z9B4{$ZD&746@WA^T^##H=1Z|Df}; z`WYq=tQ3?~X4QI$CoR7CNyCP$?_AVAJ!zAS+_I+=(28}1mx$>cv=Y<$1$JP0<*0~9Fl9x{*j!}GW!{4+ap-hK}#7Xi0#2R!V!J$}ic zXsqg)I(6y|56wkhtMRzhSHRlwFg0C8)w?i0eqPrxH#9c5CfE$Uui{IU1A;o+>111p z8UGXiqUs5-TF+*JzjzFcpB#&X>}-#P?&m)9!eCj!C)SrC%8E6+VZGF*Z*Tdkb-&+} z2?vN)_HU+y27kz^*$Nf(>JQ!wwmyx^=cuytV$^^xMmVw{+PPHd(JYzwQ&_`34#8nd z?Cg2ngA49~8`kX$p0LAYo$t&5={ku7=!K4v?nQFsb}B3dcR>_kUV)btU~CI{B0_(6v6d~48^xn_+V*xw~PfP*gLXy-;BMZOivUK zmE7j~>-&eST^n9nSNYP0?M?5)`nLI-?o%c*$VHh>wzqW)*Ta@OJu0xb1_jL?r|OOT z`)mg!tA&rwf(d^e+KWQ=cW(DPF5%>n-jLvmI{xXJ@^8+NOhCw9B&=@jwIS)MlKyGY z$h~cAfPB)g!QIusn$dxPm3EjVt63G)vuju>@^`I(8vR}Tmf8!tf>gskq=agPz}5nn zg16W@KJ5&G)?^L7>VS1T4_FlP3u$d=*+&w+k95f!(`Lm4nN^nj(hzJ4Q~ z@#QyO$d>SdVE%?s6d1}thHTwl$&YD&c{cV`am}6@x|iS3ej{>g!Mfdvzt|Es0KCs$ zivE38R>2b`PcB3juUBD{)QDo$K10$n2N+iJV)%~j8D90;=7Y>S>(1QVtm{UwZ`VUH zQa>$dG?_=3N5%L&9`A|nqrGSP`lI6XvD#BTM}3IV9USa|xnqFWp+>hRfPBvViYDo7 zzY}4V0@vT;MT$Hkn&3lvI?IuXgK)1$+6&uPXh_a zShsE4w!>H09}X){eqI$4lYm$XG!Y=x=;}MiKuLWA`^_vc_#~E>^F@hp%x&X5?~%vR zdmh9ZguE03%ynkE^hTfYjL(1Mn4#~KGXvTbG<8->i`fiIOGzkG1WQ3j(zfibv_!p5 zeY(B5?paZUIeT-<54}Dg45?$Lrp~)NFHe#vk`xl~avppN;-Sl2wt!j_rH4*~6I5z7 zDuo|}LT$Lg(AU@N*BN8SP~d_Jk{XZHY#~G=xWTgHu&H$#b=gG1E)DE2IA^?0EvN+> z3?(MbS-&3}BLw^>4s~?_A0!$Lc`laI=qnI}EAPcH8^>a?7cuBfHxA{xfF~tnch%1F zR3Ad&UCMu1z8wi0>TNI)x$I0-<>iU;1+)@=XqK{-TA`~86Tvu2d@NNgx8k{!LxXbh zQ`KFKTG0xqcb3qzkt8M5jORx_Ca3XQWt1WqBAG!RsY&(|Xc{u&(;6QV!!nHeG*Ym3 zGG%1xX?Z=-z^!PeSbwz`SN5e+=``#(E=`kLRQU|dhPPdA)OmN8IRQw{i61m`1tPcO z33p-UR5@cDo-i6ShXp(~AvyJ?v`j=#5Y8d}euk|4Ss)}QzqtlkWq*%5rUc%;ik$f; zRn4}>wTN?p&F9dl%nu!eoZ={d&g0RCnkSzcx{x&9tVTMhdXvq;s{)V#ZOFK3nUkwYaY zQrvOau23q{(dOk@eVeh`zs2xfu+5!5eIke~olsdt@m*c0SAYB@$iNHSfEqd%o6S1m z>M2$yXR|rsb;@kEt}d%}ob)#t)?{Cr3s_GCq(%W!7C?%nl3#CHXc_;2)jAKi(~{5> z78}Y5)Ujn`-AUn=di7zyZ%b#kZ~sMF*Br(Satpy{>*F>&jER7))JGJ~Q+2Fx@pgKHby-Ee~Z| zZh`Gsb_5jOYHNeD-tZWMAKF#8&kPIr$+jxkq=ck#4n-nMTJqeu(<)uzmxzi8p2 z`7>wU2KNXTHNzvf&77#$@Z8DW+ulVkktZqb3itHir4O#*`F?2O&hnaQa3_6zfuLYa zoRo-QZn%VlhN(afc>$Y5{^6wKmOdC|FqlVKMh(}gDDo2*7w7*8x{i}5v?$^4K_ij* zkP;TCQH?gF)PRY{&QVodGj=WtJ2wnF7hRrTSC^OPPE9Rm9@LuclI)yyxmH6;P~0yL zwi7&B1!|MlaPm{P5+_{N(PBKE$_z76H&cq|f1agB{mbVaFbw>}E6BkF`DvHDEtyXr%2oE4s5 zmQV|6znrYtiF`;@Ks0;!TWrUxj^fGW6IRdatIsLr;hpQo3`Bp z$&UK^x$?)#+6w4BfZ9T<8V2+_*xtPN;AXdFjOP2MH#1<^fisT_@z9{}c<0ul=*93e zEj1OhAw|pw!%&F&ynoTWT+_H0>z82>fr)?*ut~UvU5X-|aTQjh&vynnusFeB^8Mr; z5Oih>GC2o*K8k6ijgW*>-hs35l)$V{pIHrbv%=<&F!p}0PLK0+<~U%fz?Fci!}B9b zb{49T=@scx$etIWR}tT4){eYS@HG~>rHl*+AXZ99jeH|2^4vApo0-5JD|(x-H}MhN zamUjo$U=oe(yH?Epi+YsDX7n3kOnp5Iyy2lB`Q=eW07*O#nSzfKf!1{_Xo8~kXcAt%8QjU}8r3%tFlRTc zs6M>n#_~A7>iKd>UX7~r&`$%UqBh{``0~?F8sL+S7$1Zk%>v{bArU<%+&4FyLA&6P z8I5Ly0j+1Z!GZ-^qiX)N^+>4}{A~5#zx+u#;8CKOm&f+M2R2uFQPhBl9y{?p_@k+`z);M70fHqhs9a&Q5=yKT!IjLXRRE2C{FTyFWSHS%7^hP=!y25ae@;JkhjL z+4TXKDQg#Oh>62a5++ADJnF#O?4gldj-p-8v~#dg7K`YE61bcbKRomx`3d6y#|ePr zI6OfB98EUpq_@whMUFErz5^wj)fA|!)5!&!MJf;(N`96lq6()eS@LqHZ5G80`YFFVxA~y-&#`^aKBvKIQ5!|AP64tCf-<9s-iM$u zbWNxz9YpP4860gKi-3a?QIfa7kTW_0P#F!V5PctpH4SG&>$c}?EKl9~FwbSzyR{mb zcs09+O?3c4Q&=pR`)=8I3-aU?CT>ptL&1;`f7sD_@w$ z>hn8#F@+Ji0qkfJrphIQyc82(M8ey#5^xSUT23x zPFKy3;uf%as+1!|xd=Z$+Sty)E z@!}J%M76vLe7Gxe!fR0haOerY04rjF6(fNa!vJZLOi6-7MFEnR1bail8b8ilr8E2q zIi#(D#;gV8i#Vh3tsxMF5~ZiykWt-FQQVwBTZ@fw=9o`bUl6!6dOmDcS1pk2)MBfVv@SVRe>iuvI&*6LTYB!nMJ4548 zf^J->v;7RRz;94&kl24!J8~f9IZHKq^DuVu_-RSbd#-50m{Yhrk^LL#bAIR6o`#e+ z%&cd!!b~l``2$ONESz%ysxq#qD4qQLO-1vJKQ=cv|7e_7R9sB|@^K>^f+s5EFUVv; z_7VQ960L^Y4)x!4e74-K<2BrNeD)}J4Q$_7HQGonU-?_n&LeH6K=Pyjk47N~*A6Dk zhHAAn>|nA;^-7m;O*%qNQ4LRUX$Q{+1)W|iWYFKRw^R>K5cW_}4cQ%qwPKOU5N6uo zfrDTlO~nTX+1OjL8aK62Npw{ew6wR+FtfvruaSd8iSirGqqmJ^2S0%Q{?GW6x_=x; zQv7@K^Q)xIrCOvEr3`iw z3xOTEzzzqn<0fDSpE@&@bWtrbPsptz*U}Uo&Ig?e^fu zE%-AE%97YdS9Hedjjz>y=?A45n~(|d^1o@-XvN?O=7sL%){lYD9(xR8_8jo4El@Zn z0V);D#}%NeMJWP$YT4`BKPLMRd|XxaHdKyW#p-nUcowP4UwNl$MG_PbsL$t=?3~V( zf%DM7R;s2$x^h!Rf=zg#X_i^rcm3m#$sV$~IZX3 zfq~v&U_c0Xf9gFwFyI?F>p$9a!sk8wIS`>S2hmwJ8v zet%f9CvCvcyHC*u=tvtNa$U^Ms?Obf;7Evz8E;c0O5)|{zNT6@;j5Wbu?Bl6LAA}k zrobLDpkNUuAZwDubC);OrfB9W>yi0@6AQT#0mQHgFOhqrTCS`OCPXGnTy-@*MGf$d ztxbFOA$w3qb90BZTI5Ecex%I?g%}akRq~uhhv!69$w|tk$o+F8s@B-oSW!=hvwzE4 zTvY%2+^-y{TM1=5SP4uflgkgtli@1hzKfWzA^b#mE}Y+2#(6yM)nJIrXcA!#g5-=} z;RKAr_=y;Q6viJ}Rh5->;za8wyZZ(~^5D|*T%)&bKWT!8Z*-*HV7F&PL-z4(|2sI- zww%*+^j~t^_}vg6aq7jFvrKDvkcpaE&E~)5As(i0p@?1gN2$vgcK3U4$jN* zr9-*AR6uAxAT$OLN&IdNl>ZmcAM>g3on*S97{3Fy(Hj9 zO|P$?ei`7sA`HaF4qOI+ipQ4%K!Lc=%K-5e8HQH?KgZb^Bm5+tvcltnAcL6|_|$US zENEMFu;<~*4i(VL1$B(_YuP(1)B(k+z}Y~)h=k$giX4&)e?p*H4HKb*xB#7{$ZR?A19Y~V&P|$C&Y_b{1{q z8v-Ix4=n?VHpS@#=%I8r8_Kys((p^q$skg&;Re8HE?{(J7#k)KHmt2j0;?6}>+0>u zc~RewOpg8aYq7&rS`e_wyewKQzYJPLMbLr@w9iIxrLZ=?qh z6vI%l@G0Q=DUr=Qz-5V3-<+S{96mBGu=f|A8lj*dGqYeWbFX(1^VQ5dfuM zDU^@7g3t&ww;y5`cibUINW9My_&J9W8rL~(P|>lA9@i$ z>9~3*p_BEG2?iJGAAM)eI<=RgdR0THo*lceFnrpt#4e1-E{vtC&uAG{UHGLT6w;-%sZ*&_g)q!;MC1RTyZ9#V8w#d(&X(>A~eWe#k{S z5f>@!Xu#+ykz^S1&RPmcT?>4@0g$4o8Q%Nlb7Z(IiA_u#9W&tl=SP4^!-xOy#*9yd zxdy*5y|ly2rBVQGDzn*ITA=GshilGD!=AV~CFQD7u)YRRtc>J5p|_*8^<4*2D&2=m z`91{2ZxMt!>Cm&iq^ix#tVJ@z#K+TF6KjfvlH!}wmb8MU_#Z~R+b-S?=kpwkVH_L&Dx!^!1}+}uBqPDSzMU#psB z_WheC{wtNKqr)WW3JMmaPoM6%_X#qSLLE1@V2Y0It9FXcm%r%f*zqCK_BeRj zpn5G#;?7!?Ic}KRnaHuT2y#Ih*T6tOB7^%+Bi8uP{;mUENVcFcnR|3P(sjF7=qacQ zfX2(A8Hh%T#iKnvumquAqH`23Ch8yH4F=OFT-xz4IrMdRU_+4s&RHw(%7fSyibbc~ zVspc{RXX`9kokc)HLJ~=f`-Yjvn#jp53p83uma-eG9KE z8O)_I(I(+cKXAg2(vQ)K&PZ6bLzwwwq%z`@Gldkq2fa)K@J!2Sh zhIKQG1NtC`g>`>YCB384*nE4O;{tF_QA6ny8XQ2}43J!X;L!1Y-Z1Kl@wU;!cz@3! zX{CV3WHlV4P;e0S5$Jy!)U=cT2i3XPYbu3(nJR9KfWH(73ROL1fnyN4kK*z1iPAgr z{>;Sw+>HGp>%%1Mk1XY;rW!s*3bEECt2JqCvfXZ<7;RX))-r{h0~U*W=}S-vNstOjrKBZcCRN*M~b6n$o-HOdl6xFu;&AFlKtz@BgC66ru>$N_s^c zZn2Dx(*^qmAkf7R*XyJBpqo;sOB8NfDyX2MEPtJl*vgMd9Cj?2B-h}!NNkOq%eU$QZnM^p;1QbKnlA6^XP5;|J>5FwZo8{ zpP!BoJNWu~Tv`p#5HB@BP?`hWQBjqv6=?zWIqhB;n3@rX}yTX?{BF=<<`Zr z=DYxw-6z#+YqtF8_1a-jhb;4m zu@C`2fZ{%Q-^j=%C<^*2GliT4&aks*)x+cayuD}Pi5jbu)%KDaM&7fiLQSWu@66NI z9)n@T2!l?eGw22L$l*F2=Q~E(S!C6|1k<|WokZR?F2HOWV3q-x(LJ6nd-M7I@N!TE z{O_!wAkDkLxKq13^ao+Zh93t5l!_@ES+5?}t@wKP>ZyH%c%XN-w6@kmK?ho? zP|Hd8hN&gDBulDE?1SE5U_g_QV8M|;bM)YW1IPT7Cm-@PXj~`&EtenZ#F$X31lKXjjJ`Ia8sEtKVc9e;Z}eAOPs(OZganvH1r+_ms(P+A`Jc@^A7 z?jU@SD!y}RJ8LWGFhCAXg<^fNuwAI=S{x~OeP35O zLkT7M3gy;zK``Yj|Jf<&szq`AKEZb5@4{H1esHFh?O7K_5Ovi)!94wb`N&%G^5#u3 z3!YDaMVq^rb>_nSMK{<4&!^SWJF-P%#dRJYTJ+ukAA*-LFTjz7=`|| zP}h5Y+}DK)aK2zHQl*&!y~lR#g!{TF*2$>_@IFp}#RXZ~35Qs!C=KH?QpVu_Ozi?o z#TldB!@<+`d3&fz7DMVSe^*bx%Qk=y;20ou?mO%kdIn73hGPRgthb}%2X6ogMf{i} zTw}NuiiYDVo8lEh8V=Iok>xpBkFjMH9@Kbx536`?VX$`kirg)-DKMhH1LhPsFZfe1 zF|!~aHHMl)C0tQC01l7GC2$DA$(7Z2=T!8HOGq`@uXs_cwlk3nYr3Gv!~ZC>{smDT zpTJPf%!#ylq=|$(;R~Xwvy<5*y$ysV5U^U2P&uNxqqyd0agJtVCB*g3#Y*Cfsq~U> z>fVo95cidE5#8*$&>^uQdjV;`gBc&~!l>XekuAJzYLGfYo=xa+yaI6KrPvd@`Y zm7f&!&f)~bW%jZ6WEdJVGgGHe-?^nV{miH&&O6MZ>kDaA5^&8)mCHkA#3ZPNkk^`QeR`_Fpwa03aPn4h43 z)?oht9J>t$)_b();OXHOzuq>^w`R3+et)iLS1VOCnE9cqkWw52M1`u9zOSwahi+gY_Jv+Z`RH>sPA_SZr;G4$#SCD`D{G)UttUO zSE^-crn)%_CNVPtDr_Mej#{Fwy}hM=^L_(|h~%U^3Fl=FIF#Rn5f@sxsPc86BKXIb zo2!`PwFL+s@BH$$@;Ly+EW~6``&FnwDg(q>=oun0$UX%N;+g&5wEcU(KOl@4Z8G^S z7IPqA3i!{U?i3;p&7EubzOCuabq#M;*R8Foaa$pI zK|r;HEKm>M66eCc%>ne^#*5lt*_u*TXJgJ3F7aJ^PBg>pn6L|Xq&ZrRRE`5F1TIwcz z4Lz+;Sp*wEo@UUhD0KlBV(mCGwY4eNnmSru0mftiS93y-7^@pko@l`TS8i@3nF@+lk@mFZ#$eRp;jWL`JGIwmW&Qe=l+omVpjNq6cKQmHsLHtM58MXE4A=oo-2o^U zgMQ_MTpfl^Os-7B-0D2Xh_BzMBQ5JEtW1@ariFv^oe-|?jDBWoV^8ZlweNf}m<+PA z2K!V+G8dFH4q&MgRmUqBIW@JOGJHr3Bk6D}&e@tURXVk-XdHI?}G6GQ!uHft%(mn^i|1fbpN9|O79=VxktEJLxRDQ@@k-KEfoh}0N5hOi zc*f^F0i{D=P_08Q3EZuHCp?}b$NNzIA=-pF!)YUkkO{4T2bg4+aym@db0>E;K-vqZ zP6gu&&>zeokNgdi1qzH{&oLzZ-2W45F~z{$aafd~)*<|SB&Qy3vrRy?vn$8P=|VoQ z7jh%V;-qHiTX`|w&Oxd>0 zYn%Y)b4--403UzCjjQJg32dBYXCAc#xtLA4#R;V9ax6ObaQh zl=cy9mpc)`aQi4j81xSKYW=jn{-Y1--*0Sf+lK(M(|u4u9_eV4o|UPp;@vPEdvOC! zJlPS)U@wTTf^Ep$kYZ*_s#l0&YHC%L#X>KfVNvBtg*}5ybvxDWwFbjlsC9_YrAT(p zqFU0zbZ}Wi!jo!-)CkdQ*Orvj*3yeDae^MW+&G|n)bBT)--xa6v$;k28=eK z2AqQoy6K`gJ;`85^0c;kq!)DozkwmWprOa9>j9$B8Phw?+WmM&DB32gNn3UAmlakWY+VWL}J(M4BzvccvE?ruD%ecg- z{a=64y7bSF&9)r-x@QMHR4oK6?zZ+>A`UyD&BVu?&P= z;J)Sl`wlF{2miHnd{5!5*4g-8i1u6L%2=Z>x_#Q@q{N9Mugv=cc|1LbG!^Ya!yCJ< z%mFeWQOs`vp(eTm=oYrw6g7w=|5gV>*djjku{Q)qs$(qbD2|>!!`fU;wdfQD+x^h2 z#ftFw6%gZ8)bZ6DmDSZB?dmAX#{Ght&T?ykiE23>gjgQLNh(C?O;#qo<&5({#{rAJ zrxT3+;RE|UCJn0UMXPkfOuA?az=$&psJYK6(`24sLqw=Fn|WMie3U$P$_Lp|dv+lD&YKZTU9j++Rb~;4{G*MKUt|5#b;r z6FHv`J|%3Hi_;tD;7X%R)zn_ZhdwEjqohkn6Ub%Z25G{nTp3eT^yr-hPr`8}Cnq&^ zW)}M!{N~1UY8doVxvAU)kcjJ05*a;2JC-iW9>-kK40k5_M{@rEl@*Z~?Bv>dT%5+> zkY!>y@eubyo0~@l##^wIdBiHAQQ}v+;+5<*_rQS^85)ak!Tx+iIDqyeRACLWU5DJh z-@tE*rME@~hAbcAySq>^@9@$1_+Y?-jI%m^>}ZHl36=nrCbj^s@sxoz+S&X6MXKr`o~_ z3Lc(G*%K-17gh<@!1=03hZ^7nSZ$g)vrJP&9H=((6nJHpa@B_ZEZ~fM}hZ15S)z;;gw-Ni${;lTAVC1eYB1UtAj zYi`CnPw?yDPPu)JtYrkg_IC7RPC0Z@zW#*2b?9dNDTBxit8{B1;4!TkB!bYwhQ*3e zIQMg7Py0^C-UhuoY4vdeZpKM?2^y(ifDZiv%+a&t(7-3dzZ*_jvaO2h8XKBXc&Zo< zeR3jV#NX_wnT?qCyW#ZLO6ncBZE6h$aC7MkQRu@321~xkI8k&ExklTJ@U$g4lMOvB zEj`k!WNq#~-p_RLRs_S6Hb4zu535y>+=|j^IYlW4gDVVOU9jeGecq${K`h)+gMD7l z!7hJWn;-7Y1W&TEJ_2~!0ne)e&np2>W1Gq1t?RLPeW^1h8rU|Px}p^<)@@^Y>ouv~ zUZj;g!=^iRZFzZZ)yc`#{@J)|*Wywl1AC27h#XmKXA?G}-A$Q|ID_6L#F&`(l#88} zVsbJ~w&@m=t;Cf2U6|>t;<{=T9z>NZ_@Ljg+)`X=!;DIO@*@RbB%_ z%iqJ)`Gx4*WY%0=UHwi&QzbZKnO#)9)t8*_z~3lTeVg=-)em6^(Qy=KI|l622&9AZ zw72j6;gAP>om0^QE`O02vCwL0WGwi7fI%bm4OoQzK9mL~h7Q;aGadr|5KxYIx_8cF z^xfD2xd*wD22Hex$)7V}y7l&GDw}R|F6KtVy73kzEkou&jY_^Vz!nK-9stKWFNtYKGQsord%ggE96uWqJcik+=De~p$ z(iwH0U7b5uiGq`>1*;B64GJ}IYeh4V`o`R%%yYb11f5rDi|&{V_QEX^S5gavZ=(a zZRpY>JF6cXQx;Rs~H~i~JH{H%bm>W8sOA{@37$lGSYuM0d*RN*ZTc$!eGcP^LKr9G=C3 zi`=;yhFxt(M?(V)FCA{#XO2TvJZ=tlekFE(9cDz5plMT0&8AI(jEoGFN~oyF%-lp3 zwjbfk%F6x%8Gl*uuTcKR1@}U8yD_*txIk`?2A>bE3oZ*j5fpXt5rII~ws`{OKyf`W!>kxVY_H%rZS zB5Cg^l)< z#bnL1s7gvIe{nWa!Yj^b3qpBXA8GRZ-K~s@{(`G z&qP%LpT@)89@lg-|7$)|Zj1TF_|(fEQW;gZs6@G4!+*@r;S;$w)OkWyQ9hr~;UDCe zz?naZAA`QsP+N8>HfZ|~f77yg9g?NXv@?EnZDUL028h}lK5pLmW4FiWkC~EsD-MTSZujAQ5M@h|86XGpSh34<`>aFQBk4qPiPD7kU}DLaiPGwW9b3@_r%>8Qlt_ETo7heLTKot-Sn> z{xcUkl@9rpA2Q)2El@e@>s?v6d<$?zHsHH0*sold_&GM%h%oi2Kz{QQ+)qbhQ!<#7 zPOYSgO-h-WyM)QEhp>Z3emZc1NCs_X%Y~aJCrwVD1=+d{xQs+~*14d1KX4Oal7Se; zC9>~DJ8yFitHc)q=v&ImVQ9O_Tk8P5m>y<;)Q7j$t$&X4eiPxucSC+!T7Dn^P+Xf+ z2<-bg1N0FzOoj7C1*F%-ILOI9lL`ND_yfq;f)6ZiwSaUhMw9gVxE_1~&d8aL%4K>O z9Xs~4LnVn@CC~>|&QUmryskjm4sO9=V}P(ymy~>{(}OLzSbgB7Zw=iFi~ej7(bnKD zNJo!{?%-+~Gw}O|g55Bfbvjk+Z@h86n_IlZj#P(MtCL&2%RS5}?~<}b^!-+F&lWBz zhi{03kcBy4|t+is?nYp84Qd+r2Mny$M zMTKQWMMg$08QSDahDwGyA>s%ljxfM5^Z%WDXB5rdxAuMC|6G{Q`|;f8InQ~{$M2j& zs|!|4A=TWSmPVqsJ=JCx*C~26nqC)jq0AA4ewAUswN7F5`HU{X-_f3$iu^mv)=AP` z9_}w6_eZr+jG!WlRn8{!8|3BaE2L+>!rpczzAlDT(E|F>g*QTnS{lyaJFwb^U=$#L z5up#!JKdpfhx9CFQv%QBNZt{lN|`Wm%N&0#SI%tGKjdK8ZEdi8SD>g~B`derH@2!*fGVdd6}*&$=dD5{AZL*57iZweZh=?cY=%tcB5MZtI4|T~W@93Z z4=wPa+l35^5E^v~ecKxv*1%pAfx46`w-y?Wg*gtEBgWh9wY5vgkWu^UhdVl!TnnO% z+Cw+PfNsb37#bb5t(L287K;r=42}4zBOZE1_rC8u9%NDN)+oZxq%aUbF-fpw0IHg#bRIvLxo!7 z^J(aR8JC(Ss=V#(5RbhT>duaiP9K=gGOn%T+{v`ArSu7TyKltr9f` zItc;?fj|d$o%fjk`0%82hI(pcz;=PMw!OV?G$>w=Om6Eq57z;6<2PIaVi--_m7I%v z4#LlK=+v9hooiVYfA5leZ)MxK3W)M`1YD22T2S)g4ZMFH(GSSy#I5B%;I@GAZQ&k7 zLZ5E7922>odzyQmdjQKu2BaaV$in*W?$nviSYN*`c%11n;@Vru?WJyOv)LLO&B(qp z)i^8b;F{DOn}!*5hm|gh*yV)kL~yD>kkA*m>@z2AA)Nj0rJK%Pv^eF0TjME;`4=8LS9qy zVWf*28W?giBo2mMS=F(JkdG>-B?R(BdEx?U7 za9*nunJ?hNXM!?%4By$Ac11WBYVamqx1`kC(t;`S#a?d!;M&wlu_JyJcW_H1B7Iy4 zgNOePJQ9|OyQZ=(_-`dkL`;R>mX%dqoi$D4RK~=zp~0Y&|9;yp7l4|8$ReZiEyBaw zCgs3m@eN7woSC^5zsXPl21>}AQa~;ufRMPmbJE9qAv}5YbF%WVGC;cJmjbdWavgOG zu>tAPubI?-{IxDhWv=%Rl^;!oiZoc_A3^i z_oQUrVPiWYgWD$jE@Sd8*r|%(QCZ7gf~9YR_HK*e2nM!)k_Bcy7q~<S5u?W{KOIeiK8vsVX#d8j|W>uRQv~nePR;x z|KVt_I(4+gA3M6MP90tG$ByQ*|9&(P%MYTJaQOtTiU$c7pp!oq1Caz?U>NY_N5O1xSb7Baq5cf_NJz` zw%yy1w(85DI?Yw-?caXZs{Q3WND~M_0BlUk3_?6vS(KSNeNNsyXr32@f2nw~6UqRb z7jiMUW`&J?i$WcFC`)1)mpgZ|j%R`WWU&PlNk1)%rDK&_yB55+`xYx;&Utvqxh~&Q z{TW-MT@N6gUO?0x0ZJbz#RP}CI7!=Wxt$TB2PHceLS zb5~Yctp>wcKc8=#k9>FcEkO0oS~$)(;{WmZo72LZU#NNEwN1OcUiV7?-97-e|A6Af zZGs{`ANCp`PDv5=4M0%vAR#Zq5mLekqh$?kk zVIgon1+9=nWg!)o)GAS}g75*Mh3Bo-X7Wq5akXVqZO*U>lCa6HUYc*n%+R}iHnOqG zwpOrZE2|eD*GLw69Uw~%n6n(rh_B#^hZVr@Z%3tyb_Z)0<*YT_0@z(|0Y$%qRq184 zRYY6KRa2^}>LNMm3mYo+X;7yoHGDVM&~P1oIv1ZOhR?@X%br9VGMoJpdNOSq;PtOo zyFSL6`eoJXg;Lp@TVRzh#c}s59(#KIiUnBU3L>bh+l2BrJ3Bjn31Ne_Oyqi)g;dAt z&uxdbef+*l9}{=sTEKw@>VNrE@$f@vnE@wE3i$M0#Whp}|cLoPdFq^3?k zXLkApftDvC&>(JSfn$7AbC)0p9OE@P7Xk$q^tNtH_n4x+mqEA^|GDX(ItR3kt2-6bWz ziv%d`MOC0Y6sBn4HUJtdZ?z~;(a1f{Ek~hN=*hg2JH)*WOI0Qpi}W0HI@;ccZj;6R zo!beEAL9a0Mu4Z72jRCFIXW`*J|qVzj3C9%p@JNo|9hwESoilnefusVU%t#X(W#C% zPa*gAgCwNjP)FRceeNwSUof2!ykk+mgZK3gI#vDMeS%cAG&h@Vg@M_2<-ImcWZ5~hu8KX7l<0{m2_s;=G~G-up$4I~v=C$C38R6+V{jp#T{>~Z0ybhGaz z%r%ZFn%{dmYL(SK-LMn0;lS1ngm;DX829kYpX_kEn;YJQqVr}$HiWoTUVHxU<}oL2 zs=IO~hWuYg0ncM9N(UI}f=j%V(8ypJ7_aa*K=wM*raJQ$kb8q*c5F?mUQYPw<;i|9e+yC0}^06PJDWWw-}Ltz@P6P#M5 zMhVWSPc}jKi~|I005TT^1?uAT4l2j#1ezm^nggTG@o_1$HCh8X2`9xtA|tQVq2qoR z`iUwt;elr~;9)IhR`lVLdFUPBp@dqtfdVtYmu4}6{jB-{6QpcyM{{zIl`Wy1Xk*ZdC`1m?fAsJu$$c=&A@hGkAukK z?`6l~=>~WLOF=BkEqQ^(VX_y5j*ZRD%ZBC1YiAZT#^+!t_<5f^b@(;f99)bR>3e_f z6y_Hc+;py!*Yr0#xCYb`x>nwcZ4l9V2<1hrMrXF$E%R~vxwDO=U1F*N!g1@8h#n@~ zG3G<;9~WA%ch(KmTjGZEIy-moMlDoN5BL}&P%yekA=ur8m+v|{_R(m6*9qeDbPZsK zesL`eKPAF8to9$qPe)*uQXo1umb}(_y~fEakbF+%_tJ64#0`?g>Q;={Z5T1au~H-w zAvjou4OX1*$%-6m;qBxv%!6?Ula9}5Z@-#gDR8p+<=Gu7k+zkgI&knBhf_HPcHA@s zpGfSR@;F9VvhvwB4)zBHRL)cLKzNU0Iem!nA{$xe z)C4H^3&x-mIfBT#pQv#Fzq?Gv9$byyqwH}h=smK+B0LlZy zDT-a2U!ZhV^aYSeim6lCLk^%ft|I%7RH%qKxhoA0jd23lG%)0Ui3E`v^7XFWH019I$%d_#>qMX_xgN-8W@R|k!lsA4j5LofF%mXM-Tr_tQk3NBVg-bM{U#_F< zNhQq6rBe1JddNpmtb+r+n2mj@+A_t-E0(9EEVrVFmr6y?l)MotwzhdM@DLjR&Moi# zL&}_=nK}Jv^V<37(3{{?y`C3ay%e<3fEA_Lj{fC3;f}!A$?2Ao+rDo7bn_=I0G5BX ztFtp`yKm`V7btr_S{MmQz6GcoY@#ABGc%72OJ!yB3{MJik(lCf`ww*=QeR&5cM9G{ zNqVLGE9KQih%Vj)#to5-ZRYMRqBy1^5GNpD7!#O{=-&yz5n7a-lQTPBFwaLUSng#R z8OdK^?fPz3*7Xa)ZSZ?^6D4>c7Srf!3=m27ii)=f%(*u95E&-1l?w}v#>-%q2Qy;j z+S1F6floo_wY4?k>*sU>+(G}r{riLd!K2-ty=`CZ+_4kHaF9GpJqLTf-@ku92C-9o z82O}8oE}3vvRvR4Dh0O^{Y_Nv1ib^(ti})m->r{FIRGAT1>cZL7jK+~AI)a*b$JZ6 zX5?u%%X!+75tAt~hGe(nOhFj^rFU+?xCFbM)rrdx5kpUHVuS)HSDF(PK-q$6-5?F^ zJVKP`0k7Gq#a;h;^wXf5A zXxA=pcRvvKG!R8`HQuC4K2DU!%}Ad;X`o|s zr5(dw)7;^W0Y9-?t=ASWrPfKnD)G$~NCGaX;6@IPjv)LzLv7)Sp7tNcuckiT0@4g#-{R!j7avWSv4jhKawtz*n z!S&O|(LfF|vQR}||5wNK@t-)RIk0&Fwua}(YxpMaF(gp9NqSv~*Z*X!KSZJ@%3QCY zR1XgDBiD}``zOYZ{o_Aw*w_7F*d;mPMvVGzG3u1-{$h+e*|)XsJ_FX1aYx*5M}cSB ziVf}oATSJv-EhN5Mp4DX?*Vt^Km~C&JmOT23^R=y$|`22Vl$fs_9d--ip$wfxGIW7 zFkIDb>i=r{TK%gW=m}o{UV9_Fi}{=xMHAL4ZHPmdR=5zq?B`|zzc`&!v(N2T&f-vc zzV96h@(KV6x!|DJlZ`c?mA^9h*?j1^M%wsSg2+Po2%w6R2BCNf#!4G3L$ZIRUQv|h ze+g=eQ2ks_TETqiosyCw+?~cYKZnQ}iZjIDBU7;6MIXaKBy#B3*%#!;rF92rTSj>Ll`U>^x8CrlUZND=|z z8nHGAi3m$iGXCC#-k*ftABW!8p!YTC{cK_*Dll-9sRfH`p~ERlLftIWC4~s70bg*t zTVVP{6>_rp+L+k|uLhQT8cef>${eX0t`(!fSiGM{vmz>QptO2v@ueS4_th zDS!Lq^mNnZ*MXI0jt_beE}ENrzS_V0UGS(^H@W3ZF~}!`M7C;sO}ox)nHRm> zTBoU;s)Q7a<@}4Y$Qgn0cg1epsN1&@$F~SGVX9t9tx~#N)d!{)UIh!%ZfW}*YhwWi zWF?I!8M3jib_k{C?Rg3L+5dv9xH7u^T45Q^<8!J;_BDO@$~riRI*9qYRQ77)d5cQQ z7GmIEgXNmQu&+RRU$TT2-A{p@CKlby)@jO$=T8U#&10vSbD(-L;t$!Ubo)jiTWbuH zO{VdLT^~huBxp`5ZLH3NoQH^tg0q4|Bm&ly+oz-$v?D(6!Hzcg8hTLgbQt@OjDR8c z^`_38N&AB^aDkN&8CITLJE``B5`BHj+8Lk5b;@h!@Dk1qu@=QA?2zj5q`?!RUmwIc zRbrejLg&!rbOc+Kg_opOeBx1@i?zeBrzJPHrF#ZOFD=mi_L>zHS#$NC zw)d(*B%%z>`l|{FBwlJ|2robkql4Q8!=ki;COp#Gt-S;?3o^g#;8U&9VdY9@I=Io0 zGgd#vmKj>ua_#DuzBgstFg~APaovouDFIsGdAw`FH&65Vti<6^oOL~g7FNO;ODcnheH{0< zyeV$b4p!BfT@4ir0Ctfn0a*hTRaNhKoUviA`>R8O5Hry{PUSL|FJJdzd)ueaKfLDQ znynpP-88ewnwfd^@5`1uXwy*GgU61*657+_^AGV5!UUidkS*^3 z@}2SsJB^+lhEjtLZPy~_f_!$r*MBe!xjW=n$GBv=JRfbk0JJp?v_;X>2GEu=EiJ#h z8|iDI4MHo-19Be4SV*a{gLOK%tZLXpA%LqY;iP0q|6HzgyIp|n&L`c4q-cfD7Yt^T z{TlPQ7N9LFvjdF-WRnWE^eVRh^5t9$m1@FP&8m?T%G+XhcS-;nC@BwdJZ754=Rj-% zBvCNJ!19N<5KLoUs7`Hd2E86xcXaZ1(hRu+cX2=NVj=E=s@^RbpmP1UF)%rHP@f z*yd0D<)2FbxG2LSn}M~pwG_76*#{q%ODIm;^;W|?5bG}XL`?DJLD-_%RZAbt#+uX0 zwN@{ZR-Q^pUwH-oS{>H1FdK!1ViauYS@aKT;wmOzL%`feBhJ*P6xUmVZ&218n9@UWcxu1Nk#RBee)4MftR|FjAWG@<71#j}P~F$OAGXe6_~)a{EzV-?nOCzV89X zsgw)&7fCME#efK9!XTZGvAYhD3bZ0!4m9eYfdX>aB`680u|InFq}VZ}mr<0R!)qw$ z%&kY zEKV9H=YKSy3qUF)_qWr$`$+?fh~FO!tU@rFh5vSRN#Z$mbdAA|jv)InBfRX)BaEPH z03#W);_>WujBpV~IJTvEe;hFO$}j61Av69B@wYkZV1lRdu@&X$vOB|n;8(0&MiE|e z?vQ)5FShJOV7<<_rG7n?6f6qgt#rNAyp>fz@(3AcP4>O{+;*(64tC{2S=kGZN(6Fe z%xctof3wN$8Q~=XG}gJ%ee7%imuIWn8s@=Rb1MYU*rK2HY<_#=JKG1-avq!qq0`Ge zijAL!auxwRcO3Q>A13F1761k$9<${Lem??R%!-)8pC9?8>61g}72LlNX8tbp0O%Xz zwpyCVXxg~6OEafwIj3SzT~(D0cP6{x|E!ZVYMpLeN?LrFm+J|xQ!F(0R!1zNY!OuzD<6N`XTByEn&1bLpM5Kc@(BbHyV!GR2aE_)|AdHzYp&1BzYMec*_CV8 zZP@J-&avezykO#pw|&Dp(XI|Fu=K>K6;e0B_pJ$F4RXq^TPN(oSkj!z(E!%7plgor z7`*X8UvDr53yeYtvhl{`QIF@KKg31>Ukwc(>qa#~$%n7iLVfHx;K3!h(V>3u3K-L{ zTmr~9q=BVK^0LDoP2Tt8$OooC=&(+3P1UH>v2i*zhwNLyA(+X#+B$Z6aB7C2eZ~up zM8Rm9oG3*T_abpP(~O@?m*CY}T`XnoLc#^$kA*`4_}>799`Fy~QVL`gQW8jI(0^rzq8V zuziB(I*>mI=Uo8lfhH#{S#?;WR@r$3H943G3%LUyAm2M6iK2`HNo?!Uf(EqUQMBN1 zXn`FqnB~=`!au;?@KRt@o$TMJ5THV@=0QQ zOTzc)p4;V(nRjRLomQ3iYXDGak@}P3$sNco=FlmSkmX=sz^_a)#w!qrmS8jp{s6$; zzMz6hq_2B)dw1|$NQ37FySG1zJ6F}$?;dBd!YnQ6W6C8~%edY3qQ3Yt|7Xpg0hw(G z;PvRm#fz}Rel8BHRUC+$#ObftVC3_6sEAse*7459cRW8YUI+w!A2$X3aS9t`FKLRc z+_xRyhA+hr>);8asdOA6(T`(#xY1^WkHsLhOu*;$4~3j@qXGY6UjQ|eVqkz`vZ4PW z?ak?mj{zS1Sdo4+;i_toGGS(KGbU3}#OhfjR5kaWZ4+ZF%GZC=(QiOzhuOcr0-gLU zWXV==>{c|m@~pDLb1jw`Nxt??PpnwGzW&S3W8*Ao=Op<$THky!-|H5p_(8XO*lAQr0>M)^2QKV+PXhwv8;I;M>t_w4OD78ubP4HI-gd3WvgbsvTJ zmN>~c)flH!9q$nxI;7n3k8n)j2Yg3|ojPT#eu4@DAq2xXrF0$g(_`|+sW9Czivp1r zxh{vJ3JNFm7C{{h92?f?po|BDNDd&7xnj6Kb!w854S72|_8txjnsH`B96RPc(C&8c z+=t;1;-Gp!g&#cXJ2s5?Mg^`vgzM|{MqHoA9FE8JA*#|{)Agw}$7mk{btGsaa}P2G z7?rH6+y=_O9hA>EfBx!xm|rE{u35S1Tel}+t_@Mw4^Dr@J&cp3nuUPMjP=3T-TcNH zyWL*3rK3ODa+ap6WwXTbxt{iJ{q?`TKni(aA1;(dGp3SM+;uU3f`RZlYx-36s3ZZz z{(Vt;{BB@0b_|`1%0Die>LQo(w<|y%-5}Ede6{<)z8yl*dHX+UnTIb9vo{ip&VH|< zaogu_*FO8kCruxB&B*<$4Y;Yp67T;^`}h1g11+!Dz1B8`k<13h)cf_8)_sG}{%71& zTx`RPk->ATb;zL>0_NY>+1AgEQbwoD@STbex|4qk%nxnC5-ac7lnozsCR|9Z$fWWa zdvQ{6X6)zBJXG;W_2!PY_a9xmw##Cfq*ZBz$yb$7)Zz#59XCT?dRhBmasJN?`f)QZ z{}mD#*nth$EIL%-VT{bs=<)~`4#->>7GE$*$f+_Hj#s(n=;M$qLD1_J1O9#_hY&)C zyALBK(-;Q>uu28Lv(7llpwsZEn|gdOq}D-?!Rb+}kCu|vDYt~miD%|o6sBu~^RF^}}g=cUe?qCsIl0QUgp;JDH5@4xR0aIuN{B&-Uc z$AdV15KLeI9D%|PDf(~%GK%68R2K~{7(}{)A((uG81VWCo&5%M_Gi!;Wzd-iIwNZ` z7pz6lUu?@yFjv>qK|v9eRs+SR;7k~jr2$i165O#0<`)r?I0m5_ zGR=Qzz#8W_82#Oc`bU`xk}?3cY{Un^D3x1V|T#cE8(O6(l+VB3RGYPGtG>0fKM|dlLn4tB5et#1K?4apW8(47W}tJ( zY*5BM+VCIdZ5sWFd7D6O%V7kMrf!lYFru{CpfswjMsc(hGsRJGQZ*m2L*+QLSwpsH z82-5&vLN74nEkM3&<2Z!AY?-x(m|4mS~O&1MyF)VkZcz*5kp3PK4oE&Z5XPk1p`W& zWWZ2G%@_2AoutLZXe;H!AUmuTZIy84X|pDLU14ReX-(zTyMtZZnwy)y*dIu=%(mNK z{w|PoB@8K7CI!BG*$(Ui-?4R7b~q8P`IwC@kVN+!@S$p~5b}AyM3zg*J00`*SH8Gw z5LlfXi!kKjP)~EmH2_UyAcfmyNK}{uypx>%a0+H!9bguhh2$Iz31CjOss}Gc@Y*G1 z^TCbWfFNbqt(@K=n9?sz?r_8u-HP>haY62^7^k9lApKSw7F;==^+io#hH5j+kDnmU zz&ku8r%3Lnyc=#TD7Z+~y%mzKL@kL=ZSQWQJa=#H=nhRyPoHBBiQr!f@B0q=^;SqTuAfrN|0CuH+Zqb7X z_eL%IWJLa^!T^z>O6}Ouy5*m(*^p%dLh)tcj?1!9b6U@D+&Sn}8g%YYdr}>-)liLV zYFmekiY|xBlM()yb9YbpjOWts&%=@cw52v&zAny;zUZq2B%)e{BCvtZGk375g#M#k5@)cjI_0PB*T5~Ykk*608!eg<}m_FVpHor=mG8{ z&foUN3QD0un=@R*xe?4S`F4{kw|4T$$thWt4{hjZ`}!;QwmoQek;4%?>g#M=_gHmJ zhu&~oL{e7$ZBg2sg_ju}gh_=RHR*aw5|v>aH_4DT$53?X`JIgwS0JZMDZG0318?_d ztWJgMowH}^0BJ~Y>4pAwVDsKvYqw0mq@QNH{R-F-WUfQ06zf=LY+KbA2N6Oao}GK^ zeOJl282EO|k^1ke$ZEYw^@og^6X3{`k-k2*Syebs)$Q&_x79chM<~E*{q2^9U|(yw z4P~EaNGP{F<*Mq}KXbPrDcK6d*Cwv1dG{bJkjGo=HzHp{ht0C+N;s?t<4fCru_j6U z*`j_h)V%54dUsHEILEAQ>hLAb&MLg~!7E_BtBN%KWni4kW6FNJ$OI5M)k)saV;1oEUS=pDiHUy61fIg za2VlI{rw@eDk*K&xl;SeAlt} zz+vCp61r5&t4Vyv3X3#LInd1aNq~eZL_O)4ghWu{y z2)EvC7tGk95(YZHvWsQ2AnVWsJ4)uE~ zwR2KAZ@}j4BpIHK{#*Oe-O#-P0 zxsKpMkZQ?^o>-%nIwvI$zqTXsp3vNEFzl%>k0jz1%IjN)4dVQeiDht_uvJ&|yW5NI zC@T8x?M1)+ZINiVDx2)qVJm{g<@A8w!E|fv<(7?m2 z>8Ov`;uVi^wWpi3J4uSU4Ub0qGSiex#Z zin_YJVJD1n-QTwF+Ic{cS!6u}y`wg>Vpev}HMcIg4no};xWfrd*#P9kWB6M&}$mUGy3gth<3>01UO`Q&P=|f@4aE zf`bKK6RS_uY2%Yk8gFl(KLC^EasRQtBS?N&U=N&AJ2J$2dXe@d zH0*bdop9+eL6WnP9|`#OL+9!2@%xdoO5g=9I7|_voK~;%9vRUj&$OH~PQ&{TBjX*4 z2?1u$J*tM94{KE5)Kkio2X^zrIm*>bOSL>pp!0l_8xxCi^#!t4>_r5o8)+>J^t$33aVas-`zd{r>jAmkeZe@Gc~mhZZui3 ztA#XRwWb^;iuGaPI%~(-=clsnBmQrmx7+RShxB^$R4ni+fA{uRU)k(#c?$aoKAkRi zsSV4H478|GEWKrxPP_(wFCROKaF+9-5za@XNv5>vKoOOSvda_TBGn<(r4Lq_wQ+x( z4%HUro)a}dHkAz9ZTGSbdAT-K#N~Pvc!mz%yXidR!j)5sds;E@lXJ55YH~ zRls`RyT9}MW6)nTO2%pFTe9_k7*9Gd&C)6<})yTJKw0X5wMYC|`Tx(0I1Dip=4 z!BSl(agjQ>>CV6i5wJITYEsaHxJCYoQ~01Euk`9Md@u>xcN%vt6kBWxb7ML{+Ev1z zFU-8~&*bTCk^u2x*zY$=ypXdNXCrmPM&-Tv=LszjF923d4oEt|4#yc1eMcr5=Ptay z*lH~=KNCk(cY2Ob$jG|7I1lXaF)+gSq+59%D~ikzKaB`#AG386%YJ=9>ZBMy!0}6$ z{(vRw znxvGRr!hx`uYU-+7|1lciU1sxeHE7dUrWNp!PjCXzShrn?LsWte1s3>z`iLHo5JIH4XMEk$S;ho zK(JSB^&m2#1R;>-@UH~>%WmBjHcSWd6xXw7^uM)O2EGQ#H*NMDY;1h?5fP>$DR=5x zar`L^%4~`~)Y|+`B^cV>U~MvsyCGa6vA7~cRLU$aJN$c{>)CA`U4uFVd6k!&;X64g zj5!o=0fiz&Lc)E7NXqA&!n%UphX+Oj@OKO!g}rhBtWE{P42OCg$GW`UBi`;H*s_Ow zN+eyt76fELL%RwMjjw!ZrbN`6Nrx$b0NiEHiL;IKnI z*nb?5zjy$+RWZm>fzGVZOM!q;&pz9qP;*FHdAW_3t{ko&Q7@4hju7Fkei~o16X#(X#oi znt3oS8YI9S-N`4^{;i+9-|#Nwldpagck&gXQK;e9KwWsJU!Q3M7%nq=1}Y)1mFsa8qXYXh$G} zG2hzJ3c>^YgjFF0ay61-d!!M9qZ|@fGxJbCc)bP#^#etwp;$(wAI!L7>c8p-uAuqk zW%(v6=!>p=q8GSU^O(yUsnnu7(gZtiHU@s!j@1gCKWKgyXD5uUU0y|0q$yJpO%Z*R)WOZw_P`m(XHJ})l| z##fA$##8%BWp&B5Gj%W`x#0bCsQy~w+p}Yr$C2RQy$z`yKIkuE~KJJ^92g zQ*eMD;fC47zU{;lg!=UK^Gxt63tJ9-QC)2dwPEW*c9nFk=V1Hhdbj(<6|bTeXg&hn z5h|o^YI>t`Wrg)O^D(y&gA}%M=_nXt6$O3jj7tlyg4O2*jO(r_wS%`jgM2JGS!Ykw z%h|N4e%6D!wJirmg8-HUJnd@%M52s$ixmO0IUqV&2!12LFw4P%S89T|4WB+%$-}c@ zNXA+UnR3LD90DE%HR|+)#Z)q1Z%>aG17-j=IIN&$K?*x?LMtcuAChvDi-An?E6?)^ zoRWEZ{fK*RY1!7+4)%ip>BT0NbQbl$MLI;||!_ieiK>8@seHG|{ z5Fivg6s3b4Nh_Wi5$w~!x^LF5Yi<3ciBd0q_8LY1wXVAosKAR(>@rh2G! zL$OKbfh+PIIR=?lN z0P(=|pKQ=0b;S_EmWP4^UQJvqN-vCzqR83qHn$sDK6FH{Xvf2n8Y5Tc9)|3i3HlI0 zAHM^iC<33Du(97X0j4y=q*3>)ueZVI=6<=}vwJ!cYn8JK{gUj|w9KDP#11;+%(OXI z-AnE=ATyjWc=@l0l!jIpoqPQ2j?Rx)M-=1u)$b#i@RhC1w|(N7rj7PGBe#B zF*+KZu4N_MX&V4z%8Ofbbnfl&t>#S~3JTvLJ+9=_4F6qO)4q6445V1p?h;;vqjENJ zG;G2z;yd0YE3=pljpkM512+J=omT*DV;j_;Y1~~%{jiVg#QzHb7stRj^d9?;y95e3 zl2L#jDf>zbiig@2H|F2?=lh_BRpPWyvR&}aLI}Xtgl#hdP;#KI4`LY6>A>S5&>r!t z$a}~Ja8?Pn$4%hWp!IfWREIeQL}N;idNtlHqO1x@#J2E#ihl+y_fTF6IlbO1Y4`lx5d7jfI94Bd1~~{G zFE3wN^`R#??!p^>Q*=jRer|4IVM`+hZd0$}+?!yvsFW~dwSav8W?Eo-#Z{2RWa)bm zObwKgaxN+qT5zL{ok8P;KslVR4|acACw~0ALj`Of!~Ah3gaSuAU420iXpG)~B2$iO z@J*BH7%B!TF?M!Rd^sMzUe6I0Khca-4l&Nj1Bc+__}&))+KP4TIfA(uhhN6=L4Q|= zSO?SDa~QbQmjjJIFdPi4C_HyuBJcbDKu@2yrx%$Vdk*)a@=i}*fY-$*=#!FA=L$(J z739w01FASBEbv}$?^NUoilf}V;|<2Zz%d_!e1%}|A^g-2SR)GkeEhsDnX16K$9hxA zrv>u*D4R zm%Yz)A1;J$aj?i?aB=CcCqSXES16?slDW@Q;uX3k8Z*V%LC%oZOP z6;j0t#yjBh!6&L<;ex#El5^kL(VkMY=Q_0K4zynx{8q=-25pHm$RU@8!HLRwN^C@n(ZZE~3!< z$K@cJ`-JK}?0jScmte=jJ?FFSE8#*^mh^AWF~DYdKfm692$lN zRK;pFi!B+&8J5MxjAHX2H`{D;%`wd120Un+AIJ?`x6z0wYCJ_=WyhWJu@8E6vwmg6 zx+EuR5S720rR)9RF-(9YIOM(@(9QbAk|j%ifiFL*&MzgXI8+P1t_2RLGDT%eT|RUT zd|4_sWWXr|_ymlJfJ2VJ!X1Pm5mVhe7!<}$F-_7dg2%f%^?`mZKfJ$(@7X`B*Y*dX z7sFUX*`;7QBoH1I%m5>13VxXig))LXA9PT~3_*a<77`yf!(s^wA@KCDw1sG?-!tZ+xs{}SHJIvrd`hm;uvUc1apIJ?AE zE|@S}tMCM5NiY)I8ogr_WB^Z-qiL0sCM{o1cMWuxbmI{5ao6+1iG zf@jlfV3-X%R!FU;9!Nl|)u;CWU!B^_FM3Pv4nD(gf!5BYGM4IKsp1MKjygYHR9#&v zQ9hHBaZHJk;H6DQpCI=PSS-Xhm;8`>J?d2$d(9P!w-zmWON501J)4Saow!iEuK&b^ z2jKP}(fHV||J zx+yUmMMu&d3EQ`Rb6h+1q6PC7TsTQ}?3=AX`J+GwVd#vj2#;_i*nJ zACs7b9e{2ptUdON*SHdTkBy*+l0q9F3m-c-f+$WplmY@M%0?yQLbK8SG_?OhwEsf1 zKN;;8tRIaf;eup+!o7C&GjT7j^%9Q*`_ zubx0)=m5o)6yqN9hnlhZ!k)(q?>^^d|@A=%SA;9T*Zo?Me>%`^f6cW`(6o$}l`lwbj6EC>bJRj}9?a9IDBMma~xD6I%3y{xs^7?xDJn zTl7|hd*mQZdpiFN{I!z?1}4#biI=DjN`*c$U(k6HMW8OW#4l84thx_Ah?-I&wDfQu zS=)r{uz*44U%kvPF6Yw+3@}`Q&{^wLX>-Kv?_LCm$;wr+jtrQ+h3#C1tXz@b6`n1KNl z?C$T^=>`UL;yM+mTLC@GsocNcY$jL+FCvW`*}Q&^JGc;i8NCC-vc|{JjG!BkZvs;Q zrC%Dbtm!!4am6(Q35=16pyN z9XXHo?}zOeB@1~zT)xgu>rXuHfaZ0Smk}iZgUbMG#}kH7iMUA&q2j8mwrl|%cswT4 z>8nrl*b}P{e>(4#C@ITm%pyvXIqw)sBK{+Q4oF&yN`%CCE)$W4k=|&dGTK;~Ho7O| z;6h0bu6CT^h#!A$+EX>A6(l*jTn;O4-o;X=9cYO(>i^lEQLNb5bApoogR@3gs%U>v zOC1n6T@KLtX>I)}`<{MZ!q^^|CABmV9f`^4t?B5ki5Rh1%-uNbOK}r;)QXV+ZPaLS zEK_6xcIr}^&E}t9mS%%K{1ifWnpl(F%32+EO;+wN@^i8-w`ICmaSr53!j!pTc}1}# zSbEBljrx&gJlwy_mSZ+8vuiZEc)-VEVl}Quq_IdwJFu#w0>{2GfYZQk4nG4-yZtK}%ILY{UeHDl8FZ_GCQu@dTP!u+CS!u`)6Q(&X101I`xQjv~(VhAiNW;|CDPjPDd*zmQeXwDR+4` z844B1MB}!GGaORiI|Ld5cFG6{(g;wda@xvaU|FL~n}8n1wHwC{isN66&lS<}Ipd&- zPo5kx#4Je<3?9&{G;}b;ojQCcN7D7AJj{DDa&d%)ZFIP-p>~-qNR&8s zf12wwdw2m;075YKZ>9Y^Fnvhj#J_aRIP@y5#bf1n0dR5{Cy=-=7lqjtBdLQ-63l`; zXq>^$RWpXF+!XG*7@Sz+0Mv8^rAhQf`7*8Wr;o18*R7!{hn-u>tXxHOc%^peKo7dp z=>ZY^A-ml=+TmDkXE6Er>{ecIESDd0AI0N1(q6{WI;`S2ZWI%I)C3`&EhT7uF^(;B ztdJk_v59CUN$y%49nHHU-#gc;rvi41S(dE7MDCnbJ5c&bx^om?LKeUkoX@vxg?zUE zfA^e-drrhXj~z44n+C0!2UgU90A(neTyve3RUo5(rh~p)BQofqG-UZ0B)tO(*j6yF z1BK`0`Ae-o9epT|*wV1ZA-#jU+Y}iy`HqPLo6wF)=s&78yYe%y6|FK zF8kPFR|w;ikxWh(yF9LB$piP4l(c@?+11{PoGx}na4$^sd|)WNjIXa+xd7I|izOTX zMd4ra%d6@|z+0BZ!L>LD|Ki|rusH~)PKcx^W=u&-VS7f&t7Z7c$p=TdWpb;iO5QBA z%7j*#&?*yJrBaf34cx0Pw-YtmxyPEg6WCC7hW1PMm)eYid2mfsvL_Vx<+5Uja0YPP zX&6uxNM|Q7pt@7>pN_HE3!U$1ST|`_+Iaxq2KvNPev{iwIQCeyc`OwR{){E;GO&4l zEjcy-_Ky(0G+&~t>ewSVe}=dWyNi@s5fAy?7ob0`#JQ;s*U!-(6r&QWjr7NuPEkB| zqI0aM#Fp6#1$sGWYX>ZWZ=cCd@1~gha{v2|OO#NwF4srhuwUiqyT5qGB~CmADp+vS zEd@9KqM!iJH{Xn|IoYMBU;bWSXK54s?I_uMd)Xm)4qSpHU_f${F+D_F1{YRB!q{)B_>4A@$EczQfwv6SImU zX$cdHvd-#nuc`S~lMcloU2}L-jW}^@OY7Fpzu3AJ&!2yO?~y_x$S) zn;1e|xHc|6UJcrZyglZFIFVBLBC#eR!C}!D`$3%8+c&B;T4tR)UMmb7Ipu>m5!Hl4 zqvXL4L4-f$LnI#ROjHRsn8Ssl9;eD3m!gL+1yx=Es+^4;ru<@wdP$q71)YQrqRlbv zBsWT)%_n(^<0O5K8_QkJK$)lT8;9;xn*0I#NdWuFy7;oJOD@gI!t*7U5HAwPP^Zf{ zmM@)3kTQ!B$FhKv>y+K)nH!bkNXkC3p8LU6UA!Lr z(}hY=XRx^cK=Sjm&C(I4jX?D5Q4S(W3#aWX*{7u$5#2i~@hj0H-p{t+%mxPS2c~W4 z5s(BNvRpwHA(97A=;qj;C;{R$(E@uzWcS0%C$e~vA)3xFJxf=L#`KWX6TNFX60mgX zP-IpGEPpF*-HiYJ5jiH>KDwLeTFwX9=V+gfEhgG?VDZ3{fVSF6?@T}ojc8#Ujv)OZ zwibB{%WKQ=3;_JYR*s>l|l_D6(1H+QXZnzG8R~V z;+&Hr=OhG5tgWc2smX@_B049xaU+55v4uCvuiVDyS#>&1O=&5TEa9vW+JYoh*_j|C zTWDULzB)T`Mj1oQ{M_2e!YuV*)EXBZS?WhShRJ&pb6hia|Cu=Zxno*Qnv}w7mGeGR zsnR@!-Hs99)7=_~oeCr~)1V?Z?i~e@t{`VCR3&mUH`04M$bs3jp<%g%3bVy%wnBqx z6k`UG9=r+lFZp*L5+9Dy4)astZQ%Fw_|Th@+@sR+s;L9w!!qTY(V`h>Q6k2M`jJ`` zYqwfUOG--7FtmkB5158V&nw6QsI`SCLGz=R;#GRX!d+)x8x6X3-|)9R-(~nZxtG=XlZV2K;t>j zS{m6%*cLh!KK$T`PGz0hteRExo%LC0s4_37Ag{d$vbh+G_O3Cx0~SkK+F~@DWm1Dt ztSRVgLv#JcpqCnKG6nrQGn%Ul=q=)-QhNy_MQAaSXr;M`@m3172=J@~@CjA|Dr^!e z)7`}phsuN9$Af!kSn|$UT5YpGAuW1tM^Xl_X+jN=t<=-xtw_XmerPePF*Wgd^|GcX zQEMTq$C>R4V}HN#r2SR?B%O;aA1O@sS5kgJs+bZpe*9~%y@n@Hmip&E|Kbb!6M0=# zK0I!Gew7X{64_T^-frY=6*giI0a0C5P*nTYrdt+?4yE5O=zShht=00p->Wl-YK0;u zX5?t%WKr!6T8umSIV$X?(*=EcQ$+GOANO@D+H$&-3(Khza)eSL)R^LO;{dkdL%DH; z9d6?CaDTPJoo#of?Ip0^5hhK_nAX;GC16F$bQJlO+Qt9Ki*N0yHH%l$LO_Ae$Y4Iqypi1i{vaW6B#RwQxk-d0~BF;N#o z2O+-~oqo`%K=w-cqArsk80aP+44qs<(QY53pGU#MQCH5}4V{072J_k@@ft zXlp&j^ABjp642J&pskC{v(1X&Xir1!Cv9C*GOJho<74+;MaJcm0y~~8|98L9dZBsS zhAi>d0S$a@_*T`Lm!GSC_GuS%L0#)vnVA>O^6fs@edt>(#`gGg_kP~;&z+jHCK@M< z4|;7jsD*(1A)w)TRq^$=75@6hrJ~W()p683)xi1!-rY^jWlJBtBO`mh?b?#1AP1Q2 zs{Y#@Xb$kc3Af~ePtsP6S@0RUl(vt-)auwHhIud$9`o!#*3~b3)&JCHWMt$O!BI}V zXxIL6@#4$+;kSNaEu0Ecv`_c}RxMt*e|YG)R+y3$uL!ZEnKR?{hEQxQ@=9n?80z2s zCfd1fFDhBEAtwV4aN>9;Kde(b8PL9G{@!(AyefHm(xl_VL&I|)zru^#`En1j7oFv4hOirCOCvDEAmcgWuqI2(_Z})fZ z+q-w?OXbfzUiHSS_3wVtunBiK!GHYUB=L@s5A-y)4OI21>jhlz2WU zkuqPCE;z;fGor-qhF6-}4o=OiE+w+xXO@BfHw&k!;R}q0I zYrgmypkp}*qbY|AN;XtV6~c7C9tAY^m70G58@0Yhob2JIB8Gdij)VS;Qm=8ouCA^@ zl|D|V8}Y!<1Giq-sZzob6RV9O^<=Uxj9g*^gA8?IMur1^K5<;UP6&-ay;kZFUZfIm zBEt6J(AW_;a*huT2N6vWa!vLR#-f_VWK#;_xRQ-V{qUil?(VJw0L}LK(Zv7<@<=J> zgvDCT1<3_8FaV&R+?P>FQ;)uk%5`UyH1m8Gz={+`Q!2dXMR3CW1WA)io?~UtsO|;S zC1vNUkm}+?suUFYP{GlDs<0`oVn0IG%rl}93QMZVh(>W1-;b0vb2{LBEhwNgO>S0% zYj?D5M8JpJ*VcMQS(BuE(wU+<7HMP=?HM9+&6AIhF+LvODkVm*!efXE9=l28)b{$nMfg}^~}Vs57)r%)PR zJ4LRk4Dd#wb?5#E|2#$_>F@tn1tRkG`umOqI6lCK{fGN>8YHbt9%vY__tp(o)DZjgD37OuatS(%xW1Yz%&21r$nl1ePK{VK|@kdxD@dJ9z?4Mi-tv9z4^m8jmv(ii;#j zn#bf(jOubbtQcEeMhRr+swjqwWg$re*8*8A7moBa{M5$TVLxbtc)b{UB=V`M0Z=t2 zr>A3Hy8!WWMcQn}m8RlKq~(&VN-;(!L{bE~C^J9U|H1xexDXHL7ncrSWRd;k?@)l- zm!vOAx3U^sm(;grJ2Ea(h$w4Cp~n2BHFkRq#8bjZYEn`(-8|ndu66-e&dd(*;)tZ0 z!Z0YlWo+S%n7iA9j^a<7Ij{KvlkgKIqlxTq2BdEQsj?tDMV@WM~2lpvnor z%&;)|e6D{;^u*(CRJa>j6={CZv&-e6R=C(k%pyTrN2GmkGjr@0W`>$vJdm^s;H)64 znaG|jV_~Fs@_U5#{6FsA1~97XO!zd%dd*%x>`*n2Z<1*N4pIt|0#t!}#fsh;ds{lAK6egLopT`ZFn?ph(#; zMp%JJAVOk4C7_D(3$mWG%n0H|4bofpdqUZ)Lq7=g9|8LJ0ex9z=pTXpS+lehROD~z zSDySS)SwCSCo?~`_oaR7SC!=Vf16w%?c4qNC11tvpdJ2WPwZ?Ibh^*MR5aEDnhmHv!y>_^1*tz-Q;_< z0JM-sCi$&#{_ObM`>B1lmXO_7<7fW^?l0@v@mIgOsekbOUBDgSL#>*na!GY$36b1+%m zug+V1$7DXk^mR9um3{hO?pps3pPV;i^o;`tw1NWBi^bvX+(jh)+^v0QkHu5Hgy(gn z%*MQK)~Y?0-?maH*WBLzvo~#?YwxN+N04OVC$vqttJ0JA=Fi$GHAt&#lUbOJi2co} zRn&hs>5C!5dX=UoyDZx8$jzrbh!}hSJ=)<74jzpK4fuJIJ~O@^T2UsFzG;LVCwg9g z>;0Hww9S~~o>Q2sC8Oa(uj}1$=r$?FPl6uz5kM$w_ykOpCCJDy8|X$!ksz=y=)Fph zNFE=L#YPV7|HIoSNsV>Pa$CVRGo_%6(Atmw^z;diBZR{6!a;K8llu-Y2B3{2xyu22&^ME{*uU+%s#mVpg z1vET6we(}}4-C9>=+L3}MiZtfg@uLF^7FHesjvRC=(zPSW8hT@#fUD5QBcjAT2PRq zk)K0Tyb(Q(d32PT^B?nb1_qkb82FQqBAreLuYnFOgASIuRAM6x*hn=o)t+ALG$B$8 zs7I5B76LuCTMrgqy>jKsMFr1GzM{Cj{#=~Zb~|liqnWc{I$pOlpScUCa~pYw$^RRqiqLN) z?~wZ8wszqx*V&Fg^Y)vsuBfQ3z3B_L|Fg7F_*G|34Z#=pPmvUJLNyslB^Wst7e?}$ z)PD;I<@qT*BS|E%Y?73aA;I#^W77Vh1OqAtgq=EsiXhOJij+-7X1e46p`1Mjw(N;K zzh_`z+cx>%hjGguGgsRIkV?w9cK zflsZgL*#Aa!j%so`Qm;OD=T!FWWD^Y0O=3CE}^l|D^#v{SwHLLz@vT3C&m1)pab9b>aLAY^H<}FSa>xA{LuJ zKO=E`@7~`Zp+7dv_e4R#{{5qtS4QXbkIJ`VzYmC-d~@F4yLa#4XwqKbnC7qwfH{$w zS#a^i7f-Vq1`hYXGdQZM8^q>&m4!tmQ13zSKgahTibZ|-Nf)Ter^3tk_tf(q`uZp zx?u`%ukkA7)}QhEviJp+$)6>d@ky~21Lxy(SX|#&dkXZa1-a|=g%B$P$QDx4AjC(1 z6QHaK97-tPk~rtfnV{gngsc|Dk4koOUQ*V+vCtb?hT@#0AR7Q0x|ihT2Zi!|?>Uma z!&x%S>O?F?q!9r_7`8ZbjM(G^f%n`-Rf&kY*GI6C{z!?dykTEardL|PQrS=!va4mJ zwTxJh^(H3c_qkfeP^5mcz}syS8+UK(-YlIA>!j1v<^ zCH)SsS|{ojr`{_(M-e_{cZFZueW*}W5L26K+rx>5#>SQO&z5e5m7Ff6><$)TE5`$T z!rv-q1RnDnEQox*6atfq7>}F$3XOF5f{1c!P>lLCYOiW>KYay*kEJxxi+Jv0Fj`s- z@|mHuV)&d?DCy|!?dX_OIC$8l_1p0+P!BD0X%*3{RvPja7t4gHCS$oMv06*+^JP?5 z*VQdwURPJOx?21ic}2=6Q=w4WONjn zA=0FdFmW+@Uz@&z7c<`#%vbgslD^&P%-7U6va`>+w@;@&GdnsYC8EoC2#RtUx?-pZ1;1l!Q?cydK~K8-*OKS!SPM z9FF8SCMSp*Qku4>aAPU3x&>I>0<5HFHUDE^)pw8^9v*o8m9Cte_~BnZ|NQeW^~I*x zxS$2pA4Qp?|sj3|J&^GaHh!{2Ap-lueO=z-3`tbt?_I7l197@b6FE3ws#T9mf zOeTr{$AZqVvbOf0m%;I#CkZ;l|No%s-BbMa3!Q>J1GDiP{;{z!#R8SvZwhQq(V^Lmdj{!4J(D&?3s^M8{~0Of}2RdLe}-{r5&-O#d=PYEU-1KoHhAN-sfL%k!fJ zPd^o66co~$a+ZtO45&_~i(EAqoYI8@P*N>THBs}+6A2ZrdbizJ@3B_&o+bU4XIZlp zS?NxtF9Tvi)_D8~Nlr0$Q=j2*s#m zXjtvXMpHKXO|1Nlti0@>wuF_Jy(hK9hx>m{o3zhTbzzQSZ|IrkB@}G^1o_aH>c1~G z9(t?)`R5f@ZkX@nG5Rb>Q>jHEWrdFV#}No=%Jc;aVku49muHMM0WE|+UT zO{0u0*%a8}Q4_f{3Z`dcw}_2K;pIt5{Bf$07Zp4HZkSpb;rO_knMsSI<1zT2h90B; zj^2j{<>bApS(ut06b4l62X~});f<`t0@gx$xfe{XMK0O6dtcb`n3tdX+qUiQO{KpV zCD)p_z0Ec&>E9u9Zi~F+MX}j4r)2xHre&&QF}!UgnbP;_>k_tx=he&=<&*U2#=tDv z>0Z68=Ccx}x2_^V0thavSqZ%BBsc-(HlJ6or%v}8S}YMYPn$woL|~*8Yp#LFw-OGN zf?2!pn%2}x=v0--w>JZ?n`!3gWqV7OutR(+@PyZ?A0CG1MfA+0X+1CPSt0#W6lOfX9FV=-gPdPnIYv| zIJ!YGWO!QoPP$L_ZQ0W4GZz>CVcWKFrpW8=ZfKwcX(%+|xE!3hoIHs@Rwxv6T!KyL zQpZFnAm%L-2RY`6Q7R;0xS+=REd9vmy&^`*pr**F8XrS*8jGtI{?5iYr{N6Ev0&Q5 z&XtlRE?^ZeV1zQ0VJah>#*QjzY4LcdI=bb%t>0>q?>$Q2OD(t(i3Cz~WWAPF z;|~0EprEla6soIh_`<4&e?&cl0~y@qjSQIxCzUE2RLC6g8M}T=p@XLbW#Um~-n?t| zu}h(>TlDG2OJXaZ%k+n*`BWZH2Uo5JN)X5r484xjee%{uI|aE$=*PV&FR!7Hc0?eKLp9}sY~Y)=Wt#{mR0zbuC82@Jn>Wc31r#@G6_IN>MJ45YT3%Ar-0XIXs1N%# ziFzb0F46H*%2_fmXOr=^>k1PIZ%Wo+JYJ=+@SFTTbco-QUiZK=HJ&Z)4Nn4(8znq; z)LfS_(A_#&L00u|?=B}p)0MnM+r*0BEBm7oW|#RiL54@7!>ZFwRiU*e?+e2hBgB`9 zdz4k$A_OUa!Nt|!UNwg* zgrhw@Zw=@ToAWOY+bhub^sChBfqfGmug!FivNKG|2{_1fx2=nbCuOq zq}^>NV#A|Q&<(bKYN#(;aN#T?E3|vpu4f*mvU(#3B`fzVAO_`5Wiz!**U7?e9Cz4) zo1fUeqvwrx$MamCirQ7H$U`Gz1D);H;FCOF7F%qQM6T0SS#|Y%SKdUVyX&=qz)Ro0 z%4*Heoi%q>mZrYf8%~^kUhWwEXU!&42VIX}l|>il0^c8u zV)#W3BS<9MJTf${iTs@0snZ?Pvjc`X&S{xQz^bYLl|TD4%vQ^^?0k{T$O$;3(J+|( zR(O~mfx?!TPn!)(p3Ci;S!lPJ{WD38wax&qXWDa2Dg~(!2_0e6PY%1g$d$v?_1*S9lyrpMb~C%Jo!wT;Zp(Q2mA#?9?%g|oB#onnhaYLD z2;>*!cILP_`8C7C?cct45duX+p8wx=zI-S;@J4s%>jt<}Ui3BDO6eQ6&Chm<^18+6 zIL|7soELfdCoNQQFfxLj?Y^Zf-#k#^QYtZ4Q`xC75l_xc)@$uMdxnu^{?VuI+Vw;w zReEnEo8@+F$+z*2QZ!bgcz!n|vd@)_^edHMW3TuPnoTnpvm0y1lb77a7nkIV|2zT1-n2P&H?rk3$~@zAdiniKhpR@yn?7vX?XduIh3=tZRa=fpm7jvY&;0gTC(!&g)H*)sW}$C z%FaxOJr9d>GCnH#wHkQoJ69EZW>c5afCy~zT;e=?&Qyyy_HJKacp}r5lbfHLZ9Vpf zKMuTqJOTF3D>jY4wZC`&Nen!e%)IY-Y+~*y`SO1D)5GkiO7_!o_R}KvlkI@{vZd8EbM_yJ zM=UeVFFb+2<*wABZT|7gZ%+i(V_i?nEk@R*etaS8hcCW;&a!38@_zN42>R540W^*~ zlp#=62DWX7Nwh1LJb!MXW2o@`!_02@-Jt^m?+-}Jc2N70>%h=YDv31S}<&<=ZEwEUNm7MEf1INBXvSLRs_m#kf9F%I?eJNyAsGD`o}MDW1k_;6ks9 z$mFqKJe;wzXb2&%^LNvAzF{mXs;Zm0tzz;~U!XuopXxU{FE1^%Aw`Xy@TrCKiuCr@ z#>YZEeVJdIG}st#eP^31@25DK16o7F%~g%pv5!+c;Ayr=7kw>Ll>3KTjnj7c`;)DV z99#B9;)U0d@qb}XJaX`-ZEbBoAGA1TT~ZPFi8o(8J}9Qml0V>piM)AAiO(?NMl_<8 zDZ)OjAd?F4!-IqG9ZlxsIA;|E0*F%gfEK7OdNWm%J==hh<9Lh=(`4`>lgVOL-e)(w z)i)~b+DWWJG<-~;dnV%MOiGU&jgH2Ye4dyyKBOwg4+mts2bt(Bi$FZ0)7Yz!ras{k z;v8^7N_f)lMcyqqD}_1!t7=u!L31_k2?M4OUt%BSe@4l{3?+6@jAl{tb7G5E?Hoyz zqXZtn^DkA@$*VC4T&H-kc!iZ#rIADSIbJJvC_QR1Vpd0TfmbOaP{HB9hKtKNZUwej zFU3AO7%kC1sV9ST2cPakKI|PG?WJ_WXgHD>?H#s_4hNb==7#*jSgbI1-~i4{Y|`>S zv}#gXlo79m%r70UAUnds3gzZhesEVglj=_XlURbdD3+vS7AlBz-J(>98U&bT#8w(n zVz7cCR5K7NPw-0Z8FK>TZ2<~ifGm!1xW8W(E!AOq3;XO=_Sr&UdMPkHi)WT6mvYqP zwm$yc?p^=U-1-BoFr#m7My|PuSuRU1Q#WpYV39ltO)kS{+WNX2qL4MwzW``Bl+9bq z!~@1M7TBOIL52M`NGXqv;(+dJ$ak)S)L+di^_P}g5UArn{OVZ#5Fg?jG{yQ z6F~eEKzu3?Pv>!n2bPFulLtZB=Mx>2D_UUaY}vkjQDRqOmsf0{?!q8Ny2=s*cpdZr z68T#Sy~^RzrAi$kB_$Nc>kSeX+1AzNN`nH%vnMqUeku3+TS{!#?4 z6!y7F36-!SHS7OnhaBGV>mmqa8xqBC8h71iSYREX;@~>HT;$D$=3e3O8LZu5H*y+V zj!;creLH#?r4$mO?b$zI29oXXj?bue|mrpX(YD(-*B=wQAWXrigb*jNI^{Sx9HL z-aTxiL5s#Me%;8isN-PD^}Qd~tZtd-nI zp%tXuWOCyMgZzfy)Rp(;6`eb~z$8ZBdA+CS;J}#3aux-?XHapV-IKzw^I0e9(~@?F zDXf#shA`M1t?<4w%eEGKUv)U{W$Ug}qteP-CffL;PSy?q4sDy1VOtdt+N8K)f_un? z_a?)ToJxw$x)e>R5M_#utCA(0y^D>xi>pgEi6WY;aO_Zuw&-m@l`Tb!SvmPxk%VaA zVJXTxwXnuNsXJ?0>Z3l*t?{pK@}txozQi29$Q%5!m zd*4)?&IO3RSUL8;@3Owl7q9H?4KL@83x&t$pQ2gjT;!QafSAqN{~tX5@!g#R1hU6_ zefgo#d!oJ`5bb>a#m>&|nDv7CfXVH?sIs>HpI3+gLd9mF-3*-N@g(AH2O1{g2|T=m z2BY0@mEQu+EyPsAvq@v9T-C6C%~$VQcXxg5r!ENGqa>2F)%A&tdqiY|Ij)#cpG0o( zB8x4X-7*1*w3@N-PMrz!w%N?WN?eUaLm11qBXnw3yR#ru))I*usibrg=QH@LQZ0Av z9%0>J){@vKP1Ykp8Z{#rQb@84HSx)J@0L`04?OvZ?fmVUc6?=bM}*B_h5Lv(pa` z#yu3o`*dMoZf7TpcjKaqOG*}^;VcACuD)@VjEgSP!oQ|S%G+AuqFT9-hO#o3$)A;z zuZ@m#&luhhpY;OnvI5^3n!wZj0a0`v^+v6_r1b*+T4*W?$&0L=H=}-m+vV~stgI+1 z!^rrBE6Wyss&V~dc;L^W&%02~HwW&~OqsGT4Ri~8n(8+Yj6(9M7I5=CESSJJ(?|_H zDkIaI#%j~F1cfw51PX(*FpoZgEVthP7ghsOc|72ogAL0OcH`l*h}$pA*m)`W*6Lm0&&@)S23QWvs+itc3Kw$vlJ0S&6eE zCY&X%>88jlPwy!+~OK8n70K$mExCP^Vh-L~@ru3g#!W!%2JyrTN1hWcxZfRLs& ziHv)Nm0(bOu?U;KDF(U$<;-?C@=PLrVrbyaAv*g6eZY!u{c`unR?#9#`7r5UN1u?} zU^?SELUiMaBLmbT6ZA47A##A*aJX{8cFn1WLny$m=m2aYv7y&O1} zON`!9TwF4LIyr~=#M(`<+VanuUs7Dmr}3VhUa$9CyL(2a7fZ5*uIn)Pv#dE{_yj&^uCVapF$X=78u@zJ`Kyxs^YOtCDiV@`2Wv?n$ z?h17#OIjxy%v{Z38U#{3>d{Xko?9oo|t`>~k3z zxy0}Bgx%vIMzS1_M0u>M_!y*q`^z1>M}p^A<400hUT_}#$?e{@?blKJ{FQfNEWg?| z^81dC>Koj`39hqLs=@EbG4*$M7Zr)!+~P$`X}5`6E{8hhgYoW9-dd@zz%PJ)2&~_O zJQY;dt-BUJA+0q}!y$IV9e&JCXtu7aTU4=dQT3|YYfAv74+uyX(!Baq&*JvSpgZl zFq0LSx^0{E4wX!ey#CDg&KFM!4VA^gskOD8ovhQK z#kH(v!BrP}E`+FyN=|NR@n!dnBYm2+)>iKDbXRaWaFZlAL_R~mh*L${&VPx)Q3U1@ ze#_TB3X(Sq!#%2IxBE1j?rMt9WIL-+cHs>+i-~)@`LvLV;~>=%W^H&JFcGo9C6EbI zQ)*r^2B#6s`bXwf#k{1o{o;OmvAgw&J$-B{Ps#k5Hk)+{n?5gda?`iAw*IKQCywbT z-qX>_=KnDU)I$76?hM@`n#NB|j&v3PUyE222XkN(&k@VG`_@2#(O zyJIq^XaCVeWOOJ+4id+DBspkksGje!Aki2-jG24VU_sI35p?ls;ZY$1%-h&L2P9WwER?EE__C1X@RS1LSR@*-sbb*B@wjoSgId-i_Kr?K;^Sl# z#KWVqe{cLgoN|WoDD*fx4kNebPocvYvPsNuP5B8CbMT5;12#oC9LD(Zp@BmKqj4kQ zCXf=1dnDrO-rqZ~W4Y4Y#urtf5Kz(8?x#XeZ$7r~A-a6p!ax9fx6_j;q(7|rK~ft3y`#7|GmL9?+aJQ_;=s%< zT(V_a_E>}_M)C2kE@uL5AmO|WZ}erN#OG5hro{sJY|XW6KU*n%xR*knE_K900o_xV z?J^!2c;}q~qKt7MxUSRffvNdxkR8Oq)cj?U-}@1mEwqecFra2I59u0@9%4KBjp6rB zM6sCiwF*?oT;=ST-=bOw{Lmz7qH9S)W+vxin!}M>VDn*Qn96R3vF>adpUyo3+GJ`P3>I9O-rim8!m= zp{{OCcoAw$n`wP0)Yv#swg`UJ>ZJ&nx@#4++xq%~%1(Ds)XTQA&0uW^st^<&iOZ^| z824feIZO{3$j6S-_LFJH;}!(mhfHLcNU0bJQDFHcGQo$iCw-jh+I@QcWLK)@vr+o2 zS;vh=xtG{R8_`$U8~pZi48bhDKx~E2#0v9 zg?JfNq!o}qC?*1umrZPhowoioBN@vSx<|(#<%)rCK6tJXeXoin=RAA_6WZ;OTq4)A7 zG&Y5!i@~i5aO*~JOUj&Afm^eOHC>z1h7WWSS=V`BIP;3y+S*df@cwqxs`mYq$n?!j z>r+YOG=tc@`NwEP*MlF|JH?@AHV0-qgjA^pg=4-RGBDqv?n8?WX^wd}Ne`7riu_Ul zL*|<*?=>OTthvD@dZlQ)tyj2iSQ9XK=2zTS$u4{xY}gMJdd08c)Irm274yrMtXwO< zYC*t!S+|cqBU!h0#|>o=5aM2>DDEdYUL&PjZ<g=Bjvc$6 zgQP$G?2c!jY>}U|{3@)?D=RCrh4=k?3sRW0Cmbg3OFKR!&`Bok3BUiqp0L~*nA_9S z(6HvV8!9T7R72#KS5_`raT|Is!jwZC!1Xoen7=~ualfHVw2Y2(f7w;uEe--XF%L$y#JIloh$%7nWC5h08?H_@zY^74#) z(IP3^J=)N)Rl{s!(6A}6Bx##ME=z&X6OYA*hOuIg$9$xONrF1s-+yQ@D)+P_7skUK z=)xmKrwO8Qr5u(rD;Q9~=4e){Hj&UqqO@tmtY9)GqR7O?nRZ9sDYJsE4Qu)NG%=ML z$0^eSW)6%S`cAKARccrj*>|auRjFWA&XqcG@f^D?$9}qatn0)tKH~Lyzx|@F6nE-M zu`AP`MG5Ncx@a>guIsCGe4k8`u6$Ud+IT`5ZUX08=){s^P^}~Z6MdOuvzTajjcYW2 zs-s|PzSS~;h^nA>a)ao&Uy)`sU`wX3)Q`1fB5s1zXo37lWPrMlLlHU{M)1}|A}3-# zD~i*Rcl-Meg(J}w~t7 zDEr+X?S6j8j-Jv=)4JYtRs*JUgwYX$QTf{z@^Efqm~C{$nH@VTn8tFNziyU#CL zB3W9M&u_-p2b5zG-8`&$$!Xm^$;VP!+AHX|QY!qDz7KvnX)gPLXi+^n?=ajW3{s~h z4^qa>N9~2=rC_lHIg&C0zIeT^ zjrCjN?;`ETT{o^3)jnIO>uGM$IUwd0mt0ovF3j}Xrn)`XpuK(4o|LAEKlB~-ivxiw z-E;jc#ur%_dM75Ztr)+WWvplZ?W?Lj;VHi0npLZ=ziPpP>Q!H8q-KW~`|?AAI#Jju zr8)i=l3HL6Aa-?lbUf}e#D_;>O|at(+Fnc6odI{AXVJ1}S@X@>Njs*maj=lq9w?(x z{TfxWK8!bL`w(W7Z*(FA@uQ07r$RN9Ly=a83^kr5#n-sSxN%-2ax6YPJ`z0%WwDtx z+^yK9HI2d`R{9f}bb%UScRV6#yP)SaPe7(0e@{~}Z2K+fWANW`%KM3oRMmvE)FA!A zvsp-$`7MDvB`JZpWXQk6yl!dDA`HL(H^>+*7x@I zK(fn=i?1xHTztOsB*pbgIJu?8pIvbiLfJRgSu@OBi)g=JrL4rqcY~EB{)ZE)s3{eT{ZODQdYuEPl ztfPTAgd?~JF1RHqv+;{Ox)!BW6TTagI?{bUGXokJK*-@eA1Dszq-R^^o}bH;&I5*0 zca=F6d8I|0`+7Ysy}h2+O|IVlHuMC)Y^7G?(|@C+vBbf=?%uWTqMkJ_cc^jQK#{8s z`;uQzeD~=m1SkicEQ5CGAW~#u6+n0DwYXRYk#5teRx|V}=%sB^Utg5}acpKzhoo4| z;C_&wsw=uzmAAiuf4n3UFs3- zKCjrrZuW^9Y2s5GJP|4{h!)HGe$U$8&MveGuUvR&VLQKrGTCV}|3jc!QBgxt5sFuL zfR3TSkUj0dDWnA+%+^r3_#h%b1Go?BBf5kUrSbACMl_2N<@AhBi2mU$yN5OGEpC=+ z%Xg_yvX)2~(dZ^zrs{WhTL3UlK%ctjPw_yGYubcxvM6TH@CY|GJc=)`<$^ z*`$8HG7hY9X8Y9AnOeXyFmyOf!tV`5e5N?< zf$>F2O%XFb2Kjq1=6kbZn&z0HIq5%%p%3n5LXBbDY8x;noB?rJ$v^Fzr{qIjo!gB& zUV5etJ1HUQ^BQ(S&3%Si2u;vDFwoxK(<94qN;j64N$s{*!h-!#Q93)8>G= zBpcDlR&sN>2+G59bIBCiO-+%tr@it}Yh~$aGDFZlbMa9}*R3lSze6|qow#6KKy{z{ z*(I#bFU1%Zj0q&5&Dv+rU9k8|^243DD`jcXpAw1CczJ*h;II}LhT_NGPZR{OHpL8* zhMe?UC&F*XM8-6GA!?&dE7I3{diOUh#m>o60SHO3c}iv1d=$ z@NhpX=Vs*|eYDfDK@g8l9FL6dkx}+y9+5K!hr?;w!0XV^sK%?L)a5*BF;BXlCtb$c zAgKrkTiP)X8l4&5yN$4D>%iXa=&{>h#Bu`NFzntf27KP^mX3a_ySNfWT3lS5@6X7b z<+UjZ7 zd!egq*l!x?>)E@zv#$&}Z2kJ6QdG7Aq2LkmLx@@jy2RU9x(^fiu$#aCDBj1%AK^37 z#}FYN6&p-z$n`1$4gGi@Refi~^qeoGwoS7%^e()SS^19KEQ>WG*J{eZ5JC(uLMDX5 zM>>RN!jnliD(qH9+?$DLe3O@M?$k%uBO9Zr1twnxG=YrVC>S23KG(@Ob^v?@Ms<@8 zPZ^ISv%6&X_D=!ND&ToxSj?PX-15ym;VGzS=02CJPt(2sziexxXHc}in~Ejv&uriR z7*O6pewoiVBT7=vE?D79eP&Jtk`wO5K)QmShParFHiv`E4SE8NP6RJ>sBiDaY%Q)ezQ7{zqnq{UvQw>^+J(n%7ulw{TOFy}y{%bc&F^!`Qp0*Xp%XK+M z?A8&?<}w6nAEB%x_#`5H*2PLa#aS{lFKD`>Zdu7ZR_7iFSC*bpDD?^CcNPFMcOn`Y z51ti`Bc_RoW3tt$Q4fc^#Uf)(YC=2Fgww`v zwC2k|RGErrH3##pnP&76tWeGz3%e_d%i5=nQT6~oDHik?Ry2d3ik6zm?g+?%SvDv* zErm&XfY9kj(ck@sp-9?RKA+W{&+5v0Ff!jnMy8mZ&azO*+6?1>Y)Q|mMbB6D5}v0N z?}7^eFVpUhj$&c$-C*wP>u|e=*C4I%u>n(IRHmbQy`tWybXCG-$RIFPRaSP1Vb2Do zy5VYEJP|4OO4nL-QEmMq`GG3&{NXIwiVk)hk6Ja0k7)pqhjZh$xE3C^;$YNd5(!Z% zI%dke!=;RUDPzBqv0uU1-J!wUxkWAC{8=c9nlKW2^`#x2lJ<6@QMUh}t@UAKwC{JI zG5BmcI`ZdlhYJZksH!UQS=X**TR?NMX+$Q1?&8AHgS~6+tSinSi^}dPy}GKWd)2C{ zy84@Mu5bJ*GU_emaB`o`gu++~8Nb~6I*opR+7Xf!#NF;$E}ZlEI6{J1MMamRpR8D3 zwq*61<-(7PwiWZvH-T3RQ;$NK`#`@o$bt+LeI8LIXk4@E%6Uw_3AtO!Z<}eXmuSk9 zY4g$OiTwkIj>pw}E9!yI7Po;^<71I1-(aHwj6ST^Qk%f=hiPx38Hb@zf`)ivBH_z3 zoutbrU3bGrPvG)IEz>X@#Z`rDPm@$@n?$~}*OQ5eD`-4!$uy=Y_!oe-^rx)@+BX4h z8Bc#<_rdry1mNWUP`lS_pLQbj9Q=3V11-%>Fs5(6(0v%`+b$07+0pE6exehrtk0-S zoCx z8C9gFrV{dS;apd~QLJ0Hy2PnU(@>wi^pB{Iuk7}Gn5<7p27b@> z9}w>lO5e=p{~lzZo&RJs; zWE95<^_d`YnAuD+1lxcCbA+ZXabI2{9!+LiXF~+c(`^M7>~6lPy45WaiwunrffXkOhqy7_4Wv=W&=1ba+w)#Cu|=>!=%xhhe_A{zsL-|fe0&t-^D2p`n4l4N%xZzq zNWVFW9`^ifiq;oxl->a@eE)(m5rh%P12L`IESsN++dR1>Q=o3L?_Qi-` zQanj*1uBr4Kxx_6G{`%a6eN{m_+(|Tuk*}*<(ZFwhYdXQD?D>SU&O|Co8fTG;AP5a z-=6KnB*`E2_orUzi_L-MxT1Z(e$?yr{;V%j2m&Pf_O!u{XbI@^XTky#44vc?${XqP z6jZ!qQJigUKj{gJv$_6k5q`C;yZc?MYateZ6(ufXcc92+3F9SrkN@EBh}CteG(5^g zNdDh&sVnm!4D5i(b;YfdcxtO~WxfS3OS(!v3(Z)FF%l=L$?5<>DAF5E_%kO)X%C1W zY^qiBIc2nsLpun99@HF{tSu>-KGOFxeC^4uzC=mD=$Us}b=@7y0fuBrj}U*`i9~w@ z@hHOoBfOW%O_Sedeid89ywb9&+Pd2+Akp%Y%_K12UccfKGKJ$2INS3&st<~O5Wg4e zgp6f)2%+2xYg6E92}D2KS(t?VU^F->4GX$y6OX2!&<2f4Q2NKxvPAZ$bPg;2bNEA= z8Pvq^;BbOat4v~|67kXF5em6jvZmSdb28y)JZOSw75ut{R)fz;3t_xkJYi82enS#} zKTj}Oz;{H|Xwab%urAm@(j}50k#+OqG$h%;yiGaa~BU>MLlpRS7I7~7jEGAmr$A-avV~*XzzNH#giVA)X?E5m5*h4+MIE(!%2rF$iQ6`KU;r=iDtvaDHBSw9z4EqS%f!~d zWbz(`j_uojB28sIz2OOM)26Lm{aFZdbB4RyHU*YI_eQ{-{m{Br;mxjHKpf}7ntG(2 zl9JnR;n4Bq0XW0tW z;m8>NLCG|YiQ!Rdo+&3m(S$fQC<&n{F?w|1{RjvTx@l3r!K~p+B>BynpT&6N5mP|5 z*p0yyEi48zE&?;8XWk86a)TKL{E-paZ|>IQTGi|IO4aal$$Bl4;iNP{u6+~*CO%Hy z+7)o_VPIgwQ3*`9lKz|$OTP&>Y1bSR17fW&cUYYm7|5~5hQojAi9`;)5vZh4 z#E--f>Bi_|tXLaL!|j)vVll_+fLDpdd<30}I8a6l2;{2C9I}cg7+{7~O_&XwlI!r% zcR{m`9Etgq$V4DFfmJVo(wB&mmV~0fIT;4@cO}z0G>A3FfTvKGzC6s=!+bs5ZVvOE z!+dpt(c0Wza;HVjXyoHK&@k1@kXF_z0N zD!4Rk%+hF7Rm2vGJ|w8-bTR9ff%N?@G3c zP4ZdP{+WChA$XCsYrRUZ!y59lRUf_-rLnKch`UK?!zc(&5Q6`*V~T-SjTDHG zFX+RUOI=cD0MacDLz7hC!{-x{`qA@)DPB^>y`>fDa_;;;B&xSu&&jzd&%fpQK3rD& zcJAuj*R%gOPj9)mf{fMG?^_ z_?V}pX7K@Jb@2YRr)-l?p>gcr-esr3>h!sv8r5QL8_wha|*w57y!eJ*)t=H|8?ze7ZPbw?W+eqTwhlBDr}a;V3dE1JfG)PB+T zz=!eRZ||B9U*UsTe+WO*&q-kdUMrvUQ-L`ji*IR<^J?(n|4NT@_MSa^U+eGb?tJm- zZSC#%F2n!SK=px2${1Xm{5*fHqi)E}dePCwXPf8qGpmWPhwWucY7hL{r{2gR&Ayd9?MaQ>|f6^$Xr*Flnud1q`3lF z?pB?X-X)Rqe~%Y84UhCbNWtTbeURoke|5j<{2;~AdYUI=ej3p#zFbV9QjLD5snjDSL77-w(d#HE?$i3n%JtTeoLXJbV)@ifwsW{B4PI8fjO$tABT#i78fOCE^s;) zNkay8Kc#QnT3wPk*xv=zf7{bD>bJb#-}9S&!wvQI$XM$fEujNZ&33lSl}jK8*;Cok zp*Oo^@Sbk{!GCRtk=P*P0dbDTCK8*RmPnMiHtFXuYgPiw@MzjF0pqRJq=14u1A{R+ zxmHS1ZL$&iVwQnu5t$^LWZnE0JcT$3@CS193<43PixV4{fs~@mO(`mr_FOLqQqpr> z1EekttFuY&-12I;00&dM_bGiJW;}34j31^Wkg^WiQ0A|9w$B5_V_?wZ_P@NWtj7_Ts=K56+3IpcHy$h z-h;<&&Usg0XRWHOT|vZ2=`0x!jy=gY#l3p<>ho7zG7>VJ8h+_66HpP-dU;s`* z!eTMqXZXwncoO|BHwv+?P57v(n9E|^tC@4G`39ft&PIp=IgFa$YRY%y6E>2>mSRzT z*4S_~HpY!`h?7E*No~#Kgh*uM=rNeYUUpHEl^dxzA@X!TwFL|gV$-#Fy%^S&;tu@N;H?RlNwKi?ZpiEJ-($BA*VHsN zVlRu-)e+gL^e*sOnwu*YETFH3dqc*ST~yt$ky#YMAy#U&{ETEl2l7cMs;waksSmq&tFPf1vx7UEAHo z_@djl?fkdaM;^i>@c0Y5FM9M)D72eMiQf-T11XnQ+P(LU{{91@UR+~N5~-t6^=Q}br@rYYTXcdr0+5D4 zpa+%l=ti##DByQ~OXgUqg)(i4P%?{^IMfqS0#-4-1~Cn5y3<*Up16;TrGG_ja!czv z7JswtEMt5$8h(!iLTbKYBZMNv;y44Mqu@akw4JgHwe+en>K&%mtu#{cisdk zv4`Gg95dYR1q7X30&9WO(41~GDI_t-W>?Nl47|7{aDjVn{y4t8oD$EXhP7fW%d@n) zy5>tYmDRVf=WDN^pKdfdtGMFx4KJPWr{`S~t>1ZN*AMRZH$U{F-FpW6 z5BI#h>xbWxo@2bQCPNdHO}dCRoDieKk&}M*FrVPlI2JrVGA4trN0TNEtG!0GZYx>L z`1A?#z}FuQv!>*yk--r?`W|;ooIFWlhXggA4BRgokqcH$Mrz^c!i$#^oNCdNQY?ni z2pM-m-Xcj%u@A$x>a%f*g($IO0%xhP%JhVkf1BuHB8JEsA^%OL+~B4oB@@pJjvZ}s z9cAaIsjgHZ`?d+uPc_gB$5G|j8QkMl$<*+j`f#{wxUAmeRa>{T_%gg~ppp`l zc?`2&Ny~f&n;v0mj)!F?a9B5aLlxG7FKfY1aW0OJqhO(NG?}66Fq^;ZQ>|M2IqJiL>m@1y{z>WRaKXP9v8c8 zs&wg&*yb$ef^%##WQmT)ygy&K{o3? z^(7_aR9tCm`+fg-2{EwilXn;1+qUCnh{U0BOTl>;7hmcru#DrK4oQXpahtyRp~trG z?D%tNf7kAvPku*dAM@Pva>ZC5E>Y>5Bk`=sK#md#wg$PXu!I0)eLN^-BXg8E5{n>r z0d{MZp{SgYkSX|9pJJNuJGJ5Pu~?i=vpIB+9Pf{h66};^&&i_ptPQ0zb0S@(sdV$Qeu{LXFvX%96fp^NboCR&3fh=5$|#>h)Rg#@=<)wghEzEu1Qn+ zhlft!;x$=_-X+evA5vy#HiSbE4KYD51ECkHDl0-v;O&DnfyjA0ZxqCbG8OpMV`41D zXQa%q8vK#DVKv~-r@^23y}#S>2>9?+chC4ab}uoV)vC_J#F<`BZkOfwnAk zxGZn=RIOO(fzI2u)V?L)@mzetv`FvE-|+|U{~n^l!<#q11Umd`&z?UH z#&gasE}H8w#oyo8wWnt!o>c^um>54UL*~SoR)Sw#0=tL%DCZIPh96k=|!MB%7?8+#dgs8a83{^x%0(zzm+3Aw-M0K}p+~mN` zX@E_!+BmzFNy?MXNX=$N(;g^eRppMI(2|YDzCMRTz9~=MMUK}2b%U_;>FTGp-bjIo zjkK2G`DhV3k2ixGW^lvAosc;BFMT_k5Do&;HbEYQx`&g4x|kH?!c+S2$6vWMb>+Ot zD~I$e^Z8AxZ(0xh_$x!HD+ea8Tp*QB-g6sC0Jy#e-C`JA%ktPea>sbxE3gz`%1Z~X9; zwo_LIKX$d#mX0&7bNFZ&$rGj3g=a;5DOx92ENw%T>nvB>M|?lY2R?*kG&`Eg%9gUh z|JwPmcm4ipD5NYqo20R$lDmtiKGrss)}W<-`jjX9@6w=Ur1%RQj}yH_rC4XyPs#mpnqM}p30@0c{7=>dt@DZ(EL**LdD#`0)!e$Snous; z!!0Q8W*HB0ydr+h@;{pR+=x7K{p^FKp5)M;g!zMQ!-JLFcCzQ6R!oZ>ZU z9V8w3^7rW=lB)b#KV+weUqe;?mM-$)@uldiK0eo}@%>fW3TKktKTgetgulu2)0W=! zTx8^JI*P}=-Lb1%>vZq-ocbtK+UK!qMZG26LR9J*D@w&$JpxNztIq>_oa_pPxe~)~ zoFYb-EO}#YyV0nJ*$~&0+E?ir z$bRoKy6W^9l(v?(c57|+p2|}*=&I_fa%dI(t`0qlN0y3iF|1mtfi1-4Ssn1dT&HuE z+nu9WodtzXyS;FFATJy?JJ;QL8$rEaS-;Mi2*Vz|$~r zHZ=ze3@Nqf{z_(sPfd)C`jm`V>I}_nqCk>`XuWg>r;NmtGn5s)(lgW(Hmt!do_S6z ztJCLtwn#%QF~7{NfF$iX=gn~z78JVOvkL-w_4QRHJ^K$~ZhCuvPsz3Q`s{iKe5QTB zLv#H^u}_(GE-`pP)8{>0c{Qc8gG7P82$7IeeO+uNmwsFZ(9th0gOM4=nVuQ@u8i}= zwugCF3n&o@fdne%7!V+K(kqKoo8n2fg@yDKlZi+^C15lYex(p-7y}}wN8X&toj;Hw z9{*S=BE9#{ylShY4fEvQ<0|BBpA@w9UuV+#Gq3tU65y(jkpw>eSzYqZ(!(R4g_QiC z^Q3N*C+d9V@elEp^i$5HcH8Co(x)aS&p$=&KK}dctQ zXl}B59li}Z&SZ+z9pqfn*@j+q>*Inh!kl85H&-l|uR|zu@-?4w)%t4z2!RwM@h&}z z)9-O=6y=FQIf^YPi5s+`Q3_Y{s^OP$@;ZlF%uBhQyo=O6-9bv}AHIW6b>q_6pn0eU(ZFlL=u-Jat&ai(&+|G; z1STWXMGD6NQq3JFWnZ72&o(M_EO-eWtXi})()?}~^fvQdVbrOb|9~!w~ zXXkccxXQP|P%Y{p^j;n|bZAfv@-Ra$jwt@dAA%D7pMhe1(k`Lc&odUqr{ z%@H}g%51C=US(A~H9e13?ywVRe1i{f28uTW#kta`Gv4zPndG?T@t^jboa(^-{D+=H z*rto#?Ac2UNM!i6o!?xnchQnDIqQ;lX%FxG(=m9DY**Hh@uQtDO4|SPolns&!02{u zBDn~=+Me#;VjlW!_nt`jxPQv=@SeynEKIv1do=E>m0IoDen+<5T6)oC_zNz($XXi5 z+Y~Rg(m}qla-;N8Ret$e0?41lrjaVD-p{)y$>RR18NT#(lWo2bG2sHem-H93X zPT6~>g-N9c!DImt^(C|@`XegF% zOjtA|E1~e)LeW%92K>x&a-8^aiyO;my1(mJo3EZs z{JAgdpH^KyO@3N%S?$*r(VBg;5kJwVYd?22++9C1Kfh|Zi-G(-SZt739QY6pJ3oxW z|4kG(;PU$Xbts*iP*2m{_;&E_em?OkpTE8WN+^$=Ao1kBpS zGvr?PO&+iES3A9FWO9p4^@GERcH?@?tM%U~=bLUZ_;+rQJMLJ7YWx%%qz`pC!%VTD z44+;!XguoE&LQgI9G~_Ei}S|c`1ZfFd7KYEea7Z_`(t<5hfn%%?lA19(kZGuE|l-3 zHyAtZ)E+x}G~&ybdn}naV~_c+iVPiP4<02m*=XW>gCQak>_OTpkFf{G|K=Xlq{)`D zCu~y+GJQ+mExg&NkHSZuno#LGfBNRUYH;w#5&GGOj|>hD@cJH^zk|oZCF z`}#RJJ=pd1cjb=$?$cd^*{AL3P}eU{?dS)y?pn3*Jjs2|y+Zb9qJ+KN(VwcV z`(Q`cue#yy+R=5%2F0l#GZYh>;uS&B!pY-F)ZuLy0lNt+?$n{@guN-Y zYmy>Jt?Q$@nTr$b>e-6|Cx!C&g62*t<-3NZ3kE2^`+V7q&9(*k6 zI!%1I@?%IFp&}%tk-RO%2dZ&eCdvZEww3+QfevX`Os1y)!Cipj~M>QeP#^?ChDPydK4 zR9(oe8HE&mI8?vdfcqB9ZnfNFZgsm`Sx(N%uO3Pcak;Xxx{{|XZfeXWmO`qmY-vI2 zM!S}XOlL*f0s$<0KC=Cl!s+t?5u|%1*n0_S9EOR%gojqs_e6rJQS_xszBW2kofCTxB_q1sjUA8-U1TTg+a-CjfB5>JGR~fW3>dyrUg&g{XHj6 z`uolz+#^&=J;>$?6SE%h@!0XlmhGUj?jHxKqv&juB`&C3-`m@V%%dN+HXb?Df(%d{ z{^K3(pS5>%;PfOO-`RGwv#If;Bdx8UwjOB$%eDR=g{(71URX8^%g3bOm&K+=IITja zO>@DHdbz^((c2_^!z7;}R}a5WxAb&{?yCyj2fr=d;OF&3}HAdcv9HnR2Cbp z2=|32WYxkt9Ux?rUcn=D8Tt;X7&~yw4M<`!^X!;;HkWa~8SP;6+-w!!dq@$TJv~lE zY^<1z$h1AJtvw2wA>^`d_5!R$`c*+$!EtX;HlCG&XI+JBC!Q77>GDIieB^X0MBpGF zY$2Ij1rDGAq+nnHh0j2ct|05+m0fWA)5X_tn<5g8Mn)B=q$x}nAs`$U@k~}*l6IU z7bdjGGl0iaZ&3!4TkzcJcy8EgdOEng&$x>Y1Q@AhPYBR6yV(*|^#keJVXA<`GhbP$}IK!xbI3Fi+92tizk8NLzp#_&nG-@I`r z$iz;)FGg2a9}be;;ppJu>fz_gornhUDi+hd2!7HC{Q{bn`5Fj!I7#JCkZBC`B;qRpU;Xo#t*CgX zLxgP^%(Bsi=gyToxf#U3&J*}mV3kw!R~(PRcl5mt-;a&_KBDpGFx!6?h;8reIF2Bm z{b&8%9XRjqJw0%7%nE1w2(1X)eCn)lHlRY+sGmnX{5;Ikj84UPrG2JY&?$-z$+H@e zgBr1=CL&L_SYFO5Jk|~g#%?t=tsP1pg60GeIiDQTEBOrG$Qv;^dO)!15Z5#lqL9O$KSStxQs3-xdOJ-f2NSqFK*j*0t&HjQ^>Hpl+kHO zY1?B;O11^g9&VX}c2u!%p-x7N(QEe!q(Bd(jRARz<_8PxW^;~iXIPGJ^dw7Dh6&uW6J?1D1QQB;u>Ir zye{0@gNeQDvweq-efC-V$%OPB8>^c?K63CcyMOP4f^+oj*<)dZ`tE;#47^-jeHym? z({Be|`LSZZFDdDUso$S}@2tY<*JQex*Y@zw?zuhhru;j8bRWpgM$hP=|Hk}+g2|aK z*Vv@AiNWTkkB*(h`fUYDu)~HR{@MDG$x}lz;kK$6_3g7-y`*F#;`(K#Dvnh+QPB1$;7$3t<#YHhaJfZJ=BPEd~V`;o>aT zWzcI{1!aR&0#by|&DB-8Gf@deLjJ%S6C{rR9?6mY9iSs`|+$mqC2rYt~MSPWWC zk(aLlt|>MeWjCd0pKM#6o=N=Iydh2BKehDq9B+7S8|DDKy7DNd1&$mz=(=1kO<}j? zA%NTm>=D~c$6xm57DF&P;akYFUcAQkRJdbK*g#Uvl(IC5RTexi?&5uLs=osfSa`C5IS%ec0Gb0E4B}5 zcBo%{#-D*Xiae15%voILqOzJ`uZNvU;c()zT&x+TJh8^D&EhpkAI^b9T9m&Rzce3F z3fu4sm@86e%{o+pYVr6wIl6~p!XvBrSwDrULLVa9B%BO<(T5IosZOXTV%6?L_yGe1 zmcpc}(P#PXc)$+;_csCcwSXJ(&zQCRtspQNe5<@ryAPSQb=Do9_wn*aLRwFK6O+?b=eg3C(`4@}*tM_W*P?Ch>m#Fv2Zv zgz=t@6B_q@C>r zm;7m4+vi;{^@gtjmLX7(6FsL+fgm6iCI%ElE53XTBK?89AVPy5k%?d!$+UsM=~MpR z(}--Mtb=$ZX!;0&dlYdU-$Wl5p^s+*vo`{>-vDM~9pL12_KM!|FTHZ;Q2EMS?QZRE z^UCM9ZCdYp3>X!fUPVUq+1l)=Rexw&`NFnskF8`QoY2o9yC-EwFi_h^#=mvxZu?g`}UMbMsc_M(2l_XAz%agj#4)k<(boG4k z`SBiq-^o6tgz5UCqy5XClYZRN)7b?BU~61L9P-i7$YbjAD~=(!m};R68ptNq-3H@0 zxHR}rA+dzdBc7zEOV*L7%VWbfHQ{s+l-Sspz7nG~6{9u0GLlyamPN4vq1mx6N)us3 zfrYVYS5s4~)!N#m6mki4v5OW&K7&;Xh)GK8qLhYMwizCtkp=^THn3K-Bp%b3$78IG z7RH{gAa()}6$?fLt6;Pb3ZQS78*3x^vfmb(HIyl3Ea2d&!ZajWU4>>c?9W$9{|X}W zuQQ>N`a5U3OY%*cq<)}Q>cH;>sl@e4;Ce zklz`OU?M&Bk{y*!wF9bu!`5!}z>L1Vh9&}bewkgk#>2GiE zN2hgnBgAGDav+7ykqR?PQlN3AIWYVUvnR>wa$!H1!rL*LK>eX}n1w?c33{H_XA8x| z{01Twy|5ASX+OvN&!gTDtYh%_zJBz1vBzr?;N$t#7}}X^H(!i&ldoc?Q>433nIDt{G1X)I-5++mQ&k0Ll(vt$5v<$i`wn6? zFV=nxKmKoM$vARwAc-{i{Zg$|dE66&p^HHr$GBNC!?JoA4PV}I50?r zR$<8Y2E-aWx%p^M0op^6nleM}F>l@7+}!+b8ReBu(MCWiLB~A^^70Er4p<_s@s&e> zvo585!hI}Pn3hb0mW2WJi*@k8W9X9U+|Lx(8@BrHoyq*7c*xp zy?;K&fb2o0wXbF6+;PW5mUbV-M_gr4S?M>6p*~Tj>5aS*YfOo@P*}cBz7@IMe}u5k z(peb<1(0VrsPa7elb6g=6P%eHf}z=@Cd@%?SN$jc7u zLiwODYJ^;f+8aG$OKWQjTCEGk`n({^+%dyiWOd5<*+V%4M*1biuo~ z^Zkq>%hI-R01TawkN}ZhY(9A45PDF5(k+1hX22gQdpBYU(pBonde+E(FTg#_&3+#p ze-ln_ivI$f#TUv~le^v86;LqZ(5}G9y+^>#-gHc!~C%mV@sM+QDL23z+S~toy=tDw01n_$7SRkvwv|+FlZ%^aCRrr)&f? zHbeXS`x?Of0(%qOA02P%^LIORD0FOxQfhrnl2e51Y*NygQ3<2QBw>Xo&G@4+?OnaS zyEUlq`PQwI zmDrY+z3&_irsfxP9S_<^Vs5c@H>>qn^f#+pp+DcMzNyx!_1bmjXUd;>VjY{}iFLar z4tMj`R(Lj1#B}AmSkE`=OzS&XpZ`uM(igX5xY~_%dK*%P!!N6EP>70is(k_}aTGX= zNrEDrq1?0Z)kE|~{K4Iu9E)MkppPD+q{F2Y@>p<_V~Ja>mSM@IlTv}CF~j>H0p(NB zdg8b2E)hCQNC%TsQr7j(+`W6VVwLJ^Yq!(iCeyL@FDiK=vyJhjnq9UrCVmMACd(TWo-l zRtKyscu||m6t*9OJzj>P9xI_cu*&#=IUNrqt%dIiOKT{FB6=W(i5}<^bX6u{x;PwELx#_S#q00xjD2wPHmoE8Dc~ zxkAvT4D2%`Y7Wh+SqbBAo?%%Ue|1q>_RP6?%!{o?EQ5O2|DHV}{;YH{B)&2*rihWQ ztc`9u@b~V)0NiLlJKUtmB99pr>k)0S(V{OpJ6<#)ths%}=yBPKkud=)MMQ5Ce%M@E zHfPDKAW|ZwaZZsmiT|QJAxQoSEN(O>rcAmjDi6wjGFNQN< zZlqzVtA7t}l8;UY_f({fr4fOnM}@9>iU$jy$2Q1dn^aUZIU~mGDz_I?>&Wxm=b*vn8eCYT<4@V>jh zJqarDp2WNIFo1Aa#`pB}f>?e@BT(!*{@&`F!F^^8k?4D{jdic~OCr&ZO0Qgq>e6(Ny`1fmU) zfs{=N<&#WsahBwQ{iI6(H)UkMqD=uwU_W=WEqqiHpV&wVP8!XokZR)Vfl|`L)Uz_v zy11gEz3WIVq0L}Yq+TK#4$kCTN*38cg|f>9Y^kZKQGt#I1-}jAFy2El^eEtx_&J() zae%}DT-spDcHm2jW4~a5B1`?&oI8qEl0{Xp-?{5GM1#jRi_Pjn*TXFR3$s;0oHuPI zB(tlboEM4`mxqgmrmeEUu2s*Hjuf}b8lyk20X8N88+KrW zWW9-i!D=CF&@qi)%jY9pc{!#=5C5SHm?1rFV+cVp_7H*$4bC+6q*@L3y9hE(k@?TQ zuEdhWDRu*6#ybNeX3wSRgN>Ha!<9N6q@n2T@t^GKXjeuLN96ExWpraBd`#2R(_?~N zjZID6EG{!Ma|G*YqI=FEc=-7_nivgShxg>j0+`KKu%!YsNg3Ren^h`qwT|dV7T$QN zjC}XTIx(D{5)Gzxh0RxV54aK{bI6M1^C3p6Pv1HUQB~p%Dc>mRRViC^5#5zchL10> z6@0-GGA>wwVqfm;GWCw7ZssvPy!fZ3x27v2A9^SsN#2ehIe75kUk@D`jc^`6 z`&B+@C>@G&Cs-Q^#~6^@Z(%d61VbQOyFnX?A+P}Q*7wm1-^P3yr(Flm@n#D0m*E+` ztNIjzxc7Iqwtmvw=HK;9`BN{vf&o{L$7O31(JwUB7C=V1$Jh|kehL9?0Ukb4Kc+x* znxP+4lxOeMTtN#(5mM)(*CcJp5F|0bAiagxVzOj5F$uqXh+ihJ zPPPi)Ltlw^Do^7k1WT#@L&fkr3@B>pN%O;yo`a0qajpbu+6{w*PJu_J}H;tJvB~Ho3>DNUSn;@$3{r zx!L2*Rp+X6m0Z4sZ;?k8*VPrHS4L*Eo)S%9U;M2Z5RfTO@Pp#paeak($S<*utre&D z#noYhK#49ZE2^xhm_2)oyP#kiVH9I~1IDw@^dKai#s7W_gx@lFd_4yhj&W?l)k@P` zsDVm;T8Q6vkTORJG$d1r=TEi4oqfdC?0ixw;5UqC2S2l^30LumW_ zjHF_v8WW>RXFgTdih^hoJ^0;A2_H%MDNxoFSc_wDDqdvdRUF7u42Sjr;vpa!N#B4s z9wFc*c({-;Zy<28=OogIw3@;t#{=68(D4ochRGR(_>Q7~9gbvp|cu1WOatOZ;<4=ETcq~Vh1gk|w zp~4OoHJ%zSODn9!1^L<~=@PZQ35y92mh$bWmSc0CmIG2IsPxgpRJ|tBmC=3_`5uKm zEv|;lysPe=10eZLjR)STd#n28Z7;vPt)b!Fx9i@jsr$>j4GlFlJKti8$HTPEdbFOH zhyQKL#WpBj(}Ep4X3pFIIdG?($9D25e4Zzl&*M|D78Qbi z>@?-fnX_rrUWLo?WbeC4a;LM-GB7rN1(Ju?WToU30bE-ZIDT7?vEE~@xZYOe*5b_v zk?}gjU;G~=7vf|rdgtrtog|E|cqW2})q5uo%jgCz6Gk~~pIggZ=Cv(kPa-|x;*7Gg z485ZY^p29ySpu8sVKd!aSQhFoVKS>HRy!>%A8ccbKF(T(I!|zxwRohK%$YMY6&Nyf z^gimffp?4R?~k)~cU$qDInMTI40R%MD4We4{fUWi(G;5-dio73l>d2{qX08gn=@z5 z$oNmf9G0!avw*ZAGF#y0>7WmBz!84vb^%=EJD+K>lXsX|| zY0jL44e82>s@AXq_lQBT=6MBo_;-Y z#EQgWwDl{@C)+Dl&f9$WOq?4?}{5aRCg`-0TpD{vkFAyvvhpp~o^b z`U~_93R35I*$y|ttKr3V5U~>K8TAsFt@B5}Ag@W%JB=q8qkqn1JlK)wTrCTI2!CcV z#(#4F-y#*!>KI3|5TC+~@h^2MVtSTST5YT+|9c@P{kF?xXqYHc3`y)_Qc`jfbT?w# zZCvk#G~z#`-C=wvr{@w8{$>`A^EqGk~<+~rnxGl2{Y8p%eR_Z-5H zh!0Zcg(|tvn&~Tp*_r9sF`Iv1Pe{uYu00;Kj^bWW?Rxl5WLzRE+w?(Sy|z+#wXRg)&6sBPu)wkx6Gs3@5aJh!*>?A zd7i1n>)pJ0o}0;HZ3(>S(C&^7Ti}q-8Wtl2#pY1eHW$nTqk_FswigAd46n~DB;*@9f2Ztw#l_<;pp5p-aK z0<^mG*&aSmeMXxq)Uw)qZL0bVpU3tnF}2LSd(NEQZdRMOX;a?N0>j+~c{C+}RvK)A zhdI1($0TM!Bvp`C47d!20kWzW=1d@?F@4OYrl+Yk)+aQ#klLgVU+cHQV2U`&|NSkP zh(4g5>}$~bDd>Y#^Z`*{qIvM<3$6NmUtvCL)AnKgZ)1f9{qsdI0K-Ti@n`ZdW`NJE z!p0t($pySuMG{4wnY%c5Fhn1Pgb^$C5)>Oq|Kc@(ad_HBo1 z1?%G#Fy&DzQ2|3j@L7lEH)^F>PxK&{=z$N}u!Xv;IM^Nwaanb^qB;+BdwKT()T!pA z*i>6ejyjC`WTB-gsMCRwPdjNIoy2%`a^v${gcSK?yG~k+cJFp8e2TI6Dd{}sp34vGb%hgI*9Y>-i7~L#};dLEMyY^Kn>pfz30}|efaoG*szV&uL zi=VKwv8%7Eap#11UuehdTP|1;xEPxR7%9{ARe;eMOY0w0kFfWI$r#RI4Z-v7CYi3> zl$Vni4CWE&FfG_%+p%NEyXM)owdVMl9$^975H|uA@pKpImgqTnlABf7Q_A{Mx>E9s zC#L|LL|skTEh`r0%<0R;PVy9w?Nr_7P1Iy}10e@tm!eceV@KX; z(*h?yN8m(n%wRtZt$I)PfCBruO{vgF$u~mSm4NLFMYljfSp_5QkM-?F3W2qg zy~LJ9Et-w|@fm{rOhPV(KXK-(8DF2|h(VGp?QGxazCNcj7Uyao@Zx}-K^#;L{AomE zK1EUYRL$dTZTj7Qh_KX$ z%iZQo0~9yJ46iQo;eJEp!!?OpiZz9Wgg$6JbfGV#^|)jo0JC~Ly`k8B!%JQoyZ^;f zUu}GRb=WTXyoeS=lyYM1(yB+<&1m0{)&f&I;3fkR@N3E8&lH@8^Nk^4pUc~Bi7Uk4qN=VQDpXM^<8=Se6hj8==Q7cEsC&O}vC}0!Zo>SZ1khY~9~b*VLw1 zDAttUWp4#6)LtuKiE%O5a6@<6Q(4a*^DKv57su{jE*f0p%_E^kTc9jISKbcTjq>%C zRGz2YLxFc73Xq?Zn{{Hp%m785~>J$~2>`?0M}46jYe#^9t$BSK~~@Sz~&G{+(VUaV|-K zmt?ph&ZVcmGFLsq-hl8=6_RBOzd_;2vr#vnkJTD3S3nX#ffsb`8$`U@9We^J9r}6UYx`yHKWWrSc%@bn ze@1nZoGhR>kh+e2q!sA3y491io5w2XoqSfoIy4vS(EG^i=9ysO4k>zH37H$O!v+xQ zijNzC_rDHagLk+m;C+(tH@wF>FmI?g$D!77s5Kq6hWDWr$C0gDw;o~R?zrQQaZ~qH z6)RqtER9tUW546DI<{p0{$+~8>~J{DYyb=Ez`^S?nouMzZj3Aa`s=Sxca1?x)@6in z)gf=&_U67O1R*%IZ}%S@4qYjZ9ZGO3UV2;Ug}a2A!H@DJa+Stn`uK*dTk)GfUIAva z#cHP1@56sH_S9|w)D#{1H&XdK)~xRqA~L{k*zz--LxWnw{D}K> zy9PrecD;+UDK3U=-vXNkY!jaoWgUfBC_1OY#$gj)&JXQB-p4DB!Z{77+9HnQM}C_N zll@ut=y>As^gqsJh7$K_cWQSDzh$NQU{8L}*0R!EFlbwZ(p3G&S=xQVkgu@dBm> z2b+TS;C-1$5UN{pEiybz9Kfyv*di0L0i^zL#&DtJ4lv9s0Q7XHk})dwsgT zbw~OzIEZf2&^JN!G2uhjkqN@E*=K3f0@6R~{1+)6(I4`bA628Q*$S|7lf? zj)(OK?E6lAhF`yIZx1Nqh@>R$TN?`}rP21T&p+I~`<>5w;}XW>_l}n49z`6TmKJ5$ z1r!1&g}}*l;Dn;&T?3qmyJpVZby>uSt*!It{{!qeVz>ZVW(YsxmN}Qe5Zj)w#S@`r z)fZsNvS`uFng1zFJvkgxNYNc1e*wCl9F8uL{HQO2GY=-hSH#=S88dcX9&hF4F4sSc zx5|4ifwuzq6yA0zyqV2yZT}5;>*+C@{{h~vzuxKmN_f-x49smS##`8f7&OMjds;pE zXJR&N%#rw!WpJzECM?M^@jhXS;KC?1fjN;tY2gLb)9MRf!NfH&+n3KOSplo$Rw1Jf zN{yBD0RvTS3$)K$>|q(3h#4j=c1+TdP;H(2!^YOU> zpLAUo`rP1yZe4G|5-ixe!WT=2Uo6H&O~fxU+Npq#1_ovW6BqlO>*IA9-vK+DA;98O zl*~mii!0XJ;NjsP%o&_Nn2q1j2d0d!jM9vPLh2TD&jP$!VW*@N1YLvH!N8!E^`I7~ zoG_u{V*mh2KM*V;gw)3ik++oUx8dwkLWkmy<=rxj}~xb!HPSafHh9f zfJDDIt&BeK=|d|j-hM8F^ry9O8+vRH9wc9hp<}`^<1;tU0d6jodrv|tn9{yp(~NDl(l;B zQR%s6cHaFk)>ooYA`5rBad+c+S8_T$tYAw?wn_LzBKWSqzPal^-tS@~CQK{H&qgYr z{PhHjn^1sa@$p@_r%f*qd3Dv%qyB`F#1i&oK$q%ZQs9nQf5lDHXS=Q{WzXv_cAY>_jXv4CQnXUb+GdVw{|z* z4aLsg)>SWb9;9#Y%>(DLk0Esqcnz=%#5Uj*_6Bg;dvR@S>&M3jm^oowTIwhZ>;K}Y z5>3H&?Z_rXQFqU~S`VcdHg~*Wv7i~Mlv4;3SauDpFj!Q>eQ6MGv1gEnMYKf2T#<|? zC0K&ujjqThl&;`N>|xqk0goeIQh0HQJGd2neLMP^xPuAk>$R4lPP|x`K7QG5OE|CF zhC1eA-Sl{5H$+~=p5H0|4V_T=_~nrOs_Zxqz5fWERR)h$fFW7{EY1ZMDgOISz~Tn> z%RKPbzhz~%UwoJCfOc;td*yL*E&7pmA6u_H4lf~TeHAPIWszQN4O;|ub`e}pf6G=& zzbs}|>y-`6lLs$|LhT-#=SA)AhnV+8KKtQ3_B$x^USJR78BCKNo~`{(F4BwrPT-SSvewT7yqj;B?RN6DJipUDY%dBU3}1 zO%-Q!dBT52Gh1!ZQRX;H6k`9H)WB(IeBjfLmk%%RC=BDkX~c3F;3g}_JN(|AvC;6+ zAzwXB^NlP>P1HI*{@eb8hu>^D_};-IpR>eNz`@s!)cQ^$rx83x?ZT^@XMRhXo`Bn&|qE|y@?ruCq&v-kuK2qGwPsy z2-ZX@edhw~N~!P=cH&A|t~#^ijxo}qPe$Fuose}8>71f%`nEQSWL%JM9s-~l zevnp}x&oju82A(ylu=LYkRxtmwKosJH6AWuE8$gMdk(^B7_v*45sr1Ftix*4VV!+T z#m2%PxY>s=pVzQ0M{rxx&2e4b@s<(zjw?nBEQkEZM~(dA2UU_*rOktwPK_RkKnTL#OzI*bGjp$7o6NC!rcEXp z-XzOyZACY`vFUPi5lry;vQb&-gomuc>#r|_s>_{}6c?8g7pFY!=sHB**>x-sIM&-?*vG>tNL)twRwy ziCtG!y0mn{`x8o+PN;f+%8s5f)?-aO3ku?q7%HVEB|dOXLBY+-3BiU7K(GIRy)Z;b zFp1E@i1@>aAUF=~+O}<1`?mI7ct7KGYTH)Er219UI% z>U(A_Fz$T`k$o3pKWzif>W9AFf@?YYN4Ujii#mO1&mR$l=+|UxY+1d1Pe;d|?Wd5!ARu#C6QRd4U)->oN+59vjuS|6lnm=*}w|pV~zYZ zvi61VJ|$?3wj!=Rtwlk+{!85LO+t9S?&FO2pNp3h`++x^oVW*yi9+8 z1Ou7z4N{QcgYL;I4V-0X`xPC0GYW^!)_6t<7F*1Sk#TW|1o9;Ur3Gm*J=^CIup{Yp z;tT-{y1L@xM#jYe8f>>o7MsV4Q)k*708f~)2qg{znsBIK# zQ;g~$y?F2%s?`dS!X2)8iib8xht*G}P^4a};(h%Hbc6JzbCi_;BPt;nOn{@0WQm8e zFa!%kO>^sEf3WY!L1hRa9iD#!JPQHOj{wiTfM*uq5w@^d-W#SC+&XjS%x~W?`L-!V zbMQC8adzMCTfTpjSv|II-@ZHUxchtGw51loEu{FnGbRu0-o3j^VOy|S&bIiHI16?j zZfWai|DwmAcoQ^h6+WgU>q`mNhvdTW?z*~$ek2oB#H{kH6wt`g zDXpz1qBwoF_wtF6uBJl+W7_{6lFtm`IC zoa~B^{sQj5%v#1(jJiQ2fO~}bms^4eU?2^$Sl={Do^Pp9I$3?FCBs$76vMk-ox? znvN*;u@0OZ>o9H;U~(dYZQ$%yH~YIV{ZDwf>@i~6X8?hB^YtIOwX4O~rvFLya_wsD z?{IB>E%M1Y+4Jl^OJ=6y7n!V8zMh>VdFX^#I^DuJo?BO^O)_>HR3(qnPlQ2f|2qRh&-#no}A71|e z69t3`L}lI0UCPr2K31@#b@CcxHWqyPamyr(4AVWUSwN6;{5qkb^ZHmlYE*elYqJIEnuslXd1YQ&tWnkzf@d=yFM(<;r=~1vE z`ci@RJ{$L|>7fDf9~cn&FqxgpU2L~fMkvNIzsi9e?Xe~{aPl}1(Rp%UnUJD7;8CuR z0{jfanG%QB(a+N+eAGz4|ic*qx?WXH+OkR8dVo9yp>Y>ytbTic^u zZLuv}Xrq_n(|2uX(#n?iZ@lsS8{dEbMl7gz-9oYiyNlbkE^R(`DG_&`rQ@s%caY+o zc57tXpvl0#auZa=)mjsFm$?i(8?;uCU(|P${wQAi@jLfp=Z(MfG2Yqz$`d|2?J#MS z#fiqh@`#1dO@E5depSk`Pg#ojSid=?|CsWG(VtnN)}&$_j|jKM@>pLV{Xd2vxX>^* zv8md8#b=p#-~fX29XMc2a-A9}z8S2X#Ur>vGj@mLp%`su_1b1c?%k~Coy;gQfTyNt zO~$SOdKL`?*PypX%#`a}-E58UK>Y*w5L-8IMl)%@46UI?kkYNa9h8f{Akfi*l#~>P z9kfszGSCJ$dSoox5ax466cyFgZ7VI^mXiaQXS^YmBb@AM2MzsUp=Qv(!pq7E;pID% zxnVH#4Bq#{znKi<9IJBG{j|Xk?;_>aaJLM#BO}x)p;ip-@^QTtLaW{;_JH!Z5=~t~ zjnI1p*R=UZZP2^H@IQ}o8GdM#_mm>ySum!+mIlW5(0%+kpcx}DDMZY1AorM2%d9p>LxUW zeaOcHo@)RP@zj)woAR!mt1J>fh{qw!Wl%g-!EgFpp$l-7t9GC#NjK$$t1nLiOL!Cv zG7<{%d(qRBSWs5hM1eg>k)#x`S-v$<2Rm3(e}5DBIv;)|ZsF<>WMK}9WQ%i^o{uTO zCW~`nXG5ly!-}1UEw>8G4|u^NE)ea#up~D-%9k2Iars^YxO?G%pDM(`ib6;+n^TlE z_JgbgkQorF9-}8S0pE2Y%!Nl*locb(m=DwV4k3ZhQjR5<3$U zJ7GrK6CQQs*^vgghI6ER$`lM{K!WDZ_t-F=XH-|uD6WDbjSez^5n%jKiuee*P)XP7 z17C){0RnH*aH|LDFl7=1_4o!yJwejLhC`Cb2nvEG3<=S+Y(PSz>|!)cW*ettF|CEF ztOJ3_=rc#gwAh*F5o(Jf$RDqr0oo~~-`9aL$kXow&2wv|avnhL)Fw%APk4;6huo~y z^iX48UnBY$bWV~}rcO;!9&=y^kT!teM8xcUeRh1)A#}8=YAZ#->Tx)Fpi9%|MHu4b zOF+ywvI`)N%INB<%yJ!p6*8l8=2o*c`DZO-p8uVXv&fFAy;jbv2$Yw1J=0t&&VX zn^ipPXAc*m><8>~7T^qe*3adbSyMCEM}Mx`QuXJL92rydA)E%ZQQ8dg=`&eBMocCi z&2#x|em7oj9>sQvKg{qyRfuSN@km3^j}ZSU+AOhh@Y=hJFuMm3{_;+gy^Bv`gX|S? z)-?k!=4p3nSE+-F$10ejVw^EniF>W;z?oA$rvgFEYZWaqh)fw9C3>wvim83Pr!VM} z`p%pUs-6tQ&NM?|1?P9jpW5KrGku5-dS(DIP!M(32AMj_EDWAL)q6_uShPVHG@a=m zR4fpzqVS8TSO*8r^!D_gh8oH$nryMoSZq1^zUHt)u?Ed1A3S@y*B=<55Gk5yu{#{N z3y*=?3DJE|qaM*@wZ}LJc60QI_z}@&K&keh{<7=K)BS^9D;yIL=tM<29t-3^6Rg&R zWyV-9!npZ5`k5@3TFe|X;;55X%FhW{bwV#p|lO7ped?WQ} z5k;rf53%TI>KiofAbAcqW6HzNdtgcSZwR;WZv|MQ_COfJAxGocN$u~!itoMlq#vQX z0tlRu&C}4K_k@mIo`x74)Rh5rBpqp5CeK9db#^_ zK~!Ee6ak3*zGW=Ow`>`+`6BNiyZ50xY`BB<6ACDnzy#bAhnGJ8E?R?~%J0|9vrd#W zhh7nPMAT46cOV?NQNt9JZ^tX5d_)`isk~&=U`0u)A#na3R72QKng{3(Td0P}mlCf#vt=;_RPsnUd19#5s4he`vd5l@b2=>#eZ z)`MVa!BeTV)N2uUM8ML5JFwIlxWu#Rj)>9`&!^I1OwLBhiFh@ge@FQFI`nCDN8Kf% zk0{$lWiu~ZmPXk*tTcqmG6AFVa&TMe$*l%nvH>rRGwLh({5~2Q#X8mx40}G+5m`P0 zGgGJr$X$f_B$T8P&~@26bj*bM%7K#f{NQEp$e=p*7?PZ6qS0B58gj8~MC}fh=0dk(?8==#`t_bO?$9X;&8$oH zn_jj^f4V+8nFLr+!};aI(Cg(BslA)Ry@or^FCBrMZ2jpAhG3@}E||FycPydjhiFx} z2U5?+XT%*{bVrCfw4-DeUYDO^`Wz13K^V2;bwMwOTdmWR>#2^{!>taFCHa!0Vk(v2 zY>WzOFVR99UYEXOGTi~Ui!hC&(uA#x-a#?2cskutW86W{uf^*SoSe>EIU;bS&p9x) zR13`n!te#PM6_Iot4hBEJxyg3@scmu@_)X^3x?r}U?O~7FiRs~%Az}9U4d2rCTe>R zUh;65!sT^LB~kgI-Xr)0AN@z%L3pCoN$+o>W+bT)p3r90azPCdc-5&NcB-j7^&Gt} zIji*=^m(+wxFft`(&)VarXjlF(qWpf*FkM2JkcxS4r;^D8XKf`8{-^JpjKSEYzmd_ z3gPs^vJtH%NSLuQum(UtbdTmy#M3W%2jPZRi1e>~2Vs()f5E7@WF2$|@kL)9s&E|_ z+z}p0dan&@d1y9V(901$5K%r7tL6|N7#?#n16E0(0d70=AqPas;W2%=(iqSHrtc!9 z!((Uovr$eTHW)$|JpE$jX>bym2txza8$7cZ=E<-%4g3~6=3`q4d~~i(CuodL!b_$$ z&|OyC70v;!&r20|wfXcm(@l0CDkAzN`PlV{=;zb#ghFPBXC|Kty&p`C*4wT_b&hkskk5{I{&3!zXc%=Ty&@or7_&O>+#AACQk`z^7=q+NxFcHHLsTgwgV5NcRh?cJeZD>#{=ad~VI1nMByNq_ z&$aUM>#>gU%X7{2^zcmPne_DV8lcnM?(=aHfyJ-HGe^{rK{XgWGiDQw_zPC0h#LG< zKEyE-wWamof)N>UM+xp2Hr4gfa{-pZcbL%j3wUOfmJzi1Ldr0-R#Gp7>Yy=yS-Mc9 zmo<21Y5~D=(RE;m?)=xe=1aC$A4BJJ&4kZXyyWouK{GduA^ncwTyvNUy!`sA&)xflI|w2g7j&n5NvNjM*ciq)(_%&A%FF|PUYJ$^pdOucbI9TD?X z=b8=N0!swb1vNyJkK~%^*_WT!wDt|-nRRHW7Ww?%9_l-NwG4617#D!*@--QNu;sJVXWlCpc!p361N^&xB!|BRH%7(&(|b+xp#bYEGtu4wksJOqzf$JPr!ELx{{^}Q_1%9Sgh+1c>X2}Id3b`*bM zDsM0&cZ4FAmCc%^Z`)Z{ZWmy(Eo@&2vwUqOq~!FF&VB~Gqp+!M^?3C>Kzi!5ZR|;L zVaeopWal#i`MhjeSds~wH5hjc#nT&!5XRRFZSOqmkt-`-e50{V9qV!_8@;0v6T7?H zKkw~3!%VEBn1Bz8h)Wy-_Ll@+vYcn=XK-*MozoIoM$oopv}s^wHW|h?p}v5L1hcu2 zQ;(hijM5Vzwv@-2@%W5C1F8&{VL3oiswhSvS>x&! zj)pM^^JD*0C@=O?T-64==JOf*J$yzLS*i^ySH!bfDbK;pJ#aB(*oE28eX~5gY!QM~ zdBmKywj2s)BFlIerz9p$p>Ef0AdzY$V7CXTx;}>kUMxw1^7sgQTN~n-1cT0w4rj2j z5!TBd!vf}J^unFMB8_YE_@;3^;;}V5k?T?IdUFk#R6VwE;Tj6GeI<5qu0qnOrNSDv z*5kFD_^4s$ld_DxQ5Z)dAT*pqO$ec6Zh)2kPbnLoG7`DqVRc4Z|9CV0(5*G>F~Mzh z=OT1=jj*d@R}sGP(*Qw32U#nwc6oRLnzW8pB8ti)^AzMb&n#I;{#}TzE!$A((|g;5 zuN4)AcCe77Flr0T2ZL>mHCwhQ8xvszYr>Y@iO;*bQd4cVcB?hY9PIs~yu{q;mf~ahiiGDo_V4lMWxdnKkJd5Lj7u|kJH?hc*kg@y7 zZ;RmJf18%1_R@jf)7!LrrQaS2obAg)?D|`^U+@*aTohR>t%0TS8rrY8m-|-aB7NAc z66i(|b8B~a#C`MT?eho&*WE{(Z8*e-C$f6DJ{bFS!s-u1k8p!~oL90Uupv_U9o^Hg zq5%F{`)Q|~7YG^Yx6Xj0z(L?Jha=}29sCUp9zWdJJVI_#^7pa5dOc6#4j|Z%FfShx z8gYDxbIMUFAyRx$K<+qx##-X8NW3B*t?z7W`}D*an8im$ zo4s%x0Z6#$?+dJWCCS>+VP*akpESYl>=S>`oP@EMmK7LnV6*UtM58G9n#jac_~%G}#9uRdUX`f->& z1p|Gb7GypgI71Kg>PM~g@Auf>t|NQqw=p!Hw=5dlgNOBjIPUUzCE@hZP9%QpIo8%z znGdr8I_8>RtUEjw8^azm_J!;Cgr89C5@V>{?BOsa7ZbD6B%jIU8vBhOJy?jk-(ql( z!cohf;tyiLJf;(|D%klvGJ46+W=@?tb>c+0t4H^=ytA#MqGC^T^Pkq_kxz~GptSmp zCd=2Anu$*5sKhv%*+jeUlG!{0bRcO2LMg%dS4Er$jGN%V$!&z0o@j)j>0?&s7(fX_I+Mu@ml89@o3GI+1Fd{^P|Wb? z8Cv-Y{YV|FFI-v%TZ{z16mAS-h_;mw-pk;N%os(avm3thVBuNiG4jsVMXn~qbA7dS z=jSN-0G|78Jb4O6=hZYi(}+#KN0Q%{(ib3<5gpRPF`v0yw6yk!$;nMkxiH@;j*;s+ zIyz2Ec58HOB6E2}yS-&~KHRG4_?2bb!Q#RhZo7JDoj*%am!rYHLM?ZOJp z=gyr5iu(@85go6Ib0!RIDbzjjmca6pGWsOK+CMD@U3E4kCo92%T9a>4__}q|Q0jJ2 zTRMJdS-thW0rYszG?0<)ILJo%b#u<7iLnQ_K3WKZdV`+0V+>Mx{z7@lf| zs(;Yz9O(?C!C}CW5I_Rvv;8Ve*2roNj=AtuHwhMpRpegerIxtG5hXq{&TfytGBq_d z$u13?fKjt>=+L2Hun8$=DH{SzH-dvaN_lB$#DwWh1h3?F@p$5S;$@vpVRsmO5;!U3 z=m_&kKSj^pkDkp#&t{-!DJDyF&@y6FVtn$oIXO89QuRDCJvE3$MUteW+7mU!v;#~@ z^+0k-9(oMPLS^(S3{VjGL^Vq%4($J+xupT!=%Jr0*da?pY3c3bk00EYkJOTSw+pLV z>`HX;owr;S>^`sqQx9RWZijWeTdb%kK|nnuU==emsz(-JP4?@@>%t6cLmmd)SS^{_ zEly56DGvD+*;2??VH-rKr*8l1X~?!O&r4v~Pt^Ad3z-Y9`n#!_@< zf@frMa$3OYbeMyIlUPF9P7DYLr~K0RxL7mTByte5aD)RrD!`tw#oF0<95F28Tv$KG zCBc;aQLV(-~iV1l${%osg% zEzQ|==v9oX%~jPcExxVkehJQplEs1#3C{amLVEK!S4zt07)j{w?&$19x@_1^A|p0J z5qRLr0MaaZfdUT`mJ2YGdemx%)s@bec*v=k!C^KK==r4elg_gqTXfP`*Vr*5oxz}8 z*{b)+di2R3Ft4VePwqsY(0XoL1xe^|_14GNtXZC?{RX3Sp|on%SMI2&a~*|<-ySSn z8H1GPW6$Ktn5bXN_~*M0hKM3~o*%&nj{OCmI9)hC#%$jOM1KT+sRKs?me^{xGHUU6 zQAy6Udlo&A2fn$HwTS!cZ(LNwHX)F0N$7AQ1jkCtePi1?I_Ay=tJmrgo0{y?@-S*~ zI3HdL@29r5Gxq;Pe}fzp{G&@$E^B*xU?nWEFiFrXnDECzmJCKcJ zOH&;chdw%dwBxMPJkZzu$-aF>Ao;QQAsUAri82$A8h!f*```QXF7_RK(GB}jAHQWUaF|81`|{ad zILT|=!H#;^pNo;h>kjQk^&@o)>(Z*!LkRAX2U1i-ekR7jgQ}0u$jL)4@ol`qxilyH zx@)t(_Km`COvui>c6(()$| z425YSZ-qG+OFzL_nvAhT+J$doEII1y4;)4&v! zR#6B5(dk4;PG}Z9rq7y@A}GOY(rn4eIS=L|2HqBolQQvEr~i+6+Am20;w>#Gs@P}G zo_bw2{#+R|N`Ir9y_?ppdn=)MVG;WfxyJQ_wIgR8^6v_1X_&_~U~20yG zN+ZO^#A`rl!X4UJ{Zq%m@K+T#X;0NbS4ce0e>>zsRE6U0+#%AsL#UvFjWAQjjyv*^Xe@ z$;nQ*UC(vSnZ};crIhCo=fGnxnK-ey`{iwa_}DpjqI()#7yhQRfA3J#osx$_EYHaM zf4pQ-Vj~hpAF~#W3t(8qxuKxg1^mzD^ARjIC}vevp@+)>?U;=Cz$akwV9eZKzn&aD zaF`K3;8dSvR%~OkZ(F={F*|9SHh&sKeG(q%cuDwSc3UW{m*gx(j%1`pb%Lvc-w9ya z&7QI?oiiCKQn%Y(3Y+=$y6CapJZaJ-Ys>D(XJVMp@$U#xF$ZL8n)Xe|%1NLf6QMAg z7p>52t=fMyI3_u{h)>`)ye5EFLk#EHe1h_p*E2;EVE;`-zqj|4Y8!b)Vj?JhzshME zYk}V0p5q;=I(VjsnA^6_(?K!DZWsCm2$}fD6Rv=TJ7iyN0PHYiTo(8e5-;u$5NIKp zOIF9oQSnR_W8%h)OG_I!Ce|7}-q|U|p+fl4NXnB;Gk7MFN6%jmz2FbA8Yb#EhPH(M zLONoUwqXT{*L&RD?RBel zq|yx+n#TIIb_}N$t(tlHzP)a?9chOqc-_2=Bx;i^Pnsk{nJP1x@7srO$ZK7gl%w!{ z^*%30QfLl0Fu3MRH8uZ_w66h(qRjt)W_I?4Wq}n|TydpU$;imasN*~;gay&4$jGB2 z@;bBKo%JO%Goy~o3_UZ>$Ri^okBp3rJo3mmBO}}pX~h*+Tw#S}=l}W6 zEWY&X?*FzAyE`+?%s%rx-{<@OLZD!?3E@cgwRn~l80T5&-7NI(8uadRlc~A6qN1$K zY;JC*?X2vqOuTNq*>)w@{l(tBUyodUn_*jaxISiiRCQFId9ZW$?v7y8RCYU1ZW+Br zVfXy`yKz@Y7xrktoXR-BQI2DcUK7fNes2qgeUsdrs+j>}OD?i(k@QglG*SX}C_ju~ z3sLQMcXX7O%Sy$GSb!b0@7cQvi4`hd+v_>m_3df1+5L|Lp6Fj@hdIbqhPw=&mfdbx zE51I`2hL?FMyZM3qEJ{-Q3!1;kh7CR@g~f`id-30-xQWfo?r(YY0ZjNUGcRkkSmaVuZ3(rKP^n>fYf`C6{ zK!}YE2o?*r5X8Z2;6MefvRVLvMTBfZG_M;u`9m*WUOCsW_!2~wbr4n7${;9e3|_B+ zx!vbGuLT2&7kE&uZXB>FUQX~_AIOkef!W=H*(H7~6SI2*W>?Yp{Yv-j7k=}MRG=QD z$wZr@S@)fXyCx-N7NK!XN{Yqj{%SMLG5t4Bixa0#40XJp4a)Y*(5}!f)#}yTV7;CW zUM%ELC3PMTICYvxbzp@v@GbBo(Sl;l+HFZUpmJC?l!LN*S1A zI>`{Ru*H=PVX__>YX7EPG;>n03tHGw>(o~D-5E)pjg6%Fuh%p-ey+`!yDS@GzihnH z;>^y|(UX6b18!$G*T^*z)lgO>Dk%fLra z&F|Pf9Vwc*Y148+fZhPBMQsbJeiqHNT4&yWD~^65r-J?liFlxdKuO}s7>f#ug11BC z@IJ2@3OXlXsdFK(HxxMjeb2Fz{Tc*;8RH>rkJXP1IfS8efpZ|)yw=H2Hlkip$nhLE z9IOClS3R#v4RV5G0#r>LKQzQgO_(%!@(;H>{u#7VcZ7p)evb9{ghGEqHFE2beufEt z1a#?1&6-zh|2=*-%MAHZiv)j&Kv$+;S{mN}b9nzZ*yk(W?RN5U^W&UccOAuY=deb( zJqbkdJdYGeh1?Rk&E}9jor5^f34FTT7*~m7=}_HwgMLCMp~^oCR?C1?H^*ne)tnReEV(yvrL8gXDUZ^65I>B z#cdI&(dp|w)ZOd#IpTdMzUk~c?qfQiUlpY}&c&LN^lWGVNpFmDVM>jY#flts!Tbbf zc5)FYnrC%rtRR_5Q!d)zt?@8~P#zUd7cXv8W~m&r^dx2}H@u2T1C+RKU3xmbYib$~ zcc0V(RCImahZ}2(i)Y7m??P=FrFikvns>Y7^6mqJ3M|NZz1f%(3*?t|DhrE@aH7U4 zJ3HVM2G26fZ^Jeu;gLkv^Ota_7xz-PI1ULuDamJdQc@hM!S-O$^}r+&my|^%-=*vL zdIovqGtNwnea_Ei^|K&hx$U5cnas^ut=Y^iwLx?>soH|Qr<}rRZ!kK_sfvmYHrv3+ zkadVjckugy(`{HwcwCOmmeWy(ffTPr2!;*H0jNPfW#G+=tv|N&)}I}GNlKB8y)IzNi_q&JD=2I_ zDyM)fPQyVbmZhjiynJ$?y*&^_Y@Iqd6y#NsV~mOq`oG6ejM|GPXvDYV`QomC^7kgp zS0(1lj#YIx=4)|if9L?(L9`R72(3qG+qa<>Y6^mtlE9CRguJ0cvK+hst4&6sp*p#_ zC8J!em?;`EkhE0&F?5%KckTtZXq1fj&u>CW;dXau6HxcR za9mblFftN4bSPw) zc0HRTqx84fZkb@qot2iTD+HmU;e?axgn6rkHSkL=2j!`DaF;Kc#Tuj%uCmjqKG8sD z%J!rqZ||_H3M$bwL(D z3tu-E$LOuJxe(R+jFpCmk-+!WR3$QO+P6ui3C=C5pQ~d2$Rw4 zVXmS)2a8cLa{*;>!Qd#8(pcw}SL|?uc}aJu-8(AE=Yg)zpsWsbRt}zL6t%s`m7@aG z!&16fN(H0CD)kYJ4EE3jSXW5R9>fTx$SnyA)d*`@gRB?qkpJ5Og!(ZSPm4UO%MGR7 zp8zH9>Bz|FXjnhGJjntCIpTzn!Uad1kTo2@uPz}b8Clkx$V?~VpD^<# z>s^S`CiTN{e8{g85ZmbO_4+6Q9CEv{jt+#=#{(Nrwm5i;N$b>VqK&@(A=cqg5B2+u z(ICBAlf@BXnT(U-5%S)F2UGAf^7Y6Pb0O9{X@jR@z4Pr24cQQPlOU^EQI{h-Y|br> zu5LUuZtmQ<>({S$G#+hlM+|jnhuluWa8V#VsCu=jscAM{hBgUDM2LP1u_y-|>WmDx zI|C`Kf@Q%no|YMZe78bz9}h33B{GHGecZ`ok*{ZSF1zK z9vy0B%IOitc>6~HZ>phw0M`$IL66s=^Y#v%4yBs8GA&DWuk5Ol`V2hw-GHu{cEC0X>#0s&`-Qmh}J@s1tT?98Isbe0(4P!FkD&(yWwtKlo2vJ2B-KP}kV) z;%lIpOyd|6WLljzDi+Biky%kNO)@1cUm=7>n166N-`5vfg<*7QgD48uht=s+5BPd< zqvfwDtBpn>AEQ9o8m5IuL9^zeMHNkczx=S8rjt3jvqzL+;5*)fHAWs9m3`4&no7yPGUVKXaj;<= zC?oEb;c>{47Gi8xsOq<*ll!*I#*+ZE@K7q(H!d`)4VP zV)R>{tKbvT+S=-dHSv@r>PiI5(sZj8j}Ft{uWv87{q7~n$yVFb*~-diF0K%;u+b6K z+-xui$cTfXOiLc`)Imd*kz_Fd0dq^2&H{~S;Y=p^TL&9cUg3S^FMr0L6gsgHT?NTlix)!7SG1@FYahcR{Fro%@3Y z&OhqXV4Y>Cg7p6{L>LUlNPZ|VtkO8NLqU$YJCB}rL`P4sS|^P+>U7BJHDrv3X%!qb znN*!}?miyEDt1GmXQz6-r_Y@3>+1_@c^-yxetODfC^0i~va|C@=h1#&TRS9*Zdl5p z{D0wsyt9lkmWO#Pz&xfAp6fd51=EmV&JG**3od)BCt~)ac-@m873l4DA7W$8I-lp@ z-`3)_r5Q^d#QLVZhK9nzC$B?Y7?LB3;5GFxV_n~zT(%l&cWQ4y5w%LyKaB3G`&;Xx z2mLP9V>xl0gKKNELF@>!5h!Y3GA%CPp(t+YpLmTWw0C=B!?yQMq!!Eu5R*AoY1`Ry z880~axGR!n(}AkGx+V!z4BASqMm4UcaBwyzZCcn^p@%XzRh42^!!QzYRbkDC-7ZpWks5MBki!AXj zerRymNd=pDB%g6=&bZs#kMs>G#sVbTy%LFfIY?3PHju_&k$go0=QE6WzWsOGzYn!{ zXrNsHh%$}A*MBY~I+64ilGA2oKDAhvr1`zXTNjR?hoCRbWHok{Pm0qb_$lKH<3z5y zq)R1V$|bn=MO=FeU}0Vu7UC8zEdEW|ug7d{ITJ}t<=Jmr>yi2YX|;X9-TDJnIRJjL zG*G*Xd%g;O#M-r>QwbySbbNRL0~$ zc)A1ZIGp90;FbD0SnItgU%Ox@5L1i8o(mkh0a~K%z#gx`Ch_R~kI#YtZR9g1X`QOx zFPfTcNdK%j0RD+Pn>hz;JjX`B0U5!nO#{PzfH}DFK5;gl5t;A+*bAlKNPj?Pp|u+t z&&J<`b-yzV7kk(mFnnZARCH5+(LHceymYv+eiIZmOCV<63Dem$@ogjDa~%0)uu8qB zcs?);PltBD~tvluEJIkp>r%tOIhG3zYG}(c9#&l!ZBXR3FM?`|v zzz;~LhK5F5_GC)}3=;_n#^|_7)AgFbN$<%sfq{WuWbAc^^wY1Jc2&ys8COmos~!=T zBcCHs$d(Hb6KPen|HKuMzl@#Nv0B9f&3Tq)O3W_%$Sq%PNAcg~7p@!C%wO=%tf%Yj zd?{N>nt40Q4$>Dv*X@9=djVZn0J_LicLIKgQahwUU5=0>y?4(#2yp8^1{)$D)_R#W zE$w=a;?FGl|!z|gr}+>+c-V6)z?)$NoG=c8wMrux;(5WK2L;eUC8>t4 z(m_{oa@uuJagKL6cxVY7QHBJ7LxRE61q)0^heI2II&mIDq{g)tOP?;F%kbxtA%!%{ zi!c+US-u=IaXDrJ?7%EiDD$D+&N(m?=gMskiWQbgTcn$$n{)&Liy2t9qp)_U3Hn1W`nD2tJ2V%I->An@+&yBfA7J4 zRBrJx4JG<++x>Dj?A$j{a|mX)+hP`xlT3E8+9Nw9lUs6y;jw$uu#}8I8956dBZl#H zxW~W;k#jmx(3OLfAkKu8swtc!$NfY*O}&hNn+ixPrs zk;vI3N#Em!P#(?-j z)IbQbLHhkw?@3%rJa1xD&5sQ*Ie{HOWi_0Us#ujh3(O>avvvn-7c;p< z{NlxbC}l4}^OnkCm)pX9!ZmSCBowiKBBml0|DjBlzr+8ak-(njMlOx3#gTNJ zxs$8o>cD6=$TEQ=qNWOZ=eEP&?4u#fm2N!m`Es@NN3I4G44i|V*&JG6$vnL49nho1 z+wE;ph!e}W)_l4R+vMzQis)<0#Sf5et_2eHK^V_;IvC}6v;3t>v)j|enq;15DC&Ux zb4WdhZ8ehHCm2;s6Mcg|HpmhaL-C1;bOOUPpTU(6=Fts@Cge1{l5kh=&quBkiFjX!eku z6sIE=KS0m1mjdd`<%qVkqoY6&~XFU zf(~|Y7QEIp?BMeMH&BqHzR2`y$L-n(Fbo73spEVE7(+5(ocuokj5^Zr9hjZ~(n8D| zbh!j00U1U#fRXV=u!#Q?Mppj_MpR^5Ssvj(Lx3_ge2xI6O9mA0{{R$dvVxA)sDVRO z6D1|yDjhI06EH(@b5_6%#m&uUAJ)hjL05bGH21ARV>viZ*jKSg?6$rKQ>Q9bSe;2P<%~0;iDC-k#Cq zfM)@GGBBPwSVIRTJ9uq;YwZ*}$Lx03OVI}CghRYp!!r+g;5gucUXoWt0iG`3%7Eb%tsn8IIibc-jckuaR&Hp%?+9%Pm6CK4+JT1z_6(JW zibK_*YG4Kn!M8#~QGP(RH9vo=_~WNWupP?2`FX%PIxbZT@`ZdMFp-UG=c>7N zypi9^H}IKUG2V525!aS6Iu`92;B!>;%nEQ3%kp0auu=JP)K^G}$+`&y9P%Z22Ud;^**i#K{V&K0#LJFerN|g| zO+{Ubr1K)#ULn9a7D1=8Zr2;Cg{_8LLl=H z3&1ffz;}`~F4Rkha+!y)0Rx>Av?1;80uBH%Wbegf?lD$s4l++O#UtMLxFWhh$tCW6;fq_^+gJ6 zz$H8sWl{E@?CR<|=|2Z$-#Jl?MC=pAKgpkBOb{h9&E|<#5P}$_y^RS!7x@8d@La^3 z3V1FoeFip0Hh8Qdfe={O#gartj)2sF|Nn@Swc&(yqiK#WtY-a1ccpw*necyzNmk6_i${smDl*_Juk*94oH43 zM8?ubkUoU)$0b+Lh+Me093j4V^w!E#s(-S-^1Wd(QeMiL|3U69!S7~rg_oX77)^^& z80|653*j-Y+s_q2@8SWd02|5Z%y?dR@?)&4##MH{7Pw`(olC;tlhTFVMtDp&`aw8w zREIFC4b;+gTmbUJV|3+IT3&rjv)`#@oZuFSGw~EishTfCx3=mr3_B>sh0moSQk$FZvVsFEo zl;Zbh;rGZgIT62?1N~ql+IHM#g?j1I^z>Vv$bvOuKPSXsXSz}E_t)0$AB?~8;iY0? zFgOfJ9GWI;KFm;)&+o=(V>jO_n#Tbi@c=T5LSLio3ja$eY9E9K;Z~?>?QnxA#`fLt zsjRM|2t zOF`Z3%t|H8ON+3UkQ%~Ml9%W4mY*RB*ZlYym?@L93V0Aa z0*7!~lgK5*8@qz<-HS(im^U0shxb7Nuz~y_GC^;l2MRw#cfHZpZ8JiP!4;HHC`zrm zT$fr@mQN26G6x3)4?m=*hY0!wLl6=G2`@@DTbkiXKbm3PL(M}K4L$nmPMK?!XP7%b z!&pv6k+)>n@N~jbD=R9+9NU!%Zc`?>4HK-vaH2R7r_m_iDfH!c=*#_>U-Dlee>G$B1z%>}k;u|bx&nBw4 zjHY?rmpt*B`A>t{iYRH)nF=4woy58vc6A7$%5$RmqVWQYpXRkYj^_ z&@Hzr?iRHuG&X)S$cfQwR{ga@NG^V2@si)(nw}9P3*3@8!8qg2-410qV*3!KOcaA8d5IdG9YG=>ZgE!uM@kHI<0&-7;Sd1fpb27hz^ z5T{0WF*rh`Ap-qH?gF{L2usJ#fPWDEo2T+bKe)AHZ(SW`&I2bJKkEh z?CHWd--(7bt`#rV{p;YlImuBwUr|qHky7d$g z32m&Dsb1?9e6fqO7*Wbb?$1Ve6fQ;)i&4MGV$Q5_vNvE~frd<_XGbW2VO92BF|ELwO6l__(PnRiK-6Ycg5De64Wy3ju{|0EIUL3W-Z3Uy#(s_V&gO zUqiLew{@$pqq+fTrLNUoyV32gtaP_-tliqsu(heJYE4_)nl)`rYpTGLE^{FA!RyF=U5l%DQxPfh{Dn%wSI_EKms zWpoe!Q_=rKQ(K$YTP>LCtE|?ldXrEM!F5UcEcB&{v!y7%odRy4id7g3B7>RF24s!zD*b5*H3bq*iPepq;nQFd~N1X_RJjk_QuAPQGss?xdf52O~MDcsu zh530C^K%#GCkyj)3+6}DGIyrBs~)aw4}yZhJ(^bS(Jv z^517c@}0*&-}oIIYp}#Lu3gnH|Fvo6ZE&cd72gW-k^<`aX?X85IK{k%3MRU3)w^Jb z!xawxyT<1;r8{+7bN}#2I&L~$jIFafpRav$`zL2D*IbPdo|c*#s2iVvY5fW52{>uO z5BhQG>9JKiYT7q$-d4M}y+1L}?D@9i+fQn0T)B!33C`Tp!E%;sUfRBW%coz;wiMn@ zRcNLaTX~{l0%{{~mLlo5To7gCe;eL=DB>@yIMs4(R?*_c z4xMWH#Y*ONuzrMY5cUvg&y8K_x z|7CuO4PWzbzcGQG`f~TqxBt3@$l+7ES86|UGsEQtzt5su;6{%kHZag|z zj`j@g_N5aWE z_cj~G{#W?Nt(fRKmknnFAGB3cXa>_w-%~ zL!Foh<)enk>Ep@q?O7C2BF$E9YKvVKrl6{2v2AuF#St|{MVYa_ z7NnDtV|Rqjz1CFp=sgBAFIpS=v=z0f{){ve<=`GF5ic)$BqDZqE3kp`)Z3Xe_O{fl zqO`Omjjx?z>2)n04R`3VBGNWc6Z-7Xzq}_hu6g?#6?C21`)nDtRFiu z!4j`O=Q}ruqY=8$Nw^Su2ZNgNkO1NBIt*_s4yi~4Vj<7=4+Nb|MKlb#Ow{1ZkZFS0 zGpZR*d>`D4H38IL4}{>THWEO}G?nv8loBW1fd8zQkw`h{C!x0YbV#R$NyXh4;7tG# z6CXIpdQL#?MGKYu3S_H)5p@&weP|+y>FU9juMtWd+GSUP8#FNdr_{o5vw@9&)`6r(Y zGk*Tbo;8d<*{}a>a2IAm2A~JSU>pZ@9v1{XhF<^w@o4MUuU#8{w3UDcmqVcJLnEV) zCqLaUF)HNyP5caLSjhL=CfyU-8`_JA!au4%n>G!%$;PxTfMdcm-L~zozFe_>^Cn~i znkxqm89-yE;aRh|Fxb~WESRrK2@HnxV^LI$Ox#|uw=e4QRXb~qv8nmx5b%s; zzLqZ!wH-R<^`<_#}#&ey#3A_WBXBV5eVRQ zwqE@k+r%@+PKq%_MdeE#hnw=^CFMm$w_R&;@}?QLiyGs)SH9662dcbLnk3ERUVsCg zN#aAFhdz|zg^Dp{_e@6qB#OIx2>Fv-h))K_UW6Sw^c1(_h?DEA$&~&q-bH8^{LEG; zJ`|~>mavh0bQAF9=U7qHKF9VZ@s+#a9YpO;gv!l>mTNwi<~`6)DaUSygCY?ISUREg zDnP`c^c=Kgt{9J}=Z9W+C-wf&1F!1SLr#9E|G4;yvRYCxF4tgOF2lHt!?=)jLA~Xs zn{pQ{wUM;IC31=EJ$`|9i!SFT#QcGW8I_1eb$+t>Z&HQF?y(H_wL;_uRgc-`PZ;Q?4V-bvS%k1#C_Imy)3Pu^l3xc zuS?4wx-C6D`cS11oh)FoW9Wq&sU9fe&473>4gxa2AS^y z=R!>45p|&w_~6-rfiu37eJ6c%n!I$Jgu<8-dceE%I?5NJh6V!+J(7}<)_#;5A`8W+ zjUtomD+X{w$#(GBWVVrC^7-SeiUxWD&Za6MgpD<7Of0YBp|e7kK)6IA%!QRXM-QuE zNNcY(sgu36$;sYZz{HR`HXiUo-}$5a;`1Vmf-H9B^O49s9O~D=zaQV>d63nuK>ym%5yZb1Bj4Juu=g<7@N$*+#OKfFV!h7@ z9YtvQQSkL;nhi(XM=DveLyg>~$RDIEs8#AemX;P?XSqdQUQL+F6Egm@u(MeD?;@|o zJ=7WYfs6`14HL*u<-NV^4g7~3OWMKA_>^gf5w{!rE#f95?u~FzGBkmAL}}pt8S?iX z>p0xm+c)4MPB{t|IE_9!0tw5=2T(+*YpAK?V6lipraOcwnIa8zJR zMdr^1k+d)YpNoMlEaJ0Tk0#iuf!!9Hg3fHx1rVq5tPI-|@!J#e+oYX0T2&Yi0Wxe2 zp>K{a%|t5P)Ks&m>)iD6%g&cy-qb1PppxaP&?>lh7Qw4CC8bi-rKF^%FG){NOA+&6 zTrQD)IWpwW5-ADQ?NL~imWt1h6oYu_Aad(Wcnjhhxevt0+0cip(T5Z~f4tlWVq0I* zlwOUQPc5B=VCY6WTad~2@RKLUXMy#G5G|Uz8{iE8QFjF7f{5rn(b0*~(UYS^8@iDM zPjZ+^_{z%4Tm;CJU^fZau~f?E&1U3hWaLspYu%K316+=Oo_Yns&acoVp(Yv=BiX6VU|_ljA$e#V`G9v|dE`Jpd<8)A;42UmS49dEZa?TJHKIy{(>p>kf{sYz z*a?;iV~r6iV0tk;772igQLBQyN--Ad+=a^yAD%(3i9N{rCRjFFEHDS8S`g2$7!P6N z4Th#Hgrir5s%UNnQxXt?gR`0-19qV6B(Js0T}J{MfS~|>g@(t+o^?+pJ&}jb1b{M_us}t_#x;Ov6C+X+LFPo90 z>meY8GCT5lacOti5LUby9oo!R=;x)n8MIFU4fw?@AewL3HvL1z1<{AQTfPeZtT-F< z(acUTFP441V~oF*G6BEc>Q76K2LXytPJ=YE7DmaP5NaEsH>!moOUd0DFq9i2YpouZH00P02K@d2x=Zsk7yY{#{ks<9Mp<_$FTO3*3BGh0!gR8@o~|sJ&MX$z zZ`$#CT4VE|&~oMU9Slj3xLG_~G`SiA|dI>$0RNQ&MM6OoU@WiaTv- zY91abB3VZPQ0AoM+ijq2)Si;1(;7!SMtYsmSnu~Ye6XkHZyPtZw0zm@KI#_dhsV5G z9{CQ8eWN@NM}dI)A$kSCX&TuO^8oU}V2B&yA#~}Hlo*+<&oCafs`+71CLt)UfUB?r zOa^p|gZ=<&hk*rj7|B}eAMl-lWR4g3U@;seUy4z=52Hdp0<_L2TWM5!LwjgUq{;lg z4Xa47p=?9I1QL7HYnl&JgD**r-3&pbQ>Y>&6TwDMc8HHf5 z85lbQ8^PF7I|;!S3#x|`!+PdRSUNiY#Cm%N>|wB8w;oduz0acOZT?d)!D^o9dPIe8|T6Xh@{En z3g=Nv#IGdaS1!gc2o9*N-BFV?H%kF%QNPpO)Y!bowR%U#PGn+9PB!VyO*{U&b*rc^ zNSQn?At_~?8P%FtRUW9>LtxR95j&LvtKt39Vj%9ddW|tMB2v#I^|l6kZLJ5sIMCYq z#TTt@;ng|`z4$Sf8#PUrlXNS%HE@o;v?Dn(PN-xqB<5Kqq$PrP{y*)H-V_rR6RlB4 z#_E5vKja@36&`zyH9U{==Wp+1iH?=(O`EJ10H&QY8W9k-7OYh_TPv;va$>yQP6j+h zd!2;4ToE4ISj-^dNHqYeWltxiSieDuq6Mb8&7m*#oca1+f&A;@y`>^as2bk9B$GX- zDl01itgM5rqzHvH*1uj+QF|EH465EV7ptTi+KDg0Q+UB0d=7zSD@2yH6b}#_;-e!q zp;#h}(rP`@CY%DCj`VrD#W1W|(7U8??_$t9k`AL16R*#oo4b1btFOPdiFJd6*T#<( zoIGcUa;cFNvd8Ps0p4E4{shQ)Aq;JH)tPU;3yMTqxza_m!Q*_46$w5EpABq1_q$SL zy$wmcoU@bzfur5wK_o7PwiAdgEH$dpA2ki3+@Nbke=^xV(Upmmpo&!MQdR~*%am}> zM`@x~cEw7qM~>DKYIdv;y}n~;#2-qZ5$)EKFWA_tuCpSAJ^9pvn#e0fpPX0pt9uIa z?t9RdEV7b385ixwU=rKBmu<#=2?o@_>msx|aw0NdPiKgZi8dHwV!%}>)aIvploMt` ztHJZv2x&3!R29*qKyb82Ibf%3NDy?l^ng^TsowK>b2H0y=#%p1-A6qtwk7?S9z_fK z$OwIGY?LPYCwmlS1tzjyYJ-vOF1(?lif=-R0Wjq}^UVSt-U_@7_CRGyOEba#Vh99) zic|)x6<^AT{~9CyFh)EJvyuf^p-3Nf%c;vU^VdLuV0eCaOMn=_0DpSl=2>9NpHQ#L zn{lG~qa0XMlv)`{(j)vw%!TNE${_lv@Je&@2VXm*&T>;*&mnVxV49YeR+cT}@hbML z>blmc2gv4CDhhemoc^eul4NXVFGv2NFbA3Y4Tedx3LeNpy7|q>mQughY=ck07eMB6 zgZla@K+aZ&Vvl%D1^r=?s2&(H`ZRi!kLjtcU6DDZptZ18j z?VN>0cbF|dn=ym!ML!|VYwT}>RndfUK)V+LhfsTj6iC&?wxdPeYaITnzW$5XnwqMs z;hdO7N-Z#HSG#g$-G`zmeI2GLZtK=tamzdfhspLZf@Y=tQYwdYa!*fhKMaMT5X^|( zN00X+E@|j_RZ5CE!lkiJgj_bkEWW5b#r1d!(u9&fDRFD`6!HF=>J1wcAo zed@HCbLQT1Gke!z7xrvv+28Br`-c$fyBIbEG{OGj*7v>AHn`v~%(qSIED?zu2{ZSrd4s^Xm zfY&F)$~Xh-VN)-05$?Ko_I-zl ztx^Y`BqBxEu)a#@ZRyZqPvje`))TqR!()J&NM*czO%1SYhu6o)noKb|EOcO5y}!@f z=MzGKpkNZ8S4KY8s@Q6Y%g|!v$yO_)hAhDTz7V`nkww(59N}E7m~->OQpUE*@ojKR zU8(90!AWo>T;Jh;sL(w)Ct(JaEb612i@ImgV>@bJ7S;0)?b_vuhtAT$!(1V%jVwJK zR}!{tm;K6M78IXR>yQ-6AHoK?JwWirkdXqp-q8 zb>1~d3<$8P#-+Zl_D+wd>l?pA=W~CJ&2PT)gYP@r2?U=YeC!xSzwe>r8~5nDM9PM>njV8zTh6k?-`$S0m|f9 z8-s|;QwZdU1OHJ#RqXm}EA6v^`V2}71+W6{RlmG#S3jO!N_EJn<6(Z61xCh3mB;v|97C1dp4S&A&&;{JaTl2OCRY}>3VcHa zUsAN>cQ|D!Y#6U&=#;jH^@1f&;}#$QQ)!QI>$z6$7}tXKKDPt$Usbq)U2g9%)agNn z<;6IrG&{B*gi137B2x{?UI?lM@~7C3M)gu#L0W>r0b=Kj8JAH|kPOltV>DiM?NvW3 za6YC3}XWA%Cs zD1%yy&>dBX16XLLTsKwd)9Yg`lP4!7MCtX>yzkWDfd8Bzit5vczGHCe;7w72D5#?u zvb(6I(BY5w_d57!y~?TOBH)sNv>;9hD567WwN4rrW5iE5<52cUt3~b@4WLEBC9SH`VmoT6nVo=gXLyObxZ15XxerQnq? zTPDNiy*QU7?%Q$p48Z2~fK4tp8YR-Wy-0oWoID@R>^Vc(jUYldR)2xdFRE?uej$9D zCp`tb-6DA|7714Cu|^c*k~uluOO3~@7avg30hBpkEZs9+Z~pR~=bn4+oi9CO#*FbC z{p9u6U;pIjFra!^oRIwFlgV!PxiM3+v$Lm+Ip@B3TfCP`mlGPMBNUyI^d)dp;7c)C ze#diBI7Y{#as2X2kBiHBJu*S@1HJ)dqYH1jCUkkdT?1$PdV9Khx_{{N4-T9~GH-16 z_MINYB|}iA@*161BqbDPUvN#(Pn)Jc+5Nreq^J9M&-X`;orJT^iR0bJkGVUMOF^fL z(g8CB&LE?2FursRavUV_qSRzvb$ zT@7xokebF(y${?Ug7Y&Z9oNz>3O?Vs^gF}iqwdc1agcg09MIB%6lg%jdm+BO3w*f` zs=hY3deVC@tS#@#$9LoSmp?ilpwy3W8Fl=`EUcQ)ce1Ce^KfU!ksj}Ln=nlO2Md}5L{!D@+*8$WrxIdO7$8zPwbk{^i*Pj#5@qTC8)m;{XVo5ge;sNkl8+gn2n=_?HRjam4!oiJ*60B#NA}$M5z?BcdodK*C z!dnl4^;r#ZeZ?IxvHlhZpzwsfD-*gb+35zl8VVcHoi`!0Tx3Gfjzh|wqzPt&Gb&<_O^Rn9@w<(v+5#<>xOh6-&^Y4`sta3%={{Sg%5WdKKS4K29pSN-{FBZsNpQ zP+syu4pdND&A7iTBYSr-m{sCk-HYdbK^!K?tyH59?6*TFVTJ(*|B+cZZI%-j$O1Z+sA;|b>dcqzq|v0K)8xD zj@M%bE+?vBNxT(m6I9|r8-sp^@Xa1Mz>_)xx7!o%$#8wD~b zDMg&@Itb@q7d$c3&aVPP#P~@Vb$IP#6&Qe>{NQ*R@%dv&|KF?t^8Wz9ubt2z2oA8} zlipK7ri+a?YUOQ-smGe*v%sspSErd2qLPz}~5c9ye76&5D@8{rPq=ua**^ug%H z=|p=x;JEr*raN_3cwQ=!d zH1amb3$)$R)zkV@P|Gwc?Fn#t)~T56Wx+1mhOdQAd|iRldoY$1**(g=C^WSe^=9M* zz6eODWy^U;7ny8%ly59H#`-=*7U56#?3qQnE)j;8@9Lk+g1CsLd#?UF5ReN8RCEAI z`neS=@CkBS3jZZ!hDN(lDpfmS&U98$zA+{4?N8dOJ-`*nNHvR?ATgn??%Uuvn0vs}E3vG5g2=C0*#fJ-R7leh^uM#n8Ue%+6bLr;h1x`e)svNEeC?09?I zmQ5QrZG3%O&EI#tUA<)^wzq8i+uv7h+_>teiD={dsFAj(e$Vc@ciwM&e^*0eczf^e zU3)J1k@G}U#?A!4xBY0$?fT21TDhG48*2W4Qxeq&d2Hpu8$DAROG#tk>@ik~mZG^E zZV<<1W~$xq+3oiC-0I9rwxy}ujveqO`oA9O3C+!?j8|a|TxC23f1wN8CIlb=a+~3p zegKl{_n36I{BC3a#4$Qfo*+jrJr1dcl47S_G71-ly7YnKqQZj0d3O~re6aL^1x53) zT~vJkgE!5achgS~_1+J5?P+S<-Po|}-4FJDP`_tyc)O{gzVVVDIX~12d|zqh*wt1g zKL^?C#sgPeRIeHtt~ni?>hckCo6o0KyaFu)X-Mh4j;f$2gp%j;P_T>e;VP`*Rgw=| zHQ)lvS*n~L$_DomIA)P9h1pet+bv|WaLk2@s-B21x;PZ+6cQ4c*}NP(Znpzx!RKhX zNcn+U!=Fl@$!~Bv;3LkeSgR(X&#c&n-&S%xuF@9I0Q#BH+$`5ar6u@%Jt_srOHlPf z{r8uwxJTf?JxOl2N{?us`{08Qo?Ej1(4a^5qv^-thYCn>JT%_zMypE=BE9d}7E|I-b%91XrPM)KW@Swh{i;)Lvz4xTm1g zTn}M)1q=jXT^HHfN!LX-qKTLZ@|l}OtaU_YW=%WH{_QoW)hX+rm=i|($=vqs_!KfS z)E)1IU8z;?b*M8$&gD`RRS$wUA1}8Y=|N%nJMX-+T#Rwo)VN=KanH9yQ>IKA`gYHY zqN>zpD}DaO7*}PbYtt*6w!Hb~w!c+xdHq$0C!@~*oyI2U@7IGmEMA<4fd)GVrjOd2 z*nWmB9(@XmZZ-p+NN+^GKT&v!a4552tVmeBRcOv@wu~NP9`gAxgWPTuN`fVAOxqC* zc2oz0)$r^w3=9~AfdK)YJy5Z;0Agw3VHmbg!HEQRlS?H~I|Eu=42hd+sjsv{N5-Xa ztq}VcJ60+$1%5{3kBC0zqL0LTOr^M(1AlzXsyXp4LRQ}SL383+U1PUsDp##z@pZz zv_YO}01#~CmU4?1-9r2Wknl2&k_$C+cDQuj6m7_R zz#>7&ow=xHm&s+qrySAlLbAt`+(cP5OJu!7igZ7}hvnts8nAU}2a(cjjozx4&61sDs1p3%du*x z(uq^xpfljs#3R~B=kM-@Myh9k874y9m}D^{NgAi(9i+1u39JP7M;3dsx#7wa1A z+&YFDi%P~xObKTTdsoO;fRn_GGQ5@O5X9FrmL|H`ZoD_*ji3;O?75WtlMUlfIQveV zeJh~hR-7Hze%O7Q-?;8wASw!%uo(~Sc{UrmvTGs9Wr5sc1nB)cwtp>MefS#YMTvVsF;XAug4P2hg@-)lZFQb+l^O8 zpF0dIPjla8Ik~@~5@jFC5)!UcBW6H5vuHN#;RHQOt3?D`Da)iE<#j{tIn0i=si3~+ zRM!g(_1^A=;!cq?ey7_HopVhM)ICnkNocCfmKYaJGve=)UZ`pOo2%m0_dEQdaW~8^ zD7-OclF4ZD`GhMAA6fEn;k00X`wpP9r^z@G?_g0*P8WgS)N7nvcjt1>*N;L$aX@tf z?@EroYFdooA5i(d-k_dW8Ld|)Wn8QG2mH~|0&+A9u@OTI)x5Qo(YCMG!Ol3jz@UQ< z3?PlIW%6>l=AG}PgGV^7D>-1E6cI36e~~;TUdKWw++9aI&PL!y%;#gOXjAk!0same zH3DwKHv^10_|r)K!cR(1M$K(>6$SJVuA#c%*F#XG#w@Eb%WBNBozFsor{$3GkZYdo z<90-GFAo>?_KoJPB#C|@;3FGXlGiHXWi^<%uU+;zz%~n^1N@EbNB*Fqu!?N&>GgG= z9PAs!NlN{uJnk8QYXLN-I%qq8F0#;U;M2`)tK8PH3Q6aH-`E_?$^DT3s4WKVgnI%$ zn_XIP%VRQ%pIAaEjn^XLl~N6pgK0}-ab}{$pgtWyPRo|;urR(H3$@Z==h{%lY0z&A zvyPOE>ZLYRw=vj&a>I@LJ-p3Q#<}2q4T0bTMq27_8E=fjS_8D#>!3v^lNZuM!W(3? zAtDNZXNO5FS4t57dfB0PE&NMD!T9kADH|JqCv9b5l_$5q@J^=xXrZBz{raz zif7oc%gzOcojNJ#K8i5Xlh9^yf^7UTVJLKJS0yFKwA1>35##?CjQ=8x|8Ft=_hbBH z!0c|?>5EK;{A)3czxEy&Bh&}yULE0iKfC}f|L{))c9UOq_`J^D(Yoirr+b?}M)JT` zN2Ziu*tY8kjA;JO{jZ|lLzZ-XXbVEO4zCVOpFaKU{w+w?PEA$Q^~2kgpgIN$@C4+Y zhA)LYgSnT^plFjBIundR>vfp}yC5@tn*7Hc)I9QVCD1_EvS*Ct`OlR zcvDF_WefB})z`-~P6{YQ^udTLSr>0$NNN<6!cIzcCL>=0OblIGi*d7L^B4e`e$7-H2^azw#+upSI=Vgfbv$#kyDw zcPT$u>z&*~s8RC-W`P=tc5?n1resn{0A%7_^JT;Gkmohr?ptmY!<)Ar=Vh^7hs{H4k zRt}d8jq6|N>c3of;Q>;St&7wI4WS3`0jENnaM46Riqd8ck2iI_FO2sfj zQS%6zcfpFwLawWuyJN>w9YEy4!%G+2eR2r;%yTEYkF;B&D{{DO5 zG>>>8MXh{(XtRRP{s4%201#yZL{WBB(hz4#H&Mv`sb2Kd_x;xg?YEK70gI+jH1eps zA7l3zM(?+Xby%i4fMTCeYdP|uawV^ozkna7_6FOcR202&4#pFSs$u(k4Awqs_el%X za*p18lmP}V*O3VDJQg^uGgzk0DZT|>6QC$kTbPQx11eJu|Bznq?!c&qG3 zF-l0XWWu8OROCvJVgf)ed8o=LJ90zxCG7mucU+dk<)c(N$rF^A)?}JZYEyYX zd>m{*y+c>(a;>YX?)IXL`d3v@CEXidQ+KIr+|`G#Db0jZUVu2>ZP%hBpn zl_^;8e{uFM08y2B|M+vxoVhRzFyM$IB92IgMn*HhBN=q_ng7BZU684{^o(X zp6l~`pYQX%e!j6L%>{puhtn!4IVmyT6!Q0+>*9G7ib8EwlgZB#6I~b#t&(U9<&FtT z)C)q>HeO}&baZ!j1wt_DhXY+*$G&em^mDhb%dd+~3x)6pm>eiEq2^`;wTW-4b4!ac z)L{%S)fGf6_b%{O;L52FMXLDiEo+o5U6*ZnDW)VvYLiYuA|q$0;VjC#+;AatL3jjq zJ@^6rTwbnT&vW=lvdd!ZbsuPII{g@OV0>xym>Pau18cRz9)8^Tbj?RcE zd(MH?1W*64cMs&jV~4Bv=A``*S=2F&ZxtYqP7!Fri-ng?rcPZvQ6WS}H~>xwA|gQn zvBqv?_Wu(@OnHUKER0=Rl9^@r=jP4Noy{CRXn1BW0+9Cs3@kba>kgIbu4d)t`K4n{ z?5e7&`X&)Iu-31y1*@pTb%hIU&CTEKd9V6~SHHkSJlxzVq(Wl3>xpHCDw7FT9oaU8 zLLn-tX_rs6B_2m^3oR21nMGA+C57B|Wj^1TZ(rMR8y3x9M478#BAp4j&xwH3XC1{5 zVG0mnT8h4V0%7J)U}lzq>rIKQC?(-PnpSRj`5)kUzBzN|Fq2rWJ=5XyU+4p;SwV=k z+!{d+`cI!*GY)}nK5zS(a46_M)8#pH{=&JQp3aU_=gxQgjC?H64tW2Ww(s_T-F(a! z(jwo=;7dqAZ8y=C&c&Lc4Jnd~L90kFWFbS+IG$B8g-4h$i;Gz^P7vBy2;f73bLT_! ztIX*Tdm5WKEX5eq>B4f@5Nk6HqQ3P9`^ z%}GZYSkCnAJD)W-+rw!<+M$&{4P>B@gQmuuvwQ;kGP3@E4T@bPF$bB;Zwil88hoM& zYhL}f+uKvReEFxBA;`W6Z-hp-Tpj7$2{N;qfL)6A^qEFSkKfp_O$OBxq7PQxLyYjNg|IeD3v{_jm6*bnHw| z55`ODY1;krhP5jxBJ?3?({7%;r>h<^Z_yT>nR6n$o zUmkryzrUA%N->i4`c;&#S3y%RfTnK2Or8sxB9tT!i!4^~OiH0q1cWkB(ly9n{9ax! zKPlHBJ@QUusaWK53TVVe`DK(ICCF*DF!0An!1l_Y%gwM2tp%Ae?6n2h+atj*!3$K} z?R8>|VN}ta`|d5yDZB;Xm2)Ry39Et-(4?pxh}4P88tmO)_d%1l^9)wul$)}k)^N`t z*iMPdVLMhngd{pW0vgh}N!-ocFt{FvaaVJ{=N#Nt?tAV$7r<}PTnP-JKX7L`AO8FB zt(*IaJI1x){|oM~aF9f!aX2Sw9zOVgvmoH;frGq+M|lG~ZxN$x-VbW3cYM}#^sF;M z2zflmv6>$C_+rvBt{-DI8=RV8%g)jQr~%JJma|({4r}43z`PT$Hp49ybwD$Dd~!l zqlYKQMr%&)ZSe!TP0&qwV4ShraILNNaYyc87*!(L`iN{WL@fx5N8mWBqJsD!gAO{cWC;4qiLd}zjVo(a zzLRO=ShkHJHWqP@HZ?yl#&ppsLsJ1lpr*c|BwYbWz4-1?w!kGU07VHX9&-8iVH;;l z&c|w650-W5d%I~pSyF|yLI{mT3my-|R}x_zLILCk(m|m?DBxJ?D|8I$g%}f<3S>)AE|6lIo4;*t`Wm2t=Q_Tr+oQyRehFFl4M@JC{%XYf78Ol> zBp+<>9V|#yAQ6W+*tGBw5Y|;@E7^$6aV85u6RgIJ#U>L0`m8~6P9gGo23hPkBgglS z1q+JPv6%&#FOb*{d!YoN>vTXW1aM41s){psIw1vjdJg^EhbR_H|(3M1tN`4wI5B4$uI|9fBb0Ngfe6gGJO?2f`8@jSvh)QUE+4Z0ncH z${aEr~&mCxD0)}zW)Tu)gu~Fsk=>bP6_B>Ea-q+AD93M&>pVA(z!XjEV@hB z{^^e$9UZ4lV>}bVomN4IR)IRE8&+=rJP-(UG;~Y?BQ(RX|2w==TL@DY#kb;L2n4dS zfZv*F#7i)E`n&pu!()I?B5LoC`}B<+&*VY3MibWW*b$fqIlM|Y;p9I*J9IiIab+f` z%iIzh!p>u|mRJKNQ>`aFC(dY0=&JRx3;uBb-KBTmQBs^=ke^#V))krlNiCNhN z1z8F9g6y1|$7f}Zy>a>@;T6Zu0o?)AO#sc1+eyH%p9n;ZLX0 z8+1{_#ybV;U@aB(6%6L9of_NV7!6pKD*@#c@Sta?N(dT?HJbqy0~dlJS}!2xIoc2s zqs%CsNlQ1Td5toY~yHdl^M;OSzyO4BoNu0LQes+&ZyeMEE7 zR@d%ypwTS6NeDrrzAl^<8wj3071~z?3v0!Owd+wv2m!;u)L@%Lo!kA>r~5673NXfm z+Jz<*dcD!H&Zz7~i!4#MKE8apTST_Bv7~g!9;`i;2d*s5Lq_#c)}=LROxG6QGXX}F zezTjz|5s^AE}4pv3lD;+5(S&h)`ap!OE~X-RFhX-K*EzdcC;dn$f$$SVhN_fELC*C zZ2~XNDJ15Ul>T)p+X~M;wHKAO@+I&&N&#*GUfQat(vqvsk@V|uxS)2dQ$#ABTVo4_ z&UBm!nJj}W2?H=$`Y!ka=lk@gP@mqClmrPUgnBbFz#s8PfH5MBY0fB+f*hobO8P+p z;*k(K?Fn@M3}4_01p5J-D0J>@z;lY~LJKenNKnvV<9QOx6uA&D*K;U-tO#R46&I+` z_Jc7;kN#hV#8_KgT>HNrmR!g!CR1_o|KsQwY;A2Ap#SR#X&Ngl8~?Av1dIH|VM^

    W*hEsH+nMByA+iu_*{&xN?l&Kho57u19Ik~w_%m7{GWT}GR& zCeyeFu-eZZ3);il;nFvJeYC@G7>)=+c-W${Mp_Jgrw{)kRmN`Ib>P76*D$eP+qI;m zWQp{ep4aN5@Gy$8MjZ#*?~}ubbcMmdX*lcYIC;7k<<~*|;?qhwYhFV+Ax@Z|R+H_o-O0?3=hW#e&5G;2!W$Ivi{* zc|c?7>0;%+J1}mP<#!#%Z3M<`IL6KFs;ynWb^|fFs(rB01p`!s@w%w(A>GZy4oBAI zBE-_7@p!=Z;W3aEGx?;pu(}r;I=3% zZVQvN_m<=j)|m330~}@R45e2e+FDt;wdpDqjv84{#Pm?Xy+7r*3YMf*JkU#k^_)~( zyfhzNjM}qYff*u-c9s$4K$;QeRz_%9XxjV7#0HOSr92_D*iD}{H-Gl>wwHIe2V+M} zxzElHVN*OyRgkATI!^k-p{`E9GocSDI;Yz`C)}-FA%jta84 z{Hj}Qq|862LqtD5*1*Ua&WJV(0Jd#7W+oOO6=Fxfii?D(j%Egnu>J|iw;2BAx8V|Y z;F|-iLrJp_z--X0S-23n*xO77gs=v5iAezjd?h)JL0=##c?jN`4I;300JH4?ydr!H zFCYuXsW%t}_escVPUG3u76E~=fG!YLZc}@6I(l;&dXw-Ru0wB91tv|=t>VLkXR z0F6%&oSary&I7xH?Cesd+H((}=SY(phn^$ULh3m?6u!C-iXa~p!{MaXR=5uD=PK^F zwD4qI1rg5vRaCF<3b;NSD6fEPPzaK@*^u3!bR>9eg=Syv!LXP|RLP#^lHfSspnd#? zFyn12wR4(J#@Uw_vd<&)^Dw$|ElD5Ig~hW$r4z>&PQE8I7d=pk$U&7T&0V0pUNebP zg}NHt6$mpIq1<+(EqyRP6446MZJ@(u(3%SFpwJ|%&_4l^1YtfgNukMR81D(qFq!#P ziri{67@(mi4NVI80?uf>(*~0U0buF^Bo3aJp5dUiv)+|p0y3yi7Ft@*Iw`UFq#JH# zfaR{-s`e>G3;z*)N=T4bqfg0)G|-H2$0#0K2fFuc-uTSsiqgBgH>2X=on&)S+Ctso zWy^N#0H@^I+VUXbIhm-OeY6OLHM$3lgCJ z>gn?)!emdW@YMbRQ0(Q)3lN_49<6xng{VKzn|_l8h5TfPj< zg@ibrGoEm>K+%I!k`e?|wkGcAQiMv5Ll*ODo6!hn3w%VF(TK$R{QfS~Tsi5JyZi`A zG#Gdso6LIZ=4#(V|ARb#xju^|eQ1vtVFDZ!PjacA30{HE0{b^TQ^7$>hv@H8_EEHq z$g%tPfqth{Fe03(43eZ>N?;lPO9i99;))1WWeTW)vQm{?Ac!*K^@v&sp4j){y2+4K z2se^oRZ0lo zu_CvVsxpQYHGBg`0}>CjU^FZkcNWTn!2r$lq@TN`q-6578A))x zPy}r*i~>tw;_@6jN?EXqVH@iq#nC{?UO-i8(PAei3n=j-#3Y-pU$6j9B}FpP*>6B< zLuz^fZtVp{mf6fNx!o>tRaLjcp)o=61;Dt5rpDUPa}maRp|sKL_qX|BIMxBSt*fiE zqrDB^0dj$G`?LlK7*?w#)+B9I?kNZNbS>`bic9V(>aD>LNvpSSulyUSdym3iOxdar zvX>>4-6b3~Gj4B^60tH?)ev!ax9~@gc_g7|1nf{^6nFi+;?nyTExLQYq)AV|!LG_% z_M*q=j;P_Tc-$bE1;rR3^AEQ+8MihMPR(C#iEc1ixuwsAh$7u9Ie+GR_ z+KBVbb?eryt7|?tg1sX~`@Vax_Py_X@o+xIOG4w9=7LA_px4&3PlZPd27Cz$cZr;} zFpq>FfKe4%k0W#Lxa2VE;E>a@AiNE|NSimO!grBsmO&H%C;5N5TH-&%OD?@X)%LIv zHJi$bH9J@&mes*SF2r~J`}Er@D0)%dCr#OhKS+Bh_6qgslKn32%ZpKu08etLXA7Gn zXH#}m%p>Yujlwlvg&rlmW0W+Us3<|+jhub z@8HYWex-lgQFS-cTU1(E*`pte4dKz)OSK`9e#G2Ri8#+i4QVsClYs#*BIQUa9qH?j z5v4UnhjWrOiR?*qPRN%zq6;>>x?iZ3#u5o&iieisOs>JUSY;Sj_k1qOhPIlZ_qGas zKuPXytbYm~K)DlNQ)@+(*+ZHSTU%QvQW4kD^^ofw- ze~K{Fw^@zO5|19r{O>$=j7tlb!4}-|^yF~5>|vGR7I4b`QY zQu{M(Q4m0dliwZoWr_L`x#P|I(oMf3JOFA>Vi5?1u|6r_t_J7YtSNKn%>~8{CZY&A z!^I@wulG&L`hZ+~%VJi(@X@}a$M(Gs7479JM=qTFk4tY{Ng{$VGksXfFq;iNT>yR$ zymG8Z(8_0jK4kSbyFDG4v2e>tFF;lNn-~ zK4y@0kkz{44Rt15jnT@)$R=U52(^*$M3uDwYgYkA!H0XS43}`cB`-V?IY<@|2!>r# zGUN5vMQ+x1mtqNk4pG1*aviFMdwU{)Abb2SwdQvJOz)?9g+p*_8HF8}J5VSK zOY}v$kFXZ?4#|gR zZ2o8#6uCW@Z$FuwDTc1$DG zp24;Vicu(DyR9X_Y_q92h?7a?2X9SH&6hiNXH zl?AgAH4lKvZHOH-Bx#7vD#)F!?Ve!JBO%&K5HYmKun4VypBjeQ)x%OzA~YZfvC$ZE z9%|$16W}vvu%*s2Jk@ASMW@5Zq!h_h5pL7a@59jVgdlB2zY~I)9zx;Sfwp;n%?GA~ zGP^a+J$eLu=w&uqbZsXhIy?Kp?#=K1PcMjl{=z;P7cOLW zZWb;$X@sG-8w?auTK68z1;tA1)bz>0kfcw)YjJu)!7{{ms_|m0VoPsHa=YEJ^I~HY zWH}*LQaG9QiHC}F(qSM&{qljM#!sF-YZhFQr}oxjEmGkK9>>kz22*b`r15Ft`;8K8 zq+8!_Y(YFmA#8s;@qZNS4Fw^!u%pP%Rt+D?^0|hpQwDt1$tQtdg<5f#(-WFBrO0*Z2(zwLU$2jo0mf#CYY#kh(ap` z*^sdFSa^Bd`oC@6(RkXFn3^%{?4Dh3Ackjo_^I$R2b`TOk^ISZEQwoy>Q+6hFVy7w z=$DZ2`RE#CCmRfaARU?gKmi2tmw*iM9NT~@J)D%wm2#y(kXU9%#6+m87;^|EUyxLA z5M%!tRJ|WC{-R8LkLJF|?-J z?Kfslf(6zOFiwj1QyKum(Q`M?&u)S(=#j`EVkr5HY`ZiO=XxIWw~37OL(&mn{1Yp}{wdk2vOO-QXiB)wtbQ&I#wW^jmw z!&tRF$QC)?E}A*U>GXopGys6VRx3tbdLz-_)$TpSBiasLZe#kWGz9w&O@<>PmNUi~ zgWYfhcXW0cj3#Ld3$It^eLluFJYyKfDnbHV8tH^j4@F z!##DcOhPB#4I2Tm8Va#_NW1d2x-Q_5Y#G?T&v))D%6Ip|>=)|jI(6!dpAEz!sY4_q z#WuP$2z}C*4{QSgYgkAl^dUV9;kYq~C~Rw!RP-pbP4y4-V|_)T7gS^~2qpm_B$%g{CEZTLx00+LZa;2AD6zT%#ns7Um&+G#c$4g4Mg0P_vhAhEChku58!R+xwF4_{tyDXRAXy{oSJ~@U zoPiL+`n7*E?G-M95#1KoQjJQ$e*&+5DEt7#ITyMc{qKPBOT;*D(9IbFub9p_5$lm^ zg`?W*8({RP*CA-5d)&gm5I!U^@~2>hcYv8fx1<`rqW)kjMdZqI0Za&y#yxXTf`oTF z2;>czLWro^m>aE5QAr^JU|z0=hRpLx@j9%?8a{alR`DT8(ngUF^oCtJFjzM#2=!~s zge;zddn0X)EV+sV7x1juQP(Y}*4MIE0s1Uz+6;y^ypas%^hG7b1v%*p?aTox+$bUm zPLtvF!iePs*uMqWkIO+28Op@StPdy;5|oRD4m-C|#6P`vv7S76zr02+;Cd4B5a;zE z_byAoX6nykWOG+kR`O13=Dw~%?*YldXRs!bZ(BvQ(#p%CfdaG`N?Q`74ewUiS6{3J|;n<6%T6H1$m!oaC6w_ z8pH)t>3_S6U%=yTi^ibe2`R zO|Aq+hH7cO1KJi<#mX~m`XL4eqVzUr5s;Oy{$z#`u2*}m85qW(O zp_FgIA1iP>e=STp=XRS+Bd0x1w^M;UUp4im3SNV@{cl%F)gwJjINz0#5^XTX4opf) zh>1Zw5^BzLYm%%ZGRIz%KGJ*2(+<&2;=9S=0%=gw8|>|qNbpCQ9w#O=ypAr&PQx0% z2jl&@rMczU8Ppnt>F+|vk1fsn;8Qu+oSb%brc|xY{J)?_X=R*=QJsWQy%qCJGjqp| znfXv)Q?L$}X`kAKy|xl??MUtR?Ow0PQ$*@M$w~5YbQX1y1(6i9(QS|O&sSldj)i86 z!hOK~q$WIlC^-7ziNtErOz1GoJTN^wNUu!+9(J&Ve;q*0!r87VK#+> z-F?X;uer4#CnwFGV+p0@q@|4;H!6MP;KbA`(;&LXpuP+wp`cNqL&)VO#5DK#jlJjb zp%<1EWHYB{WTam;+$;p!-SF4K<0!_s0|9@}dDL?Po{!OttAJe-grn7^bx)3frTykUDL zvu*|3XaES%frcb~6d)fD(?olgVZ=vh>){1ZMBx={}4AHSd*<*4XJSXQ}G02;4S zn1-5xyan%9(#$Br+2}igz>%W6+OxL}NgBN0tFZdg_A)LT$ix zL~gAO9*KJPlv*@vEhJ@|zBnBiNcHK(oE2R?O)+XG<8`rS)4qLM@)0yhrtCX3FYep- z;_nm<2uWT@Yphd1y<#IK?`W)3ULYVrI|KsKCkg^mH5_RU2IM0YskJJA3lp=3L4Hro zo(ePC)a;RXKN5Z0sPuUw5FWH@A~A=$&>%t*4BU7PAZvmUV=NrV4~n1q{b?W{$rg*O z6ea2Lhp8w@@GS5J{lPxG@4KvH`vJQE$S{PWcnr~GOI7PhDRxyr1c0&Vq`xbao%*Xe zec7CX;btS(gn+j)EKQeAYHnO+K1ksM$V!{JnKS=wQfG4W(K5Ld(2vZeU~(a4*WVrt zw&QJr&6dCi{j#LaYPy1C+i%b6T(*lF!`+gS%OwMCrm;XV?lgv%F+=~nC(x;8t_nWl z?C>(JH9OmC^-LnPD2#s#dYfpIU`DzQ9_;eF-G02Kg-wa&P|r^hvPPy_bxG1BI|6S) z_z|3aTo;7SYLPWY+h5vA6Euc!?!C(Xo=3_+|hc*LZ zbjWN*x&cotZKZk~C(gbEXP*epay!mG5@!d30E}4Cp{~u_p5MiQ*DDD5FrQN^j9c4O zyQd4kRO}XHlz%Yv|1w#-zIkUOt~ZhIg z{57#l{k7niUnzT^M5|DAR#r~Vuvl9HDm;fKKs%(?h^4qHW=UaIdUm!g*6KfrDKH^I zs=H~C)-1Xu9sLF#UiKvCZAR$M!~*Q21|F_pV?{35EB)IKB!I9QWgXQz96sN{iU>>z z|Mc!QuU3~A8SPo4PdHLRCVMPvJgH4OqH@;>6Mw+U|9}{`jBY|^a!g_iOoU) z3w;$k6kjD8a86}5k&gB2+P4uMD>GazALeU-EdeIQLjuLr>f(#rn8xi!?8!=$IMeCy z0tx|%C`aqJaFMs6U%yf$Ul+un1O4ifdS&y2<|f@d^0B<6}jVQU0hpJ z9!FRg8-+V#x=woY0Xb%5XIKD|lps3uh>@|6_*;6rMec`xVd5wvkaow8e+lF6SKjlv zpEv+O1O~n;CK&WLHy`-c?e+Ul2mO*u(+AN?O}0(T&k$|cZyT>ago+;cp(9)No`+SIBV2AjYbR@ns_s~`Jl(rvbMh;kd5 zn@6l1?X9V6Y^)2n?}c*ktFSHk1$Q{GJ^W5e(IJE;tFAusCjoc?;TH_jwu(@2BkohE+w0fq^21}% zu7x{pOJnB+5*K?<);&$hXPNYiR;N4rb;Hg=*u%+*OYOGs2DwRY(o|J#-wrn(6spff z6*l|7!jA#@);M6}TR&pL`}(YH90Cso+w{fTw^Ir57f94bTOo{Vvz~t59xip}LN81} zh`3Nvd>i7_@hKg6Ohee-sD-x^u6gp+sAtXI;u4@^;WwZ==Fcd(9qUO8)GnnV?|D9w zg#sLI5vuY5NYQox5KM$Uh0IxG&}_gm^Vl^`GOZJeKYRH$$UPYlS!ysS*F_BMOEvqv zX3*6;tO3E%c5ZE(%TQUl{q<0&^4anTFS%%GSJKqum;RyD=PS7jruJNz+TA-Vmn-R# znu3v~%N5B3AVt7L9@Em=<{3S@3mB!oaOk`o)CiD@`DnA(n@FiTLk9#yXHWbDE9009 zxEo+a5A~J<{1d@jXF5;}6u}0}-4T%2j7%MonucW0fyf`@`g#f79O^@l`>55{;)XT; zG|E54C8zSDrqwI+xB^7gAf%d8SE@R6&>qkL;eVrq1EOmMb{n|)4CFozmcPT8ehaLM zI{;_$9HOR(!&55>KW2Dw=ljSI{P4qdGn7D-!GLf)104)aK8wsSBM7BLRbPP*POTT3 z_Qdd=!VBLueT!=A(?BCw28BFj^tWj4OZnCrfnYIz18u?=?qhs+YangP)X{>SRVE0+ z=&4iE0kFeKvis1M$o3lNw<-7KvMq3DEaB47O1Pz*15M=q#NCKR=SN~FV2-6q zON9>B1VLjfsGq+77SM*bD*Hu2GI$Kg7qw{BKn!0DiQ`I`JkgZzYVqBCXzFGFT#yv- zPoNB+17#J6$YG<7nXP&8(3yMtgGVJHJ11w^%})KP=5O7@ZW;m3X%}@PZW`wPw)vD( zd-JlKoa_hl5j8{9*r2)h%%K-^!5i%oxJ2B%yYmx#?p-i>Ho#)n1$Y`%bq_DoZFv7^ zPfQ+mlh`~4FQ@JgxiLLQYk@<9U&D{beMnn>Q?qT`wq0&tLf+j{odXeSRv>_Owzr=M zU=9*aNm?iv*2S3ga8GhNQ;aU$i*(E|)+B($pFZB+-Wd?gKv$`A#JSza5n3N_vkgx~ zDq>W>F6gmh7QEYC0z>fi%K)>$E50vq`uI;$oywc;1ARF`U*xmS1$|u! z`Z8u`Los=F7bV!_M~qwZg;lR$sV$Iw)S$)Q9qoE%^Ttgty;A?vz-)9}mIxaV*91IF zMU&^Y(x=M)PwU7&^kWZ_NJh^H21Am|vA*D2G%QUVH6}UC!J-4nF!AvM-6F}(N z&t7^1MBSfH1!NRZ>=SeX)5eB1cHhdJl z8Ku67&9IqZ1c0R*(ik6OlU`LviIA%Picun6lx#1fF-jb=vFZBzUxx<E~%S_UB!&teRse$QV3vk&+MfI29C4q?rH zVLXBglxQH~zsC#v*Fe#ck}@)uEmQuZyN8*v@6xR8 z%s`ykeyr@U53v3G!$68;2=m9Rf-T3*dA)Y#h9VMcF)^TvgqX<^3-&?^&qhAes^UWh!ejrrJi%Zih)IT&HlWIvNB*u}i;~{Hka|SvqTe5%&{US-Gp7Sqp&b zQD9~5A6H6mI7V75tV96V!AGz^{p#RHdcy4<5Q8DBlD5*nVLCVMr4Xvjf8 zZK|+g_ntj_^2s@jHqGGJP`MwnxUW7J@nGWx=PLMNXUQ$p!a78mysNZb@-F!sM4X&~ z<>7O=mRiJTZj#&O<5)-Pm2!f+AY`u9d%b%5qKf)Xr|v>~Qy|dvVm}*qR6Mj4WxJu4 z0W3tb^q~rHRb{s8UZm~XFF3F4tgl#P*L$a@jv6(Z=SOGHxX0tcc+8!B*R0u7ib_kf z!U*?lJMNJlrnw2&{ngwzFv=aka|M{Zz|O8`T`s)&Gq_8Gu*J9 z`1c?olxng4^4RgV`d%{3Si1DSo05<00^X^@hlZ`IJ)l#$SKX218)qz?G2_PMBXtTh z!}k|?SJe7lN0M*4Z|STBe=1-i+=i8CtN17WIPXs7sEE$ zpJH@gsW&Hfoefcxd><8A0Uj8#v3q)aXEAT^+S7xYe%>>Pw*T~b2g%)}U;Nr<#dnc@ z!PyiAK@Cxaa?`)H4s-odJ%IO-B7kJYUugpO;K-C`n2D{g0AC=@pCP|y9Bj+wU$k^w zw-}Fc9S7gZh0khSLLh$7xq~%-ucF7UBVlU{qFRv3|0b2tQ086uF-@JJYf1scbQ;u3 zCYdrbZyXMeo|M>a=sDx$+V{hKMp-t;*!#x6lw9%cR?tWDHM1x$Ld`u)F1WpH0z8@u z!-tHvT3eQvH9&(KtrGc?5)|@yQJH)VY?US_&AW@DBuJF93oB}B+OzKHTAF=fgimYlxl#yx|94eRdYpUqV`;l35a{WE8^7Zm zA2L}7Ck-BmqRSem5wbQ)WTW^ncOGyZD5#Z$@k})8YP9^yA`+B8f4 zOlh6?YL3#o1^oHRxq4Je2&tFa4p;pusT7Nk+=r5 z&$%u5u9kZkTQT0Jw6FN3d=7Vldyd=8ZRShS?&hz-5puaO&m4BmW|3=b6gBY6G+q>f zB8=#9TSUq zZ=ih&Mq@}8V3v#4gH42bPIh#jMM+o0{^*4$E@VW72*mdFAPxl+R(SyEtCvEY6k!S+ z0o(#I6$|3oMb&Ci-~`V+O?VzGfn+L$2dH0hgEB-z#z^HG7;)ZJsKp3s>9+!sUQSj( z#I^wzhy10S3sP;m$dX|Pv~x8u0yayke>1^`I-R!5t(O8MJBSq%mrq>Ir>-y}SV#*% zTs+9cR!INM#%0>bs!ZjVyuKk9EHz+;V{t=4nx*T zvO6OG0ooKrPcthP?J6=>S|u0X47pOh${TTa8QAL@%!R?&i>$n4z^#TCz!m%O?Azl( z6F^d!KDpqI#d(Cs_mT)z&4LGJ9M?>TyV(taz!O{dqqyC zMNOb6y~zFe3Wduc1`)V$OS!5aMQ+4g!ZlHX$Jh#PUfN1>68>%~0xr#5KDUiK%_pmk z+Ydp=%+3P3+b-Nit~3zT0KlYoR$M3m|1vOHWRn(mQe zo4|g6ruPIz1X(w{-zKnAU%iVZ>z%JoF=5b+(;@#&zi|*`Rtgmgj|OmKNbU>xLw(^s zM0CObFNA|wl|%khFwVA}JPiaLA!guU>!1N9vbj)9IO>2?xCEfLFOVK3@<4A|iP@!; zuv&@Z84VQ86$Jy#=^k3(yHJxQz{d|w9vaUD5bSXNB@^U zfp)3n;0pG`kPWQq6%Ige!2T)Yr@j@uBjUNO#xdW=F{gpDDJPq%bLA3TkjOSqk`JOJ zTnJ!7q|A>G->+F;Uth15CoRC?{|k1Er>c+vRCQ!JJdQ@P8lgogcun~rZzb$OwHt+p z!fG^Mw;5U3?|j1SIKCs7$k!>1pE5dWfBz!*f!poQv_(5n{fq%wS{PtvQF^B?+LnnQ zK8S3kefC7s=qcl+T;9&xp`<w&yrwtYI-lg%b@8EUFdbj84@f$pK&08(3!BEfSpK|C5(Ss*~r87YmEOj zNgK`Egv=VaGy0b{Xx~;=8}?whU7&69Y&djPRZQ`2JgG;4yY8MIqfvS?D!HpGnYfWocVz2|_R;&-00c)rdjF>G(cX>wBtEmN6nuc6>B+FO3J3h{B1dmm@r9m3ys&f# zNvj}*2S9GC@E^bu{iGg6I8n;I8{l6^c0v4lxjtmDnjr5QBHmEq8hTs-ggP{JT?39E zixtZ?faXB@kox%LdWT?ZE4HQUjluPra*(b6u^THj0JN~spiq2$<0@07-JUztyyMdk zwpKF0Ng5jK{?V{=$E&psQh_3W)I!UX_{C)pQDNQJQH66IY6Nor00;}Iaw~Y`Xu5#4 z3OFR7SM~T%hgPAIUAW#)a0OHeEe}_46Ru#A+z3O(7`Ym2V-bR$s<}`4wcjRO7V=m4g30DcHR`uOM&tZcEQM2fpsHTnn^`YbRe7ZH&5V@&l0tihp1?bPiga9#8l? ziem(WKU})C^cSufR_D#U3EZNTYla&bKoYQFWrDZ733>ZXZZ_U?_^yz<4H9@G=jSKz z1^figkM~>f-GBPt&Hc<@3yFLk|0Cam|8;nOEr%=DtQC{?Wo046Fe}TK0H~h?-vP}0 z1FkoK-t&fQGGqbO+;cDRMPG=BOfSSQz5}`BcU-yytf&Ww{ub22kg&>nz%~j88)dVA z!Yy@Q;9y_W)!@K26Ty;Jt9%o$4)bCd1{YttvGnl`v3`Jw0BD;JBf~)E4M_irLhwD{ zB25YKcMR~KMb_e31>LUi(rqLy1&Rv7`!@tk2B`A}6F`9A;|N^<*U` z@lcv1OtfTlJxA7I5Fbhzgwky>eIaMQvao)HOrg7PuusCK2jR=1prmTt-Fi*Q#AMmY zC)`pt3B3DV#R652=Q>s$Rd!1sXtqgPh~HK~g8+Zyi zCK!ANHVvL!INqLhzTrzj*k2zqoZGi^=K-%%7eB_Ho@|0`nY4{9n(66wI5L(*%oYxx zJsnV5m{%zInuwN)p}hh8=hpD=^kn-sn}dfmEL{@HS@`-04m zm>bF2vCbR8%g5ec_wIXpPs#k?e0UV|2J`Z%z3)i~BH%<+RmE7ZgxeaQ=o{n*x)`_W z7MP9=F(|{z!R#LL`w@@l>*?-3$AJHWRUN&q(;}+LWEOb;`LO3i`xzb(z=#u0G7G4u zcmhX<1kA!KaY&aY*oP0=u)hmt5T_0Xvv$-X6@~CQ4}i^uFhWVfu3LgZpZ8Sv=?k1r z@U{C{RFqaH1OewSpY?|1USw12qx$4N2wVcJa4ADAQGy|K^2e4RJ7t3qHE^hUMjn2t za_F=`04k?|2`U^5<7R(d^3kAPs!Ki))O#hUcOa;Dz{t^`eSEO(V9Sw~`mZ{ILo<;9 z)h@;t)>UkK>x0_&-hQ`u=3TSq6kMMt4XAI($uFE*Tr#a>;k+zsXXD2^pviJgi=f*Y z9=jGZB@|kZ;@@h#?NYABBRR~r%oNORxXhZr1KG5N4AQglMt|sBM|;P~lifzW-Wa6? zKByUfTjha^$I`~@1eZQwNwy&00w{U_X#}P_ObySfvv3Bu&?Fm!{fI}lkOp2?ia8@L z1a*T`)O-pJz#A^bZx2s4S6oO*iTQHdwgV@8zV^fWj?}{oPZlT4xoWI{^8kA~7F6^& zKFz`BKa-jSHF}O?K!S2q4Y-AJWaa2e7)}ja5p!MY=&AE=vyaQX!9Kb8Haj@@vRs-i zam#XNmX_U~yYP>NH;un>-XGXp*bv5{nJ~THMi}cs81_1qTo4}|sR!Xc-U&ruCkiOb6B z->~N&d%kR_uls1{2cOpeqXB|ZId(X8-l;JUjE8o{liOTgF$~#efxS&_ZSAKognTF4 z+=upcba>j_sEmO04i7v+<(i((ZtND1bBe|=#GNoGA3YJ#TWp{sEBc>eR0g8|DFe*` zqcH0gg%;StkBWecLorw#C+h5Wo6ghFAnA1s3j=tsC?E^j(yR-GcDWOC7!WL`Kq+_~ z@%MyjLEPYde5!=Xzd?FhjHVG~RGk?(6i7XTF(26mVNvJv^)eyaD5)8k{qotRS!Z++ z2o@vr1455b@>p`=)dkoy)%r3VcQF`uF${M>))&&~P}}4PNDlSB9)}|HLE=_qRO$mB z_d~WamLb8QVt~b7vdf#uu0pr3&Z0}VC!3YB{Sw+fOWl4mwxq2?{d>gX46)!JmrB9# zFU`a>GQfP|7FRm*;Nhv@JPtdbb$Q*dekAux_oYcn3uZR@7Vlsysf-BH>J@@unf6!b zbGbyA(-iZNOTF*^pr_1K^psy&_qD%qL>LFKDNFA^sCw@HoZd^X*TFSoWzIw>5ZNHP zip!<`|DR(o{@)%uyZ_kz9Z{}c&2Jz3x9n;Fe1#|XS7Su+{+X~r7{nEhTpA&Vo%4t* z)Q5V8|2#g}H8MWf@v`yx4?SOs?zD3ym*4Ym-@#67%9dQdB}IPz+Z||{YoN=mK!y>Z z5Flx^U4Hfd;jTeixNEa=*B~z3b=T$l(LDQgoSK7gMjD6T;jjxh`QcA~!g%f6(Y;gsXd)_Dc4=$mU=!O@LSvsU8@fZ+NzLRmEY5-#|Jc zR3NMu@t($gdw?t3zQ69kf%^L9uMr@~(1-Bou@G6Jd+|^0d*tR-^ET#pGQY&Ca~T}- zF%E|VQACI%I^g!~MLdsU#egMsvjsVyh($RH&ffBKhu6~?09;EzS_fC%N@jDxBZo8? z02~RF)!ip;R=CIwxWlV)hm>91k3J#B`VTj>A=FvcYJ5RMRu%!7EJ2(E0m`ya0aT$$ ziYK*1crFlV>vU@5nSnsLIKX!{;eqM_77;4xfl-U(WO(ipuw9bKR;$&e>G~(&`up>-tTaLe2-YWj zln1GE;@qjWEgx zU0!LWiGm`K{Q>mxQm_;*M%qEyHKDJzK3`EZIbDNXG%@~ccYvq3;*{$L zHr3SR4~u>5O6&ha|N^yJOp~Fc3i?3JBVOzt0q zRnpFDt6rc%iD-(kC<@=ht*<3ZYGq4E%EduejkrHUIJylpVD0NI%#6UlBOg{(z3_gk z&pc-4gJtt)P0lHtvjnP-g9+j$tq}HF)06&|j=RIeAiPIG&wQx32mJEyn}6;M7`#4h zV)8JH(Tw6&y|9F>CV`_Ia+5a1ncJG$XkSEl1!2h!X&?&-g3l+%S}a4OPk9V}_YrsN zanzsd0;*O>bW&*xZjH82YxOj@JE^daGQ;{gA+6Ko)6!y;C=JjhqA&0y&{HV#r0mhp zr7qpW!EeMq$;e3QZLwT25S?`91ejWBK^a4F#!_n96}!(FnlcI? z7O6g{+QenHoSQRlf8DjNX5Zd_9%!0aG<(jx+s2KTs7&W+1Qp(-l2w^U{S-(+d%2VC z?YZ5Z9)rL!pbf_o7M4N5$LjL>L((S-rDfOEc~!b8b?mrtV^h^< zHd}G;6~G8LAOBQFF9XH_O2?XnSNilHenZNRPRGvq&oRWisE+-&K8F`Ux}bvW7n_cW7~Paan0L)jKgy+*N|neALD_6l4sx6ocBxl@F_4tr6AeLk`)w=p+L z&acdutB~KeQ3g&_CdJT07)Qch3*4btbMTpIIUy2LkGMJ5wACY#rJp=EKSr{ySl8AK>ac-wSXw6lyz9YLxQB{QzU_QNSj2sI(+?V{$juT zLU0GGgG{>?z|({n%9XPIUtp}tU@dTLz@Ugaos6rjRA7LWS0so@Pl{Y?tH_zn^v+^| zXE)IAt*7V!I^(4oi)wTLzbG@AmJ2?ksU&hHoR`~y6u}~vQ0pqBgsf%;rU~malJNV2;i(rsYlZpU5fgrmK9BUH{7d7l{%>%mkAn{a-=BCAq z=ayV42-Yjd<>VEnk4{vfbzp^6SfjSWoK;f#mwe`A%NR0~w0|xPHGFmmIqst&2TX@w zz6_QY7dYvf@DkmMw~qx3W0sJ~&zZ3Nejx4KeAm2X_of*FZSTJDR>jK`;I+R${CoHy z(!(PpCn7vAAYWQH{Mr#BH)N1f#f<5kT*RpvBw|_cNU$Z#=a{VHP)Nhq=JyA+(NQ=oYRsV0W$>r{Eh5+60VvmA5#cM`Pt79V z-FY6>e`1&p^-)I!63hc*4SpsJ9ct2;b-L3hn4sFGG`{_J3%!4#ExwI#`9HF16A z0Bd1-UepJFK6EC9wRtWc^yv2@?>!a3K~2g*6|T^)QC(`sU^x=YhUG<#CV33Xcr5;r zilgjd0WBx}CN109dN7gA%&ZA64=syOGgkrXVVp0U`ABhZMmEkQ2&H6}P6o53D(#p$ zdWiZY?t`B7ZJ|(`ClK&NJYnRK|LwV>DQPUMQ_iK%rF@KY9dZhHcLFkNc*%4Ru62Bt9V zyXX6SeSyByeNFT$J>%7axVZb}hva4QBKa?}C@+&`{Rid6i)_uO}4HJ~1n~5%; z0@yrnmy}gXW&>ls(aCWrp!yP~F=is#I(!Lz5f}?3%0%6vZZNkC{sQ!0q;bz35>Y_;-^(gX8p3y1Vc;7m%w>CZwF`oo>fis{TMZ7! zT&y1-LNTKTB{~vUOCS!f;1>sTfJ`SxkN{HQen6ecNShOWMEWQLSV|~v>+Lw|{`qIO zn<{&f1*i5o@$WWWjY6Z%~86Y2thV~Q3+ggEmCyOgsXbt5xs+bS3%}eaU zYR0)7vB>@xkTC);LW<2M2#7v1LDLQNT`Zv69S~!Tdh~)umpUvXX{f~@tr0lrzTC1e*qG{Xsf@wgWylwng+aQBexT0k9 zmpx9MXV>OMi#8)538RXLtPPus5U`;HlNqO3Gc|i*BYyLZS0qyL4@57>7?+)`&2ysPk`l2l} zv+WB6*nZwN37b|x(WOSvz%Knm6EiZdx_ZpD5+Z;8cAeJ{jWFxDm?#8|$N_(VGj^Xt zL~T^q*PUSQ?)#$Pm$V;0*6KmZi!7hXNC*dJbHMnaKnA9pa0|>JYtyX>mfdZBC zYw}Js=#c!*oolBmA9l+75ZD$(W`h^44+dg?3wC69G7eH&JRGh*v8ea_Cd!x%7O;DCt}Ny*TQL`G&ha4IS(8JU?G8JV}p>n$s< zS$EqRYH8&yZ&_KA*Nj_SBQr18YsNJz@{;i}GE%M*PFjdKaln{k`@NoXMp?J}`+h#3 z@0T~*&UVgr&UycN-p~7aUeD`s2mAV%sP5~M>_RWPL-SVyoZj z;JfQ5Npa3C6}=c(IKZ@0Gy7Jt!-sSv=+ z2*J!R$TmtZs#91%pQLd_YkXb-sX>E03&cvWcEAWY_^7}vF3UT@3;&z#m~X0r(zC`v zYpNYwAy!8}vjW2l1$)_#t5-sprtUD0iSsdiT$~}*THNxkJI1$qNOXu=)MI0szb_%~vC zjy=&>%xg8G9!z&ZP}n(O2*aP`#Bp3$c?d`p&v6R#7cyzo0?QfHClXvIL>rLGw=38$hk} zsWIye0r}d>@WN!BiQm8flh3~S?(~tr?cMxB%klsE;_!!mKYZ#eFQsO#UY&XF41f=6 z=I_3E(S4@ptA8H;?8vbbCr+U9V8~g30__&nVgM+J$`~%4#yiSYfbnN5oHp3cARH); z$iOjFUR!5pn}!b{hdt32e&^}v@R2(i(PX?DD&mioC#CAfjL}^<*Vo(A)8iwle4*zo z81v7b!+m(A^(vr8IF}mWemJDpDbjQ`YHl5BZV5&b@kwN(=JeCW&A&-3vaef&Yv_@Hug8Nt->;(#Sq@Hm3@wn?948fSkA+~+Bu@ciUoms)a3b(tzJD1 z`W!_AZHKb|!iXpCn>=}PW_)}?y8A;2>;3L10FI*CY5PNW6n;++_1UJb+_tsyRhXoI zi{^QZ+pw_+lKE;%p@qk6OoL@uZIRh^cKA_^>$wQK%}Tr-WVg9PVYgWbYGZYBk7?wV1&vtDo{WxQ$A{*+U9H&IYvnpV0F6q2&j2(V>#E1in;uiru^epdU)LrdpfKW=;m zShj3ntWr2g?$vC37chxke;~X+r9saN-#>iQ`}pYn!$*S?Zk{)9(ft5Ht$y&q*)fP3 zKGpciC!c;I-6+rB7eVnB4VxJiBGS3|1CdT08nbQ>NTSNoXR50HwAr<89;T}Mv0f;} zXEbS%!jytleI5`xHYim~u;(TiYZx*KqtE_PzO!n)+J)s%74M%8eA~;4c^|Lq(;kA{ zd?+_>QaWliOo+7M=8UxQu#e1{4+^9-iDdS&{?D?|9998J#p@Of0^^C*1oi+t{r zW#=a})5>Kh*x4u^W)D<*!tC#YwxD#LBd~MS$>j?eZn&!PyGQ2q9q?y(ONd~O%I(n*+6UX@Z7Od8#dNvi(feq_V> zpt|7_1i=lq*+_U(C>4UBXMJcZqNM6z&p!!>)uQN^>-K+nw6SnjrqTEAGzf+pX!!`O zUnQk91k;RY8O}HwGhK@4IfQuHqX&0m_WMX$h&tVYVSG3;XMG8!>f=bgevVnI34>Q@ zi8s&{-iypzZ%eNY0Z}G^O&7Y(5;;B5)Dd~QT94pDm7gIAOad>< z7liZnVwURfrI^4T=`}^d+E8CNp}wv~edVFP$TJ(g&>VkF2{_Hm7B2>z>^ZhI>hYz^ z?_DtOmg2p8^I02flM+Ko<1jRqu3o+Rq2==n5Fr_cBp-lKU5Y#thqRLX(?@&U#V$kav2pyx`!8zcQvS4h*bN7< zjB`PW=6Yi)T!{A$#}k zeDtrAQu2QmDgclmsD@x9s60*eU#ebOzrjIj0L?1D_W!w)U0dpT$BF}(#{BOoO;%kr@g)>U8r}%pZVn831YK+mv z#T(*vVP9uQH;dNuJst;0On)55PpRbbIt1gDC~hO;6=`PiD|W)=4_d1ReRLvf6W1w0 zF+)TX-4JRXEKr26S%W9mV*kNrMW})qXo+03#IVR%C(-F-kHPLrWqlkv=)Kn&VnygD zJbLL3Qc}|Hzkk}?`b}d~{eh1fvPX*nuV2F@Wk|DRN615{RYd%wXCnOr9>3GQxo6MI zZ|r#E-4FJEU=2S+PD9acu?#aBuPuY|cOzRLy>ewO^H7`;2NgE_)aR9^iv-1qr&o7+E z!7tc9c<#&Zh2L6=?nvh$qYHxLfkxkmQ=vO`wFQH1IF-skYZt|9@!z;32S0D`FP^D# z@Jw_^p1L|%j^)#|27|3Xo<@<{|If~oXEc)C`rmIyIS-~1K$(?D%R#l zOZec#K8x@vQ>Z_5BJ`!~;ywy8o>7hdw**>A;n6nxUB%V9)6+ea0J=G)xxxa zgI#f*-c_rLi_OE~%Qkj3?H@F2B~)yAzrNwGm6eqrHhqt&qz4DBlHM8x>Y7kWN|(Pk zfB}c7B~5%nLY&I)3w5`jJnL5{nG)l$KP1_i#)YsIuzL_Ehm*!M($6}13`i#nt;1C7 zi1v8=NWDV86AZZwJWQcjB*X}Qp!0hvpC;VKBxhemOTL1ZEW}u&n7J&5u~uDGRUHh@ z3tK^cAY$3F1h(2dD5V;?q+*+*0jyyi_FMVgyEo4Q-88YNjYi-cl?<$6mcT0Y;_lrx z`8!B25{~6|!)_orBrdy2hSx_O!et3QFB=l;jFOrgZTX)F={^CxfRqh%3%8TtZI=AE5BiLEJM`?-yr-frcB z4wcbjF-lW$o3wP;Dy@TF#k%b(O6nc)Lhr}#4#r}VKPMmkid7fF#7X50);N?EX&DCl z)790>$QBL)-=heldJkd)1;j0%A}Np~bW>}d-xVT2sxWjL zLZmiQU_)qQ=p+2nmQW#22~|Ux4%NJQRR~2SN8AFZG4NGYFmvwWrH`zz&48~}NE~J` z{Ca9coqjTE@;JV^{tn&;$q<2BpcG#n4lGkkd3OFqrUSjBPKa^ zRtDA#<Z&h?}Bs{tE<-s05YKofJjU6c&^c@@X8@N=>Z`(^A0 z2oKBb#1p#Ko{!nUhMxN~jIOL>T7HTyvGYw7vJ8>R%ht^Z?n6FLq6JtD96zWp5HoZ{ z2N9ZDn-J3roksto@*@=H7Ur(8a~{zAL5ZaNn1x|G8NE@d8?<~%3TW|Dc&H;7QbBmD zA`H+pi~q7um`$e;zv(ctFZpEk$wB=Gb4>|7m_;}wY;6IeqFmNl%dw&|pyc9Yy#_O9bH9ds zt#v>hI^9^$(%@qlZDjRFzV%AQva#a|%qGOkH(xYpp;V>^D(iW2@Jpafn$TOPtq|J(idkFWp3in6(aLDsA4XuX6 z4WUM^rsfVAw>KH~m1Ro$4m_`bmY<6i)e>yafWE@RlyfECN8>vRv3+Iezd!>&*9 zAw^BvQuEduU#5A7Et!spY{lpn;GV+h)@YpCu-}_Le9~3wp!q&W)9rUHXGTwO~vz}j>wIwUUN-sY&d{$ z#^k&?x8HPqY43N(Pxp@h^}RXJY8Gq$*b?-eWV0lsT$wd745E?5S(r2Bh&~KB{rFik zQOkqDe`i@Q`%`#xcoO#}GIS}q4&Gr;>*i%-M1R)^i}YXRA;X$T6?&aXDyzHZNhLqi zr0{)0EtI&6PK`Ry)*g-p>?tp***NK%tl1L;4`67Az%>HL82>;9c0DF(j`nh?*OjiC zgLNUR8HJz-&iG7J-+xWNF60MvrmbdxDN zuet8y#zX&N1@L)W!}%)L{?>RY%8GPYM~)mBQV8AduOMz~6+GYdr%$Jts{?X5%w7)H zz;N5EypQ^w)jHaX1X;V$qSX$KD|70oZ|eqWLe*>k0b0?JQ?GI#KUrt5jlUsf!F1q@ zw_;QtQav~-rdBfVYW${eSk82qdT*SZojvnzbkAFJ6I*NBL*4aN(*XL)#PGMm*mIBS znYaGYD!rAd@9pkkVl1c*Of+$-qeSors8pg3VVAwWFlz_?)E7{}J-w9+a2rN-iLu&1 z?*(+Kb4aAXXyGnkKJV-7)#x<_J#QX4(kKeO(p&N@cq3}Q5H(L(%15B)Gf?x^P@8J+ z-o3BQl@mT(3%3R$?QD+ij4cCLZ2WYv>TByWn=?H1t6QK!b$Kd^~6> zdDXvOTLS7A2WQN4!$&8F&$?^3H@on z51n!`YjErRO)E1d?F;}6P0hCLa*rnGE&E-c?yU0+&e1E6RMW~(Wz zo-ZrCQ~*>V5@AIL%8SQ-Ug46ywpebR2JATWXH@hywjrvxd`bod>|ei>qNFRCNB(*~ zpaaj?t!%$T3w+4@>9%PjC0+V7+w@z?AV+&`#L299XKRtL#@1h7Aphh>)tbD{%6tf@ zJo}KC@Y&8-J#6Ye%srjwpoS6Hd9G@E=Y-W{n$gahHS21P`ybC!<`ub^oI$v<;Gec{|IX9U+ue5F&thPP>K8O|sVSHVnMNN6 z3aFU4I82y<05c`)HM}}-L2?4Q#)1P91}vy}wy3$#0PqEp8Zs1vc;gf>7Q}$<0SO-w zI}L3|AM5k=1jQtCTADdo7wUmAGeH|T_w7mKB!%da4aQHDPNn--_Yfe9=?=`aY~3-`&)UPI|q(WD~vHOvPUIF^L=ec5AH|38{2mMkR>qcFDHi-)zo}Hc5)fCaKyq7>F!OLyl6h$t&`?2 znw;oq^Q{4PQGNU5t3VzpC6q3@?-9h_tSVnrIw#+1wdT)RREi}!B|qVE*&bu*q9JgV z4=Ktyh85GtX0z>n9BgIws1-%!vnJvTvmcxR*|3#ejC|z`h^WftIarI~ICoa=xI{^p zn4MQN*9MND6M56H?pJ^WhuCH@_jq-Ad0CEccRnodlk5i3Xkgu^D6s!jH`5Oh(HAF$ zm#TOBvX_*XOIjG-(G}~S`=KiieXb5&u@D_h?fwY%fXa{D>dc~|`O66%wGHIIb+B=? z!9%qjpr<7haa`uaCA4olK5N6iI+-BYrCNSV5qe_96k;#w@eja46ykUgPj!2BIz97u zA?~ZK%dd*{cJ*s@v8hR+OF=;wYly{OgF&b2?+Y4}^g6Yl>++%_!t?-A6s03d`~YIw zcud={d!Z+Cf&<;04WOf9AttCK71r#b3L1M{lD6#E18Gkl>05@>k>h#Z*M<14J!ZbSOCy+Cl>N_l|$>(^%D=#L0kCdP)%q$ zw~reu{u(NRYCz|^z6h>YMd3fs=|L+M1(7404G_)uNtXm3oB;}@`?U=QsePg8p_=f` z;z9gcPrpz1$&EO#a&TTaD&#{jdp~@B%FjK?t_S)_>0tGk`A$MN{|t}+!mL8?KZ5{j z0*K)gc1TT$mu^@&9ol>cIrOpSLYGu8w*?!6!F=+}Bmg&=Icm7+%5+$dQqx8bk2Pgv z+7t)}_E$wcu^KS~@!~rsq_lrYS&|QU;46c+s&+aVa<7?h9`O9Myq`MimA9$p_R!*csQ~+17UYOnXwYdAMbG zlBi#c4>bW_uOMpGsI{;oPE5j{VaZAD0J*lcb@odjfUO3Nh9a?j7#SXnjK?rCeuI(m z5Jm<+W{jB##lVuU{=e<_8ULM8h9%D`hn*Q5QL*fQ-^<18|F^@7eIoI}U}gbi1bTS< zf4hUV91pR$ZN`QaYY4ShGW2AUp@?m{?ah`>41v=g#iVpMM(PT=m1yC`My z;`v!x_I5tP;PPSxF-pxEcWlAmEAKV>h?THdm7NWPpQfhfomb!Yt(=D0`UA|xyQl~c zWM_{}bVf~Fxzg8l#a&C5)KG*)bYt1Df5N_6^>N>%vI1CPPBX9Ce?ET3g1e_dOP0fQ z@%$`*cL}1|5jKQ0yy$IJ4vO+c5ehn+JP2ue1h9R@8Z5tZtuAZ!T6LB=@!d~1f4D#M8#okJl0Cu1cRa5!Mfqr=g?|YrC3se+C`ZxE?s&G z3C~PA7-@RIih{I6K3_nJ;<=#TcM&tc34RDPIJJ%wXG0c{r{tOcX0!%nK(nAVvd|i7 zkZ)>3VxVEqHXF@5a=ABpb5k(b&mzGwT(bL-rE)2 zs0v;Rg60V5F$9=8pq?27*7I%aw-*3Wsi>4|Y6NPEGM5jaaVU0iSxtI%c<_j)3P1+hH^( z_cperr#VfwL&axn_=>0P!f_~m$4QP!Ps`UqF+zF^V}n=?HO)xq6P&4u^U7PyZ)H2U z9gtyesUi|6}Zg2OWCZu~%C- zHXc_+{fJm~;&4^bI$Rb0WlYp8gaPINtCbR73u9Md_&|6K%M8_{D#|#xeG$q91BCR` zuW*H|4rur-7@?({1^v?--oq8)z(cC7=(T`2NZK7h9hBPbl?AfUwsT5S%t02_KMwJV zq8GG`ux)897CC$lL`)V3XYo3i!3iA1`Uo$RgMpM9HA8agSGWVRwA>HFcsb1G7ObU8 za08P;$-O4L9_XLth>h}qkI)bQYb;c(0tDRr4~~U3dzk}*gB3a1di=Yv&0~#$R&X*G z{$296>wa_yH{4X&9FmU0Po9MlSA!wc3^YU$R|=PECe~1kI0oM+b)^6Hv35#_#3n&T zI+@MM3SG?R;H&6^>cJ0a+r=O?2|iK-q7XnL__D&nsd!sPAO84JJ}#;uu~HBq)r3lV z2!gWZ5u|sn>V)G7W-i1)30;h`k6_CnbZ9il>4Vf62pXsMECY!_keWK*o3}#CO1PkFZXJ zwtA74OZ_5NN#{B!sVaessN51>Ce39&B_JO_)jEI^x62d2^LVX=<>4apVN5qU;>_k; z4yvo!3_-JC!7aIx%=8gsAgto&jre7+H)N2WkMsGCwQ`#Ni-ES2-yHky#4!mbD>u@^ zAT$C1UAGhmEEbQuN6pY*tSCJ%-_uZwg80DV+x7jj2Y#;-sOC($Pl5 z+NMVv5x43zOs1vbr{tuh*{aR(nOj4L9d=gb1Z{D}bdKSEj1cTQz;o8@mwZt6#bpOFv8$p+Gt1T0W70pqoTtT>ue(Kbe#sKax$YzC`FRd$PFw@;_@!Ih|Y2t-OL zM!b8lWd1Nm#NckVxZCLc`z?X}9&h(v7kkseTSO6b(*Q<^lD1?;rlB}1pJ+^fAGJKJ23Ur3Y4IqTom3AM|Hjj@*X_uOkcBK`cDP zViUc)9aqxT)xKM~j;PYx#KwODN(^-@%& zAeQ+{1>X))it^=6@@>)AAJQ*VbWyUd7o*0m#+8!gI0aWaS2kE8k`%TKIRX%`^PT%B4RrTlMNS1EJ zjW3jY!V0_=!g4|bAOo+3@W3co`YG7HDRSvINw3U>ont|GDv)B^LWeMay}{n$G?+53 zgI}r@>$$z$>itvUfwBNPWK&gO`g0V8Q$l|a?ZaHX8V2PyE}tvF6*>|7vXI+$2ZiT< z2W;(j?v8B*xQfJZl9V8-$rmgltUypl;tJGGrj}ljdjv%%5Ar@xG_-)im$J7Uz>}6i zYHfncQF6J^>E$c~@^?ghM?~A;NJiL4(sMWu1Ub|bc(@6n?*cb7xIwVOaFOFv(OQW6 zO!KqvSud5Kp%7)w*Z%M|nAPZOP-m20I|bh>!1u1j`N+pbnDtcCj-BrvKK|8_kN>`B ziwn#e7rs7p?Ave8cw@|LyCZSezE4g;;KyDAyZ>kmgA+)d^k;SChNE-2+kjC{YIsp&I=6 z-JbUEJHGdTDGC!2lHFi|hTtFv)HBWrzhN>C)8g#%pIX%GVlXESAyhUI%aYzms1E~b zhesJ?&fwQqLUNyRaHbMWgY|4HrpRV67DAbmDk@aq$mYPth{>SSQ4x_0mVd`uM5ZxT zH5K<$70w8K0emzn#%>>+;8+V3!4{a%f_7Ca)EpwgZbexy%Vo%C$mDp094e9c%#XNZ zD0kjLnT&I$T7H!N!_lsT=R^+Nm0>>~D}HuPwtgyS=JoP9tu*(CHrjvbv`C4rS5BJ` zO)T5a{P~DUXtd+()Zg+$ot)8O1zKCVf78#d<+7QG`KLmn$k!rdtn#lKyhhuPch41P zVxh@p$|N3y)1%-O>J7wnVAN;^sR%@ZC!2`=`~Q5_JyRh)D+{1emqWEhwO8?(#i;jexz4jAbzhDeMjqNO zA9PYQfmsyIsCoThy%S??2FA=_4Ujeff&&zq*2_Xi;7l&Za~Xclgf6zBKyeAAz^>q`;G8bTFOg6v3$H{a_(ajy z8;lQzG{Fw(Srxo>`VC55kUlg#(lTPCWn@ZV;7o|4!Wv%TV9S7bP#S9*E^`x3v2vM)k{aL`sOxXg?}j*EC)_vMH%YD0ys1LgwWY%{CeL3df? zlkhUWaZ{rzTgYyl5r*Q7qK8gHuQs$5fmvex!B}ik?ry&*4kENjC%6sQN0BAtaD5h> zMO^XlL(6V2nUZ24yU=rNgXY1~@>P#L2F%GiD2Dshg%c;)Ray&lU*%6>r@GlW72HSfOt zY9&o5BvXfZy=TwBv?B<5O)6|L6AR$mf{KtC=Ow0h=?=)oO87K>jIO0<+?pR^n|>aT zTMr{uCB_*6OPi(FhgmGc(??h=BQq>16z~;=$y|*Ub8O0Rvq^81)>1?h=%o-^i`>c% z4PYaFB$s!@BQjr%qWD4RfFdGWQJImrlE+b(RjA8*QJ2@CF0VmdTG?wuN10NtopbZN z!ihPch6J=gOW||Db1pBn2W|O%18ayL@!=^ovvl~?%gfA35%uF zs_L)eara8da!K)(XJLf}$hvf1qwijS6 zPh|nKL(I_^r63A|TLc(6F^2DsqZ&AsVDZ(!cG3`JO9e{&;-wQAN?G!ZgJ~h1gaXQ__f1)exfZydcNV-gLIjp+{vTYgE{8B7T zNr#$?tx`FuTL{J-0@eHqq60Bukc9FVN`Cf*qW|!P@kj?{vRWtTuq1Bpz!DieUcxxU zFcx9tPNZ&G&0f>5fIoijEifniy0i>V=s|LZy^%KChThPC7T+&3OVbd41MWw~bWK5_ zmH3eZ*iWS{(qBHp#NmfM`#4~sRK9|Bl~kryY*9Ztj))9}mDL;R!xz!8zTQhD@&ygr zOa$`+a0~%|Z*Om(x4REXk3wO2F9o{x_Vyrv@j|!seo`W&0jDKR5);)Ao0>$u4zMGJ z=|>OGT>^Oh4Dra%@JBmolf=zHmYb^}7ifhj=ZVkDn~8g=1h+yR?xYIO%Ypr<*BZ+v z>X#bzlOr5~ zjjf$qC6%y$zu-`}w$#8ZHGD{zN2_tPB`%XoC= ziWQl;xkcu(vXw=WBg$+Z)9f)ck1=^9RxLBSs1OSRHVxTT&8@dfNJx;ItG8u(YO4F%z#e@yii_|a&6VCGwTxph*yRtMNkgEMs)PVyZy!`UZ z9~?OF(o}>Nj-#So`}nPh)3|kw4Sh|K;jaVoI~&zY%l>;Xux}49qB};KnHylM-gcgt zM!!S2_%dPhY4>SF87&K68~RR?BNv3#$b7PThHNU@j&OJ77yrUtw`kCTz9`R#CF4*8 z9+M-ak-6C!JR0S9$JhlJzfb^m+<_5Jx3C|tI}kKPu&#~l739d_o=KtQnwHQX>Hz2< z`EggIrVJZB?&>K8H;k9S=oa}?tFfVmpPLVYhzSG$DJF#T#u*Y#rW6ZqI#rB?%P1D9 zRDwYsKa9li^5`_<3doK`_A;^~k)FktPsf1tLfiy!TMx3Gl3nvw?<}#UnHhC~tub!RoM zL5*u5Es-n+^lXJz>;j$x6UJpPF1AXsf+@YzD+t}5bh9R7 zLOQ(Di=c>;f`|!Ay~(w4%X)wu31GKMip3lw0MgqjV56y}Nty#WmMnJbsH7CZQpARu=&OnuJ6O7lu zICA4v%Fba(_VbgSIoLV-O6hLgYauKn^W^G!6qU6K2E1i>Hy2hCS~=fCtUo9VP$wnf zn`w-rd)|vZBwlYrI6`^&(eUp%yZvS)(|82$7C~ar@B9|qRF=||4AUFa2#G ze&0aZhw1kSM)_VmK7|sp45>%zJoZyPar@3ir;Mlif%vKEAfqAbvjkU$BjvFs#=>*bU9T~mI)b7 zp{GsWVadMA_>&!6Pn%?bHiC`_*e7~q5bKYiGnslOfT)z_hW06tc4eRV!#><9?5o@h za{o<6|4l{z9rOoKWD$(-s&V5+6&A>j`@OJ|9XaCQa&lnj6{$~v7M2*$^Fl4ym6_?_ znwt^qfsuhbZj?ncfLD-h$SWM+L%fD~TglS@BX29&KuJmrN;I;8GOL6n7nly&9!M0{ z2`Q0*hkTX91wRSLQ+`#7q)C>q@;Qyaqvg9K+XGW!SKJ8-l8sT_aTCD7bL}ZiD10`C+2J;w;7z)vq5B#Cv5JDX?aOX zEGoKII0mkbZ*-H2if);GH3nbK%o6Dqc@Fy&)$$6Kid0^~wn9SkIU4#sS!t+7XFy1c z^wKT;Hk5BJEgzT?&SXZ&k~6|iO}eHE#Uwn-f5c9NyTaT+>ZOwYFQmk#rqiHhHX5V* zzin#z^qp5XZ{GaM+lM4@jEEeusa#UQf*B**Cc!i!y(HHRdBAlR#dk%vNQ#O_P8tP<;LqmW#(~c-4 zF@xeaMXbBFA|gK8P+Myd#TGXd(oU##mn)(+*}%1o)*8~Ye08np(A3wnMiEv{;P;S! zg`1Fp-giV&fo&VGP=C!xU&1%G0|~wgCJoxABC+|>5VxP!FIPf2 z!w8JiW9T_d;f`jAVX>>3($4&&UJPRG&V1ith`_KVmsHp{Cdm>@4>Qb2%uAHjLn&mE z$&in-;FY8r$=OwKNfbji=gE7D5Eos5mG}hI3l;p9G$dOefGoWv0P_l~o8EBxf+JyI z4Dvu4qGb?lvR*JJ;3^$FRBfpocj<Q+*;#_{I1s!h@gar;)I{1Frr2_>VhBjfarFZ%h{O>B zoF`Z4uV&r+IH3Fd{2Ow?y$)sz*3;)qG-=b*yShSV#KTxv@F>vO zb&Yzj>n=215gJ38k}_ew%0gq!1@kj08j4FQ1I;{6{#2PF>6ubh--_?j1bh=tBkBbP zs^Y{Xb#pUP3I>6${hSHIVNMun>FjjfC08^-vO%@U+A+eF<~omoO{-m0J&GsNq-StU z1CIT%vE-(LM#*ilh;h+8FwmC*z6%JU5&+N_G&+NTBu0GTVvmmxx*TerXI*_Er`F$t zHE(Zk$f-isGY*0rfGcvEs8mpd9Pk}rlIe4RdJg<^7zHly9&J(T-(un5J7R1k>VG)u zpRzKET4DvF>4%N7vX_O`GbheOki=6C^|51ON(zj-b|N98ay^g;w?hm0J>ph>kJm+b zf4w9{8!dob4l`nj=~qj0(O)Sp#{lEeH5|f0@VExsqd1FPMuC!qcj$S6_4W7xh}P+& z1PM$}Q0fB64-GX`qRe~LkEnZbI9!&hv(R_uLG>1yeAC?=Wc547SQ zhbHr4?+zd>_!e-wq`+8@%*`iSJNj5iYxH?l zAqF3UDu^^!7^8^4#A(kun9j+x4mRN8xBxy@VG|i=92kVKkvIgx)dw(wMf@gLq15H| zsLRQy%WTx;Xw)V7KJv*lgK#5-%9zlF002S0%Cba&fh`NxPCGKXGJge5%n6+iwf^&( znwl>qg{qxoq8Zgk7OK&Zg;&d!nI#Xo6$qOv0`LXOgua5 zi8iwRysMlNR<%R&=ajQd88iDZR`?A9(Aenbn(+BhG`LS4g0I`#7J#Ew6l0v6zY{l) zHkQ^h)jEO301YPUC2k$%dX|OYwP+zE3j8<2iNCMLz92f!euIMzr4u z{>4QgWqJ@=Gi8papsQQMkEs5*dGjAT-9X3{F(&$2HKoj;KL>($MwwoFi`p{Om zP5v}IWn{)MGw4pureR4*!*VB1xH2WloSbZojX~tOVMsDAL9Jz7-A;nuBDACT92if9 z3K-2?5-$XKr!nOBlU2PRrW_4yHzK_1eAxA;AEod#T z*tLcqMmA#-mbeE|&^nE6hYsZxWQuut(~D{k!^r%-puI9rT7qjYgmag=CXIvlFCWRA z3KicBF~1kQDavT3+;lK>|J!KZhS8iZ!>ROfT0t`a*)AegwMHAw`hsF?Y^o_qqY*f* zv{uzEV4772&(vqeg`FyK)G;5#JW~hIy@SE03|KLM+72Tdxgh#z_LWEWwjW0J1oUvy z%E@wh1=@fxXP{KdhvVWIF=y7So9EnCP*5-x*G%PA{^5B!umdMJ!$B9 zus_mVN%Bxx_Pv1N{To^FStWm(h5DU}<=rw^5CD&;z{tapCWlgsbhA=tcqRkW`ABE& zL)}nKDpO(~YN?%!lt7%t@I!b%uL%WNT>OyXT1n#l{)(eydHIMjVKVRB`Oe>D|gZq^`j`xe=b^Xl#N`8#7A9W!pGODB{Z}yAiEJC_`8pT11Z)0Ri=c z51IhZA8N_e>2h+ejMbvLUFxNGLen!jSjt*3+U1j(D5kl(`kj4M`!K82)bH4dI+8TO zs%?n>ZNbF0_NE`}1@nauWR;5C`$;Vz2P#4-G2y3;7@e60;|wx>MN2LXuaR-SPqLs( zO)yAr;K>NGmc|UthJ)6AdCaVYXNQ)~Ejn4HD803;Y;pNiOa^~L|80>}Cv$R6I%3|c z#**T_JsOfDU)EsEpbrp8JJcA_7E&RrCV;wv#!(U&y2%)QG}I{B;XHQg{V~8%Wn{2E zEG5snZpKaFhS2Op3bFr(r7Kyz2PM!ZSTpvM#b2*S%CcViB7%ifQ0C#m#$W>CO$((8 zf3g zOmy!|D8?(H1eHOw+HhkT5}&KrJ2-tV@$SuJb#hOYdn`0|`Bi#4Y7SB;0 z0{El>jui$`cyvvfxF%Y$rsA4N2Vtc&Uv%<|<}aECy?F;v>757%?vw=oF25h_5hVbc z`=!~aU~i}u%s?i1QUG*@QMVD^l_p8hXQSmEK=c5r35bG$dE{$rlq+z*{M^U^bP?_E z3=ngAEJJny3DGDrsRW*R7p(fIK6;NXKIoN5v?zE~!txp-H8_aU*-H2f1J}8hTfFZF zI4bUAGw=}^fFW-zajL8)_}P94E|)MO!G56e84NxUI=K{P3`wQ$?9{J|yiw-V8*$!3 z)Dj^8$Kt$XWr-hxIDY)ePx1z+H<~*2Nk)@F|9$gcr-KGyj7*%A4I|z1X;?ZwgN{pO zttOU~>tS>9G3y@U=kH@yZjv6(zELqIuFvgOO_?2Y`vtXgkk-2g|YB?b52${hbEl(}S}i z!l*wC^^|T=RyNd|$o>%p{9@!!RcYIpZ4E!6noybDSV5?^%XUs@wMcceIeZ9l4#?5X z9V$jjAG3oP{fdia{B-1%Q2RDn;*xi>NqRmOif9Nq;weo$-)l&5G30E{%0m3X27plI zzY195TnctN6W4fEQDo z&3q>5t||~*H(JqJ9M4Xe!Nb+FE5uvH}HzRfPc%?Vm9+&yObZ&^DeHn)e(6_ zuD6&eeQyl<9?5cAEf%QwaA$Bmzf}j+k;MdMcV5Oz;4BF*b4*q5 z3$F>xVXg}HN92`pOhbpX$&)B>5L~O@l@FiICRMA=?=O%61GTE#fFPMEUwji*N5pnZ zR*ijZKYHPQ$CGRUFlLTvSeopP=(syLcfX5sZm}{ucc0Tni@~rH7xXx{?GswD*tMVR zeq+auoi5bQ9o%opwq8xl-%9dPHHdAL|WA-23h6Lhh#6*SA5*kaW%z;P3SoKZax-`6XN|thV~q-*#^kRjvf1s zhfOi;H3#3=_!k?JV3Ree4C{dXV&`ld24SUKBz<=Fbt5n`QVfb=`f z-q$@^a>bXgS5{Uw|7sy6h&;(U)q0iLHm7VFkOhho^AdYfT~?5rpkh|G!@-x7fcW}V z*=cu(tyfLT@a~%mR{$-|tisxwns&8Q9j)Jau?H5vQcP_qj zaz=*r{)kIZeb;Eg|23erkIR+1`R~$Bqu<}%(ca$P(ZdJz$;l}xiBKj4r%r`%un@9r zAdX+!nI0QE1Rixul1>xq@tgw9NO$)o4swa(LK;x3zFxQcn68A zM=+Uuhv2=G-5E)n5BW@o&W34K#&tLR<*5zZm)I^fd`OHZgXWxjb$bpC%q-jS%nN%_ z-wFD&pcOc)9}8FU*kJIY*RLOz=oC^W+HAigTPKyxss(!g2U9^*K~}v|^;Vd7+(C&e zy{ixsld_8tufsQR4{XJ%@XnHHBgv33BER_V0$lFvK>pPpG}(SPjeSl|Q7Wuac)T$E zV6DQ`vzhy?+#Jz9J?cU4I|cVkn?vpM8@!t6NJg)zN~44yQ0?~`3Z?@6A_t%e50;de zgD$&HmuyPbu^v=*52;9xtG9g<6h@au+9vV-{86JOqrq&cLh#Jrw{L&_gQG|HZ>Em^ zZZtmt=j#AZf%M286Ar=5<4jaTH8P^bhQ{!r-m~~wFEA8A7rd(u#%-h|=HZQFL!enx zt3sFhdO_0$9}ExT0BShcaywgFPkrAL;-ix-mJ#u>u>vBRBP=|>Lj_2YR;0+uDKts~ z1&EfM10Ilf8~^ny@GPvl#?!nlA1r$LaQF_693Q-q9cSA|Z6~bxgW2ccRCo+24 z+23?elxBTR=V;1=liLZPI7W{Ums<=f6Gvq9Y+=%nvXX*iLG1p#;h#NX(lp!DBxNKO z7caM=sTE`7^D3Lc3l5eCWOLXg;hE}cH`d8|(Q63wIAboQ)Ydk*`%&M$?uJ?#RUf~D zQMLa}P)MDIM#}%$s0w}q?3_HRVmANX?YlgrKSP4awr@K-I{G;1 z3n~mNAfw0-&TraOiV4pNj3=+J0zz4y$Y|m^s>*IPluTtuamK80A#b-7!Yqiy zZ}1Kqx?4iXnKFl4zt9R>NV(*Kp)?*DAZ+TR>Z9R6AUlvtDwR6Kdpiv#r^+PwK#MHP zoqf2+&A7*TxW~!3MHF zn}YOZ$HLdCoUeV}1*4d6HkOMEBP!Non8jvyok^r>L4PD7*KmA0U0R#w)P2H{#V z*_tfo)XW9obnzga9-v>=1^KXKRH}ZzU;%o6okNN_R9u*)@t*kXv!l&d-Z<9DUG&;8 z^=^=@A)EBS%j~V+xqj2@dvg!@-nYrV;g#Ws!FM4DPSy8cedCj2?Di*~$XhaNgvx*B z<3B$&7nZNP!_#078zq-3p{UM@Sj>vBSboIt;dUPPEJllEpY^SUv zfEUHJPwp>dZzxB9xdHvfhW;`VV>P3rYB)IoF2{KRR z_nPz8+@AOe>q~ga^`C`-_8QqknWu@CR>qX3Yf*6`JQEi1IKPnARs>@$8AtIZEz9cl&8-vLg94g@G)=nTfj zI8`yR!FuxHW7b8viT@-B-&$2<)~aITK+Kd+Q>kiWRxh~m2(z(9^=5BYsSTcUg&=De zUz)YR2Cf?gtNBOmf-LqC1nWnxH%B5*UKb__0%%~qzy_F#Lc-9@F{2Yzq5k%-kDch~ zmly?zuO*l+=Y)O_a5QEcV4MJZ(`iH+)KvHU%hFI8eM40&4AnEX96NMuiC{sZ`P0PmS=B((> zGww5;(OGksKfLnc<#V&nZY%&E0+ea|c6~P4ty(3v$tLSGo2Utdt<5YG>V}JoP)5wb zAR&&ctlZbmOg6wtY$n$J_e$x_k-b=fXw+&r-NFL_qJoAGrR~hQeqL`Ho^DBr<^7#! zU|$r#i0Kr-wi6hDi&jJi7Ud1nTLDA^uL0apVP~SuCCy}d;a~>@#MvOz49ys9fyHQn zThRg;XaVvgk=>2CWr$#uyQ_;vVpo^)o^#idPmOF}RBjE|l3fwnFxp`yXtbAxm(uF# z>-uiZ*bL{OX7-wDiKZK1=SAVAs@-$u?3Ut?O?~Ck0`!ASYZ-0N#zGAqZl$muI7b2Y z2X1+d9T6E0B3<4p;<{VfeJvh82BNI`hMy4XTYNc>VU|&4)zoB3x}7`icE|SPK}{wo zWb9O87B0NKz^nGSBpdebmnZ?8_;Cd&=#u|=panoB8mTdpq;;!Cv7Zvk}6II~ucHStie z6y;x3!hXrJcw=}0?`dd|yQUqWEu?yohb9c!Z~DaBred)!ca1nydF)8h_pfe1=1OX7 zOQht?thSd4TDHqiwU&1WDPM~xW@YZ#laE!HMXo0z7erB)nxWSKO-_)~WpOw>P2)BA zTVV*Vx7q5YRE+ZdZGM(?1B~$anFZ<0f2`6DiU_^lBW+9cc-p`720~HsAb|k-pk6xmH%m>C0)I3Zty5wbkd#$CTq0MtGNYNQ-D4(4cEkc1sEfv!oSxY zIF$ygOkvWogKP7V|2;|F8$AE{-j|4zN|{p1u@rc{?n@9jTEnFdzPWkFRCFFHYgC^K z>^d@4Dw9fKMnH_?@OTplsJB3g z*bECtAJF=<@!l0FzeS?bEOrTuqOU?@1Iz=FpI9g<>cy+7g?aV6C}on8UHL&(ef^i` zoa#%b>+^eYB9>j^8~B{P%8k`D9ba zoA!JN#|O9#hv8uz248^A!FkR(+1C#4yR#Ba8v^g-Vuwg00s(J-^H*)~kw(QOT5f>J zJ|-nG6o!`&OBaO+L{Y=LD2tEW-$XlH&xmt!Uvr($RBu#)$SwakAhUlAw8Bz~^GyR8e#$NVK zkfrbr{6JtZ_DGA~q`hpsXz_i7J~I!F;xm{{VXn6GSODM?@|}=m_4%cjo@4{hyd;lnj^fxtxRbx2?!LgC$d=><1+tp*jB3R# z*_c>~E9a3F4=k|CGeh+1MUzdYl`HRDG~b#hdyArfQ!>F|0GVpZ>^xgO*<^4`zS&Gz z^ZB;<1+WF|W>2dgEEzX0pQsLnhaW7Tk8FzMB6th1l;wrc!*-xN3zz0vZpA7BcQwIs zu$h0PxY#CF<%<|p&v2{oEpl_eiEsV(C*K0NYl_JvK$64uG16kOj53=+Oyg0T%^7%? z0b3nbgfQ8S0QdO_sG7>Y(bzXSB}IjOs+3=)T!EdL$g~7zq;OJF8kUY}Klx%tN{U84 zR5?;AoWTM7A={GaS=qu85px*?H$BT6D&k3@k1sn|`2a_8^b_2Cv^P=D76U~yU7m0! zK^)zKDP=kQhAZ&A4DZUYwG3|YCpedVIZQ9Buw90U{-;NgkBkh3MF7MSU!nmf_Tg|u zSnzC?u^23@l|MCw6X10d$@7BG&G5A-M+z^JrZFTO?;%R>;cSt4|u&irZ3Pi5vZ#_pB$pX(>r$T zcv{(XY}&NRaU=XBd2o#?w!T^NJDDE}H)9>M3pP#~KEjCP4ji-O96f^E1pa{Es_8B%F3N2=ILo3xT4$C<*Vfk6*R?h^ zd;MUr1{}Q^sX=Q&m9>A<#>(odEq42sEtQ+L?5LF9wm}TKFexEdGCybOGDvOpnpUsD z=(mPv@z3nsIRpJR9sQSbm!-oVvRvG{*4Y{~3U0`dP3$#pp-p<*6{`at7>PjtKknWJ zzNz}`|3Bv>P17_jp@dSP)B*(yR;*aDx(cBbC|I#7Dk5T4L}XPvZswT7ne+rGii%hn zbDcx2%3S9|Gv&idGKM|{kwnn|MmL+^Ccxu zCpqW)aDA_b&-J-FJ0LORj7nW0#i4}|XO8Yph+expZThbanXGa3QC$7m+(~}FPbm>? zrcVB3MgEu?jc^G#kbGx<9<^mT+~U3!vX~|9eT~nn%#qy&PN`B6|K_o>W5n=V(UBd; z+%eWF4eSpdWusTgmaT&-Nb+BRXxQohWcT>$ej_`bSE~aB#mD9;$&pG4k>Bdu-9(p@ zeNlc(PEW1vPy^Bf%My+4%F8Nlo#BQ)6M-{ra2Ha8u> z)eXz1u}l4p$bz)LDV5st8?wa5BFA7yS{(K$i_eB=>Fxp0>DHp`&4)X2LSk1iX*&-) zuxr4W3+9kS41*aChotx)`K$UAt&GKwdbP?*?-Prqq)%I0hc7C|X(ZmhY>uj|bEzo! z9s0P>f>g)8e>EHAXmum)zf@9W3{9YkY*i1>H(JP;t;k~wG0}*Nw2HcbK6HD2{`TaP zHBhxB=fX*m+w_MuYu4;&azHHY(ADjGuBHS`OD`>yO_`Vtp%$b4jK|r%E!N7)jfRxZjf!(D_>T+wLI^z0bRONYW5-bteT~NGG@`EjHsTc)uvG=yzO)Kd z8sTJ>CMl7d>1=76u_MJ^w1!b&6l<*8J?5ph{AxirIq$&X*|V?`%phf~(gW zjUzeQ+CzlDCt?*zhFKp5as)GT1T*t0!#{p0iG_cURHXPjd&H&TBJ~c(RMJD=Annnv ze5O=ce@GtZ4|7pPK2z=b(By#8XOrl&N%`Bi=Qr)3-~RBq^joy9W?yy{$jYtCVf7LS zye@%IWh>7wW2Vnh(_ML#w_Js1)EUk;3)N-=d-yoCN_RRhG&-)C*h_Px&)MkAl;^S1 zdChd*w{=+UoH5orUWtd^YI zf?G+MTSNk)-(0wgKW-^6-1h)RQ}OIuZu02k(Zhtezq9q|7tMzce)h?}y&u$nRKIJ_ zUZwX-NctMU^L_S38>rpZmY|!sN$SWXiZK_3?-*3-E&bir-~E0&C4jeW{!R67HgDt6 zPu6%vZMvQ&xj$FqFQs|`_o+NKU%Q#3??z?1oBsudN)C~pDQ159827M|qei8Vz3`$7 z(=VSgc~V~9Wm$^tysWH@aaot7r=wP;4NZsx=8d#jv4q1HMhwdN=xWz8zIg!IJs_Ll zxCG&qfi;>6pWILb<}Mx_$v%yt;z<&(rt$6=J|pb@XR;o(=ymGGk%$TPc5u|(m@ zCH2>Ccf?9Me=G*Af!}jb4wT>pjxCG!$Q!17Nn(uqa%d#hE;)i)aoV!Utl2eMUdA## z+8<1-N`2+kG+kY@V=Ahvph*ho%`827j=jcRm+Y?5rz3%C4O@5%3%Z(2m`9`EZ*JSy zR==-JKpc3>09Z!@MzX>%C5&5MnPCI@^?}T=e$22KeqC6_1nanlNW)9&4yUfUWm~6e zmf;l3$75dHtZR*ALygWTH_}KlC#?QjRE|IJMtUC_b9(1 zhRYF)bxul(P+Vw!zgy2Gh_N(0TPv%p)0IXaAX)PVxi-%3cp8rRZFg(E!;>dl~?f|i$_|m!|R7XQ&%X^*4Vh4Yl&QkToXT) z?$oAD8_oCgLkPLZwIp&aU;UlQNUeHHPR<>Rb!c3S>{U7p{*6$bS^?x{DN|l9X!q`~ zUr<^jTzzR@{gpnhH$g!OhDY+M@^EP^1N2*?CRty3|BeM@MY?@>m~aDm+;n!0p8hN*!h5_F}ENV)OM2 zg}RGwM(Tp;8OY)d>It>AUT;Hn^&4+iy-5IeOWmeTuk?ZU2!?$`g?IfrWQ)NoW0*zx zMpY1@{=NcxEgdAOX)G7^aTgK!y6FI*tpH z?~(Q9RbryIDaC|y0(4C>sJw#Eg)h4uc2Dxp@`iA(>~b zh8H8Tk1Z|wKT@TMvvE#zmd44 z#9p%^*CF#ma^Quw_bKuerO?C{b^fwEa>iGZ3-kwYTxrARlMUM&XlconYY5*S{p8vw z*6rS1*P|C8%-x|+q{I~=%`6myiM%o$F`cj0{#Aei{p|LXw6xQglWFII1XN;ja+r$D zSr-EUa)bVqMj-&718NS4IgTUFEnK7UgPpz-hd+|Hk<7J7wze=V3eS@0{)#Vrm` z4jsy6>UVI9CaS~9(2h+@%gUW{%aW4h-1&D*#nowe#BlgjXsH*Z=~JmNSP|OBg6s)j zraskBKsMc~(Cwij?y@`|4n2!XRzjrLuUj{5dT|qC3wV^aaZmMhQh4)l5g6q6?3L6m z-Lwg5DXy=-qiaENIq?E4=CM)W-xibXc5s%PLNpKA{B?wM}otY@lme; z^R`#n5w)YfsGzubh1W8Eyz;)!`u_O$-yg55z%OLPn2`||K0b3uUGKb%t!tY+j?+)X4h0o5T)D9|~FgjXGxOmFM zNqPCrpYA)Ee94T$S-0K8nyt|XcXVw1CCn&~5!P5&wrSfjj1sUcLsFAkQK-_x%Uxyb zd|v&L$I84b%eHQQ?lC{L_Pz&5yMVk5sVM8x2fJLEm*ByHYal5`Y1{o5LX2{2s&9tP zP9X2uMh0^p!y^t%X~J0O0qixx*sa|-nQ-jWL@7#z&91ww%4Z^4b{cd2=i;BG2^+_2%y4P1^Y{hh2zlq{JbTmdw(jOVp`56o zL~dtKSTYTfKg2uj@dWiPcGAhL8kJ1gDzu)CPMc!w*71Ejrp0JcPgqVVWRxNCxQVdp z=d_D5>T`3D72PPtNx?~bJW{MbpU}-3S4E7EME$R4e5Nu!V;CQ8$>JrshSlt~|M32M zuftxr!N6NA!cKSxFShC7)}t5YF%p!VlM*@9u2CPlgDjhbfuYW>Qu049zwO%L%1a-N zzErz_{d7R*VG^9*-r0?$W074&uGxiXQx~FJ=Y?;w>c6h4D!&n?0LdLnBfsi;Qd$;q zzl*VXhw;>d~aKx^~91IJGsIexVDM9ZOr_4_Gc-g4w5pVq9=meQz` zfu62TcoDfPAQLGuj@&BqIWY$KHoW_+7YYYr84zV#`+3hPSbc;1%)`-83QIgy) z;YAbAp~!kd!4{9_W-uhr5l$dh2j`1`ll|DT8*HB1T6O%@OO4<_RA%Owj0}%Htfofx z;(f2yfD!Bgc>~c`S$r5q(93{byh&<)~{OFQDU#7>;S!K}&(S+={@N z!uSCUP|F^fVm!}*m}?jyc1}MQSI7Wl5J_g|JcS`mX8y|&LsJsj<@x5wWZHbryU%>} zUH!Ral2shoMJx%S#31{Y602B8=2Jh3fly;Su>u$vaegk#VkB{x4|TH_vANJM6t;hj zJ~C^SOXTf&#@*IyzfOBNS9ACPSK*WJ!8zwpyZ`+>!~Vf%J7ZvC*e{O9PNxIgXQ?b{J{JF6(c zv^2aZ*1zi6HS2K9|72@r`7}ZfeG$| zN;63;ObH@`E~G?;(~!jPNJ_Wy{J)ubEOqmwNuIcwdhAuSw^vVc*!vGl8R>#mHO7_z zOP+>p9cQCv+3}DoF~Q}E10L9;IR_4)0tY5`uqy^P3lRcmd_t1bW>=%_6u%2PtkF8O zIYbJK%<-6`N-KLo%Q4c~F!qQbSZzwX46W9e#%yebr_-2+IE{SYGwI|^2CJD!ZX@}} z$Rju1j{hRn8A1Pc#CH7yGr5kL{FBH`EoOAWyGvuwlCp5wbqZQs2GjL}>pV!D>4 zx+~H)C@Z7B%Quf*{I4gy%_Jj`NiWIusx7KijgIlTBt!X~!)K=`PmL&x*C63b)N5gSA~a!O>Ayen-ocj4^$ zVPrvJRr872s6b{EKNH($9$spGV2$9Q{>5TQQqEcoObQX_MBO`a{gM|wHqmEqFcYKG zGWGwBwXoe#51K#)8Cm#j8^T+)n=Q;t&U}q+PM#ad)>Fx}I+JZJ>%dEn=A_P!Ub5L` zDMUl}6liM=Xm*xDp!L%uK`NZt94v)EK%Gz^)NJ|C)&tC(c>?;8m=K=Q!dORsbcSjmPp0k1F$ZZ70I8f77`#{@+k=2-aqS zy0L676ItvB@h4_6>qMOq;?XQ-=yisoBdX5#nWtHNW(@N)OB5b$b=m4`U?V6(3!1^p z=}cGgnu?7(mCag=_Yz&B%!aRj=DC9W-w<+q?@V4Bo$#+D_y2^NV}+uILZzCNlp#qYMhqXBoYX%)hBVF8VZ%~}6Z!9-B+d^R{eMr> zK|t-l!_=`t3B79A&fjOwJi?rr$DFx_IU`m{Tyf3>&zP|nTt558k_R7r(1V05o<{*8 zGxi~WpRg3qnwTr4=3kBd(ZXvl#1KdtdsWf$$+#0+ETPB@yA?^np`|IkkASfLL{_$Vs;O7~;?i#_|*_Ra;;s05(?8mnoR)B2J|C8kW%@>g$ z8*O#O#Zd~#>4=VTzEkd9M5Z)JQJ*7R2jIx_z$wFE7=$rVX%` z4h=;ootFk6cjm2m?z@>T*C#cyIUP&;V&{8_y4}0>)oOf$8_VaTPA>rTcsUDNngkVy zud{MQ2;go2TL7S3>QtecLch_R=d+~Ss5#qKnO2M7rq%^jBpl1S)>I{@;d}ZOgX-g zQCiL@6){R;iAv<^|6r6Xi3^sbojp|N{i~r$oRAVaYq;+CpA8rCTL!M=>|sm()?uq} z2{h^7{l7hQShr3*e|hE*uD;+u9YRNv8?W=3VT>_{v0ZljZyn0GGegM;2h8D&=%|wS zwwCc+z<3r$#xr`!{5x+PeMMnO9_pq!>t3>DW?g#i{Y!r^4NKf?D|plIcyP&mix%Dg z-NkdReaJwu*&n=mPQCzGuhKIEr|j`{f2gdi{O2KDZ!M~oiFKr@srfkbOLMs!kDd%{ z+Vnn2>q^Y90Kmk}z%$xz6%>5(OwXYqQy{+rPy=dj6&YeCv<7A>wo z{Ni~m)B^s_KqfC^m!4uAcO{ROMLi|u?bhq$Wm{WZm%;er85?vuQ!`S9ik`dNx>`Hj zX~}kvXGX!+zXLk{((b&_qg#p~F_*xPR|9!9jhJmYOV6Z=DOJB)G~Zaj!pX4*@+Av3 zd8Apf^MwRuo56!69k>E;#9EZD1N)P_Kr>}q67Lo z@nu`viMHmZgRQ5!+uJ)jc(X+cCM)f2ZD8nqcqQ0-gF0~utIItkiDEv1&c`f{A#S_B zKkUOnGLIpK1v-O|!e(9V;!vxNj3n{Noud1Nj>pN*hkj}7w8Ct31G8WXvp}*R-K=WI z{CT$*72Q6!XnOwa$!K7|jJa>_7_q0WoL`iS6#_mjYTmrOyuq0`eC_V~&eDPX@NC{V z`?|Q!ZmJ+xzrDxfp>olec#@VPFikqi`G&vmKJ~HkDY!YWM93CLt$V4m@}-xi@u_=x zE;a#?7*(|W2MBkT^-F4QK8P`WIJ`-MyHQ(9OB?j;&|jSdwHqBzR}eJr z@L41ufk0!NMAFLo!4D(UiM>Sl>1nI=kr&KeOjwOm=t;rZOO-cKX5heUZLdSX@(up|dM7kkMu zi9D?;t1I&=nZD^LtKvAWQj?9-PbOsDO_$0#BR)-p*}lqTLmEzR4X3w;^W6!2H{Xo9 z=OOZtoh*@Lua=&ZGlh|Zy-o2#7pW_6J(pN|EAyV5 zMRZDtj-~62^bGTn`HYTR7Z0_M78Fun^9C;76~V-h;f%&`Mi+BN=W|BMoRNFWmh|*p zbxlnzO()6cAluyIY9W?Q{Hz~*bTFuNT*8YN>h9FkJ$o`!oz79og0bMU2NYW>VMt)d z)HD-%6`@-B2)e35=p)(;Z;vP(*I-9TyD6Mwyq<&S&crTE(;rd8p-0`xLxv<%1#0k^ zA9WAmjEy%b#Fi5>TpvQAs*bWWDB9=xys zPsrejmtTEn(Zadc7bPdc$;@qNa`H4>@~q!TTd6xl%(TR(O+#__Ck{&pd}6nIMuL?9W&VE42+sY=)tTWA$A$AQ|?!hJX&2n#c)vMfm85#eKP^Hh^==E zJB!3979*L8!t-K$Pd~YK?URqKE-RbHp#`8!q?p3B;p=oqLj$t4v+1vNxIgh!M>GEI z0|%O#8tNPB>fYH=*J8DG!yR<$WJ}$<4f=hjMNtEhKoMCCi>jQNv1$~rHi7ySoc3Qq z&xzGl^V+e^`<;3EnJHnwnRL z+q;lqxH&xE=3T>-|3%AAi>HE?q_b=N{H=wKV7|zF03H{Dil%2(ZsvCpP+kd*lFly#3Sj= zL)kMvQiYVuAfe5}-@1UmooUlYeCEN1i>_a55)ep?g@ zL2tL!dV&tvN2IbOe80NVKb0Q)F5M~twg)U5Uf;YWm*oMyV%&x*uwYMa-}>^VmtQS| zaQ{IGv08R)FGC9akoq&;(anb%8yg$y-vb;-)c+7N;?rhOgV9~V{=C$UF(Cy{Ec)Ga z=r-lgbl*-ku_oqqIMU@khI!K-(TX~G=P>MV50znjU#Av8A4UowuyqDWmE@C3ts@FeSQ6}H&daa5@Xic8&*`C!+N}}2ax$n1ADG}-7@FJy~TeL0^(5@C2=j5Fx>Ez za1Uy$Obm4@qbR&WBT_Zu+9uagKRdyQn`cg+k$uI*c>-Id zQjxU#9cwFovvKR2Z*HyHx|L5^drIxSO5J;G9G_ct2Y_pCVkfFIWI`f>vt;kaLdhgi zCV4eACA4s<-QZSE_r+r8CKyF!l%iBDvaNk65(v$*#r& ztymn7l^5TM#W7((sB`b8VDP1v(N(Kk8PMQ6-T?IjCGz~Bu_&16`1BUAE$1bHN~vE!Ye%wT3oMCbuFi={@YNpbi-b>-SAI1;5s4tny1 z(Jr@BI7OTH)(71QIHi?ls}RSpWXOC-y+pV%isNtf2_et6{4M3%O~=ZDKs0jI68YS(hF9bBeb1q7g|$ zT=CH{aq*7$fo^AEhvYU#jWH^D#g31f@&GC~B?tPZ=6iVUI!!rO%X;eU=JjJ-nSo>Y{Y z!I)Fg# z|3vuz?;;c-@r=p9u!_TXTQ*cxts_I2FAfGXxsr=!X4h>0xRi>#TtRkrhTZx(YStgO z7EH<3?_ePcO`~+M%)AOZx0a2%gZ7KJsFB~Nmq|DU^NWqCMavL0fU{L z$4_)(4YnU|YiSR3_H^#w&lcO=r9}lhT3hympmUa5Ekm;Fk3-m{kcDV*vTk8%tWS6N zz38E|QDtW-;~%+fAP)b`SkMlm5Pp{&p=*%eW+K!lZ(0iZ56rnBZ5)uUs1bAw?hbpKW^n5hHs^ zEnhXm0DD}Gs1~|kA-ML2i=$UQRsPho6<+UjMzDZom(5+EBFi+2Fo{JV4ZyD+#je!Z z)>Rtk8k?=y$PY{pGy*d(bvG-#gEH{>r?otPH`Lgu96IX1M+!jEK4Ji>jGHJLF66LT&}s-ug_JZG<@gdcM}HpeNzqmh z4+guGU{4q_>aHWL$4<7j1cG5=Iba97L7RauIO)SF*Nq3xXX!q5;<#R_solMgpkze( zwXQ(d3azK78yb<-BEs2$psch}n~u2{W1#hY15IQCLmdou%93L-2sZe609XP5HCEa+ zth8HMX;(4wV(E`&t^B2lAM@W~0E=9TPJbQG{ZJ{l2+*^kvSB>viA2 zqa+9>Cp(Y4T2=L#YPp!zb$NP6Y$;Vuh4IX9vTztx#-cWEggNo4YmlZ(jE%yqB{2`B zL#R*%qAg+XrM5?e6ZQG^eEApTic_K^8cY8YwdXU`=?@#-@e~p22r5Z#|Lw*Yi7DJy zF~?Xq#yAN&2S1ECCMa)=4qIhkD9-e{Y!{yl_2bp>(@6=A5D_)3ci2&&yw+m+yZVzv z3f|KehP=QQ@78^aZ3Xt1&k{304X=*Ejgkn2K>uS< z+?aKo#?jxxcP-40k}n}RN^4$TL4iH8a$@JroOyN56N4?!s~NgdD846JL{dc6_z z==p4^d8zQxv?&hi<;;QcCszkRR!Bt&Qm_90F{G@^#=G|~Z;j$n7;J(E- z=X0IBI_B%IddN^sNZ_x2;i1m{NC&yax$P&&3vCumXKQzYVecg+K`9sz2nV-QcqVNA z9dG|}`|rzVvNsnaKZFTfG86JJPJxv z>fqI8^jWds>agTY29x)Ayc=m_N{=Q}s^B}6%|pzK&HY1)QIrU4D~gl@astAoLzs?H z;k9;a2du8cuSOJyFB0~oJf>V?&^}okzUg8q>JM8LI#lKdM4mq zY4meGYhwoe+{ZyJSiKQjw~iaPBZPaGtv%G=_T`ZyU)uVo5BOl`&ix4^E*DbjNxGKI z_k$Vi2QP&_puHizKY0{$E*ZOL7cnb}u3kJxACZ;S+??(jEYl#-m6A>+v9z(NZ6^k# zrzf9iYhqukIgIB99n8@4gI%TWl$@N}x9S76wcEDjPar#IP_XO6TKx{d`&&a>>3;)lX3%pGhB{d+zAdpYx1DrQP<DWfMa4@NFZdzuEK7R2+fkZCkmEXBbs2)JK=R|bg*$i4mQSp@f`~QYSNA#A zY>2Svoq>hJ$N# zx9QjYI|(fMyiyihA~aL;gurp>a;PP7OvgLpozc$tczYrkz2trl$t`l)(dj~`dIG1S z9B6=6yb3Fn9$mmqJh1r1x-&TA1Kk3>GeD(eB#9ge>Jjg>_+;|vyKMUI0{Tw)G$n*S zyL+5TlP*LBk0@*6mM*<_>0MZ?bkXqqVsdMAYkT#+5hm|`d_27Sf1y`MuEC1VW_K5* ztN@pb5S#aXb$O zpRkIqWZ}?0rsxUuhKJse`a!}!A*{;+!}8k3CC^?GO1VQ=yGz8|Xv?^wIC)4BaDxrX z5?vYRQ|RvWQYGK7O!Fz_6h4|QiVUI;gF)T67Jnd0bjGKSFTNzN~0E ziu?2;GCay6y5Q562j^u^$VK|Tq?AWLI8T(piP^#`@hZ`Gk`kheuJw34bBn2HxE9~d z7GB#(gs|LrEc)bQN|8RM`{>@idyjTg)nkY~@;H{qvH!iAIfd{oHv_x169*7KP6q$m zp@?iY_LW=c_+JD_l}Fse5U{CkJL;hQtEG2Nc2jyMMSz=j zqx8-o$JwQK9wy;KN|i`Er&P(ey-xT3U&RCEodI_0ZB zCwZg$6vk;d*4ZEKuAWnnpLcf}bzs^tVY<3I+P*mSSz~i+;N;29E-SR)U$jwE#Zn52 zGgzuw&Qwh-Oo|{S}__1N=f(3=yBN(L-*@X-K zGrefgw@vCkT`3`62@9C=99`*ZrrAitt8@+CBtev1gARKIuTj~?zJBATKh^x{R~y&Q zK*3$cES}5!ly)16)v~B{k0MgnP3N6OrikS)6%V6UzED~D!b*M6Ig?UK<3uK9pL!MD zp@c=fI^SnCO2zn8O2sVwwz>9gum2C!uosl@Q(2+z%qi>HbE?Ov*yD?+Y?h;niVIhY(TK`6Nah7Mak*ia88_qcztrPi zP}E4~nD`c|Gf)^WMUT5tPdZybMdpYhtiDzer`QAlT7P1uf7@QOc1+pX}TJ#gQXz?Z=J;y3wZzlN{}aL9n|! z2wwY>&Tp0@XK(NfG@LWvFwiT{)ZlrcuLe&vqZ-YqlBLFYno(!6h;>pcVF*Vb!BkOP zx?gGLZs_!q)#>2~(G)T{LOAdT?k%|{Jt-+=?AU={?q2-;<@Zh<(fiMuzv%-fPP}IB z9K8B-=7LupKd=jvwkt79w|RE#jGvTJlgm#{H@GaX7;O70 zsb_vSOY7?e(9b@=D1feCSTygtbYxAGFa;#Ll2T`2oh-)1c2iqN^L89vKgHy&c&)1X zjZgWMhMlPk)VSFAa+wqYW4cCGFKwEk)66=ZCMQHyQrAf$5IM+)6jYM|w879)nK^-j zA*FKhx)dLhmSt#28R5&QUtaU>-~K`E`aOF;tpD)i`h9zL?cBMu_T4|f`7)%$N=ksB#9t$QeztR%~dw6hvJ`c|aq?w2zk#jhq6m@zm#dbK-{lIWfvYzb1bU@51dK7yD3KI=ONwrzuc za-uY?blWz0I4!(T+qV9BeSkf!vC)2Hysdj@=aF}8BkYZhX?9Aj*oZYs$j(MfWijT` z=Ms0kk=Lg2n!GnIY@;fQf}2i*f`;Lahlf>Z_WxvnX2bOsbZAOvDA+-oSukkR_^4#( z&*JK)b9GYpU>H|7P*xkvxGc{%3z&uT(PPCxzl@1e$Xy1Wp(bsHkB#^FJW6@gWvnAr zlY;TjMRHCaLmSUT#owW1>aa!PDgSg-;o_O7J!|;Xi}<+(BK1#vsCcX_K)06re6~F; ze9y^t$rO$>?dd%b5uipZ)w=5S&O#0NonlhviH}^OGG=>`cQ%sm=7H6R%TkMz0Ja#89a-9Blj?*u=3wTT@e8q$h-5N;slKR%`TxNNmQ<>j}N( z^LvzLuSZMrk&7!gQ&PopL~P`UKFpJX9q-|op}rN9VSCK;dMxR}4^;|X5Px8nGLKD3 z1-+GOqGKc;Dp;pzn-Tlcv}vJ?a4phdYp5_3>^-TtJ>g~kGw%|KnWt{0F2){pgJqGD z=TW@=JbF|x>D8xs#HBEX6u@{Q?ugY&$yM_PchM6TH>@v@nn)QzWv<~GBr|yy=OKE> zjPN-8)a}Fyx{VfMSueJi{c_72-2U{NtAP|Xg?5GZ8@ADbklBtgO%}rs_Y&*8igFnA z!8TuXaqU0$>}&3gDvfD9K4!`C;>)f38*n^CKX~W#VWEY|FXkGmW>M7oPlMeV3-kiD zP;;rDslQWytyXa_Q7=$a)xpYV%FiuGw&EL<6Y5iHv$~abP(7f&rh1L$Q>UmgSgr@L z{+=`D;iu{)449jhR}$5>cb`2YL67=q$LAS2-vjfdJv1X-0(8rws_Xw=Q9nKpSG_p+ zc0+?VH?>BHdT-RDbBg9nur;o(G^C#r2qg^~|<@;f#7 z1$>rhip!M>KMb_7cvV$ZiBnJNw&q}W5BysCP?7}gPIr>qX>U4wysHc3;81)&$??|C z<|f_D-IbaIPejI2;@L8mGs9`HXf%h8L>z7%26x+!ZNGR0S6|ih6e|dy&qzKWstWB0 zy%(yFw1Y@>DBi3UJ9g}N-V>hBXg+(^XeJn=`6G%=G(ULn!i9Iv{rXTYG=_4Y`XYn_ z(&nin7|K)vU|WreDwFk~daL?pb&uxO&es(6&B$PSL9W{w%qB>uOmeV~)l6gcF_<=E zFkPWib2RUtjCuN+x-^3sXM5ytq2%QHv68tUqGt!p1+!CYC*w!^SEE^pzoH3g^oFu7 ze!&IyuZ*UxrIYw*XLlEbMy;m+@rK*JAoZ(Djj`K0KK*F_CkNX*Pude0&5jN*os4Fb zBia|!`q?4)Q@`A|uVtkSrS(+%Swq=n4CSyCx4o$)pxEpIiiM@ZT5S%cDIb2sSo#@D z@jc4AlpF;$Fy9kitTrQ-7TO+v)iZyD=iXd#qbRGL_jyM2?0R$iANIwJxbmLKr2TrM zAD%hFd4MV$K4p{76I$+5;yob%HlaKtM1uTs$Q@ppMkAa6C!Sikp!hHw51sUI>deR zThgs6fosVOA;|_eStWF*TXe5k)~B+=qrC40w3)70JA&`*t|L~_`Q?#=_3!Q8_0bnCt)0QfPZ|jVb#|US z_QjFI`*g~sN_8yFZ?y=)5`?}zK+{0pAUuU(0^)0bOmav8*Oo*+vu~)~ojl?~w3y7% z$!@zsJSQc2FltERkmU1HBRq%V4=7_KB@QZIu4 znb@*xDb&^ePEIXj!vasq-;}YtU0Quu=joToCi<`j^QeU|mFH}$e1zppM^?g6P0t4~6uX1i_aFP`-7|%KRSM44s3oaW7^ie%oSW3U7{N+@UfBU?db`>zRPs zD*#mXjn;ae!KUInH4IDlRgh|s~@}l9+05*Yt~MKHCm9^0=O#<|JXwA zav3C1Jf6#|$+YpPImI^b3k3RKAd(M(gIe+9JPw1-i zO55iSho!5d?cgW-8xEf6JhIDS@92(-)xAnn=}^K~+)x>L0C3$JZMTt82dW1TG0xF$8U-Zhow&-{eBN1r6|cH`a;Ta>(Uu8v0k zRj8@5Jv>Xi!q0bXVC&z;E2vhn8hFfDtvig=*9bV^DJ%sDu)-Sy@-3v0(-b;g4}LUf zH=45>$=M}yb`k^VU)O`pjrQ>T#-Ek1tNi6=hR#x0cu|Wlrdevw2D3fFIqfj+VnAFiB&ruzGwao zxtCA5@wO#&c7<<{U72)EVd1n185tLj&h*$1HGSUNi_PuUC88uC5i@`85XfFL{4QYY z7G{p@Xj>4cHDc<}w(CFB(Bew__W~89ws6okfS{6iP6o+ntin!!Pn7N-6z@nJgi8g2 ziT&stw zp00KHE=Vbh6A{PX?y4~F2v2)FM2$1AVA@)LF^SYX5V zE2TOhp5Zw+MJRskH|3-?+wBwQ{UDc~qgj72Z=yY0cmOLv3`*o_rDX{a0Rxp6i$^&< z{jwQz=FG@uAU60eY74U#!fhXbF8-hmw(#VrwvTaPeY^m5qp)yhF3QJu@`~mH6}sgv zEQY&5HVRVR?EF9QSolk&nF#i?UpK4EZ9@4}*ze3?`~<9{iJAYGdOur43%P{U_Oot2Mu1A)&q@)PxOX5j_QVM zIT+|Ih3Cx(Ty*0~W*IW}Yha(gC@91%Ah*SP(f1f}K)EfUhc|9O?$6wGlTrF2W`Hn3 zj*7^bTmz*1WA)i*J)w7EpMCb(ZJ!)UE2I)F!@0mvbsVL3QxYmEIsX0y1$kLn{JS)B zOj>FhcyIcAi|;YTvZ9a;UNlX?JxLRR`16QBtT1qEd-QTC*X46`E0{jeR1!7wud;P@ zTkQ#2XoXk!x8(fBrk;I%DHs~}sgFPI3BBfg{PD+M`TJhCXWF!B%6eEK$lc?bv&N21 z(P{#TSpnS{%WeSeK3f61v}3`%f`Y5_bFy=;%t6hJ6?tjgdIBg~|HIQY_p(blU%^-R z^`}I!A(NwRF$|@E;X=y`7e(u9c6Q>sQaqt*p9^)uo?y4#i`N((yqiaRuwk|^Rf#OI@BEZR zbJ=yueetNHisp=p21jePu=AYh=9Ts!zHG%AqryWH^p&5vj&WyQht$Nq%Fy~NL$$PK zoJrCO(KnadwjDzAhkf}QuEXFI@*AtvA3JBxP1oOAQnd7zdGm~U^1pgD{&GXc393*q zFVmUfW07$qxspK#Dxdj%-R}3_d++^s-rCY0Y})(D{=IcOKdP4$1Dbusn!P03wJ6W{ zhQINC{i)8*m=O~uOcRq$1LmEi1ldR>5@( z7En{!6+d)bPR=E%L}3OxlP0iZbGcY_uHDeIG|8j4N-rA>+_i4$dw)#B! zHOYj1>UA>us^Sn;{<`t5!-&oEDuiKNfMLH3fbpDFkm zjy!WZ@Aa=QD5t-U(%u@^hU%3!dT8YfRn$ZxMe>rO;jVoa) z<)X0CQoN7Uf2n=j79cV|(`wBb9d2->C4ZarCuHgY7H0HfLf?N2h&& zxd({$$kKEKEo=ro9berLqRb6JKWiV5Z2WV2w!3=@o_uM`hL!F<*!^w$g6sqTLDxnV z6cCWSL#7bkJhkBLZ6V?7+k&wf{Qshh4ShvCFVXbyIo=RdKlTA}gp`~9kTlaDLdfZC zf5?rgDje!&-H1z=_mZnL(9IUlgRdZB?=2103q38WYDp-M zRuU?72X^lcEEPL0kh*l)RBX7Osml~K9pvS9`!Ya(iAa z|5tt>IyWzWV(vr=B}SRHvksgOZpN0jV5#v-{rM$#>X{k_;3m! zDFz^uBxn^lpKRDkT*Ws&_jdS872Q$ zv`6Q}i7QvGT>bN{oz{uUi#~^_BAJ6vp(I|a$IhOO$voxCysVpW0kD!$3ZolCLoyAm zaOP>9V=FHF^`~{g$B|WpGsCBjXjG~|3yenP5H%3Ot)MSD09Bx&20m`|<%n-MCw1Jo zDP*fk`=RZzO@}(hF&5{ZSxL#FMfcoxb5Y@cnI5wFo-t(NaxB@VRB7<6Rt{ z<}BNp(stAq3J-Q4x?*`AnV|n9)cFr(z4eMiAZvB|(tFa6HU%wrE}ag5>i5cFIA56J zln(HzB@a!7e!mx`r3nYv>oE_P+!hWr9!|T9S+m_Yysho?-L;16`FyuhyX!L;2M3MK z3^e@%_v*etX8J(8e!Br=9)-#*NWmKoY!NXh040lfC71kp6Dr;JiTS)IxjG&`d-@al zi>}O!}h~Jqv^B#4SV()nIU`kH0=M3R}M7n;T1}R zMRX+xqvT|i&W?pxfCxWJ68thffyg3{@hNH#zKa>$3 zkYMcOMv*~$T1Zarx#7&vzVLGG{n|>2?j?uww8~1-K?=je@YD|De{X1~9^X?}cV%($ z-*M>mgQ!x;g(}L6`@TdF5^s|VoU9fbZ7_oA9e5rjm7zmTqu^?9Q9K9?k00 z2U$nqIUQyF9GB|nNjbzBa*{e2$WuDS8vz6_Q0mmB4@GJNCOous5t{O%?X`4P?e@); zm6eox;ycK5Vdsm*B^et!B^h)f3v|qy{tJJijTfo&#D3CimGTc1HRr>j$X=35zfPfV zBx;jE-z3sE$_~lVElGTG$Bw!W_SPM1ZA=}k?D1Jw5v zZpaGdXWZAS?i8p2k2E%ZCRI}WOx;>?0xA`M!rgOcX3vom+jrxPBwj+Zz7N0Pk*2Pj>hV zSz?Qb{7=C7@5Tc=E`k9V$+I*blPs&3yN(=F>>-Cc6`aXnN64lem+Y3F)vCqf_c=)k z4hDqat1D=?u88;T%J%Kkl_N<&+72Ta5n!}g{t@s%=z%fP<1HJ z>*;OsS!U0!shO!%fqPn@6oiX$epMNN3wU0uU!yfC86_7NQs^qYEp_+JK4|ykV;MRH|)m^Q>6E6X>mHMvI=VERaDHYswv3A zu$D5;$$@4kna0h@&gK9wH8;ClyItum>3jC1?`}yabY_m1i|gyp^@$81Bii8HLS&Hw z!exH!L#C(exvEF3Kd(n^_GyjQ?fS}~=ry@CDBqo(<+wN`6wqh3}fi<5frs;|t3?%&*uu46`%&X#w5 z=V#fm!;p7rx>j6l$UD_qgS?}HkVrgBW216f=1E_PjwpTAcf57eM&q>R_$+B@N*V&D zoMAp_a)MgGqZe6VTL2Sf7v{+}W< zQ1#Ge&YY#Lr+L&tMEPiNWO~$l)F;%n-0x8~T7Q7BfWdGhG(X4qz%l-hym;-|FMiuM z&>gsjUYa}iCHJNgc9*-wA_yJJ;Gmm%dIOxpeXEL1!0co9itXo?X5?TSvcolD^ zxBRK+tA6+Aci;V8)$`?NKfdBSGiTp+Z}Gji&7S$4vmfhkT1ZKD>KDcLvui@=8Kl<4 z*^iyENblqA#{(g2?Aebwu+8Oa(=Td2K>#S$LE3BAiL)Pfp6rHSnruUUQZZ8yeyYL7nu%%gYMbn)2f=RtSyb{tFOf5l9_9+tT<+#*bOrC z`YMt|(MK|OwX7tU-zr!_WBOXE8u*q~tAtTPrtqpLM72y}b8Wepb*@x}Z!zbvJ(Y+m zHUPe-jBs-}i8_Xn=Rjn3s~uioYa(#DGjTx@h4fWo)JQ(Bd6n}yH?ip_@{QBD%Hdq4 ztKs9nkQ%yWZ)?K|seqW4mTSsm=L-#%>7>k+jBoy+;&GqWqde{#K>AU81I1PG26nXv zDk`$GbNA;OG5=!gPd@Bu$etn#iniWTqV%`wwzOII;DDi~%p=J^&dwgqg;LC~xcHu& z>``*n1Cp;C!hh#;;*~y7Feh4qO3L6;tqt5V`(Lw-l%?rosYd|(=8MLp7^`k=XsD@x zYjHWs+$9kgXcmu`8EKhqMw2C@S)weV)>f!7 zdzzXLf7ulb#0(vhoS2}HMhbmwuhQKEfw+oS#9B)7DeQ~!v9rZRB8f{5vJuVn0NZLaNmjlg5k+Ec5J1wON@YTs} znA<%ntNx>=wzi;FYFDA(`QqqFrN#f2DK~CnCf~$N7M#Asi9}1DEY)493AmmlF%|O{DAhPuqmR`Qh5v=YDs6-S9v!Rl(g95&D}_L|o*8?bA<5oopc#H%|z25_CfdPRIFF)?Jf zwj6Fe@OjgrP%rSy;EA?X__bFfdds|V$a<^QWn`=;Tg8v%UR5FMU5%!fg7nfu^wOjB z(iD0rpNlk$ht5Z@HIiPU2zyj-AW{5orcHrbS2u%CNT~Q0I^sGevVn-TBC}qm^OiG9 z1A(Kj3M{-RY9*WS%Vl{SFrI3Y?G#IF`1|!3<%`ILi!m$DAtFAaT2>a^Z%Ia@JbT!| zTzx>RYpa_|ch3)x1%eeHzE0a7Kue>1rBzt1+DoI-F2#>E$=~-p$$V}dkUn+(o!4KI znoLfwJv}=$_4_7QX|?jGD?i!#*^W&cetTHaBo+V5-%bx-5ZVG>^bV=XBTZfTfo>H< z4D^?!639{3I+5ygXJ0kDu+Zr&oIPC}apXo-g6c51A2qD2$-r^S)Q4v;0uWPE2KPA%1FF>1Y9O{N8UUXbh=Zr=PjLv2-=EKC2ccQGR5HkS0O~CJ*%vAEL(JKZqE3` z);-(SMJ99Xs*StacE3{vs_)k|`rFS;VrOzVVjYw~PjG`*8ptErtvyb%TUy(j6 zDG?zP6~~60JO-%QQ1^g-iG#)_JAeu#PMm+=J$d2xTiw&Ho{$vm)+-(F{9MYUDa-v0MrLLxf)X%)w9m(SZ6mevfpE!O=g|l z46t01a{wI?98QVt$xAnq@M6@q<9#mWCg+J+o%ja|e@)B`fk7M<_HhKR<2S z{99(vL19uC&C}-^*(O`nSJnIQt0c3LJqqq=lh}AhYeo#(OjMXUKnV!v5u1%)!;f+s z==A_aS1Z)5EHCQVsLRy_Y{-caQ__R9fd)lVHuCfrYOT>;ra0qlwGj8sY_)`Ck%9X$ z!@ALVM@fm#I%3+ap+ucIYxY~3_S)7zmd1cueRb0xK;ykaVt{k4tE4DBE7N&k&#tv= zeX)Zx5}W_I{WYXkeWMNoM{L`k*F^M|{d9AE+jK<1Pq`LpMx@dP@C8A!WEyY$iXoQv zJ7xWlJxaPgUD5ibreA>+Uv|$mS?LMK_wU)$wx>gX+cz-5+56?;X3ZL9jf%2a2M!vN zG{9l&^^F=bWEcr6-JOA`grxQ(E$yvG+j?#8VM8b&;BeYv`@^V_I%J4JqM=(T)dk~? z#CD{NL$ouReFKuyC>USK-PLVjc(HqfAswYUs-aCwaJzkcN1Qd#ER^Q3kd+R?U_8-w zf+>FDP>bSnL7%6QWCb@YD({Qk>giQF^}gPR$|2tE1Hy-PRGW1rmnXbRsUG1N{`~)HFY3g*rmPZcVpou+V|? zqoTR7e@{_VwSend#&!LU>$;umve(xBx_TE(U0WVTPUMB-z$?VE?yqKN6Eo~0R8XQp zw6Q2aHPi`~wkh<-(4RuDhBlDeR3lCx+OI-Os48qT+Q`u4(3DU*Eid#a8@A;8z8iYQ z_{50Ng`tel1);ed{VMXz8A18Yni;;BpLiP)WQw}a`T5-NO;Jz(xu#~cG*0Xi z!~K4jTBUe;+envS&w=LCvgv5zUAd-dW?7in`l~#=d_pC-Ap9fCFOMcJ?0fI7#G}8= z=II$$oX-Jjsv#Em0jw(|C*--Tsr0mYq`*pK^tJPSw>jqSmtOav`4hNv<2KB)&9sQj#YvaLj%#DIYqdh|7xH|LasuPyt_63^Ky3bnGdxN5 z-?fOsYmumb!NIpha!*7(S#K$Hw9yfU7GT-b<|xb~TxBRO=6mE7e(QUuk9+a|Y3*FV zqpHrmzxJLzlgVUACLx3nA_j=47$IWB6mu{)!nJ~$A|e&^@KCB)sZvXO6lbz0+{{-m zMT+-GQ>7N=A_u9WAW{mLQlu%Sm`cPLh7iIenIywxvgiA)JrkiGd)nuFzF9DrJ$vu$ z*=wzLy_f&{e>qN;7vMOLmYgb5lPmu9ix;y2!2XuQ=R^v~

    r4&=ywuOFzp>FIx^> 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 Uh@3pmyhdg$M{-oyJW7cF3l>xKP5=M^ diff --git a/src/fonts/index.ts b/src/fonts/index.ts index 341604e49e..6fe0ce52bd 100644 --- a/src/fonts/index.ts +++ b/src/fonts/index.ts @@ -1,16 +1,11 @@ +import { Inter } from "next/font/google" import localFont from "next/font/local" -const inter = localFont({ +const inter = Inter({ + subsets: ["latin"], variable: "--font-inter", fallback: ["sans-serif"], weight: "variable", - src: [ - { - path: "Inter.ttf", - weight: "variable", - style: "normal", - }, - ], }) const dystopian = localFont({ diff --git a/src/v2/components/Account.tsx b/src/v2/components/Account.tsx new file mode 100644 index 0000000000..8be361cde4 --- /dev/null +++ b/src/v2/components/Account.tsx @@ -0,0 +1,32 @@ +"use client" + +import { SignIn } from "@phosphor-icons/react/dist/ssr" +import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" +import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useSetAtom } from "jotai" +import { Button, ButtonProps } from "./ui/Button" + +export const Account = () => { + const { isWeb3Connected, disconnect } = useWeb3ConnectionManager() + + const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) + + if (!isWeb3Connected) + return ( + setIsWalletSelectorModalOpen(true)}> + + Sign in + + ) + + return disconnect()}>Disconnect +} + +const AccountButton = ({ children, ...buttonProps }: ButtonProps) => ( + +) diff --git a/src/v2/components/GuildAvatar.tsx b/src/v2/components/GuildAvatar.tsx new file mode 100644 index 0000000000..3a5812d121 --- /dev/null +++ b/src/v2/components/GuildAvatar.tsx @@ -0,0 +1,24 @@ +import { cn } from "@/lib/utils" +import dynamic from "next/dynamic" +import addressAvatarPairs from "static/avatars/addressAvatarPairs" + +interface Props extends React.HTMLAttributes { + address: `0x${string}` +} + +const GuildAvatar = ({ address, className }: Props) => { + const Avatar = dynamic( + () => + import( + `static/avatars/${addressAvatarPairs[address?.toLowerCase()?.slice(-2)]}.svg` + ) + ) + + return ( +

    + ) +} + +export { GuildAvatar } diff --git a/src/v2/components/Header.tsx b/src/v2/components/Header.tsx index 358dac4679..77725d1240 100644 --- a/src/v2/components/Header.tsx +++ b/src/v2/components/Header.tsx @@ -1,9 +1,11 @@ "use client" +import { Account } from "./Account" import { Navigator } from "./Navigator" export const Header = () => ( -
    +
    +
    ) diff --git a/src/v2/components/Providers.tsx b/src/v2/components/Providers.tsx index fc84ac1768..7bee2967c2 100644 --- a/src/v2/components/Providers.tsx +++ b/src/v2/components/Providers.tsx @@ -4,6 +4,7 @@ import { FuelProvider } from "@fuels/react" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import IntercomProvider from "components/_app/IntercomProvider" import { PostHogProvider } from "components/_app/PostHogProvider" +import { Web3ConnectionManager } from "components/_app/Web3ConnectionManager/Web3ConnectionManager" import { fuelConfig } from "fuelConfig" import { ThemeProvider } from "next-themes" import { SWRConfig } from "swr" @@ -30,7 +31,7 @@ export default function Providers({ children }: { children: React.ReactNode }) { {children} - {/* */} + diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index c70ed8c556..8d2eab2cf1 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -1,11 +1,11 @@ -import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { cva, type VariantProps } from "class-variance-authority" +import * as React from "react" import { cn } from "@/lib/utils" const buttonVariants = cva( - "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 rounded-xl text-base font-semibold", + "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 rounded-xl text-base font-medium", { variants: { variant: { @@ -40,7 +40,7 @@ const buttonVariants = cva( export interface ButtonProps extends React.ButtonHTMLAttributes, - VariantProps { + VariantProps { asChild?: boolean } diff --git a/src/v2/components/ui/Dialog.tsx b/src/v2/components/ui/Dialog.tsx index 1a283bd1e1..5a580a15bb 100644 --- a/src/v2/components/ui/Dialog.tsx +++ b/src/v2/components/ui/Dialog.tsx @@ -30,7 +30,7 @@ const DialogOverlay = React.forwardRef< DialogOverlay.displayName = DialogPrimitive.Overlay.displayName export const dialogContentVariants = cva( - "fixed left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] gap-8 rounded-xl bg-card px-10 py-8 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]", + "fixed left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] rounded-xl bg-card p-10 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]", { variants: { size: { @@ -96,7 +96,7 @@ const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( -
    +
    ) DialogHeader.displayName = "DialogHeader" @@ -106,7 +106,7 @@ const DialogFooter = ({ }: React.HTMLAttributes) => (
    (({ className, ...props }, ref) => ( )) diff --git a/src/wagmiConfig/index.ts b/src/wagmiConfig/index.ts index 091d62a6ca..7673613fa1 100644 --- a/src/wagmiConfig/index.ts +++ b/src/wagmiConfig/index.ts @@ -223,3 +223,6 @@ export const wagmiConfig = createConfig({ }), ], }) + +export const COINBASE_INJECTED_WALLET_ID = "com.coinbase.wallet" +export const COINBASE_WALLET_SDK_ID = "coinbaseWalletSDK" diff --git a/tailwind.config.ts b/tailwind.config.ts index 0589da5e1d..3022a91e35 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -70,10 +70,19 @@ const config = { from: { height: "var(--radix-accordion-content-height)" }, to: { height: "0" }, }, + // Copied from our old styles.ts + "fade-in": { from: { opacity: "0" }, to: { opacity: "1" } }, + "slide-fade-in": { + from: { opacity: "0", transform: "translateY(10px)" }, + to: { opacity: "1", transform: "translateY(0px)" }, + }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", + // Copied from where we used these animations + "fade-in": "fade-in .3s .1s both", + "slide-fade-in": "fade-in .2s", }, }, }, From fc886b6fca1e019050b9dbb0f00846135c878570 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Fri, 28 Jun 2024 21:47:16 +0200 Subject: [PATCH 011/110] update package-lock --- package-lock.json | 131 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/package-lock.json b/package-lock.json index 4fa5043647..bc8700dd42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3457,6 +3457,71 @@ "react": ">=18" } }, + "node_modules/@coinbase/waas-sdk-viem": { + "version": "2.1.1", + "resolved": "https://api.developer.coinbase.com/waas/consumer/1994648a1fa8a282f1c3ca917a0379f1f79fbb06/waas-sdk-viem/waas-sdk-viem-2.1.1.tgz", + "integrity": "sha512-u0PsOIXaMwDpNrIVb6uACy8SF97cDqPQdVamW2slnE+pm0LItkZxVlVulEV4MNrfWr7vxvyM2qzPhad9Lxg9cw==", + "license": "ISC", + "peerDependencies": { + "@coinbase/waas-sdk-web": "^2.0.5", + "viem": "~1.19.1" + } + }, + "node_modules/@coinbase/waas-sdk-web": { + "version": "2.1.0", + "resolved": "https://api.developer.coinbase.com/waas/consumer/1994648a1fa8a282f1c3ca917a0379f1f79fbb06/waas-sdk-web/waas-sdk-web-2.1.0.tgz", + "integrity": "sha512-nUlhf5MmzYT1SFLnaKRQO2tRIhhONokHak1l5R9+jmSYMgyhdGl514LarXXceCL6BShZGcna6S0EcIXuEST2wA==", + "bundleDependencies": [ + "tsifrpc", + "@coinbase/corekms" + ], + "license": "ISC", + "dependencies": { + "@bugsnag/js": "^7.22.3", + "@coinbase/corekms": "0.1.9", + "client-analytics": "0.0.8", + "tsifrpc": "../utils/tsifrpc" + }, + "optionalDependencies": { + "@coinbase/cbpay-js": "^1.10.0" + } + }, + "node_modules/@coinbase/waas-sdk-web/node_modules/@coinbase/cbpay-js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@coinbase/cbpay-js/-/cbpay-js-1.10.0.tgz", + "integrity": "sha512-jQ4rqJFNbsCMZ74ATucAUv2IpkbPFXsY+6AVBvFVNKmG4rEgc10Fa87pw/idm6Tlrs7EERQRXEs21DvJpMzi8A==", + "optional": true, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "regenerator-runtime": "^0.13.9" + }, + "peerDependenciesMeta": { + "regenerator-runtime": { + "optional": true + } + } + }, + "node_modules/@coinbase/waas-sdk-web/node_modules/@coinbase/corekms": { + "version": "0.1.9", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/@coinbase/waas-sdk-web/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "optional": true, + "peer": true + }, + "node_modules/@coinbase/waas-sdk-web/node_modules/tsifrpc": { + "version": "1.1.0", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/@coinbase/wallet-sdk": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.3.tgz", @@ -9707,6 +9772,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -9852,6 +9922,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", @@ -13634,6 +13713,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -13833,6 +13920,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/client-analytics": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/client-analytics/-/client-analytics-0.0.8.tgz", + "integrity": "sha512-bpatUip8gT8y9r4GkoaIf+0TvVo/3NsSqQ61erMgjVtIfAVnWAj0H6S/IjKxQc6E2Aebj5bX8ZBMueyVj0f6Rg==", + "dependencies": { + "@types/react-router": "^5.1.20", + "md5": "^2.3.0", + "perfume.js": "^9.2.0" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -14479,6 +14576,14 @@ } } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", @@ -20680,6 +20785,16 @@ "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz", "integrity": "sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==" }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -23523,6 +23638,22 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "node_modules/perfume.js": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/perfume.js/-/perfume.js-9.4.0.tgz", + "integrity": "sha512-YYxGBYm2OcDx68GhzX/N3h4RrtViAz7Whgk7dA6j1bC9NxBGIG8c+rs+K3ql/dW4KReszN8ptAC1ghUGdWNsMQ==", + "dependencies": { + "web-vitals": "^3.5.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/perfume.js/node_modules/web-vitals": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", + "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==" + }, "node_modules/pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", From 9a94c1c8171a824024ffc32ce8f0e810eb42f387 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Sat, 29 Jun 2024 15:33:52 +0200 Subject: [PATCH 012/110] fix: proper button states in wallet selector modal --- .../WalletSelectorModal.tsx | 9 ++--- .../components/ConnectorButton.tsx | 39 +++++-------------- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx index 29e9dafde9..d6cec9d8eb 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx @@ -237,11 +237,10 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { return set.onSubmit() }} disabled={!id && !publicUserError} - // TODO - // isLoading={ - // linkAddress.isLoading || set.isLoading || (!id && !publicUserError) - // } - // loadingText={!id ? "Looking for keypairs" : "Check your wallet"} + isLoading={ + linkAddress.isLoading || set.isLoading || (!id && !publicUserError) + } + loadingText={!id ? "Looking for keypairs" : "Check your wallet"} className="mb-4 animate-fade-in" > {isAddressLink ? "Link address" : "Verify address"}{" "} diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx index 059e7647e8..884a5aacb6 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx @@ -16,26 +16,7 @@ type Props = { error: Error | null } -// const connectorButtonProps: ButtonProps = { -// w: "full", -// size: "xl", -// iconSpacing: 4, -// justifyContent: "start", -// mb: 2.5, -// sx: { -// "> div.chakra-button__spinner": { -// boxSize: 6, -// justifyContent: "center", -// }, -// }, -// } - -const ConnectorButton = ({ - connector, - pendingConnector, - connect, - error, -}: Props): JSX.Element => { +const ConnectorButton = ({ connector, pendingConnector, connect, error }: Props) => { const { isConnected, connector: activeConnector } = useAccount() const { keyPair } = useUserPublic() @@ -45,6 +26,8 @@ const ConnectorButton = ({ const addressLinkParams = useAtomValue(addressLinkParamsAtom) const setIsWalletLinkHelperModalOpen = useSetAtom(walletLinkHelperModalAtom) + if (!connector) return null + return (
    ) diff --git a/src/v2/components/Header.tsx b/src/v2/components/Header.tsx deleted file mode 100644 index 77725d1240..0000000000 --- a/src/v2/components/Header.tsx +++ /dev/null @@ -1,11 +0,0 @@ -"use client" - -import { Account } from "./Account" -import { Navigator } from "./Navigator" - -export const Header = () => ( -
    - - -
    -) diff --git a/src/v2/components/Header/Header.tsx b/src/v2/components/Header/Header.tsx new file mode 100644 index 0000000000..32c9e8d3f4 --- /dev/null +++ b/src/v2/components/Header/Header.tsx @@ -0,0 +1,13 @@ +"use client" + +import { Account } from "../Account" +import { NavMenu } from "./NavMenu" + +const Header = () => ( +
    + + +
    +) + +export { Header } diff --git a/src/v2/components/Header/NavMenu.stories.tsx b/src/v2/components/Header/NavMenu.stories.tsx new file mode 100644 index 0000000000..47d146a64f --- /dev/null +++ b/src/v2/components/Header/NavMenu.stories.tsx @@ -0,0 +1,22 @@ +import type { Meta, StoryObj } from "@storybook/react" + +import { ThemeProvider } from "next-themes" +import { NavMenu } from "./NavMenu" + +const meta: Meta = { + title: "Guild UI/NavMenu", + component: NavMenu, + decorators: [ + (Story) => ( + + + + ), + ], +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/v2/components/Header/NavMenu.tsx b/src/v2/components/Header/NavMenu.tsx new file mode 100644 index 0000000000..b2187b5cb8 --- /dev/null +++ b/src/v2/components/Header/NavMenu.tsx @@ -0,0 +1,153 @@ +"use client" + +import { + Book, + CircleWavyCheck, + Code, + DiscordLogo, + File, + House, + Info, + List, + Package, + Palette, + Shield, + UsersThree, + XLogo, +} from "@phosphor-icons/react/dist/ssr" +import dynamic from "next/dynamic" +import Link, { LinkProps } from "next/link" +import { AnchorHTMLAttributes, ReactNode } from "react" +import { ThemeToggle } from "../ThemeToggle" +import { Button } from "../ui/Button" +import { Popover, PopoverContent, PopoverTrigger } from "../ui/Popover" + +const AnimatedLogo = dynamic(() => import("components/explorer/AnimatedLogo"), { + ssr: false, + loading: () => , +}) + +export const NavMenu = () => ( + + + + + + + +
    + Theme: + +
    +
    +
    +) + +const NavGroup = ({ title, children }: { title: string; children: ReactNode }) => ( +
    + + {title} + + {children} +
    +) + +const NavButton = ({ href, children }: { href: string; children: ReactNode }) => { + const isExternal = href.startsWith("http") + const wrapperProps = { + href, + ...(!isExternal + ? ({ + passHref: true, + legacyBehavior: true, + } satisfies Partial) + : ({ + target: "_blank", + rel: "noopener", + } satisfies AnchorHTMLAttributes)), + } + + const Wrapper = isExternal ? "a" : Link + + return ( + + + + ) +} diff --git a/src/v2/components/Header/index.ts b/src/v2/components/Header/index.ts new file mode 100644 index 0000000000..1593fdce0f --- /dev/null +++ b/src/v2/components/Header/index.ts @@ -0,0 +1 @@ +export { Header } from "./Header" diff --git a/src/v2/components/Navigator.tsx b/src/v2/components/Navigator.tsx deleted file mode 100644 index 63f8f0c5b2..0000000000 --- a/src/v2/components/Navigator.tsx +++ /dev/null @@ -1,170 +0,0 @@ -"use client" - -import * as React from "react" - -import { cn } from "@/lib/utils" -import { - NavigationMenu, - NavigationMenuContent, - NavigationMenuItem, - NavigationMenuLink, - NavigationMenuList, -} from "@/components/ui/NavigationMenu" -import { - Book, - CircleWavyCheck, - Code, - DiscordLogo, - House, - Info, - Package, - Palette, - Plus, - Shield, - UsersThree, - File, List -} from "@phosphor-icons/react" -import XLogo from "static/icons/x.svg" -import GuildCastle from "components/explorer/AnimatedLogo" -import { Button, buttonVariants } from "@/components/ui/Button" -import { ThemeToggle } from "./ThemeToggle" -import Link from "next/link" - -export function Navigator() { - const [isOpen, setIsOpen] = React.useState(false); - - return ( - setIsOpen(!!value)}> - - - - -
    -
      -
    • - Navigation -
    • - - - Explore guilds - - - - Create guild - - - - Guild Pins leaderboard - - - - Guide - - - - Case studies - - - - Privacy Policy - - - - Terms of Use - -
    -
      -
    • - Other -
    • - - - Discord - - - - Twitter - - - - Code - - - - Guild SDK - - - - Team - - - - Brand kit - -
    -
    -
    - Theme: - -
    -
    -
    -
    -
    - ) -} - -const ListItem = React.forwardRef< - React.ElementRef<"a">, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( -
  • - - - {children} - - -
  • -)) diff --git a/src/v2/components/ui/NavigationMenu.tsx b/src/v2/components/ui/NavigationMenu.tsx deleted file mode 100644 index 5e48393f3a..0000000000 --- a/src/v2/components/ui/NavigationMenu.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import * as React from "react" -import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" -import { cva } from "class-variance-authority" -import { CaretDown } from "@phosphor-icons/react" - -import { cn } from "@/lib/utils" - -const NavigationMenu = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - {children} - - -)) -NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName - -const NavigationMenuList = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName - -const NavigationMenuItem = NavigationMenuPrimitive.Item - -const navigationMenuTriggerStyle = cva( - "group inline-flex h-10 w-max items-center justify-center rounded-2xl bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50" -) - -const NavigationMenuTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - {children}{" "} - -)) -NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName - -const NavigationMenuContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName - -const NavigationMenuLink = NavigationMenuPrimitive.Link - -const NavigationMenuViewport = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( -
    - -
    -)) -NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName - -const NavigationMenuIndicator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -
    - -)) -NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName - -export { - navigationMenuTriggerStyle, - NavigationMenu, - NavigationMenuList, - NavigationMenuItem, - NavigationMenuContent, - NavigationMenuTrigger, - NavigationMenuLink, - NavigationMenuIndicator, - NavigationMenuViewport, -} diff --git a/src/v2/components/ui/Popover.tsx b/src/v2/components/ui/Popover.tsx new file mode 100644 index 0000000000..0d637adb06 --- /dev/null +++ b/src/v2/components/ui/Popover.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as PopoverPrimitive from "@radix-ui/react-popover" +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverContent, PopoverTrigger } diff --git a/tailwind.config.ts b/tailwind.config.ts index 6d35afd2cf..4941d79424 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -71,6 +71,7 @@ const config = { }, card: { DEFAULT: "hsl(var(--card))", + secondary: "hsl(var(--card-secondary))", foreground: "hsl(var(--card-foreground))", }, }, From 28e9148930f70da37ab67887807fd0b6a40f5d21 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 1 Jul 2024 13:34:12 +0200 Subject: [PATCH 014/110] feat: `CopyableAddress` component --- src/v2/components/CopyableAddress.tsx | 41 +++++++++++++++++++++++++++ src/v2/components/ui/Button.tsx | 4 ++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/v2/components/CopyableAddress.tsx diff --git a/src/v2/components/CopyableAddress.tsx b/src/v2/components/CopyableAddress.tsx new file mode 100644 index 0000000000..4c2a9ddbf2 --- /dev/null +++ b/src/v2/components/CopyableAddress.tsx @@ -0,0 +1,41 @@ +import { cn } from "@/lib/utils" +import { ButtonHTMLAttributes } from "react" +import { useCopyToClipboard } from "usehooks-ts" +import shortenHex from "utils/shortenHex" +import { Button } from "./ui/Button" + +interface Props extends ButtonHTMLAttributes { + address: string + domain?: string + decimals?: number +} + +const CopyableAddress = ({ + address, + domain, + decimals = 3, + className, + ...props +}: Props): JSX.Element => { + const [copiedText, copyToClipboard] = useCopyToClipboard() + + return ( + // + + // + ) +} + +export { CopyableAddress } diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index 9a08dd9b9e..8003999f0d 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -7,7 +7,7 @@ import { CircleNotch } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" const buttonVariants = cva( - "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm ring-offset-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 rounded-xl text-base", + "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm ring-offset-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:!opacity-50 rounded-xl text-base", { variants: { variant: { @@ -25,6 +25,7 @@ const buttonVariants = cva( "destructive-ghost": "hover:bg-destructive-ghost-hover active:bg-destructive-ghost-active text-destructive-ghost-foreground", link: "text-muted-foreground underline-offset-4 hover:underline", + unstyled: "", }, size: { xs: "h-6 px-2 text-xs", @@ -66,6 +67,7 @@ const Button = React.forwardRef( ref ) => { const Comp = asChild ? Slot : "button" + return ( Date: Mon, 1 Jul 2024 15:29:27 +0200 Subject: [PATCH 015/110] fix(useGuild): use the new `usePathname` hook --- src/components/[guild]/hooks/useGuild.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/[guild]/hooks/useGuild.ts b/src/components/[guild]/hooks/useGuild.ts index 5ff3a78dd7..b4ca23e911 100644 --- a/src/components/[guild]/hooks/useGuild.ts +++ b/src/components/[guild]/hooks/useGuild.ts @@ -1,14 +1,16 @@ import useSWRWithOptionalAuth, { mutateOptionalAuthSWRKey, } from "hooks/useSWRWithOptionalAuth" +import { usePathname } from "next/navigation" import { useRouter } from "next/router" import { mutate as swrMutate, unstable_serialize, useSWRConfig } from "swr" import useSWRImmutable from "swr/immutable" import { Guild, SimpleGuild } from "types" const useGuild = (guildId?: string | number) => { - const router = useRouter() - const id = guildId ?? router.query.guild + const pathname = usePathname() + const guildFromPathname = pathname?.split("/").at(1) + const id = guildId ?? guildFromPathname const publicSWRKey = `/v2/guilds/guild-page/${id}` From e27f5add57ceae06a222fd22f95fbc2c85ac0b76 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 1 Jul 2024 15:39:43 +0200 Subject: [PATCH 016/110] fix: export `connectorButtonBaseProps` from `ConnectorButton` --- src/app/playground/page.tsx | 20 ++++++------------- .../components/ConnectorButton.tsx | 12 +++++++---- .../components/FuelConnectorButtons.tsx | 11 ++++------ 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/app/playground/page.tsx b/src/app/playground/page.tsx index 3ba92615e6..8f068c00b7 100644 --- a/src/app/playground/page.tsx +++ b/src/app/playground/page.tsx @@ -1,8 +1,7 @@ -import { Card } from "@/components/ui/Card" +import { Header } from "@/components/Header" import { Metadata } from "next" +import Link from "next/link" import { PropsWithChildren } from "react" -import { ThemeToggle } from "../../v2/components/ThemeToggle" -import { DialogExample } from "./_components/DialogExample" export const metadata: Metadata = { title: "Playground", @@ -19,20 +18,13 @@ export default function Page() { return (

    Playground

    -

    Playground

    -
    - -
    +
    -
    - This is a card -
    - -
    - -
    + + Go to explorer +
    ) diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx index 884a5aacb6..fda7daa496 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx @@ -1,4 +1,4 @@ -import { Button } from "@/components/ui/Button" +import { Button, ButtonProps } from "@/components/ui/Button" import { useUserPublic } from "components/[guild]/hooks/useUser" import useConnectorNameAndIcon from "components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon" import { addressLinkParamsAtom } from "components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton" @@ -16,6 +16,12 @@ type Props = { error: Error | null } +export const connectorButtonBaseProps = { + variant: "secondary", + size: "xl", + className: "flex w-full justify-start gap-2", +} satisfies ButtonProps + const ConnectorButton = ({ connector, pendingConnector, connect, error }: Props) => { const { isConnected, connector: activeConnector } = useAccount() @@ -30,9 +36,7 @@ const ConnectorButton = ({ connector, pendingConnector, connect, error }: Props) return ( -) diff --git a/src/v2/components/Account/Account.tsx b/src/v2/components/Account/Account.tsx new file mode 100644 index 0000000000..2631d1085c --- /dev/null +++ b/src/v2/components/Account/Account.tsx @@ -0,0 +1,65 @@ +"use client" + +import { cn } from "@/lib/utils" +import { SignIn } from "@phosphor-icons/react/dist/ssr" +import clsx from "clsx" +import useUser from "components/[guild]/hooks/useUser" +import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" +import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import useResolveAddress from "hooks/useResolveAddress" +import { useSetAtom } from "jotai" +import shortenHex from "utils/shortenHex" +import { GuildAvatar } from "../GuildAvatar" +import { Button } from "../ui/Button" +import { Card } from "../ui/Card" +import { accountModalAtom } from "./components/AccountModal" + +export const Account = () => { + const { address } = useWeb3ConnectionManager() + const setIsAccountModalOpen = useSetAtom(accountModalAtom) + const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) + + const domainName = useResolveAddress(address) + const { addresses } = useUser() + const linkedAddressesCount = (addresses?.length ?? 1) - 1 + + if (!address) + return ( + + + + ) + + return ( + + + + ) +} diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx new file mode 100644 index 0000000000..1897822dda --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -0,0 +1,127 @@ +import { CopyableAddress } from "@/components/CopyableAddress" +import { GuildAvatar } from "@/components/GuildAvatar" +import { Button } from "@/components/ui/Button" +import { + Dialog, + DialogCloseButton, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/Dialog" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { SignOut } from "@phosphor-icons/react/dist/ssr" +import useUser, { useUserPublic } from "components/[guild]/hooks/useUser" +import useConnectorNameAndIcon from "components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon" +import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import useResolveAddress from "hooks/useResolveAddress" +import { deleteKeyPairFromIdb } from "hooks/useSetKeyPair" +import { useAtom } from "jotai" +import { useAccount } from "wagmi" +import { accountModalAtom } from "." +import { AccountConnections } from "./components/AccountConnections" + +const AccountModal = () => { + const { address, type, disconnect } = useWeb3ConnectionManager() + const { connectorName } = useConnectorNameAndIcon() + + const [isOpen, setIsOpen] = useAtom(accountModalAtom) + const onClose = () => setIsOpen(false) + + const { id } = useUser() + const { deleteKeys } = useUserPublic() + + const { address: evmAddress } = useAccount() + const domain = useResolveAddress(evmAddress) + + // TODO: do we need to keep the network modal? We should check the number of "Opened network modal" PostHog events and decide if we should keep it or not. + + const handleLogout = () => { + const keysToRemove = Object.keys({ ...window.localStorage }).filter((key) => + /^dc_auth_[a-z]*$/.test(key) + ) + + keysToRemove.forEach((key) => { + window.localStorage.removeItem(key) + }) + + deleteKeyPairFromIdb(id) + ?.catch(() => {}) + .finally(() => { + setIsOpen(false) + disconnect() + deleteKeys() + }) + } + + return ( + + + + Account + + + {address ? ( + <> +
    +
    + +
    +
    + + +
    +

    + {`Connected with ${connectorName}`} +

    +
    + {/* */} +
    + + + + + + + + Disconnect + + + +
    + + + {/*
    */} + {/*TODO: */} + + ) : ( +

    Not connected

    + )} + + +
    +
    + ) +} + +export { AccountModal } diff --git a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx new file mode 100644 index 0000000000..79e5131d8d --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx @@ -0,0 +1,84 @@ +import { cn } from "@/lib/utils" +import useUser from "components/[guild]/hooks/useUser" +import useDelegateVaults from "components/common/Layout/components/Account/components/delegate/useDelegateVaults" +import rewards from "platforms/rewards" +import { ReactNode, useMemo } from "react" +import { PlatformName } from "types" +import { SocialAccount } from "./SocialAccount" + +const AccountConnections = () => { + const { isLoading, addresses, platformUsers, sharedSocials } = useUser() + const vaults = useDelegateVaults() + + const orderedSocials = useMemo(() => { + const connectedPlatforms = + platformUsers + ?.filter((platformUser) => rewards[platformUser.platformName]?.isPlatform) + ?.map((platformUser) => platformUser.platformName as string) ?? [] + const notConnectedPlatforms = Object.keys(rewards).filter( + (platform) => + rewards[platform].isPlatform && !connectedPlatforms?.includes(platform) + ) + return [...connectedPlatforms, ...notConnectedPlatforms] as PlatformName[] + }, [platformUsers]) + + return ( +
    + {/* TODO: rightElement */} + + + {orderedSocials.map((platform, i) => ( + <> + {platform === "EMAIL" ? ( + <> + ) : // + platform === "FARCASTER" ? ( + <> + ) : ( + // + + )} + {i < orderedSocials.length - 1 && ( +
    + )} + + ))} +
    + + + TODO +
    + ) +} + +const AccountSectionTitle = ({ + title, + titleRightElement, +}: { + title: string + titleRightElement?: ReactNode +}) => ( +
    + {title} + {titleRightElement} +
    +) + +const AccountSection = ({ + className, + children, +}: { + children: ReactNode + className?: string +}) => ( +
    + {children} +
    +) + +export { AccountConnections } diff --git a/src/v2/components/Account/components/AccountModal/components/DisconnectAccountButton.tsx b/src/v2/components/Account/components/AccountModal/components/DisconnectAccountButton.tsx new file mode 100644 index 0000000000..8664870e0d --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/DisconnectAccountButton.tsx @@ -0,0 +1,81 @@ +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/components/ui/AlertDialog" +import { Button, ButtonProps } from "@/components/ui/Button" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { DisclosureState } from "@/hooks/useDisclosure" +import { cn } from "@/lib/utils" +import { LinkBreak } from "@phosphor-icons/react/dist/ssr" + +const DisconnectAccountButton = ({ + onConfirm, + isLoading, + loadingText, + className, + name, + state: { isOpen, onClose, onOpen }, +}: { + onConfirm: () => void + isLoading: ButtonProps["isLoading"] + loadingText: ButtonProps["loadingText"] + className?: ButtonProps["className"] + name: string + state: DisclosureState +}) => ( + <> + {/* TODO: placement="top" hasArrow */} + + + + + + + Disconnect account + + + + + + + + {`Disconnect ${name} account`} + + {`Are you sure? This account will lose every Guild gated access on ${name}.`} + + + + Cancel + + Disconnect + + + + + +) + +export { DisconnectAccountButton } diff --git a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx new file mode 100644 index 0000000000..bbee36484c --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx @@ -0,0 +1,182 @@ +import { Button } from "@/components/ui/Button" +import { useToast } from "@/components/ui/hooks/useToast" +import { useDisclosure } from "@/hooks/useDisclosure" +import { cn } from "@/lib/utils" +import useUser from "components/[guild]/hooks/useUser" +import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" +import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" +import useDisconnect from "components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect" +import useMembership from "components/explorer/hooks/useMembership" +import { motion } from "framer-motion" +import rewards from "platforms/rewards" +import { ReactNode } from "react" +import { PlatformName } from "types" +import { DisconnectAccountButton } from "./DisconnectAccountButton" + +const SocialAccount = ({ type }: { type: PlatformName }): JSX.Element => { + const { platformUsers } = useUser() + const platformUser = platformUsers?.find( + (platform) => platform.platformName.toString() === type + ) + const isConnected = !!platformUser + + const { membership } = useMembership() + + const isReconnect = + !!membership && + membership?.roles?.some(({ requirements }) => + requirements?.some( + ({ errorType, subType }) => + errorType === "PLATFORM_CONNECT_INVALID" && subType?.toUpperCase() === type + ) + ) + + return ( + + {!isConnected ? ( + + ) : ( +
    + {isReconnect && } + +
    + )} +
    + ) +} + +const SocialAccountUI = ({ + type, + avatarUrl, + username, + isConnected, + children, +}: { + type: PlatformName + avatarUrl?: string + username?: string + isConnected?: boolean + children: ReactNode +}) => { + const { icon: IconComponent, name: platformName } = rewards[type] + const bgClassName = PLATFORM_COLORS[type] ?? "" + + return ( + +
    + {!!avatarUrl ? ( + <> + {username} +
    + +
    + + ) : ( + + )} +
    + + + {username ?? `${platformName} ${isConnected ? "connected" : ""}`} + + + {children} +
    + ) +} + +// TODO: we should move these to `rewards.ts` eventually +const PLATFORM_COLORS = { + DISCORD: "bg-discord", + TELEGRAM: "bg-telegram", + EMAIL: "bg-blue-500", + GOOGLE: "bg-blue-500", + TWITTER_V1: "bg-twitter", + TWITTER: "bg-twitter", + GITHUB: "bg-github", + POLYGON_ID: "bg-polygonid", + FARCASTER: "bg-farcaster", +} satisfies Partial> + +const ConnectPlatformButton = ({ + type, + isReconnect = false, +}: { + type: PlatformName + isReconnect?: boolean +}) => { + const { toast } = useToast() + const { triggerMembershipUpdate } = useMembershipUpdate() + + const onSuccess = () => { + toast({ + title: `Account successfully connected`, + variant: "success", + }) + triggerMembershipUpdate() + } + + const { isLoading, response, onConnect } = useConnectPlatform( + type as PlatformName, + onSuccess, + isReconnect + ) + + return ( + + ) +} + +const DisconnectPlatformButton = ({ type }: { type: PlatformName }) => { + const disclosureState = useDisclosure() + + const { onSubmit, isLoading, signLoadingText } = useDisconnect( + disclosureState.onClose + ) + const onConfirm = () => onSubmit({ platformName: type }) + const loadingText = signLoadingText ?? "Removing" + + return ( + + ) +} + +export { PLATFORM_COLORS, SocialAccount } diff --git a/src/v2/components/Account/components/AccountModal/index.ts b/src/v2/components/Account/components/AccountModal/index.ts new file mode 100644 index 0000000000..eeaddc807f --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/index.ts @@ -0,0 +1,5 @@ +import { atom } from "jotai" +import { AccountModal } from "./AccountModal" + +const accountModalAtom = atom(false) +export { AccountModal, accountModalAtom } diff --git a/src/v2/components/Account/index.ts b/src/v2/components/Account/index.ts new file mode 100644 index 0000000000..24b25af188 --- /dev/null +++ b/src/v2/components/Account/index.ts @@ -0,0 +1,3 @@ +import { Account } from "./Account" + +export { Account } diff --git a/src/v2/components/GuildAvatar.tsx b/src/v2/components/GuildAvatar.tsx index 3a5812d121..df3cc8e865 100644 --- a/src/v2/components/GuildAvatar.tsx +++ b/src/v2/components/GuildAvatar.tsx @@ -1,12 +1,13 @@ import { cn } from "@/lib/utils" import dynamic from "next/dynamic" +import { memo } from "react" import addressAvatarPairs from "static/avatars/addressAvatarPairs" interface Props extends React.HTMLAttributes { address: `0x${string}` } -const GuildAvatar = ({ address, className }: Props) => { +const GuildAvatar = memo(({ address, className }: Props) => { const Avatar = dynamic( () => import( @@ -19,6 +20,6 @@ const GuildAvatar = ({ address, className }: Props) => {
    ) -} +}) export { GuildAvatar } diff --git a/src/v2/components/Providers.tsx b/src/v2/components/Providers.tsx index 8f58ba9c53..f10c498aaa 100644 --- a/src/v2/components/Providers.tsx +++ b/src/v2/components/Providers.tsx @@ -11,6 +11,7 @@ import { SWRConfig } from "swr" import { fetcherForSWR } from "utils/fetcher" import { WagmiProvider } from "wagmi" import { wagmiConfig } from "wagmiConfig" +import { AccountModal } from "./Account/components/AccountModal" import { Toaster } from "./ui/Toaster" const queryClient = new QueryClient() @@ -32,6 +33,8 @@ export default function Providers({ children }: { children: React.ReactNode }) { {children} + + diff --git a/src/v2/hooks/useDisclosure.ts b/src/v2/hooks/useDisclosure.ts new file mode 100644 index 0000000000..1be17a9e94 --- /dev/null +++ b/src/v2/hooks/useDisclosure.ts @@ -0,0 +1,14 @@ +import { useBoolean } from "usehooks-ts" + +export function useDisclosure() { + const { value, setTrue, setFalse, toggle } = useBoolean() + + return { + isOpen: value, + onOpen: setTrue, + onClose: setFalse, + onToggle: toggle, + } +} + +export type DisclosureState = ReturnType diff --git a/tailwind.config.ts b/tailwind.config.ts index f8deefa3e0..901330cde3 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -24,6 +24,7 @@ const config = { }, colors: { border: "hsl(var(--border))", + "border-secondary": "hsl(var(--border-secondary))", input: "hsl(var(--input))", ring: "hsl(var(--ring))", background: "hsl(var(--background))", @@ -84,6 +85,25 @@ const config = { warning: "hsla(var(--toast-warning))", info: "hsla(var(--toast-info))", }, + // Platforms + discord: { + DEFAULT: "hsl(var(--discord))", + }, + telegram: { + DEFAULT: "hsl(var(--telegram))", + }, + twitter: { + DEFAULT: "hsl(var(--twitter))", + }, + github: { + DEFAULT: "hsl(var(--github))", + }, + farcaster: { + DEFAULT: "hsl(var(--farcaster))", + }, + polygonid: { + DEFAULT: "hsl(var(--polygonid))", + }, }, keyframes: { "accordion-down": { From 8502a6a427b91940ef01ff63ede688f6d0a0655e Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 2 Jul 2024 15:28:42 +0200 Subject: [PATCH 021/110] cleanup playground --- src/app/playground/page.tsx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/app/playground/page.tsx b/src/app/playground/page.tsx index 8f068c00b7..477cfaf990 100644 --- a/src/app/playground/page.tsx +++ b/src/app/playground/page.tsx @@ -1,19 +1,10 @@ import { Header } from "@/components/Header" import { Metadata } from "next" -import Link from "next/link" -import { PropsWithChildren } from "react" export const metadata: Metadata = { title: "Playground", } -const Section = ({ title, children }: PropsWithChildren<{ title: string }>) => ( -
    -

    {title}

    - {children} -
    -) - export default function Page() { return (
    @@ -21,10 +12,6 @@ export default function Page() {
    - - - Go to explorer -
    ) From 047bb7677dbdaa818b03247cd176dd5fa188eeea Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 2 Jul 2024 16:24:34 +0200 Subject: [PATCH 022/110] refactor posthog, intercom, web3 related contexts & hooks --- next.config.js | 3 + package-lock.json | 6249 ++++++++--------- package.json | 2 +- src/app/layout.tsx | 14 +- .../AddRewardButton/SelectRolePanel.tsx | 2 +- .../AddRewardButton/hooks/useAddReward.ts | 2 +- .../hooks/useAddRoleRewards.ts | 2 +- .../hooks/useCreateRequirements.ts | 2 +- .../hooks/useCreateRolePlatforms.ts | 2 +- .../hooks/useSubmitAddReward.ts | 2 +- .../AddRewardButton/useCreateTokenReward.ts | 2 +- .../EventCard/components/JoinEventButton.tsx | 2 +- .../[guild]/JoinModal/JoinModal.tsx | 6 +- .../components/CompleteCaptchaJoinStep.tsx | 2 +- .../JoinModal/components/ConnectPlatform.tsx | 2 +- .../components/ConnectPolygonIDJoinStep.tsx | 2 +- .../components/ShareSocialsCheckbox.tsx | 2 +- .../JoinModal/components/WalletAuthButton.tsx | 4 +- .../JoinModal/hooks/useConnectPlatform.ts | 4 +- .../JoinModal/hooks/useMembershipUpdate.tsx | 2 +- .../[guild]/NoPermissionToPageFallback.tsx | 6 +- .../components/SendDiscordJoinButtonModal.tsx | 2 +- .../[guild]/OngoingIssuesBanner.tsx | 2 +- src/components/[guild]/ReportGuildButton.tsx | 2 +- .../components/GuildCheckout/BuyPass.tsx | 4 +- .../MintGuildPin/Fuel/MintFuelGuildPin.tsx | 2 +- .../Fuel/MintFuelGuildPinButton.tsx | 12 +- .../Fuel/hooks/useMintFuelGuildPin.ts | 5 +- .../MintGuildPin/MintGuildPin.tsx | 2 +- .../GuildCheckout/PurchaseRequirement.tsx | 2 +- .../GuildCheckout/components/AlphaTag.tsx | 2 +- .../PaymentCurrencyPicker.tsx | 2 +- .../components/PaymentMethodButtons.tsx | 4 +- .../components/buttons/BuyAllowanceButton.tsx | 6 +- .../components/buttons/BuyButton.tsx | 2 +- .../buttons/ConnectWalletButton.tsx | 4 +- .../components/buttons/MintGuildPinButton.tsx | 14 +- .../buttons/PurchaseAllowanceButton.tsx | 6 +- .../components/buttons/PurchaseButton.tsx | 2 +- .../GuildCheckout/hooks/useMintGuildPin.tsx | 8 +- .../GuildCheckout/hooks/usePayFee.ts | 2 +- .../GuildCheckout/hooks/usePurchaseAsset.ts | 2 +- .../HiddenRequirementAccessIndicator.tsx | 6 +- .../components/RequirementAccessIndicator.tsx | 6 +- .../RequirementDisplayComponent.tsx | 2 +- .../AccessIndicator/AccessIndicator.tsx | 2 +- .../AddRoleRewardModal/SelectRewardPanel.tsx | 2 +- .../CreateNftForm/hooks/useCreateNft.ts | 4 +- src/components/[guild]/Tabs/GuildTabs.tsx | 2 +- .../[guild]/activity/ActivityLogContext.tsx | 2 +- .../claim-poap/components/ClaimPoapButton.tsx | 10 +- .../components/CollectNftButton.tsx | 14 +- .../[guild]/collect/hooks/useCollectNft.ts | 8 +- src/components/[guild]/crm/useMembers.tsx | 2 +- src/components/[guild]/hooks/useUser.ts | 116 +- .../LeaderboardAirdropFallbackCard.tsx | 2 +- src/components/_app/IntercomProvider.tsx | 64 +- src/components/_app/LegacyPostHogProvider.tsx | 47 + .../_app/LegacyWeb3ConnectionManager.tsx | 21 + .../Web3ConnectionManager.tsx | 49 - .../_app/Web3ConnectionManager/index.ts | 3 - .../DiscordGuildSetup/DiscordGuildSetup.tsx | 2 +- .../ServerSetupCard/ServerSetupCard.tsx | 4 +- .../GoogleGuildSetup/GoogleGuildSetup.tsx | 4 +- .../Layout/components/Account/Account.tsx | 17 +- .../components/AccountModal/AccountModal.tsx | 173 - .../components/LinkAddressButton.tsx | 18 +- .../AccountModal/components/LinkedAddress.tsx | 2 +- .../SocialAccount/FarcasterProfile.tsx | 2 +- .../UsersGuildCredentials/GuildPin.tsx | 2 +- .../UsersGuildCredentials/UsersGuildPins.tsx | 2 +- .../Account/components/AccountModal/index.ts | 6 - .../Notifications/Notifications.tsx | 4 +- .../create-guild/CreateGuildButton.tsx | 4 +- .../components/PlatformSelectButton.tsx | 12 +- .../create-guild/hooks/useCreateGuild.tsx | 2 +- .../create-guild/hooks/useCreateRole.tsx | 2 +- src/components/explorer/ExploreAllGuilds.tsx | 2 +- src/components/explorer/YourGuilds.tsx | 4 +- .../explorer/hooks/useMembership.ts | 2 +- src/hooks/useCreateRRR.tsx | 2 +- src/hooks/useCustomPosthogEvents.ts | 2 +- src/hooks/useFetcherWithSign.ts | 4 +- src/hooks/useGateables.ts | 3 +- src/hooks/useOAuthResultToast.ts | 2 +- src/hooks/useSWRWithOptionalAuth.ts | 4 +- src/hooks/useSetKeyPair.ts | 21 +- src/hooks/useSubmit/useSubmit.ts | 47 +- src/hooks/useUsersGuildPins.ts | 4 +- src/pages/[guild]/claim-poap/[fancyId].tsx | 2 +- .../[guild]/collect/[chain]/[address].tsx | 2 +- src/pages/[guild]/index.tsx | 2 +- src/pages/[guild]/leaderboard/[pointsId].tsx | 2 +- src/pages/_app.tsx | 8 +- src/pages/_error.tsx | 3 +- src/pages/oauth.tsx | 2 +- .../ContractCall/ContractCallCardMenu.tsx | 2 +- .../ContractCall/ContractCallReward.tsx | 2 +- .../ContractCallRewardCardButton.tsx | 2 +- src/platforms/Token/EditTokenModal.tsx | 6 +- src/platforms/Token/GeogatedCountryAlert.tsx | 2 +- src/platforms/Token/hooks/useCollectToken.tsx | 2 +- src/platforms/Token/hooks/useFundPool.tsx | 2 +- src/platforms/Token/hooks/useRegisterPool.tsx | 2 +- src/platforms/Token/hooks/useWithdrawPool.tsx | 2 +- .../hooks/useRegisterVault.ts | 2 +- src/utils/fetcher.ts | 2 +- src/utils/intercom.ts | 58 + src/utils/keyPair.ts | 22 + .../Fuel => utils}/parseFuelAddress.ts | 2 +- src/v2/components/Account/Account.tsx | 10 +- .../components/AccountModal/AccountModal.tsx | 21 +- .../Account/components/AccountModal/index.ts | 4 +- src/v2/components/NavigationEvents.tsx | 16 - .../components/Providers/PostHogPageViews.tsx | 25 + .../components/Providers}/PostHogProvider.tsx | 58 +- .../components/{ => Providers}/Providers.tsx | 37 +- src/v2/components/Providers/index.ts | 3 + src/v2/components/ThemeToggle.tsx | 2 +- .../PlatformMergeErrorAlert.tsx | 2 +- .../WalletLinkHelperModal.tsx | 5 +- .../WalletSelectorModal.tsx | 29 +- .../components/AccountButton.tsx | 2 +- .../components/ConnectorButton.tsx | 10 +- .../components/FuelConnectorButtons.tsx | 2 +- .../GoogleLoginButton/GoogleLoginButton.tsx | 0 .../components/ExportWaaSModal.tsx | 2 +- .../GoogleLoginButton/hooks/useDriveOAuth.ts | 0 .../components/GoogleLoginButton/index.ts | 0 .../GoogleLoginButton/utils/googleDrive.ts | 0 .../components/GoogleTerms.tsx | 0 .../hooks/useIsWalletConnectModalActive.ts | 0 .../hooks/useLinkAddress.ts | 10 +- .../WalletSelectorModal/index.ts | 3 - .../utils/processConnectionError.ts | 0 .../Web3ConnectionManager.tsx | 34 + .../hooks/useConnectFromLocalStorage.ts | 7 +- .../hooks/useConnectorNameAndIcon.ts | 0 .../hooks/useTriggerWalletSelectorModal.ts | 16 + .../hooks/useWeb3ConnectionManager.ts | 42 +- .../components/Web3ConnectionManager/index.ts | 3 + .../hooks/useAutoReconnect.ts | 0 src/v2/hooks/useUserPublic.ts | 111 + 143 files changed, 3483 insertions(+), 4216 deletions(-) create mode 100644 src/components/_app/LegacyPostHogProvider.tsx create mode 100644 src/components/_app/LegacyWeb3ConnectionManager.tsx delete mode 100644 src/components/_app/Web3ConnectionManager/Web3ConnectionManager.tsx delete mode 100644 src/components/_app/Web3ConnectionManager/index.ts delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/AccountModal.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/index.ts create mode 100644 src/utils/intercom.ts create mode 100644 src/utils/keyPair.ts rename src/{components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel => utils}/parseFuelAddress.ts (73%) delete mode 100644 src/v2/components/NavigationEvents.tsx create mode 100644 src/v2/components/Providers/PostHogPageViews.tsx rename src/{components/_app => v2/components/Providers}/PostHogProvider.tsx (71%) rename src/v2/components/{ => Providers}/Providers.tsx (54%) create mode 100644 src/v2/components/Providers/index.ts rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/PlatformMergeErrorAlert.tsx (98%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletLinkHelperModal.tsx (93%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/WalletSelectorModal.tsx (93%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/AccountButton.tsx (81%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/ConnectorButton.tsx (83%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/FuelConnectorButtons.tsx (97%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx (100%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx (99%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts (100%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/GoogleLoginButton/index.ts (100%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/GoogleLoginButton/utils/googleDrive.ts (100%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/components/GoogleTerms.tsx (100%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/hooks/useIsWalletConnectModalActive.ts (100%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/hooks/useLinkAddress.ts (90%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/index.ts (53%) rename src/{components/_app/Web3ConnectionManager/components => v2/components/Web3ConnectionManager}/WalletSelectorModal/utils/processConnectionError.ts (100%) create mode 100644 src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx rename src/{components/_app => v2/components}/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts (86%) rename src/{components/_app => v2/components}/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts (100%) create mode 100644 src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts rename src/{components/_app => v2/components}/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts (55%) create mode 100644 src/v2/components/Web3ConnectionManager/index.ts rename src/{components/_app/Web3ConnectionManager => v2}/hooks/useAutoReconnect.ts (100%) create mode 100644 src/v2/hooks/useUserPublic.ts diff --git a/next.config.js b/next.config.js index df0acc8bf7..0b264e80d3 100644 --- a/next.config.js +++ b/next.config.js @@ -21,6 +21,9 @@ const nextConfig = { ], }) + // To get rid of "Can't resolve ..." errors which come from some wallet connector SDKs + config.externals.push("pino-pretty", "lokijs", "encoding") + if (process.env.VERCEL_ENV === "production") { if (!config.plugins) config.plugins = [] config.plugins.push( diff --git a/package-lock.json b/package-lock.json index 086bd44359..7175a8df1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "@web3inbox/react": "^1.1.0", "@zag-js/combobox": "^0.16.0", "@zag-js/react": "^0.16.0", - "chakra-react-select": "^4.7.6", + "chakra-react-select": "4.7.6", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "color": "^4.2.3", @@ -2157,6 +2157,114 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/register/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/register/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/register/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", @@ -2295,6 +2403,12 @@ "bugsnag-source-maps": "bin/cli" } }, + "node_modules/@bugsnag/source-maps/node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, "node_modules/@bugsnag/source-maps/node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -3521,37 +3635,10 @@ "yarn": ">=1.22.18" } }, - "node_modules/@chromatic-com/storybook/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@coinbase/wallet-sdk": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.3.tgz", - "integrity": "sha512-y/OGEjlvosikjfB+wk+4CVb9OxD1ob9cidEBLI5h8Hxaf/Qoob2XoVT1uvhtAzBx34KpGYSd+alKvh/GCRre4Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.0.4.tgz", + "integrity": "sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==", "dependencies": { "buffer": "^6.0.3", "clsx": "^1.2.1", @@ -3622,6 +3709,21 @@ "node": ">= 0.12" } }, + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@cypress/xvfb": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", @@ -3691,6 +3793,15 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", @@ -3825,9 +3936,9 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -3840,9 +3951,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -3855,9 +3966,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -3870,9 +3981,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -3885,9 +3996,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -3900,9 +4011,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -3915,9 +4026,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -3930,9 +4041,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -3945,9 +4056,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -3960,9 +4071,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -3975,9 +4086,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -3990,9 +4101,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -4005,9 +4116,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -4020,9 +4131,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -4035,9 +4146,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -4050,9 +4161,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -4080,9 +4191,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -4095,9 +4206,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -4110,9 +4221,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -4125,9 +4236,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -4140,9 +4251,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -4155,9 +4266,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -4185,9 +4296,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -4744,25 +4855,20 @@ "dev": true }, "node_modules/@floating-ui/core": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.3.tgz", - "integrity": "sha512-1ZpCvYf788/ZXOhRQGFxnYQOVgeU+pi0i+d0Ow34La7qjIXETi6RNswGVKkA6KcDO8/+Ysu2E/CeUmmeEBDvTg==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz", + "integrity": "sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==", "dependencies": { - "@floating-ui/utils": "^0.2.3" + "@floating-ui/utils": "^0.2.4" } }, - "node_modules/@floating-ui/core/node_modules/@floating-ui/utils": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.3.tgz", - "integrity": "sha512-XGndio0l5/Gvd6CLIABvsav9HHezgDFFhDfHk1bvLfr9ni8dojqLSvBbotJEjmIwNHL7vK4QzBJTdBRoB+c1ww==" - }, "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.7.tgz", + "integrity": "sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.4" } }, "node_modules/@floating-ui/react-dom": { @@ -4778,9 +4884,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", + "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" }, "node_modules/@fuel-ts/abi-coder": { "version": "0.89.2", @@ -4799,6 +4905,17 @@ "node": "^18.18.2 || ^20.0.0" } }, + "node_modules/@fuel-ts/abi-coder/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@fuel-ts/abi-typegen": { "version": "0.89.2", "resolved": "https://registry.npmjs.org/@fuel-ts/abi-typegen/-/abi-typegen-0.89.2.tgz", @@ -5096,22 +5213,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@fuel-ts/versions/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@fuel-ts/versions/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/@fuel-ts/versions/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5433,6 +5534,56 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz", + "integrity": "sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz", + "integrity": "sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.2" + } + }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz", @@ -5454,6 +5605,366 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz", + "integrity": "sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz", + "integrity": "sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz", + "integrity": "sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz", + "integrity": "sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz", + "integrity": "sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz", + "integrity": "sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz", + "integrity": "sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz", + "integrity": "sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz", + "integrity": "sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz", + "integrity": "sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.31", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.2" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz", + "integrity": "sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz", + "integrity": "sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.2" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz", + "integrity": "sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.2" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz", + "integrity": "sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.1.1" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz", + "integrity": "sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz", + "integrity": "sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -5470,17 +5981,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -5497,20 +5997,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -5623,24 +6109,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6130,14 +6598,14 @@ } }, "node_modules/@metamask/sdk": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.26.3.tgz", - "integrity": "sha512-DM4BFPr1BDAIhTz7/RWb3oWQRvX79TJVZH8EL/Ljp+CRY7IjCbaVwaLdyQjVd8Doyq1V7AL4N/JjXplpo2YyYg==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.26.4.tgz", + "integrity": "sha512-9Yh41KJkD9RhW0lRijnQzPV0ptblLorLdTsf5GnAl3yE72QIfaPBtsDxzLtX+0QLppiFfj7o8vRBYvBApG9k+Q==", "dependencies": { "@metamask/onboarding": "^1.0.1", "@metamask/providers": "^15.0.0", - "@metamask/sdk-communication-layer": "0.26.2", - "@metamask/sdk-install-modal-web": "0.26.0", + "@metamask/sdk-communication-layer": "0.26.4", + "@metamask/sdk-install-modal-web": "0.26.4", "@types/dom-screen-wake-lock": "^1.0.0", "bowser": "^2.9.0", "cross-fetch": "^4.0.0", @@ -6145,7 +6613,7 @@ "eciesjs": "^0.3.15", "eth-rpc-errors": "^4.0.3", "eventemitter2": "^6.4.7", - "i18next": "22.5.1", + "i18next": "23.11.5", "i18next-browser-languagedetector": "7.1.0", "obj-multiplex": "^1.0.0", "pump": "^3.0.0", @@ -6171,14 +6639,14 @@ } }, "node_modules/@metamask/sdk-communication-layer": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.26.2.tgz", - "integrity": "sha512-YMqwjhCZ4sXYAsEp1LxLrZZycBwpUeEsA4yIx48m1yW9sZ8pv3NGnbjM+F0zf29DLjyqLxJdxHJ7b5YkgtB26g==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.26.4.tgz", + "integrity": "sha512-+X4GEc5mV1gWK4moSswVlKsUh+RsA48qPlkxBLTUxQODSnyBe0TRMxE6mH+bSrfponnTzvBkGUXyEjvDwDjDHw==", "dependencies": { "bufferutil": "^4.0.8", "date-fns": "^2.29.3", "debug": "^4.3.4", - "utf-8-validate": "^6.0.3", + "utf-8-validate": "^5.0.2", "uuid": "^8.3.2" }, "peerDependencies": { @@ -6189,18 +6657,29 @@ "socket.io-client": "^4.5.1" } }, + "node_modules/@metamask/sdk-communication-layer/node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/@metamask/sdk-install-modal-web": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.26.0.tgz", - "integrity": "sha512-LyDQFIsWWyU0ZgZR3O9LzRqKzXcYUEGJRCNfb26IjFOquvmQosbhQV0jDNlVa8Tk2Fg4ykTPoaauANh6sVJYVQ==", + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.26.4.tgz", + "integrity": "sha512-7Cx7ZsaExbMwghlRrUWWI0Ksg0m7K60LtMjfuDpjvjWqoZa9MoPxitGDEXNbLaqvKn39ebPvNcPzQ6czA4ilTw==", "dependencies": { "qr-code-styling": "^1.6.0-rc.1" }, "peerDependencies": { - "i18next": "22.5.1", + "i18next": "23.2.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.2.2", "react-native": "*" }, "peerDependenciesMeta": { @@ -6215,6 +6694,31 @@ } } }, + "node_modules/@metamask/sdk/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@metamask/sdk/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/@metamask/sdk/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6260,24 +6764,6 @@ "node": ">=12" } }, - "node_modules/@metamask/sdk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@metamask/sdk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/@metamask/sdk/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -6295,6 +6781,28 @@ "node": ">=8" } }, + "node_modules/@metamask/sdk/node_modules/i18next": { + "version": "23.11.5", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz", + "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/@metamask/sdk/node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", @@ -6313,23 +6821,44 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/@metamask/sdk/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@metamask/sdk/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, "node_modules/@metamask/sdk/node_modules/react-native": { - "version": "0.74.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.2.tgz", - "integrity": "sha512-EBMBjPPL4/GjHMP4NqsZabT3gI5WU9cSmduABGAGrd8uIcmTZ5F2Ng9k6gFmRm7n8e8CULxDNu98ZpQfBjl7Bw==", + "version": "0.74.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.3.tgz", + "integrity": "sha512-UFutCC6WEw6HkxlcpQ2BemKqi0JkwrgDchYB5Svi8Sp4Xwt4HA6LGEjNQgZ+3KM44bjyFRpofQym0uh0jACGng==", "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "13.6.8", - "@react-native-community/cli-platform-android": "13.6.8", - "@react-native-community/cli-platform-ios": "13.6.8", - "@react-native/assets-registry": "0.74.84", - "@react-native/codegen": "0.74.84", - "@react-native/community-cli-plugin": "0.74.84", - "@react-native/gradle-plugin": "0.74.84", - "@react-native/js-polyfills": "0.74.84", - "@react-native/normalize-colors": "0.74.84", - "@react-native/virtualized-lists": "0.74.84", + "@react-native-community/cli": "13.6.9", + "@react-native-community/cli-platform-android": "13.6.9", + "@react-native-community/cli-platform-ios": "13.6.9", + "@react-native/assets-registry": "0.74.85", + "@react-native/codegen": "0.74.85", + "@react-native/community-cli-plugin": "0.74.85", + "@react-native/gradle-plugin": "0.74.85", + "@react-native/js-polyfills": "0.74.85", + "@react-native/normalize-colors": "0.74.85", + "@react-native/virtualized-lists": "0.74.85", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", @@ -6387,9 +6916,9 @@ } }, "node_modules/@metamask/sdk/node_modules/react-native/node_modules/@react-native/virtualized-lists": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.84.tgz", - "integrity": "sha512-XcV+qdqt2WihaY4iRm/M1FdSy+18lecU9mRXNmy9YK8g9Th/8XbNtmmKI0qWBx3KxyuXMH/zd0ps05YTrX16kw==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.85.tgz", + "integrity": "sha512-jx2Zw0qlZteoQ+0KxRc7s4drsljLBEP534FaNZ950e9+CN9nVkLsV6rigcTjDR8wjKMSBWhKf0C0C3egYz7Ehg==", "peer": true, "dependencies": { "invariant": "^2.2.4", @@ -6424,6 +6953,18 @@ "loose-envify": "^1.1.0" } }, + "node_modules/@metamask/sdk/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@metamask/sdk/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6499,9 +7040,9 @@ } }, "node_modules/@metamask/superstruct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.0.0.tgz", - "integrity": "sha512-TOm+Lt/lCJk9j/3QT2LucrPewRmqI7/GKT+blK2IIOAkBMS+9TmeNjd2Y+TlfpSSYstaYsGZyz1XwpiTCg6RLA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@metamask/superstruct/-/superstruct-3.1.0.tgz", + "integrity": "sha512-N08M56HdOgBfRKkrgCMZvQppkZGcArEop3kixNEtVbJKm6P9Cfg0YkI6X0s1g78sNrj2fWUwvJADdZuzJgFttA==", "engines": { "node": ">=16.0.0" } @@ -6559,11 +7100,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/animation/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@motionone/dom": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.18.0.tgz", @@ -6577,11 +7113,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/dom/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@motionone/easing": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz", @@ -6591,11 +7122,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/easing/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@motionone/generators": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz", @@ -6606,11 +7132,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/generators/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@motionone/svelte": { "version": "10.16.4", "resolved": "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.4.tgz", @@ -6620,11 +7141,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/svelte/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@motionone/types": { "version": "10.17.1", "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz", @@ -6640,11 +7156,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/utils/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@motionone/vue": { "version": "10.16.4", "resolved": "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz", @@ -6655,11 +7166,6 @@ "tslib": "^2.3.1" } }, - "node_modules/@motionone/vue/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@ndelangen/get-tarball": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", @@ -6693,6 +7199,70 @@ "glob": "10.3.10" } }, + "node_modules/@next/eslint-plugin-next/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.4", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz", @@ -6829,9 +7399,9 @@ } }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dependencies": { "@noble/hashes": "1.4.0" }, @@ -6934,6 +7504,25 @@ "@parcel/watcher-win32-x64": "2.4.1" } }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", @@ -6953,6 +7542,139 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@parcel/watcher-wasm": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz", @@ -6978,6 +7700,63 @@ "inBundle": true, "license": "MIT" }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@parcel/watcher/node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -6998,10 +7777,9 @@ } }, "node_modules/@phosphor-icons/react": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.6.tgz", - "integrity": "sha512-F963SJvCTk0Qm5SRTSHXP8bCIYgMAbSVZ73f5DoxjP2iG/yAzRdySzbs9kVPETYxvr0zwTY4DUTqUjB3vr8sVw==", - "license": "MIT", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz", + "integrity": "sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==", "engines": { "node": ">=10" }, @@ -7067,40 +7845,6 @@ } } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -7115,25 +7859,6 @@ "node": ">=8.9.0" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -7219,7 +7944,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0", "@radix-ui/react-context": "1.1.0", @@ -7328,16 +8052,10 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@radix-ui/react-direction": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", - "license": "MIT", "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -7489,11 +8207,6 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@radix-ui/react-popper": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", @@ -7597,7 +8310,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-collection": "1.1.0", @@ -7628,7 +8340,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.0" }, @@ -7679,7 +8390,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-primitive": "2.0.0", @@ -7704,7 +8414,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz", "integrity": "sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==", - "license": "MIT", "dependencies": { "@radix-ui/primitive": "1.1.0", "@radix-ui/react-context": "1.1.0", @@ -7886,19 +8595,19 @@ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" }, "node_modules/@react-native-community/cli": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.8.tgz", - "integrity": "sha512-0lRdgLNaXixWY4BfFRl1J6Ao9Lapo2z+++iE7TD4GAbuxOWJSyFi+KUA8XNfSDyML4jFO02MZgyBPxAWdaminQ==", - "peer": true, - "dependencies": { - "@react-native-community/cli-clean": "13.6.8", - "@react-native-community/cli-config": "13.6.8", - "@react-native-community/cli-debugger-ui": "13.6.8", - "@react-native-community/cli-doctor": "13.6.8", - "@react-native-community/cli-hermes": "13.6.8", - "@react-native-community/cli-server-api": "13.6.8", - "@react-native-community/cli-tools": "13.6.8", - "@react-native-community/cli-types": "13.6.8", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz", + "integrity": "sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-clean": "13.6.9", + "@react-native-community/cli-config": "13.6.9", + "@react-native-community/cli-debugger-ui": "13.6.9", + "@react-native-community/cli-doctor": "13.6.9", + "@react-native-community/cli-hermes": "13.6.9", + "@react-native-community/cli-server-api": "13.6.9", + "@react-native-community/cli-tools": "13.6.9", + "@react-native-community/cli-types": "13.6.9", "chalk": "^4.1.2", "commander": "^9.4.1", "deepmerge": "^4.3.0", @@ -7917,12 +8626,12 @@ } }, "node_modules/@react-native-community/cli-clean": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.8.tgz", - "integrity": "sha512-B1uxlm1N4BQuWFvBL3yRl3LVvydjswsdbTi7tMrHMtSxfRio1p9HjcmDzlzKco09Y+8qBGgakm3jcMZGLbhXQQ==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz", + "integrity": "sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==", "peer": true, "dependencies": { - "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-tools": "13.6.9", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2" @@ -7959,59 +8668,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-clean/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@react-native-community/cli-clean/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native-community/cli-clean/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8021,15 +8677,6 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-clean/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@react-native-community/cli-clean/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8043,12 +8690,12 @@ } }, "node_modules/@react-native-community/cli-config": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.8.tgz", - "integrity": "sha512-RabCkIsWdP4Ex/sf1uSP9qxc30utm+0uIJAjrZkNQynm7T4Lyqn/kT3LKm4yM6M0Qk61YxGguiaXF4601vAduw==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.9.tgz", + "integrity": "sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==", "peer": true, "dependencies": { - "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-tools": "13.6.9", "chalk": "^4.1.2", "cosmiconfig": "^5.1.0", "deepmerge": "^4.3.0", @@ -8096,24 +8743,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -8199,25 +8828,25 @@ } }, "node_modules/@react-native-community/cli-debugger-ui": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.8.tgz", - "integrity": "sha512-2cS+MX/Su6sVSjqpDftFOXbK7EuPg98xzsPkdPhkQnkZwvXqodK9CAMuDMbx3lBHHtrPrpMbBCpFmPN8iVOnlA==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz", + "integrity": "sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==", "peer": true, "dependencies": { "serve-static": "^1.13.1" } }, "node_modules/@react-native-community/cli-doctor": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.8.tgz", - "integrity": "sha512-/3Vdy9J3hyiu0y3nd/CU3kBqPlTRxnLXg7V6jrA1jbTOlZAMyV9imEkrqEaGK0SMOyMhh9Pipf98Ozhk0Nl4QA==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz", + "integrity": "sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==", "peer": true, "dependencies": { - "@react-native-community/cli-config": "13.6.8", - "@react-native-community/cli-platform-android": "13.6.8", - "@react-native-community/cli-platform-apple": "13.6.8", - "@react-native-community/cli-platform-ios": "13.6.8", - "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-config": "13.6.9", + "@react-native-community/cli-platform-android": "13.6.9", + "@react-native-community/cli-platform-apple": "13.6.9", + "@react-native-community/cli-platform-ios": "13.6.9", + "@react-native-community/cli-tools": "13.6.9", "chalk": "^4.1.2", "command-exists": "^1.2.8", "deepmerge": "^4.3.0", @@ -8272,59 +8901,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@react-native-community/cli-doctor/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native-community/cli-doctor/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8334,15 +8910,6 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@react-native-community/cli-doctor/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -8392,13 +8959,13 @@ } }, "node_modules/@react-native-community/cli-hermes": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.8.tgz", - "integrity": "sha512-lZi/OBFuZUj5cLK94oEgtrtmxGoqeYVRcnHXl/R5c4put9PDl+qH2bEMlGZkFiw57ae3UZKr3TMk+1s4jh3FYQ==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz", + "integrity": "sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==", "peer": true, "dependencies": { - "@react-native-community/cli-platform-android": "13.6.8", - "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-platform-android": "13.6.9", + "@react-native-community/cli-tools": "13.6.9", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6" } @@ -8434,24 +9001,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-hermes/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/@react-native-community/cli-hermes/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8474,12 +9023,12 @@ } }, "node_modules/@react-native-community/cli-platform-android": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.8.tgz", - "integrity": "sha512-vWrqeLRRTwp2kO33nbrAgbYn8HR2c2CpIfyVJY9Ckk7HGUSwDyxdcSu7YBvt2ShdfLZH0HctWFNXsgGrfg6BDw==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz", + "integrity": "sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==", "peer": true, "dependencies": { - "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-tools": "13.6.9", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2", @@ -8518,59 +9067,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native-community/cli-platform-android/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8580,15 +9076,6 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-platform-android/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@react-native-community/cli-platform-android/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8602,12 +9089,12 @@ } }, "node_modules/@react-native-community/cli-platform-apple": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.8.tgz", - "integrity": "sha512-1JPohnlXPqU44zns3ALEzIbH2cKRw6JtEDJERgLuEUbs2r2NeJgqDbKyZ7fTTO8o+pegDnn6+Rr7qGVVOuUzzg==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz", + "integrity": "sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==", "peer": true, "dependencies": { - "@react-native-community/cli-tools": "13.6.8", + "@react-native-community/cli-tools": "13.6.9", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-glob": "^3.3.2", @@ -8646,60 +9133,110 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@react-native-community/cli-platform-apple/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "peer": true, "dependencies": { - "color-name": "~1.1.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true + "node_modules/@react-native-community/cli-platform-ios": { + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz", + "integrity": "sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==", + "peer": true, + "dependencies": { + "@react-native-community/cli-platform-apple": "13.6.9" + } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@react-native-community/cli-server-api": { + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz", + "integrity": "sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==", "peer": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@react-native-community/cli-debugger-ui": "13.6.9", + "@react-native-community/cli-tools": "13.6.9", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^6.2.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">= 10.14.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@react-native-community/cli-server-api/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/has-flag": { + "node_modules/@react-native-community/cli-server-api/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -8708,16 +9245,28 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, "engines": { - "node": ">=10.17.0" + "node": ">= 10" } }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/supports-color": { + "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/@react-native-community/cli-server-api/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -8729,32 +9278,6 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.8.tgz", - "integrity": "sha512-/IIcIRM8qaoD7iZqsvtf6Qq1AwtChWYfB9sTn3mTiolZ5Zd5bXH37g+6liPfAICRkj2Ptq3iXmjrDVUQAxrOXw==", - "peer": true, - "dependencies": { - "@react-native-community/cli-platform-apple": "13.6.8" - } - }, - "node_modules/@react-native-community/cli-server-api": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.8.tgz", - "integrity": "sha512-Lx664oWTzpVfbKUTy+3GIX7e+Mt5Zn+zdkM4ehllNdik/lbB3tM9Nrg8PSvOfI+tTXs2w55+nIydLfH+0FqJVg==", - "peer": true, - "dependencies": { - "@react-native-community/cli-debugger-ui": "13.6.8", - "@react-native-community/cli-tools": "13.6.8", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.2" - } - }, "node_modules/@react-native-community/cli-server-api/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", @@ -8765,9 +9288,9 @@ } }, "node_modules/@react-native-community/cli-tools": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.8.tgz", - "integrity": "sha512-1MYlae9EkbjC7DBYOGMH5xF9yDoeNYUKgEdDjL6WAUBoF2gtwiZPM6igLKi/+dhb5sCtC7fiLrLi0Oevdf+RmQ==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz", + "integrity": "sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==", "peer": true, "dependencies": { "appdirsjs": "^1.2.4", @@ -8814,59 +9337,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli-tools/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@react-native-community/cli-tools/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native-community/cli-tools/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8876,15 +9346,6 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-tools/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -8894,6 +9355,18 @@ "node": ">=4" } }, + "node_modules/@react-native-community/cli-tools/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@react-native-community/cli-tools/node_modules/open": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", @@ -8931,9 +9404,9 @@ } }, "node_modules/@react-native-community/cli-types": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.8.tgz", - "integrity": "sha512-C4mVByy0i+/NPuPhdMLBR7ubEVkjVS1VwoQu/BoG1crJFNE+167QXAzH01eFbXndsjZaMWmD4Gerx7TYc6lHfA==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.9.tgz", + "integrity": "sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==", "peer": true, "dependencies": { "joi": "^17.2.1" @@ -8970,24 +9443,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native-community/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native-community/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/@react-native-community/cli/node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -8997,29 +9452,6 @@ "node": "^12.20.0 || >=14" } }, - "node_modules/@react-native-community/cli/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/@react-native-community/cli/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9047,18 +9479,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/@react-native-community/cli/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native-community/cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9068,15 +9488,6 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@react-native-community/cli/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -9159,30 +9570,30 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.84.tgz", - "integrity": "sha512-dzUhwyaX04QosWZ8zyaaNB/WYZIdeDN1lcpfQbqiOhZJShRH+FLTDVONE/dqlMQrP+EO7lDqF0RrlIt9lnOCQQ==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.85.tgz", + "integrity": "sha512-59YmIQxfGDw4aP9S/nAM+sjSFdW8fUP6fsqczCcXgL2YVEjyER9XCaUT0J1K+PdHep8pi05KUgIKUds8P3jbmA==", "peer": true, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.84.tgz", - "integrity": "sha512-UR4uiii5szIJA84mSC6GJOfYKDq7/ThyetOQT62+BBcyGeHVtHlNLNRzgaMeLqIQaT8Fq4pccMI+7QqLOMXzdw==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.85.tgz", + "integrity": "sha512-48TSDclRB5OMXiImiJkLxyCfRyLsqkCgI8buugCZzvXcYslfV7gCvcyFyQldtcOmerV+CK4RAj7QS4hmB5Mr8Q==", "peer": true, "dependencies": { - "@react-native/codegen": "0.74.84" + "@react-native/codegen": "0.74.85" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.84.tgz", - "integrity": "sha512-WUfu6Y4aGuVdocQZvx33BJiQWFH6kRCHYbZfBn2psgFrSRLgQWEQrDCxqPFObNAVSayM0rNhp2FvI5K/Eyeqlg==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.85.tgz", + "integrity": "sha512-yMHUlN8INbK5BBwiBuQMftdWkpm1IgCsoJTKcGD2OpSgZhwwm8RUSvGhdRMzB2w7bsqqBmaEMleGtW6aCR7B9w==", "peer": true, "dependencies": { "@babel/core": "^7.20.0", @@ -9225,7 +9636,7 @@ "@babel/plugin-transform-typescript": "^7.5.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.74.84", + "@react-native/babel-plugin-codegen": "0.74.85", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -9237,9 +9648,9 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.84.tgz", - "integrity": "sha512-0hXlnu9i0o8v+gXKQi+x6T471L85kCDwW4WrJiYAeOheWrQdNNW6rC3g8+LL7HXAf7QcHGU/8/d57iYfdVK2BQ==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.85.tgz", + "integrity": "sha512-N7QwoS4Hq/uQmoH83Ewedy6D0M7xbQsOU3OMcQf0eY3ltQ7S2hd9/R4UTalQWRn1OUJfXR6OG12QJ4FStKgV6Q==", "peer": true, "dependencies": { "@babel/parser": "^7.20.0", @@ -9257,6 +9668,49 @@ "@babel/preset-env": "^7.1.6" } }, + "node_modules/@react-native/codegen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native/codegen/node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native/codegen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@react-native/codegen/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9278,6 +9732,48 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@react-native/codegen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/codegen/node_modules/jscodeshift": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", + "peer": true, + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, "node_modules/@react-native/codegen/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -9290,16 +9786,52 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/@react-native/codegen/node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "peer": true, + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@react-native/codegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-native/codegen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.84.tgz", - "integrity": "sha512-GBKE+1sUh86fS2XXV46gMCNHMc1KetshMbYJ0AhDhldpaILZHqRBX50mdVsiYVvkzp4QjM0nmYqefuJ9NVwicQ==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.85.tgz", + "integrity": "sha512-ODzND33eA2owAY3g9jgCdqB+BjAh8qJ7dvmSotXgrgDYr3MJMpd8gvHTIPe2fg4Kab+wk8uipRhrE0i0RYMwtQ==", "peer": true, "dependencies": { - "@react-native-community/cli-server-api": "13.6.8", - "@react-native-community/cli-tools": "13.6.8", - "@react-native/dev-middleware": "0.74.84", - "@react-native/metro-babel-transformer": "0.74.84", + "@react-native-community/cli-server-api": "13.6.9", + "@react-native-community/cli-tools": "13.6.9", + "@react-native/dev-middleware": "0.74.85", + "@react-native/metro-babel-transformer": "0.74.85", "chalk": "^4.0.0", "execa": "^5.1.1", "metro": "^0.80.3", @@ -9344,59 +9876,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@react-native/community-cli-plugin/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9406,15 +9885,6 @@ "node": ">=8" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9428,22 +9898,22 @@ } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.84.tgz", - "integrity": "sha512-YUEA03UNFbiYzHpYxlcS2D9+3eNT5YLGkl5yRg3nOSN6KbCc/OttGnNZme+tuSOJwjMN/vcvtDKYkTqjJw8U0A==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", + "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", "peer": true, "engines": { "node": ">=18" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.84.tgz", - "integrity": "sha512-veYw/WmyrAOQHUiIeULzn2duJQnXDPiKq2jZ/lcmDo6jsLirpp+Q73lx09TYgy/oVoPRuV0nfmU3x9B6EV/7qQ==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", + "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.84", + "@react-native/debugger-frontend": "0.74.85", "@rnx-kit/chromium-edge-launcher": "^1.0.0", "chrome-launcher": "^0.15.2", "connect": "^3.6.5", @@ -9491,6 +9961,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@react-native/dev-middleware/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@react-native/dev-middleware/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", @@ -9501,31 +9980,31 @@ } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.84.tgz", - "integrity": "sha512-wYWC5WWXqzCCe4PDogz9pNc4xH5ZamahW5XGSbrrYJ5V3walZ+7z43V6iEBJkZbLjj9YBcSttkXYGr1Xh4veAg==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.85.tgz", + "integrity": "sha512-1VQSLukJzaVMn1MYcs8Weo1nUW8xCas2XU1KuoV7OJPk6xPnEBFJmapmEGP5mWeEy7kcTXJmddEgy1wwW0tcig==", "peer": true, "engines": { "node": ">=18" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.84.tgz", - "integrity": "sha512-+PgxuUjBw9JVlz6m4ECsIJMLbDopnr4rpLmsG32hQaJrg0wMuvHtsgAY/J/aVCSG2GNUXexfjrnhc+O9yGOZXQ==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.85.tgz", + "integrity": "sha512-gp4Rg9le3lVZeW7Cie6qLfekvRKZuhJ3LKgi1SFB4N154z1wIclypAJXVXgWBsy8JKJfTwRI+sffC4qZDlvzrg==", "peer": true, "engines": { "node": ">=18" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.84.tgz", - "integrity": "sha512-YtVGq7jkgyUECv5yt4BOFbOXyW4ddUn8+dnwGGpJKdfhXYL5o5++AxNdE+2x+SZdkj3JUVekGKPwRabFECABaw==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.85.tgz", + "integrity": "sha512-JIrXqEwhTvWPtGArgMptIPGstMdXQIkwSjKVYt+7VC4a9Pw1GurIWanIJheEW6ZuCVvTc0VZkwglFz9JVjzDjA==", "peer": true, "dependencies": { "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.74.84", + "@react-native/babel-preset": "0.74.85", "hermes-parser": "0.19.1", "nullthrows": "^1.1.1" }, @@ -9537,9 +10016,9 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.84.tgz", - "integrity": "sha512-Y5W6x8cC5RuakUcTVUFNAIhUZ/tYpuqHZlRBoAuakrTwVuoNHXfQki8lj1KsYU7rW6e3VWgdEx33AfOQpdNp6A==", + "version": "0.74.85", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", + "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==", "peer": true }, "node_modules/@react-spring/animated": { @@ -9822,9 +10301,9 @@ } }, "node_modules/@safe-global/safe-gateway-typescript-sdk": { - "version": "3.21.7", - "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.21.7.tgz", - "integrity": "sha512-V9vOqQjb/O0Ylt5sKUtVl6f7fKDpH7HUQUCEON42BXk4PUpcKWdmziQjmf3/PR3OnkahcmXb7ULNwUi+04HmCw==", + "version": "3.21.8", + "resolved": "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.21.8.tgz", + "integrity": "sha512-n/fYgiqbuzAQuK0bgny6GBYvb585ETxKURa5Kb9hBV3fa47SvJo/dpGq275fJUn0e3Hh1YqETiLGj4HVJjHiTA==", "engines": { "node": ">=16" } @@ -9919,9 +10398,9 @@ } }, "node_modules/@snyk/protect": { - "version": "1.1292.0", - "resolved": "https://registry.npmjs.org/@snyk/protect/-/protect-1.1292.0.tgz", - "integrity": "sha512-+KooeRxKTNZ9haQHlhXcCIhnCbH2H0WkBDHYFIF9jUDov4J8PVNf4kQ3jVITp2owkTKizDKJkG1HLxtlei5iQA==", + "version": "1.1292.1", + "resolved": "https://registry.npmjs.org/@snyk/protect/-/protect-1.1292.1.tgz", + "integrity": "sha512-wM/0JGs1PhN30nigmOSfEPge3pyEHBAEN3/5/EoyIPOsUsZl/pKBEb2TwZnYbnfTKQi7CpyOKkVIaw40CBbQVA==", "bin": { "snyk-protect": "bin/snyk-protect" }, @@ -10174,20 +10653,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-docs/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/addon-essentials": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.1.11.tgz", @@ -10393,24 +10858,6 @@ } } }, - "node_modules/@storybook/blocks/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/blocks/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@storybook/builder-manager": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-8.1.11.tgz", @@ -10437,20 +10884,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/builder-manager/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/builder-webpack5": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.1.11.tgz", @@ -10511,20 +10944,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/builder-webpack5/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -10621,18 +11040,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@storybook/cli/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@storybook/cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -10649,77 +11056,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@storybook/cli/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/cli/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@storybook/cli/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", @@ -10745,54 +11085,6 @@ "node": ">=8" } }, - "node_modules/@storybook/cli/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@storybook/cli/node_modules/jscodeshift": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", - "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/preset-flow": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@babel/register": "^7.22.15", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.23.3", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - }, - "peerDependenciesMeta": { - "@babel/preset-env": { - "optional": true - } - } - }, "node_modules/@storybook/cli/node_modules/path-type": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", @@ -10805,22 +11097,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/cli/node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/@storybook/cli/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -10845,15 +11121,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/cli/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@storybook/cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -10866,12 +11133,6 @@ "node": ">=8" } }, - "node_modules/@storybook/cli/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/@storybook/client-logger": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.1.11.tgz", @@ -10912,71 +11173,10 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/codemod/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/codemod/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/codemod/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/codemod/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/codemod/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@storybook/codemod/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", @@ -10993,54 +11193,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/codemod/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/codemod/node_modules/jscodeshift": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", - "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/preset-flow": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@babel/register": "^7.22.15", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.23.3", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - }, - "peerDependenciesMeta": { - "@babel/preset-env": { - "optional": true - } - } - }, "node_modules/@storybook/codemod/node_modules/path-type": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", @@ -11053,22 +11205,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/codemod/node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/@storybook/codemod/node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -11081,33 +11217,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/codemod/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/codemod/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/codemod/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/@storybook/components": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.1.11.tgz", @@ -11214,115 +11323,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/core-common/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/core-common/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@storybook/core-common/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@storybook/core-common/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/core-common/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@storybook/core-common/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11332,99 +11332,6 @@ "node": ">=8" } }, - "node_modules/@storybook/core-common/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@storybook/core-common/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/core-common/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/core-common/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/core-common/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/core-common/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@storybook/core-common/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -11560,42 +11467,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/core-server/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/core-server/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@storybook/core-server/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/core-server/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", @@ -11696,9 +11571,9 @@ } }, "node_modules/@storybook/csf": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.9.tgz", - "integrity": "sha512-JlZ6v/iFn+iKohKGpYXnMeNeTiiAMeFoDhYnPLIC8GnyyIWqEI9wJYrOK9i9rxlJ8NZAH/ojGC/u/xVC41qSgQ==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", "dev": true, "dependencies": { "type-fest": "^2.19.0" @@ -11739,75 +11614,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/csf-tools/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/csf-tools/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/csf-tools/node_modules/recast": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", - "dev": true, - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@storybook/csf-tools/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@storybook/csf-tools/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, - "node_modules/@storybook/csf/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@storybook/docs-mdx": { "version": "3.1.0-next.0", "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-3.1.0-next.0.tgz", @@ -11994,20 +11800,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@storybook/nextjs/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/nextjs/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -12020,20 +11812,6 @@ "node": ">=10" } }, - "node_modules/@storybook/nextjs/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@storybook/node-logger": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.1.11.tgz", @@ -12092,20 +11870,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/preset-react-webpack/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -12118,20 +11882,6 @@ "node": ">=10" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@storybook/preview": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.1.11.tgz", @@ -12233,108 +11983,6 @@ "webpack": ">= 4" } }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/@storybook/react-dom-shim": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.1.11.tgz", @@ -12349,12 +11997,6 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" } }, - "node_modules/@storybook/react/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, "node_modules/@storybook/react/node_modules/@types/node": { "version": "18.19.39", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", @@ -12364,18 +12006,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@storybook/react/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/@storybook/react/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -12388,18 +12018,6 @@ "node": ">=10" } }, - "node_modules/@storybook/react/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@storybook/router": { "version": "8.1.11", "resolved": "https://registry.npmjs.org/@storybook/router/-/router-8.1.11.tgz", @@ -12466,38 +12084,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@storybook/telemetry/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@storybook/telemetry/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@storybook/telemetry/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@storybook/telemetry/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -12855,11 +12441,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@swc/helpers/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/@t3-oss/env-core": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@t3-oss/env-core/-/env-core-0.10.1.tgz", @@ -12892,20 +12473,20 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.48.0.tgz", - "integrity": "sha512-lZAfPPeVIqXCswE9SSbG33B6/91XOWt/Iq41bFeWb/mnHwQSIfFRbkS4bfs+WhIk9abRArF9Id2fp0Mgo+hq6Q==", + "version": "5.49.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.49.1.tgz", + "integrity": "sha512-JnC9ndmD1KKS01Rt/ovRUB1tmwO7zkyXAyIxN9mznuJrcNtOrkmOnQqdJF2ib9oHzc2VxHomnEG7xyfo54Npkw==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.48.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.48.0.tgz", - "integrity": "sha512-GDExbjYWzvDokyRqMSWXdrPiYpp95Aig0oeMIrxTaruOJJgWiWfUP//OAaowm2RrRkGVsavSZdko/XmIrrV2Nw==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.49.2.tgz", + "integrity": "sha512-6rfwXDK9BvmHISbNFuGd+wY3P44lyW7lWiA9vIFGT/T0P9aHD1VkjTvcM4SDAIbAQ9ygEZZoLt7dlU1o3NjMVA==", "dependencies": { - "@tanstack/query-core": "5.48.0" + "@tanstack/query-core": "5.49.1" }, "funding": { "type": "github", @@ -12916,11 +12497,11 @@ } }, "node_modules/@tanstack/react-table": { - "version": "8.17.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.17.3.tgz", - "integrity": "sha512-5gwg5SvPD3lNAXPuJJz1fOCEZYk9/GeBFH3w/hCgnfyszOIzwkwgp5I7Q4MJtn0WECp84b5STQUDdmvGi8m3nA==", + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.19.2.tgz", + "integrity": "sha512-itoSIAkA/Vsg+bjY23FSemcTyPhc5/1YjYyaMsr9QSH/cdbZnQxHVWrpWn0Sp2BWN71qkzR7e5ye8WuMmwyOjg==", "dependencies": { - "@tanstack/table-core": "8.17.3" + "@tanstack/table-core": "8.19.2" }, "engines": { "node": ">=12" @@ -12935,11 +12516,11 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.7.0.tgz", - "integrity": "sha512-3RtOwEU1HKS4iFBoTcCrV3Szqt4KoERMhZr8v57dvnh5o70sR9GAdF+0aE/qhiOmePrKujGwAayFNJSr/8Dbqw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.8.1.tgz", + "integrity": "sha512-dP5a7giEM4BQWLJ7K07ToZv8rF51mzbrBMkf0scg1QNYuFx3utnPUBPUHdzaowZhIez1K2XS78amuzD+YGRA5Q==", "dependencies": { - "@tanstack/virtual-core": "3.7.0" + "@tanstack/virtual-core": "3.8.1" }, "funding": { "type": "github", @@ -12951,9 +12532,9 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.17.3", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.17.3.tgz", - "integrity": "sha512-mPBodDGVL+fl6d90wUREepHa/7lhsghg2A3vFpakEhrhtbIlgNAZiMr7ccTgak5qbHqF14Fwy+W1yFWQt+WmYQ==", + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.19.2.tgz", + "integrity": "sha512-KpRjhgehIhbfH78ARm/GJDXGnpdw4bCg3qas6yjWSi7czJhI/J6pWln7NHtmBkGE9ZbohiiNtLqwGzKmBfixig==", "engines": { "node": ">=12" }, @@ -12963,9 +12544,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.7.0.tgz", - "integrity": "sha512-p0CWuqn+n8iZmsL7/l0Xg7kbyIKnHNqkEJkMDOkg4x3Ni3LohszmnJY8FPhTgG7Ad9ZFGcdKmn1R1mKUGEh9Xg==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.8.1.tgz", + "integrity": "sha512-uNtAwenT276M9QYCjTBoHZ8X3MUeCRoGK59zPi92hMIxdfS9AyHjkDWJ94WroDxnv48UE+hIeo21BU84jKc8aQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -13005,15 +12586,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/@testing-library/dom/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13030,24 +12602,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@testing-library/dom/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -13057,38 +12611,6 @@ "node": ">=8" } }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "node_modules/@testing-library/dom/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13174,24 +12696,6 @@ "node": ">=8" } }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", @@ -13490,9 +12994,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "node_modules/@types/express": { @@ -13586,9 +13090,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==" + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz", + "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==" }, "node_modules/@types/lodash.mergewith": { "version": "4.6.7", @@ -14477,12 +13981,12 @@ "dev": true }, "node_modules/@wagmi/connectors": { - "version": "5.0.19", - "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.0.19.tgz", - "integrity": "sha512-yd0pkM3I7sJuIZf1lIiwxDApaWg5ZSFiN3ociM50SkcoWDAWAKcCWWP0FbaCZ4KT+TZQJEIqBpfk6eZ9mBAddQ==", + "version": "5.0.21", + "resolved": "https://registry.npmjs.org/@wagmi/connectors/-/connectors-5.0.21.tgz", + "integrity": "sha512-lbjXEv6HhOa9nXZ5r6NGFJdaadCt2Yj9hSWHjKuiTobrE6dEGQqG16mCQS17yXcvXpI62Q/sW6SL347JrBju/Q==", "dependencies": { - "@coinbase/wallet-sdk": "4.0.3", - "@metamask/sdk": "0.26.3", + "@coinbase/wallet-sdk": "4.0.4", + "@metamask/sdk": "0.26.4", "@safe-global/safe-apps-provider": "0.18.1", "@safe-global/safe-apps-sdk": "8.1.0", "@walletconnect/ethereum-provider": "2.13.0", @@ -14493,7 +13997,7 @@ "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { - "@wagmi/core": "2.11.5", + "@wagmi/core": "2.11.6", "typescript": ">=5.0.4", "viem": "2.x" }, @@ -14504,9 +14008,9 @@ } }, "node_modules/@wagmi/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.11.5.tgz", - "integrity": "sha512-RmtZQkNf/ozdngyDST33WLTdKQHny9SsiNmxln8G06pbnOuhO4dDhnXnfiJ8Lh9GVIfFsjlmtqzfAIo1/86dqg==", + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.11.6.tgz", + "integrity": "sha512-Ohk7Bh+Q8kjzxEHImIq98CnPduz8n1a5bdwJi6F7zU3h62crhlVq7fZBYoBhoDgmX0ROVOMr8WW3XU3XhRwUOw==", "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.5", @@ -14592,9 +14096,9 @@ } }, "node_modules/@walletconnect/core/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "engines": { "node": "14 || >=16.14" } @@ -14690,6 +14194,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/environment/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/ethereum-provider": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.13.0.tgz", @@ -14716,6 +14225,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/events/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/heartbeat": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz", @@ -14800,6 +14314,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/jsonrpc-ws-connection": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz", @@ -15045,13 +14564,18 @@ } }, "node_modules/@walletconnect/notify-client/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "engines": { "node": "14 || >=16.14" } }, + "node_modules/@walletconnect/notify-client/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/notify-client/node_modules/unstorage": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz", @@ -15146,6 +14670,11 @@ "uint8arrays": "^3.0.0" } }, + "node_modules/@walletconnect/relay-auth/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/safe-json": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.2.tgz", @@ -15154,6 +14683,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/safe-json/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/sign-client": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.13.0.tgz", @@ -15178,6 +14712,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/time/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/types": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-2.13.0.tgz", @@ -15220,9 +14759,9 @@ } }, "node_modules/@walletconnect/types/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "engines": { "node": "14 || >=16.14" } @@ -15345,6 +14884,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/window-getters/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@walletconnect/window-metadata": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz", @@ -15354,6 +14898,11 @@ "tslib": "1.14.1" } }, + "node_modules/@walletconnect/window-metadata/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@web3inbox/core": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@web3inbox/core/-/core-1.4.0.tgz", @@ -15480,13 +15029,18 @@ } }, "node_modules/@web3inbox/core/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "engines": { "node": "14 || >=16.14" } }, + "node_modules/@web3inbox/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@web3inbox/core/node_modules/unstorage": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz", @@ -16007,12 +15561,6 @@ "esbuild": ">=0.10.0" } }, - "node_modules/@yarnpkg/esbuild-plugin-pnp/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/@yarnpkg/fslib": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", @@ -16026,6 +15574,12 @@ "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" } }, + "node_modules/@yarnpkg/fslib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/@yarnpkg/libzip": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", @@ -16039,6 +15593,12 @@ "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" } }, + "node_modules/@yarnpkg/libzip/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/@zag-js/anatomy": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-0.16.0.tgz", @@ -16146,6 +15706,20 @@ "@zag-js/utils": "0.16.0" } }, + "node_modules/@zag-js/popper/node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@zag-js/popper/node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, "node_modules/@zag-js/react": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-0.16.0.tgz", @@ -16209,9 +15783,9 @@ "integrity": "sha512-wjkjR4ItpkCKnlN0JNkhoLutRf1yHTaGV1qEy1Z9tzkyfJmP/2jqwcCR1cWWxM/+iFE2UJd7Ea7CNgCWwFnvFw==" }, "node_modules/abitype": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.4.tgz", - "integrity": "sha512-UivtYZOGJGE8rsrM/N5vdRkUpqEZVmuTumfTuolm7m/6O09wprd958rx8kUBwVAAAhQDveGAgD0GJdBuR8s6tw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.5.tgz", + "integrity": "sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==", "funding": { "url": "https://github.com/sponsors/wevm" }, @@ -16252,9 +15826,10 @@ } }, "node_modules/acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -16262,15 +15837,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -16556,6 +16122,19 @@ "node": ">=4" } }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -16627,18 +16206,13 @@ "node": ">=10" } }, - "node_modules/aria-hidden/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-back": { @@ -16898,10 +16472,10 @@ } }, "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "peer": true, + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, "dependencies": { "tslib": "^2.0.1" }, @@ -16915,12 +16489,6 @@ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "peer": true - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -16950,11 +16518,6 @@ "tslib": "^2.0.0" } }, - "node_modules/async-mutex/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -17102,34 +16665,6 @@ "webpack": ">=5" } }, - "node_modules/babel-loader/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/babel-loader/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/babel-loader/node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", @@ -17162,12 +16697,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-loader/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/babel-loader/node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", @@ -17237,29 +16766,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/babel-loader/node_modules/yocto-queue": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.0.tgz", - "integrity": "sha512-cMojmlnwkAgIXqga+2sXshlgrrcI0QEPJ5n58pEvtuFo4PaekfomlCudArDD7hj8Hkswjl0/x4eu4q+Xa0WFgQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -17507,15 +17017,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -17531,18 +17032,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -18023,9 +17512,10 @@ } }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -18108,12 +17598,6 @@ "tslib": "^2.0.3" } }, - "node_modules/camel-case/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -18160,9 +17644,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001638", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", - "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "funding": [ { "type": "opencollective", @@ -18245,11 +17729,11 @@ } }, "node_modules/chakra-react-select": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/chakra-react-select/-/chakra-react-select-4.8.0.tgz", - "integrity": "sha512-AZHMeBIEXoXQw7H6qlbquFJbESYsaSYP7Xjj0Z2TH1mF6KdoMRXFwsavHSj1X6BZOayj5qbw/Um6RdZ8MUxt2Q==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/chakra-react-select/-/chakra-react-select-4.7.6.tgz", + "integrity": "sha512-ZL43hyXPnWf1g/HjsZDecbeJ4F2Q6tTPYJozlKWkrQ7lIX7ORP0aZYwmc5/Wly4UNzMimj2Vuosl6MmIXH+G2g==", "dependencies": { - "react-select": "5.8.0" + "react-select": "5.7.7" }, "peerDependencies": { "@chakra-ui/form-control": "^2.0.0", @@ -18440,14 +17924,6 @@ "consola": "^3.2.3" } }, - "node_modules/citty/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/cjs-module-lexer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", @@ -18755,22 +18231,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -18805,6 +18276,17 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -18826,28 +18308,6 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -18858,11 +18318,20 @@ "node": ">=7.0.0" } }, - "node_modules/color/node_modules/color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/color2k": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz", @@ -19031,6 +18500,14 @@ "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -19109,17 +18586,58 @@ "ms": "2.0.0" } }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "dev": true + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/console-browserify": { "version": "1.2.0", @@ -19520,9 +19038,9 @@ } }, "node_modules/cypress": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.12.0.tgz", - "integrity": "sha512-udzS2JilmI9ApO/UuqurEwOvThclin5ntz7K0BtnHBs+tg2Bl9QShLISXpSEMDv/u8b6mqdoAdyKeZiSqKWL8g==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.0.tgz", + "integrity": "sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -19565,7 +19083,7 @@ "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", - "tmp": "~0.2.1", + "tmp": "~0.2.3", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, @@ -19643,29 +19161,64 @@ "node": ">=8" } }, - "node_modules/cypress/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/cypress/node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/cypress/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/cypress/node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/cypress/node_modules/has-flag": { "version": "4.0.0", @@ -19676,6 +19229,15 @@ "node": ">=8" } }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, "node_modules/cypress/node_modules/proxy-from-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", @@ -20248,50 +19810,6 @@ "node": ">=12" } }, - "node_modules/detect-package-manager/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/detect-package-manager/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detect-package-manager/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/detect-port": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", @@ -20504,12 +20022,6 @@ "tslib": "^2.0.3" } }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -20602,9 +20114,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.812", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz", - "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==" + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -20737,6 +20249,18 @@ "node": ">=8.6" } }, + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -20981,9 +20505,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -20992,29 +20516,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/esbuild-plugin-alias": { @@ -21036,9 +20560,9 @@ } }, "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -21376,6 +20900,30 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", @@ -21406,6 +20954,15 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/eslint-plugin-react": { "version": "7.34.3", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", @@ -21571,24 +21128,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -21629,6 +21168,18 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -21670,6 +21221,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -21724,6 +21287,12 @@ "@types/estree": "^1.0.0" } }, + "node_modules/estree-walker/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -21825,11 +21394,11 @@ } }, "node_modules/ethereum-cryptography": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.0.tgz", - "integrity": "sha512-hsm9JhfytIf8QME/3B7j4bc8V+VdTU+Vas1aJlvIS96ffoNAosudXvGoEvWmc7QZYdkC8mrMJz9r0fcbw7GyCA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dependencies": { - "@noble/curves": "1.4.0", + "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0" @@ -21872,19 +21441,18 @@ } }, "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { @@ -21966,42 +21534,12 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -22017,15 +21555,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -22074,6 +21603,21 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -22249,11 +21793,6 @@ "node": ">= 12" } }, - "node_modules/file-selector/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/file-system-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", @@ -22278,16 +21817,6 @@ "node": ">=14.14" } }, - "node_modules/file-system-cache/node_modules/ramda": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", - "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -22339,25 +21868,26 @@ } }, "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "peer": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -22368,7 +21898,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, + "dev": true, "dependencies": { "ms": "2.0.0" } @@ -22377,19 +21907,87 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true + "dev": true }, "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, "dependencies": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/find-nearest-file": { @@ -22463,9 +22061,9 @@ "peer": true }, "node_modules/flow-parser": { - "version": "0.238.2", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.238.2.tgz", - "integrity": "sha512-fs7FSnzzKF6oSzjk14JlBHt82DPchYHVsXtPi4Fkn+qrunVjWaBZY7nSO/mC9X4l9+wRah/R69DRd5NGDOrWqw==", + "version": "0.238.3", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.238.3.tgz", + "integrity": "sha512-hNUhucq8V6KWSX1skXUS3vnDmrRNuKWzDvEVK5b+n97uMF32zj2y8pmcLDQEqlY5u926B0GYGWT/3XhwDJfLOQ==", "engines": { "node": ">=0.4.0" } @@ -22481,11 +22079,6 @@ "node": ">=10" } }, - "node_modules/focus-lock/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -22606,24 +22199,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -22647,6 +22222,24 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -22771,18 +22364,17 @@ "dev": true }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/fs-minipass": { @@ -22881,6 +22473,351 @@ "node": "^18.18.2 || ^20.0.0" } }, + "node_modules/fuels/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fuels/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/fuels/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -22910,22 +22847,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/fuels/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fuels/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/fuels/node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -22934,6 +22855,43 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/fuels/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, "node_modules/fuels/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -23080,15 +23038,11 @@ "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==" }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -23159,15 +23113,6 @@ "giget": "dist/cli.mjs" } }, - "node_modules/giget/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", @@ -23175,21 +23120,22 @@ "dev": true }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -23372,11 +23318,6 @@ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/graphql-tag/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/gunzip-maybe": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", @@ -23781,15 +23722,6 @@ "node": ">= 12" } }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "peer": true, - "dependencies": { - "void-elements": "3.1.0" - } - }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", @@ -23877,14 +23809,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-shutdown": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", @@ -23915,12 +23839,11 @@ "dev": true }, "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { - "node": ">=8.12.0" + "node": ">=10.17.0" } }, "node_modules/husky": { @@ -23939,9 +23862,9 @@ } }, "node_modules/i18next": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", - "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", + "version": "23.2.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.2.3.tgz", + "integrity": "sha512-5spO7L0rNmW0jFuNhz+gfirlFt1anle4mTy4+gFkgsH0+T3R5++4oncBrzeKa7v8pweRyGBoGmOpboqlxovg6A==", "funding": [ { "type": "individual", @@ -23956,8 +23879,9 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "peer": true, "dependencies": { - "@babel/runtime": "^7.20.6" + "@babel/runtime": "^7.22.5" } }, "node_modules/i18next-browser-languagedetector": { @@ -24054,6 +23978,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -24556,12 +24488,10 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -24821,9 +24751,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -24886,24 +24816,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25002,24 +24914,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25135,24 +25029,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25222,24 +25098,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25353,9 +25211,9 @@ } }, "node_modules/jotai": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.8.3.tgz", - "integrity": "sha512-pR4plVvdbzB6zyt7VLLHPMAkcRSKhRIvZKd+qkifQLa3CEziEo1uwZjePj4acTmQrboiISBlYSdCz3gWcr1Nkg==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.8.4.tgz", + "integrity": "sha512-f6jwjhBJcDtpeauT2xH01gnqadKEySwwt1qNBLvAXcnojkmb76EdqRt05Ym8IamfHGAQz2qMKAwftnyjeSoHAA==", "engines": { "node": ">=12.20.0" }, @@ -25430,20 +25288,21 @@ "peer": true }, "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "peer": true, + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", + "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", + "dev": true, "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", "babel-core": "^7.0.0-bridge.0", "chalk": "^4.1.2", "flow-parser": "0.*", @@ -25451,7 +25310,7 @@ "micromatch": "^4.0.4", "neo-async": "^2.5.0", "node-dir": "^0.1.17", - "recast": "^0.21.0", + "recast": "^0.23.3", "temp": "^0.8.4", "write-file-atomic": "^2.3.0" }, @@ -25460,13 +25319,18 @@ }, "peerDependencies": { "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } } }, "node_modules/jscodeshift/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -25481,7 +25345,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -25493,29 +25357,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jscodeshift/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jscodeshift/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/jscodeshift/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, + "dev": true, "engines": { "node": ">=8" } @@ -25524,7 +25370,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -25881,18 +25727,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/lint-staged/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", @@ -25997,18 +25831,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lint-staged/node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -26226,21 +26048,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -26303,14 +26110,6 @@ "listhen": "bin/listhen.mjs" } }, - "node_modules/listhen/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", @@ -26353,24 +26152,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/listr2/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -26557,22 +26350,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -26625,24 +26402,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -26660,6 +26419,18 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -26731,12 +26502,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -26764,31 +26529,18 @@ } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/makeerror": { @@ -27763,24 +27515,6 @@ "node": ">=12" } }, - "node_modules/metro/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/metro/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, "node_modules/metro/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -27850,6 +27584,18 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, + "node_modules/metro/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/metro/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -28522,15 +28268,14 @@ "dev": true }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "peer": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, "node_modules/mime-db": { @@ -28856,6 +28601,17 @@ "ufo": "^1.5.3" } }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/motion": { "version": "10.16.2", "resolved": "https://registry.npmjs.org/motion/-/motion-10.16.2.tgz", @@ -29015,7 +28771,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", - "license": "MIT", "peerDependencies": { "react": "^16.8 || ^17 || ^18", "react-dom": "^16.8 || ^17 || ^18" @@ -29058,12 +28813,6 @@ "tslib": "^2.0.3" } }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/nocache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", @@ -29189,15 +28938,6 @@ "webpack": ">=5" } }, - "node_modules/node-polyfill-webpack-plugin/node_modules/filter-obj": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", - "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", @@ -29214,18 +28954,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -29331,15 +29059,6 @@ "node": "^14.16.0 || >=16.10.0" } }, - "node_modules/nypm/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/nypm/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -29716,10 +29435,9 @@ "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "peer": true, + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -29841,22 +29559,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/ora/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -29865,6 +29567,17 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -29939,6 +29652,11 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -29960,12 +29678,6 @@ "tslib": "^2.0.3" } }, - "node_modules/param-case/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -30037,12 +29749,6 @@ "tslib": "^2.0.3" } }, - "node_modules/pascal-case/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -30094,9 +29800,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "engines": { "node": "14 || >=16.14" } @@ -30334,79 +30040,24 @@ } }, "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/pkg-types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", - "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.2.tgz", + "integrity": "sha512-VEGf1he2DR5yowYRl0XJhWJq5ktm9gYIsH+y8sNJpHlxch7JPDaufgrsl4vYjd9hMUY8QVjoNncKbow9I7exyA==", "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.7.0", + "mlly": "^1.7.1", "pathe": "^1.1.2" } }, @@ -30499,9 +30150,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -30518,7 +30169,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -30814,9 +30465,9 @@ } }, "node_modules/posthog-js": { - "version": "1.141.4", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.141.4.tgz", - "integrity": "sha512-e8rUFEnAR1MB+YqrjWLEmvm0d1X90cebCPNyby6oNX1cp36s/PpxeTx+Up7bArJmRv2N+rT1Kd5sJ7jpXWAonA==", + "version": "1.142.1", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.142.1.tgz", + "integrity": "sha512-yqeWTWitlb0sCaH5v6s7UJ+pPspzf/lkzPaSE5pMMXRM2i2KNsMoZEAZqbPCW8fQ8QL6lHs6d8PLjHrvbR288w==", "dependencies": { "fflate": "^0.4.8", "preact": "^10.19.3", @@ -30829,9 +30480,9 @@ "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" }, "node_modules/preact": { - "version": "10.22.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", - "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", + "version": "10.22.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", + "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -30991,120 +30642,36 @@ } }, "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "peer": true, + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/pretty-format/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/pretty-format/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/pretty-format/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "peer": true - }, - "node_modules/pretty-format/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "dev": true }, "node_modules/pretty-hrtime": { "version": "1.0.3", @@ -31376,12 +30943,12 @@ } }, "node_modules/qs": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", - "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.2.tgz", + "integrity": "sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -31407,6 +30974,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/query-string/node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/querystring": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", @@ -31479,9 +31054,9 @@ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" }, "node_modules/ramda": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.1.tgz", - "integrity": "sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", + "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -31528,15 +31103,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -31689,21 +31255,6 @@ "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true }, - "node_modules/react-docgen/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -31747,15 +31298,6 @@ "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" } }, - "node_modules/react-element-to-jsx-string/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-element-to-jsx-string/node_modules/react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", @@ -31827,28 +31369,6 @@ "react": "^16.8.0 || ^17 || ^18" } }, - "node_modules/react-i18next": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz", - "integrity": "sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.22.5", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 23.2.3", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, "node_modules/react-intersection-observer": { "version": "9.10.3", "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.10.3.tgz", @@ -31982,20 +31502,10 @@ } } }, - "node_modules/react-remove-scroll-bar/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/react-remove-scroll/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/react-select": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", - "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "version": "5.7.7", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.7.tgz", + "integrity": "sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==", "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -32056,11 +31566,6 @@ } } }, - "node_modules/react-style-singleton/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -32266,14 +31771,15 @@ } }, "node_modules/recast": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", - "peer": true, + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dev": true, "dependencies": { - "ast-types": "0.15.2", + "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" }, "engines": { @@ -32284,17 +31790,11 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "peer": true, + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/recast/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "peer": true - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -32308,6 +31808,18 @@ "node": ">=8" } }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -33213,6 +32725,18 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -33377,11 +32901,12 @@ } }, "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-pkg-maps": { @@ -33561,22 +33086,6 @@ "node": ">=12" } }, - "node_modules/rollup-plugin-visualizer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/rollup-plugin-visualizer/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -33585,6 +33094,17 @@ "node": ">= 8" } }, + "node_modules/rollup-plugin-visualizer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/rollup-plugin-visualizer/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -33688,12 +33208,6 @@ "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -33819,23 +33333,58 @@ } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/secp256k1": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz", @@ -33912,41 +33461,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/serialize-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", @@ -34216,24 +33735,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/slugify": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", @@ -34486,12 +33987,11 @@ } }, "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "peer": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/std-env": { @@ -34626,11 +34126,33 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.includes": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", @@ -34717,14 +34239,17 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -34739,6 +34264,17 @@ "node": ">=8" } }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -34757,15 +34293,18 @@ } }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "dependencies": { - "min-indent": "^1.0.0" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -35146,12 +34685,12 @@ } }, "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "peer": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/temp/node_modules/glob": { @@ -35216,27 +34755,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.31.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", @@ -35288,6 +34806,35 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -35569,15 +35116,17 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths-webpack-plugin": { @@ -35625,24 +35174,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -35664,36 +35195,10 @@ "node": ">=8" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -35710,6 +35215,12 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -35759,11 +35270,12 @@ } }, "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "engines": { - "node": ">=14.16" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -35862,9 +35374,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -35967,14 +35479,6 @@ "pathe": "^1.1.1" } }, - "node_modules/unenv/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/unenv/node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -36229,9 +35733,9 @@ } }, "node_modules/unplugin": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.2.tgz", - "integrity": "sha512-KuPqnjU4HBcrSwmQatfdc5hU4xzaQrhoKqCKylwmLnbBvqj5udXL8cHrkOuYDoI4ESCwJIiAIKMujroIUKLgow==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.11.0.tgz", + "integrity": "sha512-3r7VWZ/webh0SGgJScpWl2/MRCZK5d3ZYFcNaeci/GQ7Teop7zf0Nl2pUuz7G21BwPd9pcUPOC5KmJ2L3WgC5g==", "dev": true, "dependencies": { "acorn": "^8.11.3", @@ -36243,6 +35747,18 @@ "node": ">=14.0.0" } }, + "node_modules/unplugin/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/unplugin/node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", @@ -36271,14 +35787,6 @@ "untun": "bin/untun.mjs" } }, - "node_modules/untun/node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", @@ -36347,21 +35855,6 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, - "node_modules/url/node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/use-callback-ref": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", @@ -36382,11 +35875,6 @@ } } }, - "node_modules/use-callback-ref/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/use-deep-compare-effect": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz", @@ -36438,11 +35926,6 @@ } } }, - "node_modules/use-sidecar/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, "node_modules/use-sync-external-store": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", @@ -36702,9 +36185,9 @@ } }, "node_modules/viem": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.16.2.tgz", - "integrity": "sha512-qor3v1cJFR3jcPtcJxPbKfKURAH2agNf2IWZIaSReV6teNLERiu4Sr7kbqpkIeTAEpiDCVQwg336M+mub1m+pg==", + "version": "2.16.5", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.16.5.tgz", + "integrity": "sha512-QDESALYDyLSP+pIr7adH3QPZ+3is16aOVMXXZE0X1GVbgL7PDMZQ8xIF1X/B1hgyqkBl2HhMpUaq6ksUdBV/YA==", "funding": [ { "type": "github", @@ -36713,11 +36196,11 @@ ], "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.4", + "@noble/curves": "1.4.0", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0", + "abitype": "1.0.5", "isows": "1.0.4", "ws": "8.17.1" }, @@ -36731,47 +36214,11 @@ } }, "node_modules/viem/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/viem/node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" + "@noble/hashes": "1.4.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -36809,22 +36256,13 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wagmi": { - "version": "2.10.7", - "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.10.7.tgz", - "integrity": "sha512-RYh45bpqaPbQDcRYbfaiS0b5iZrEKVCCpjyFTJx83qtbkxZBvpT6MXy1rQbfLookVCgZz0PA3aYEYX8HJPajLg==", + "version": "2.10.9", + "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.10.9.tgz", + "integrity": "sha512-pYGTLmVIAC4q/a90i+vlrkJL86n5Kf/gwhhi65XtQklpsUQWrKDmn4dsY1/yFeAmZ/1yx1mpxYpX3LI97eTuWA==", "dependencies": { - "@wagmi/connectors": "5.0.19", - "@wagmi/core": "2.11.5", + "@wagmi/connectors": "5.0.21", + "@wagmi/core": "2.11.6", "use-sync-external-store": "1.2.0" }, "funding": { @@ -36877,9 +36315,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -36898,9 +36336,9 @@ } }, "node_modules/web-vitals": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.0.tgz", - "integrity": "sha512-ohj72kbtVWCpKYMxcbJ+xaOBV3En76hW47j52dG+tEGG36LZQgfFw5yHl9xyjmosy3XUMn8d/GBUAy4YPM839w==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.1.tgz", + "integrity": "sha512-U6bAxeudnhDqcXNl50JC4hLlqox9DZnngxfISZm3DMZnonW35xtJOVUc091L+DOY+6hVZVpKXoiCP0RiT6339Q==" }, "node_modules/webextension-polyfill": { "version": "0.10.0", @@ -37001,59 +36439,6 @@ } } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-hot-middleware": { "version": "2.26.1", "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", @@ -37065,6 +36450,18 @@ "strip-ansi": "^6.0.0" } }, + "node_modules/webpack-hot-middleware/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -37080,17 +36477,49 @@ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "dev": true }, - "node_modules/webpack/node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=10.13.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/whatwg-fetch": { @@ -37293,31 +36722,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -37347,20 +36760,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 758ecb9f36..26685338ff 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@web3inbox/react": "^1.1.0", "@zag-js/combobox": "^0.16.0", "@zag-js/react": "^0.16.0", - "chakra-react-select": "^4.7.6", + "chakra-react-select": "4.7.6", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "color": "^4.2.3", diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 91397af92e..6a3ae290e4 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,5 @@ -import { NavigationEvents } from "@/components/NavigationEvents" -import Providers from "@/components/Providers" +import { Providers } from "@/components/Providers" +import { PostHogPageViews } from "@/components/Providers/PostHogPageViews" import clsx from "clsx" import { dystopian, inter } from "fonts" import type { Metadata } from "next" @@ -21,10 +21,12 @@ export default function RootLayout({ children }: RootLayoutProps) { - {children} - - - + + {children} + + + + ) diff --git a/src/components/[guild]/AddRewardButton/SelectRolePanel.tsx b/src/components/[guild]/AddRewardButton/SelectRolePanel.tsx index 36367f5621..674bd56cd1 100644 --- a/src/components/[guild]/AddRewardButton/SelectRolePanel.tsx +++ b/src/components/[guild]/AddRewardButton/SelectRolePanel.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { HStack, IconButton, @@ -12,7 +13,6 @@ import { useColorModeValue, } from "@chakra-ui/react" import { Visibility } from "@guildxyz/types" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useCreateRRR, { SubmitData } from "hooks/useCreateRRR" import { ArrowLeft, Info } from "phosphor-react" diff --git a/src/components/[guild]/AddRewardButton/hooks/useAddReward.ts b/src/components/[guild]/AddRewardButton/hooks/useAddReward.ts index 43d991cb0b..ef0e94eece 100644 --- a/src/components/[guild]/AddRewardButton/hooks/useAddReward.ts +++ b/src/components/[guild]/AddRewardButton/hooks/useAddReward.ts @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import useCustomPosthogEvents from "hooks/useCustomPosthogEvents" import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" diff --git a/src/components/[guild]/AddRewardButton/hooks/useAddRoleRewards.ts b/src/components/[guild]/AddRewardButton/hooks/useAddRoleRewards.ts index 24b3747ada..e91202d1cb 100644 --- a/src/components/[guild]/AddRewardButton/hooks/useAddRoleRewards.ts +++ b/src/components/[guild]/AddRewardButton/hooks/useAddRoleRewards.ts @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit" diff --git a/src/components/[guild]/AddRewardButton/hooks/useCreateRequirements.ts b/src/components/[guild]/AddRewardButton/hooks/useCreateRequirements.ts index f411c04945..935d0d056d 100644 --- a/src/components/[guild]/AddRewardButton/hooks/useCreateRequirements.ts +++ b/src/components/[guild]/AddRewardButton/hooks/useCreateRequirements.ts @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import { RequirementIdMap } from "hooks/useCreateRRR" import useShowErrorToast from "hooks/useShowErrorToast" import { diff --git a/src/components/[guild]/AddRewardButton/hooks/useCreateRolePlatforms.ts b/src/components/[guild]/AddRewardButton/hooks/useCreateRolePlatforms.ts index eaed084544..5b112d756c 100644 --- a/src/components/[guild]/AddRewardButton/hooks/useCreateRolePlatforms.ts +++ b/src/components/[guild]/AddRewardButton/hooks/useCreateRolePlatforms.ts @@ -1,6 +1,6 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Schemas } from "@guildxyz/types" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useShowErrorToast from "hooks/useShowErrorToast" import { RolePlatform } from "types" diff --git a/src/components/[guild]/AddRewardButton/hooks/useSubmitAddReward.ts b/src/components/[guild]/AddRewardButton/hooks/useSubmitAddReward.ts index bf1e2486e9..cbd0cd7e06 100644 --- a/src/components/[guild]/AddRewardButton/hooks/useSubmitAddReward.ts +++ b/src/components/[guild]/AddRewardButton/hooks/useSubmitAddReward.ts @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Visibility } from "@guildxyz/types" import { useAddRewardContext } from "components/[guild]/AddRewardContext" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import useCreateRole from "components/create-guild/hooks/useCreateRole" import useToast from "hooks/useToast" import rewards from "platforms/rewards" diff --git a/src/components/[guild]/AddRewardButton/useCreateTokenReward.ts b/src/components/[guild]/AddRewardButton/useCreateTokenReward.ts index d32eb6e569..790bc62978 100644 --- a/src/components/[guild]/AddRewardButton/useCreateTokenReward.ts +++ b/src/components/[guild]/AddRewardButton/useCreateTokenReward.ts @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Schemas } from "@guildxyz/types" -import { usePostHogContext } from "components/_app/PostHogProvider" import useCreateRole from "components/create-guild/hooks/useCreateRole" import useShowErrorToast from "hooks/useShowErrorToast" import { PlatformType, Requirement, RolePlatform } from "types" diff --git a/src/components/[guild]/Events/EventCard/components/JoinEventButton.tsx b/src/components/[guild]/Events/EventCard/components/JoinEventButton.tsx index 36fcd207e2..5606ccbe5b 100644 --- a/src/components/[guild]/Events/EventCard/components/JoinEventButton.tsx +++ b/src/components/[guild]/Events/EventCard/components/JoinEventButton.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { ButtonProps } from "@chakra-ui/react" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useColorPalette from "hooks/useColorPalette" import { ArrowSquareOut } from "phosphor-react" diff --git a/src/components/[guild]/JoinModal/JoinModal.tsx b/src/components/[guild]/JoinModal/JoinModal.tsx index 01a9c940dd..d6ae813b78 100644 --- a/src/components/[guild]/JoinModal/JoinModal.tsx +++ b/src/components/[guild]/JoinModal/JoinModal.tsx @@ -1,3 +1,4 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Box, Collapse, @@ -12,7 +13,6 @@ import { VStack, } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import ModalButton from "components/common/ModalButton" @@ -186,8 +186,8 @@ const JoinModal = ({ isOpen, onClose }: Props): JSX.Element => { joinProgress?.state === "FINISHED" ? "Finalizing results" : !!joinProgress - ? "See status above" - : "Checking access" + ? "See status above" + : "Checking access" } isDisabled={!isWeb3Connected} > diff --git a/src/components/[guild]/JoinModal/components/CompleteCaptchaJoinStep.tsx b/src/components/[guild]/JoinModal/components/CompleteCaptchaJoinStep.tsx index 2d82626ed3..f3730853b6 100644 --- a/src/components/[guild]/JoinModal/components/CompleteCaptchaJoinStep.tsx +++ b/src/components/[guild]/JoinModal/components/CompleteCaptchaJoinStep.tsx @@ -1,5 +1,5 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Icon, useDisclosure } from "@chakra-ui/react" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useSWRWithOptionalAuth from "hooks/useSWRWithOptionalAuth" import { Robot } from "phosphor-react" import { CompleteCaptchaModal } from "requirements/Captcha/components/CompleteCaptcha" diff --git a/src/components/[guild]/JoinModal/components/ConnectPlatform.tsx b/src/components/[guild]/JoinModal/components/ConnectPlatform.tsx index 144c769682..95d722424a 100644 --- a/src/components/[guild]/JoinModal/components/ConnectPlatform.tsx +++ b/src/components/[guild]/JoinModal/components/ConnectPlatform.tsx @@ -1,7 +1,7 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Icon } from "@chakra-ui/react" import usePlatformsToReconnect from "components/[guild]/hooks/usePlatformsToReconnect" import useUser from "components/[guild]/hooks/useUser" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Script from "next/script" import rewards from "platforms/rewards" import { useEffect } from "react" diff --git a/src/components/[guild]/JoinModal/components/ConnectPolygonIDJoinStep.tsx b/src/components/[guild]/JoinModal/components/ConnectPolygonIDJoinStep.tsx index b1b7fdc8de..9cfc5a560b 100644 --- a/src/components/[guild]/JoinModal/components/ConnectPolygonIDJoinStep.tsx +++ b/src/components/[guild]/JoinModal/components/ConnectPolygonIDJoinStep.tsx @@ -1,5 +1,5 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Img, useDisclosure } from "@chakra-ui/react" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useSWRWithOptionalAuth from "hooks/useSWRWithOptionalAuth" import { ConnectPolygonIDModal } from "requirements/PolygonID/components/ConnectPolygonID" import JoinStep from "./JoinStep" diff --git a/src/components/[guild]/JoinModal/components/ShareSocialsCheckbox.tsx b/src/components/[guild]/JoinModal/components/ShareSocialsCheckbox.tsx index 3083648f8e..41bea02c1d 100644 --- a/src/components/[guild]/JoinModal/components/ShareSocialsCheckbox.tsx +++ b/src/components/[guild]/JoinModal/components/ShareSocialsCheckbox.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Checkbox, Icon, Link, Text } from "@chakra-ui/react" -import { usePostHogContext } from "components/_app/PostHogProvider" import { ArrowSquareOut } from "phosphor-react" import { useFormContext } from "react-hook-form" diff --git a/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx b/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx index c3b76c8e8b..301c647c4d 100644 --- a/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx +++ b/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx @@ -1,5 +1,5 @@ -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { useSetAtom } from "jotai" import { SignIn, Wallet } from "phosphor-react" import shortenHex from "utils/shortenHex" diff --git a/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts b/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts index 0180f17a33..000a2627a4 100644 --- a/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts +++ b/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { useToast } from "@/components/ui/hooks/useToast" +import { platformMergeAlertAtom } from "@/components/Web3ConnectionManager/PlatformMergeErrorAlert" import useUser from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" -import { platformMergeAlertAtom } from "components/_app/Web3ConnectionManager/components/PlatformMergeErrorAlert" import { env } from "env" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import usePopupWindow from "hooks/usePopupWindow" diff --git a/src/components/[guild]/JoinModal/hooks/useMembershipUpdate.tsx b/src/components/[guild]/JoinModal/hooks/useMembershipUpdate.tsx index 9161d50bac..dea98a99d8 100644 --- a/src/components/[guild]/JoinModal/hooks/useMembershipUpdate.tsx +++ b/src/components/[guild]/JoinModal/hooks/useMembershipUpdate.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import type { JoinJob } from "@guildxyz/types" import useGuild from "components/[guild]/hooks/useGuild" import useGuildPermission from "components/[guild]/hooks/useGuildPermission" -import { usePostHogContext } from "components/_app/PostHogProvider" import useMembership from "components/explorer/hooks/useMembership" import useCustomPosthogEvents from "hooks/useCustomPosthogEvents" import { useFetcherWithSign } from "hooks/useFetcherWithSign" diff --git a/src/components/[guild]/NoPermissionToPageFallback.tsx b/src/components/[guild]/NoPermissionToPageFallback.tsx index b0adc01b6e..7bcc8b7ebf 100644 --- a/src/components/[guild]/NoPermissionToPageFallback.tsx +++ b/src/components/[guild]/NoPermissionToPageFallback.tsx @@ -1,3 +1,7 @@ +import { + accountModalAtom, + walletSelectorModalAtom, +} from "@/components/Providers/Providers" import { Alert, AlertDescription, @@ -7,10 +11,8 @@ import { Stack, Text, } from "@chakra-ui/react" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" import Button from "components/common/Button" import Card from "components/common/Card" -import { accountModalAtom } from "components/common/Layout/components/Account/components/AccountModal" import { useSetAtom } from "jotai" import { SignIn } from "phosphor-react" import useGuildPermission from "./hooks/useGuildPermission" diff --git a/src/components/[guild]/Onboarding/components/SummonMembers/components/SendDiscordJoinButtonModal.tsx b/src/components/[guild]/Onboarding/components/SummonMembers/components/SendDiscordJoinButtonModal.tsx index 96c355ca56..db3b5566bb 100644 --- a/src/components/[guild]/Onboarding/components/SummonMembers/components/SendDiscordJoinButtonModal.tsx +++ b/src/components/[guild]/Onboarding/components/SummonMembers/components/SendDiscordJoinButtonModal.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { FormControl, FormLabel, @@ -10,7 +11,6 @@ import { Text, } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import FormErrorMessage from "components/common/FormErrorMessage" import { Modal } from "components/common/Modal" diff --git a/src/components/[guild]/OngoingIssuesBanner.tsx b/src/components/[guild]/OngoingIssuesBanner.tsx index 5248f4b6f9..8c4f2a438c 100644 --- a/src/components/[guild]/OngoingIssuesBanner.tsx +++ b/src/components/[guild]/OngoingIssuesBanner.tsx @@ -1,7 +1,7 @@ import { Button } from "@chakra-ui/react" import InfoBanner from "components/_app/InfoBanner" -import { triggerChat } from "components/_app/IntercomProvider" import { ArrowSquareOut } from "phosphor-react" +import { triggerChat } from "utils/intercom" const OngoingIssuesBanner = () => ( diff --git a/src/components/[guild]/ReportGuildButton.tsx b/src/components/[guild]/ReportGuildButton.tsx index f8597b608d..0c39ec8bc2 100644 --- a/src/components/[guild]/ReportGuildButton.tsx +++ b/src/components/[guild]/ReportGuildButton.tsx @@ -1,8 +1,8 @@ import { ButtonProps, IconButton, Tooltip } from "@chakra-ui/react" -import { addIntercomSettings } from "components/_app/IntercomProvider" import Button from "components/common/Button" import { Flag } from "phosphor-react" import { useEffect } from "react" +import { addIntercomSettings } from "utils/intercom" import useGuild from "./hooks/useGuild" type Props = { diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/BuyPass.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/BuyPass.tsx index 0c918f712b..832e80f604 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/BuyPass.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/BuyPass.tsx @@ -1,3 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Alert, AlertDescription, @@ -13,8 +15,6 @@ import { Stack, } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import { useRoleMembership } from "components/explorer/hooks/useMembership" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPin.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPin.tsx index 7634dfa0cd..306b32273f 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPin.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPin.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { ModalBody, ModalCloseButton, @@ -11,7 +12,6 @@ import { useColorMode, } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import { useMintGuildPinContext } from "../../MintGuildPinContext" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPinButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPinButton.tsx index 5f22a6cee8..37d3116695 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPinButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/MintFuelGuildPinButton.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { useBalance, useProvider } from "@fuels/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" import useAlreadyMinted from "./hooks/useAlreadyMinted" import useFuelGuildPinFee from "./hooks/useFuelGuildPinFee" @@ -53,10 +53,10 @@ const MintFuelGuildPinButton = () => { {type === "EVM" ? "Connect Fuel address" : alreadyMinted - ? "Already minted" - : !isSufficientBalance - ? "Insufficient balance" - : "Mint NFT"} + ? "Already minted" + : !isSufficientBalance + ? "Insufficient balance" + : "Mint NFT"} ) } diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/hooks/useMintFuelGuildPin.ts b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/hooks/useMintFuelGuildPin.ts index 577b73dec2..7b7c8840c7 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/hooks/useMintFuelGuildPin.ts +++ b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/hooks/useMintFuelGuildPin.ts @@ -1,17 +1,16 @@ -import { env } from "env" /* eslint-disable @typescript-eslint/naming-convention */ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { useAccount, useProvider, useWallet } from "@fuels/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit" import { useToastWithTweetButton } from "hooks/useToast" import { useState } from "react" import fetcher from "utils/fetcher" +import parseFuelAddress from "utils/parseFuelAddress" import { useMintGuildPinContext } from "../../../MintGuildPinContext" import type { GuildActionInput } from "../GuildPinContractAbi" import { GuildPinContractAbi__factory } from "../GuildPinContractAbi_factory" -import parseFuelAddress from "../parseFuelAddress" import useFuelGuildPinFee from "./useFuelGuildPinFee" type FuelMintData = { diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/MintGuildPin.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/MintGuildPin.tsx index a1f3b0342d..960ecadda9 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/MintGuildPin.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/MintGuildPin.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { ModalBody, ModalCloseButton, @@ -12,7 +13,6 @@ import { } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" import useGuildPermission from "components/[guild]/hooks/useGuildPermission" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import dynamic from "next/dynamic" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/PurchaseRequirement.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/PurchaseRequirement.tsx index 43a6e95bed..d1eb3ad71f 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/PurchaseRequirement.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/PurchaseRequirement.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Collapse, Icon, @@ -12,7 +13,6 @@ import { Text, } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import { ShoppingCartSimple } from "phosphor-react" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/AlphaTag.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/AlphaTag.tsx index 7a2b9af75a..60ea437c69 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/AlphaTag.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/AlphaTag.tsx @@ -9,9 +9,9 @@ import { Tag, Text, } from "@chakra-ui/react" -import { triggerChat } from "components/_app/IntercomProvider" import Button from "components/common/Button" import { Chat } from "phosphor-react" +import { triggerChat } from "utils/intercom" const AlphaTag = () => ( diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx index 78b8269831..83e1db1363 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx @@ -1,3 +1,4 @@ +import { accountModalAtom } from "@/components/Providers/Providers" import { Circle, HStack, @@ -11,7 +12,6 @@ import { useColorModeValue, } from "@chakra-ui/react" import Button from "components/common/Button" -import { accountModalAtom } from "components/common/Layout/components/Account/components/AccountModal" import { useSetAtom } from "jotai" import { ArrowSquareOut, CaretDown } from "phosphor-react" import { useEffect } from "react" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentMethodButtons.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentMethodButtons.tsx index 5a6364e093..5b251e0f01 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentMethodButtons.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentMethodButtons.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Box, ButtonGroup, Tooltip } from "@chakra-ui/react" -import Button from "components/common/Button" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" +import Button from "components/common/Button" const PaymentMethodButtons = () => { const { captureEvent } = usePostHogContext() diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyAllowanceButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyAllowanceButton.tsx index bc1ff93db8..0e4e8fca91 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyAllowanceButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyAllowanceButton.tsx @@ -1,6 +1,6 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Collapse, Icon, Tooltip } from "@chakra-ui/react" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useToken from "hooks/useToken" import { Check, Question, Warning } from "phosphor-react" @@ -83,8 +83,8 @@ const BuyAllowanceButton = (): JSX.Element => { isVaultLoading || isAllowanceLoading ? "Checking allowance" : isAllowing - ? "Allowing" - : "Check your wallet" + ? "Allowing" + : "Check your wallet" } onClick={onClick} w="full" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyButton.tsx index 30cd19f432..f4419ddd5e 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/BuyButton.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useTokenBalance from "hooks/useTokenBalance" import useHasPaid from "requirements/Payment/hooks/useHasPaid" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx index e32ad21e21..11c4874145 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx @@ -1,6 +1,6 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Collapse, Tooltip } from "@chakra-ui/react" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" import { useSetAtom } from "jotai" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx index 4b08f9e1cb..cc5225cde0 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useUsersGuildPins from "hooks/useUsersGuildPins" import { useAccount, useBalance } from "wagmi" @@ -42,8 +42,8 @@ const MintGuildPinButton = (): JSX.Element => { const loadingText = isMinting ? mintLoadingText : isValidating - ? "Checking your NFTs" - : "Checking your balance" + ? "Checking your NFTs" + : "Checking your balance" const isDisabled = isInvalidImage || @@ -73,10 +73,10 @@ const MintGuildPinButton = (): JSX.Element => { {isInvalidImage || isTooSmallImage ? "Setup required" : alreadyMintedOnChain - ? "Already minted" - : !isSufficientBalance - ? "Insufficient balance" - : "Mint NFT"} + ? "Already minted" + : !isSufficientBalance + ? "Insufficient balance" + : "Mint NFT"} ) } diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseAllowanceButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseAllowanceButton.tsx index f8bd607850..9f5452840d 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseAllowanceButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseAllowanceButton.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Collapse, Icon, Tooltip } from "@chakra-ui/react" import useAllowance from "components/[guild]/Requirements/components/GuildCheckout/hooks/useAllowance" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useTokenData from "hooks/useTokenData" import { Check, Question, Warning } from "phosphor-react" @@ -76,8 +76,8 @@ const PurchaseAllowanceButton = (): JSX.Element => { isPriceLoading || isAllowanceLoading ? "Checking allowance" : isAllowing - ? "Allowing" - : "Check your wallet" + ? "Allowing" + : "Check your wallet" } onClick={onClick} w="full" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseButton.tsx index 5471d29c68..89c9dcda16 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/PurchaseButton.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import useTokenBalance from "hooks/useTokenBalance" import { NULL_ADDRESS, TOKEN_BUYER_CONTRACTS } from "utils/guildCheckout/constants" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx index 99b8b0c0f3..7b6bb46098 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx @@ -1,10 +1,10 @@ -import { env } from "env" -import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" -import useGuild from "components/[guild]/hooks/useGuild" import { isUserRejectedError, usePostHogContext, -} from "components/_app/PostHogProvider" +} from "@/components/Providers/PostHogProvider" +import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" +import useGuild from "components/[guild]/hooks/useGuild" +import { env } from "env" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit" import { useToastWithTweetButton } from "hooks/useToast" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePayFee.ts b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePayFee.ts index f87a6dff99..713cc2003d 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePayFee.ts +++ b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePayFee.ts @@ -1,6 +1,6 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmitTransaction from "hooks/useSubmitTransaction" import useToast from "hooks/useToast" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePurchaseAsset.ts b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePurchaseAsset.ts index 45e7a4fa33..bb79f70317 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePurchaseAsset.ts +++ b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/usePurchaseAsset.ts @@ -1,8 +1,8 @@ // import { BigNumber, BigNumberish } from "@ethersproject/bignumber" // import { Contract } from "@ethersproject/contracts" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmitTransaction from "hooks/useSubmitTransaction" import useToast from "hooks/useToast" diff --git a/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx b/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx index d9aa18c308..6eaf122f78 100644 --- a/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx +++ b/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx @@ -1,3 +1,4 @@ +import { accountModalAtom } from "@/components/Providers/Providers" import { ButtonGroup, Collapse, @@ -18,7 +19,6 @@ import RecheckAccessesButton from "components/[guild]/RecheckAccessesButton" import useGuild from "components/[guild]/hooks/useGuild" import useRequirements from "components/[guild]/hooks/useRequirements" import Button from "components/common/Button" -import { accountModalAtom } from "components/common/Layout/components/Account/components/AccountModal" import { useRoleMembership } from "components/explorer/hooks/useMembership" import { useSetAtom } from "jotai" import { @@ -113,8 +113,8 @@ const HiddenRequirementAccessIndicator = ({ roleId }: Props) => { role.logic === "AND" ? count.accessed === hiddenReqsAccessData.length : role.logic === "ANY_OF" - ? count.accessed >= role.anyOfNum - : count.accessed > 0 + ? count.accessed >= role.anyOfNum + : count.accessed > 0 ) return ( { {type === "CAPTCHA" ? "Complete CAPTCHA to check access" : type.startsWith("GITCOIN_") - ? "Setup GitCoin Passport to check access" - : "Connect account to check access"} + ? "Setup GitCoin Passport to check access" + : "Connect account to check access"} {type === "POLYGON_ID_QUERY" || type === "POLYGON_ID_BASIC" ? ( diff --git a/src/components/[guild]/Requirements/components/RequirementDisplayComponent.tsx b/src/components/[guild]/Requirements/components/RequirementDisplayComponent.tsx index 46bb5fc1c3..a3a1f77d4d 100644 --- a/src/components/[guild]/Requirements/components/RequirementDisplayComponent.tsx +++ b/src/components/[guild]/Requirements/components/RequirementDisplayComponent.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Icon } from "@chakra-ui/react" -import { usePostHogContext } from "components/_app/PostHogProvider" import DataBlock from "components/common/DataBlock" import { Question, Warning } from "phosphor-react" import { PropsWithChildren } from "react" diff --git a/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx b/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx index 61db803cde..1fa0e63c9d 100644 --- a/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx +++ b/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx @@ -1,3 +1,4 @@ +import { accountModalAtom } from "@/components/Providers/Providers" import { Box, Divider, @@ -12,7 +13,6 @@ import { useRequirementErrorConfig } from "components/[guild]/Requirements/Requi import useGuild from "components/[guild]/hooks/useGuild" import useRequirements from "components/[guild]/hooks/useRequirements" import Button from "components/common/Button" -import { accountModalAtom } from "components/common/Layout/components/Account/components/AccountModal" import useMembership, { useRoleMembership, } from "components/explorer/hooks/useMembership" diff --git a/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/SelectRewardPanel.tsx b/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/SelectRewardPanel.tsx index 8c251acc13..05c7033ff0 100644 --- a/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/SelectRewardPanel.tsx +++ b/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/SelectRewardPanel.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { ModalBody, ModalCloseButton, @@ -7,7 +8,6 @@ import { } from "@chakra-ui/react" import { PlatformName } from "@guildxyz/types" import { useAddRewardContext } from "components/[guild]/AddRewardContext" -import { usePostHogContext } from "components/_app/PostHogProvider" import PlatformsGrid from "components/create-guild/PlatformsGrid" import { PropsWithChildren } from "react" diff --git a/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddContractCallPanel/components/CreateNftForm/hooks/useCreateNft.ts b/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddContractCallPanel/components/CreateNftForm/hooks/useCreateNft.ts index ae527a5feb..0236a09311 100644 --- a/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddContractCallPanel/components/CreateNftForm/hooks/useCreateNft.ts +++ b/src/components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddContractCallPanel/components/CreateNftForm/hooks/useCreateNft.ts @@ -1,8 +1,8 @@ -import { env } from "env" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { datetimeLocalToIsoString } from "components/[guild]/RolePlatforms/components/EditRewardAvailabilityModal/components/StartEndTimeForm" import { guildNftRewardMetadataSchema } from "components/[guild]/collect/hooks/useNftDetails" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" +import { env } from "env" import pinFileToIPFS from "hooks/usePinata/utils/pinataUpload" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit" diff --git a/src/components/[guild]/Tabs/GuildTabs.tsx b/src/components/[guild]/Tabs/GuildTabs.tsx index 7ac4251b84..45ac512b2f 100644 --- a/src/components/[guild]/Tabs/GuildTabs.tsx +++ b/src/components/[guild]/Tabs/GuildTabs.tsx @@ -1,4 +1,4 @@ -import { usePostHogContext } from "components/_app/PostHogProvider" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { PlatformType } from "types" import { useAccessedGuildPoints } from "../AccessHub/hooks/useAccessedGuildPoints" import useGuild from "../hooks/useGuild" diff --git a/src/components/[guild]/activity/ActivityLogContext.tsx b/src/components/[guild]/activity/ActivityLogContext.tsx index f45ec47823..d8a8e84ca5 100644 --- a/src/components/[guild]/activity/ActivityLogContext.tsx +++ b/src/components/[guild]/activity/ActivityLogContext.tsx @@ -11,12 +11,12 @@ import { } from "react" import useSWRInfinite, { SWRInfiniteResponse } from "swr/infinite" import { PlatformName, Requirement } from "types" -import { useUserPublic } from "../hooks/useUser" import { isSupportedQueryParam, SupportedQueryParam, } from "./ActivityLogFiltersBar/components/ActivityLogFiltersContext" +import { useUserPublic } from "@/hooks/useUserPublic" import { ActivityLogAction, ActivityLogActionGroup, diff --git a/src/components/[guild]/claim-poap/components/ClaimPoapButton.tsx b/src/components/[guild]/claim-poap/components/ClaimPoapButton.tsx index b9c5d875c7..4bdaf1f657 100644 --- a/src/components/[guild]/claim-poap/components/ClaimPoapButton.tsx +++ b/src/components/[guild]/claim-poap/components/ClaimPoapButton.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { ButtonProps } from "@chakra-ui/react" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import { useRoleMembership } from "components/explorer/hooks/useMembership" import useShowErrorToast from "hooks/useShowErrorToast" @@ -67,8 +67,8 @@ const ClaimPoapButton = ({ rolePlatform, ...rest }: Props) => { isAccessLoading ? "Checking access" : isMembershipUpdateLoading - ? "Checking eligibility" - : "Claiming POAP" + ? "Checking eligibility" + : "Claiming POAP" } onClick={() => { captureEvent("Click: ClaimPoapButton", { @@ -92,8 +92,8 @@ const ClaimPoapButton = ({ rolePlatform, ...rest }: Props) => { {claimed ? "View mint link" : !hasRoleAccess - ? "Check access & claim" - : "Claim now"} + ? "Check access & claim" + : "Claim now"} ) } diff --git a/src/components/[guild]/collect/hooks/useCollectNft.ts b/src/components/[guild]/collect/hooks/useCollectNft.ts index 73a276a951..33cb4fb111 100644 --- a/src/components/[guild]/collect/hooks/useCollectNft.ts +++ b/src/components/[guild]/collect/hooks/useCollectNft.ts @@ -1,11 +1,11 @@ +import { + isUserRejectedError, + usePostHogContext, +} from "@/components/Providers/PostHogProvider" import { useTransactionStatusContext } from "components/[guild]/Requirements/components/GuildCheckout/components/TransactionStatusContext" import { ContractCallFunction } from "components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddContractCallPanel/components/CreateNftForm/hooks/useCreateNft" import useNftDetails from "components/[guild]/collect/hooks/useNftDetails" import useGuild from "components/[guild]/hooks/useGuild" -import { - isUserRejectedError, - usePostHogContext, -} from "components/_app/PostHogProvider" import useCustomPosthogEvents from "hooks/useCustomPosthogEvents" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useShowErrorToast from "hooks/useShowErrorToast" diff --git a/src/components/[guild]/crm/useMembers.tsx b/src/components/[guild]/crm/useMembers.tsx index d76cecd93d..017aa835b5 100644 --- a/src/components/[guild]/crm/useMembers.tsx +++ b/src/components/[guild]/crm/useMembers.tsx @@ -1,10 +1,10 @@ +import { useUserPublic } from "@/hooks/useUserPublic" import useActiveStatusUpdates from "hooks/useActiveStatusUpdates" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import { useCallback, useMemo } from "react" import useSWRInfinite from "swr/infinite" import { PlatformAccountDetails } from "types" import useGuild from "../hooks/useGuild" -import { useUserPublic } from "../hooks/useUser" import { sortAccounts } from "./Identities" type CrmRole = { diff --git a/src/components/[guild]/hooks/useUser.ts b/src/components/[guild]/hooks/useUser.ts index 7f597647eb..d729cb6567 100644 --- a/src/components/[guild]/hooks/useUser.ts +++ b/src/components/[guild]/hooks/useUser.ts @@ -1,35 +1,18 @@ -import { useToast } from "@/components/ui/hooks/useToast" -import { usePostHogContext } from "components/_app/PostHogProvider" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import { useFetcherWithSign } from "hooks/useFetcherWithSign" -import { - StoredKeyPair, - deleteKeyPairFromIdb, - getKeyPairFromIdb, -} from "hooks/useSetKeyPair" -import { useSetAtom } from "jotai" import { KeyedMutator } from "swr" import useSWRImmutable from "swr/immutable" import { User } from "types" -import fetcher from "utils/fetcher" - -// We don't open WaletSelectorModal on these routes -const ignoredRoutes = [ - "/_error", - "/tgauth", - "/oauth", - "/googleauth", - "/oauth-result", -] +import { StoredKeyPair } from "utils/keyPair" const useUser = ( userIdOrAddress?: number | string ): User & { isLoading: boolean; mutate: KeyedMutator; error: any } => { const { identifyUser } = usePostHogContext() const { address } = useWeb3ConnectionManager() - const { id } = useUserPublic() - const { keyPair } = useUserPublic() + const { id, keyPair } = useUserPublic() const fetcherWithSign = useFetcherWithSign() const idToUse = userIdOrAddress ?? id @@ -60,93 +43,4 @@ export type PublicUser = { keyPair?: StoredKeyPair } -const useUserPublic = ( - userIdOrAddress?: number | string -): PublicUser & { - isLoading: boolean - mutate: KeyedMutator - error: any - deleteKeys: () => Promise - setKeys: (keyPair: StoredKeyPair) => Promise -} => { - const { address } = useWeb3ConnectionManager() - const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - const { captureEvent } = usePostHogContext() - const { toast } = useToast() - - const idToUseRaw = userIdOrAddress ?? address - const idToUse = - typeof idToUseRaw === "string" ? idToUseRaw.toLowerCase() : idToUseRaw - - const { data, mutate, isLoading, error } = useSWRImmutable( - idToUse ? `/v2/users/${idToUse}/profile` : null, - async (url: string) => { - const user: PublicUser = await fetcher(url) - - const keys = await getKeyPairFromIdb(user.id) - - if (keys) { - if (keys.pubKey === user.publicKey) { - user.keyPair = keys - } else { - await deleteKeyPairFromIdb(user.id) - - captureEvent("Invalid keypair", { - userId: user.id, - pubKey: keys.pubKey, - savedPubKey: user.publicKey, - }) - - toast({ - variant: "warning", - title: "Session expired", - description: - "You've connected your account from a new device, so you have to sign a new message to stay logged in", - duration: 5000, - }) - } - } - - // If we didn't set the keyPair field, the user either doesn't have one locally, or has an invalid one - - // if (!user.keyPair && !ignoredRoutes.includes(router.route)) { - // setIsWalletSelectorModalOpen(true) - // } - - /** - * TODO: We use window.location.href because useRouter (from next/router) won't - * work in the app directory. We should use useRouter from next/navigation once - * we migrate everything to the app router. - */ - if (!user.keyPair && !ignoredRoutes.includes(window.location.pathname)) { - setIsWalletSelectorModalOpen(true) - } - - return user - }, - { - shouldRetryOnError: false, - onError: () => { - setIsWalletSelectorModalOpen(true) - }, - } - ) - - return { - isLoading, - ...data, - deleteKeys: async () => { - await mutate((prev) => ({ ...prev, keyPair: undefined }), { - revalidate: false, - }) - }, - setKeys: async (keyPair: StoredKeyPair) => { - await mutate((prev) => ({ ...prev, keyPair }), { revalidate: false }) - }, - mutate, - error, - } -} - -export { useUserPublic } export default useUser diff --git a/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx b/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx index 9ff40d289b..5aeefe7054 100644 --- a/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx +++ b/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx @@ -1,5 +1,5 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" import { Center, Collapse, Img, useColorModeValue } from "@chakra-ui/react" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" import ActionCard from "components/common/ActionCard" import Button from "components/common/Button" import { LinkButton } from "components/common/LinkMenuItem" diff --git a/src/components/_app/IntercomProvider.tsx b/src/components/_app/IntercomProvider.tsx index c935f8b10d..15440e6cdc 100644 --- a/src/components/_app/IntercomProvider.tsx +++ b/src/components/_app/IntercomProvider.tsx @@ -1,9 +1,10 @@ +import useConnectorNameAndIcon from "@/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useUser from "components/[guild]/hooks/useUser" import { useYourGuilds } from "components/explorer/YourGuilds" import { PropsWithChildren, useEffect, useRef, useState } from "react" import { Intercom, LiveChatLoaderProvider, useChat } from "react-live-chat-loader" -import useConnectorNameAndIcon from "./Web3ConnectionManager/hooks/useConnectorNameAndIcon" -import useWeb3ConnectionManager from "./Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { addIntercomSettings } from "utils/intercom" const IntercomProvider = ({ children }: PropsWithChildren) => { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -89,62 +90,5 @@ const IntercomTrigger = (props: PropsWithChildren) => { return
    } -const triggerChat = () => { - if (typeof window === "undefined") return - - if (window.Intercom) { - window.Intercom?.("show") - return - } - - const facade: HTMLButtonElement = document.querySelector( - ".live-chat-loader-placeholder [role='button']" - ) - facade?.click() -} - -const addIntercomSettings = (newData: Window["intercomSettings"]) => { - if (typeof window === "undefined" || !newData) return - - if (!window.intercomSettings) window.intercomSettings = {} - - const shouldUpdate = Object.entries(newData).some( - ([key, value]) => window.intercomSettings[key] !== value - ) - - if (!shouldUpdate) return - - window.intercomSettings = { - ...window.intercomSettings, - ...newData, - } - - // In case Intercom is loaded, we update the setting - window.Intercom?.("update", window.intercomSettings) -} - -const pushToIntercomSetting = (settingName: string, value: string) => { - if (typeof window === "undefined") return - - if (!window.intercomSettings) window.intercomSettings = {} - - if (window.intercomSettings[settingName]?.toString().length) - window.intercomSettings[settingName] += `,${value}` - else window.intercomSettings[settingName] = value - - // In case Intercom is loaded, we update the setting - window.Intercom?.("update", window.intercomSettings) -} - -declare global { - interface Window { - intercomSettings?: Record - Intercom?: ( - action: "show" | "update", - intercomSettings?: Window["intercomSettings"] - ) => void - } -} - export default IntercomProvider -export { addIntercomSettings, IntercomTrigger, pushToIntercomSetting, triggerChat } +export { IntercomTrigger } diff --git a/src/components/_app/LegacyPostHogProvider.tsx b/src/components/_app/LegacyPostHogProvider.tsx new file mode 100644 index 0000000000..6b98e8d13c --- /dev/null +++ b/src/components/_app/LegacyPostHogProvider.tsx @@ -0,0 +1,47 @@ +import { CustomPostHogProvider } from "@/components/Providers/PostHogProvider" +import { useRouter } from "next/router" +import { + PostHogProvider as DefaultPostHogProvider, + usePostHog, +} from "posthog-js/react" +import { ReactNode, useEffect } from "react" + +/** + * UseRouter doesn't work in app router & we also need to track page change events + * differently there, so we made this LegacyPostHogProvider which contains the page + * router related logic. + * + * We can delete it once we migrate to app router. + */ + +function LegacyPostHogPageViews() { + const router = useRouter() + const posthog = usePostHog() + + useEffect(() => { + const handleRouteChange = () => posthog.capture("$pageview") + router.events.on("routeChangeComplete", handleRouteChange) + + return () => { + router.events.off("routeChangeComplete", handleRouteChange) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + return null +} + +export function LegacyPostHogProvider({ + children, +}: { + children: ReactNode +}): JSX.Element { + return ( + + + {children} + + + + ) +} diff --git a/src/components/_app/LegacyWeb3ConnectionManager.tsx b/src/components/_app/LegacyWeb3ConnectionManager.tsx new file mode 100644 index 0000000000..0b8780678f --- /dev/null +++ b/src/components/_app/LegacyWeb3ConnectionManager.tsx @@ -0,0 +1,21 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { Web3ConnectionManagerBase } from "@/components/Web3ConnectionManager/Web3ConnectionManager" +import { useSetAtom } from "jotai" +import { useRouter } from "next/router" +import { useEffect } from "react" + +function useLegacyTriggerWalletSelectorModal() { + const { query } = useRouter() + const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) + const { isWeb3Connected } = useWeb3ConnectionManager() + + useEffect(() => { + if (!isWeb3Connected && query.redirectUrl) setIsWalletSelectorModalOpen(true) + }, [isWeb3Connected, query, setIsWalletSelectorModalOpen]) +} + +export function LegacyWeb3ConnectionManager() { + useLegacyTriggerWalletSelectorModal() + return +} diff --git a/src/components/_app/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/components/_app/Web3ConnectionManager/Web3ConnectionManager.tsx deleted file mode 100644 index ec46785681..0000000000 --- a/src/components/_app/Web3ConnectionManager/Web3ConnectionManager.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import ClientOnly from "components/common/ClientOnly" -import { useAtom } from "jotai" -import WalletSelectorModal, { - walletSelectorModalAtom, -} from "./components/WalletSelectorModal" -import useAutoReconnect from "./hooks/useAutoReconnect" -import useConnectFromLocalStorage from "./hooks/useConnectFromLocalStorage" -import { - useTriggerWalletSelectorModal, - useTriggerWalletSelectorModalLegacy, -} from "./hooks/useWeb3ConnectionManager" - -const BaseWeb3ConnectionManager = () => { - const [isWalletSelectorModalOpen, setIsWalletSelectorModalOpen] = useAtom( - walletSelectorModalAtom - ) - - useAutoReconnect() - useConnectFromLocalStorage() - - return ( - - setIsWalletSelectorModalOpen(true)} - onClose={() => setIsWalletSelectorModalOpen(false)} - /> - {/* - TODO: implement these components - - */} - - ) -} - -// Uses useRouter from next/router (works in pages router) -const LegacyWeb3ConnectionManager = () => { - useTriggerWalletSelectorModalLegacy() - return -} - -// Uses useRouter from next/navigation (works in app router) -const Web3ConnectionManager = () => { - useTriggerWalletSelectorModal() - return -} - -export default LegacyWeb3ConnectionManager -export { Web3ConnectionManager } diff --git a/src/components/_app/Web3ConnectionManager/index.ts b/src/components/_app/Web3ConnectionManager/index.ts deleted file mode 100644 index 7e8835f51b..0000000000 --- a/src/components/_app/Web3ConnectionManager/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Web3ConnectionManager from "./Web3ConnectionManager" - -export default Web3ConnectionManager diff --git a/src/components/common/DiscordGuildSetup/DiscordGuildSetup.tsx b/src/components/common/DiscordGuildSetup/DiscordGuildSetup.tsx index 18d45dfa6f..bb8429c807 100644 --- a/src/components/common/DiscordGuildSetup/DiscordGuildSetup.tsx +++ b/src/components/common/DiscordGuildSetup/DiscordGuildSetup.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { GridItem, SimpleGrid } from "@chakra-ui/react" import { useAddRewardDiscardAlert } from "components/[guild]/AddRewardButton/hooks/useAddRewardDiscardAlert" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import ErrorAlert from "components/common/ErrorAlert" import { AnimatePresence } from "framer-motion" import useDebouncedState from "hooks/useDebouncedState" diff --git a/src/components/common/DiscordGuildSetup/components/ServerSetupCard/ServerSetupCard.tsx b/src/components/common/DiscordGuildSetup/components/ServerSetupCard/ServerSetupCard.tsx index c7ba84b3a8..6cb457e442 100644 --- a/src/components/common/DiscordGuildSetup/components/ServerSetupCard/ServerSetupCard.tsx +++ b/src/components/common/DiscordGuildSetup/components/ServerSetupCard/ServerSetupCard.tsx @@ -1,9 +1,9 @@ -import { env } from "env" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Img, Skeleton, Stack, Text, VStack } from "@chakra-ui/react" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import Card from "components/common/Card" import DiscordRoleVideo from "components/common/DiscordRoleVideo" +import { env } from "env" import useCountdownSeconds from "hooks/useCountdownSeconds" import usePopupWindow from "hooks/usePopupWindow" import useServerPermissions from "hooks/useServerPermissions" diff --git a/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx b/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx index 620a87f2df..2e69682a2d 100644 --- a/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx +++ b/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx @@ -1,4 +1,4 @@ -import { env } from "env" +import { accountModalAtom } from "@/components/Providers/Providers" import { ButtonGroup, GridItem, @@ -16,6 +16,7 @@ import { } from "@chakra-ui/react" import useUser from "components/[guild]/hooks/useUser" import Button from "components/common/Button" +import { env } from "env" import { AnimatePresence } from "framer-motion" import useGateables from "hooks/useGateables" import { useSetAtom } from "jotai" @@ -25,7 +26,6 @@ import { useFormContext, useWatch } from "react-hook-form" import { PlatformType } from "types" import AddCard from "../AddCard" import CardMotionWrapper from "../CardMotionWrapper" -import { accountModalAtom } from "../Layout/components/Account/components/AccountModal" import { Modal } from "../Modal" import GoogleDocCard, { GoogleSkeletonCard } from "./components/GoogleDocCard" import GoogleDocSetupCard from "./components/GoogleDocSetupCard" diff --git a/src/components/common/Layout/components/Account/Account.tsx b/src/components/common/Layout/components/Account/Account.tsx index f20147ed3b..b3d3e702f3 100644 --- a/src/components/common/Layout/components/Account/Account.tsx +++ b/src/components/common/Layout/components/Account/Account.tsx @@ -1,22 +1,17 @@ -import { ButtonGroup, Divider, HStack, Text, VStack } from "@chakra-ui/react" +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { ButtonGroup, Divider } from "@chakra-ui/react" import useUser from "components/[guild]/hooks/useUser" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import GuildAvatar from "components/common/GuildAvatar" -import useResolveAddress from "hooks/useResolveAddress" import { useSetAtom } from "jotai" import { SignIn } from "phosphor-react" -import shortenHex from "utils/shortenHex" import AccountButton from "./components/AccountButton" -import { accountModalAtom } from "./components/AccountModal" import Notifications from "./components/Notifications/Notifications" const Account = (): JSX.Element => { const { address } = useWeb3ConnectionManager() - const setIsAccountModalOpen = useSetAtom(accountModalAtom) const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - const domainName = useResolveAddress(address) + // const domainName = useResolveAddress(address) const { addresses } = useUser() if (!address) { @@ -46,7 +41,7 @@ const Account = (): JSX.Element => { */ h="var(--chakra-space-11)" /> - setIsAccountModalOpen(true)}> + {/* setIsAccountModalOpen(true)}> { - + */} ) } diff --git a/src/components/common/Layout/components/Account/components/AccountModal/AccountModal.tsx b/src/components/common/Layout/components/Account/components/AccountModal/AccountModal.tsx deleted file mode 100644 index 11ce6fd479..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/AccountModal.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { - Center, - Circle, - Divider, - HStack, - Icon, - IconButton, - Img, - ModalBody, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalOverlay, - Stack, - Text, - Tooltip, - useColorModeValue, - useDisclosure, -} from "@chakra-ui/react" -import useUser, { useUserPublic } from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" -import useConnectorNameAndIcon from "components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import Button from "components/common/Button" -import CopyableAddress from "components/common/CopyableAddress" -import GuildAvatar from "components/common/GuildAvatar" -import { Modal } from "components/common/Modal" -import useResolveAddress from "hooks/useResolveAddress" -import { deleteKeyPairFromIdb } from "hooks/useSetKeyPair" -import { useAtom } from "jotai" -import { LinkBreak, SignOut } from "phosphor-react" -import { useAccount } from "wagmi" -import { CHAIN_CONFIG, Chains } from "wagmiConfig/chains" -import { accountModalAtom } from "." -import NetworkModal from "../NetworkModal" -import AccountConnections from "./components/AccountConnections" -import UsersGuildPins from "./components/UsersGuildCredentials" - -const AccountModal = () => { - const { address, type, disconnect } = useWeb3ConnectionManager() - const [isOpen, setIsOpen] = useAtom(accountModalAtom) - const onClose = () => setIsOpen(false) - - const { address: evmAddress, chainId } = useAccount() - - const { - isOpen: isNetworkModalOpen, - onOpen: openNetworkModal, - onClose: closeNetworkModal, - } = useDisclosure() - const { captureEvent } = usePostHogContext() - const { id } = useUser() - const { deleteKeys } = useUserPublic() - - const handleLogout = () => { - const keysToRemove = Object.keys({ ...window.localStorage }).filter((key) => - /^dc_auth_[a-z]*$/.test(key) - ) - - keysToRemove.forEach((key) => { - window.localStorage.removeItem(key) - }) - - deleteKeyPairFromIdb(id) - ?.catch(() => {}) - .finally(() => { - onClose() - disconnect() - deleteKeys() - }) - } - - const domain = useResolveAddress(evmAddress) - - const avatarBg = useColorModeValue("gray.100", "blackAlpha.200") - - const { connectorName } = useConnectorNameAndIcon() - - return ( - - - - Account - - {address ? ( - <> - - - - - - - - - - - - {`Connected with ${connectorName} on`} - - {type === "EVM" ? ( - - ) : ( -
    - -
    - )} -
    - -
    - - - } - aria-label="Disconnect" - /> - - -
    - - - - -
    - - ) : ( - - - Not connected - - - )} -
    -
    - ) -} - -export default AccountModal diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx index 339a19b717..52344c92a2 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx @@ -1,19 +1,13 @@ +import { + addressLinkParamsAtom, + walletSelectorModalAtom, +} from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useUser from "components/[guild]/hooks/useUser" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" -import { atom, useSetAtom } from "jotai" +import { useSetAtom } from "jotai" import { Plus } from "phosphor-react" -export type AddressLinkParams = { - userId?: number - address?: `0x${string}` -} -export const addressLinkParamsAtom = atom({ - userId: undefined, - address: undefined, -}) - const LinkAddressButton = (props) => { const { id } = useUser() diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx index 55df2fe794..095d4c3adf 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx @@ -1,3 +1,4 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { AlertDialogBody, AlertDialogContent, @@ -21,7 +22,6 @@ import { useColorModeValue, useDisclosure, } from "@chakra-ui/react" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" import CopyableAddress from "components/common/CopyableAddress" import GuildAvatar from "components/common/GuildAvatar" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx index 8eb4025bec..f9cef0f53e 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Accordion, AccordionButton, @@ -23,7 +24,6 @@ import { useDisclosure, } from "@chakra-ui/react" import useUser from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import { useFetcherWithSign } from "hooks/useFetcherWithSign" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx index 75f4116f15..e1b10e330e 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx @@ -1,6 +1,6 @@ +import { accountModalAtom } from "@/components/Providers/Providers" import { Link } from "@chakra-ui/next-js" import { Card, Circle, Img, Tag, useColorModeValue } from "@chakra-ui/react" -import { accountModalAtom } from "components/common/Layout/components/Account/components/AccountModal" import { useSetAtom } from "jotai" type Props = { diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx index 6be72d18a5..85e3731450 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx @@ -1,5 +1,5 @@ +import { accountModalAtom } from "@/components/Providers/Providers" import { Alert, AlertIcon, Box, Flex, Text } from "@chakra-ui/react" -import { accountModalAtom } from "components/common/Layout/components/Account/components/AccountModal" import useUsersGuildPins from "hooks/useUsersGuildPins" import { useAtomValue } from "jotai" import { AccountSectionTitle } from "../AccountConnections" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/index.ts b/src/components/common/Layout/components/Account/components/AccountModal/index.ts deleted file mode 100644 index 3fe0f90a11..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { atom } from "jotai" -import AccountModal from "./AccountModal" - -export const accountModalAtom = atom(false) - -export default AccountModal diff --git a/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx b/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx index 89658f49c4..b22b707698 100644 --- a/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx +++ b/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx @@ -1,3 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Divider, Icon, @@ -11,8 +13,6 @@ import { } from "@chakra-ui/react" import { ActivityLogProvider } from "components/[guild]/activity/ActivityLogContext" import useUser from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useLocalStorage from "hooks/useLocalStorage" import dynamic from "next/dynamic" import { Bell } from "phosphor-react" diff --git a/src/components/create-guild/CreateGuildButton.tsx b/src/components/create-guild/CreateGuildButton.tsx index a6d198697a..146875c8a3 100644 --- a/src/components/create-guild/CreateGuildButton.tsx +++ b/src/components/create-guild/CreateGuildButton.tsx @@ -1,6 +1,6 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Collapse, Stack } from "@chakra-ui/react" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Button from "components/common/Button" import { useSetAtom } from "jotai" import { useFormContext } from "react-hook-form" diff --git a/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx b/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx index 7735e2e3b2..8dbe7b4d5a 100644 --- a/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx +++ b/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx @@ -1,3 +1,5 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Circle, Heading, @@ -11,8 +13,6 @@ import { } from "@chakra-ui/react" import useUser from "components/[guild]/hooks/useUser" import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import DisplayCard from "components/common/DisplayCard" import { useSetAtom } from "jotai" import dynamic from "next/dynamic" @@ -90,10 +90,10 @@ const PlatformSelectButton = ({ !!disabledText ? undefined : !isWeb3Connected - ? () => setIsWalletSelectorModalOpen(true) - : isPlatformConnected - ? selectPlatform - : onConnect + ? () => setIsWalletSelectorModalOpen(true) + : isPlatformConnected + ? selectPlatform + : onConnect } h="auto" {...rest} diff --git a/src/components/create-guild/hooks/useCreateGuild.tsx b/src/components/create-guild/hooks/useCreateGuild.tsx index 41d32d2ad5..fde14205c0 100644 --- a/src/components/create-guild/hooks/useCreateGuild.tsx +++ b/src/components/create-guild/hooks/useCreateGuild.tsx @@ -1,6 +1,6 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Schemas } from "@guildxyz/types" import processConnectorError from "components/[guild]/JoinModal/utils/processConnectorError" -import { usePostHogContext } from "components/_app/PostHogProvider" import useJsConfetti from "components/create-guild/hooks/useJsConfetti" import { useYourGuilds } from "components/explorer/YourGuilds" import useMatchMutate from "hooks/useMatchMutate" diff --git a/src/components/create-guild/hooks/useCreateRole.tsx b/src/components/create-guild/hooks/useCreateRole.tsx index d5fb058bb8..fa34ab9754 100644 --- a/src/components/create-guild/hooks/useCreateRole.tsx +++ b/src/components/create-guild/hooks/useCreateRole.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import processConnectorError from "components/[guild]/JoinModal/utils/processConnectorError" import useGuild from "components/[guild]/hooks/useGuild" import useRoleGroup from "components/[guild]/hooks/useRoleGroup" -import { usePostHogContext } from "components/_app/PostHogProvider" import useJsConfetti from "components/create-guild/hooks/useJsConfetti" import { useYourGuilds } from "components/explorer/YourGuilds" import useCustomPosthogEvents from "hooks/useCustomPosthogEvents" diff --git a/src/components/explorer/ExploreAllGuilds.tsx b/src/components/explorer/ExploreAllGuilds.tsx index 2e1d3fb27b..f8ef1a474e 100644 --- a/src/components/explorer/ExploreAllGuilds.tsx +++ b/src/components/explorer/ExploreAllGuilds.tsx @@ -1,3 +1,4 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Center, Divider, @@ -15,7 +16,6 @@ import { TABS_HEIGHT_SM, TABS_SM_BUTTONS_STYLES, } from "components/[guild]/Tabs/Tabs" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import ClientOnly from "components/common/ClientOnly" import Section from "components/common/Section" import ExplorerCardMotionWrapper from "components/explorer/ExplorerCardMotionWrapper" diff --git a/src/components/explorer/YourGuilds.tsx b/src/components/explorer/YourGuilds.tsx index b1c9a02036..4ed2f8cec9 100644 --- a/src/components/explorer/YourGuilds.tsx +++ b/src/components/explorer/YourGuilds.tsx @@ -1,6 +1,6 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Box, HStack, Img, Stack, Text } from "@chakra-ui/react" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import ActionCard from "components/common/ActionCard" import Button from "components/common/Button" import Card from "components/common/Card" diff --git a/src/components/explorer/hooks/useMembership.ts b/src/components/explorer/hooks/useMembership.ts index 9c36d5f073..eedaead18a 100644 --- a/src/components/explorer/hooks/useMembership.ts +++ b/src/components/explorer/hooks/useMembership.ts @@ -1,5 +1,5 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useGuild from "components/[guild]/hooks/useGuild" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useSWRWithOptionalAuth from "hooks/useSWRWithOptionalAuth" export type Membership = { diff --git a/src/hooks/useCreateRRR.tsx b/src/hooks/useCreateRRR.tsx index fc19102bd1..4c9f537918 100644 --- a/src/hooks/useCreateRRR.tsx +++ b/src/hooks/useCreateRRR.tsx @@ -1,8 +1,8 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useCreateRequirements from "components/[guild]/AddRewardButton/hooks/useCreateRequirements" import useCreateRolePlatforms from "components/[guild]/AddRewardButton/hooks/useCreateRolePlatforms" import useMutateAdditionsToRoles from "components/[guild]/AddRewardButton/hooks/useMutateAdditionsToRoles" import useMutateCreatedRole from "components/[guild]/AddRewardButton/hooks/useMutateCreatedRole" -import { usePostHogContext } from "components/_app/PostHogProvider" import useCreateRole, { RoleToCreate, } from "components/create-guild/hooks/useCreateRole" diff --git a/src/hooks/useCustomPosthogEvents.ts b/src/hooks/useCustomPosthogEvents.ts index b1e5d6a300..4888091bb0 100644 --- a/src/hooks/useCustomPosthogEvents.ts +++ b/src/hooks/useCustomPosthogEvents.ts @@ -1,6 +1,6 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" import useUser from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" import { PlatformType } from "types" export default function useCustomPosthogEvents() { diff --git a/src/hooks/useFetcherWithSign.ts b/src/hooks/useFetcherWithSign.ts index ab4090c773..7f95a6c0c5 100644 --- a/src/hooks/useFetcherWithSign.ts +++ b/src/hooks/useFetcherWithSign.ts @@ -1,6 +1,6 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import { useWallet } from "@fuels/react" -import { useUserPublic } from "components/[guild]/hooks/useUser" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useTimeInaccuracy from "hooks/useTimeInaccuracy" import { fetcherWithSign, fuelFetcherWithSign } from "utils/fetcher" import { useChainId, usePublicClient, useWalletClient } from "wagmi" diff --git a/src/hooks/useGateables.ts b/src/hooks/useGateables.ts index 326b9d6159..87e056539a 100644 --- a/src/hooks/useGateables.ts +++ b/src/hooks/useGateables.ts @@ -1,5 +1,6 @@ +import { useUserPublic } from "@/hooks/useUserPublic" import { DiscordGateable, GitHubGateable, GoogleGateable } from "@guildxyz/types" -import useUser, { useUserPublic } from "components/[guild]/hooks/useUser" +import useUser from "components/[guild]/hooks/useUser" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useSWR, { SWRConfiguration } from "swr" import { PlatformType } from "types" diff --git a/src/hooks/useOAuthResultToast.ts b/src/hooks/useOAuthResultToast.ts index f819601864..98525e4a65 100644 --- a/src/hooks/useOAuthResultToast.ts +++ b/src/hooks/useOAuthResultToast.ts @@ -1,4 +1,4 @@ -import { platformMergeAlertAtom } from "components/_app/Web3ConnectionManager/components/PlatformMergeErrorAlert" +import { platformMergeAlertAtom } from "@/components/Web3ConnectionManager/PlatformMergeErrorAlert" import { useSetAtom } from "jotai" import { useRouter } from "next/router" import rewards from "platforms/rewards" diff --git a/src/hooks/useSWRWithOptionalAuth.ts b/src/hooks/useSWRWithOptionalAuth.ts index 5729a5c9bd..2475a3396a 100644 --- a/src/hooks/useSWRWithOptionalAuth.ts +++ b/src/hooks/useSWRWithOptionalAuth.ts @@ -1,5 +1,5 @@ -import { useUserPublic } from "components/[guild]/hooks/useUser" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useSWR, { mutate, MutatorOptions, SWRResponse, unstable_serialize } from "swr" import useSWRImmutable from "swr/immutable" diff --git a/src/hooks/useSetKeyPair.ts b/src/hooks/useSetKeyPair.ts index 8d74d05b70..20097773c8 100644 --- a/src/hooks/useSetKeyPair.ts +++ b/src/hooks/useSetKeyPair.ts @@ -1,11 +1,11 @@ -import { useUserPublic } from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import { useFetcherWithSign } from "hooks/useFetcherWithSign" -import { createStore, del, get, set } from "idb-keyval" import { useAtomValue, useSetAtom } from "jotai" import { useEffect } from "react" import { mutate } from "swr" +import { setKeyPairToIdb, StoredKeyPair } from "utils/keyPair" import { recaptchaAtom, shouldUseReCAPTCHAAtom } from "utils/recaptcha" import { checksumAddress } from "viem" import useSubmit from "./useSubmit" @@ -40,25 +40,12 @@ Issued At: ${new Date(+ts).toISOString()}` */ const RPC_INTERNAL_ERROR_CODE = -32603 -export type StoredKeyPair = { - keyPair: CryptoKeyPair - pubKey: string -} - type SetKeypairPayload = Omit & { verificationParams?: { reCaptcha: string } } -const getStore = () => createStore("guild.xyz", "signingKeyPairs") -export const getKeyPairFromIdb = (userId: number) => - get(userId, getStore()) -export const deleteKeyPairFromIdb = (userId: number) => - userId ? del(userId, getStore()) : null -const setKeyPairToIdb = (userId: number, keys: StoredKeyPair) => - set(userId, keys, getStore()) - const generateKeyPair = async () => { const keyPair: StoredKeyPair = { pubKey: undefined, diff --git a/src/hooks/useSubmit/useSubmit.ts b/src/hooks/useSubmit/useSubmit.ts index 37453d6d16..e499e2ac52 100644 --- a/src/hooks/useSubmit/useSubmit.ts +++ b/src/hooks/useSubmit/useSubmit.ts @@ -1,6 +1,6 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import { useWallet } from "@fuels/react" -import { useUserPublic } from "components/[guild]/hooks/useUser" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Account } from "fuels" import useLocalStorage from "hooks/useLocalStorage" import useTimeInaccuracy from "hooks/useTimeInaccuracy" @@ -173,27 +173,28 @@ const useSubmitWithSignWithParamKeyPair = ( setSignLoadingText(defaultLoadingText) setIsSigning(true) - const [signedPayload, validation] = await (type === "EVM" - ? sign({ - publicClient, - walletClient, - address, - payload, - chainId: chainId.toString(), - forcePrompt, - keyPair, - msg: message, - ts: Date.now() + timeInaccuracy, - }) - : fuelSign({ - wallet: fuelWallet, - address, - payload, - forcePrompt, - keyPair, - msg: message, - ts: Date.now() + timeInaccuracy, - }) + const [signedPayload, validation] = await ( + type === "EVM" + ? sign({ + publicClient, + walletClient, + address, + payload, + chainId: chainId.toString(), + forcePrompt, + keyPair, + msg: message, + ts: Date.now() + timeInaccuracy, + }) + : fuelSign({ + wallet: fuelWallet, + address, + payload, + forcePrompt, + keyPair, + msg: message, + ts: Date.now() + timeInaccuracy, + }) ) .then(async ([signed, val]) => { const callbackData = signCallbacks.find(({ domain }) => diff --git a/src/hooks/useUsersGuildPins.ts b/src/hooks/useUsersGuildPins.ts index df77178c09..7863b45ca9 100644 --- a/src/hooks/useUsersGuildPins.ts +++ b/src/hooks/useUsersGuildPins.ts @@ -1,5 +1,5 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import useUser from "components/[guild]/hooks/useUser" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import guildPinAbi from "static/abis/guildPin" import useSWRImmutable from "swr/immutable" import { GuildPinMetadata, User } from "types" @@ -191,7 +191,7 @@ const fetchGuildPinsOnChain = async ( const fetchGuildPins = async ([_, addresses, includeTestnets]: [ string, User["addresses"], - boolean + boolean, ]) => { const TESTNET_KEYS: GuildPinsSupportedChain[] = ["SEPOLIA"] const guildPinChains = Object.keys(GUILD_PIN_CONTRACTS).filter((key) => diff --git a/src/pages/[guild]/claim-poap/[fancyId].tsx b/src/pages/[guild]/claim-poap/[fancyId].tsx index b59c448d09..4aa179cfe9 100644 --- a/src/pages/[guild]/claim-poap/[fancyId].tsx +++ b/src/pages/[guild]/claim-poap/[fancyId].tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Box, Divider, @@ -17,7 +18,6 @@ import ShareAndReportButtons from "components/[guild]/collect/components/ShareAn import SmallImageAndRoleName from "components/[guild]/collect/components/SmallImageAndRoleName" import useShouldShowSmallImage from "components/[guild]/collect/hooks/useShouldShowSmallImage" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Layout from "components/common/Layout" import LinkPreviewHead from "components/common/LinkPreviewHead" import { AnimatePresence } from "framer-motion" diff --git a/src/pages/[guild]/collect/[chain]/[address].tsx b/src/pages/[guild]/collect/[chain]/[address].tsx index 59c6894248..c4e9297eb7 100644 --- a/src/pages/[guild]/collect/[chain]/[address].tsx +++ b/src/pages/[guild]/collect/[chain]/[address].tsx @@ -1,3 +1,4 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Box, Divider, @@ -27,7 +28,6 @@ import useShouldShowSmallImage from "components/[guild]/collect/hooks/useShouldS import useGuild from "components/[guild]/hooks/useGuild" import useGuildPermission from "components/[guild]/hooks/useGuildPermission" import useGuildPlatform from "components/[guild]/hooks/useGuildPlatform" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Layout from "components/common/Layout" import LinkPreviewHead from "components/common/LinkPreviewHead" import { env } from "env" diff --git a/src/pages/[guild]/index.tsx b/src/pages/[guild]/index.tsx index e602d41dff..8a204d8e34 100644 --- a/src/pages/[guild]/index.tsx +++ b/src/pages/[guild]/index.tsx @@ -31,7 +31,6 @@ import SocialIcon from "components/[guild]/SocialIcon" import useStayConnectedToast from "components/[guild]/StayConnectedToast" import GuildTabs from "components/[guild]/Tabs/GuildTabs" import { ThemeProvider, useThemeContext } from "components/[guild]/ThemeContext" -import { addIntercomSettings } from "components/_app/IntercomProvider" import GuildLogo from "components/common/GuildLogo" import Layout from "components/common/Layout" import BackButton from "components/common/Layout/components/BackButton" @@ -49,6 +48,7 @@ import { useEffect } from "react" import { SWRConfig } from "swr" import { Guild, SocialLinkKey } from "types" import fetcher from "utils/fetcher" +import { addIntercomSettings } from "utils/intercom" import parseDescription from "utils/parseDescription" const DynamicOngoingIssuesBanner = dynamic( diff --git a/src/pages/[guild]/leaderboard/[pointsId].tsx b/src/pages/[guild]/leaderboard/[pointsId].tsx index c29931afca..708f013e99 100644 --- a/src/pages/[guild]/leaderboard/[pointsId].tsx +++ b/src/pages/[guild]/leaderboard/[pointsId].tsx @@ -1,3 +1,4 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Alert, AlertDescription, @@ -23,7 +24,6 @@ import LeaderboardUserCard, { LeaderboardUserCardSkeleton, } from "components/[guild]/leaderboard/LeaderboardUserCard" import usePointsLeaderboard from "components/[guild]/leaderboard/hooks/usePointsLeaderboard" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import Card from "components/common/Card" import ErrorAlert from "components/common/ErrorAlert" import GuildLogo from "components/common/GuildLogo" diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 2b9b7ba113..d0fce488a2 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -5,9 +5,6 @@ import { bugsnagStart } from "bugsnag" import AppErrorBoundary from "components/_app/AppErrorBoundary" import Chakra from "components/_app/Chakra" import IntercomProvider from "components/_app/IntercomProvider" -import { LegacyPostHogProvider } from "components/_app/PostHogProvider" -import Web3ConnectionManager from "components/_app/Web3ConnectionManager" -import ClientOnly from "components/common/ClientOnly" import { env } from "env" import { dystopian, inter } from "fonts" import { fuelConfig } from "fuelConfig" @@ -30,6 +27,9 @@ import "../app/globals.css" * https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inert#browser_compatibility */ import { AccountModal } from "@/components/Account/components/AccountModal" +import { LegacyPostHogProvider } from "components/_app/LegacyPostHogProvider" +import { LegacyWeb3ConnectionManager } from "components/_app/LegacyWeb3ConnectionManager" +import ClientOnly from "components/common/ClientOnly" import "wicg-inert" const DynamicReCAPTCHA = dynamic(() => import("components/common/ReCAPTCHA")) @@ -132,7 +132,7 @@ const App = ({ - + diff --git a/src/pages/_error.tsx b/src/pages/_error.tsx index 5c33f67ab1..719244e9f9 100644 --- a/src/pages/_error.tsx +++ b/src/pages/_error.tsx @@ -1,9 +1,10 @@ import { Flex, Heading, Icon, Stack } from "@chakra-ui/react" -import IntercomProvider, { triggerChat } from "components/_app/IntercomProvider" +import IntercomProvider from "components/_app/IntercomProvider" import Button from "components/common/Button" import Head from "next/head" import { ChatCircle, House } from "phosphor-react" import NotFoundIcon from "static/avatars/58.svg" +import { triggerChat } from "utils/intercom" const Page = ({ statusCode }): JSX.Element => ( <> diff --git a/src/pages/oauth.tsx b/src/pages/oauth.tsx index 04f77645f0..b20e0c1621 100644 --- a/src/pages/oauth.tsx +++ b/src/pages/oauth.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import AuthRedirect from "components/AuthRedirect" import { Message } from "components/[guild]/JoinModal/hooks/useOauthPopupWindow" -import { usePostHogContext } from "components/_app/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import { useRouter } from "next/dist/client/router" import { useCallback, useEffect } from "react" diff --git a/src/platforms/ContractCall/ContractCallCardMenu.tsx b/src/platforms/ContractCall/ContractCallCardMenu.tsx index e8f67f0e95..1f643054bd 100644 --- a/src/platforms/ContractCall/ContractCallCardMenu.tsx +++ b/src/platforms/ContractCall/ContractCallCardMenu.tsx @@ -1,3 +1,4 @@ +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { MenuItem, useDisclosure } from "@chakra-ui/react" import RemovePlatformMenuItem from "components/[guild]/AccessHub/components/RemovePlatformMenuItem" import { ContractCallFunction } from "components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddContractCallPanel/components/CreateNftForm/hooks/useCreateNft" @@ -5,7 +6,6 @@ import PlatformCardMenu from "components/[guild]/RolePlatforms/components/Platfo import useNftDetails from "components/[guild]/collect/hooks/useNftDetails" import useGuild from "components/[guild]/hooks/useGuild" import useGuildPermission from "components/[guild]/hooks/useGuildPermission" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { PencilSimple } from "phosphor-react" import EditNFTDescriptionModal from "./components/EditNFTDescriptionModal" import EditNftModal from "./components/EditNftModal" diff --git a/src/platforms/ContractCall/ContractCallReward.tsx b/src/platforms/ContractCall/ContractCallReward.tsx index 26ebce95c1..1034cd5e54 100644 --- a/src/platforms/ContractCall/ContractCallReward.tsx +++ b/src/platforms/ContractCall/ContractCallReward.tsx @@ -10,7 +10,7 @@ import { RewardProps, } from "../../components/[guild]/RoleCard/components/Reward" -import { usePostHogContext } from "components/_app/PostHogProvider" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import Link from "next/link" import { forwardRef } from "react" import NftAvailabilityTags from "./components/NftAvailabilityTags" diff --git a/src/platforms/ContractCall/ContractCallRewardCardButton.tsx b/src/platforms/ContractCall/ContractCallRewardCardButton.tsx index 59d5c81519..c78931d70a 100644 --- a/src/platforms/ContractCall/ContractCallRewardCardButton.tsx +++ b/src/platforms/ContractCall/ContractCallRewardCardButton.tsx @@ -1,7 +1,7 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Tooltip } from "@chakra-ui/react" import useGuildRewardNftBalanceByUserId from "components/[guild]/collect/hooks/useGuildRewardNftBalanceByUserId" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import Link from "next/link" import { GuildPlatform } from "types" diff --git a/src/platforms/Token/EditTokenModal.tsx b/src/platforms/Token/EditTokenModal.tsx index e9cafef78a..79edf90aa9 100644 --- a/src/platforms/Token/EditTokenModal.tsx +++ b/src/platforms/Token/EditTokenModal.tsx @@ -1,3 +1,4 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Accordion, AccordionButton, @@ -25,7 +26,6 @@ import useGuild from "components/[guild]/hooks/useGuild" import useGuildPlatform from "components/[guild]/hooks/useGuildPlatform" import useRequirements from "components/[guild]/hooks/useRequirements" import SnapshotModal from "components/[guild]/leaderboard/Snapshots/SnapshotModal" -import { usePostHogContext } from "components/_app/PostHogProvider" import Button from "components/common/Button" import { SectionTitle } from "components/common/Section" import OptionImage from "components/common/StyledSelect/components/CustomSelectOption/components/OptionImage" @@ -262,8 +262,8 @@ const EditTokenModal = ({ rpIsLoading ? "Updating the conversion rate..." : reqIsLoading - ? "Updating the snapshot..." - : "Saving..." + ? "Updating the snapshot..." + : "Saving..." } size="lg" width="fill" diff --git a/src/platforms/Token/GeogatedCountryAlert.tsx b/src/platforms/Token/GeogatedCountryAlert.tsx index 5179e506b0..d1fd04904c 100644 --- a/src/platforms/Token/GeogatedCountryAlert.tsx +++ b/src/platforms/Token/GeogatedCountryAlert.tsx @@ -10,11 +10,11 @@ import { PopoverTrigger, Portal, } from "@chakra-ui/react" -import { triggerChat } from "components/_app/IntercomProvider" import Button from "components/common/Button" import { IpGeodata } from "pages/api/ip-geodata" import { Chat } from "phosphor-react" import useSWRImmutable from "swr/immutable" +import { triggerChat } from "utils/intercom" const BLOCKED_COUNTRY_CODES = [ "US", diff --git a/src/platforms/Token/hooks/useCollectToken.tsx b/src/platforms/Token/hooks/useCollectToken.tsx index 785c0b29be..e134276bf1 100644 --- a/src/platforms/Token/hooks/useCollectToken.tsx +++ b/src/platforms/Token/hooks/useCollectToken.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useGuild from "components/[guild]/hooks/useGuild" -import { usePostHogContext } from "components/_app/PostHogProvider" import useCustomPosthogEvents from "hooks/useCustomPosthogEvents" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useShowErrorToast from "hooks/useShowErrorToast" diff --git a/src/platforms/Token/hooks/useFundPool.tsx b/src/platforms/Token/hooks/useFundPool.tsx index b215b449e5..56e3ce3744 100644 --- a/src/platforms/Token/hooks/useFundPool.tsx +++ b/src/platforms/Token/hooks/useFundPool.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useIsBalanceSufficient from "components/[guild]/RolePlatforms/components/AddRoleRewardModal/components/AddTokenPanel/hooks/useIsBalanceSufficient" -import { usePostHogContext } from "components/_app/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmitTransaction from "hooks/useSubmitTransaction" import useTokenData from "hooks/useTokenData" diff --git a/src/platforms/Token/hooks/useRegisterPool.tsx b/src/platforms/Token/hooks/useRegisterPool.tsx index 9062438665..5425cc93ee 100644 --- a/src/platforms/Token/hooks/useRegisterPool.tsx +++ b/src/platforms/Token/hooks/useRegisterPool.tsx @@ -1,5 +1,5 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Chain } from "@guildxyz/types" -import { usePostHogContext } from "components/_app/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmitTransaction from "hooks/useSubmitTransaction" import tokenRewardPoolAbi from "static/abis/tokenRewardPool" diff --git a/src/platforms/Token/hooks/useWithdrawPool.tsx b/src/platforms/Token/hooks/useWithdrawPool.tsx index 129f4ff920..b43dce4c5d 100644 --- a/src/platforms/Token/hooks/useWithdrawPool.tsx +++ b/src/platforms/Token/hooks/useWithdrawPool.tsx @@ -1,4 +1,4 @@ -import { usePostHogContext } from "components/_app/PostHogProvider" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmitTransaction from "hooks/useSubmitTransaction" import tokenRewardPoolAbi from "static/abis/tokenRewardPool" diff --git a/src/requirements/Payment/components/RegisterVaultForm/hooks/useRegisterVault.ts b/src/requirements/Payment/components/RegisterVaultForm/hooks/useRegisterVault.ts index 672d9af9de..dc2935ed6f 100644 --- a/src/requirements/Payment/components/RegisterVaultForm/hooks/useRegisterVault.ts +++ b/src/requirements/Payment/components/RegisterVaultForm/hooks/useRegisterVault.ts @@ -1,4 +1,4 @@ -import { usePostHogContext } from "components/_app/PostHogProvider" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmitTransaction from "hooks/useSubmitTransaction" import useToken from "hooks/useToken" diff --git a/src/utils/fetcher.ts b/src/utils/fetcher.ts index fac96371a6..b4c496f75f 100644 --- a/src/utils/fetcher.ts +++ b/src/utils/fetcher.ts @@ -1,7 +1,7 @@ -import { pushToIntercomSetting } from "components/_app/IntercomProvider" import { env } from "env" import { sign } from "hooks/useSubmit" import { FuelSignProps, SignProps, fuelSign } from "hooks/useSubmit/useSubmit" +import { pushToIntercomSetting } from "./intercom" const SIG_HEADER_NAME = "x-guild-sig" const PARAMS_HEADER_NAME = "x-guild-params" diff --git a/src/utils/intercom.ts b/src/utils/intercom.ts new file mode 100644 index 0000000000..f78d155678 --- /dev/null +++ b/src/utils/intercom.ts @@ -0,0 +1,58 @@ +const triggerChat = () => { + if (typeof window === "undefined") return + + if (window.Intercom) { + window.Intercom?.("show") + return + } + + const facade: HTMLButtonElement | null = document.querySelector( + ".live-chat-loader-placeholder [role='button']" + ) + facade?.click() +} + +const addIntercomSettings = (newData: Window["intercomSettings"]) => { + if (typeof window === "undefined" || !newData) return + + if (!window.intercomSettings) window.intercomSettings = {} + + const shouldUpdate = Object.entries(newData).some( + ([key, value]) => window.intercomSettings?.[key] !== value + ) + + if (!shouldUpdate) return + + window.intercomSettings = { + ...window.intercomSettings, + ...newData, + } + + // In case Intercom is loaded, we update the setting + window.Intercom?.("update", window.intercomSettings) +} + +const pushToIntercomSetting = (settingName: string, value: string) => { + if (typeof window === "undefined") return + + if (!window.intercomSettings) window.intercomSettings = {} + + if (window.intercomSettings[settingName]?.toString().length) + window.intercomSettings[settingName] += `,${value}` + else window.intercomSettings[settingName] = value + + // In case Intercom is loaded, we update the setting + window.Intercom?.("update", window.intercomSettings) +} + +declare global { + interface Window { + intercomSettings?: Record + Intercom?: ( + action: "show" | "update", + intercomSettings?: Window["intercomSettings"] + ) => void + } +} + +export { addIntercomSettings, pushToIntercomSetting, triggerChat } diff --git a/src/utils/keyPair.ts b/src/utils/keyPair.ts new file mode 100644 index 0000000000..dfc433cbef --- /dev/null +++ b/src/utils/keyPair.ts @@ -0,0 +1,22 @@ +import { createStore, del, get, set } from "idb-keyval" + +export type StoredKeyPair = { + keyPair: CryptoKeyPair + pubKey: string +} + +function getStore() { + return createStore("guild.xyz", "signingKeyPairs") +} + +export function getKeyPairFromIdb(userId: number) { + return get(userId, getStore()) +} + +export function deleteKeyPairFromIdb(userId: number) { + return userId ? del(userId, getStore()) : null +} + +export function setKeyPairToIdb(userId: number, keys: StoredKeyPair) { + return set(userId, keys, getStore()) +} diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/parseFuelAddress.ts b/src/utils/parseFuelAddress.ts similarity index 73% rename from src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/parseFuelAddress.ts rename to src/utils/parseFuelAddress.ts index fc0def8c58..68322dd05f 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/parseFuelAddress.ts +++ b/src/utils/parseFuelAddress.ts @@ -1,6 +1,6 @@ import { Address } from "fuels" -const parseFuelAddress = (bech32?: string): `0x${string}` | undefined => { +export function parseFuelAddress(bech32?: string): `0x${string}` | undefined { if (!bech32) return undefined try { return new Address(bech32 as `fuel${string}`).toB256() as `0x${string}` diff --git a/src/v2/components/Account/Account.tsx b/src/v2/components/Account/Account.tsx index 2631d1085c..d5beca80de 100644 --- a/src/v2/components/Account/Account.tsx +++ b/src/v2/components/Account/Account.tsx @@ -4,22 +4,22 @@ import { cn } from "@/lib/utils" import { SignIn } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" import useUser from "components/[guild]/hooks/useUser" -import { walletSelectorModalAtom } from "components/_app/Web3ConnectionManager/components/WalletSelectorModal" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import useResolveAddress from "hooks/useResolveAddress" import { useSetAtom } from "jotai" import shortenHex from "utils/shortenHex" import { GuildAvatar } from "../GuildAvatar" +import { accountModalAtom, walletSelectorModalAtom } from "../Providers/Providers" import { Button } from "../ui/Button" import { Card } from "../ui/Card" -import { accountModalAtom } from "./components/AccountModal" +import { useWeb3ConnectionManager } from "../Web3ConnectionManager/hooks/useWeb3ConnectionManager" export const Account = () => { const { address } = useWeb3ConnectionManager() const setIsAccountModalOpen = useSetAtom(accountModalAtom) const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - const domainName = useResolveAddress(address) + // const domainName = useResolveAddress(address) + // TODO + const domainName = "" const { addresses } = useUser() const linkedAddressesCount = (addresses?.length ?? 1) - 1 diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 1897822dda..d7d2be5fde 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -1,5 +1,6 @@ import { CopyableAddress } from "@/components/CopyableAddress" import { GuildAvatar } from "@/components/GuildAvatar" +import { accountModalAtom } from "@/components/Providers/Providers" import { Button } from "@/components/ui/Button" import { Dialog, @@ -14,19 +15,17 @@ import { TooltipProvider, TooltipTrigger, } from "@/components/ui/Tooltip" +import useConnectorNameAndIcon from "@/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import { SignOut } from "@phosphor-icons/react/dist/ssr" -import useUser, { useUserPublic } from "components/[guild]/hooks/useUser" -import useConnectorNameAndIcon from "components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import useResolveAddress from "hooks/useResolveAddress" -import { deleteKeyPairFromIdb } from "hooks/useSetKeyPair" +import useUser from "components/[guild]/hooks/useUser" import { useAtom } from "jotai" +import { deleteKeyPairFromIdb } from "utils/keyPair" import { useAccount } from "wagmi" -import { accountModalAtom } from "." -import { AccountConnections } from "./components/AccountConnections" const AccountModal = () => { - const { address, type, disconnect } = useWeb3ConnectionManager() + const { address, disconnect } = useWeb3ConnectionManager() const { connectorName } = useConnectorNameAndIcon() const [isOpen, setIsOpen] = useAtom(accountModalAtom) @@ -36,7 +35,9 @@ const AccountModal = () => { const { deleteKeys } = useUserPublic() const { address: evmAddress } = useAccount() - const domain = useResolveAddress(evmAddress) + // const domain = useResolveAddress(evmAddress) + //TODO + const domain = "" // TODO: do we need to keep the network modal? We should check the number of "Opened network modal" PostHog events and decide if we should keep it or not. @@ -110,7 +111,7 @@ const AccountModal = () => {
    - + {/* */} {/*
    */} {/*TODO: */} diff --git a/src/v2/components/Account/components/AccountModal/index.ts b/src/v2/components/Account/components/AccountModal/index.ts index eeaddc807f..1db8e00f93 100644 --- a/src/v2/components/Account/components/AccountModal/index.ts +++ b/src/v2/components/Account/components/AccountModal/index.ts @@ -1,5 +1,3 @@ -import { atom } from "jotai" import { AccountModal } from "./AccountModal" -const accountModalAtom = atom(false) -export { AccountModal, accountModalAtom } +export { AccountModal } diff --git a/src/v2/components/NavigationEvents.tsx b/src/v2/components/NavigationEvents.tsx deleted file mode 100644 index 109566d714..0000000000 --- a/src/v2/components/NavigationEvents.tsx +++ /dev/null @@ -1,16 +0,0 @@ -"use client" - -import { usePathname, useSearchParams } from "next/navigation" -import { posthog } from "posthog-js" -import { useEffect } from "react" - -export function NavigationEvents() { - const pathname = usePathname() - const searchParams = useSearchParams() - - useEffect(() => { - posthog.capture("$pageview") - }, [pathname, searchParams]) - - return null -} diff --git a/src/v2/components/Providers/PostHogPageViews.tsx b/src/v2/components/Providers/PostHogPageViews.tsx new file mode 100644 index 0000000000..375c2ab91f --- /dev/null +++ b/src/v2/components/Providers/PostHogPageViews.tsx @@ -0,0 +1,25 @@ +"use client" + +import { usePathname, useSearchParams } from "next/navigation" +import { usePostHog } from "posthog-js/react" +import { useEffect } from "react" + +export function PostHogPageViews() { + const pathname = usePathname() + const searchParams = useSearchParams() + const posthog = usePostHog() + + useEffect(() => { + if (pathname && posthog) { + let url = window.origin + pathname + if (searchParams?.toString()) { + url = url + `?${searchParams.toString()}` + } + posthog.capture("$pageview", { + $current_url: url, + }) + } + }, [pathname, searchParams, posthog]) + + return null +} diff --git a/src/components/_app/PostHogProvider.tsx b/src/v2/components/Providers/PostHogProvider.tsx similarity index 71% rename from src/components/_app/PostHogProvider.tsx rename to src/v2/components/Providers/PostHogProvider.tsx index bc8525d21b..198a8db9d1 100644 --- a/src/components/_app/PostHogProvider.tsx +++ b/src/v2/components/Providers/PostHogProvider.tsx @@ -1,21 +1,14 @@ -import { useUserPublic } from "components/[guild]/hooks/useUser" +import { useUserPublic } from "@/hooks/useUserPublic" import { env } from "env" -import { useRouter } from "next/router" import { posthog } from "posthog-js" import { PostHogProvider as DefaultPostHogProvider, usePostHog, } from "posthog-js/react" -import { - PropsWithChildren, - createContext, - useCallback, - useContext, - useEffect, -} from "react" +import { createContext, ReactNode, useCallback, useContext, useEffect } from "react" import { User } from "types" -import useConnectorNameAndIcon from "./Web3ConnectionManager/hooks/useConnectorNameAndIcon" -import useWeb3ConnectionManager from "./Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import useConnectorNameAndIcon from "../Web3ConnectionManager/hooks/useConnectorNameAndIcon" +import { useWeb3ConnectionManager } from "../Web3ConnectionManager/hooks/useWeb3ConnectionManager" const USER_REJECTED_ERROR = "User rejected the request" const REJECT_BY_THE_USER_ERROR = "Reject by the user" @@ -62,9 +55,7 @@ const PostHogContext = createContext<{ startSessionRecording: () => {}, }) -const CustomPostHogProvider = ({ - children, -}: PropsWithChildren): JSX.Element => { +export function CustomPostHogProvider({ children }: { children: ReactNode }) { const { isWeb3Connected, address, type: walletType } = useWeb3ConnectionManager() const { connectorName } = useConnectorNameAndIcon() const { id } = useUserPublic() @@ -79,7 +70,7 @@ const CustomPostHogProvider = ({ const identifyUser = useCallback( (userData: User) => { posthog.identify(userData.id.toString(), { - primaryAddress: userData.addresses.find((a) => a.isPrimary).address, + primaryAddress: userData.addresses.find((a) => a.isPrimary)?.address, currentAddress: address, walletType, wallet: connectorName, @@ -140,41 +131,14 @@ const CustomPostHogProvider = ({ ) } -const PostHogProvider = ({ children }: PropsWithChildren): JSX.Element => ( - - {children} - -) - -/** - * UseRouter doesn't work in app router & we also need to track page change events - * differently there, so we made this LegacyPostHogProvider which contains the page - * router related logic. - * - * We can delete it once we migrate to app router. - */ -const LegacyPostHogProvider = ({ - children, -}: PropsWithChildren): JSX.Element => { - const router = useRouter() - - useEffect(() => { - const handleRouteChange = () => posthog.capture("$pageview") - router.events.on("routeChangeComplete", handleRouteChange) - - return () => { - router.events.off("routeChangeComplete", handleRouteChange) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - +export function PostHogProvider({ children }: { children: ReactNode }) { return ( - + {children} ) } -const usePostHogContext = () => useContext(PostHogContext) - -export { LegacyPostHogProvider, PostHogProvider, usePostHogContext } +export function usePostHogContext() { + return useContext(PostHogContext) +} diff --git a/src/v2/components/Providers.tsx b/src/v2/components/Providers/Providers.tsx similarity index 54% rename from src/v2/components/Providers.tsx rename to src/v2/components/Providers/Providers.tsx index f10c498aaa..87cd8550ef 100644 --- a/src/v2/components/Providers.tsx +++ b/src/v2/components/Providers/Providers.tsx @@ -2,22 +2,36 @@ import { FuelProvider } from "@fuels/react" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" -import IntercomProvider from "components/_app/IntercomProvider" -import { PostHogProvider } from "components/_app/PostHogProvider" -import { Web3ConnectionManager } from "components/_app/Web3ConnectionManager/Web3ConnectionManager" import { fuelConfig } from "fuelConfig" +import { atom } from "jotai" import { ThemeProvider } from "next-themes" import { SWRConfig } from "swr" import { fetcherForSWR } from "utils/fetcher" import { WagmiProvider } from "wagmi" import { wagmiConfig } from "wagmiConfig" -import { AccountModal } from "./Account/components/AccountModal" -import { Toaster } from "./ui/Toaster" +import { AccountModal } from "../Account/components/AccountModal" +import { Toaster } from "../ui/Toaster" +import { Web3ConnectionManager } from "../Web3ConnectionManager" +import { PostHogProvider } from "./PostHogProvider" const queryClient = new QueryClient() +// Atoms for global modals - TODO: move the types to another file +export const walletSelectorModalAtom = atom(false) +export const accountModalAtom = atom(false) + +export type AddressLinkParams = { + userId?: number + address?: `0x${string}` +} +export const addressLinkParamsAtom = atom({ + userId: undefined, + address: undefined, +}) +export const walletLinkHelperModalAtom = atom(false) + // TODO: add AppErrorBoundary -export default function Providers({ children }: { children: React.ReactNode }) { +export function Providers({ children }: { children: React.ReactNode }) { return ( - - {children} - - - - + {/* TODO: */} + {children} + + + {/* */} diff --git a/src/v2/components/Providers/index.ts b/src/v2/components/Providers/index.ts new file mode 100644 index 0000000000..aeab392566 --- /dev/null +++ b/src/v2/components/Providers/index.ts @@ -0,0 +1,3 @@ +import { Providers } from "./Providers" + +export { Providers } diff --git a/src/v2/components/ThemeToggle.tsx b/src/v2/components/ThemeToggle.tsx index 8dcfd69844..b92a211517 100644 --- a/src/v2/components/ThemeToggle.tsx +++ b/src/v2/components/ThemeToggle.tsx @@ -1,7 +1,7 @@ "use client" import { ToggleGroup, ToggleGroupItem } from "@/components/ui/ToggleGroup" -import { Desktop, Moon, Sun } from "@phosphor-icons/react" +import { Desktop, Moon, Sun } from "@phosphor-icons/react/dist/ssr" import { useTheme } from "next-themes" import { useIsClient } from "usehooks-ts" diff --git a/src/components/_app/Web3ConnectionManager/components/PlatformMergeErrorAlert.tsx b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx similarity index 98% rename from src/components/_app/Web3ConnectionManager/components/PlatformMergeErrorAlert.tsx rename to src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx index 778bc4a017..4817030d84 100644 --- a/src/components/_app/Web3ConnectionManager/components/PlatformMergeErrorAlert.tsx +++ b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx @@ -24,7 +24,7 @@ import { useRef } from "react" import { PlatformName } from "types" import capitalize from "utils/capitalize" import shortenHex from "utils/shortenHex" -import useWeb3ConnectionManager from "../hooks/useWeb3ConnectionManager" +import { useWeb3ConnectionManager } from "./hooks/useWeb3ConnectionManager" export const platformMergeAlertAtom = atom< false | { addressOrDomain: string; platformName: PlatformName } diff --git a/src/components/_app/Web3ConnectionManager/components/WalletLinkHelperModal.tsx b/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx similarity index 93% rename from src/components/_app/Web3ConnectionManager/components/WalletLinkHelperModal.tsx rename to src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx index 2b9b838726..e371e38a17 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletLinkHelperModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx @@ -10,10 +10,9 @@ import { import LogicDivider from "components/[guild]/LogicDivider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" -import { atom, useAtom } from "jotai" +import { useAtom } from "jotai" import { SignOut } from "phosphor-react" - -export const walletLinkHelperModalAtom = atom(false) +import { walletLinkHelperModalAtom } from "../Providers/Providers" const WalletLinkHelperModal = () => { const [isWalletLinkHelperModalOpen, setIsWalletLinkModalOpen] = useAtom( diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx similarity index 93% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index d6cec9d8eb..414b55eb64 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -8,20 +8,22 @@ import { DialogTitle, } from "@/components/ui/Dialog" import { usePrevious } from "@/hooks/usePrevious" -import { useUserPublic } from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" +import { useUserPublic } from "@/hooks/useUserPublic" import CardMotionWrapper from "components/common/CardMotionWrapper" -import { addressLinkParamsAtom } from "components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton" import useSetKeyPair from "hooks/useSetKeyPair" -import useShowErrorToast from "hooks/useShowErrorToast" +// import useShowErrorToast from "hooks/useShowErrorToast" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { + addressLinkParamsAtom, + walletLinkHelperModalAtom, +} from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" import { useAtom, useSetAtom } from "jotai" import Link from "next/link" -import { ArrowSquareOut } from "phosphor-react" import { useEffect } from "react" import { useAccount, useConnect, type Connector } from "wagmi" import { COINBASE_INJECTED_WALLET_ID, COINBASE_WALLET_SDK_ID } from "wagmiConfig" -import useWeb3ConnectionManager from "../../hooks/useWeb3ConnectionManager" -import { walletLinkHelperModalAtom } from "../WalletLinkHelperModal" import AccountButton from "./components/AccountButton" import ConnectorButton from "./components/ConnectorButton" import FuelConnectorButtons from "./components/FuelConnectorButtons" @@ -45,6 +47,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { * injected wallet option */ const shouldShowInjected = + typeof window !== "undefined" && !!window.ethereum && connectors .filter((c) => c.id !== COINBASE_INJECTED_WALLET_ID) @@ -102,15 +105,17 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { !prevAddress && address === addressLinkParams.address - const showErrorToast = useShowErrorToast() + // TODO + // const showErrorToast = useShowErrorToast() useEffect(() => { if (!triesToLinkCurrentAddress) return setAddressLinkParams({ userId: undefined, address: undefined }) - showErrorToast( - "You cannot link an address to itself. Please choose a different address." - ) - }, [triesToLinkCurrentAddress, setAddressLinkParams, showErrorToast]) + + // showErrorToast( + // "You cannot link an address to itself. Please choose a different address." + // ) + }, [triesToLinkCurrentAddress, setAddressLinkParams /*, showErrorToast*/]) const conditionalOnClose = () => { if (!isWeb3Connected || !!keyPair) onClose() diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx similarity index 81% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx index 26f78364d3..7489c5fe7f 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/AccountButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx @@ -1,7 +1,7 @@ import { GuildAvatar } from "@/components/GuildAvatar" import { Button } from "@/components/ui/Button" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import shortenHex from "utils/shortenHex" +import { useWeb3ConnectionManager } from "../../hooks/useWeb3ConnectionManager" const AccountButton = () => { const { address } = useWeb3ConnectionManager() diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx similarity index 83% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx index fda7daa496..4f257758fd 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx @@ -1,13 +1,15 @@ +import { + addressLinkParamsAtom, + walletLinkHelperModalAtom, +} from "@/components/Providers/Providers" import { Button, ButtonProps } from "@/components/ui/Button" -import { useUserPublic } from "components/[guild]/hooks/useUser" -import useConnectorNameAndIcon from "components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon" -import { addressLinkParamsAtom } from "components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton" +import useConnectorNameAndIcon from "@/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon" +import { useUserPublic } from "@/hooks/useUserPublic" import { useAtomValue, useSetAtom } from "jotai" import { Wallet } from "phosphor-react" import { Config, useAccount, type Connector } from "wagmi" import { ConnectMutate } from "wagmi/query" import { COINBASE_WALLET_SDK_ID } from "wagmiConfig" -import { walletLinkHelperModalAtom } from "../../WalletLinkHelperModal" type Props = { connector?: Connector diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/FuelConnectorButtons.tsx similarity index 97% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/FuelConnectorButtons.tsx index b7385c4fc7..a58a6a111a 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/FuelConnectorButtons.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/FuelConnectorButtons.tsx @@ -1,6 +1,6 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Button } from "@/components/ui/Button" import { useConnectors, useIsConnected } from "@fuels/react" -import { usePostHogContext } from "components/_app/PostHogProvider" import { useEffect, useState } from "react" import { connectorButtonBaseProps } from "./ConnectorButton" diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx similarity index 99% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx index 903b136217..2322cb5ba0 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx @@ -18,7 +18,7 @@ import { } from "@chakra-ui/react" import type { RawPrivateKey, Waas } from "@coinbase/waas-sdk-web" // eslint-disable-next-line import/no-extraneous-dependencies -import { usePostHogContext } from "components/_app/PostHogProvider" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import ConfirmationAlert from "components/create-guild/Requirements/components/ConfirmationAlert" diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/index.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/index.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/index.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/index.ts diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/utils/googleDrive.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/utils/googleDrive.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleLoginButton/utils/googleDrive.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/utils/googleDrive.ts diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleTerms.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleTerms.tsx similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/components/GoogleTerms.tsx rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleTerms.tsx diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/hooks/useIsWalletConnectModalActive.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useIsWalletConnectModalActive.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/hooks/useIsWalletConnectModalActive.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useIsWalletConnectModalActive.ts diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/hooks/useLinkAddress.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts similarity index 90% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/hooks/useLinkAddress.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts index 40f3c70608..e9f75870c6 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/hooks/useLinkAddress.ts +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts @@ -1,11 +1,10 @@ -import { useUserPublic } from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" -import useWeb3ConnectionManager from "components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { AddressLinkParams, addressLinkParamsAtom, -} from "components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton" -import { deleteKeyPairFromIdb, getKeyPairFromIdb } from "hooks/useSetKeyPair" +} from "@/components/Providers/Providers" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useUserPublic } from "@/hooks/useUserPublic" import useSubmit from "hooks/useSubmit" import { SignProps } from "hooks/useSubmit/useSubmit" import { useAtom } from "jotai" @@ -13,6 +12,7 @@ import randomBytes from "randombytes" import { useEffect } from "react" import { mutate } from "swr" import { fetcherWithSign } from "utils/fetcher" +import { deleteKeyPairFromIdb, getKeyPairFromIdb } from "utils/keyPair" import { WalletClient } from "viem" const getAddressLinkProof = async ( diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/index.ts similarity index 53% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/index.ts index efcd47efd8..aaa9ec5155 100644 --- a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/index.ts +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/index.ts @@ -1,6 +1,3 @@ -import { atom } from "jotai" import WalletSelectorModal from "./WalletSelectorModal" -export const walletSelectorModalAtom = atom(false) - export default WalletSelectorModal diff --git a/src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/utils/processConnectionError.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/utils/processConnectionError.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/components/WalletSelectorModal/utils/processConnectionError.ts rename to src/v2/components/Web3ConnectionManager/WalletSelectorModal/utils/processConnectionError.ts diff --git a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx new file mode 100644 index 0000000000..7d639f416a --- /dev/null +++ b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx @@ -0,0 +1,34 @@ +import useAutoReconnect from "@/hooks/useAutoReconnect" +import { useAtom } from "jotai" +import { walletSelectorModalAtom } from "../Providers/Providers" +import { useTriggerWalletSelectorModal } from "./hooks/useTriggerWalletSelectorModal" +import WalletSelectorModal from "./WalletSelectorModal" + +export function Web3ConnectionManagerBase() { + const [isWalletSelectorModalOpen, setIsWalletSelectorModalOpen] = useAtom( + walletSelectorModalAtom + ) + + useAutoReconnect() + // TODO + // useConnectFromLocalStorage() + + // TODO + return ( + <> + setIsWalletSelectorModalOpen(true)} + onClose={() => setIsWalletSelectorModalOpen(false)} + /> + {/* + + */} + + ) +} + +export function Web3ConnectionManager() { + useTriggerWalletSelectorModal() + return +} diff --git a/src/components/_app/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts b/src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts similarity index 86% rename from src/components/_app/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts rename to src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts index ab8d4f9792..64973c09e9 100644 --- a/src/components/_app/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts +++ b/src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts @@ -1,8 +1,11 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { useToast } from "@/components/ui/hooks/useToast" +import { useUserPublic } from "@/hooks/useUserPublic" +// TODO: move this hook inside its own file import { useConnect } from "components/[guild]/JoinModal/hooks/useConnectPlatform" +// TODO: move this out to a constants folder maybe? import { Message } from "components/[guild]/JoinModal/hooks/useOauthPopupWindow" -import useUser, { useUserPublic } from "components/[guild]/hooks/useUser" -import { usePostHogContext } from "components/_app/PostHogProvider" +import useUser from "components/[guild]/hooks/useUser" import rewards from "platforms/rewards" import { useEffect } from "react" diff --git a/src/components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts b/src/v2/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts rename to src/v2/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon.ts diff --git a/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts b/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts new file mode 100644 index 0000000000..7dd3f8e0d1 --- /dev/null +++ b/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts @@ -0,0 +1,16 @@ +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useSetAtom } from "jotai" +import { useSearchParams } from "next/navigation" +import { useEffect } from "react" +import { useWeb3ConnectionManager } from "./useWeb3ConnectionManager" + +export function useTriggerWalletSelectorModal() { + const searchParams = useSearchParams() + const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) + const { isWeb3Connected } = useWeb3ConnectionManager() + + useEffect(() => { + if (!isWeb3Connected && searchParams?.get("redirectUrl")) + setIsWalletSelectorModalOpen(true) + }, [isWeb3Connected, searchParams, setIsWalletSelectorModalOpen]) +} diff --git a/src/components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts b/src/v2/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts similarity index 55% rename from src/components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts rename to src/v2/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts index f96f761d51..55f31e85d9 100644 --- a/src/components/_app/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts +++ b/src/v2/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager.ts @@ -4,49 +4,22 @@ import { useIsConnected, useWallet, } from "@fuels/react" -import parseFuelAddress from "components/[guild]/Requirements/components/GuildCheckout/MintGuildPin/Fuel/parseFuelAddress" -import { atom, useAtom, useSetAtom } from "jotai" -import { useSearchParams } from "next/navigation" -import { useRouter } from "next/router" +import { UserProfile } from "@guildxyz/types" +import { atom, useAtom } from "jotai" import { useEffect } from "react" -import { User } from "types" +import parseFuelAddress from "utils/parseFuelAddress" import { useAccount, useDisconnect, useSignMessage } from "wagmi" -import { walletSelectorModalAtom } from "../components/WalletSelectorModal" const safeContextAtom = atom(false) -type Web3ConnectionManagerType = { +export function useWeb3ConnectionManager(): { isInSafeContext: boolean isWeb3Connected: boolean address?: `0x${string}` - type?: User["addresses"][number]["walletType"] + type?: UserProfile["addresses"][number]["walletType"] disconnect: () => void signMessage: (message: string) => Promise -} - -const useTriggerWalletSelectorModalLegacy = () => { - const router = useRouter() - const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - const { isWeb3Connected } = useWeb3ConnectionManager() - - useEffect(() => { - if (!isWeb3Connected && router.query.redirectUrl) - setIsWalletSelectorModalOpen(true) - }, [isWeb3Connected, router.query, setIsWalletSelectorModalOpen]) -} - -const useTriggerWalletSelectorModal = () => { - const searchParams = useSearchParams() - const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - const { isWeb3Connected } = useWeb3ConnectionManager() - - useEffect(() => { - if (!isWeb3Connected && searchParams?.get("redirectUrl")) - setIsWalletSelectorModalOpen(true) - }, [isWeb3Connected, searchParams, setIsWalletSelectorModalOpen]) -} - -const useWeb3ConnectionManager = (): Web3ConnectionManagerType => { +} { const [isInSafeContext, setIsInSafeContext] = useAtom(safeContextAtom) const { @@ -98,6 +71,3 @@ const useWeb3ConnectionManager = (): Web3ConnectionManagerType => { signMessage, } } - -export default useWeb3ConnectionManager -export { useTriggerWalletSelectorModal, useTriggerWalletSelectorModalLegacy } diff --git a/src/v2/components/Web3ConnectionManager/index.ts b/src/v2/components/Web3ConnectionManager/index.ts new file mode 100644 index 0000000000..c6ce169006 --- /dev/null +++ b/src/v2/components/Web3ConnectionManager/index.ts @@ -0,0 +1,3 @@ +import { Web3ConnectionManager } from "./Web3ConnectionManager" + +export { Web3ConnectionManager } diff --git a/src/components/_app/Web3ConnectionManager/hooks/useAutoReconnect.ts b/src/v2/hooks/useAutoReconnect.ts similarity index 100% rename from src/components/_app/Web3ConnectionManager/hooks/useAutoReconnect.ts rename to src/v2/hooks/useAutoReconnect.ts diff --git a/src/v2/hooks/useUserPublic.ts b/src/v2/hooks/useUserPublic.ts new file mode 100644 index 0000000000..e01247a0a7 --- /dev/null +++ b/src/v2/hooks/useUserPublic.ts @@ -0,0 +1,111 @@ +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { useToast } from "@/components/ui/hooks/useToast" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { PublicUserProfile } from "@guildxyz/types" +import { useSetAtom } from "jotai" +import { KeyedMutator } from "swr" +import useSWRImmutable from "swr/immutable" +import fetcher from "utils/fetcher" +import { + deleteKeyPairFromIdb, + getKeyPairFromIdb, + StoredKeyPair, +} from "utils/keyPair" + +type PublicUser = PublicUserProfile & { keyPair?: StoredKeyPair } + +// We don't open WaletSelectorModal on these routes +const IGNORED_ROUTES = [ + "/_error", + "/tgauth", + "/oauth", + "/googleauth", + "/oauth-result", +] + +export function useUserPublic(userIdOrAddress?: number | string): PublicUser & { + isLoading: boolean + mutate: KeyedMutator + error: any + deleteKeys: () => Promise + setKeys: (keyPair: StoredKeyPair) => Promise +} { + const { address } = useWeb3ConnectionManager() + const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) + const { captureEvent } = usePostHogContext() + const { toast } = useToast() + + const idToUseRaw = userIdOrAddress ?? address + const idToUse = + typeof idToUseRaw === "string" ? idToUseRaw.toLowerCase() : idToUseRaw + + const { data, mutate, isLoading, error } = useSWRImmutable( + idToUse ? `/v2/users/${idToUse}/profile` : null, + async (url: string) => { + const user: PublicUser = await fetcher(url) + + const keys = await getKeyPairFromIdb(user.id) + + if (keys) { + if (keys.pubKey === user.publicKey) { + user.keyPair = keys + } else { + await deleteKeyPairFromIdb(user.id) + + captureEvent("Invalid keypair", { + userId: user.id, + pubKey: keys.pubKey, + savedPubKey: user.publicKey, + }) + + toast({ + variant: "warning", + title: "Session expired", + description: + "You've connected your account from a new device, so you have to sign a new message to stay logged in", + duration: 5000, + }) + } + } + + // If we didn't set the keyPair field, the user either doesn't have one locally, or has an invalid one + + // if (!user.keyPair && !ignoredRoutes.includes(router.route)) { + // setIsWalletSelectorModalOpen(true) + // } + + /** + * TODO: We use window.location.href because useRouter (from next/router) won't + * work in the app directory. We should use useRouter from next/navigation once + * we migrate everything to the app router. + */ + if (!user.keyPair && !IGNORED_ROUTES.includes(window.location.pathname)) { + setIsWalletSelectorModalOpen(true) + } + + return user + }, + { + shouldRetryOnError: false, + onError: () => { + setIsWalletSelectorModalOpen(true) + }, + } + ) + + return { + isLoading, + ...data, + deleteKeys: async () => { + await mutate((prev) => ({ ...prev, keyPair: undefined }), { + revalidate: false, + }) + }, + setKeys: async (keyPair: StoredKeyPair) => { + await mutate((prev) => ({ ...prev, keyPair }), { revalidate: false }) + }, + mutate, + error, + } +} From d06a9e78d4d4db4c43a51fc9fdadd3aca34df152 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 2 Jul 2024 16:32:38 +0200 Subject: [PATCH 023/110] cleanup: remove `DialogExample` --- .../playground/_components/DialogExample.tsx | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 src/app/playground/_components/DialogExample.tsx diff --git a/src/app/playground/_components/DialogExample.tsx b/src/app/playground/_components/DialogExample.tsx deleted file mode 100644 index fd76568a09..0000000000 --- a/src/app/playground/_components/DialogExample.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Button } from "@/components/ui/Button" -import { - Dialog, - DialogCloseButton, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/Dialog" - -export function DialogExample() { - return ( - - - - - - - Connect to Guild - Description - - -

    This is the dialog content

    - - -
    -
    - ) -} From 29e2cc10fc2609e7bb0dc72bb69a3a7069fa22c7 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 2 Jul 2024 19:42:24 +0200 Subject: [PATCH 024/110] fix(CardMotionWrapper): remove the `EASING` import --- src/components/common/CardMotionWrapper.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/common/CardMotionWrapper.tsx b/src/components/common/CardMotionWrapper.tsx index f8bc362c2d..ea54e92dcc 100644 --- a/src/components/common/CardMotionWrapper.tsx +++ b/src/components/common/CardMotionWrapper.tsx @@ -1,4 +1,4 @@ -import { EASINGS } from "@chakra-ui/react" +// import { EASINGS } from "@chakra-ui/react" import { LazyMotion, domMax, m } from "framer-motion" import { PropsWithChildren } from "react" @@ -21,14 +21,14 @@ const CardMotionWrapper = ({ animate={{ opacity: 1, scale: 1, - transition: { delay, duration: 0.2, ease: EASINGS.easeOut }, + // transition: { delay, duration: 0.2, ease: EASINGS.easeOut }, }} exit={{ opacity: 0, scale: 0.95, - transition: { duration: 0.1, ease: EASINGS.easeIn }, + // transition: { duration: 0.1, ease: EASINGS.easeIn }, }} - transition={{ duration: 0.3, ease: EASINGS.easeInOut }} + // transition={{ duration: 0.3, ease: EASINGS.easeInOut }} // TODO: solve this if it is relevant // sx={{ "> *": { height: "full" } }} > From d9e797c96156a13e2214658a584302b10e1c97f9 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf <122315398+dominik-stumpf@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:52:06 +0200 Subject: [PATCH 025/110] Try fix build "out of memory" error (#1347) * build: allocate more memory for nodejs on build * build: increase memory limit * chore: remove posthog provider to test build error * chore: remove posthog provider to test build error * chore: remove reward import * build: remove memory limit override * chore: fix circular import * fix: update import outside v2 * fix: add missing react suspense * Revert "chore: remove reward import" This reverts commit b2cf1d8efa9f73f2d86463640197c62aa5c77195. * chore: remove accidental svg * fix(layout): add back `PostHogPageViews` --------- Co-authored-by: BrickheadJohnny --- src/app/layout.tsx | 3 ++- .../JoinModal/components/WalletAuthButton.tsx | 2 +- .../[guild]/NoPermissionToPageFallback.tsx | 2 +- .../PaymentCurrencyPicker.tsx | 2 +- .../buttons/ConnectWalletButton.tsx | 2 +- .../HiddenRequirementAccessIndicator.tsx | 2 +- .../components/RequirementAccessIndicator.tsx | 2 +- .../AccessIndicator/AccessIndicator.tsx | 2 +- .../LeaderboardAirdropFallbackCard.tsx | 2 +- .../_app/LegacyWeb3ConnectionManager.tsx | 2 +- .../GoogleGuildSetup/GoogleGuildSetup.tsx | 2 +- .../Layout/components/Account/Account.tsx | 2 +- .../components/LinkAddressButton.tsx | 2 +- .../UsersGuildCredentials/GuildPin.tsx | 2 +- .../UsersGuildCredentials/UsersGuildPins.tsx | 2 +- .../create-guild/CreateGuildButton.tsx | 2 +- .../components/PlatformSelectButton.tsx | 2 +- src/components/explorer/YourGuilds.tsx | 2 +- src/v2/components/Account/Account.tsx | 2 +- .../components/AccountModal/AccountModal.tsx | 2 +- src/v2/components/Providers/Providers.tsx | 20 ++++--------------- src/v2/components/Providers/atoms.ts | 10 ++++++++++ src/v2/components/Providers/types.ts | 4 ++++ .../WalletLinkHelperModal.tsx | 2 +- .../WalletSelectorModal.tsx | 2 +- .../components/ConnectorButton.tsx | 2 +- .../hooks/useLinkAddress.ts | 6 ++---- .../Web3ConnectionManager.tsx | 2 +- .../hooks/useTriggerWalletSelectorModal.ts | 2 +- src/v2/hooks/useUserPublic.ts | 2 +- 30 files changed, 47 insertions(+), 46 deletions(-) create mode 100644 src/v2/components/Providers/atoms.ts create mode 100644 src/v2/components/Providers/types.ts diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6a3ae290e4..ae05e5e8c9 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -23,7 +23,8 @@ export default function RootLayout({ children }: RootLayoutProps) { {children} - + + diff --git a/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx b/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx index acf7443d23..7df17d7f56 100644 --- a/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx +++ b/src/components/[guild]/JoinModal/components/WalletAuthButton.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { SignIn, Wallet } from "@phosphor-icons/react" import { useSetAtom } from "jotai" diff --git a/src/components/[guild]/NoPermissionToPageFallback.tsx b/src/components/[guild]/NoPermissionToPageFallback.tsx index 51d6793e0f..2f2ff541a4 100644 --- a/src/components/[guild]/NoPermissionToPageFallback.tsx +++ b/src/components/[guild]/NoPermissionToPageFallback.tsx @@ -1,7 +1,7 @@ import { accountModalAtom, walletSelectorModalAtom, -} from "@/components/Providers/Providers" +} from "@/components/Providers/atoms" import { Alert, AlertDescription, diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx index c77e3595d4..eace72a366 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/PaymentCurrencyPicker/PaymentCurrencyPicker.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { Circle, HStack, diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx index 11c4874145..c720256258 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/ConnectWalletButton.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Collapse, Tooltip } from "@chakra-ui/react" import Button from "components/common/Button" diff --git a/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx b/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx index 430c826dbc..6b33697d31 100644 --- a/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx +++ b/src/components/[guild]/Requirements/components/HiddenRequirementAccessIndicator.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { ButtonGroup, Collapse, diff --git a/src/components/[guild]/Requirements/components/RequirementAccessIndicator.tsx b/src/components/[guild]/Requirements/components/RequirementAccessIndicator.tsx index 987df2a184..74c5b6b9ac 100644 --- a/src/components/[guild]/Requirements/components/RequirementAccessIndicator.tsx +++ b/src/components/[guild]/Requirements/components/RequirementAccessIndicator.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { ButtonGroup, Icon, diff --git a/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx b/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx index 79ef9520ab..62b01e55c0 100644 --- a/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx +++ b/src/components/[guild]/RoleCard/components/AccessIndicator/AccessIndicator.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { Box, Divider, diff --git a/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx b/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx index 123ebc0d02..ee566c8c73 100644 --- a/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx +++ b/src/components/[guild]/leaderboard/LeaderboardAirdropFallbackCard.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { Center, Collapse, Img, useColorModeValue } from "@chakra-ui/react" import { SignIn, X } from "@phosphor-icons/react" import ActionCard from "components/common/ActionCard" diff --git a/src/components/_app/LegacyWeb3ConnectionManager.tsx b/src/components/_app/LegacyWeb3ConnectionManager.tsx index 0b8780678f..09b927be02 100644 --- a/src/components/_app/LegacyWeb3ConnectionManager.tsx +++ b/src/components/_app/LegacyWeb3ConnectionManager.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Web3ConnectionManagerBase } from "@/components/Web3ConnectionManager/Web3ConnectionManager" import { useSetAtom } from "jotai" diff --git a/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx b/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx index 478801f991..6beb0e1cf9 100644 --- a/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx +++ b/src/components/common/GoogleGuildSetup/GoogleGuildSetup.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { ButtonGroup, GridItem, diff --git a/src/components/common/Layout/components/Account/Account.tsx b/src/components/common/Layout/components/Account/Account.tsx index 9a298aa125..3e0df9c487 100644 --- a/src/components/common/Layout/components/Account/Account.tsx +++ b/src/components/common/Layout/components/Account/Account.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { ButtonGroup, Divider } from "@chakra-ui/react" import { SignIn } from "@phosphor-icons/react" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx index 0ca39863b5..0b9a1f506a 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx @@ -1,7 +1,7 @@ import { addressLinkParamsAtom, walletSelectorModalAtom, -} from "@/components/Providers/Providers" +} from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Plus } from "@phosphor-icons/react" import useUser from "components/[guild]/hooks/useUser" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx index e1b10e330e..7c1ebfc8a8 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { Link } from "@chakra-ui/next-js" import { Card, Circle, Img, Tag, useColorModeValue } from "@chakra-ui/react" import { useSetAtom } from "jotai" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx index 85e3731450..20a82121d8 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx @@ -1,4 +1,4 @@ -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { Alert, AlertIcon, Box, Flex, Text } from "@chakra-ui/react" import useUsersGuildPins from "hooks/useUsersGuildPins" import { useAtomValue } from "jotai" diff --git a/src/components/create-guild/CreateGuildButton.tsx b/src/components/create-guild/CreateGuildButton.tsx index 146875c8a3..3fd5675e2d 100644 --- a/src/components/create-guild/CreateGuildButton.tsx +++ b/src/components/create-guild/CreateGuildButton.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Collapse, Stack } from "@chakra-ui/react" import Button from "components/common/Button" diff --git a/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx b/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx index b5417ac9e9..7f159e52c2 100644 --- a/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx +++ b/src/components/create-guild/PlatformsGrid/components/PlatformSelectButton.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Circle, diff --git a/src/components/explorer/YourGuilds.tsx b/src/components/explorer/YourGuilds.tsx index 153c00cb8f..5b51ea35d8 100644 --- a/src/components/explorer/YourGuilds.tsx +++ b/src/components/explorer/YourGuilds.tsx @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Box, HStack, Img, Stack, Text } from "@chakra-ui/react" import { Plus, SignIn } from "@phosphor-icons/react" diff --git a/src/v2/components/Account/Account.tsx b/src/v2/components/Account/Account.tsx index d5beca80de..14aef5da46 100644 --- a/src/v2/components/Account/Account.tsx +++ b/src/v2/components/Account/Account.tsx @@ -7,7 +7,7 @@ import useUser from "components/[guild]/hooks/useUser" import { useSetAtom } from "jotai" import shortenHex from "utils/shortenHex" import { GuildAvatar } from "../GuildAvatar" -import { accountModalAtom, walletSelectorModalAtom } from "../Providers/Providers" +import { accountModalAtom, walletSelectorModalAtom } from "../Providers/atoms" import { Button } from "../ui/Button" import { Card } from "../ui/Card" import { useWeb3ConnectionManager } from "../Web3ConnectionManager/hooks/useWeb3ConnectionManager" diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index d7d2be5fde..59f8461519 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -1,6 +1,6 @@ import { CopyableAddress } from "@/components/CopyableAddress" import { GuildAvatar } from "@/components/GuildAvatar" -import { accountModalAtom } from "@/components/Providers/Providers" +import { accountModalAtom } from "@/components/Providers/atoms" import { Button } from "@/components/ui/Button" import { Dialog, diff --git a/src/v2/components/Providers/Providers.tsx b/src/v2/components/Providers/Providers.tsx index 87cd8550ef..427e7a3eb4 100644 --- a/src/v2/components/Providers/Providers.tsx +++ b/src/v2/components/Providers/Providers.tsx @@ -3,7 +3,6 @@ import { FuelProvider } from "@fuels/react" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { fuelConfig } from "fuelConfig" -import { atom } from "jotai" import { ThemeProvider } from "next-themes" import { SWRConfig } from "swr" import { fetcherForSWR } from "utils/fetcher" @@ -13,23 +12,10 @@ import { AccountModal } from "../Account/components/AccountModal" import { Toaster } from "../ui/Toaster" import { Web3ConnectionManager } from "../Web3ConnectionManager" import { PostHogProvider } from "./PostHogProvider" +import { Suspense } from "react" const queryClient = new QueryClient() -// Atoms for global modals - TODO: move the types to another file -export const walletSelectorModalAtom = atom(false) -export const accountModalAtom = atom(false) - -export type AddressLinkParams = { - userId?: number - address?: `0x${string}` -} -export const addressLinkParamsAtom = atom({ - userId: undefined, - address: undefined, -}) -export const walletLinkHelperModalAtom = atom(false) - // TODO: add AppErrorBoundary export function Providers({ children }: { children: React.ReactNode }) { return ( @@ -48,7 +34,9 @@ export function Providers({ children }: { children: React.ReactNode }) { {/* TODO: */} {children} - + + + {/* */} diff --git a/src/v2/components/Providers/atoms.ts b/src/v2/components/Providers/atoms.ts new file mode 100644 index 0000000000..e0408c6971 --- /dev/null +++ b/src/v2/components/Providers/atoms.ts @@ -0,0 +1,10 @@ +import { atom } from "jotai" +import { AddressLinkParams } from "./types" + +export const accountModalAtom = atom(false) +export const walletSelectorModalAtom = atom(false) +export const addressLinkParamsAtom = atom({ + userId: undefined, + address: undefined, +}) +export const walletLinkHelperModalAtom = atom(false) diff --git a/src/v2/components/Providers/types.ts b/src/v2/components/Providers/types.ts new file mode 100644 index 0000000000..5ade9f1a27 --- /dev/null +++ b/src/v2/components/Providers/types.ts @@ -0,0 +1,4 @@ +export type AddressLinkParams = { + userId?: number + address?: `0x${string}` +} diff --git a/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx b/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx index b1ba0af223..e0f0a8e50b 100644 --- a/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx @@ -12,7 +12,7 @@ import LogicDivider from "components/[guild]/LogicDivider" import Button from "components/common/Button" import { Modal } from "components/common/Modal" import { useAtom } from "jotai" -import { walletLinkHelperModalAtom } from "../Providers/Providers" +import { walletLinkHelperModalAtom } from "../Providers/atoms" const WalletLinkHelperModal = () => { const [isWalletLinkHelperModalOpen, setIsWalletLinkModalOpen] = useAtom( diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index 414b55eb64..b160d04f4e 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -16,7 +16,7 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { addressLinkParamsAtom, walletLinkHelperModalAtom, -} from "@/components/Providers/Providers" +} from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" import { useAtom, useSetAtom } from "jotai" diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx index 0920c8ca51..a1edeaa170 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx @@ -1,7 +1,7 @@ import { addressLinkParamsAtom, walletLinkHelperModalAtom, -} from "@/components/Providers/Providers" +} from "@/components/Providers/atoms" import { Button, ButtonProps } from "@/components/ui/Button" import useConnectorNameAndIcon from "@/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon" import { useUserPublic } from "@/hooks/useUserPublic" diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts index e9f75870c6..9c15770d67 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/hooks/useLinkAddress.ts @@ -1,8 +1,6 @@ +import { addressLinkParamsAtom } from "@/components/Providers/atoms" import { usePostHogContext } from "@/components/Providers/PostHogProvider" -import { - AddressLinkParams, - addressLinkParamsAtom, -} from "@/components/Providers/Providers" +import { AddressLinkParams } from "@/components/Providers/types" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { useUserPublic } from "@/hooks/useUserPublic" import useSubmit from "hooks/useSubmit" diff --git a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx index 7d639f416a..c3473924da 100644 --- a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx +++ b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx @@ -1,6 +1,6 @@ import useAutoReconnect from "@/hooks/useAutoReconnect" import { useAtom } from "jotai" -import { walletSelectorModalAtom } from "../Providers/Providers" +import { walletSelectorModalAtom } from "../Providers/atoms" import { useTriggerWalletSelectorModal } from "./hooks/useTriggerWalletSelectorModal" import WalletSelectorModal from "./WalletSelectorModal" diff --git a/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts b/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts index 7dd3f8e0d1..73f96d4d9d 100644 --- a/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts +++ b/src/v2/components/Web3ConnectionManager/hooks/useTriggerWalletSelectorModal.ts @@ -1,4 +1,4 @@ -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useSetAtom } from "jotai" import { useSearchParams } from "next/navigation" import { useEffect } from "react" diff --git a/src/v2/hooks/useUserPublic.ts b/src/v2/hooks/useUserPublic.ts index e01247a0a7..3f9a409807 100644 --- a/src/v2/hooks/useUserPublic.ts +++ b/src/v2/hooks/useUserPublic.ts @@ -1,5 +1,5 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" -import { walletSelectorModalAtom } from "@/components/Providers/Providers" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useToast } from "@/components/ui/hooks/useToast" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { PublicUserProfile } from "@guildxyz/types" From bd36ad8908cd4d54af182db0a4d466b29d208e9f Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 3 Jul 2024 17:10:49 +0200 Subject: [PATCH 026/110] feat(CopyableAddress): add tooltip --- src/v2/components/CopyableAddress.tsx | 50 ++++++++++++++++++--------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/v2/components/CopyableAddress.tsx b/src/v2/components/CopyableAddress.tsx index 4c2a9ddbf2..4cfef96aea 100644 --- a/src/v2/components/CopyableAddress.tsx +++ b/src/v2/components/CopyableAddress.tsx @@ -1,8 +1,14 @@ import { cn } from "@/lib/utils" -import { ButtonHTMLAttributes } from "react" +import { ButtonHTMLAttributes, useRef, useState } from "react" import { useCopyToClipboard } from "usehooks-ts" import shortenHex from "utils/shortenHex" import { Button } from "./ui/Button" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "./ui/Tooltip" interface Props extends ButtonHTMLAttributes { address: string @@ -17,24 +23,34 @@ const CopyableAddress = ({ className, ...props }: Props): JSX.Element => { - const [copiedText, copyToClipboard] = useCopyToClipboard() + const buttonRef = useRef(null) + const [, copyToClipboard] = useCopyToClipboard() + const [forceOpenTooltip, setForceOpenTooltip] = useState(false) return ( - // - - // + + + + + + + {forceOpenTooltip ? "Copied" : "Click to copy address"} + + + ) } From 5b1c1a6647aa1c565a08ea5fd90a4e2f64d96890 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 3 Jul 2024 23:53:56 +0200 Subject: [PATCH 027/110] feat: `NetworkModal` migration --- .../components/NetworkModal/NetworkButton.tsx | 51 ---------------- .../components/NetworkModal/NetworkModal.tsx | 33 ---------- .../components/AccountModal/AccountModal.tsx | 60 ++++++++++++++----- .../components/NetworkModal/NetworkButton.tsx | 60 +++++++++++++++++++ .../NetworkModal/NetworkButtonsList.tsx | 9 +-- .../components/NetworkModal/NetworkModal.tsx | 40 +++++++++++++ .../Account/components/NetworkModal/index.ts | 0 7 files changed, 148 insertions(+), 105 deletions(-) delete mode 100644 src/components/common/Layout/components/Account/components/NetworkModal/NetworkButton.tsx delete mode 100644 src/components/common/Layout/components/Account/components/NetworkModal/NetworkModal.tsx create mode 100644 src/v2/components/Account/components/NetworkModal/NetworkButton.tsx rename src/{components/common/Layout => v2}/components/Account/components/NetworkModal/NetworkButtonsList.tsx (86%) create mode 100644 src/v2/components/Account/components/NetworkModal/NetworkModal.tsx rename src/{components/common/Layout => v2}/components/Account/components/NetworkModal/index.ts (100%) diff --git a/src/components/common/Layout/components/Account/components/NetworkModal/NetworkButton.tsx b/src/components/common/Layout/components/Account/components/NetworkModal/NetworkButton.tsx deleted file mode 100644 index ed42b6519f..0000000000 --- a/src/components/common/Layout/components/Account/components/NetworkModal/NetworkButton.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Img, Tooltip } from "@chakra-ui/react" -import Button from "components/common/Button" -import { useChainId } from "wagmi" -import { CHAIN_CONFIG, Chain, Chains } from "wagmiConfig/chains" - -type Props = { - chain: Chain - requestNetworkChange: () => void -} - -const NetworkButton = ({ chain, requestNetworkChange }: Props) => { - const chainId = useChainId() - - const isCurrentChain = Chains[chain] === chainId - - return ( - - - - ) -} - -export default NetworkButton diff --git a/src/components/common/Layout/components/Account/components/NetworkModal/NetworkModal.tsx b/src/components/common/Layout/components/Account/components/NetworkModal/NetworkModal.tsx deleted file mode 100644 index c747f9a11d..0000000000 --- a/src/components/common/Layout/components/Account/components/NetworkModal/NetworkModal.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { - ModalBody, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalOverlay, - Text, -} from "@chakra-ui/react" -import { Modal } from "components/common/Modal" -import NetworkButtonsList from "./NetworkButtonsList" - -const NetworkModal = ({ isOpen, onClose }) => ( - - - - Supported networks - - - - It doesn't matter which supported chain you're connected to, it's only used - to know your address and sign messages so each will work equally. - - - - - -) - -export default NetworkModal diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 59f8461519..862580ac66 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -17,15 +17,20 @@ import { } from "@/components/ui/Tooltip" import useConnectorNameAndIcon from "@/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useDisclosure } from "@/hooks/useDisclosure" import { useUserPublic } from "@/hooks/useUserPublic" -import { SignOut } from "@phosphor-icons/react/dist/ssr" +import { LinkBreak, SignOut } from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" +import useResolveAddress from "hooks/useResolveAddress" import { useAtom } from "jotai" import { deleteKeyPairFromIdb } from "utils/keyPair" import { useAccount } from "wagmi" +import { CHAIN_CONFIG, Chains } from "wagmiConfig/chains" +import NetworkModal from "../NetworkModal" +import { AccountConnections } from "./components/AccountConnections" const AccountModal = () => { - const { address, disconnect } = useWeb3ConnectionManager() + const { address, disconnect, type } = useWeb3ConnectionManager() const { connectorName } = useConnectorNameAndIcon() const [isOpen, setIsOpen] = useAtom(accountModalAtom) @@ -34,12 +39,14 @@ const AccountModal = () => { const { id } = useUser() const { deleteKeys } = useUserPublic() - const { address: evmAddress } = useAccount() - // const domain = useResolveAddress(evmAddress) - //TODO - const domain = "" + const { address: evmAddress, chainId } = useAccount() + const domain = useResolveAddress(evmAddress) - // TODO: do we need to keep the network modal? We should check the number of "Opened network modal" PostHog events and decide if we should keep it or not. + const { + isOpen: isNetworkModalOpen, + onOpen: openNetworkModal, + onClose: closeNetworkModal, + } = useDisclosure() const handleLogout = () => { const keysToRemove = Object.keys({ ...window.localStorage }).filter((key) => @@ -62,6 +69,8 @@ const AccountModal = () => { return ( + + Account @@ -84,11 +93,36 @@ const AccountModal = () => {

    {`Connected with ${connectorName}`}

    + + {type === "EVM" ? ( + + ) : ( + {CHAIN_CONFIG[Chains[chainId]].name} + )}
    - {/* */} +
    @@ -111,15 +145,13 @@ const AccountModal = () => {
    - {/* */} + {/*
    */} {/*TODO: */} ) : (

    Not connected

    )} - - ) diff --git a/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx b/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx new file mode 100644 index 0000000000..3c0469ce8b --- /dev/null +++ b/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx @@ -0,0 +1,60 @@ +import { Button } from "@/components/ui/Button" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { cn } from "@/lib/utils" +import clsx from "clsx" +import { useChainId } from "wagmi" +import { CHAIN_CONFIG, Chain, Chains } from "wagmiConfig/chains" + +type Props = { + chain: Chain + requestNetworkChange: () => void +} + +const NetworkButton = ({ chain, requestNetworkChange }: Props) => { + const chainId = useChainId() + + const isCurrentChain = Chains[chain] === chainId + const shouldStayClosed = !isCurrentChain && !CHAIN_CONFIG[chain].deprecated + + return ( + + + + + + + + {isCurrentChain + ? `${CHAIN_CONFIG[chain].name} is currently selected` + : "Deprecated chain"} + + + + + ) +} + +export default NetworkButton diff --git a/src/components/common/Layout/components/Account/components/NetworkModal/NetworkButtonsList.tsx b/src/v2/components/Account/components/NetworkModal/NetworkButtonsList.tsx similarity index 86% rename from src/components/common/Layout/components/Account/components/NetworkModal/NetworkButtonsList.tsx rename to src/v2/components/Account/components/NetworkModal/NetworkButtonsList.tsx index 3b52e362b6..0784b4ae57 100644 --- a/src/components/common/Layout/components/Account/components/NetworkModal/NetworkButtonsList.tsx +++ b/src/v2/components/Account/components/NetworkModal/NetworkButtonsList.tsx @@ -1,4 +1,3 @@ -import { SimpleGrid } from "@chakra-ui/react" import useTriggerNetworkChange from "hooks/useTriggerNetworkChange" import { CHAIN_CONFIG, Chains, supportedChains } from "wagmiConfig/chains" import NetworkButton from "./NetworkButton" @@ -11,11 +10,7 @@ const NetworkButtonsList = ({ networkChangeCallback }: Props): JSX.Element => { const { requestNetworkChange } = useTriggerNetworkChange() return ( - +
    <> {supportedChains .filter((chain) => !CHAIN_CONFIG[chain].deprecated) @@ -39,7 +34,7 @@ const NetworkButtonsList = ({ networkChangeCallback }: Props): JSX.Element => { /> ))} - +
    ) } diff --git a/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx b/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx new file mode 100644 index 0000000000..7349b67330 --- /dev/null +++ b/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx @@ -0,0 +1,40 @@ +import { + Dialog, + DialogCloseButton, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/Dialog" +import { useDisclosure } from "@/hooks/useDisclosure" +import NetworkButtonsList from "./NetworkButtonsList" + +const NetworkModal = ({ + isOpen, + onClose, +}: { + isOpen: ReturnType["isOpen"] + onClose: ReturnType["onClose"] +}) => ( + + + + + Supported networks + + +

    + {" "} + It doesn't matter which supported chain you're connected to, it's only used + to know your address and sign messages so each will work equally. +

    + + +
    +
    +) + +export default NetworkModal diff --git a/src/components/common/Layout/components/Account/components/NetworkModal/index.ts b/src/v2/components/Account/components/NetworkModal/index.ts similarity index 100% rename from src/components/common/Layout/components/Account/components/NetworkModal/index.ts rename to src/v2/components/Account/components/NetworkModal/index.ts From 18647934e2ae63ebf8a83b5bc520429b0cf08ec2 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Thu, 4 Jul 2024 15:38:23 +0200 Subject: [PATCH 028/110] feat: `Accordion` component --- package-lock.json | 60 ++++++++++++++++++++ package.json | 3 +- src/v2/components/ui/Accordion.stories.tsx | 64 ++++++++++++++++++++++ src/v2/components/ui/Accordion.tsx | 59 ++++++++++++++++++++ 4 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 src/v2/components/ui/Accordion.stories.tsx create mode 100644 src/v2/components/ui/Accordion.tsx diff --git a/package-lock.json b/package-lock.json index 875c38720f..87a4b70b46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "@lexical/utils": "^0.12.0", "@nouns/assets": "^0.4.2", "@phosphor-icons/react": "^2.1.7", + "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-focus-scope": "^1.1.0", @@ -7262,6 +7263,36 @@ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.0.tgz", + "integrity": "sha512-HJOzSX8dQqtsp/3jVxCU3CXEONF7/2jlGAB28oX8TTw1Dz8JYbEI1UcL8355PuLBE41/IRRMvCw7VkiK/jcUOQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collapsible": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-alert-dialog": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.1.tgz", @@ -7311,6 +7342,35 @@ } } }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz", + "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", diff --git a/package.json b/package.json index f5440224f4..30c17f7a1d 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,8 @@ "@lexical/selection": "^0.12.0", "@lexical/utils": "^0.12.0", "@nouns/assets": "^0.4.2", + "@phosphor-icons/react": "^2.1.7", + "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-focus-scope": "^1.1.0", @@ -52,7 +54,6 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@phosphor-icons/react": "^2.1.7", "@snyk/protect": "latest", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/react-query": "^5.26.3", diff --git a/src/v2/components/ui/Accordion.stories.tsx b/src/v2/components/ui/Accordion.stories.tsx new file mode 100644 index 0000000000..633e182133 --- /dev/null +++ b/src/v2/components/ui/Accordion.stories.tsx @@ -0,0 +1,64 @@ +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/Accordion" +import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" +import { + AccordionMultipleProps, + AccordionSingleProps, +} from "@radix-ui/react-accordion" +import type { Meta, StoryObj } from "@storybook/react" + +const AccordionExample = (props: AccordionSingleProps | AccordionMultipleProps) => ( + + + What's this? + +
    + An accordion. + + + + + + + And what's this? + + This is the second item inside the accordion. + + + +) + +const meta: Meta = { + title: "Design system/Accordion", + component: AccordionExample, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + type: "single", + collapsible: true, + }, + argTypes: { + type: { + control: { + type: "select", + }, + options: ["single", "multiple"], + }, + }, +} diff --git a/src/v2/components/ui/Accordion.tsx b/src/v2/components/ui/Accordion.tsx new file mode 100644 index 0000000000..e0fc108f57 --- /dev/null +++ b/src/v2/components/ui/Accordion.tsx @@ -0,0 +1,59 @@ +"use client" + +import { cn } from "@/lib/utils" +import { CaretDown } from "@phosphor-icons/react/dist/ssr" +import * as AccordionPrimitive from "@radix-ui/react-accordion" +import * as React from "react" + +const Accordion = AccordionPrimitive.Root +export type AccordionProps = React.ComponentPropsWithoutRef< + typeof AccordionPrimitive.Root +> + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AccordionItem.displayName = "AccordionItem" + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180", + className + )} + {...props} + > + {children} + + + +)) +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
    {children}
    +
    +)) +AccordionContent.displayName = AccordionPrimitive.Content.displayName + +export { Accordion, AccordionContent, AccordionItem, AccordionTrigger } From ee7980c03296712cd71d70e3da8b639d3289a202 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Thu, 4 Jul 2024 17:18:05 +0200 Subject: [PATCH 029/110] temporarily remove `CircularDependencyPlugin` --- next.config.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/next.config.js b/next.config.js index 452d44f1ea..b2ac87456a 100644 --- a/next.config.js +++ b/next.config.js @@ -36,15 +36,15 @@ const nextConfig = { ) } - config.plugins.push( - new CircularDependencyPlugin({ - exclude: /.next|node_modules/, - include: /src/, - // TODO: if all circular dependencies are resolved, set this argument to true - failOnError: false, - allowAsyncCycles: false, - }) - ) + // config.plugins.push( + // new CircularDependencyPlugin({ + // exclude: /.next|node_modules/, + // include: /src/, + // // TODO: if all circular dependencies are resolved, set this argument to true + // failOnError: false, + // allowAsyncCycles: false, + // }) + // ) return config }, From 20adadc4f768d3a64bcb95d6235ea956e02befb5 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Thu, 4 Jul 2024 17:40:08 +0200 Subject: [PATCH 030/110] move `platformMergeAlertAtom` to `atoms.ts` --- .../[guild]/JoinModal/hooks/useConnectPlatform.ts | 4 ++-- src/hooks/useOAuthResultToast.ts | 4 ++-- src/v2/components/Providers/atoms.ts | 4 ++++ .../Web3ConnectionManager/PlatformMergeErrorAlert.tsx | 8 ++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts b/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts index e339c41ec8..a6491bc5e4 100644 --- a/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts +++ b/src/components/[guild]/JoinModal/hooks/useConnectPlatform.ts @@ -1,6 +1,6 @@ +import { platformMergeAlertAtom } from "@/components/Providers/atoms" import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { useToast } from "@/components/ui/hooks/useToast" -import { platformMergeAlertAtom } from "@/components/Web3ConnectionManager/PlatformMergeErrorAlert" import useUser from "components/[guild]/hooks/useUser" import { env } from "env" import { useFetcherWithSign } from "hooks/useFetcherWithSign" @@ -9,8 +9,8 @@ import useSubmit, { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import { UseSubmitOptions } from "hooks/useSubmit/useSubmit" import { useSetAtom } from "jotai" import { OAuthResultParams } from "pages/oauth-result" -import rewards from "rewards" import { useCallback, useMemo } from "react" +import rewards from "rewards" import useSWR from "swr" import { PlatformName, PlatformType } from "types" import fetcher from "utils/fetcher" diff --git a/src/hooks/useOAuthResultToast.ts b/src/hooks/useOAuthResultToast.ts index 611620214f..2afa205d77 100644 --- a/src/hooks/useOAuthResultToast.ts +++ b/src/hooks/useOAuthResultToast.ts @@ -1,8 +1,8 @@ -import { platformMergeAlertAtom } from "@/components/Web3ConnectionManager/PlatformMergeErrorAlert" +import { platformMergeAlertAtom } from "@/components/Providers/atoms" import { useSetAtom } from "jotai" import { useRouter } from "next/router" -import rewards from "rewards" import { useEffect } from "react" +import rewards from "rewards" import { PlatformName } from "types" import useToast from "./useToast" diff --git a/src/v2/components/Providers/atoms.ts b/src/v2/components/Providers/atoms.ts index e0408c6971..ca9e07bb0d 100644 --- a/src/v2/components/Providers/atoms.ts +++ b/src/v2/components/Providers/atoms.ts @@ -1,4 +1,5 @@ import { atom } from "jotai" +import { PlatformName } from "types" import { AddressLinkParams } from "./types" export const accountModalAtom = atom(false) @@ -8,3 +9,6 @@ export const addressLinkParamsAtom = atom({ address: undefined, }) export const walletLinkHelperModalAtom = atom(false) +export const platformMergeAlertAtom = atom< + false | { addressOrDomain: string; platformName: PlatformName } +>(false) diff --git a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx index 6083e01674..a72ff05136 100644 --- a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx +++ b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx @@ -18,18 +18,14 @@ import Button from "components/common/Button" import CopyableAddress from "components/common/CopyableAddress" import { Alert } from "components/common/Modal" import useToast from "hooks/useToast" -import { atom, useAtom } from "jotai" +import { useAtom } from "jotai" import { useRef } from "react" import rewards from "rewards" -import { PlatformName } from "types" import capitalize from "utils/capitalize" import shortenHex from "utils/shortenHex" +import { platformMergeAlertAtom } from "../Providers/atoms" import { useWeb3ConnectionManager } from "./hooks/useWeb3ConnectionManager" -export const platformMergeAlertAtom = atom< - false | { addressOrDomain: string; platformName: PlatformName } ->(false) - const PlatformMergeErrorAlert = () => { const { address } = useWeb3ConnectionManager() const toast = useToast() From 29127bf6707c7542b7d033cb974f16b22307b122 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Thu, 4 Jul 2024 17:40:32 +0200 Subject: [PATCH 031/110] fix(useUserPublic): comment posthog related stuff --- src/v2/hooks/useUserPublic.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/v2/hooks/useUserPublic.ts b/src/v2/hooks/useUserPublic.ts index 3f9a409807..e0a9dfa429 100644 --- a/src/v2/hooks/useUserPublic.ts +++ b/src/v2/hooks/useUserPublic.ts @@ -1,4 +1,3 @@ -import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useToast } from "@/components/ui/hooks/useToast" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" @@ -33,7 +32,6 @@ export function useUserPublic(userIdOrAddress?: number | string): PublicUser & { } { const { address } = useWeb3ConnectionManager() const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - const { captureEvent } = usePostHogContext() const { toast } = useToast() const idToUseRaw = userIdOrAddress ?? address @@ -53,11 +51,12 @@ export function useUserPublic(userIdOrAddress?: number | string): PublicUser & { } else { await deleteKeyPairFromIdb(user.id) - captureEvent("Invalid keypair", { - userId: user.id, - pubKey: keys.pubKey, - savedPubKey: user.publicKey, - }) + // TODO: we can't really use PostHog here because it causes circular imports + // captureEvent("Invalid keypair", { + // userId: user.id, + // pubKey: keys.pubKey, + // savedPubKey: user.publicKey, + // }) toast({ variant: "warning", From b6a4d305373a07d6ce073d99d7121cedf8343ab4 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Fri, 5 Jul 2024 09:17:02 +0200 Subject: [PATCH 032/110] feat: `FarcasterProfile` component --- src/app/globals.css | 5 + .../components/ConnectEmailJoinStep.tsx | 16 +- .../ConnectRequirementPlatformButton.tsx | 31 ++- .../components/AccountConnections.tsx | 159 ----------- .../SocialAccount/SocialAccount.tsx | 108 -------- .../components/DisconnectAccountButton.tsx | 78 ------ .../components/SocialAccountUI.tsx | 59 ----- .../components/SocialAccount/index.ts | 5 - .../UsersGuildCredentials/UsersGuildPins.tsx | 2 +- src/rewards/Gather/ClaimGatherModal.tsx | 4 +- .../components/AccountModal/AccountModal.tsx | 4 +- .../components/AccountConnections.tsx | 102 ++++--- .../components/AccountSection.tsx | 32 +++ .../AccountModal/components}/EmailAddress.tsx | 8 +- .../components}/FarcasterProfile.tsx | 249 ++++++++++-------- .../AccountModal/components/SocialAccount.tsx | 2 +- .../components}/utils/processEmailError.ts | 0 .../AccountModal/hooks}/useDelegateVaults.ts | 0 src/v2/components/Providers/Providers.tsx | 2 +- .../WalletSelectorModal.tsx | 4 +- .../components/AccountButton.tsx | 7 +- src/v2/components/ui/AlertDialog.stories.tsx | 2 +- src/v2/components/ui/Skeleton.tsx | 9 + src/v2/components/ui/hooks/useToast.ts | 4 +- tailwind.config.ts | 2 + 25 files changed, 293 insertions(+), 601 deletions(-) delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/AccountConnections.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/SocialAccount.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/DisconnectAccountButton.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/SocialAccountUI.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/index.ts create mode 100644 src/v2/components/Account/components/AccountModal/components/AccountSection.tsx rename src/{components/common/Layout/components/Account/components/AccountModal/components/SocialAccount => v2/components/Account/components/AccountModal/components}/EmailAddress.tsx (96%) rename src/{components/common/Layout/components/Account/components/AccountModal/components/SocialAccount => v2/components/Account/components/AccountModal/components}/FarcasterProfile.tsx (60%) rename src/{components/common/Layout/components/Account/components/AccountModal/components/SocialAccount => v2/components/Account/components/AccountModal/components}/utils/processEmailError.ts (100%) rename src/{components/common/Layout/components/Account/components/delegate => v2/components/Account/components/AccountModal/hooks}/useDelegateVaults.ts (100%) create mode 100644 src/v2/components/ui/Skeleton.tsx diff --git a/src/app/globals.css b/src/app/globals.css index 242559346b..70ebd4b42f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -62,6 +62,8 @@ --twitter: 0 0% 0%; --github: 0 0% 20%; --farcaster: 238 76% 69%; + --farcaster-hover: 239 75% 64%; + --farcaster-active: 239 75% 58%; --polygonid: 259 59% 59%; --sm: 640px; @@ -122,6 +124,9 @@ --toast-error: 317 4% 35%; --toast-warning: 30 6% 34%; --toast-info: 226 7% 36%; + + --farcaster-hover: 239 75% 75%; + --farcaster-active: 238 76% 81%; } } diff --git a/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx b/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx index f3ea1437c2..3924431bab 100644 --- a/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx +++ b/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx @@ -1,7 +1,6 @@ +import { ConnectEmailButton } from "@/components/Account/components/AccountModal/components/EmailAddress" import { Tooltip } from "@chakra-ui/react" -import { EnvelopeSimple } from "@phosphor-icons/react" import useUser from "components/[guild]/hooks/useUser" -import { ConnectEmailButton } from "components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/EmailAddress" import { useAccount } from "wagmi" import { JoinStepUI } from "./JoinStep" @@ -9,7 +8,7 @@ const ConnectEmailJoinStep = (): JSX.Element => { const { isConnected } = useAccount() const { emails } = useUser() - const isDone = emails?.emailAddress && !emails.pending + const isDone = Boolean(emails?.emailAddress && !emails.pending) return ( @@ -19,12 +18,13 @@ const ConnectEmailJoinStep = (): JSX.Element => { shouldWrapChildren > } - flexShrink="0" - minW="max-content" - maxW={isDone && "40"} + // TODO + // leftIcon={} + // flexShrink="0" + // minW="max-content" + // maxW={isDone && "40"} /> diff --git a/src/components/[guild]/Requirements/components/ConnectRequirementPlatformButton.tsx b/src/components/[guild]/Requirements/components/ConnectRequirementPlatformButton.tsx index 987f8906bc..5e5394b306 100644 --- a/src/components/[guild]/Requirements/components/ConnectRequirementPlatformButton.tsx +++ b/src/components/[guild]/Requirements/components/ConnectRequirementPlatformButton.tsx @@ -1,14 +1,14 @@ -import { ButtonProps, Icon } from "@chakra-ui/react" +import { ConnectEmailButton } from "@/components/Account/components/AccountModal/components/EmailAddress" +import { ConnectFarcasterButton } from "@/components/Account/components/AccountModal/components/FarcasterProfile" +import { ButtonProps } from "@chakra-ui/react" import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" import useUser from "components/[guild]/hooks/useUser" import Button from "components/common/Button" -import { ConnectEmailButton } from "components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/EmailAddress" -import { ConnectFarcasterButton } from "components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile" import { useRoleMembership } from "components/explorer/hooks/useMembership" import useToast from "hooks/useToast" -import rewards from "rewards" import REQUIREMENTS, { RequirementType } from "requirements" +import rewards from "rewards" import { PlatformName } from "types" import { useRequirementContext } from "./RequirementContext" @@ -61,16 +61,19 @@ const RequirementConnectButton = (props: ButtonProps) => { ? ConnectFarcasterButton : ConnectRequirementPlatformButton - return ( - } - size="xs" - iconSpacing="1" - {...props} - /> - ) + return null + // TODO + // return ( + // } + // // size="xs" + // // iconSpacing="1" + // {...props} + // /> + // ) } const ConnectRequirementPlatformButton = ({ diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/AccountConnections.tsx deleted file mode 100644 index a11d964a99..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/AccountConnections.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { - ButtonGroup, - Divider, - Heading, - HStack, - Icon, - Popover, - PopoverArrow, - PopoverBody, - PopoverContent, - PopoverTrigger, - Spacer, - Stack, - StackProps, - Text, - useColorModeValue, -} from "@chakra-ui/react" -import { Question } from "@phosphor-icons/react" -import useUser from "components/[guild]/hooks/useUser" -import { SectionProps } from "components/common/Section" -import { PropsWithChildren, useMemo } from "react" -import rewards from "rewards" -import { PlatformName } from "types" -import useDelegateVaults from "../../delegate/useDelegateVaults" -import LinkAddressButton from "./LinkAddressButton" -import LinkDelegateVaultButton from "./LinkDelegateVaultButton" -import LinkedAddress, { LinkedAddressSkeleton } from "./LinkedAddress" -import SharedSocials from "./SharedSocials" -import SocialAccount, { EmailAddress } from "./SocialAccount" -import FarcasterProfile from "./SocialAccount/FarcasterProfile" - -const AccountConnections = () => { - const { isLoading, addresses, platformUsers, sharedSocials } = useUser() - const vaults = useDelegateVaults() - - const orderedSocials = useMemo(() => { - const connectedPlatforms = - platformUsers - ?.filter((platformUser) => rewards[platformUser.platformName].isPlatform) - ?.map((platformUser) => platformUser.platformName as string) ?? [] - const notConnectedPlatforms = Object.keys(rewards).filter( - (platform) => - rewards[platform].isPlatform && !connectedPlatforms?.includes(platform) - ) - return [...connectedPlatforms, ...notConnectedPlatforms] as PlatformName[] - }, [platformUsers]) - - return ( - <> - 0 ? : undefined} - /> - }> - {orderedSocials.map((platform) => - platform === "EMAIL" ? ( - - ) : platform === "FARCASTER" ? ( - - ) : ( - - ) - )} - - - 1 ? ( - <> - - - - - - - - Each of your addresses will be used for requirement checks - - - - - - - ) : undefined - } - spacing={3} - pt="4" - /> - - }> - {isLoading ? ( - - ) : !(addresses?.length > 1) ? ( - - - No linked addresses yet - - {vaults?.length ? ( - - - - - ) : ( - - )} - - ) : ( - addresses - .map((addressData) => ( - - )) - .concat( - vaults?.length > 0 ? : [] - ) - )} - - - ) -} - -export const AccountSection = ({ - children, - ...rest -}: PropsWithChildren) => { - const bg = useColorModeValue("gray.50", "blackAlpha.200") - - return ( - - {children} - - ) -} - -export const AccountSectionTitle = ({ title, titleRightElement }: SectionProps) => ( - - - {title} - - {titleRightElement} - -) - -export default AccountConnections diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/SocialAccount.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/SocialAccount.tsx deleted file mode 100644 index 2d685a6683..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/SocialAccount.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { HStack, useDisclosure } from "@chakra-ui/react" -import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" -import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" -import useUser from "components/[guild]/hooks/useUser" -import Button from "components/common/Button" -import useMembership from "components/explorer/hooks/useMembership" -import useToast from "hooks/useToast" -import { memo } from "react" -import rewards from "rewards" -import { PlatformName } from "types" -import useDisconnect from "../../hooks/useDisconnect" -import DisconnectAccountButton from "./components/DisconnectAccountButton" -import SocialAccountUI from "./components/SocialAccountUI" - -type Props = { - type: PlatformName -} - -const SocialAccount = memo(({ type }: Props): JSX.Element => { - const { platformUsers } = useUser() - const { membership } = useMembership() - const platformUser = platformUsers?.find( - (platform) => platform.platformName.toString() === type - ) - - const isConnected = !!platformUser - - const isReconnect = - !!membership && - membership?.roles?.some(({ requirements }) => - requirements?.some( - ({ errorType, subType }) => - errorType === "PLATFORM_CONNECT_INVALID" && subType?.toUpperCase() === type - ) - ) - - return ( - - {!isConnected ? ( - - ) : ( - - {isReconnect && } - - - )} - - ) -}) - -const ConnectPlatformButton = ({ type, isReconnect = false }) => { - const toast = useToast() - const { triggerMembershipUpdate } = useMembershipUpdate() - - const onSuccess = () => { - toast({ - title: `Account successfully connected`, - status: "success", - }) - triggerMembershipUpdate() - } - - const { isLoading, response, onConnect } = useConnectPlatform( - type as PlatformName, - onSuccess, - isReconnect - ) - - return ( - - ) -} - -const DisconnectPlatformButton = ({ type }: { type: PlatformName }) => { - const disclosure = useDisclosure() - - const { onSubmit, isLoading, signLoadingText } = useDisconnect(disclosure.onClose) - const onConfirm = () => onSubmit({ platformName: type }) - const loadingText = signLoadingText ?? "Removing" - - return ( - - ) -} - -export default SocialAccount diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/DisconnectAccountButton.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/DisconnectAccountButton.tsx deleted file mode 100644 index 0c1b29e458..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/DisconnectAccountButton.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { - AlertDialogBody, - AlertDialogContent, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogOverlay, - Icon, - IconButton, - Tooltip, - useDisclosure, -} from "@chakra-ui/react" -import { LinkBreak } from "@phosphor-icons/react" -import Button from "components/common/Button" -import { Alert } from "components/common/Modal" -import { useRef } from "react" -import { PathString } from "react-hook-form" - -type Disclosure = ReturnType - -const DisconnectAccountButton = ({ - onConfirm, - isLoading, - loadingText, - name, - disclosure: { isOpen, onClose, onOpen }, -}: { - onConfirm: () => void - isLoading: boolean - loadingText: PathString - disclosure: Disclosure - name: string -}) => { - const alertCancelRef = useRef() - - return ( - <> - - } - colorScheme="red" - onClick={onOpen} - aria-label="Disconnect account" - /> - - - - - {`Disconnect ${name} account`} - - - {`Are you sure? This account will lose every Guild gated access on ${name}.`} - - - - - - - - - - - ) -} - -export default DisconnectAccountButton diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/SocialAccountUI.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/SocialAccountUI.tsx deleted file mode 100644 index 293dfdabdb..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/components/SocialAccountUI.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { - Avatar, - AvatarBadge, - HStack, - Icon, - Text, - useColorModeValue, -} from "@chakra-ui/react" -import { motion } from "framer-motion" -import rewards from "rewards" -import { PropsWithChildren } from "react" -import { PlatformName } from "types" - -const MotionHStack = motion(HStack) - -const SocialAccountUI = ({ - type, - avatarUrl, - username, - isConnected, - children, -}: PropsWithChildren<{ - type: PlatformName - avatarUrl?: string - username?: string - isConnected?: boolean -}>) => { - const { icon, colorScheme } = rewards[type] - const circleBorderColor = useColorModeValue("gray.100", "gray.700") - - return ( - - {!!avatarUrl ? ( - - - - - - ) : ( - } - boxSize={7} - bgColor={`${colorScheme}.500`} - /> - )} - - {username ?? `${rewards[type].name} ${isConnected ? "connected" : ""}`} - - {children} - - ) -} - -export default SocialAccountUI diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/index.ts b/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/index.ts deleted file mode 100644 index 7fd5422ec3..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import EmailAddress from "./EmailAddress" -import SocialAccount from "./SocialAccount" - -export default SocialAccount -export { EmailAddress } diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx index 20a82121d8..52b11bbb5f 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx @@ -1,8 +1,8 @@ +import { AccountSectionTitle } from "@/components/Account/components/AccountModal/components/AccountSection" import { accountModalAtom } from "@/components/Providers/atoms" import { Alert, AlertIcon, Box, Flex, Text } from "@chakra-ui/react" import useUsersGuildPins from "hooks/useUsersGuildPins" import { useAtomValue } from "jotai" -import { AccountSectionTitle } from "../AccountConnections" import GuildPin from "./GuildPin" import GuildPinSkeleton from "./GuildPinSkeleton" diff --git a/src/rewards/Gather/ClaimGatherModal.tsx b/src/rewards/Gather/ClaimGatherModal.tsx index 446a373803..2574c80557 100644 --- a/src/rewards/Gather/ClaimGatherModal.tsx +++ b/src/rewards/Gather/ClaimGatherModal.tsx @@ -1,3 +1,5 @@ +import { AccountSection } from "@/components/Account/components/AccountModal/components/AccountSection" +import EmailAddress from "@/components/Account/components/AccountModal/components/EmailAddress" import { Alert, AlertDescription, @@ -16,8 +18,6 @@ import { } from "@chakra-ui/react" import { ArrowSquareOut } from "@phosphor-icons/react" import useUser from "components/[guild]/hooks/useUser" -import { AccountSection } from "components/common/Layout/components/Account/components/AccountModal/components/AccountConnections" -import EmailAddress from "components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/EmailAddress" type ModalProps = { title: string diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 862580ac66..457a2d07e9 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -21,7 +21,6 @@ import { useDisclosure } from "@/hooks/useDisclosure" import { useUserPublic } from "@/hooks/useUserPublic" import { LinkBreak, SignOut } from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" -import useResolveAddress from "hooks/useResolveAddress" import { useAtom } from "jotai" import { deleteKeyPairFromIdb } from "utils/keyPair" import { useAccount } from "wagmi" @@ -40,7 +39,8 @@ const AccountModal = () => { const { deleteKeys } = useUserPublic() const { address: evmAddress, chainId } = useAccount() - const domain = useResolveAddress(evmAddress) + const domain = "" // TODO + // const domain = useResolveAddress(evmAddress) const { isOpen: isNetworkModalOpen, diff --git a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx index 06b22cec67..32649d1971 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx @@ -1,9 +1,10 @@ -import { cn } from "@/lib/utils" import useUser from "components/[guild]/hooks/useUser" -import useDelegateVaults from "components/common/Layout/components/Account/components/delegate/useDelegateVaults" -import { ReactNode, useMemo } from "react" +import { useMemo } from "react" import rewards from "rewards" import { PlatformName } from "types" +import useDelegateVaults from "../hooks/useDelegateVaults" +import { AccountSection, AccountSectionTitle } from "./AccountSection" +import FarcasterProfile from "./FarcasterProfile" import { SocialAccount } from "./SocialAccount" const AccountConnections = () => { @@ -31,11 +32,10 @@ const AccountConnections = () => { <> {platform === "EMAIL" ? ( <> - ) : // + ) : // platform === "FARCASTER" ? ( - <> + ) : ( - // )} {i < orderedSocials.length - 1 && ( @@ -45,40 +45,66 @@ const AccountConnections = () => { ))} - - TODO + 1 ? ( + // <> + // + // + // + // + // + // + // + // Each of your addresses will be used for requirement checks + // + // + // + // + // + // + // ) : undefined + // } + /> + + {/* }> + {isLoading ? ( + + ) : !(addresses?.length > 1) ? ( + + + No linked addresses yet + + {vaults?.length ? ( + + + + + ) : ( + + )} + + ) : ( + addresses + .map((addressData) => ( + + )) + .concat( + vaults?.length > 0 ? : [] + ) + )} + */}
    ) } -const AccountSectionTitle = ({ - title, - titleRightElement, -}: { - title: string - titleRightElement?: ReactNode -}) => ( -
    - {title} - {titleRightElement} -
    -) - -const AccountSection = ({ - className, - children, -}: { - children: ReactNode - className?: string -}) => ( -
    - {children} -
    -) - export { AccountConnections } diff --git a/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx b/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx new file mode 100644 index 0000000000..caf80c6f46 --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx @@ -0,0 +1,32 @@ +import { cn } from "@/lib/utils" +import { ReactNode } from "react" + +export const AccountSectionTitle = ({ + title, + titleRightElement, +}: { + title: string + titleRightElement?: ReactNode +}) => ( +
    + {title} + {titleRightElement} +
    +) + +export const AccountSection = ({ + className, + children, +}: { + children: ReactNode + className?: string +}) => ( +
    + {children} +
    +) diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx similarity index 96% rename from src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/EmailAddress.tsx rename to src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index f1d2ce6e15..ce6eb7dd49 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -24,6 +24,7 @@ import useUser from "components/[guild]/hooks/useUser" import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" import Button from "components/common/Button" import { Error } from "components/common/Error" +import { useDisconnectEmail } from "components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect" import { Modal } from "components/common/Modal" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import useToast from "hooks/useToast" @@ -31,9 +32,8 @@ import { useEffect, useRef, useState } from "react" import { useController, useForm, useWatch } from "react-hook-form" import rewards from "rewards" import fetcher from "utils/fetcher" -import { useDisconnectEmail } from "../../hooks/useDisconnect" -import DisconnectAccountButton from "./components/DisconnectAccountButton" -import SocialAccountUI from "./components/SocialAccountUI" +import { DisconnectAccountButton } from "./DisconnectAccountButton" +import { SocialAccountUI } from "./SocialAccount" import processEmailError from "./utils/processEmailError" const TOO_MANY_ATTEMPTS_ERROR = @@ -287,7 +287,7 @@ const DisconnectEmailButton = () => { return ( ) } diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx similarity index 60% rename from src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx rename to src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx index 82d7cad39c..a0b7d5d28d 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/FarcasterProfile.tsx +++ b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx @@ -1,44 +1,45 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { Accordion, - AccordionButton, - AccordionIcon, + AccordionContent, AccordionItem, - AccordionPanel, - Box, - ButtonProps, - HStack, - Icon, - IconButton, - ModalBody, - ModalCloseButton, - ModalContent, - ModalFooter, - ModalHeader, - ModalOverlay, - Skeleton, - Text, + AccordionTrigger, +} from "@/components/ui/Accordion" +import { Button, ButtonProps, buttonVariants } from "@/components/ui/Button" +import { + Dialog, + DialogCloseButton, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/Dialog" +import { Skeleton } from "@/components/ui/Skeleton" +import { Tooltip, - VStack, - useBreakpointValue, - useDisclosure, -} from "@chakra-ui/react" + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { useDisclosure } from "@/hooks/useDisclosure" +import { cn } from "@/lib/utils" import { FarcasterProfile as FarcasterProfileType } from "@guildxyz/types" -import { ArrowCounterClockwise, DeviceMobileCamera } from "@phosphor-icons/react" +import { + ArrowCounterClockwise, + DeviceMobileCamera, +} from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" -import Button from "components/common/Button" -import { Modal } from "components/common/Modal" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useSubmit, { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import useToast from "hooks/useToast" import { QRCodeSVG } from "qrcode.react" import { useCallback, useEffect, useState } from "react" import { isMobile } from "react-device-detect" -import rewards from "rewards" +import { farcasterData } from "rewards/Farcaster/data" import { useCountdown } from "usehooks-ts" import fetcher from "utils/fetcher" -import DisconnectAccountButton from "./components/DisconnectAccountButton" -import SocialAccountUI from "./components/SocialAccountUI" +import { DisconnectAccountButton } from "./DisconnectAccountButton" +import { SocialAccountUI } from "./SocialAccount" // Polling will only start after this much time const APPROVAL_POLL_INITIAL_DELAY_MS = 15_000 @@ -53,7 +54,7 @@ const FarcasterProfile = () => { return ( @@ -188,110 +188,128 @@ const ConnectFarcasterButton = ({ captureEvent("[farcaster] connect button clicked") signedKeyRequest.onSubmit() }} - colorScheme={rewards.FARCASTER.colorScheme} - variant={"solid"} size="sm" - isDisabled={farcasterProfiles?.length > 0} + disabled={farcasterProfiles?.length > 0} isLoading={signedKeyRequest.isLoading} + className="ml-auto bg-farcaster hover:bg-farcaster-hover active:bg-farcaster-active" {...props} > Connect - - - - - - {isMobile ? ( - "Connect Farcaster" + + + + + + + + {isMobile ? ( + "Connect Farcaster" + ) : ( + <> + + Scan With your phone + + )} + + + +
    + {signedKeyRequest.isLoading ? ( + ) : ( - <> - - Scan With your phone - - )} - - - - - {!isMobile && url && ( - - - - )} - - - - {isMobile - ? "The link is active for " - : "The QR code will be regenerated in "} - {seconds > 60 - ? `${Math.floor(seconds / 60)} minutes` - : `${seconds} seconds`} - - - - } - isLoading={signedKeyRequest.isLoading} - aria-label="Regenerate Farcaster QR code" - onClick={() => { - captureEvent("[farcaster] manual qr regeneration") - onRegenerate() - }} + !isMobile && + url && ( +
    + +
    + ) + )} + +
    +

    + {isMobile + ? "The link is active for " + : "The QR code will be regenerated in "} + {seconds > 60 + ? `${Math.floor(seconds / 60)} minutes` + : `${seconds} seconds`} +

    + + + + + + + + Regenerate now + - - - - One Farcaster account can only be connected to{" "} - one Guild account at a time - - - - - - - - Why does Guild request write access? - - - - - + +
    + +

    + One Farcaster account can only be connected to{" "} + one Guild account at a time +

    + +
    + + + + + Why does Guild request write access? + + +

    Guild is a Farcaster client. You can perform Farcaster actions, like follow, or recast to satisfy requirements. You can also perform these actions in external Farcaster clients, like Warpcast, but it will take some time for Guild to grant access based on actions in external clients - - - - - - {isMobile && url && ( - -

    + + {isMobile && ( + + {/* // TODO: // colorScheme="FARCASTER" */} + Connect Farcaster - - + + )} -
    -
    + + ) } @@ -335,9 +353,10 @@ const DisconnectFarcasterButton = () => { return ( ) } diff --git a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx index 36ff25957c..c0cb6b7f48 100644 --- a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx @@ -50,7 +50,7 @@ const SocialAccount = ({ type }: { type: PlatformName }): JSX.Element => { ) } -const SocialAccountUI = ({ +export const SocialAccountUI = ({ type, avatarUrl, username, diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/utils/processEmailError.ts b/src/v2/components/Account/components/AccountModal/components/utils/processEmailError.ts similarity index 100% rename from src/components/common/Layout/components/Account/components/AccountModal/components/SocialAccount/utils/processEmailError.ts rename to src/v2/components/Account/components/AccountModal/components/utils/processEmailError.ts diff --git a/src/components/common/Layout/components/Account/components/delegate/useDelegateVaults.ts b/src/v2/components/Account/components/AccountModal/hooks/useDelegateVaults.ts similarity index 100% rename from src/components/common/Layout/components/Account/components/delegate/useDelegateVaults.ts rename to src/v2/components/Account/components/AccountModal/hooks/useDelegateVaults.ts diff --git a/src/v2/components/Providers/Providers.tsx b/src/v2/components/Providers/Providers.tsx index 427e7a3eb4..6c6d128724 100644 --- a/src/v2/components/Providers/Providers.tsx +++ b/src/v2/components/Providers/Providers.tsx @@ -4,6 +4,7 @@ import { FuelProvider } from "@fuels/react" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { fuelConfig } from "fuelConfig" import { ThemeProvider } from "next-themes" +import { Suspense } from "react" import { SWRConfig } from "swr" import { fetcherForSWR } from "utils/fetcher" import { WagmiProvider } from "wagmi" @@ -12,7 +13,6 @@ import { AccountModal } from "../Account/components/AccountModal" import { Toaster } from "../ui/Toaster" import { Web3ConnectionManager } from "../Web3ConnectionManager" import { PostHogProvider } from "./PostHogProvider" -import { Suspense } from "react" const queryClient = new QueryClient() diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index b160d04f4e..1119248739 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -179,7 +179,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { {isWeb3Connected ? ( ) : ( -
    +
    {!connector && !addressLinkParams?.userId && ( <> @@ -246,7 +246,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { linkAddress.isLoading || set.isLoading || (!id && !publicUserError) } loadingText={!id ? "Looking for keypairs" : "Check your wallet"} - className="mb-4 animate-fade-in" + className="mb-4 w-full animate-fade-in" > {isAddressLink ? "Link address" : "Verify address"}{" "} diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx index 7489c5fe7f..5279fcf575 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/AccountButton.tsx @@ -9,7 +9,12 @@ const AccountButton = () => { if (!address) return null return ( - diff --git a/src/v2/components/ui/AlertDialog.stories.tsx b/src/v2/components/ui/AlertDialog.stories.tsx index 6ad7f1be66..82c4043fef 100644 --- a/src/v2/components/ui/AlertDialog.stories.tsx +++ b/src/v2/components/ui/AlertDialog.stories.tsx @@ -1,4 +1,4 @@ -import { Meta, StoryObj } from "@storybook/react" +import type { Meta, StoryObj } from "@storybook/react" import { AlertDialog, AlertDialogAction, diff --git a/src/v2/components/ui/Skeleton.tsx b/src/v2/components/ui/Skeleton.tsx new file mode 100644 index 0000000000..15abbb8beb --- /dev/null +++ b/src/v2/components/ui/Skeleton.tsx @@ -0,0 +1,9 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ className, ...props }: React.HTMLAttributes) { + return ( +
    + ) +} + +export { Skeleton } diff --git a/src/v2/components/ui/hooks/useToast.ts b/src/v2/components/ui/hooks/useToast.ts index 5db85e4d59..7d2fa818d3 100644 --- a/src/v2/components/ui/hooks/useToast.ts +++ b/src/v2/components/ui/hooks/useToast.ts @@ -140,10 +140,10 @@ type Toast = Omit function toast({ ...props }: Toast) { const id = genId() - const update = (props: ToasterToast) => + const update = (updateProps: ToasterToast) => dispatch({ type: "UPDATE_TOAST", - toast: { ...props, id }, + toast: { ...updateProps, id }, }) const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) diff --git a/tailwind.config.ts b/tailwind.config.ts index 901330cde3..84b81f70ce 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -100,6 +100,8 @@ const config = { }, farcaster: { DEFAULT: "hsl(var(--farcaster))", + hover: "hsl(var(--farcaster-hover))", + active: "hsl(var(--farcaster-active))", }, polygonid: { DEFAULT: "hsl(var(--polygonid))", From 0a796a3f1df63b292ead9a1ebd27acff30c2b7ba Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Fri, 5 Jul 2024 09:23:17 +0200 Subject: [PATCH 033/110] fix ring color in light mode --- src/app/globals.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index 70ebd4b42f..3a97a1371f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -49,7 +49,7 @@ --border: 240 6% 90%; --border-secondary: 240 6% 94%; --input: var(--border); - --ring: 224 71.4% 4.1%; + --ring: 240, 0%, 45%, 25%; --toast-success: 137 64% 98%; --toast-error: 0 78% 98%; From 5051463152fd30dc3d26891759e16de72b33f487 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Fri, 5 Jul 2024 09:25:30 +0200 Subject: [PATCH 034/110] fix: remove ring offset --- src/v2/components/ui/Button.tsx | 2 +- src/v2/components/ui/Dialog.tsx | 2 +- src/v2/components/ui/Toast.tsx | 2 +- src/v2/components/ui/Toggle.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index 8003999f0d..92c2c0994b 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -7,7 +7,7 @@ import { CircleNotch } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" const buttonVariants = cva( - "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm ring-offset-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:!opacity-50 rounded-xl text-base", + "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:!opacity-50 rounded-xl text-base", { variants: { variant: { diff --git a/src/v2/components/ui/Dialog.tsx b/src/v2/components/ui/Dialog.tsx index d148915034..79af5da926 100644 --- a/src/v2/components/ui/Dialog.tsx +++ b/src/v2/components/ui/Dialog.tsx @@ -82,7 +82,7 @@ const DialogCloseButton = React.forwardRef< Date: Fri, 5 Jul 2024 09:26:55 +0200 Subject: [PATCH 035/110] fix: connect Farcaster button colors --- .../components/AccountModal/components/FarcasterProfile.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx index a0b7d5d28d..ade082c41d 100644 --- a/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx +++ b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx @@ -298,11 +298,13 @@ const ConnectFarcasterButton = ({ {isMobile && ( - {/* // TODO: // colorScheme="FARCASTER" */} Connect Farcaster From 0fae2e1105d3c4af79cb6460dc095b46de1e4d05 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Fri, 5 Jul 2024 10:05:43 +0200 Subject: [PATCH 036/110] feat: define css vars for every platform type --- src/app/globals.css | 32 ++++++++++++++++++++++++-- src/v2/components/ui/Button.stories.ts | 4 ++-- src/v2/components/ui/Button.tsx | 4 ++-- tailwind.config.ts | 26 ++++++++++++++++++--- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 3a97a1371f..80b79bea6e 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -56,15 +56,31 @@ --toast-warning: 40 79% 96%; --toast-info: 218 80% 98%; - /* TODO: hover/active colors */ --discord: 233 78% 63%; + --discord-hover: 243 75% 59%; + --discord-active: 245 58% 51%; --telegram: 200 73% 50%; + --telegram-hover: 200 98% 39%; + --telegram-active: 201 96% 32%; + --email: 217 91% 60%; + --email-hover: 221 83% 53%; + --email-active: 224 76% 48%; + --google: 217 91% 60%; + --google-hover: 221 83% 53%; + --google-active: 224 76% 48%; + /* TODO: proper hover/active colors for Twitter */ --twitter: 0 0% 0%; + --twitter-hover: 0 0% 0%; + --twitter-active: 0 0% 0%; --github: 0 0% 20%; + --github-hover: 0 0% 18%; + --github-active: 0 0% 15%; + --polygonid: 259 59% 59%; + --polygonid-hover: 258 50% 52%; + --polygonid-active: 256 44% 42%; --farcaster: 238 76% 69%; --farcaster-hover: 239 75% 64%; --farcaster-active: 239 75% 58%; - --polygonid: 259 59% 59%; --sm: 640px; --md: 768px; @@ -125,6 +141,18 @@ --toast-warning: 30 6% 34%; --toast-info: 226 7% 36%; + --discord-hover: 234 89% 74%; + --discord-active: 230 94% 82%; + --telegram-hover: 198 93% 60%; + --telegram-active: 199 95% 74%; + --email-hover: 213 94% 68%; + --email-active: 212 96% 78%; + --google-hover: 213 94% 68%; + --google-active: 212 96% 78%; + --github-hover: 0 0% 44%; + --github-active: 0 0% 68%; + --polygonid-hover: 260 73% 70%; + --polygonid-active: 262 81% 77%; --farcaster-hover: 239 75% 75%; --farcaster-active: 238 76% 81%; } diff --git a/src/v2/components/ui/Button.stories.ts b/src/v2/components/ui/Button.stories.ts index 78908b743e..7d59adfffe 100644 --- a/src/v2/components/ui/Button.stories.ts +++ b/src/v2/components/ui/Button.stories.ts @@ -14,7 +14,7 @@ type Story = StoryObj export const Primary: Story = { args: { children: "Primary", - size: "default", + size: "md", disabled: false, variant: "default", }, @@ -22,7 +22,7 @@ export const Primary: Story = { size: { type: "string", control: "radio", - options: ["xs", "sm", "default", "lg", "xl"] satisfies ButtonProps["size"][], + options: ["xs", "sm", "md", "lg", "xl"] satisfies ButtonProps["size"][], }, disabled: { type: "boolean", diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index 92c2c0994b..a8e2ac4aa4 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -30,7 +30,7 @@ const buttonVariants = cva( size: { xs: "h-6 px-2 text-xs", sm: "h-8 px-3 text-sm", - default: "h-11 px-4 py-2", + md: "h-11 px-4 py-2", lg: "h-12 px-6 py-4 text-lg", xl: "h-14 px-6 py-4 text-lg", icon: "h-10 w-10", @@ -38,7 +38,7 @@ const buttonVariants = cva( }, defaultVariants: { variant: "default", - size: "default", + size: "md", }, } ) diff --git a/tailwind.config.ts b/tailwind.config.ts index 84b81f70ce..bbc3d7ad64 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -88,24 +88,44 @@ const config = { // Platforms discord: { DEFAULT: "hsl(var(--discord))", + hover: "hsl(var(--discord-hover))", + active: "hsl(var(--discord-active))", }, telegram: { DEFAULT: "hsl(var(--telegram))", + hover: "hsl(var(--telegram-hover))", + active: "hsl(var(--telegram-active))", + }, + email: { + DEFAULT: "hsl(var(--email))", + hover: "hsl(var(--email-hover))", + active: "hsl(var(--email-active))", + }, + google: { + DEFAULT: "hsl(var(--google))", + hover: "hsl(var(--google-hover))", + active: "hsl(var(--google-active))", }, twitter: { DEFAULT: "hsl(var(--twitter))", + hover: "hsl(var(--twitter-hover))", + active: "hsl(var(--twitter-active))", }, github: { DEFAULT: "hsl(var(--github))", + hover: "hsl(var(--github-hover))", + active: "hsl(var(--github-active))", + }, + polygonid: { + DEFAULT: "hsl(var(--polygonid))", + hover: "hsl(var(--polygonid-hover))", + active: "hsl(var(--polygonid-active))", }, farcaster: { DEFAULT: "hsl(var(--farcaster))", hover: "hsl(var(--farcaster-hover))", active: "hsl(var(--farcaster-active))", }, - polygonid: { - DEFAULT: "hsl(var(--polygonid))", - }, }, keyframes: { "accordion-down": { From dc996fbd7aead6f826f2957ec3d17c03779604aa Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Fri, 5 Jul 2024 10:07:06 +0200 Subject: [PATCH 037/110] fix(SocialAccount): use the correct button colors --- .../AccountModal/components/SocialAccount.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx index c0cb6b7f48..67280c4b25 100644 --- a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx @@ -106,15 +106,15 @@ export const SocialAccountUI = ({ // TODO: we should move these to `rewards.ts` eventually const PLATFORM_COLORS = { - DISCORD: "bg-discord", - TELEGRAM: "bg-telegram", - EMAIL: "bg-blue-500", - GOOGLE: "bg-blue-500", - TWITTER_V1: "bg-twitter", - TWITTER: "bg-twitter", - GITHUB: "bg-github", - POLYGON_ID: "bg-polygonid", - FARCASTER: "bg-farcaster", + DISCORD: "bg-discord hover:bg-discord-hover active:bg-discord-active", + TELEGRAM: "bg-telegram hover:bg-telegram-hover active:bg-telegram-active", + EMAIL: "bg-email hover:bg-email-hover active:bg-email-active", + GOOGLE: "bg-google hover:bg-google-hover active:bg-google-active", + TWITTER_V1: "bg-twitter hover:bg-twitter-hover active:bg-twitter-active", + TWITTER: "bg-twitter hover:bg-twitter-hover active:bg-twitter-active", + GITHUB: "bg-github hover:bg-github-hover active:bg-github-active", + POLYGON_ID: "bg-polygonid hover:bg-polygonid-hover active:bg-polygonid-active", + FARCASTER: "bg-farcaster hover:bg-farcaster-hover active:bg-farcaster-active", } satisfies Partial> const ConnectPlatformButton = ({ From d2a0d5cbdd5f83b31044721016c970d1f2e34a45 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Sat, 6 Jul 2024 14:26:42 +0200 Subject: [PATCH 038/110] feat: `Collapse` component --- src/v2/components/ui/Collapse.stories.tsx | 42 +++++++++++++++++++++++ src/v2/components/ui/Collapse.tsx | 23 +++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/v2/components/ui/Collapse.stories.tsx create mode 100644 src/v2/components/ui/Collapse.tsx diff --git a/src/v2/components/ui/Collapse.stories.tsx b/src/v2/components/ui/Collapse.stories.tsx new file mode 100644 index 0000000000..5d658e0daf --- /dev/null +++ b/src/v2/components/ui/Collapse.stories.tsx @@ -0,0 +1,42 @@ +import { useDisclosure } from "@/hooks/useDisclosure" +import type { Meta, StoryObj } from "@storybook/react" +import { Button } from "./Button" +import { Collapse, CollapseProps } from "./Collapse" + +const CollapseExample = ({ + animateOpacity, +}: Pick) => { + const { isOpen, onToggle } = useDisclosure() + + return ( +
    + + + +
    Collapse content
    +
    +
    + ) +} + +const meta: Meta = { + title: "Design system/Collapse", + component: CollapseExample, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + animateOpacity: false, + }, +} diff --git a/src/v2/components/ui/Collapse.tsx b/src/v2/components/ui/Collapse.tsx new file mode 100644 index 0000000000..64987623c2 --- /dev/null +++ b/src/v2/components/ui/Collapse.tsx @@ -0,0 +1,23 @@ +import { cn } from "@/lib/utils" +import { forwardRef, HTMLAttributes } from "react" + +export interface CollapseProps extends HTMLAttributes { + open?: boolean + animateOpacity?: boolean +} + +export const Collapse = forwardRef( + ({ className, open, animateOpacity, children, ...props }, ref) => ( +
    +
    {children}
    +
    + ) +) From c377246f1729d4db61b04094c150344e6dfeef8f Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Sat, 6 Jul 2024 15:03:24 +0200 Subject: [PATCH 039/110] feat(Form): don't re-export `FormProvider` as `Form` --- src/app/playground/_components/FormExample.tsx | 7 +++---- src/v2/components/ui/Form.tsx | 4 ---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/app/playground/_components/FormExample.tsx b/src/app/playground/_components/FormExample.tsx index 720359a7f4..fa85f121ad 100644 --- a/src/app/playground/_components/FormExample.tsx +++ b/src/app/playground/_components/FormExample.tsx @@ -1,7 +1,6 @@ "use client" import { Button } from "@/components/ui/Button" import { - Form, FormControl, FormDescription, FormErrorMessage, @@ -11,7 +10,7 @@ import { } from "@/components/ui/Form" import { Input } from "@/components/ui/Input" import { zodResolver } from "@hookform/resolvers/zod" -import { useForm } from "react-hook-form" +import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" const formSchema = z.object({ @@ -35,7 +34,7 @@ export function FormExample() { } return ( -
    + - +
    ) } diff --git a/src/v2/components/ui/Form.tsx b/src/v2/components/ui/Form.tsx index b0e6936f68..a6e996f442 100644 --- a/src/v2/components/ui/Form.tsx +++ b/src/v2/components/ui/Form.tsx @@ -5,7 +5,6 @@ import { ControllerProps, FieldPath, FieldValues, - FormProvider, useFormContext, } from "react-hook-form" @@ -21,8 +20,6 @@ import { useId, } from "react" -const Form = FormProvider - type FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, @@ -165,7 +162,6 @@ const FormErrorMessage = forwardRef< FormErrorMessage.displayName = "FormErrorMessage" export { - Form, FormControl, FormDescription, FormErrorMessage, From c56795075dbf21c7f2ff15b9cb6b2d612999ade7 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 07:08:58 +0200 Subject: [PATCH 040/110] chore: remove old `Header` & `NavMenu` --- src/components/common/Layout/Layout.tsx | 2 +- .../common/Layout/components/Header.tsx | 44 ----- .../Layout/components/NavMenu/NavMenu.tsx | 184 ------------------ .../NavMenu/components/NavButton.tsx | 35 ---- .../NavMenu/components/NavGroup.tsx | 25 --- .../NavMenu/components/ThemeOption.tsx | 39 ---- .../NavMenu/components/ThemeSwitcher.tsx | 78 -------- .../common/Layout/components/NavMenu/index.ts | 3 - src/components/common/Layout/index.tsx | 2 +- src/pages/index.tsx | 2 +- 10 files changed, 3 insertions(+), 411 deletions(-) delete mode 100644 src/components/common/Layout/components/Header.tsx delete mode 100644 src/components/common/Layout/components/NavMenu/NavMenu.tsx delete mode 100644 src/components/common/Layout/components/NavMenu/components/NavButton.tsx delete mode 100644 src/components/common/Layout/components/NavMenu/components/NavGroup.tsx delete mode 100644 src/components/common/Layout/components/NavMenu/components/ThemeOption.tsx delete mode 100644 src/components/common/Layout/components/NavMenu/components/ThemeSwitcher.tsx delete mode 100644 src/components/common/Layout/components/NavMenu/index.ts diff --git a/src/components/common/Layout/Layout.tsx b/src/components/common/Layout/Layout.tsx index 619ca258d0..efcfe80add 100644 --- a/src/components/common/Layout/Layout.tsx +++ b/src/components/common/Layout/Layout.tsx @@ -1,3 +1,4 @@ +import { Header } from "@/components/Header" import { Box, BoxProps, @@ -13,7 +14,6 @@ import Head from "next/head" import Image from "next/image" import { PropsWithChildren, ReactNode, useRef, useState } from "react" import Footer from "./components/Footer" -import Header from "./components/Header" type Props = { image?: JSX.Element diff --git a/src/components/common/Layout/components/Header.tsx b/src/components/common/Layout/components/Header.tsx deleted file mode 100644 index b8bc8554c6..0000000000 --- a/src/components/common/Layout/components/Header.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { Box, Flex, useColorMode } from "@chakra-ui/react" -import { useThemeContext } from "components/[guild]/ThemeContext" -import ClientOnly from "components/common/ClientOnly" -import NavMenu from "../components/NavMenu" -import Account from "./Account" - -const Header = (): JSX.Element => { - const colorContext = useThemeContext() - const { colorMode } = useColorMode() - - return ( - - - - - - - - - - ) -} - -export default Header diff --git a/src/components/common/Layout/components/NavMenu/NavMenu.tsx b/src/components/common/Layout/components/NavMenu/NavMenu.tsx deleted file mode 100644 index c6c955f1c7..0000000000 --- a/src/components/common/Layout/components/NavMenu/NavMenu.tsx +++ /dev/null @@ -1,184 +0,0 @@ -import { - Grid, - HStack, - Icon, - Img, - Popover, - PopoverBody, - PopoverContent, - PopoverFooter, - PopoverTrigger, - Text, - useColorModeValue, -} from "@chakra-ui/react" -import { - Book, - CircleWavyCheck, - Code, - DiscordLogo, - File, - House, - Info, - List, - Package, - Palette, - Plus, - Shield, - UsersThree, -} from "@phosphor-icons/react" -import Button from "components/common/Button" -import { useSetAtom } from "jotai" -import dynamic from "next/dynamic" -import { useRouter } from "next/router" -import { explorerScrollRestorationAtom } from "pages/explorer" -import XLogo from "static/icons/x.svg" -import NavButton from "./components/NavButton" -import NavGroup from "./components/NavGroup" -import ThemeSwitcher from "./components/ThemeSwitcher" - -const AnimatedLogo = dynamic(() => import("components/explorer/AnimatedLogo"), { - ssr: false, - loading: () => , -}) - -const NavMenu = (): JSX.Element => { - const darkBgColor = useColorModeValue("gray.50", "blackAlpha.300") - const setExplorerScrollRestoration = useSetAtom(explorerScrollRestorationAtom) - const router = useRouter() - - return ( - - - - - - - - - } - href="/explorer" - onClick={(e) => { - e.preventDefault() - setExplorerScrollRestoration(false) - router.push("/explorer") - }} - > - Explore guilds - - } href="/create-guild"> - Create guild - - } href="/leaderboard"> - Guild Pins leaderboard - - } - > - Guide - - } - > - Case studies - - } href="/privacy-policy"> - Privacy Policy - - } href="/terms-of-use"> - Terms of Use - - - - } - > - Discord - - } - > - Twitter - - } - > - Code - - } - > - Guild SDK - - } - > - Team - - } - > - Brand kit - - - - - - - Theme: - - - - - - ) -} - -export default NavMenu diff --git a/src/components/common/Layout/components/NavMenu/components/NavButton.tsx b/src/components/common/Layout/components/NavMenu/components/NavButton.tsx deleted file mode 100644 index 6d06c6838d..0000000000 --- a/src/components/common/Layout/components/NavMenu/components/NavButton.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { ButtonProps } from "@chakra-ui/react" -import Button from "components/common/Button" -import NextLink from "next/link" -import { useRouter } from "next/router" -import { forwardRef, PropsWithChildren, Ref } from "react" -import { Rest } from "types" - -const NavButton = forwardRef( - ( - { href, children, ...rest }: PropsWithChildren, - ref: Ref - ) => { - const router = useRouter() - - return ( - - ) - } -) - -export default NavButton diff --git a/src/components/common/Layout/components/NavMenu/components/NavGroup.tsx b/src/components/common/Layout/components/NavMenu/components/NavGroup.tsx deleted file mode 100644 index 86b6e1f23e..0000000000 --- a/src/components/common/Layout/components/NavMenu/components/NavGroup.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Text, VStack } from "@chakra-ui/react" -import { PropsWithChildren } from "react" - -type Props = { - title: string -} - -const NavGroup = ({ title, children }: PropsWithChildren) => ( - - - {title} - - {children} - -) - -export default NavGroup diff --git a/src/components/common/Layout/components/NavMenu/components/ThemeOption.tsx b/src/components/common/Layout/components/NavMenu/components/ThemeOption.tsx deleted file mode 100644 index 13a4c18d7e..0000000000 --- a/src/components/common/Layout/components/NavMenu/components/ThemeOption.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Icon, useColorMode, useRadio } from "@chakra-ui/react" -import Button from "components/common/Button" -import { useRouter } from "next/router" - -const DISABLED_ROUTES = ["/"] - -const LogicOption = (props) => { - const { getInputProps, getCheckboxProps } = useRadio(props) - const router = useRouter() - - const input = getInputProps() - const checkbox = getCheckboxProps() - - const { label, icon, isChecked } = props - - const { colorMode } = useColorMode() - - return ( - - ) -} - -export default LogicOption diff --git a/src/components/common/Layout/components/NavMenu/components/ThemeSwitcher.tsx b/src/components/common/Layout/components/NavMenu/components/ThemeSwitcher.tsx deleted file mode 100644 index 74ff06872b..0000000000 --- a/src/components/common/Layout/components/NavMenu/components/ThemeSwitcher.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { - ColorModeWithSystem, - SimpleGrid, - useColorMode, - useRadioGroup, -} from "@chakra-ui/react" -import { Moon, Sun } from "@phosphor-icons/react" -import useLocalStorage from "hooks/useLocalStorage" -import dynamic from "next/dynamic" -import { useEffect } from "react" - -/** - * Have to import dynamically only on client, otherwise there's a mismatch in - * classNames and the states are glitching - */ -const ThemeOption = dynamic(() => import("./ThemeOption"), { - ssr: false, -}) - -const options = [ - { - label: , - value: "light", - }, - { - label: , - value: "dark", - }, - { - label: "auto", - value: "system", - }, -] - -const ThemeSwitcher = () => { - const { setColorMode } = useColorMode() - const [local, setLocal] = useLocalStorage("chakra-ui-color-mode", undefined) - - /** - * Chakra doesn't support a true automatic mode right now. If there's no - * localStorage value, it sets the correct one (because of `initialColorMode: - * "system"` in theme config), but also writes it to localStorage, so it's not - * automatic anymore. As a workaround, we're removing the automatically set value - * on mount in that case with this setTimeout, so it stays automatic. It's really - * hacky and there're edge cases, but that's the best we can do right now. - * - * Also it doesn't update if the system color mode changes while the page is open: - * it would if we'd set useSystemColorMode to true in the theme config, but it'd - * also if the user has choosen a mode manually, so it's better to keep that false - */ - useEffect(() => { - if (local === undefined) - setTimeout(() => { - window.localStorage.removeItem("chakra-ui-color-mode") - }, 3000) - }, [local]) - - const { getRootProps, getRadioProps } = useRadioGroup({ - onChange: (newValue: ColorModeWithSystem) => { - setColorMode(newValue) - setLocal(newValue === "system" ? undefined : newValue) - }, - value: local ?? "system", - }) - - const group = getRootProps() - - return ( - - {options.map((option) => { - const radio = getRadioProps({ value: option.value }) - return - })} - - ) -} - -export default ThemeSwitcher diff --git a/src/components/common/Layout/components/NavMenu/index.ts b/src/components/common/Layout/components/NavMenu/index.ts deleted file mode 100644 index 8665e0106c..0000000000 --- a/src/components/common/Layout/components/NavMenu/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import NavMenu from "./NavMenu" - -export default NavMenu diff --git a/src/components/common/Layout/index.tsx b/src/components/common/Layout/index.tsx index 850ff0effb..5317466985 100644 --- a/src/components/common/Layout/index.tsx +++ b/src/components/common/Layout/index.tsx @@ -1,8 +1,8 @@ +import { Header } from "@/components/Header" import BackButton from "./components/BackButton" import Background from "./components/Background" import Footer from "./components/Footer" import Head from "./components/Head" -import Header from "./components/Header" import HeaderSection from "./components/HeaderSection" import Headline from "./components/Headline" import MainSection from "./components/MainSection" diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 8f5349bd7b..0145f59325 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,5 +1,5 @@ +import { NavMenu } from "@/components/Header/NavMenu" import { Box, DarkMode } from "@chakra-ui/react" -import NavMenu from "components/common/Layout/components/NavMenu" import LinkPreviewHead from "components/common/LinkPreviewHead" import CallToAction from "components/index/CallToAction" import ComposableRequirements from "components/index/ComposableRequirements" From 474cfba1e61e8db67b32e77642ba9dfd7f8822d8 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 07:14:27 +0200 Subject: [PATCH 041/110] fix: Button & Input classNames --- src/v2/components/ui/Button.tsx | 4 ++-- src/v2/components/ui/Input.tsx | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index 8bfe217f32..fde190a1f2 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -7,7 +7,7 @@ import { CircleNotch } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" const buttonVariants = cva( - "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:!opacity-50 rounded-xl text-base", + "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:!opacity-50 rounded-xl text-base", { variants: { variant: { @@ -70,7 +70,7 @@ const Button = React.forwardRef( return ( ( ({ className, type, size, ...props }, ref) => ( From 50ec88733ec916a787103374288e35a099a4fc1a Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 07:38:33 +0200 Subject: [PATCH 042/110] feat(FormErrorMessage): add collapse animation --- src/v2/components/ui/Form.tsx | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/v2/components/ui/Form.tsx b/src/v2/components/ui/Form.tsx index a6e996f442..9f096a8861 100644 --- a/src/v2/components/ui/Form.tsx +++ b/src/v2/components/ui/Form.tsx @@ -19,6 +19,8 @@ import { useContext, useId, } from "react" +import { useDebounceValue } from "usehooks-ts" +import { Collapse } from "./Collapse" type FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, @@ -139,24 +141,23 @@ const FormErrorMessage = forwardRef< >(({ className, children, ...props }, ref) => { const { error, formMessageId } = useFormField() const body = error ? String(error?.message) : children - - if (!body) { - return null - } + const [debounceBody] = useDebounceValue(body, 200) return ( -

    - {body} -

    + +

    + {body ?? debounceBody} +

    +
    ) }) FormErrorMessage.displayName = "FormErrorMessage" From 72c6984cbc14fbf69d73985adf641858b30e6fe6 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 08:31:55 +0200 Subject: [PATCH 043/110] feat: migrate the `EmailAddress` component --- package-lock.json | 130 ++++++++ package.json | 3 +- .../components/AccountConnections.tsx | 6 +- .../AccountModal/components/EmailAddress.tsx | 314 ++++++++++-------- .../AccountModal/components/SocialAccount.tsx | 4 +- src/v2/components/ui/Collapse.tsx | 4 +- src/v2/components/ui/InputOTP.tsx | 69 ++++ tailwind.config.ts | 5 + 8 files changed, 386 insertions(+), 149 deletions(-) create mode 100644 src/v2/components/ui/InputOTP.tsx diff --git a/package-lock.json b/package-lock.json index f912c20e10..b644049f3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,6 +65,7 @@ "framer-motion": "^7.10.3", "fuels": "^0.89.1", "idb-keyval": "^6.2.0", + "input-otp": "^1.2.4", "jotai": "^2.7.0", "js-confetti": "^0.11.0", "lexical": "^0.12.0", @@ -6862,6 +6863,126 @@ "node": ">= 10" } }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@noble/curves": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", @@ -23529,6 +23650,15 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, + "node_modules/input-otp": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.2.4.tgz", + "integrity": "sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", diff --git a/package.json b/package.json index aff5075527..4d0a1bcb5e 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,11 @@ "@nouns/assets": "^0.4.2", "@phosphor-icons/react": "^2.1.7", "@radix-ui/react-accordion": "^1.2.0", - "@radix-ui/react-popover": "^1.1.1", "@radix-ui/react-alert-dialog": "^1.1.1", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-focus-scope": "^1.1.0", "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.1", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-toggle": "^1.1.0", @@ -78,6 +78,7 @@ "framer-motion": "^7.10.3", "fuels": "^0.89.1", "idb-keyval": "^6.2.0", + "input-otp": "^1.2.4", "jotai": "^2.7.0", "js-confetti": "^0.11.0", "lexical": "^0.12.0", diff --git a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx index 32649d1971..13df84c365 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx @@ -4,6 +4,7 @@ import rewards from "rewards" import { PlatformName } from "types" import useDelegateVaults from "../hooks/useDelegateVaults" import { AccountSection, AccountSectionTitle } from "./AccountSection" +import EmailAddress from "./EmailAddress" import FarcasterProfile from "./FarcasterProfile" import { SocialAccount } from "./SocialAccount" @@ -31,9 +32,8 @@ const AccountConnections = () => { {orderedSocials.map((platform, i) => ( <> {platform === "EMAIL" ? ( - <> - ) : // - platform === "FARCASTER" ? ( + + ) : platform === "FARCASTER" ? ( ) : ( diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index ce6eb7dd49..07a1250bc9 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -1,40 +1,57 @@ +import useUser from "components/[guild]/hooks/useUser" +import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" +// import { Error } from "components/common/Error" +import { Button, ButtonProps } from "@/components/ui/Button" +import { Collapse } from "@/components/ui/Collapse" +import { + Dialog, + DialogCloseButton, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/Dialog" import { - ButtonProps, - Collapse, FormControl, + FormErrorMessage, + FormField, + FormItem, FormLabel, - HStack, - IconButton, - Input, - ModalBody, - ModalCloseButton, - ModalContent, - ModalFooter, - ModalHeader, - ModalOverlay, - PinInput, - PinInputField, - Text, +} from "@/components/ui/Form" +import { Input } from "@/components/ui/Input" +import { InputOTP, InputOTPGroup, InputOTPSlot } from "@/components/ui/InputOTP" +import { Tooltip, - useDisclosure, - VStack, -} from "@chakra-ui/react" -import { PencilSimple } from "@phosphor-icons/react" -import useUser from "components/[guild]/hooks/useUser" -import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" -import Button from "components/common/Button" -import { Error } from "components/common/Error" + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { useDisclosure } from "@/hooks/useDisclosure" +import { cn } from "@/lib/utils" +import { zodResolver } from "@hookform/resolvers/zod" +import { PencilSimple } from "@phosphor-icons/react/dist/ssr" import { useDisconnectEmail } from "components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect" -import { Modal } from "components/common/Modal" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import useToast from "hooks/useToast" -import { useEffect, useRef, useState } from "react" -import { useController, useForm, useWatch } from "react-hook-form" -import rewards from "rewards" +import { useEffect, useState } from "react" +import { FormProvider, useForm, useWatch } from "react-hook-form" +import { emailData } from "rewards/Email/data" import fetcher from "utils/fetcher" +import { z } from "zod" import { DisconnectAccountButton } from "./DisconnectAccountButton" import { SocialAccountUI } from "./SocialAccount" -import processEmailError from "./utils/processEmailError" + +const PIN_LENGTH = 6 +const TIMEOUT = 10_000 +const emailFormSchema = z.object({ + email: z.string().email("Invalid E-mail address"), + code: z + .string() + .refine((value) => (!!value ? value.length === PIN_LENGTH : true), { + message: "Invalid code", + }) + .optional(), +}) const TOO_MANY_ATTEMPTS_ERROR = "The code has been invalidated due to too many attempts" @@ -54,12 +71,10 @@ const EmailAddress = () => { ) } -const PIN_LENGTH = 6 -const TIMEOUT = 10_000 - const ConnectEmailButton = ({ onSuccess, isReconnection: _, + className, ...props }: ButtonProps & { onSuccess?: () => void; isReconnection?: boolean }) => { const { emails } = useUser() @@ -68,13 +83,12 @@ const ConnectEmailButton = ({ emails?.pending ? emails?.emailAddress : null ) - const { register, handleSubmit, control, setValue, reset } = useForm<{ - email: string - code: string - }>({ + const methods = useForm>({ + resolver: zodResolver(emailFormSchema), defaultValues: { email: "", code: "" }, }) - const { field } = useController({ control, name: "code" }) + + const { handleSubmit, control, setValue, setError, reset } = methods const email = useWatch({ control, name: "email" }) const { id: userId } = useUser() const toast = useToast() @@ -107,8 +121,6 @@ const ConnectEmailButton = ({ verificationRequest.onSubmit({ emailAddress: formValues.email }) ) - const pinInputRef = useRef() - const differentEmail = () => { setPendingEmailAddress(null) setValue("code", "") @@ -131,8 +143,11 @@ const ConnectEmailButton = ({ differentEmail() return } + setError("code", { + type: "validate", + message: "Invalid code", + }) setValue("code", "") - pinInputRef.current?.focus() }, }) @@ -154,122 +169,138 @@ const ConnectEmailButton = ({ return ( <> - - - - -
    - Connect email - - - + + + + Connect email + + + + {/* TODO: Error component */} + {/* */} + + + ( + + Email address + + + + + + )} /> + - - - Email address - - - - - - - Enter the code we've sent to {email}{" "} - } - aria-label="Use different email address" - onClick={differentEmail} - /> - - - { - field.onChange(value) - if (value.length === PIN_LENGTH) { - connect.onSubmit({ - authData: { code: value }, - emailAddress: email, - }) - } - }} - > - - - - - - - - - - - - - {shouldShowPinEntry ? ( - + +
    +

    + {`Enter the code we've sent to ${email} `} - +

    + + ( + + + { + onChange(value) + if (value.length === PIN_LENGTH) { + connect.onSubmit({ + authData: { code: value }, + emailAddress: email, + }) + } + }} + autoFocus + > + + {[...Array(PIN_LENGTH)].map((_, i) => ( + + ))} + + + + + + )} + /> +
    +
    + + + {shouldShowPinEntry ? ( + + + + + + +

    + Check if you received the first code before requesting a new + one (check in the spam as well) +

    +
    +
    +
    ) : ( )} -
    - -
    -
    +
    + + + + + ) } @@ -286,7 +317,8 @@ const DisconnectEmailButton = () => { return ( ) diff --git a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx index 67280c4b25..2894767369 100644 --- a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx @@ -70,7 +70,7 @@ export const SocialAccountUI = ({
    @@ -95,7 +95,7 @@ export const SocialAccountUI = ({ )}
    - + {username ?? `${platformName} ${isConnected ? "connected" : ""}`} diff --git a/src/v2/components/ui/Collapse.tsx b/src/v2/components/ui/Collapse.tsx index 64987623c2..04569652f6 100644 --- a/src/v2/components/ui/Collapse.tsx +++ b/src/v2/components/ui/Collapse.tsx @@ -10,14 +10,14 @@ export const Collapse = forwardRef( ({ className, open, animateOpacity, children, ...props }, ref) => (
    -
    {children}
    +
    {children}
    ) ) diff --git a/src/v2/components/ui/InputOTP.tsx b/src/v2/components/ui/InputOTP.tsx new file mode 100644 index 0000000000..d922cf1bf0 --- /dev/null +++ b/src/v2/components/ui/InputOTP.tsx @@ -0,0 +1,69 @@ +"use client" + +import { cn } from "@/lib/utils" +import { Minus } from "@phosphor-icons/react/dist/ssr" +import { OTPInput, OTPInputContext } from "input-otp" +import { ComponentPropsWithoutRef, ElementRef, forwardRef, useContext } from "react" + +const InputOTP = forwardRef< + ElementRef, + ComponentPropsWithoutRef +>(({ className, containerClassName, ...props }, ref) => ( + +)) +InputOTP.displayName = "InputOTP" + +const InputOTPGroup = forwardRef, ComponentPropsWithoutRef<"div">>( + ({ className, ...props }, ref) => ( +
    + ) +) +InputOTPGroup.displayName = "InputOTPGroup" + +const InputOTPSlot = forwardRef< + ElementRef<"div">, + ComponentPropsWithoutRef<"div"> & { index: number } +>(({ index, className, ...props }, ref) => { + const inputOTPContext = useContext(OTPInputContext) + const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index] + + return ( +
    + {char} + {hasFakeCaret && ( +
    +
    +
    + )} +
    + ) +}) +InputOTPSlot.displayName = "InputOTPSlot" + +const InputOTPSeparator = forwardRef< + ElementRef<"div">, + ComponentPropsWithoutRef<"div"> +>(({ ...props }, ref) => ( +
    + +
    +)) +InputOTPSeparator.displayName = "InputOTPSeparator" + +export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } diff --git a/tailwind.config.ts b/tailwind.config.ts index bbc3d7ad64..193c93aa0a 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -136,6 +136,10 @@ const config = { from: { height: "var(--radix-accordion-content-height)" }, to: { height: "0" }, }, + "caret-blink": { + "0%,70%,100%": { opacity: "1" }, + "20%,50%": { opacity: "0" }, + }, // Copied from our old styles.ts "fade-in": { from: { opacity: "0" }, to: { opacity: "1" } }, "slide-fade-in": { @@ -146,6 +150,7 @@ const config = { animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", + "caret-blink": "caret-blink 1.25s ease-out infinite", // Copied from where we used these animations "fade-in": "fade-in .3s .1s both", "slide-fade-in": "fade-in .2s", From fa071d98d50e01c82a84a36a72de038e655092bf Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 09:30:06 +0200 Subject: [PATCH 044/110] chore: migrate `useDisconnect` --- .../AccountModal/components/LinkedAddress.tsx | 2 +- .../AccountModal/components/SocialAccount.tsx | 2 +- .../components/AccountModal/hooks/useDisconnect.ts | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) rename src/{components/common/Layout => v2}/components/Account/components/AccountModal/hooks/useDisconnect.ts (93%) diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx index 6bcdd3049c..16213fc2bb 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx +++ b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx @@ -1,3 +1,4 @@ +import { useDisconnectAddress } from "@/components/Account/components/AccountModal/hooks/useDisconnect" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { AlertDialogBody, @@ -31,7 +32,6 @@ import Image from "next/image" import { useRef } from "react" import { User } from "types" import shortenHex from "utils/shortenHex" -import { useDisconnectAddress } from "../hooks/useDisconnect" import useEditPrimaryAddress from "../hooks/useEditPrimaryAddress" import AddressTypeTag from "./AddressTypeTag" import PrimaryAddressTag from "./PrimaryAddressTag" diff --git a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx index 2894767369..378be0e816 100644 --- a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx @@ -5,12 +5,12 @@ import { cn } from "@/lib/utils" import useUser from "components/[guild]/hooks/useUser" import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" -import useDisconnect from "components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect" import useMembership from "components/explorer/hooks/useMembership" import { motion } from "framer-motion" import { ReactNode } from "react" import rewards from "rewards" import { PlatformName } from "types" +import useDisconnect from "../hooks/useDisconnect" import { DisconnectAccountButton } from "./DisconnectAccountButton" const SocialAccount = ({ type }: { type: PlatformName }): JSX.Element => { diff --git a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect.ts b/src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts similarity index 93% rename from src/components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect.ts rename to src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts index d41b4df903..6ab0883ac2 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect.ts +++ b/src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts @@ -1,14 +1,14 @@ +import { useToast } from "@/components/ui/hooks/useToast" import useUser from "components/[guild]/hooks/useUser" import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" -import useToast from "hooks/useToast" import { PlatformType } from "types" import fetcher from "utils/fetcher" const useDisconnect = (onSuccess?: () => void) => { const showErrorToast = useShowErrorToast() const { mutate: mutateUser, id: userId } = useUser() - const toast = useToast() + const { toast } = useToast() const submit = async (signedValidation: SignedValidation) => { const { platformName } = JSON.parse(signedValidation.signedPayload) @@ -36,7 +36,7 @@ const useDisconnect = (onSuccess?: () => void) => { toast({ title: `Account disconnected!`, - status: "success", + variant: "success", }) onSuccess?.() @@ -48,7 +48,7 @@ const useDisconnect = (onSuccess?: () => void) => { const useDisconnectAddress = (onSuccess?: () => void) => { const showErrorToast = useShowErrorToast() const { mutate: mutateUser, id: userId } = useUser() - const toast = useToast() + const { toast } = useToast() const submit = async (signedValidation: SignedValidation) => { const { address: addressFromValidation } = JSON.parse( @@ -74,7 +74,7 @@ const useDisconnectAddress = (onSuccess?: () => void) => { toast({ title: `Account disconnected!`, - status: "success", + variant: "success", }) onSuccess?.() @@ -86,7 +86,7 @@ const useDisconnectAddress = (onSuccess?: () => void) => { const useDisconnectEmail = (onSuccess?: () => void) => { const showErrorToast = useShowErrorToast() const { mutate: mutateUser, id: userId } = useUser() - const toast = useToast() + const { toast } = useToast() const submit = async (signedValidation: SignedValidation) => { const { emailAddress } = JSON.parse(signedValidation.signedPayload) @@ -112,7 +112,7 @@ const useDisconnectEmail = (onSuccess?: () => void) => { toast({ title: `Email address disconnected!`, - status: "success", + variant: "success", }) onSuccess?.() From 5fed49ddd75f75daee726325f1ad0831c76e88cc Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 09:47:24 +0200 Subject: [PATCH 045/110] fix(AccountModal): simplify modal state --- .../Account/components/AccountModal/AccountModal.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 457a2d07e9..0343aa4e97 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -33,7 +33,6 @@ const AccountModal = () => { const { connectorName } = useConnectorNameAndIcon() const [isOpen, setIsOpen] = useAtom(accountModalAtom) - const onClose = () => setIsOpen(false) const { id } = useUser() const { deleteKeys } = useUserPublic() @@ -67,9 +66,9 @@ const AccountModal = () => { } return ( - - - + + + Account From 326a6a39b2aaa25d73840e50b838fe1132610b67 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 09:50:09 +0200 Subject: [PATCH 046/110] fix(EmailAddress): verify flow --- .../AccountModal/components/EmailAddress.tsx | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index 07a1250bc9..826ded8835 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -29,8 +29,7 @@ import { import { useDisclosure } from "@/hooks/useDisclosure" import { cn } from "@/lib/utils" import { zodResolver } from "@hookform/resolvers/zod" -import { PencilSimple } from "@phosphor-icons/react/dist/ssr" -import { useDisconnectEmail } from "components/common/Layout/components/Account/components/AccountModal/hooks/useDisconnect" +import { PencilSimple, Warning } from "@phosphor-icons/react/dist/ssr" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import useToast from "hooks/useToast" import { useEffect, useState } from "react" @@ -38,6 +37,7 @@ import { FormProvider, useForm, useWatch } from "react-hook-form" import { emailData } from "rewards/Email/data" import fetcher from "utils/fetcher" import { z } from "zod" +import { useDisconnectEmail } from "../hooks/useDisconnect" import { DisconnectAccountButton } from "./DisconnectAccountButton" import { SocialAccountUI } from "./SocialAccount" @@ -171,11 +171,15 @@ const ConnectEmailButton = ({ <> - + Connect email - + {/* TODO: Error component */} {/* ) From 99b0322e663b3b44acf8375a6d412be2ae134fbc Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 09:54:36 +0200 Subject: [PATCH 047/110] chore: remove unused `AccountButton` --- .../Layout/components/Account/Account.tsx | 74 ------------------- .../Account/components/AccountButton.tsx | 21 ------ .../Notifications/Notifications.tsx | 24 +++--- .../Layout/components/Account/index.tsx | 3 - .../components/AccountButton.tsx | 1 + 5 files changed, 13 insertions(+), 110 deletions(-) delete mode 100644 src/components/common/Layout/components/Account/Account.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountButton.tsx delete mode 100644 src/components/common/Layout/components/Account/index.tsx diff --git a/src/components/common/Layout/components/Account/Account.tsx b/src/components/common/Layout/components/Account/Account.tsx deleted file mode 100644 index 3e0df9c487..0000000000 --- a/src/components/common/Layout/components/Account/Account.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { walletSelectorModalAtom } from "@/components/Providers/atoms" -import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import { ButtonGroup, Divider } from "@chakra-ui/react" -import { SignIn } from "@phosphor-icons/react" -import useUser from "components/[guild]/hooks/useUser" -import { useSetAtom } from "jotai" -import AccountButton from "./components/AccountButton" -import Notifications from "./components/Notifications/Notifications" - -const Account = (): JSX.Element => { - const { address } = useWeb3ConnectionManager() - const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - - // const domainName = useResolveAddress(address) - const { addresses } = useUser() - - if (!address) { - return ( - } - onClick={() => setIsWalletSelectorModalOpen(true)} - data-test="connect-wallet-button" - > - Sign in - - ) - } - - const linkedAddressesCount = (addresses?.length ?? 1) - 1 - - return ( - - - - - {/* setIsAccountModalOpen(true)}> - - - - {domainName || `${shortenHex(address, 3)}`} - - {linkedAddressesCount && ( - - {`+ ${linkedAddressesCount} address${ - linkedAddressesCount > 1 ? "es" : "" - }`} - - )} - - - - */} - - ) -} - -export default Account diff --git a/src/components/common/Layout/components/Account/components/AccountButton.tsx b/src/components/common/Layout/components/Account/components/AccountButton.tsx deleted file mode 100644 index 84cac1703f..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountButton.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ButtonProps } from "@chakra-ui/react" -import Button from "components/common/Button" -import { forwardRef, PropsWithChildren } from "react" - -const AccountButton = forwardRef( - ({ children, ...rest }: PropsWithChildren, ref: any): JSX.Element => ( - - ) -) - -export default AccountButton diff --git a/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx b/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx index beb0f5ca4a..f58c9ae699 100644 --- a/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx +++ b/src/components/common/Layout/components/Account/components/Notifications/Notifications.tsx @@ -1,4 +1,5 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { Button } from "@/components/ui/Button" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Divider, @@ -16,7 +17,6 @@ import { ActivityLogProvider } from "components/[guild]/activity/ActivityLogCont import useUser from "components/[guild]/hooks/useUser" import useLocalStorage from "hooks/useLocalStorage" import dynamic from "next/dynamic" -import AccountButton from "../AccountButton" import WebInboxSkeleton from "../Web3Inbox/WebInboxSkeleton" import NotificationsActivityLog from "./components/NotificationsActivityLog" import NotificationsSection from "./components/NotificationsSection" @@ -51,22 +51,22 @@ const Notifications = () => { {({ isOpen }) => ( <> - { setClickedOnNotifications(true) if (isOpen) return captureEvent("opened UserActivityLogPopover") }} - sx={{ - "@keyframes notification": { - "0%": { transform: "rotate(0deg)" }, - "2.5%": { transform: "rotate(15deg)" }, - "5%": { transform: "rotate(-15deg)" }, - "7.5": { transform: "rotate(15deg)" }, - "10%": { transform: "rotate(0deg)" }, - }, - }} + // sx={{ + // "@keyframes notification": { + // "0%": { transform: "rotate(0deg)" }, + // "2.5%": { transform: "rotate(15deg)" }, + // "5%": { transform: "rotate(-15deg)" }, + // "7.5": { transform: "rotate(15deg)" }, + // "10%": { transform: "rotate(0deg)" }, + // }, + // }} > { : "notification 4s ease-in-out infinite" } /> - + { ) } + export default AccountButton From 97e4395700d4417b133f5903ee478cf0706d486c Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 10:41:46 +0200 Subject: [PATCH 048/110] cleanup: move `processEmailError` inside `AccountModal/utils` --- .../AccountModal/{components => }/utils/processEmailError.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/v2/components/Account/components/AccountModal/{components => }/utils/processEmailError.ts (100%) diff --git a/src/v2/components/Account/components/AccountModal/components/utils/processEmailError.ts b/src/v2/components/Account/components/AccountModal/utils/processEmailError.ts similarity index 100% rename from src/v2/components/Account/components/AccountModal/components/utils/processEmailError.ts rename to src/v2/components/Account/components/AccountModal/utils/processEmailError.ts From 36df8b67c49a0f178e3e778b9c1077e6aed99645 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 11:16:17 +0200 Subject: [PATCH 049/110] feat: `useGuildUrlNameFromPathname` helper hook --- src/components/[guild]/hooks/useGuild.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/[guild]/hooks/useGuild.ts b/src/components/[guild]/hooks/useGuild.ts index b4ca23e911..267a17f8f0 100644 --- a/src/components/[guild]/hooks/useGuild.ts +++ b/src/components/[guild]/hooks/useGuild.ts @@ -2,15 +2,19 @@ import useSWRWithOptionalAuth, { mutateOptionalAuthSWRKey, } from "hooks/useSWRWithOptionalAuth" import { usePathname } from "next/navigation" -import { useRouter } from "next/router" import { mutate as swrMutate, unstable_serialize, useSWRConfig } from "swr" import useSWRImmutable from "swr/immutable" import { Guild, SimpleGuild } from "types" -const useGuild = (guildId?: string | number) => { +const useGuildUrlNameFromPathname = (guildId?: string | number) => { const pathname = usePathname() const guildFromPathname = pathname?.split("/").at(1) - const id = guildId ?? guildFromPathname + + return guildId ?? guildFromPathname +} + +const useGuild = (guildId?: string | number) => { + const id = useGuildUrlNameFromPathname(guildId) const publicSWRKey = `/v2/guilds/guild-page/${id}` @@ -61,8 +65,7 @@ const useGuild = (guildId?: string | number) => { } const useSimpleGuild = (guildId?: string | number) => { - const router = useRouter() - const id = guildId ?? router.query.guild + const id = useGuildUrlNameFromPathname(guildId) const { cache } = useSWRConfig() const guildPageFromCache = cache.get( From 697195e106cc8e94ff05d5a0c9160578cff472fa Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 11:19:27 +0200 Subject: [PATCH 050/110] wip: `SharedSocials` migration --- .../AccountModal/components/SharedSocials.tsx | 222 ------------------ .../components/AccountConnections.tsx | 8 +- .../components/AccountSection.tsx | 4 +- .../AccountModal/components/SharedSocials.tsx | 201 ++++++++++++++++ 4 files changed, 210 insertions(+), 225 deletions(-) delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/SharedSocials.tsx create mode 100644 src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/SharedSocials.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/SharedSocials.tsx deleted file mode 100644 index bc60a61f94..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/SharedSocials.tsx +++ /dev/null @@ -1,222 +0,0 @@ -import { - Box, - Center, - Divider, - HStack, - Icon, - Link, - Menu, - MenuButton, - MenuItem, - MenuList, - ModalBody, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalOverlay, - Skeleton, - SkeletonCircle, - Stack, - Text, - useDisclosure, -} from "@chakra-ui/react" -import { - ArrowSquareOut, - CaretDown, - Check, - Shield, - ShieldCheck, -} from "@phosphor-icons/react" -import useGuild, { useSimpleGuild } from "components/[guild]/hooks/useGuild" -import useUser from "components/[guild]/hooks/useUser" -import Button from "components/common/Button" -import GuildLogo from "components/common/GuildLogo" -import { Modal } from "components/common/Modal" -import { useEffect, useRef } from "react" -import pluralize from "utils/pluralize" -import useEditSharedSocials from "../hooks/useEditSharedSocials" - -const SharedSocials = () => { - const { id } = useGuild() - const { sharedSocials } = useUser() - const { isOpen, onOpen, onClose } = useDisclosure() - - const guildSharedSocial = - id && sharedSocials?.find((sharedSocial) => sharedSocial.guildId === id) - const restSharedSocials = !guildSharedSocial - ? sharedSocials - : sharedSocials?.filter((sharedSocial) => sharedSocial.guildId !== id) - - const buttonProps = { - size: "sm", - variant: "ghost", - ml: "auto", - my: "-1 !important", - onClick: onOpen, - // so we can focus it from useNewSharedSocialsToast - id: "sharedSocialsButton", - _focus: { - boxShadow: "var(--chakra-shadows-outline)", - }, - } - - // so the button doesn't get the focus ring on close - const dummyRef = useRef(null) - - return ( - <> - - {!guildSharedSocial ? ( - - ) : guildSharedSocial.isShared !== false ? ( - - ) : ( - - )} - - - - - Shared account connections - - - - - Choose which guilds you'd like to share your profile with.{" "} - - Learn more - - - } spacing="4"> - {guildSharedSocial && ( - - )} - {restSharedSocials.map((sharedSocial) => ( - - ))} - - - - - - ) -} - -/** - * Passing sharedSocials as prop instead of just isShared, because it doesn't change - * on edit success that way for some reason, regardless of the mutate - */ -const ShareSocialsWithGuildSelect = ({ guildId, sharedSocials }) => { - const { imageUrl, name } = useSimpleGuild(guildId) - const { onSubmit, isLoading, submit } = useEditSharedSocials(guildId) - - const isShared = sharedSocials?.find( - (sharedSocial) => sharedSocial.guildId === guildId - ).isShared - - /** - * Change null to true on mount (without toast), indicating that the user has seen - * the notification, and the useNewSharedSocialsToast won't fire again - */ - useEffect(() => { - if (isShared === null) submit(true) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) - - const isSharedBoolean = isShared !== false - - return ( - - - - - - - {name} - - - - : } - color={ - isSharedBoolean ? "green.500" : "var(--chakra-colors-chakra-body-text)" - } - variant="ghost" - size="sm" - rightIcon={} - isLoading={isLoading} - flexShrink="0" - > - {isSharedBoolean ? "Shared" : "Hidden"} - - - onSubmit(true)} - selected={isSharedBoolean} - /> - - onSubmit(false)} - selected={!isSharedBoolean} - /> - - - - ) -} - -const MenuItemOption = ({ title, description, icon, onClick, selected }) => ( - - -
    {selected && }
    - - {title} - {description} - - -
    -
    -) - -export default SharedSocials diff --git a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx index 13df84c365..9edbdc6e77 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx @@ -6,6 +6,7 @@ import useDelegateVaults from "../hooks/useDelegateVaults" import { AccountSection, AccountSectionTitle } from "./AccountSection" import EmailAddress from "./EmailAddress" import FarcasterProfile from "./FarcasterProfile" +import SharedSocials from "./SharedSocials" import { SocialAccount } from "./SocialAccount" const AccountConnections = () => { @@ -26,8 +27,11 @@ const AccountConnections = () => { return (
    - {/* TODO: rightElement */} - + 0 ? : undefined} + className="justify-between" + /> {orderedSocials.map((platform, i) => ( <> diff --git a/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx b/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx index caf80c6f46..7ecdd6e655 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx @@ -4,11 +4,13 @@ import { ReactNode } from "react" export const AccountSectionTitle = ({ title, titleRightElement, + className, }: { title: string titleRightElement?: ReactNode + className?: string }) => ( -
    +
    {title} {titleRightElement}
    diff --git a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx new file mode 100644 index 0000000000..ff9d14ddca --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx @@ -0,0 +1,201 @@ +import { ArrowSquareOut, Shield, ShieldCheck } from "@phosphor-icons/react/dist/ssr" +import useGuild, { useSimpleGuild } from "components/[guild]/hooks/useGuild" +import useUser from "components/[guild]/hooks/useUser" +import GuildLogo from "components/common/GuildLogo" + +import { Button, ButtonProps } from "@/components/ui/Button" +import { + Dialog, + DialogCloseButton, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/Dialog" +import { Skeleton } from "@/components/ui/Skeleton" +import { useEffect } from "react" +import pluralize from "utils/pluralize" +import useEditSharedSocials from "../../../../../../components/common/Layout/components/Account/components/AccountModal/hooks/useEditSharedSocials" + +const SharedSocials = () => { + const { id } = useGuild() + const { sharedSocials } = useUser() + + const guildSharedSocial = + id && sharedSocials?.find((sharedSocial) => sharedSocial.guildId === id) + const restSharedSocials = !guildSharedSocial + ? sharedSocials + : sharedSocials?.filter((sharedSocial) => sharedSocial.guildId !== id) + + const buttonProps = { + size: "sm", + variant: "ghost", + className: "ml-auto -my-1", + } satisfies ButtonProps + + return ( + + {/* TODO: scrollBehavior="inside" */} + + {!guildSharedSocial ? ( + + ) : guildSharedSocial.isShared !== false ? ( + + ) : ( + + )} + + + + Shared account connections + + +

    + Choose which guilds you'd like to share your profile with.{" "} + + Learn more{" "} + + +

    + +
    + {guildSharedSocial && ( + <> + +
    + + )} + {restSharedSocials.map((sharedSocial) => ( + + ))} +
    + + +
    +
    + ) +} + +/** + * Passing sharedSocials as prop instead of just isShared, because it doesn't change + * on edit success that way for some reason, regardless of the mutate + */ +const ShareSocialsWithGuildSelect = ({ guildId, sharedSocials }) => { + const { imageUrl, name } = useSimpleGuild(guildId) + const { onSubmit, isLoading, submit } = useEditSharedSocials(guildId) + + const isShared = sharedSocials?.find( + (sharedSocial) => sharedSocial.guildId === guildId + ).isShared + + /** + * Change null to true on mount (without toast), indicating that the user has seen + * the notification, and the useNewSharedSocialsToast won't fire again + */ + useEffect(() => { + if (isShared === null) submit(true) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + const isSharedBoolean = isShared !== false + + return ( +
    + {/* TODO: GuildLogo migration */} + {imageUrl ? ( + + ) : ( + + )} + + {name?.length > 0 ? ( + + {name} + + ) : ( + + )} + + {/* + : } + color={ + isSharedBoolean ? "green.500" : "var(--chakra-colors-chakra-body-text)" + } + variant="ghost" + size="sm" + rightIcon={} + isLoading={isLoading} + flexShrink="0" + > + {isSharedBoolean ? "Shared" : "Hidden"} + + + onSubmit(true)} + selected={isSharedBoolean} + /> + + onSubmit(false)} + selected={!isSharedBoolean} + /> + + */} +
    + ) +} + +// const MenuItemOption = ({ title, description, icon, onClick, selected }) => ( +// +// +//
    {selected && }
    +// +// {title} +// {description} +// +// +//
    +//
    +// ) + +export default SharedSocials From 42c1bfd7d9f6ab4f273097145704b566bc7287ad Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 14:31:03 +0200 Subject: [PATCH 051/110] refactor: move `useEditSharedSocials` to the `v2` folder --- .../components/AccountModal/components/SharedSocials.tsx | 2 +- .../components/AccountModal/hooks/useEditSharedSocials.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/{components/common/Layout => v2}/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts (90%) diff --git a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx index ff9d14ddca..bac861682a 100644 --- a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx @@ -15,7 +15,7 @@ import { import { Skeleton } from "@/components/ui/Skeleton" import { useEffect } from "react" import pluralize from "utils/pluralize" -import useEditSharedSocials from "../../../../../../components/common/Layout/components/Account/components/AccountModal/hooks/useEditSharedSocials" +import useEditSharedSocials from "../hooks/useEditSharedSocials" const SharedSocials = () => { const { id } = useGuild() diff --git a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts b/src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts similarity index 90% rename from src/components/common/Layout/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts rename to src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts index 2a8e9b6633..1352343ad3 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts +++ b/src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts @@ -1,13 +1,13 @@ +import { useToast } from "@/components/ui/hooks/useToast" import useUser from "components/[guild]/hooks/useUser" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit/useSubmit" -import useToast from "hooks/useToast" const useEditSharedSocials = (guildId) => { const { id, mutate } = useUser() const showErrorToast = useShowErrorToast() - const toast = useToast() + const { toast } = useToast() const fetcherWithSign = useFetcherWithSign() const submit = (shareSocials) => @@ -24,7 +24,7 @@ const useEditSharedSocials = (guildId) => { const useSubmitProps = useSubmit(submit, { onSuccess: (response) => { toast({ - status: "success", + variant: "success", title: "Sharing status successfully updated", }) mutate( From e0a5f355c981d1387be0a6f7436a09a49ebcc9f8 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 14:53:53 +0200 Subject: [PATCH 052/110] feat: finish `SharedSocial` migration --- src/types.ts | 8 +- .../AccountModal/components/SharedSocials.tsx | 117 ++++++++++++------ 2 files changed, 78 insertions(+), 47 deletions(-) diff --git a/src/types.ts b/src/types.ts index 6e7d3b5286..b0d2cbf93d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,6 +3,7 @@ import { Logic, schemas, Schemas, + UserProfile, Visibility, } from "@guildxyz/types" import { FeatureFlag } from "components/[guild]/EditGuild/components/FeatureFlags" @@ -119,11 +120,6 @@ type PlatformAccountDetails = { username?: string } -type SharedSocial = { - guildId: number - isShared: boolean -} - type UserAddress = { address: `0x${string}` userId: number @@ -137,7 +133,7 @@ type User = { id: number addresses: UserAddress[] platformUsers: PlatformAccountDetails[] - sharedSocials: SharedSocial[] + sharedSocials: UserProfile["sharedSocials"] publicKey?: string isSuperAdmin: boolean diff --git a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx index bac861682a..ea3a8e5010 100644 --- a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx @@ -1,4 +1,11 @@ -import { ArrowSquareOut, Shield, ShieldCheck } from "@phosphor-icons/react/dist/ssr" +import { type Icon } from "@phosphor-icons/react" +import { + ArrowSquareOut, + CaretDown, + Check, + Shield, + ShieldCheck, +} from "@phosphor-icons/react/dist/ssr" import useGuild, { useSimpleGuild } from "components/[guild]/hooks/useGuild" import useUser from "components/[guild]/hooks/useUser" import GuildLogo from "components/common/GuildLogo" @@ -12,7 +19,16 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/Dialog" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/DropdownMenu" import { Skeleton } from "@/components/ui/Skeleton" +import { cn } from "@/lib/utils" +import { UserProfile } from "@guildxyz/types" import { useEffect } from "react" import pluralize from "utils/pluralize" import useEditSharedSocials from "../hooks/useEditSharedSocials" @@ -106,13 +122,19 @@ const SharedSocials = () => { * Passing sharedSocials as prop instead of just isShared, because it doesn't change * on edit success that way for some reason, regardless of the mutate */ -const ShareSocialsWithGuildSelect = ({ guildId, sharedSocials }) => { +const ShareSocialsWithGuildSelect = ({ + guildId, + sharedSocials, +}: { + guildId: number + sharedSocials: UserProfile["sharedSocials"] +}) => { const { imageUrl, name } = useSimpleGuild(guildId) - const { onSubmit, isLoading, submit } = useEditSharedSocials(guildId) + const { onSubmit, submit } = useEditSharedSocials(guildId) const isShared = sharedSocials?.find( (sharedSocial) => sharedSocial.guildId === guildId - ).isShared + )?.isShared /** * Change null to true on mount (without toast), indicating that the user has seen @@ -142,28 +164,26 @@ const ShareSocialsWithGuildSelect = ({ guildId, sharedSocials }) => { )} - {/* - : } - color={ - isSharedBoolean ? "green.500" : "var(--chakra-colors-chakra-body-text)" - } - variant="ghost" - size="sm" - rightIcon={} - isLoading={isLoading} - flexShrink="0" - > - {isSharedBoolean ? "Shared" : "Hidden"} - - + + + + + + { onClick={() => onSubmit(true)} selected={isSharedBoolean} /> - + { onClick={() => onSubmit(false)} selected={!isSharedBoolean} /> - - */} + +
    ) } -// const MenuItemOption = ({ title, description, icon, onClick, selected }) => ( -// -// -//
    {selected && }
    -// -// {title} -// {description} -// -// -//
    -//
    -// ) +const MenuItemOption = ({ + title, + description, + icon: Icon, + onClick, + selected, +}: { + title: string + description: string + icon: Icon + onClick: () => void + selected: boolean +}) => ( + {}} + className="flex h-auto w-full items-center gap-4 p-4 text-base" + > +
    + {selected && } +
    +
    + {title} +

    {description}

    +
    + +
    +) export default SharedSocials From a1dbb3b6dfd38eeab9f19f7d1a8e7e038125ff75 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 18:20:07 +0200 Subject: [PATCH 053/110] feat: `useErrorToast` hook --- .../AccountModal/hooks/useDisconnect.ts | 8 +-- .../hooks/useEditSharedSocials.ts | 4 +- .../WalletSelectorModal.tsx | 12 ++--- src/v2/components/ui/hooks/useErrorToast.tsx | 53 +++++++++++++++++++ 4 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 src/v2/components/ui/hooks/useErrorToast.tsx diff --git a/src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts b/src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts index 6ab0883ac2..863d77db8c 100644 --- a/src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts +++ b/src/v2/components/Account/components/AccountModal/hooks/useDisconnect.ts @@ -1,12 +1,12 @@ +import { useErrorToast } from "@/components/ui/hooks/useErrorToast" import { useToast } from "@/components/ui/hooks/useToast" import useUser from "components/[guild]/hooks/useUser" -import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import { PlatformType } from "types" import fetcher from "utils/fetcher" const useDisconnect = (onSuccess?: () => void) => { - const showErrorToast = useShowErrorToast() + const showErrorToast = useErrorToast() const { mutate: mutateUser, id: userId } = useUser() const { toast } = useToast() @@ -46,7 +46,7 @@ const useDisconnect = (onSuccess?: () => void) => { } const useDisconnectAddress = (onSuccess?: () => void) => { - const showErrorToast = useShowErrorToast() + const showErrorToast = useErrorToast() const { mutate: mutateUser, id: userId } = useUser() const { toast } = useToast() @@ -84,7 +84,7 @@ const useDisconnectAddress = (onSuccess?: () => void) => { } const useDisconnectEmail = (onSuccess?: () => void) => { - const showErrorToast = useShowErrorToast() + const showErrorToast = useErrorToast() const { mutate: mutateUser, id: userId } = useUser() const { toast } = useToast() diff --git a/src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts b/src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts index 1352343ad3..b87322ca3f 100644 --- a/src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts +++ b/src/v2/components/Account/components/AccountModal/hooks/useEditSharedSocials.ts @@ -1,12 +1,12 @@ +import { useErrorToast } from "@/components/ui/hooks/useErrorToast" import { useToast } from "@/components/ui/hooks/useToast" import useUser from "components/[guild]/hooks/useUser" import { useFetcherWithSign } from "hooks/useFetcherWithSign" -import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit/useSubmit" const useEditSharedSocials = (guildId) => { const { id, mutate } = useUser() - const showErrorToast = useShowErrorToast() + const showErrorToast = useErrorToast() const { toast } = useToast() const fetcherWithSign = useFetcherWithSign() diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index 1119248739..1e9987ab65 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -18,6 +18,7 @@ import { walletLinkHelperModalAtom, } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useErrorToast } from "@/components/ui/hooks/useErrorToast" import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" import { useAtom, useSetAtom } from "jotai" import Link from "next/link" @@ -105,17 +106,16 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { !prevAddress && address === addressLinkParams.address - // TODO - // const showErrorToast = useShowErrorToast() + const showErrorToast = useErrorToast() useEffect(() => { if (!triesToLinkCurrentAddress) return setAddressLinkParams({ userId: undefined, address: undefined }) - // showErrorToast( - // "You cannot link an address to itself. Please choose a different address." - // ) - }, [triesToLinkCurrentAddress, setAddressLinkParams /*, showErrorToast*/]) + showErrorToast( + "You cannot link an address to itself. Please choose a different address." + ) + }, [triesToLinkCurrentAddress, setAddressLinkParams, showErrorToast]) const conditionalOnClose = () => { if (!isWeb3Connected || !!keyPair) onClose() diff --git a/src/v2/components/ui/hooks/useErrorToast.tsx b/src/v2/components/ui/hooks/useErrorToast.tsx new file mode 100644 index 0000000000..c41a21bbbe --- /dev/null +++ b/src/v2/components/ui/hooks/useErrorToast.tsx @@ -0,0 +1,53 @@ +import { useCallback } from "react" +import { useCopyToClipboard } from "usehooks-ts" +import { useToast } from "./useToast" + +type ErrorWithCorrelationId = { + error: string + correlationId: string +} + +const isErrorWithCorrelationId = (error: any): error is ErrorWithCorrelationId => + !!error?.correlationId + +const useErrorToast = () => { + const { toast } = useToast() + const [, copyToClipboard] = useCopyToClipboard() + + const errorToast = useCallback( + (message?: string, correlationId?: string) => + toast({ + variant: "error", + title: "Error", + description: correlationId ? ( +
    + {message &&

    {message}

    } +
     copyToClipboard(correlationId)}
    +            >{`ID: ${correlationId}`}
    +
    + ) : ( + message + ), + }), + [toast, copyToClipboard] + ) + + return useCallback( + (error: string | ErrorWithCorrelationId | Error) => { + if (!error) return errorToast() + + if (isErrorWithCorrelationId(error)) { + return errorToast(error.error, error.correlationId) + } + + if (typeof error === "string") return errorToast(error) + + if (error.message) return errorToast(error.message) + }, + [errorToast] + ) +} + +export { useErrorToast } From c37ddad42171d30bbb01890187fbb0060e274a88 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 18:21:36 +0200 Subject: [PATCH 054/110] fix(WalletSelectorModal): remove `CardMotionWrapper` --- .../WalletSelectorModal.tsx | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index 1e9987ab65..562ff831d6 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -9,7 +9,6 @@ import { } from "@/components/ui/Dialog" import { usePrevious } from "@/hooks/usePrevious" import { useUserPublic } from "@/hooks/useUserPublic" -import CardMotionWrapper from "components/common/CardMotionWrapper" import useSetKeyPair from "hooks/useSetKeyPair" // import useShowErrorToast from "hooks/useShowErrorToast" import { usePostHogContext } from "@/components/Providers/PostHogProvider" @@ -182,18 +181,17 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => {
    {!connector && !addressLinkParams?.userId && ( <> - - conn.id === COINBASE_WALLET_SDK_ID - )} - connect={connect} - pendingConnector={ - isPending ? (variables?.connector as Connector) : undefined - } - error={error} - /> - + conn.id === COINBASE_WALLET_SDK_ID + )} + connect={connect} + pendingConnector={ + isPending ? (variables?.connector as Connector) : undefined + } + error={error} + />

    Or connect with wallet @@ -213,16 +211,15 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { ) .sort((conn, _) => (conn.type === "injected" ? -1 : 0)) .map((conn) => ( - - - + ))} {/* TODO: migrate these components too */} {/* */} From 8122c2a65ec236d0ce222d989a74beb00cbcf3a5 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 18:35:24 +0200 Subject: [PATCH 055/110] fix(Button): remove important modifier --- src/v2/components/ui/Button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index fde190a1f2..6628624342 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -7,7 +7,7 @@ import { CircleNotch } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" const buttonVariants = cva( - "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:!opacity-50 rounded-xl text-base", + "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 rounded-xl text-base", { variants: { variant: { From a83a34e3d753772ead510145776efe9bb7c1ef1d Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 18:35:42 +0200 Subject: [PATCH 056/110] fix(WalletSelectorModal): remove animations --- .../WalletSelectorModal/WalletSelectorModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index 562ff831d6..e033b5d011 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -170,7 +170,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { /> */} {shouldShowVerify && ( -

    +

    Sign message to verify that you're the owner of this address.

    )} @@ -243,7 +243,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { linkAddress.isLoading || set.isLoading || (!id && !publicUserError) } loadingText={!id ? "Looking for keypairs" : "Check your wallet"} - className="mb-4 w-full animate-fade-in" + className="mb-4 w-full" > {isAddressLink ? "Link address" : "Verify address"}{" "} From c7fc5616e7c8fc6b95f58a731fc8868869a4ae26 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Mon, 8 Jul 2024 22:51:26 +0200 Subject: [PATCH 057/110] feat: "Linked addresses" section --- .../components/AddressTypeTag.tsx | 27 -- .../AccountModal/components/LinkedAddress.tsx | 186 -------------- .../components/PrimaryAddressTag.tsx | 19 -- .../components/AccountConnections.tsx | 83 ++++--- .../components/AccountSection.tsx | 4 +- .../components/AddressTypeBadge.tsx | 40 +++ .../components/LinkAddressButton.tsx | 33 ++- .../components/LinkDelegateVaultButton.tsx | 25 +- .../AccountModal/components/LinkedAddress.tsx | 231 ++++++++++++++++++ .../components/PrimaryAddressBadge.tsx | 30 +++ .../hooks/useEditPrimaryAddress.ts | 10 +- .../AccountModal/hooks/useLinkVaults.ts | 6 +- src/v2/components/ui/Badge.tsx | 14 +- src/v2/components/ui/Button.tsx | 2 +- src/v2/components/ui/DropdownMenu.tsx | 2 +- src/v2/components/ui/Tooltip.tsx | 2 +- src/v2/hooks/useDisclosure.ts | 3 +- 17 files changed, 402 insertions(+), 315 deletions(-) delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/AddressTypeTag.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/PrimaryAddressTag.tsx create mode 100644 src/v2/components/Account/components/AccountModal/components/AddressTypeBadge.tsx rename src/{components/common/Layout => v2}/components/Account/components/AccountModal/components/LinkAddressButton.tsx (57%) rename src/{components/common/Layout => v2}/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx (54%) create mode 100644 src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx create mode 100644 src/v2/components/Account/components/AccountModal/components/PrimaryAddressBadge.tsx rename src/{components/common/Layout => v2}/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts (85%) rename src/{components/common/Layout => v2}/components/Account/components/AccountModal/hooks/useLinkVaults.ts (85%) diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/AddressTypeTag.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/AddressTypeTag.tsx deleted file mode 100644 index 68d7226016..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/AddressTypeTag.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Img, Tag, ThemingProps, Tooltip } from "@chakra-ui/react" -import { User } from "types" - -type AddressType = Exclude - -type Props = { - type: AddressType - size?: ThemingProps<"Tag">["size"] -} - -const TYPE_ICONS: Record = { - FUEL: "/walletLogos/fuel.svg", -} - -const TYPE_NAMES: Record = { - FUEL: "Fuel", -} - -const AddressTypeTag = ({ type, size }: Props) => ( - - - {TYPE_NAMES[type]} - - -) - -export default AddressTypeTag diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx deleted file mode 100644 index 16213fc2bb..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkedAddress.tsx +++ /dev/null @@ -1,186 +0,0 @@ -import { useDisconnectAddress } from "@/components/Account/components/AccountModal/hooks/useDisconnect" -import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import { - AlertDialogBody, - AlertDialogContent, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogOverlay, - Circle, - HStack, - IconButton, - Menu, - MenuButton, - MenuItem, - MenuList, - Skeleton, - SkeletonCircle, - Spinner, - Tag, - Text, - Tooltip, - Wrap, - useColorModeValue, - useDisclosure, -} from "@chakra-ui/react" -import { DotsThree, LinkBreak, UserSwitch } from "@phosphor-icons/react" -import Button from "components/common/Button" -import CopyableAddress from "components/common/CopyableAddress" -import GuildAvatar from "components/common/GuildAvatar" -import { Alert } from "components/common/Modal" -import Image from "next/image" -import { useRef } from "react" -import { User } from "types" -import shortenHex from "utils/shortenHex" -import useEditPrimaryAddress from "../hooks/useEditPrimaryAddress" -import AddressTypeTag from "./AddressTypeTag" -import PrimaryAddressTag from "./PrimaryAddressTag" - -type Props = { - addressData: User["addresses"][number] -} - -const LinkedAddress = ({ addressData }: Props) => { - const { address, isDelegated, isPrimary, walletType } = addressData ?? {} - const { address: connectedAddress } = useWeb3ConnectionManager() - - const isCurrent = address?.toLowerCase() === connectedAddress.toLowerCase() - - const { - onSubmit: onEditPrimaryAddressSubmit, - isLoading: isEditPrimaryAddressLoading, - } = useEditPrimaryAddress() - - const { isOpen, onOpen, onClose } = useDisclosure() - - const { - onSubmit: onDisconnectSubmit, - isLoading: isDisconnectLoading, - signLoadingText: disconnectSignLoadingText, - } = useDisconnectAddress(onClose) - const alertCancelRef = useRef() - - const removeAddress = () => onDisconnectSubmit({ address }) - const removeMenuItemColor = useColorModeValue("red.600", "red.300") - - return ( - <> - - - - - - - {isDelegated && ( - - - Delegate cash logo - - - )} - {walletType !== "EVM" && } - {isCurrent && ( - - Current - - )} - {isPrimary && } - - - {/* Using a custom key here so the menu closes when we successfully set a new primary address */} - - } - aria-label="Options" - rounded="full" - variant="ghost" - size="sm" - ml="auto !important" - /> - - {!isPrimary && ( - - ) : ( - - ) - } - onClick={() => - onEditPrimaryAddressSubmit({ - address, - isPrimary: true, - }) - } - > - Set as primary - - )} - } - color={removeMenuItemColor} - onClick={onOpen} - > - Disconnect - - - - - - - - - Disconnect address - - - Are you sure? You'll be kicked from the guilds you have the - requirement(s) to with{" "} - - {shortenHex(address, 3)} - - . - - - - - - - - - - - ) -} - -export const LinkedAddressSkeleton = () => ( - - - - -) - -export default LinkedAddress diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/PrimaryAddressTag.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/PrimaryAddressTag.tsx deleted file mode 100644 index 02d42eabd5..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/PrimaryAddressTag.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Tag, ThemingProps, Tooltip } from "@chakra-ui/react" - -type Props = { - size?: ThemingProps<"Tag">["size"] -} - -const PrimaryAddressTag = ({ size }: Props): JSX.Element => ( - - - Primary - - -) - -export default PrimaryAddressTag diff --git a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx index 532f7749f6..068f400379 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx @@ -1,11 +1,22 @@ +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { cn } from "@/lib/utils" +import { Question } from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" -import { useMemo } from "react" +import { Fragment, useMemo } from "react" import rewards from "rewards" import { PlatformName } from "types" import useDelegateVaults from "../hooks/useDelegateVaults" import { AccountSection, AccountSectionTitle } from "./AccountSection" import EmailAddress from "./EmailAddress" import FarcasterProfile from "./FarcasterProfile" +import LinkAddressButton from "./LinkAddressButton" +import LinkDelegateVaultButton from "./LinkDelegateVaultButton" +import LinkedAddress, { LinkedAddressSkeleton } from "./LinkedAddress" import SharedSocials from "./SharedSocials" import { SocialAccount } from "./SocialAccount" @@ -49,62 +60,58 @@ const AccountConnections = () => { 1 ? ( - // <> - // - // - // - // - // - // - // - // Each of your addresses will be used for requirement checks - // - // - // - // - // - // - // ) : undefined - // } + className="gap-3 pt-4" + titleRightElement={ + addresses.length > 1 ? ( +
    + + + + + + +

    Each of your addresses will be used for requirement checks

    +
    +
    +
    + +
    + ) : undefined + } /> - {/* }> + {isLoading ? ( - ) : !(addresses?.length > 1) ? ( - 1) ? ( +
    - - No linked addresses yet - +

    No linked addresses yet

    {vaults?.length ? ( - +
    - +
    ) : ( )} - +
    ) : ( addresses - .map((addressData) => ( - + .map((addressData, i) => ( + + + {i < addresses.length - 1 &&
    } +
    )) .concat( vaults?.length > 0 ? : [] ) )} -
    */} +
    ) } diff --git a/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx b/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx index 7ecdd6e655..e464c71e3c 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountSection.tsx @@ -11,7 +11,9 @@ export const AccountSectionTitle = ({ className?: string }) => (
    - {title} + + {title} + {titleRightElement}
    ) diff --git a/src/v2/components/Account/components/AccountModal/components/AddressTypeBadge.tsx b/src/v2/components/Account/components/AccountModal/components/AddressTypeBadge.tsx new file mode 100644 index 0000000000..18204d1998 --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/AddressTypeBadge.tsx @@ -0,0 +1,40 @@ +import { Badge, BadgeProps } from "@/components/ui/Badge" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { User } from "types" + +type AddressType = Exclude + +type Props = { + type: AddressType + size?: BadgeProps["size"] +} + +const TYPE_ICONS: Record = { + FUEL: "/walletLogos/fuel.svg", +} + +const TYPE_NAMES: Record = { + FUEL: "Fuel", +} + +const AddressTypeBadge = ({ type, size }: Props) => ( + + + + + {TYPE_NAMES[type]} + + + + TYPE_NAMES[type] + + + +) + +export default AddressTypeBadge diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx b/src/v2/components/Account/components/AccountModal/components/LinkAddressButton.tsx similarity index 57% rename from src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx rename to src/v2/components/Account/components/AccountModal/components/LinkAddressButton.tsx index 0b9a1f506a..180d65af94 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkAddressButton.tsx +++ b/src/v2/components/Account/components/AccountModal/components/LinkAddressButton.tsx @@ -2,13 +2,13 @@ import { addressLinkParamsAtom, walletSelectorModalAtom, } from "@/components/Providers/atoms" +import { Button, ButtonProps } from "@/components/ui/Button" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Plus } from "@phosphor-icons/react" import useUser from "components/[guild]/hooks/useUser" -import Button from "components/common/Button" import { useSetAtom } from "jotai" -const LinkAddressButton = (props) => { +const LinkAddressButton = (props: ButtonProps) => { const { id } = useUser() const { address, disconnect } = useWeb3ConnectionManager() @@ -17,21 +17,20 @@ const LinkAddressButton = (props) => { const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) return ( - <> - - + ) } diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx b/src/v2/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx similarity index 54% rename from src/components/common/Layout/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx rename to src/v2/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx index 403194557b..7c9ed9426d 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx +++ b/src/v2/components/Account/components/AccountModal/components/LinkDelegateVaultButton.tsx @@ -1,27 +1,32 @@ -import Button from "components/common/Button" +import { Button } from "@/components/ui/Button" import Image from "next/image" +import useDelegateVaults from "../hooks/useDelegateVaults" import useLinkVaults from "../hooks/useLinkVaults" -const LinkDelegateVaultButton = ({ vaults }) => { +const LinkDelegateVaultButton = ({ + vaults, +}: { + vaults: ReturnType +}) => { const linkDelegations = useLinkVaults() return ( diff --git a/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx b/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx new file mode 100644 index 0000000000..63be3996a1 --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx @@ -0,0 +1,231 @@ +import { useDisconnectAddress } from "@/components/Account/components/AccountModal/hooks/useDisconnect" +import { CopyableAddress } from "@/components/CopyableAddress" +import { GuildAvatar } from "@/components/GuildAvatar" +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/components/ui/AlertDialog" +import { Badge } from "@/components/ui/Badge" +import { Button } from "@/components/ui/Button" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/DropdownMenu" +import { Skeleton } from "@/components/ui/Skeleton" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useDisclosure } from "@/hooks/useDisclosure" +import { + CircleNotch, + DotsThree, + LinkBreak, + UserSwitch, +} from "@phosphor-icons/react/dist/ssr" +import Image from "next/image" +import { User } from "types" +import shortenHex from "utils/shortenHex" +import useEditPrimaryAddress from "../hooks/useEditPrimaryAddress" +import AddressTypeTag from "./AddressTypeBadge" +import PrimaryAddressTag from "./PrimaryAddressBadge" + +type Props = { + addressData: User["addresses"][number] +} + +const LinkedAddress = ({ addressData }: Props) => { + const { address, isDelegated, isPrimary, walletType } = addressData ?? {} + const { address: connectedAddress } = useWeb3ConnectionManager() + + const isCurrent = address?.toLowerCase() === connectedAddress.toLowerCase() + + const { + onSubmit: onEditPrimaryAddressSubmit, + isLoading: isEditPrimaryAddressLoading, + } = useEditPrimaryAddress() + + const { isOpen, onOpen, onClose, setValue: setDisclosureState } = useDisclosure() + + const { + onSubmit: onDisconnectSubmit, + isLoading: isDisconnectLoading, + signLoadingText: disconnectSignLoadingText, + } = useDisconnectAddress(onClose) + + const removeAddress = () => onDisconnectSubmit({ address }) + // const removeMenuItemColor = useColorModeValue("red.600", "red.300") + + return ( + <> +
    +
    + +
    + +
    + + {isDelegated && ( + + + + + Delegate cash logo + + + + Delegate.cash + + + + )} + {walletType !== "EVM" && } + {isCurrent && ( + // TODO: colorScheme="blue" + + Current + + )} + {isPrimary && } +
    + + {/* Using a custom key here so the menu closes when we successfully set a new primary address */} + {/* + } + aria-label="Options" + rounded="full" + variant="ghost" + size="sm" + ml="auto !important" + /> + + {!isPrimary && ( + + ) : ( + + ) + } + onClick={() => + onEditPrimaryAddressSubmit({ + address, + isPrimary: true, + }) + } + > + Set as primary + + )} + } + color={removeMenuItemColor} + onClick={onOpen} + > + Disconnect + + + */} + + + + + + + {!isPrimary && ( + + onEditPrimaryAddressSubmit({ + address, + isPrimary: true, + }) + } + > + {isEditPrimaryAddressLoading ? ( + + ) : ( + + )} + Set as primary + + )} + + + Disconnect + + + +
    + + + + + Disconnect address + + Are you sure? You'll be kicked from the guilds you have the + requirement(s) to with{" "} + + {shortenHex(address, 3)} + + . + + + + Cancel + + Continue + + + + + + ) +} + +export const LinkedAddressSkeleton = () => ( +
    + + +
    +) + +export default LinkedAddress diff --git a/src/v2/components/Account/components/AccountModal/components/PrimaryAddressBadge.tsx b/src/v2/components/Account/components/AccountModal/components/PrimaryAddressBadge.tsx new file mode 100644 index 0000000000..663469e4c3 --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/PrimaryAddressBadge.tsx @@ -0,0 +1,30 @@ +import { Badge, BadgeProps } from "@/components/ui/Badge" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/Tooltip" +type Props = { + size?: BadgeProps["size"] +} + +const PrimaryAddressBadge = ({ size }: Props): JSX.Element => ( + + + + + Primary + + + +

    + Guild owners will receive this address if they export members from their + guild +

    +
    +
    +
    +) + +export default PrimaryAddressBadge diff --git a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts b/src/v2/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts similarity index 85% rename from src/components/common/Layout/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts rename to src/v2/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts index 05b2d5f8fb..ab88060433 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts +++ b/src/v2/components/Account/components/AccountModal/hooks/useEditPrimaryAddress.ts @@ -1,8 +1,8 @@ +import { useErrorToast } from "@/components/ui/hooks/useErrorToast" +import { useToast } from "@/components/ui/hooks/useToast" import useUser from "components/[guild]/hooks/useUser" import { useFetcherWithSign } from "hooks/useFetcherWithSign" -import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit" -import useToast from "hooks/useToast" import { UserAddress } from "types" type EditPrimaryAddressData = { @@ -11,8 +11,8 @@ type EditPrimaryAddressData = { } const useEditPrimaryAddress = () => { - const showErrorToast = useShowErrorToast() - const toast = useToast() + const { toast } = useToast() + const showErrorToast = useErrorToast() const { mutate: mutateUser, id: userId } = useUser() const fetcherWithSign = useFetcherWithSign() @@ -47,7 +47,7 @@ const useEditPrimaryAddress = () => { toast({ title: "Primary address updated!", - status: "success", + variant: "success", }) }, onError: (error) => showErrorToast(error), diff --git a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useLinkVaults.ts b/src/v2/components/Account/components/AccountModal/hooks/useLinkVaults.ts similarity index 85% rename from src/components/common/Layout/components/Account/components/AccountModal/hooks/useLinkVaults.ts rename to src/v2/components/Account/components/AccountModal/hooks/useLinkVaults.ts index 887f98b248..b13070f3da 100644 --- a/src/components/common/Layout/components/Account/components/AccountModal/hooks/useLinkVaults.ts +++ b/src/v2/components/Account/components/AccountModal/hooks/useLinkVaults.ts @@ -1,11 +1,11 @@ +import { useToast } from "@/components/ui/hooks/useToast" import useUser from "components/[guild]/hooks/useUser" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" -import useToast from "hooks/useToast" import fetcher from "utils/fetcher" const useLinkVaults = () => { const { id, mutate } = useUser() - const toast = useToast() + const { toast } = useToast() return useSubmitWithSign( (signedPayload: SignedValidation) => @@ -13,7 +13,7 @@ const useLinkVaults = () => { { onSuccess: (newAddresses) => { toast({ - status: "success", + variant: "success", description: "Successfully linked Delegate.cash vaults!", }) mutate( diff --git a/src/v2/components/ui/Badge.tsx b/src/v2/components/ui/Badge.tsx index 2f72de2443..c5be4794ae 100644 --- a/src/v2/components/ui/Badge.tsx +++ b/src/v2/components/ui/Badge.tsx @@ -1,6 +1,6 @@ import { cn } from "@/lib/utils" import { cva, type VariantProps } from "class-variance-authority" -import { HTMLAttributes } from "react" +import { ElementRef, forwardRef, HTMLAttributes } from "react" const badgeVariants = cva( "inline-flex items-center rounded-md border-2 px-2 transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", @@ -30,10 +30,14 @@ export interface BadgeProps extends HTMLAttributes, VariantProps {} -function Badge({ className, variant, size, ...props }: BadgeProps) { - return ( -
    +const Badge = forwardRef, BadgeProps>( + ({ className, variant, size, ...props }, ref) => ( +
    ) -} +) export { Badge, badgeVariants } diff --git a/src/v2/components/ui/Button.tsx b/src/v2/components/ui/Button.tsx index 6628624342..d26c37765b 100644 --- a/src/v2/components/ui/Button.tsx +++ b/src/v2/components/ui/Button.tsx @@ -7,7 +7,7 @@ import { CircleNotch } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" const buttonVariants = cva( - "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 rounded-xl text-base", + "font-medium inline-flex items-center justify-center whitespace-nowrap rounded-xl transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 rounded-xl text-base min-w-max", { variants: { variant: { diff --git a/src/v2/components/ui/DropdownMenu.tsx b/src/v2/components/ui/DropdownMenu.tsx index 71a8be6276..ebad4d3a7c 100644 --- a/src/v2/components/ui/DropdownMenu.tsx +++ b/src/v2/components/ui/DropdownMenu.tsx @@ -86,7 +86,7 @@ const DropdownMenuItem = forwardRef< Date: Mon, 8 Jul 2024 23:07:44 +0200 Subject: [PATCH 058/110] feat: `WalletLinkHelperModal` migration --- .../components/AccountModal/AccountModal.tsx | 6 +- .../components/AccountConnections.tsx | 4 +- .../WalletLinkHelperModal.tsx | 78 ++++++++++--------- .../Web3ConnectionManager.tsx | 3 +- 4 files changed, 46 insertions(+), 45 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 0343aa4e97..109dab4718 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -111,11 +111,7 @@ const AccountModal = () => { )} ) : ( - {CHAIN_CONFIG[Chains[chainId]].name} + Fuel )}
    { title="Linked addresses" className="gap-3 pt-4" titleRightElement={ - addresses.length > 1 ? ( + addresses?.length > 1 ? (
    @@ -83,7 +83,7 @@ const AccountConnections = () => { {isLoading ? ( - ) : !(addresses.length > 1) ? ( + ) : !(addresses?.length > 1) ? (
    { const [isWalletLinkHelperModalOpen, setIsWalletLinkModalOpen] = useAtom( walletLinkHelperModalAtom ) - const onClose = () => setIsWalletLinkModalOpen(false) - return ( - - - - - Link address - - - Please switch to the account you want to link and connect with it in your - wallet! - - - - - - - - - + + + + Link address + + +

    + Please switch to the account you want to link and connect with it in your + wallet! +

    +
    + +
    + +
    +
    + OR +
    +
    + + + +
    +
    ) } export default WalletLinkHelperModal diff --git a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx index c3473924da..54794132d4 100644 --- a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx +++ b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx @@ -2,6 +2,7 @@ import useAutoReconnect from "@/hooks/useAutoReconnect" import { useAtom } from "jotai" import { walletSelectorModalAtom } from "../Providers/atoms" import { useTriggerWalletSelectorModal } from "./hooks/useTriggerWalletSelectorModal" +import WalletLinkHelperModal from "./WalletLinkHelperModal" import WalletSelectorModal from "./WalletSelectorModal" export function Web3ConnectionManagerBase() { @@ -21,8 +22,8 @@ export function Web3ConnectionManagerBase() { onOpen={() => setIsWalletSelectorModalOpen(true)} onClose={() => setIsWalletSelectorModalOpen(false)} /> - {/* + {/* */} ) From 714577477a51cfdb84cdc506ddf96158755427ca Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 06:43:25 +0200 Subject: [PATCH 059/110] feat: `UsersGuildPins` migration --- src/app/globals.css | 40 ++++++++ .../components/buttons/MintGuildPinButton.tsx | 2 +- .../GuildCheckout/hooks/useMintGuildPin.tsx | 2 +- .../UsersGuildCredentials/GuildPin.tsx | 59 ----------- .../GuildPinSkeleton.tsx | 20 ---- .../UsersGuildCredentials/UsersGuildPins.tsx | 62 ------------ .../components/UsersGuildCredentials/index.ts | 3 - .../PinLeaderboardUsersPositionCard.tsx | 2 +- src/theme/custom-scrollbar.css | 36 ------- .../components/AccountModal/AccountModal.tsx | 5 +- .../components/AccountConnections.tsx | 2 +- .../components/UsersGuildPins.tsx | 98 +++++++++++++++++++ src/v2/components/ui/Skeleton.tsx | 1 + src/{ => v2}/hooks/useUsersGuildPins.ts | 0 14 files changed, 146 insertions(+), 186 deletions(-) delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPinSkeleton.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx delete mode 100644 src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/index.ts delete mode 100644 src/theme/custom-scrollbar.css create mode 100644 src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx rename src/{ => v2}/hooks/useUsersGuildPins.ts (100%) diff --git a/src/app/globals.css b/src/app/globals.css index 5f4cbc5035..98c42308b9 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -166,3 +166,43 @@ @apply min-h-screen bg-background font-sans text-foreground; } } + +/* Copy-pasted from custom-scrollbar.css just so we can use it everywhere */ +@layer utilities { + .custom-scrollbar::-webkit-scrollbar, + .custom-menu-list > div::-webkit-scrollbar { + width: 8px; + height: 8px; + border-radius: 4px; + } + + .custom-scrollbar::-webkit-scrollbar-track, + .custom-menu-list > div::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); + border-radius: 4px; + } + + .custom-scrollbar::-webkit-scrollbar-thumb, + .custom-menu-list > div::-webkit-scrollbar-thumb { + border-radius: 4px; + background: rgba(0, 0, 0, 0.4); + } + + .invisible-scrollbar::-webkit-scrollbar, + .invisible-menu-list > div::-webkit-scrollbar { + width: 0; + height: 0; + } + + .invisible-scrollbar::-webkit-scrollbar-track, + .invisible-menu-list > div::-webkit-scrollbar-track { + width: 0; + height: 0; + } + + .invisible-scrollbar::-webkit-scrollbar-thumb, + .invisible-menu-list > div::-webkit-scrollbar-thumb { + width: 0; + height: 0; + } +} diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx index cc5225cde0..cc79c4c5f6 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/components/buttons/MintGuildPinButton.tsx @@ -1,7 +1,7 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import useUsersGuildPins from "@/hooks/useUsersGuildPins" import useGuild from "components/[guild]/hooks/useGuild" import Button from "components/common/Button" -import useUsersGuildPins from "hooks/useUsersGuildPins" import { useAccount, useBalance } from "wagmi" import { Chains } from "wagmiConfig/chains" import { useMintGuildPinContext } from "../../MintGuildPinContext" diff --git a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx index 7b6bb46098..9166b6fc26 100644 --- a/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx +++ b/src/components/[guild]/Requirements/components/GuildCheckout/hooks/useMintGuildPin.tsx @@ -2,13 +2,13 @@ import { isUserRejectedError, usePostHogContext, } from "@/components/Providers/PostHogProvider" +import useUsersGuildPins from "@/hooks/useUsersGuildPins" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" import useGuild from "components/[guild]/hooks/useGuild" import { env } from "env" import useShowErrorToast from "hooks/useShowErrorToast" import useSubmit from "hooks/useSubmit" import { useToastWithTweetButton } from "hooks/useToast" -import useUsersGuildPins from "hooks/useUsersGuildPins" import { useState } from "react" import guildPinAbi from "static/abis/guildPin" import { GuildPinMetadata } from "types" diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx deleted file mode 100644 index 7c1ebfc8a8..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPin.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { accountModalAtom } from "@/components/Providers/atoms" -import { Link } from "@chakra-ui/next-js" -import { Card, Circle, Img, Tag, useColorModeValue } from "@chakra-ui/react" -import { useSetAtom } from "jotai" - -type Props = { - name: string - image: string - guild: string - rank: string -} - -const GuildPin = ({ name, image, guild, rank }: Props) => { - const borderColor = useColorModeValue("white", "gray.700") - const tagBgColor = useColorModeValue("gray.100", "whiteAlpha.300") - - const setIsAccountModalOpen = useSetAtom(accountModalAtom) - - return ( - setIsAccountModalOpen(false)} - > - - {name} - - - #{rank} - - - - - ) -} - -export default GuildPin diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPinSkeleton.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPinSkeleton.tsx deleted file mode 100644 index bb1561194a..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/GuildPinSkeleton.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Circle, SkeletonCircle, useColorModeValue } from "@chakra-ui/react" - -const GuildPinSkeleton = () => { - const borderAndBgColor = useColorModeValue("white", "gray.700") - return ( - - - - ) -} - -export default GuildPinSkeleton diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx deleted file mode 100644 index 52b11bbb5f..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/UsersGuildPins.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { AccountSectionTitle } from "@/components/Account/components/AccountModal/components/AccountSection" -import { accountModalAtom } from "@/components/Providers/atoms" -import { Alert, AlertIcon, Box, Flex, Text } from "@chakra-ui/react" -import useUsersGuildPins from "hooks/useUsersGuildPins" -import { useAtomValue } from "jotai" -import GuildPin from "./GuildPin" -import GuildPinSkeleton from "./GuildPinSkeleton" - -const UsersGuildPins = () => { - const isAccountModalOpen = useAtomValue(accountModalAtom) - const { data, error, isValidating } = useUsersGuildPins(!isAccountModalOpen) - - return ( - <> - - - {error && ( - <> - - There was an error while fetching your pins, some may not - be visible. - - - )} - - - {isValidating ? ( - [...Array(3)].map((_, i) => ) - ) : data?.length ? ( - data.map((pin) => ( - attribute.trait_type === "guildId") - .value.toString()} - rank={pin.attributes - .find((attribute) => attribute.trait_type === "rank") - .value.toString()} - /> - )) - ) : ( - You haven't minted any Guild Pins yet - )} - - - - ) -} - -export default UsersGuildPins diff --git a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/index.ts b/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/index.ts deleted file mode 100644 index 1dee7b1c87..0000000000 --- a/src/components/common/Layout/components/Account/components/AccountModal/components/UsersGuildCredentials/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import UsersGuildPins from "./UsersGuildPins" - -export default UsersGuildPins diff --git a/src/components/leaderboard/PinLeaderboardUsersPositionCard.tsx b/src/components/leaderboard/PinLeaderboardUsersPositionCard.tsx index acc9a6cf02..1336fcf952 100644 --- a/src/components/leaderboard/PinLeaderboardUsersPositionCard.tsx +++ b/src/components/leaderboard/PinLeaderboardUsersPositionCard.tsx @@ -1,5 +1,5 @@ +import useUsersGuildPins from "@/hooks/useUsersGuildPins" import CardMotionWrapper from "components/common/CardMotionWrapper" -import useUsersGuildPins from "hooks/useUsersGuildPins" import { useAccount } from "wagmi" import PinLeaderboardUserCard, { PinLeaderboardUserCardSkeleton, diff --git a/src/theme/custom-scrollbar.css b/src/theme/custom-scrollbar.css deleted file mode 100644 index b1fa465586..0000000000 --- a/src/theme/custom-scrollbar.css +++ /dev/null @@ -1,36 +0,0 @@ -.custom-scrollbar::-webkit-scrollbar, -.custom-menu-list > div::-webkit-scrollbar { - width: 8px; - height: 8px; - border-radius: 4px; -} - -.custom-scrollbar::-webkit-scrollbar-track, -.custom-menu-list > div::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.1); - border-radius: 4px; -} - -.custom-scrollbar::-webkit-scrollbar-thumb, -.custom-menu-list > div::-webkit-scrollbar-thumb { - border-radius: 4px; - background: rgba(0, 0, 0, 0.4); -} - -.invisible-scrollbar::-webkit-scrollbar, -.invisible-menu-list > div::-webkit-scrollbar { - width: 0; - height: 0; -} - -.invisible-scrollbar::-webkit-scrollbar-track, -.invisible-menu-list > div::-webkit-scrollbar-track { - width: 0; - height: 0; -} - -.invisible-scrollbar::-webkit-scrollbar-thumb, -.invisible-menu-list > div::-webkit-scrollbar-thumb { - width: 0; - height: 0; -} diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 109dab4718..d1f8d85fc4 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -27,6 +27,7 @@ import { useAccount } from "wagmi" import { CHAIN_CONFIG, Chains } from "wagmiConfig/chains" import NetworkModal from "../NetworkModal" import { AccountConnections } from "./components/AccountConnections" +import { UsersGuildPins } from "./components/UsersGuildPins" const AccountModal = () => { const { address, disconnect, type } = useWeb3ConnectionManager() @@ -141,8 +142,8 @@ const AccountModal = () => {
    - {/*
    */} - {/*TODO: */} +
    + ) : (

    Not connected

    diff --git a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx index ffe279c657..5c17837fe0 100644 --- a/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx +++ b/src/v2/components/Account/components/AccountModal/components/AccountConnections.tsx @@ -60,7 +60,7 @@ const AccountConnections = () => { 1 ? (
    diff --git a/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx b/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx new file mode 100644 index 0000000000..39603946dd --- /dev/null +++ b/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx @@ -0,0 +1,98 @@ +import { AccountSectionTitle } from "@/components/Account/components/AccountModal/components/AccountSection" +import { accountModalAtom } from "@/components/Providers/atoms" +import { Badge } from "@/components/ui/Badge" +import { Skeleton } from "@/components/ui/Skeleton" +import useUsersGuildPins from "@/hooks/useUsersGuildPins" +import { useAtomValue, useSetAtom } from "jotai" +import Link from "next/link" + +const UsersGuildPins = () => { + const isAccountModalOpen = useAtomValue(accountModalAtom) + const { data, error, isValidating } = useUsersGuildPins(!isAccountModalOpen) + + return ( + <> + + + {/* TODO: custom Error component */} + {/* {error && ( + <> + + There was an error while fetching your pins, some may not + be visible. + + + )} */} + +
    +
    + {!isValidating ? ( + [...Array(3)].map((_, i) => ) + ) : data?.length ? ( + data.map((pin) => ( + attribute.trait_type === "guildId") + .value.toString()} + rank={pin.attributes + .find((attribute) => attribute.trait_type === "rank") + .value.toString()} + /> + )) + ) : ( +

    You haven't minted any Guild Pins yet

    + )} +
    +
    + + ) +} + +const GuildPin = ({ + name, + image, + guild, + rank, +}: { + name: string + image: string + guild: string + rank: string +}) => { + const setIsAccountModalOpen = useSetAtom(accountModalAtom) + + return ( + setIsAccountModalOpen(false)} + className="peer -ml-10 transition-transform first:ml-0 hover:scale-105 peer-hover:translate-x-8" + > +
    + {name} + +
    + + #{rank} + +
    +
    + + ) +} + +const GuildPinSkeleton = () => ( +
    + +
    +) + +export { UsersGuildPins } diff --git a/src/v2/components/ui/Skeleton.tsx b/src/v2/components/ui/Skeleton.tsx index 15abbb8beb..0349a01163 100644 --- a/src/v2/components/ui/Skeleton.tsx +++ b/src/v2/components/ui/Skeleton.tsx @@ -2,6 +2,7 @@ import { cn } from "@/lib/utils" function Skeleton({ className, ...props }: React.HTMLAttributes) { return ( + // TODO: bg-muted is not usable here, because it is white in light mode...
    ) } diff --git a/src/hooks/useUsersGuildPins.ts b/src/v2/hooks/useUsersGuildPins.ts similarity index 100% rename from src/hooks/useUsersGuildPins.ts rename to src/v2/hooks/useUsersGuildPins.ts From bef6bab07bb4b1b8e9a5c091813e1ad1ba26e892 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 06:57:39 +0200 Subject: [PATCH 060/110] fix(UsersGuildPins): `isValidating` logic --- .../components/AccountModal/components/UsersGuildPins.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx b/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx index 39603946dd..b974121674 100644 --- a/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx +++ b/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx @@ -32,7 +32,7 @@ const UsersGuildPins = () => { }} >
    - {!isValidating ? ( + {isValidating ? ( [...Array(3)].map((_, i) => ) ) : data?.length ? ( data.map((pin) => ( From 3020797db523e97807b1edad7d2a4a84ab1fbbfd Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 07:04:07 +0200 Subject: [PATCH 061/110] fix(_app): remove custom-scrollbar.css import --- src/pages/_app.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 66e394f99b..309a9cfa2d 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -17,7 +17,6 @@ import dynamic from "next/dynamic" import { useRouter } from "next/router" import { useEffect, useState } from "react" import { SWRConfig } from "swr" -import "theme/custom-scrollbar.css" import { fetcherForSWR } from "utils/fetcher" import { shouldUseReCAPTCHAAtom } from "utils/recaptcha" import { WagmiProvider } from "wagmi" From 7b67cd1ed643b24b86c62348e134a9b111002350 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 07:17:34 +0200 Subject: [PATCH 062/110] patch package-lock --- package-lock.json | 120 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/package-lock.json b/package-lock.json index c35e59f73d..7f8775ea18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6349,6 +6349,126 @@ "node": ">= 10" } }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@noble/curves": { "version": "1.4.2", "license": "MIT", From e474aa4c79ef2bdd1387dd7f3e4106bdb1e26c05 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 07:32:23 +0200 Subject: [PATCH 063/110] fix(playground): remove Section component --- src/app/playground/page.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/playground/page.tsx b/src/app/playground/page.tsx index 87e64535d2..02def4ad33 100644 --- a/src/app/playground/page.tsx +++ b/src/app/playground/page.tsx @@ -1,5 +1,4 @@ import { Header } from "@/components/Header" -import Section from "components/common/Section" import { Metadata } from "next" import { FormExample } from "./_components/FormExample" @@ -16,9 +15,7 @@ export default function Page() {
    -
    - -
    +
    ) } From c938a8d1aadd1f1103699e1f994b9a77e7c0a0a9 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 07:33:18 +0200 Subject: [PATCH 064/110] chore(playground): remove FormExample --- .../playground/_components/FormExample.tsx | 57 ------------------- src/app/playground/page.tsx | 3 - 2 files changed, 60 deletions(-) delete mode 100644 src/app/playground/_components/FormExample.tsx diff --git a/src/app/playground/_components/FormExample.tsx b/src/app/playground/_components/FormExample.tsx deleted file mode 100644 index fa85f121ad..0000000000 --- a/src/app/playground/_components/FormExample.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client" -import { Button } from "@/components/ui/Button" -import { - FormControl, - FormDescription, - FormErrorMessage, - FormField, - FormItem, - FormLabel, -} from "@/components/ui/Form" -import { Input } from "@/components/ui/Input" -import { zodResolver } from "@hookform/resolvers/zod" -import { FormProvider, useForm } from "react-hook-form" -import { z } from "zod" - -const formSchema = z.object({ - username: z.string().min(2).max(50), -}) - -export function FormExample() { - // 1. Define your form. - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: { - username: "", - }, - }) - - // 2. Define a submit handler. - function onSubmit(values: z.infer) { - // Do something with the form values. - // ✅ This will be type-safe and validated. - console.log(values) - } - - return ( - -
    - ( - - Username - - - - This is your public display name. - - - )} - /> - - -
    - ) -} diff --git a/src/app/playground/page.tsx b/src/app/playground/page.tsx index 02def4ad33..477cfaf990 100644 --- a/src/app/playground/page.tsx +++ b/src/app/playground/page.tsx @@ -1,6 +1,5 @@ import { Header } from "@/components/Header" import { Metadata } from "next" -import { FormExample } from "./_components/FormExample" export const metadata: Metadata = { title: "Playground", @@ -14,8 +13,6 @@ export default function Page() {
    - -
    ) } From 77231a2c6c28a828f8d2e6e493c26421f0842880 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 07:36:54 +0200 Subject: [PATCH 065/110] cleanup: remove unused `GoogleTerms` component --- .../components/GoogleTerms.tsx | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleTerms.tsx diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleTerms.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleTerms.tsx deleted file mode 100644 index 7a2f32d1b0..0000000000 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleTerms.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Link } from "@chakra-ui/next-js" -import { Text } from "@chakra-ui/react" - -const GoogleTerms = () => ( - - This site is protected by reCAPTCHA, so the Google{" "} - - Privacy Policy - {" "} - and{" "} - - Terms of Service - {" "} - apply - -) - -export default GoogleTerms From b8c1c4bb62804bd079eba4f07d03682b8cd3fdfc Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 07:57:40 +0200 Subject: [PATCH 066/110] feat: migrate the `Error` component --- .../JoinModal/utils/processDiscordError.ts | 2 +- .../utils/processJoinPlatformError.ts | 2 +- src/components/common/Error.tsx | 63 ------------------- src/utils/processWalletError.ts | 2 +- .../AccountModal/components/EmailAddress.tsx | 16 ++--- .../AccountModal/utils/processEmailError.ts | 2 +- src/v2/components/Error.tsx | 50 +++++++++++++++ .../WalletSelectorModal.tsx | 24 +++---- .../utils/processConnectionError.ts | 2 +- .../Web3ConnectionManager.tsx | 1 - 10 files changed, 75 insertions(+), 89 deletions(-) delete mode 100644 src/components/common/Error.tsx create mode 100644 src/v2/components/Error.tsx diff --git a/src/components/[guild]/JoinModal/utils/processDiscordError.ts b/src/components/[guild]/JoinModal/utils/processDiscordError.ts index bebc6430be..3eb5d73d37 100644 --- a/src/components/[guild]/JoinModal/utils/processDiscordError.ts +++ b/src/components/[guild]/JoinModal/utils/processDiscordError.ts @@ -1,4 +1,4 @@ -import { ErrorInfo } from "components/common/Error" +import { ErrorInfo } from "@/components/Error" import { DiscordError } from "types" import capitalize from "utils/capitalize" diff --git a/src/components/[guild]/JoinModal/utils/processJoinPlatformError.ts b/src/components/[guild]/JoinModal/utils/processJoinPlatformError.ts index 76c0d42954..9370e77982 100644 --- a/src/components/[guild]/JoinModal/utils/processJoinPlatformError.ts +++ b/src/components/[guild]/JoinModal/utils/processJoinPlatformError.ts @@ -1,4 +1,4 @@ -import { ErrorInfo } from "components/common/Error" +import { ErrorInfo } from "@/components/Error" import { DiscordError, WalletError } from "types" import processWalletError from "utils/processWalletError" import processConnectorError from "./processConnectorError" diff --git a/src/components/common/Error.tsx b/src/components/common/Error.tsx deleted file mode 100644 index 21b9f1a3d5..0000000000 --- a/src/components/common/Error.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { - Alert, - AlertDescription, - AlertIcon, - AlertTitle, - Box, - Collapse, - Stack, -} from "@chakra-ui/react" -import { PropsWithChildren, useEffect, useState } from "react" - -type ErrorInfo = { - title: string - description: string -} - -type Props = { - error: ErrorType - processError: (error: ErrorType) => ErrorInfo -} - -// tailing comma for generics to sidestep the JSX ambiguity -const Error = ({ - error, - processError, - children, -}: PropsWithChildren>): JSX.Element => { - const [state, setState] = useState({ title: "", description: "" }) - - // delay the open of the Collapse from when the error has changed, - // so it fetches the content height correctly - const [delayedShow, setDelayedShow] = useState(!!error) - - useEffect(() => { - if (!error) { - setDelayedShow(false) - return - } - - setTimeout(() => setDelayedShow(true), 100) - - const newState = processError(error) - setState(newState) - }, [error, processError]) - - return ( - - - - - {state.title} - - {state.description} - - {children && {children}} - - - - ) -} - -export { Error } -export type { ErrorInfo } diff --git a/src/utils/processWalletError.ts b/src/utils/processWalletError.ts index e0ab9e23c2..aac51690e3 100644 --- a/src/utils/processWalletError.ts +++ b/src/utils/processWalletError.ts @@ -1,4 +1,4 @@ -import { ErrorInfo } from "components/common/Error" +import { ErrorInfo } from "@/components/Error" import type { WalletError } from "types" const processWalletError = (error: WalletError): ErrorInfo => { diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index 826ded8835..cc9b1fb54f 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -1,6 +1,4 @@ -import useUser from "components/[guild]/hooks/useUser" -import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" -// import { Error } from "components/common/Error" +import { Error } from "@/components/Error" import { Button, ButtonProps } from "@/components/ui/Button" import { Collapse } from "@/components/ui/Collapse" import { @@ -30,6 +28,8 @@ import { useDisclosure } from "@/hooks/useDisclosure" import { cn } from "@/lib/utils" import { zodResolver } from "@hookform/resolvers/zod" import { PencilSimple, Warning } from "@phosphor-icons/react/dist/ssr" +import useUser from "components/[guild]/hooks/useUser" +import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import useToast from "hooks/useToast" import { useEffect, useState } from "react" @@ -38,6 +38,7 @@ import { emailData } from "rewards/Email/data" import fetcher from "utils/fetcher" import { z } from "zod" import { useDisconnectEmail } from "../hooks/useDisconnect" +import processEmailError from "../utils/processEmailError" import { DisconnectAccountButton } from "./DisconnectAccountButton" import { SocialAccountUI } from "./SocialAccount" @@ -181,11 +182,10 @@ const ConnectEmailButton = ({ - {/* TODO: Error component */} - {/* */} + = { + error: ErrorType + processError: (error: ErrorType) => ErrorInfo +} + +// tailing comma for generics to sidestep the JSX ambiguity +const Error = ({ + error, + processError, +}: PropsWithChildren>): JSX.Element => { + const [state, setState] = useState({ title: "", description: "" }) + + useEffect(() => { + if (!error) { + setState({ title: "", description: "" }) + return + } + + const newState = processError(error) + setState(newState) + }, [error, processError]) + + return ( + +
    + + +
    +

    {state.title}

    +

    {state.description}

    +
    +
    +
    + ) +} + +export { Error } +export type { ErrorInfo } diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index e033b5d011..1be1ba356b 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -1,3 +1,10 @@ +import { Error as ErrorComponent } from "@/components/Error" +import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { + addressLinkParamsAtom, + walletLinkHelperModalAtom, +} from "@/components/Providers/atoms" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Button } from "@/components/ui/Button" import { Dialog, @@ -7,18 +14,11 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/Dialog" +import { useErrorToast } from "@/components/ui/hooks/useErrorToast" import { usePrevious } from "@/hooks/usePrevious" import { useUserPublic } from "@/hooks/useUserPublic" -import useSetKeyPair from "hooks/useSetKeyPair" -// import useShowErrorToast from "hooks/useShowErrorToast" -import { usePostHogContext } from "@/components/Providers/PostHogProvider" -import { - addressLinkParamsAtom, - walletLinkHelperModalAtom, -} from "@/components/Providers/atoms" -import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" -import { useErrorToast } from "@/components/ui/hooks/useErrorToast" import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" +import useSetKeyPair from "hooks/useSetKeyPair" import { useAtom, useSetAtom } from "jotai" import Link from "next/link" import { useEffect } from "react" @@ -29,6 +29,7 @@ import ConnectorButton from "./components/ConnectorButton" import FuelConnectorButtons from "./components/FuelConnectorButtons" import useIsWalletConnectModalActive from "./hooks/useIsWalletConnectModalActive" import useLinkAddress from "./hooks/useLinkAddress" +import processConnectionError from "./utils/processConnectionError" type Props = { isOpen: boolean @@ -141,8 +142,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { - {/* TODO: generate & customize an Alert component & use it in the Error component */} - {/* { }, } : { error, processError: processConnectionError })} - /> */} + /> {shouldShowVerify && (

    diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/utils/processConnectionError.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/utils/processConnectionError.ts index d5f8b02bc6..8fd351baa3 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/utils/processConnectionError.ts +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/utils/processConnectionError.ts @@ -1,5 +1,5 @@ +import { ErrorInfo } from "@/components/Error" import Bugsnag from "@bugsnag/js" -import { ErrorInfo } from "components/common/Error" import { WalletError } from "types" const processConnectionError = (error: WalletError & Error): ErrorInfo => { diff --git a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx index 54794132d4..290640f7e1 100644 --- a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx +++ b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx @@ -14,7 +14,6 @@ export function Web3ConnectionManagerBase() { // TODO // useConnectFromLocalStorage() - // TODO return ( <> Date: Tue, 9 Jul 2024 08:01:35 +0200 Subject: [PATCH 067/110] cleanup(LinkedAddress): remove unused legacy code --- .../AccountModal/components/LinkedAddress.tsx | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx b/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx index 63be3996a1..0f4231d726 100644 --- a/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx @@ -109,48 +109,6 @@ const LinkedAddress = ({ addressData }: Props) => { {isPrimary && }

    - {/* Using a custom key here so the menu closes when we successfully set a new primary address */} - {/* - } - aria-label="Options" - rounded="full" - variant="ghost" - size="sm" - ml="auto !important" - /> - - {!isPrimary && ( - - ) : ( - - ) - } - onClick={() => - onEditPrimaryAddressSubmit({ - address, - isPrimary: true, - }) - } - > - Set as primary - - )} - } - color={removeMenuItemColor} - onClick={onOpen} - > - Disconnect - - - */} - ) : ( @@ -131,7 +131,7 @@ const AccountModal = () => { onClick={handleLogout} aria-label="Disconnect" > - + diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index cc9b1fb54f..7e88a2be9e 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -214,7 +214,7 @@ const ConnectEmailButton = ({ aria-label="Use different email address" onClick={differentEmail} > - +

    @@ -312,7 +312,10 @@ const ConnectEmailButton = ({ {emails?.pending ? ( <> {/* TODO: maybe move this out to a CSS variable? */} - + Verify ) : ( diff --git a/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx index ade082c41d..1d53976d44 100644 --- a/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx +++ b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx @@ -210,7 +210,7 @@ const ConnectFarcasterButton = ({ "Connect Farcaster" ) : ( <> - + Scan With your phone )} @@ -258,7 +258,7 @@ const ConnectFarcasterButton = ({ onRegenerate() }} > - + diff --git a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx index a72ff05136..b14d8baa45 100644 --- a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx +++ b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx @@ -12,7 +12,7 @@ import { UnorderedList, chakra, } from "@chakra-ui/react" -import { ArrowSquareOut } from "@phosphor-icons/react" +import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" import Button from "components/common/Button" import CopyableAddress from "components/common/CopyableAddress" diff --git a/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx b/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx index d83d24243f..6f7ee4f96f 100644 --- a/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletLinkHelperModal.tsx @@ -43,7 +43,7 @@ const WalletLinkHelperModal = () => { diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx index 1be1ba356b..a8685867d4 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/WalletSelectorModal.tsx @@ -256,7 +256,7 @@ const WalletSelectorModal = ({ isOpen, onClose }: Props): JSX.Element => { {"New to Ethereum wallets? "} {/* TODO: custom link component with generalised styles */} Learn more - +

    diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx index a1edeaa170..a4bbe55bf8 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx @@ -56,7 +56,7 @@ const ConnectorButton = ({ connector, pendingConnector, connect, error }: Props) {`${connectorName}

    ) : ( - + )} diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx index 8f1abebb6a..a0399a2654 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/components/ExportWaaSModal.tsx @@ -281,7 +281,9 @@ const ExportWaasModal = ({ isDisabled={hasCopied} colorScheme="white" borderWidth="2px" - leftIcon={hasCopied ? : } + leftIcon={ + hasCopied ? : + } > {hasCopied ? "Private key copied" : "Copy private key"} @@ -289,7 +291,7 @@ const ExportWaasModal = ({
    diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ExportCWaaSLink.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ExportCWaaSLink.tsx new file mode 100644 index 0000000000..2d558b27bd --- /dev/null +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ExportCWaaSLink.tsx @@ -0,0 +1,19 @@ +import { Badge } from "@/components/ui/Badge" +import { buttonVariants } from "@/components/ui/Button" +import Link from "next/link" +import { connectorButtonBaseProps } from "./ConnectorButton" + +const ExportCWaaSLink = () => ( + + {`Google + Google + + Deprecated + + +) + +export { ExportCWaaSLink } diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx index c438a75f83..f005928fbb 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/GoogleLoginButton.tsx @@ -1,6 +1,5 @@ -import { Center, Img, Tag, useDisclosure } from "@chakra-ui/react" +import { Center, Img, useDisclosure } from "@chakra-ui/react" import Button from "components/common/Button" -// import { connectorButtonProps } from "../ConnectorButton" import ExportWaaSModal from "./components/ExportWaaSModal" const GoogleLoginButton = () => { @@ -22,16 +21,10 @@ const GoogleLoginButton = () => { /> } - rightIcon={Deprecated} - // {...connectorButtonProps} - // sx={{ - // ...connectorButtonProps.sx, - // "> .chakra-button__icon:last-child": { - // marginLeft: "auto!important", - // }, - // }} + size="xl" + w="full" > - Google + Export Google wallet From 75ce13f34b9fa7d72c92d1ef56cf5c47c9244867 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:03:59 +0200 Subject: [PATCH 070/110] fix(next.config.js): add `CircularDependencyPlugin` --- next.config.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/next.config.js b/next.config.js index b2ac87456a..452d44f1ea 100644 --- a/next.config.js +++ b/next.config.js @@ -36,15 +36,15 @@ const nextConfig = { ) } - // config.plugins.push( - // new CircularDependencyPlugin({ - // exclude: /.next|node_modules/, - // include: /src/, - // // TODO: if all circular dependencies are resolved, set this argument to true - // failOnError: false, - // allowAsyncCycles: false, - // }) - // ) + config.plugins.push( + new CircularDependencyPlugin({ + exclude: /.next|node_modules/, + include: /src/, + // TODO: if all circular dependencies are resolved, set this argument to true + failOnError: false, + allowAsyncCycles: false, + }) + ) return config }, From 98068db6e546f39b216c5d8c8c1fa808be7c390f Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:06:37 +0200 Subject: [PATCH 071/110] fix: uncomment `useResolveAddress` hook usages --- src/v2/components/Account/Account.tsx | 5 ++--- .../Account/components/AccountModal/AccountModal.tsx | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/v2/components/Account/Account.tsx b/src/v2/components/Account/Account.tsx index 14aef5da46..d1f372eccf 100644 --- a/src/v2/components/Account/Account.tsx +++ b/src/v2/components/Account/Account.tsx @@ -4,6 +4,7 @@ import { cn } from "@/lib/utils" import { SignIn } from "@phosphor-icons/react/dist/ssr" import clsx from "clsx" import useUser from "components/[guild]/hooks/useUser" +import useResolveAddress from "hooks/useResolveAddress" import { useSetAtom } from "jotai" import shortenHex from "utils/shortenHex" import { GuildAvatar } from "../GuildAvatar" @@ -17,9 +18,7 @@ export const Account = () => { const setIsAccountModalOpen = useSetAtom(accountModalAtom) const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) - // const domainName = useResolveAddress(address) - // TODO - const domainName = "" + const domainName = useResolveAddress(address) const { addresses } = useUser() const linkedAddressesCount = (addresses?.length ?? 1) - 1 diff --git a/src/v2/components/Account/components/AccountModal/AccountModal.tsx b/src/v2/components/Account/components/AccountModal/AccountModal.tsx index 6188220c4c..ab2b55d428 100644 --- a/src/v2/components/Account/components/AccountModal/AccountModal.tsx +++ b/src/v2/components/Account/components/AccountModal/AccountModal.tsx @@ -28,6 +28,7 @@ import { CHAIN_CONFIG, Chains } from "wagmiConfig/chains" import NetworkModal from "../NetworkModal" import { AccountConnections } from "./components/AccountConnections" import { UsersGuildPins } from "./components/UsersGuildPins" +import useResolveAddress from "hooks/useResolveAddress" const AccountModal = () => { const { address, disconnect, type } = useWeb3ConnectionManager() @@ -39,8 +40,7 @@ const AccountModal = () => { const { deleteKeys } = useUserPublic() const { address: evmAddress, chainId } = useAccount() - const domain = "" // TODO - // const domain = useResolveAddress(evmAddress) + const domain = useResolveAddress(evmAddress) const { isOpen: isNetworkModalOpen, From 4ec5a5c9b4f503cd7ab86535c919114d93bf60cc Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:07:58 +0200 Subject: [PATCH 072/110] fix(Account): simplify conditional classNames --- src/v2/components/Account/Account.tsx | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/v2/components/Account/Account.tsx b/src/v2/components/Account/Account.tsx index d1f372eccf..3cc755f0b7 100644 --- a/src/v2/components/Account/Account.tsx +++ b/src/v2/components/Account/Account.tsx @@ -2,7 +2,6 @@ import { cn } from "@/lib/utils" import { SignIn } from "@phosphor-icons/react/dist/ssr" -import clsx from "clsx" import useUser from "components/[guild]/hooks/useUser" import useResolveAddress from "hooks/useResolveAddress" import { useSetAtom } from "jotai" @@ -38,13 +37,9 @@ export const Account = () => {
    0, - "font-bold": linkedAddressesCount > 0, - }) - )} + className={cn("text-base font-semibold", { + "text-sm font-bold": linkedAddressesCount > 0, + })} > {domainName || `${shortenHex(address, 3)}`} From 2fdda92ebf2771fce591b0c945d1c458f73c5bad Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:09:57 +0200 Subject: [PATCH 073/110] fix: don't use `clsx` inside `cn` calls --- .../Account/components/NetworkModal/NetworkButton.tsx | 10 +++------- src/v2/components/ui/Button.tsx | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx b/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx index 3c0469ce8b..365214f853 100644 --- a/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx +++ b/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx @@ -6,7 +6,6 @@ import { TooltipTrigger, } from "@/components/ui/Tooltip" import { cn } from "@/lib/utils" -import clsx from "clsx" import { useChainId } from "wagmi" import { CHAIN_CONFIG, Chain, Chains } from "wagmiConfig/chains" @@ -30,12 +29,9 @@ const NetworkButton = ({ chain, requestNetworkChange }: Props) => { onClick={requestNetworkChange} size="xl" variant="secondary" - className={cn( - "w-full justify-start gap-2", - clsx({ - "border-2": isCurrentChain, - }) - )} + className={cn("w-full justify-start gap-2", { + "border-2": isCurrentChain, + })} > ( {isLoading ? ( ) : null} {isLoading ? loadingText : children} From 6734294f4985d7da189243acba8f0f2833cbf0e5 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:12:47 +0200 Subject: [PATCH 074/110] fix(usePrevious): remove assertion --- src/v2/hooks/usePrevious.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v2/hooks/usePrevious.ts b/src/v2/hooks/usePrevious.ts index 645b89742b..cf1ff212c6 100644 --- a/src/v2/hooks/usePrevious.ts +++ b/src/v2/hooks/usePrevious.ts @@ -7,5 +7,5 @@ export function usePrevious(value: T) { ref.current = value }, [value]) - return ref.current as T + return ref.current } From c42e420e3a2fbfaf6905e01711958dc5b57fdc7b Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:14:35 +0200 Subject: [PATCH 075/110] fix(EmailAddress): better generic type for `emailSentAt` state --- .../components/AccountModal/components/EmailAddress.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index 7e88a2be9e..a0b87256de 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -94,7 +94,7 @@ const ConnectEmailButton = ({ const { id: userId } = useUser() const toast = useToast() - const [emailSentAt, setEmailSentAt] = useState(null) + const [emailSentAt, setEmailSentAt] = useState(null) const submitVerificationRequest = ( signedPayload: SignedValidation @@ -161,7 +161,7 @@ const ConnectEmailButton = ({ // Timer to decide if resend button is disabled const [dateNow, setDateNow] = useState(Date.now()) - const canResend = dateNow - emailSentAt > TIMEOUT + const canResend = !emailSentAt || dateNow - emailSentAt > TIMEOUT useEffect(() => { const interval = setInterval(() => setDateNow(Date.now()), TIMEOUT) return () => clearInterval(interval) From ab90fad8d9d13aa4eadc1cd906c87537e566148b Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:17:36 +0200 Subject: [PATCH 076/110] chore(NetworkButton): add comment about `img` --- .../Account/components/NetworkModal/NetworkButton.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx b/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx index 365214f853..839fa1f3b2 100644 --- a/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx +++ b/src/v2/components/Account/components/NetworkModal/NetworkButton.tsx @@ -33,6 +33,8 @@ const NetworkButton = ({ chain, requestNetworkChange }: Props) => { "border-2": isCurrentChain, })} > + {/* Most of these icons are SVGs or small PNGs, so we don't need to optimize them */} + {/* eslint-disable-next-line @next/next/no-img-element */} {`${CHAIN_CONFIG[chain].name} Date: Tue, 9 Jul 2024 09:21:42 +0200 Subject: [PATCH 077/110] fix(CopyableAddress): simplify className --- src/v2/components/CopyableAddress.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v2/components/CopyableAddress.tsx b/src/v2/components/CopyableAddress.tsx index 4cfef96aea..42b31073ea 100644 --- a/src/v2/components/CopyableAddress.tsx +++ b/src/v2/components/CopyableAddress.tsx @@ -40,7 +40,7 @@ const CopyableAddress = ({ }) } variant="unstyled" - className={cn("h-max !px-0 !py-0", className)} + className={cn("h-max p-0", className)} {...props} > {domain || shortenHex(address, decimals)} From e260e93664d338c87f01666bdd4aeae46c1cc4b0 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:23:14 +0200 Subject: [PATCH 078/110] fix(NavMenu): remove unnecessary boolean inversion --- src/v2/components/Header/NavMenu.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/v2/components/Header/NavMenu.tsx b/src/v2/components/Header/NavMenu.tsx index b2187b5cb8..3bb404b1fc 100644 --- a/src/v2/components/Header/NavMenu.tsx +++ b/src/v2/components/Header/NavMenu.tsx @@ -127,15 +127,15 @@ const NavButton = ({ href, children }: { href: string; children: ReactNode }) => const isExternal = href.startsWith("http") const wrapperProps = { href, - ...(!isExternal + ...(isExternal ? ({ - passHref: true, - legacyBehavior: true, - } satisfies Partial) - : ({ target: "_blank", rel: "noopener", - } satisfies AnchorHTMLAttributes)), + } satisfies AnchorHTMLAttributes) + : ({ + passHref: true, + legacyBehavior: true, + } satisfies Partial)), } const Wrapper = isExternal ? "a" : Link From c62f254e3b49811a1bec4e78983b7c5ab8f176b9 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 09:26:53 +0200 Subject: [PATCH 079/110] cleanup(ConnectorButton): use descriptive variable names --- .../WalletSelectorModal/components/ConnectorButton.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx index a4bbe55bf8..fb82fb897b 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/ConnectorButton.tsx @@ -36,6 +36,10 @@ const ConnectorButton = ({ connector, pendingConnector, connect, error }: Props) if (!connector) return null + const isCurrentConnectorPending = pendingConnector?.id === connector.id + const isCurrentConnectorActive = + isConnected && activeConnector?.id === connector.id + return (
    )} From cdcdac907c4c2f337447c82bb40bebe12513356c Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 10:06:54 +0200 Subject: [PATCH 086/110] feat: `IntercomProvider` migration --- .../AddRewardButton/hooks/useMutateCreatedRole.ts | 2 +- .../DeleteGuildButton/hooks/useDeleteGuild.ts | 2 +- .../[guild]/EditGuild/hooks/useEditGuild.ts | 2 +- .../[guild]/LeaveButton/hooks/useLeaveGuild.ts | 2 +- .../DeleteRoleButton/hooks/useDeleteRole.ts | 2 +- .../ActivityLogAction/components/GuildTag.tsx | 2 +- .../FilterTag/components/GuildSuggestions.tsx | 2 +- .../create-guild/hooks/useCreateGuild.tsx | 2 +- .../create-guild/hooks/useCreateRole.tsx | 2 +- src/components/explorer/YourGuilds.tsx | 12 +----------- src/pages/_app.tsx | 2 +- src/pages/_error.tsx | 2 +- src/pages/explorer.tsx | 3 ++- .../components/Providers}/IntercomProvider.tsx | 5 ++--- src/v2/components/Providers/Providers.tsx | 15 ++++++++------- src/v2/hooks/useYourGuilds.ts | 12 ++++++++++++ 16 files changed, 36 insertions(+), 33 deletions(-) rename src/{components/_app => v2/components/Providers}/IntercomProvider.tsx (95%) create mode 100644 src/v2/hooks/useYourGuilds.ts diff --git a/src/components/[guild]/AddRewardButton/hooks/useMutateCreatedRole.ts b/src/components/[guild]/AddRewardButton/hooks/useMutateCreatedRole.ts index 7bd78daa3d..3e7223b5d3 100644 --- a/src/components/[guild]/AddRewardButton/hooks/useMutateCreatedRole.ts +++ b/src/components/[guild]/AddRewardButton/hooks/useMutateCreatedRole.ts @@ -1,6 +1,6 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import useGuild from "components/[guild]/hooks/useGuild" import { mutateGuildsCache } from "components/create-guild/hooks/useCreateRole" -import { useYourGuilds } from "components/explorer/YourGuilds" import useMatchMutate from "hooks/useMatchMutate" import { GuildBase, GuildPlatform, Requirement, Role } from "types" import { CreateRolePlatformResponse } from "./useCreateRolePlatforms" diff --git a/src/components/[guild]/EditGuild/components/DeleteGuildButton/hooks/useDeleteGuild.ts b/src/components/[guild]/EditGuild/components/DeleteGuildButton/hooks/useDeleteGuild.ts index 54a6b47a7e..4f29302bec 100644 --- a/src/components/[guild]/EditGuild/components/DeleteGuildButton/hooks/useDeleteGuild.ts +++ b/src/components/[guild]/EditGuild/components/DeleteGuildButton/hooks/useDeleteGuild.ts @@ -1,5 +1,5 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import useGuild from "components/[guild]/hooks/useGuild" -import { useYourGuilds } from "components/explorer/YourGuilds" import useMatchMutate from "hooks/useMatchMutate" import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" diff --git a/src/components/[guild]/EditGuild/hooks/useEditGuild.ts b/src/components/[guild]/EditGuild/hooks/useEditGuild.ts index 4f559088f1..08938a1e7c 100644 --- a/src/components/[guild]/EditGuild/hooks/useEditGuild.ts +++ b/src/components/[guild]/EditGuild/hooks/useEditGuild.ts @@ -1,5 +1,5 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import useGuild from "components/[guild]/hooks/useGuild" -import { useYourGuilds } from "components/explorer/YourGuilds" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useMatchMutate from "hooks/useMatchMutate" import useShowErrorToast from "hooks/useShowErrorToast" diff --git a/src/components/[guild]/LeaveButton/hooks/useLeaveGuild.ts b/src/components/[guild]/LeaveButton/hooks/useLeaveGuild.ts index 3efc74b9f9..cf8f2ff0a4 100644 --- a/src/components/[guild]/LeaveButton/hooks/useLeaveGuild.ts +++ b/src/components/[guild]/LeaveButton/hooks/useLeaveGuild.ts @@ -1,5 +1,5 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import useGuild from "components/[guild]/hooks/useGuild" -import { useYourGuilds } from "components/explorer/YourGuilds" import useMembership from "components/explorer/hooks/useMembership" import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" diff --git a/src/components/[guild]/RoleCard/components/EditRole/components/DeleteRoleButton/hooks/useDeleteRole.ts b/src/components/[guild]/RoleCard/components/EditRole/components/DeleteRoleButton/hooks/useDeleteRole.ts index 37dab0e1fb..5a1a08efc6 100644 --- a/src/components/[guild]/RoleCard/components/EditRole/components/DeleteRoleButton/hooks/useDeleteRole.ts +++ b/src/components/[guild]/RoleCard/components/EditRole/components/DeleteRoleButton/hooks/useDeleteRole.ts @@ -1,5 +1,5 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import useGuild from "components/[guild]/hooks/useGuild" -import { useYourGuilds } from "components/explorer/YourGuilds" import useMatchMutate from "hooks/useMatchMutate" import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" diff --git a/src/components/[guild]/activity/ActivityLogAction/components/GuildTag.tsx b/src/components/[guild]/activity/ActivityLogAction/components/GuildTag.tsx index 42e995ff26..1419ff3ef2 100644 --- a/src/components/[guild]/activity/ActivityLogAction/components/GuildTag.tsx +++ b/src/components/[guild]/activity/ActivityLogAction/components/GuildTag.tsx @@ -1,3 +1,4 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import { Circle, forwardRef, @@ -10,7 +11,6 @@ import { useColorModeValue, } from "@chakra-ui/react" import { DotsThreeVertical, IconProps } from "@phosphor-icons/react" -import { useYourGuilds } from "components/explorer/YourGuilds" import { ForwardRefExoticComponent, RefAttributes } from "react" import { useActivityLog } from "../../ActivityLogContext" import ClickableTagPopover from "./ClickableTagPopover" diff --git a/src/components/[guild]/activity/ActivityLogFiltersBar/components/FilterTag/components/GuildSuggestions.tsx b/src/components/[guild]/activity/ActivityLogFiltersBar/components/FilterTag/components/GuildSuggestions.tsx index a1976b6bd9..47c194af6c 100644 --- a/src/components/[guild]/activity/ActivityLogFiltersBar/components/FilterTag/components/GuildSuggestions.tsx +++ b/src/components/[guild]/activity/ActivityLogFiltersBar/components/FilterTag/components/GuildSuggestions.tsx @@ -1,5 +1,5 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import * as combobox from "@zag-js/combobox" -import { useYourGuilds } from "components/explorer/YourGuilds" import GuildTag from "components/[guild]/activity/ActivityLogAction/components/GuildTag" import { HTMLAttributes } from "react" import { useActivityLogFilters } from "../../ActivityLogFiltersContext" diff --git a/src/components/create-guild/hooks/useCreateGuild.tsx b/src/components/create-guild/hooks/useCreateGuild.tsx index fde14205c0..feefdb0f04 100644 --- a/src/components/create-guild/hooks/useCreateGuild.tsx +++ b/src/components/create-guild/hooks/useCreateGuild.tsx @@ -1,8 +1,8 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useYourGuilds } from "@/hooks/useYourGuilds" import { Schemas } from "@guildxyz/types" import processConnectorError from "components/[guild]/JoinModal/utils/processConnectorError" import useJsConfetti from "components/create-guild/hooks/useJsConfetti" -import { useYourGuilds } from "components/explorer/YourGuilds" import useMatchMutate from "hooks/useMatchMutate" import useShowErrorToast from "hooks/useShowErrorToast" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" diff --git a/src/components/create-guild/hooks/useCreateRole.tsx b/src/components/create-guild/hooks/useCreateRole.tsx index fa34ab9754..b9530484d4 100644 --- a/src/components/create-guild/hooks/useCreateRole.tsx +++ b/src/components/create-guild/hooks/useCreateRole.tsx @@ -1,9 +1,9 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import { useYourGuilds } from "@/hooks/useYourGuilds" import processConnectorError from "components/[guild]/JoinModal/utils/processConnectorError" import useGuild from "components/[guild]/hooks/useGuild" import useRoleGroup from "components/[guild]/hooks/useRoleGroup" import useJsConfetti from "components/create-guild/hooks/useJsConfetti" -import { useYourGuilds } from "components/explorer/YourGuilds" import useCustomPosthogEvents from "hooks/useCustomPosthogEvents" import useMatchMutate from "hooks/useMatchMutate" import useShowErrorToast from "hooks/useShowErrorToast" diff --git a/src/components/explorer/YourGuilds.tsx b/src/components/explorer/YourGuilds.tsx index 5b51ea35d8..bc57728559 100644 --- a/src/components/explorer/YourGuilds.tsx +++ b/src/components/explorer/YourGuilds.tsx @@ -1,5 +1,6 @@ import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useYourGuilds } from "@/hooks/useYourGuilds" import { Box, HStack, Img, Stack, Text } from "@chakra-ui/react" import { Plus, SignIn } from "@phosphor-icons/react" import ActionCard from "components/common/ActionCard" @@ -7,19 +8,9 @@ import Button from "components/common/Button" import Card from "components/common/Card" import GuildCard, { GuildSkeletonCard } from "components/explorer/GuildCard" import GuildCardsGrid from "components/explorer/GuildCardsGrid" -import useSWRWithOptionalAuth from "hooks/useSWRWithOptionalAuth" import { useSetAtom } from "jotai" import Link from "next/link" import { forwardRef } from "react" -import { GuildBase } from "types" - -const useYourGuilds = () => - useSWRWithOptionalAuth( - `/v2/guilds?yours=true`, - undefined, - false, - true - ) const YourGuilds = forwardRef((_, ref: any) => { const { isWeb3Connected } = useWeb3ConnectionManager() @@ -91,5 +82,4 @@ const YourGuilds = forwardRef((_, ref: any) => { ) }) -export { useYourGuilds } export default YourGuilds diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 309a9cfa2d..56925d7fa5 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -5,7 +5,6 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { bugsnagStart } from "bugsnag" import AppErrorBoundary from "components/_app/AppErrorBoundary" import Chakra from "components/_app/Chakra" -import IntercomProvider from "components/_app/IntercomProvider" import ClientOnly from "components/common/ClientOnly" import { env } from "env" import { dystopian, inter } from "fonts" @@ -27,6 +26,7 @@ import "../app/globals.css" * https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inert#browser_compatibility */ import { AccountModal } from "@/components/Account/components/AccountModal" +import { IntercomProvider } from "@/components/Providers/IntercomProvider" import { LegacyPostHogProvider } from "components/_app/LegacyPostHogProvider" import { LegacyWeb3ConnectionManager } from "components/_app/LegacyWeb3ConnectionManager" import "wicg-inert" diff --git a/src/pages/_error.tsx b/src/pages/_error.tsx index 1712368bb7..090df84c04 100644 --- a/src/pages/_error.tsx +++ b/src/pages/_error.tsx @@ -1,6 +1,6 @@ +import { IntercomProvider } from "@/components/Providers/IntercomProvider" import { Flex, Heading, Icon, Stack } from "@chakra-ui/react" import { ChatCircle, House } from "@phosphor-icons/react" -import IntercomProvider from "components/_app/IntercomProvider" import Button from "components/common/Button" import Head from "next/head" import NotFoundIcon from "static/avatars/58.svg" diff --git a/src/pages/explorer.tsx b/src/pages/explorer.tsx index 257603c146..10a7d73c0c 100644 --- a/src/pages/explorer.tsx +++ b/src/pages/explorer.tsx @@ -1,3 +1,4 @@ +import { useYourGuilds } from "@/hooks/useYourGuilds" import { useBreakpointValue, useColorModeValue } from "@chakra-ui/react" import ClientOnly from "components/common/ClientOnly" import Layout from "components/common/Layout" @@ -5,7 +6,7 @@ import LinkPreviewHead from "components/common/LinkPreviewHead" import ExploreAllGuilds from "components/explorer/ExploreAllGuilds" import ExplorerTabs from "components/explorer/ExplorerTabs" import GoToCreateGuildButton from "components/explorer/GoToCreateGuildButton" -import YourGuilds, { useYourGuilds } from "components/explorer/YourGuilds" +import YourGuilds from "components/explorer/YourGuilds" import useScrollRestoration from "components/explorer/hooks/useScrollRestoration" import { atom, useAtom } from "jotai" import { GetStaticProps } from "next" diff --git a/src/components/_app/IntercomProvider.tsx b/src/v2/components/Providers/IntercomProvider.tsx similarity index 95% rename from src/components/_app/IntercomProvider.tsx rename to src/v2/components/Providers/IntercomProvider.tsx index 15440e6cdc..e413422cbb 100644 --- a/src/components/_app/IntercomProvider.tsx +++ b/src/v2/components/Providers/IntercomProvider.tsx @@ -1,7 +1,7 @@ import useConnectorNameAndIcon from "@/components/Web3ConnectionManager/hooks/useConnectorNameAndIcon" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" +import { useYourGuilds } from "@/hooks/useYourGuilds" import useUser from "components/[guild]/hooks/useUser" -import { useYourGuilds } from "components/explorer/YourGuilds" import { PropsWithChildren, useEffect, useRef, useState } from "react" import { Intercom, LiveChatLoaderProvider, useChat } from "react-live-chat-loader" import { addIntercomSettings } from "utils/intercom" @@ -90,5 +90,4 @@ const IntercomTrigger = (props: PropsWithChildren) => { return
    } -export default IntercomProvider -export { IntercomTrigger } +export { IntercomProvider, IntercomTrigger } diff --git a/src/v2/components/Providers/Providers.tsx b/src/v2/components/Providers/Providers.tsx index 6c6d128724..1317e2c9a5 100644 --- a/src/v2/components/Providers/Providers.tsx +++ b/src/v2/components/Providers/Providers.tsx @@ -12,6 +12,7 @@ import { wagmiConfig } from "wagmiConfig" import { AccountModal } from "../Account/components/AccountModal" import { Toaster } from "../ui/Toaster" import { Web3ConnectionManager } from "../Web3ConnectionManager" +import { IntercomProvider } from "./IntercomProvider" import { PostHogProvider } from "./PostHogProvider" const queryClient = new QueryClient() @@ -31,13 +32,13 @@ export function Providers({ children }: { children: React.ReactNode }) { - {/* TODO: */} - {children} - - - - - {/* */} + + {children} + + + + + diff --git a/src/v2/hooks/useYourGuilds.ts b/src/v2/hooks/useYourGuilds.ts new file mode 100644 index 0000000000..fac975c24b --- /dev/null +++ b/src/v2/hooks/useYourGuilds.ts @@ -0,0 +1,12 @@ +import useSWRWithOptionalAuth from "hooks/useSWRWithOptionalAuth" +import { GuildBase } from "types" + +const useYourGuilds = () => + useSWRWithOptionalAuth( + `/v2/guilds?yours=true`, + undefined, + false, + true + ) + +export { useYourGuilds } From bbbbcb9e3dbb588612e3009983d50112cba39a70 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 11:54:24 +0200 Subject: [PATCH 087/110] feat: `PlatformMergeErrorAlert` migration --- .../PlatformMergeErrorAlert.tsx | 136 +++++++++--------- .../Web3ConnectionManager.tsx | 4 +- 2 files changed, 66 insertions(+), 74 deletions(-) diff --git a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx index b14d8baa45..e1bb14ed3b 100644 --- a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx +++ b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx @@ -1,117 +1,109 @@ -import { Link } from "@chakra-ui/next-js" -import { - AlertDialogBody, - AlertDialogContent, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogOverlay, - Heading, - Icon, - ListItem, - Text, - UnorderedList, - chakra, -} from "@chakra-ui/react" import { ArrowSquareOut } from "@phosphor-icons/react/dist/ssr" import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" -import Button from "components/common/Button" -import CopyableAddress from "components/common/CopyableAddress" -import { Alert } from "components/common/Modal" -import useToast from "hooks/useToast" import { useAtom } from "jotai" -import { useRef } from "react" import rewards from "rewards" import capitalize from "utils/capitalize" import shortenHex from "utils/shortenHex" +import { CopyableAddress } from "../CopyableAddress" import { platformMergeAlertAtom } from "../Providers/atoms" +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "../ui/AlertDialog" +import { useToast } from "../ui/hooks/useToast" import { useWeb3ConnectionManager } from "./hooks/useWeb3ConnectionManager" const PlatformMergeErrorAlert = () => { const { address } = useWeb3ConnectionManager() - const toast = useToast() + const { toast } = useToast() const [state, setState] = useAtom(platformMergeAlertAtom) const { addressOrDomain, platformName } = state || {} - const onClose = () => setState(false) const socialAccountName = rewards[platformName]?.name ?? "social" const { onConnect, isLoading } = useConnectPlatform( platformName ?? "DISCORD", () => { toast({ - status: "success", + variant: "success", title: "Successful connect", description: `${capitalize( socialAccountName )} account successfully disconnected from old address, and connected to this one`, }) - onClose() + setState(false) }, undefined, undefined, true ) - const cancelRef = useRef(null) - return ( - - - - - {capitalize(socialAccountName)} account already connected - - - - This {socialAccountName} account is already connected to this address:{" "} - {addressOrDomain?.startsWith("0x") ? ( - - ) : ( - {addressOrDomain} - )} - - - You have two options to choose from: - - - - + <> + { + if (!open) setState(false) + }} + > + + + {`${capitalize(socialAccountName)} account already connected`} + + +
    +

    + This {socialAccountName} account is already connected to this address:{" "} + {addressOrDomain?.startsWith("0x") ? ( + + ) : ( + {addressOrDomain} + )} +

    + +

    You have two options to choose from:

    + +
      +
    • Switch to the address above and link your current address ( - + {address ? shortenHex(address) : ""} - - ) to it by following{" "} - + ) to it by following {/* TODO: blue link color */} + this guide - - - - - - + + +
    • + +
    • Continue connecting the account to the current address (it'll disconnect it from the above one, losing any accesses you had with that) - - - - - - - - - - +
    • +
    +
    + + + Cancel + {/* TODO: loading state */} + + Connect anyway + + +
    +
    + ) } -export default PlatformMergeErrorAlert +export { PlatformMergeErrorAlert } diff --git a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx index 290640f7e1..106afb07ed 100644 --- a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx +++ b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx @@ -2,6 +2,7 @@ import useAutoReconnect from "@/hooks/useAutoReconnect" import { useAtom } from "jotai" import { walletSelectorModalAtom } from "../Providers/atoms" import { useTriggerWalletSelectorModal } from "./hooks/useTriggerWalletSelectorModal" +import { PlatformMergeErrorAlert } from "./PlatformMergeErrorAlert" import WalletLinkHelperModal from "./WalletLinkHelperModal" import WalletSelectorModal from "./WalletSelectorModal" @@ -22,8 +23,7 @@ export function Web3ConnectionManagerBase() { onClose={() => setIsWalletSelectorModalOpen(false)} /> - {/* - */} + ) } From a9597708a2a2c271e63dcc00c11ef5c0298236cf Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 12:03:33 +0200 Subject: [PATCH 088/110] feat: `useConnectFromLocalStorage` migration --- src/pages/oauth.tsx | 2 +- .../components/GoogleLoginButton/hooks/useDriveOAuth.ts | 2 +- .../Web3ConnectionManager/Web3ConnectionManager.tsx | 4 ++-- .../hooks/useConnectFromLocalStorage.ts | 4 +--- .../[guild]/JoinModal => v2}/hooks/useOauthPopupWindow.ts | 7 ++++--- 5 files changed, 9 insertions(+), 10 deletions(-) rename src/{components/[guild]/JoinModal => v2}/hooks/useOauthPopupWindow.ts (94%) diff --git a/src/pages/oauth.tsx b/src/pages/oauth.tsx index b20e0c1621..b5bad86dea 100644 --- a/src/pages/oauth.tsx +++ b/src/pages/oauth.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { usePostHogContext } from "@/components/Providers/PostHogProvider" +import type { Message } from "@/hooks/useOauthPopupWindow" import AuthRedirect from "components/AuthRedirect" -import { Message } from "components/[guild]/JoinModal/hooks/useOauthPopupWindow" import useShowErrorToast from "hooks/useShowErrorToast" import { useRouter } from "next/dist/client/router" import { useCallback, useEffect } from "react" diff --git a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts index 587e2d6ae6..8e337c2bd7 100644 --- a/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts +++ b/src/v2/components/Web3ConnectionManager/WalletSelectorModal/components/GoogleLoginButton/hooks/useDriveOAuth.ts @@ -1,5 +1,5 @@ +import useOauthPopupWindow from "@/hooks/useOauthPopupWindow" import { env } from "env" -import useOauthPopupWindow from "components/[guild]/JoinModal/hooks/useOauthPopupWindow" const useDriveOAuth = () => useOauthPopupWindow<{ access_token: string }>( diff --git a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx index 106afb07ed..1c46291e1f 100644 --- a/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx +++ b/src/v2/components/Web3ConnectionManager/Web3ConnectionManager.tsx @@ -1,6 +1,7 @@ import useAutoReconnect from "@/hooks/useAutoReconnect" import { useAtom } from "jotai" import { walletSelectorModalAtom } from "../Providers/atoms" +import useConnectFromLocalStorage from "./hooks/useConnectFromLocalStorage" import { useTriggerWalletSelectorModal } from "./hooks/useTriggerWalletSelectorModal" import { PlatformMergeErrorAlert } from "./PlatformMergeErrorAlert" import WalletLinkHelperModal from "./WalletLinkHelperModal" @@ -12,8 +13,7 @@ export function Web3ConnectionManagerBase() { ) useAutoReconnect() - // TODO - // useConnectFromLocalStorage() + useConnectFromLocalStorage() return ( <> diff --git a/src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts b/src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts index f74610fbc9..d5b89d68e1 100644 --- a/src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts +++ b/src/v2/components/Web3ConnectionManager/hooks/useConnectFromLocalStorage.ts @@ -1,10 +1,8 @@ import { usePostHogContext } from "@/components/Providers/PostHogProvider" import { useToast } from "@/components/ui/hooks/useToast" +import type { Message } from "@/hooks/useOauthPopupWindow" import { useUserPublic } from "@/hooks/useUserPublic" -// TODO: move this hook inside its own file import { useConnect } from "components/[guild]/JoinModal/hooks/useConnectPlatform" -// TODO: move this out to a constants folder maybe? -import { Message } from "components/[guild]/JoinModal/hooks/useOauthPopupWindow" import useUser from "components/[guild]/hooks/useUser" import { useEffect } from "react" import rewards from "rewards" diff --git a/src/components/[guild]/JoinModal/hooks/useOauthPopupWindow.ts b/src/v2/hooks/useOauthPopupWindow.ts similarity index 94% rename from src/components/[guild]/JoinModal/hooks/useOauthPopupWindow.ts rename to src/v2/hooks/useOauthPopupWindow.ts index a6b2c28f2f..c04f29c5ef 100644 --- a/src/components/[guild]/JoinModal/hooks/useOauthPopupWindow.ts +++ b/src/v2/hooks/useOauthPopupWindow.ts @@ -1,5 +1,5 @@ +import { useToast } from "@/components/ui/hooks/useToast" import usePopupWindow from "hooks/usePopupWindow" -import useToast from "hooks/useToast" import randomBytes from "randombytes" import { useEffect, useState } from "react" import { OneOf, PlatformName } from "types" @@ -11,6 +11,7 @@ type OAuthData = { type OAuthError = { error: string; errorDescription: string } +// TODO: move this out to its own file? export type Message = OneOf< { type: "OAUTH_ERROR"; data: OAuthError }, { type: "OAUTH_SUCCESS"; data: any } @@ -29,7 +30,7 @@ const useOauthPopupWindow = ( ): OAuthState & { onOpen: () => Promise> } => { - const toast = useToast() + const { toast } = useToast() const redirectUri = typeof window !== "undefined" && @@ -121,7 +122,7 @@ const useOauthPopupWindow = ( const title = oauthState.error.error ?? "Unknown error" const errorDescription = oauthState.error.errorDescription ?? "" - toast({ status: "error", title, description: errorDescription }) + toast({ variant: "error", title, description: errorDescription }) // toast is left out on purpose, it causes the toast to be shown twice // eslint-disable-next-line react-hooks/exhaustive-deps From 5dbaa74a49403cc9afaa50ca0309d45bbcc05083 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 12:10:36 +0200 Subject: [PATCH 089/110] fix(_app): add `Toaster` --- src/pages/_app.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 56925d7fa5..a8fcba2a84 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -27,6 +27,7 @@ import "../app/globals.css" */ import { AccountModal } from "@/components/Account/components/AccountModal" import { IntercomProvider } from "@/components/Providers/IntercomProvider" +import { Toaster } from "@/components/ui/Toaster" import { LegacyPostHogProvider } from "components/_app/LegacyPostHogProvider" import { LegacyWeb3ConnectionManager } from "components/_app/LegacyWeb3ConnectionManager" import "wicg-inert" @@ -137,6 +138,8 @@ const App = ({ + + From ff53e240dfb61183df911bb8da8b3367817700e4 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 9 Jul 2024 19:53:59 +0200 Subject: [PATCH 090/110] feat: `Collapsible` component --- package-lock.json | 1 + package.json | 1 + .../AccountModal/components/EmailAddress.tsx | 116 +++++++++--------- src/v2/components/Error.tsx | 28 +++-- src/v2/components/ui/Collapse.stories.tsx | 42 ------- src/v2/components/ui/Collapse.tsx | 23 ---- src/v2/components/ui/Collapsible.stories.tsx | 20 +++ src/v2/components/ui/Collapsible.tsx | 27 ++++ src/v2/components/ui/Form.tsx | 51 ++++---- tailwind.config.ts | 14 ++- 10 files changed, 159 insertions(+), 164 deletions(-) delete mode 100644 src/v2/components/ui/Collapse.stories.tsx delete mode 100644 src/v2/components/ui/Collapse.tsx create mode 100644 src/v2/components/ui/Collapsible.stories.tsx create mode 100644 src/v2/components/ui/Collapsible.tsx diff --git a/package-lock.json b/package-lock.json index 7f8775ea18..eaccd8b2dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "@phosphor-icons/react": "^2.1.7", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", + "@radix-ui/react-collapsible": "^1.1.0", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-focus-scope": "^1.1.0", diff --git a/package.json b/package.json index af13050fe1..dc77e867fa 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@phosphor-icons/react": "^2.1.7", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", + "@radix-ui/react-collapsible": "^1.1.0", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-focus-scope": "^1.1.0", diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index a0b87256de..0c91a29a67 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -1,6 +1,6 @@ import { Error } from "@/components/Error" import { Button, ButtonProps } from "@/components/ui/Button" -import { Collapse } from "@/components/ui/Collapse" +import { Collapsible, CollapsibleContent } from "@/components/ui/Collapsible" import { Dialog, DialogCloseButton, @@ -187,70 +187,74 @@ const ConnectEmailButton = ({ processError={processEmailError} /> - - ( - - Email address - - - - - - )} - /> - - - -
    -

    - {`Enter the code we've sent to ${email} `} - -

    - + + ( + name="email" + render={({ field }) => ( + Email address - { - onChange(value) - if (value.length === PIN_LENGTH) { - connect.onSubmit({ - authData: { code: value }, - emailAddress: email, - }) - } - }} - autoFocus - > - - {[...Array(PIN_LENGTH)].map((_, i) => ( - - ))} - - + )} /> -
    -
    + + + + + +
    +

    + {`Enter the code we've sent to ${email} `} + +

    + + ( + + + { + onChange(value) + if (value.length === PIN_LENGTH) { + connect.onSubmit({ + authData: { code: value }, + emailAddress: email, + }) + } + }} + autoFocus + > + + {[...Array(PIN_LENGTH)].map((_, i) => ( + + ))} + + + + + + )} + /> +
    +
    +
    {shouldShowPinEntry ? ( diff --git a/src/v2/components/Error.tsx b/src/v2/components/Error.tsx index 5683607320..ce7019cd7e 100644 --- a/src/v2/components/Error.tsx +++ b/src/v2/components/Error.tsx @@ -1,6 +1,6 @@ import { WarningCircle } from "@phosphor-icons/react/dist/ssr" import { PropsWithChildren, useEffect, useState } from "react" -import { Collapse } from "./ui/Collapse" +import { Collapsible, CollapsibleContent } from "./ui/Collapsible" type ErrorInfo = { title: string @@ -30,19 +30,21 @@ const Error = ({ }, [error, processError]) return ( - -
    - - -
    -

    {state.title}

    -

    {state.description}

    + + +
    + + +
    +

    {state.title}

    +

    {state.description}

    +
    -
    - + + ) } diff --git a/src/v2/components/ui/Collapse.stories.tsx b/src/v2/components/ui/Collapse.stories.tsx deleted file mode 100644 index 5d658e0daf..0000000000 --- a/src/v2/components/ui/Collapse.stories.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useDisclosure } from "@/hooks/useDisclosure" -import type { Meta, StoryObj } from "@storybook/react" -import { Button } from "./Button" -import { Collapse, CollapseProps } from "./Collapse" - -const CollapseExample = ({ - animateOpacity, -}: Pick) => { - const { isOpen, onToggle } = useDisclosure() - - return ( -
    - - - -
    Collapse content
    -
    -
    - ) -} - -const meta: Meta = { - title: "Design system/Collapse", - component: CollapseExample, -} - -export default meta - -type Story = StoryObj - -export const Default: Story = { - args: { - animateOpacity: false, - }, -} diff --git a/src/v2/components/ui/Collapse.tsx b/src/v2/components/ui/Collapse.tsx deleted file mode 100644 index 04569652f6..0000000000 --- a/src/v2/components/ui/Collapse.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { cn } from "@/lib/utils" -import { forwardRef, HTMLAttributes } from "react" - -export interface CollapseProps extends HTMLAttributes { - open?: boolean - animateOpacity?: boolean -} - -export const Collapse = forwardRef( - ({ className, open, animateOpacity, children, ...props }, ref) => ( -
    -
    {children}
    -
    - ) -) diff --git a/src/v2/components/ui/Collapsible.stories.tsx b/src/v2/components/ui/Collapsible.stories.tsx new file mode 100644 index 0000000000..f7c366e9e2 --- /dev/null +++ b/src/v2/components/ui/Collapsible.stories.tsx @@ -0,0 +1,20 @@ +import type { Meta, StoryObj } from "@storybook/react" +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./Collapsible" + +const CollapsibleExample = () => ( + + Toggle collapse + Collapse content + +) + +const meta: Meta = { + title: "Design system/Collapsible", + component: CollapsibleExample, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/v2/components/ui/Collapsible.tsx b/src/v2/components/ui/Collapsible.tsx new file mode 100644 index 0000000000..8a3b125ea5 --- /dev/null +++ b/src/v2/components/ui/Collapsible.tsx @@ -0,0 +1,27 @@ +"use client" + +import { cn } from "@/lib/utils" +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" +import { ComponentPropsWithoutRef, ElementRef, forwardRef } from "react" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = forwardRef< + ElementRef, + ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + +)) + +export { Collapsible, CollapsibleContent, CollapsibleTrigger } diff --git a/src/v2/components/ui/Form.tsx b/src/v2/components/ui/Form.tsx index 9f096a8861..18adf424f1 100644 --- a/src/v2/components/ui/Form.tsx +++ b/src/v2/components/ui/Form.tsx @@ -1,15 +1,7 @@ -import * as LabelPrimitive from "@radix-ui/react-label" -import { Slot } from "@radix-ui/react-slot" -import { - Controller, - ControllerProps, - FieldPath, - FieldValues, - useFormContext, -} from "react-hook-form" - import { Label } from "@/components/ui/Label" import { cn } from "@/lib/utils" +import * as LabelPrimitive from "@radix-ui/react-label" +import { Slot } from "@radix-ui/react-slot" import { ComponentPropsWithoutRef, createContext, @@ -19,8 +11,15 @@ import { useContext, useId, } from "react" +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + useFormContext, +} from "react-hook-form" import { useDebounceValue } from "usehooks-ts" -import { Collapse } from "./Collapse" +import { Collapsible, CollapsibleContent } from "./Collapsible" type FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, @@ -144,20 +143,22 @@ const FormErrorMessage = forwardRef< const [debounceBody] = useDebounceValue(body, 200) return ( - -

    - {body ?? debounceBody} -

    -
    + + +

    + {body ?? debounceBody} +

    +
    +
    ) }) FormErrorMessage.displayName = "FormErrorMessage" diff --git a/tailwind.config.ts b/tailwind.config.ts index 4bd9c96f3f..ecef76251a 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -140,17 +140,21 @@ const config = { "0%,70%,100%": { opacity: "1" }, "20%,50%": { opacity: "0" }, }, - // Copied from our old styles.ts - "fade-in": { from: { opacity: "0" }, to: { opacity: "1" } }, - "slide-fade-in": { - from: { opacity: "0", transform: "translateY(10px)" }, - to: { opacity: "1", transform: "translateY(0px)" }, + "collapse-open": { + from: { height: "0", opacity: "0" }, + to: { height: "var(--radix-collapsible-content-height)", opacity: "1" }, + }, + "collapse-closed": { + from: { height: "var(--radix-collapsible-content-height)", opacity: "1" }, + to: { height: "0", opacity: "0" }, }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", "caret-blink": "caret-blink 1.25s ease-out infinite", + "collapse-open": "collapse-open 200ms ease-out", + "collapse-closed": "collapse-closed 200ms ease-out", }, }, }, From 0fd4ddb683c6839b8f90e2684a615830e519e320 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 08:38:02 +0200 Subject: [PATCH 091/110] fix(useLensProfile): don't import icon from the requirements config --- src/requirements/Lens/hooks/useLensProfiles.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/requirements/Lens/hooks/useLensProfiles.ts b/src/requirements/Lens/hooks/useLensProfiles.ts index c5521a90ec..0d44a31736 100644 --- a/src/requirements/Lens/hooks/useLensProfiles.ts +++ b/src/requirements/Lens/hooks/useLensProfiles.ts @@ -1,4 +1,3 @@ -import REQUIREMENTS from "requirements" import { useSWRConfig } from "swr" import useSWRImmutable from "swr/immutable" import fetcher from "utils/fetcher" @@ -66,9 +65,7 @@ const useLensProfiles = (searchQuery: string) => { handles: data?.map(({ id, handle: { localName }, metadata }) => ({ label: `${localName}.lens`, value: id, - img: - metadata?.picture?.optimized?.uri ?? - (REQUIREMENTS.LENS_ACTION.icon as string), + img: metadata?.picture?.optimized?.uri ?? "/requirementLogos/lens.svg", })), isLoading, } From 18b0ff687221b64b51f77ff740aa663afad18264 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 08:38:55 +0200 Subject: [PATCH 092/110] fix(EmailAddress): use the new hook --- .../components/AccountModal/components/EmailAddress.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index 0c91a29a67..0e82a203a5 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -16,6 +16,7 @@ import { FormItem, FormLabel, } from "@/components/ui/Form" +import { useToast } from "@/components/ui/hooks/useToast" import { Input } from "@/components/ui/Input" import { InputOTP, InputOTPGroup, InputOTPSlot } from "@/components/ui/InputOTP" import { @@ -31,7 +32,6 @@ import { PencilSimple, Warning } from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" -import useToast from "hooks/useToast" import { useEffect, useState } from "react" import { FormProvider, useForm, useWatch } from "react-hook-form" import { emailData } from "rewards/Email/data" @@ -92,7 +92,7 @@ const ConnectEmailButton = ({ const { handleSubmit, control, setValue, setError, reset } = methods const email = useWatch({ control, name: "email" }) const { id: userId } = useUser() - const toast = useToast() + const { toast } = useToast() const [emailSentAt, setEmailSentAt] = useState(null) @@ -135,7 +135,7 @@ const ConnectEmailButton = ({ if (onSuccess) { onSuccess() } else { - toast({ status: "success", title: "Email verified" }) + toast({ variant: "success", title: "Email verified" }) } handleOnClose() }, From 12c525d7502562f5190de4c82f244f242cf97504 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 08:39:12 +0200 Subject: [PATCH 093/110] fix(FarcasterProfile): use the new hook --- .../AccountModal/components/FarcasterProfile.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx index 1d53976d44..7346a4847e 100644 --- a/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx +++ b/src/v2/components/Account/components/AccountModal/components/FarcasterProfile.tsx @@ -14,6 +14,7 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/Dialog" +import { useToast } from "@/components/ui/hooks/useToast" import { Skeleton } from "@/components/ui/Skeleton" import { Tooltip, @@ -31,7 +32,6 @@ import { import useUser from "components/[guild]/hooks/useUser" import { useFetcherWithSign } from "hooks/useFetcherWithSign" import useSubmit, { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" -import useToast from "hooks/useToast" import { QRCodeSVG } from "qrcode.react" import { useCallback, useEffect, useState } from "react" import { isMobile } from "react-device-detect" @@ -73,14 +73,14 @@ const ConnectFarcasterButton = ({ const { farcasterProfiles, id: userId, mutate } = useUser() const { isOpen, onOpen, onClose } = useDisclosure() const fetcherWithSign = useFetcherWithSign() - const toast = useToast() + const { toast } = useToast() const [pollInterval, setPollInterval] = useState() const onApprove = () => { captureEvent("[farcaster] request approved") onClose() toast({ - status: "success", + variant: "success", description: "Farcaster profile connected", }) onSuccess?.() @@ -321,7 +321,7 @@ const DisconnectFarcasterButton = () => { const disclosure = useDisclosure() const { farcasterProfiles, id, mutate } = useUser() const fetcherWithSign = useFetcherWithSign() - const toast = useToast() + const { toast } = useToast() const { onSubmit, isLoading } = useSubmit( async (fid?: number) => { @@ -341,7 +341,7 @@ const DisconnectFarcasterButton = () => { { onSuccess: () => { toast({ - status: "success", + variant: "success", description: "Farcaster profile disconnected", }) disclosure.onClose() From 8cf57773e4e31c971d6c8acd6e5cf2838a8381a6 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 09:09:02 +0200 Subject: [PATCH 094/110] feat: new `GuildLogo` component --- src/v2/components/GuildLogo.tsx | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/v2/components/GuildLogo.tsx diff --git a/src/v2/components/GuildLogo.tsx b/src/v2/components/GuildLogo.tsx new file mode 100644 index 0000000000..0232676f2a --- /dev/null +++ b/src/v2/components/GuildLogo.tsx @@ -0,0 +1,48 @@ +/** + * TODO: we should use this new component everywhere & remove the old GuildLogo + * (src/components/common/GuildLogo.tsx) + */ + +import { cn } from "@/lib/utils" +import { useTheme } from "next-themes" +import Image from "next/image" + +const IMAGE_QUALITY = 70 + +type Props = { + imageUrl: string + className?: string +} + +const GuildLogo = ({ imageUrl, className }: Props) => { + const { resolvedTheme } = useTheme() + // TODO: should we move it to a CSS variable? + const bgColor = resolvedTheme === "light" ? "bg-gray-700" : "bg-gray-600" + + return ( +
    + {imageUrl && + (imageUrl?.match("guildLogos") ? ( + Guild logo + ) : ( + Guild logo + ))} +
    + ) +} + +export { GuildLogo } From 0f04aa9f1d0a6e42ce111b5231f0235afb9b696e Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 09:10:14 +0200 Subject: [PATCH 095/110] fix(SharedSocials): use the new `GuildLogo` component --- .../components/AccountModal/components/SharedSocials.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx index ea3a8e5010..7d83ed5356 100644 --- a/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SharedSocials.tsx @@ -8,8 +8,8 @@ import { } from "@phosphor-icons/react/dist/ssr" import useGuild, { useSimpleGuild } from "components/[guild]/hooks/useGuild" import useUser from "components/[guild]/hooks/useUser" -import GuildLogo from "components/common/GuildLogo" +import { GuildLogo } from "@/components/GuildLogo" import { Button, ButtonProps } from "@/components/ui/Button" import { Dialog, @@ -51,7 +51,7 @@ const SharedSocials = () => { return ( - {/* TODO: scrollBehavior="inside" */} + {/* TODO: scrollBehavior="inside" (maybe we can do it here and don't need to abstract it into the component?) */} {!guildSharedSocial ? ( diff --git a/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx b/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx index 0f4231d726..c8f409c1f3 100644 --- a/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/LinkedAddress.tsx @@ -65,7 +65,6 @@ const LinkedAddress = ({ addressData }: Props) => { } = useDisconnectAddress(onClose) const removeAddress = () => onDisconnectSubmit({ address }) - // const removeMenuItemColor = useColorModeValue("red.600", "red.300") return ( <> @@ -164,13 +163,15 @@ const LinkedAddress = ({ addressData }: Props) => { Cancel - - Continue + + diff --git a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx index e1bb14ed3b..8b0a693914 100644 --- a/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx +++ b/src/v2/components/Web3ConnectionManager/PlatformMergeErrorAlert.tsx @@ -15,6 +15,8 @@ import { AlertDialogHeader, AlertDialogTitle, } from "../ui/AlertDialog" +import { anchorVariants } from "../ui/Anchor" +import { Button } from "../ui/Button" import { useToast } from "../ui/hooks/useToast" import { useWeb3ConnectionManager } from "./hooks/useWeb3ConnectionManager" @@ -73,12 +75,13 @@ const PlatformMergeErrorAlert = () => { {address ? shortenHex(address) : ""} - ) to it by following {/* TODO: blue link color */} + ) to it by following{" "} this guide @@ -95,9 +98,14 @@ const PlatformMergeErrorAlert = () => { Cancel - {/* TODO: loading state */} - - Connect anyway + + From 4559e25c6ad9cb83e4e1a42c1135c513398c8a30 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 17:23:27 +0200 Subject: [PATCH 104/110] fix(SocialAccount): apply different styles for the reconnect button --- .../AccountModal/components/SocialAccount.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx index 378be0e816..abb53ac266 100644 --- a/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx +++ b/src/v2/components/Account/components/AccountModal/components/SocialAccount.tsx @@ -2,6 +2,7 @@ import { Button } from "@/components/ui/Button" import { useToast } from "@/components/ui/hooks/useToast" import { useDisclosure } from "@/hooks/useDisclosure" import { cn } from "@/lib/utils" +import { Warning } from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" import useConnectPlatform from "components/[guild]/JoinModal/hooks/useConnectPlatform" import useMembershipUpdate from "components/[guild]/JoinModal/hooks/useMembershipUpdate" @@ -146,12 +147,16 @@ const ConnectPlatformButton = ({ onClick={onConnect} isLoading={isLoading} disabled={!!response} - // TODO: use the proper colors - // colorScheme={isReconnect ? "orange" : rewards[type].colorScheme} - // variant={isReconnect ? "subtle" : "solid"} + variant={isReconnect ? "secondary" : "default"} size="sm" className={cn("ml-auto", PLATFORM_COLORS[type])} > + {isReconnect && ( + + )} {isReconnect ? "Reconnect" : "Connect"} ) From 596b803632c710529fac67398e5d81d4379483ef Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 17:27:26 +0200 Subject: [PATCH 105/110] fix: minor improvements/todos --- .../JoinModal/components/ConnectEmailJoinStep.tsx | 9 ++++----- .../AccountModal/components/EmailAddress.tsx | 14 +++++++++++--- .../components/NetworkModal/NetworkModal.tsx | 1 - 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx b/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx index 3924431bab..76c8597914 100644 --- a/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx +++ b/src/components/[guild]/JoinModal/components/ConnectEmailJoinStep.tsx @@ -1,5 +1,7 @@ import { ConnectEmailButton } from "@/components/Account/components/AccountModal/components/EmailAddress" +import { cn } from "@/lib/utils" import { Tooltip } from "@chakra-ui/react" +import { EnvelopeSimple } from "@phosphor-icons/react" import useUser from "components/[guild]/hooks/useUser" import { useAccount } from "wagmi" import { JoinStepUI } from "./JoinStep" @@ -20,11 +22,8 @@ const ConnectEmailJoinStep = (): JSX.Element => { } - // flexShrink="0" - // minW="max-content" - // maxW={isDone && "40"} + className={cn("min-w-max shrink-0", { "max-w-40": isDone })} + leftIcon={} /> diff --git a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx index 0e82a203a5..9dd0911f0e 100644 --- a/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx +++ b/src/v2/components/Account/components/AccountModal/components/EmailAddress.tsx @@ -32,7 +32,7 @@ import { PencilSimple, Warning } from "@phosphor-icons/react/dist/ssr" import useUser from "components/[guild]/hooks/useUser" import { useConnectEmail } from "components/[guild]/JoinModal/hooks/useConnectPlatform" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" -import { useEffect, useState } from "react" +import { ReactNode, useEffect, useState } from "react" import { FormProvider, useForm, useWatch } from "react-hook-form" import { emailData } from "rewards/Email/data" import fetcher from "utils/fetcher" @@ -75,9 +75,14 @@ const EmailAddress = () => { const ConnectEmailButton = ({ onSuccess, isReconnection: _, + leftIcon, className, ...props -}: ButtonProps & { onSuccess?: () => void; isReconnection?: boolean }) => { +}: ButtonProps & { + onSuccess?: () => void + isReconnection?: boolean + leftIcon?: ReactNode // TODO: we should find a different solution +}) => { const { emails } = useUser() const { isOpen, onOpen, onClose } = useDisclosure() const [pendingEmailAddress, setPendingEmailAddress] = useState( @@ -323,7 +328,10 @@ const ConnectEmailButton = ({ Verify ) : ( - emails?.emailAddress || "Connect" + <> + {leftIcon} + emails?.emailAddress || "Connect" + )} diff --git a/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx b/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx index 7349b67330..a67bc295b4 100644 --- a/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx +++ b/src/v2/components/Account/components/NetworkModal/NetworkModal.tsx @@ -27,7 +27,6 @@ const NetworkModal = ({

    - {" "} It doesn't matter which supported chain you're connected to, it's only used to know your address and sign messages so each will work equally.

    From c6a792cdef83e045c105bc1478bab15a60ae1896 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 18:00:11 +0200 Subject: [PATCH 106/110] feat: `Alert` component --- src/app/globals.css | 16 ++++++ src/v2/components/ui/Alert.stories.tsx | 73 ++++++++++++++++++++++++++ src/v2/components/ui/Alert.tsx | 57 ++++++++++++++++++++ tailwind.config.ts | 18 +++++++ 4 files changed, 164 insertions(+) create mode 100644 src/v2/components/ui/Alert.stories.tsx create mode 100644 src/v2/components/ui/Alert.tsx diff --git a/src/app/globals.css b/src/app/globals.css index 7d2211236d..496590a6e8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -58,6 +58,16 @@ --toast-warning: 40 79% 96%; --toast-info: 218 80% 98%; + --alert-success: var(--toast-success); + --alert-success-icon: 142 71% 45%; + --alert-info: var(--toast-info); + --alert-info-icon: 217 91% 60%; /* TODO: --info-... CSS variables */ + --alert-warning: var(--toast-warning); + --alert-warning-icon: 27 96% 61%; + /* TODO: should we call it error or destructive? */ + --alert-error: var(--toast-error); + --alert-error-icon: 0 84% 60%; + --discord: 233 78% 63%; --discord-hover: 243 75% 59%; --discord-active: 245 58% 51%; @@ -145,6 +155,12 @@ --toast-warning: 30 6% 34%; --toast-info: 226 7% 36%; + --alert-success: var(--toast-success); + --alert-info: var(--toast-info); + --alert-warning: var(--toast-warning); + --alert-warning-icon: 27 96% 61%; + --alert-error: var(--toast-error); + --discord-hover: 234 89% 74%; --discord-active: 230 94% 82%; --telegram-hover: 198 93% 60%; diff --git a/src/v2/components/ui/Alert.stories.tsx b/src/v2/components/ui/Alert.stories.tsx new file mode 100644 index 0000000000..2740220d69 --- /dev/null +++ b/src/v2/components/ui/Alert.stories.tsx @@ -0,0 +1,73 @@ +import type { Meta, StoryObj } from "@storybook/react" + +import { + Check, + Info as InfoIcon, + Warning as WarningIcon, + X, +} from "@phosphor-icons/react/dist/ssr" +import { Alert, AlertDescription, AlertProps, AlertTitle } from "./Alert" +import { Card } from "./Card" + +const icons = { + info: InfoIcon, + success: Check, + warning: WarningIcon, + error: X, +} as const + +const AlertExample = (props: AlertProps) => { + const AlertIcon = icons[props.variant] + return ( + + + Heads up! + + You can add components and dependencies to your app using the cli. + + + ) +} + +const meta: Meta = { + title: "Design system/Alert", + component: AlertExample, + decorators: [ + (Story) => ( +
    + +

    Alert example

    +

    + On a Card component, so we can see the colors properly +

    + +
    +
    + ), + ], +} + +export default meta + +type Story = StoryObj + +export const Info: Story = { + args: { + variant: "info", + }, +} +export const Success: Story = { + args: { + variant: "success", + }, +} +export const Warning: Story = { + args: { + variant: "warning", + }, +} +export const Error: Story = { + args: { + variant: "error", + }, +} diff --git a/src/v2/components/ui/Alert.tsx b/src/v2/components/ui/Alert.tsx new file mode 100644 index 0000000000..db74fe5311 --- /dev/null +++ b/src/v2/components/ui/Alert.tsx @@ -0,0 +1,57 @@ +import { cn } from "@/lib/utils" +import { cva, type VariantProps } from "class-variance-authority" +import { forwardRef, HTMLAttributes } from "react" + +const alertVariants = cva( + "relative w-full rounded-xl p-4 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 text-foreground [&>svg~*]:pl-7", + { + variants: { + variant: { + success: "bg-alert-success [&>svg]:text-alert-success-icon", + info: "bg-alert-info [&>svg]:text-alert-info-icon", + warning: "bg-alert-warning [&>svg]:text-alert-warning-icon", + error: "bg-alert-error [&>svg]:text-alert-error-icon", + }, + }, + defaultVariants: { + variant: "info", + }, + } +) + +export type AlertProps = HTMLAttributes & + VariantProps + +const Alert = forwardRef( + ({ className, variant, ...props }, ref) => ( +
    + ) +) +Alert.displayName = "Alert" + +const AlertTitle = forwardRef< + HTMLParagraphElement, + HTMLAttributes +>(({ className, ...props }, ref) => ( +
    +)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = forwardRef< + HTMLParagraphElement, + HTMLAttributes +>(({ className, ...props }, ref) => ( +
    +)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertDescription, AlertTitle } diff --git a/tailwind.config.ts b/tailwind.config.ts index 9fef23abaa..0f76ea46f0 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -86,6 +86,24 @@ const config = { warning: "hsla(var(--toast-warning))", info: "hsla(var(--toast-info))", }, + alert: { + success: { + DEFAULT: "hsla(var(--alert-success))", + icon: "hsl(var(--alert-success-icon))", + }, + info: { + DEFAULT: "hsla(var(--alert-info))", + icon: "hsl(var(--alert-info-icon))", + }, + warning: { + DEFAULT: "hsla(var(--alert-warning))", + icon: "hsl(var(--alert-warning-icon))", + }, + error: { + DEFAULT: "hsla(var(--alert-error))", + icon: "hsl(var(--alert-error-icon))", + }, + }, // Platforms discord: { DEFAULT: "hsl(var(--discord))", From 3e4c375bed2c60b95504d5fe8a45c59bf3dc10a1 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 18:15:07 +0200 Subject: [PATCH 107/110] fix: fine-tune `Alert` styles --- src/app/globals.css | 5 ++++- src/v2/components/ui/Alert.stories.tsx | 2 +- src/v2/components/ui/Alert.tsx | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 496590a6e8..d47f43d318 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -156,10 +156,13 @@ --toast-info: 226 7% 36%; --alert-success: var(--toast-success); + --alert-success-icon: 141 79% 85%; --alert-info: var(--toast-info); + --alert-info-icon: 213 97% 87%; --alert-warning: var(--toast-warning); - --alert-warning-icon: 27 96% 61%; + --alert-warning-icon: 32 98% 83%; --alert-error: var(--toast-error); + --alert-error-icon: 0 96% 89%; --discord-hover: 234 89% 74%; --discord-active: 230 94% 82%; diff --git a/src/v2/components/ui/Alert.stories.tsx b/src/v2/components/ui/Alert.stories.tsx index 2740220d69..60c569920c 100644 --- a/src/v2/components/ui/Alert.stories.tsx +++ b/src/v2/components/ui/Alert.stories.tsx @@ -20,7 +20,7 @@ const AlertExample = (props: AlertProps) => { const AlertIcon = icons[props.variant] return ( - + Heads up! You can add components and dependencies to your app using the cli. diff --git a/src/v2/components/ui/Alert.tsx b/src/v2/components/ui/Alert.tsx index db74fe5311..ec541ee0fb 100644 --- a/src/v2/components/ui/Alert.tsx +++ b/src/v2/components/ui/Alert.tsx @@ -3,7 +3,7 @@ import { cva, type VariantProps } from "class-variance-authority" import { forwardRef, HTMLAttributes } from "react" const alertVariants = cva( - "relative w-full rounded-xl p-4 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 text-foreground [&>svg~*]:pl-7", + "relative w-full rounded-xl p-4 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 text-foreground [&>svg~*]:pl-8 [&>svg~*]:mt-1", { variants: { variant: { From 8e957079bb47b8d31a5a24e413f6bb3ce7fc93a0 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 18:16:19 +0200 Subject: [PATCH 108/110] feat: use the new component --- .../components/UsersGuildPins.tsx | 19 ++++++++++--------- src/v2/components/Error.tsx | 17 ++++++----------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx b/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx index b974121674..f5240fb480 100644 --- a/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx +++ b/src/v2/components/Account/components/AccountModal/components/UsersGuildPins.tsx @@ -1,8 +1,10 @@ import { AccountSectionTitle } from "@/components/Account/components/AccountModal/components/AccountSection" import { accountModalAtom } from "@/components/Providers/atoms" +import { Alert, AlertDescription } from "@/components/ui/Alert" import { Badge } from "@/components/ui/Badge" import { Skeleton } from "@/components/ui/Skeleton" import useUsersGuildPins from "@/hooks/useUsersGuildPins" +import { Info } from "@phosphor-icons/react/dist/ssr" import { useAtomValue, useSetAtom } from "jotai" import Link from "next/link" @@ -14,15 +16,14 @@ const UsersGuildPins = () => { <> - {/* TODO: custom Error component */} - {/* {error && ( - <> - - There was an error while fetching your pins, some may not - be visible. - - - )} */} + {error && ( + + + + There was an error while fetching your pins, some may not be visible. + + + )}
    ({ return ( -
    - - -
    -

    {state.title}

    -

    {state.description}

    -
    -
    + + + {state.title} + {state.description} +
    ) From 8005cee07e48dd3237d254a4d6353e55fc67865e Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 18:35:51 +0200 Subject: [PATCH 109/110] fix(guild page): incorrect import --- src/pages/[guild]/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/[guild]/index.tsx b/src/pages/[guild]/index.tsx index 676fa43540..cd28d547ea 100644 --- a/src/pages/[guild]/index.tsx +++ b/src/pages/[guild]/index.tsx @@ -32,7 +32,6 @@ import GuildTabs from "components/[guild]/Tabs/GuildTabs" import { ThemeProvider, useThemeContext } from "components/[guild]/ThemeContext" import useGuild from "components/[guild]/hooks/useGuild" import useGuildPermission from "components/[guild]/hooks/useGuildPermission" -import { addIntercomSettings } from "components/_app/IntercomProvider" import GuildLogo from "components/common/GuildLogo" import Layout from "components/common/Layout" import BackButton from "components/common/Layout/components/BackButton" @@ -49,6 +48,7 @@ import { MintPolygonIDProofProvider } from "rewards/PolygonID/components/MintPol import { SWRConfig } from "swr" import { Guild, SocialLinkKey } from "types" import fetcher from "utils/fetcher" +import { addIntercomSettings } from "utils/intercom" import parseDescription from "utils/parseDescription" const DynamicOngoingIssuesBanner = dynamic( From 55a61ddb6f99998c2080e2ab29ffcaf95a2d29cc Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 10 Jul 2024 18:37:30 +0200 Subject: [PATCH 110/110] patch package-lock --- biome.json | 2 +- package-lock.json | 120 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) diff --git a/biome.json b/biome.json index 479bd96aaf..0ff4410dbe 100644 --- a/biome.json +++ b/biome.json @@ -11,7 +11,7 @@ }, "files": { "include": ["src", "cypress"], - "ignore": ["node_modules", ".next", "public", ".out"] + "ignore": ["node_modules", ".next", "public", ".out", "package-lock.json"] }, "organizeImports": { "enabled": true }, "linter": { diff --git a/package-lock.json b/package-lock.json index d8c0c26b6d..89efdf0a20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31504,6 +31504,126 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz", + "integrity": "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz", + "integrity": "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz", + "integrity": "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz", + "integrity": "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz", + "integrity": "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz", + "integrity": "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz", + "integrity": "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz", + "integrity": "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } } } }