From cb2bb71791800aab2e2ce2fe5cbba8962e635519 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sat, 30 Dec 2023 19:21:33 +0100 Subject: [PATCH 001/124] moved nextjs designs to react --- tauri-app/components/MobileNavbar/index.css | 52 + tauri-app/components/MobileNavbar/index.tsx | 29 + tauri-app/components/Navbar/index.css | 110 + tauri-app/components/Navbar/index.tsx | 39 + tauri-app/index.html | 16 +- tauri-app/package-lock.json | 5855 ------------------- tauri-app/pnpm-lock.yaml | 4080 +++++++++++++ tauri-app/src/App.tsx | 28 +- tauri-app/src/index.css | 15 + tauri-app/src/main.tsx | 4 +- tauri-app/src/pages/Home/index.css | 52 + tauri-app/src/pages/Home/index.tsx | 32 + tauri-app/src/pages/SharedLayout/index.css | 0 tauri-app/src/pages/SharedLayout/index.tsx | 40 + 14 files changed, 4480 insertions(+), 5872 deletions(-) create mode 100644 tauri-app/components/MobileNavbar/index.css create mode 100644 tauri-app/components/MobileNavbar/index.tsx create mode 100644 tauri-app/components/Navbar/index.css create mode 100644 tauri-app/components/Navbar/index.tsx delete mode 100644 tauri-app/package-lock.json create mode 100644 tauri-app/pnpm-lock.yaml create mode 100644 tauri-app/src/index.css create mode 100644 tauri-app/src/pages/Home/index.css create mode 100644 tauri-app/src/pages/Home/index.tsx create mode 100644 tauri-app/src/pages/SharedLayout/index.css create mode 100644 tauri-app/src/pages/SharedLayout/index.tsx diff --git a/tauri-app/components/MobileNavbar/index.css b/tauri-app/components/MobileNavbar/index.css new file mode 100644 index 0000000..0bfe306 --- /dev/null +++ b/tauri-app/components/MobileNavbar/index.css @@ -0,0 +1,52 @@ +.mobile_menu { + width: 85%; + height: 50px; + padding: 10px; + border-radius: 5px; + box-shadow: 0 0px 4px rgba(0, 0, 0, 0.3); + position: fixed; + bottom: 35px; + left: 50%; + transform: translateX(-50%); + display: flex; + justify-content: space-around; + align-items: center; + background: var(--color-white); +} + +.menu_item { + font-size: 30px; + color: var(--color-blue); + position: relative; + text-align: center; +} + +.menu_item h3 { + font-size: 12px; + font-family: "Roboto"; + font-weight: 800; +} + +.menu_item span { + font-size: 10px; + background: var(--color-red); + color: var(--color-white); + padding: 2px 4px; + border-radius: 5px; + font-family: "Roboto"; + border: 2px solid var(--color-white); + position: absolute; + top: 0; +} + +.menu_item span:nth-child(1) { + right: -14px; +} + +.menu_item span:nth-child(2) { + right: -18px; +} + +.menu_item span:nth-child(3) { + right: 0px; +} diff --git a/tauri-app/components/MobileNavbar/index.tsx b/tauri-app/components/MobileNavbar/index.tsx new file mode 100644 index 0000000..58d1084 --- /dev/null +++ b/tauri-app/components/MobileNavbar/index.tsx @@ -0,0 +1,29 @@ +import "./index.css"; + +const index = () => { + return ( +
+
+ +

Home

+
+
+ +

Records

+ 35 +
+
+ + 28 +

Chats

+
+
+ +

DIY Remedies

+ 99+ +
+
+ ); +}; + +export default index; diff --git a/tauri-app/components/Navbar/index.css b/tauri-app/components/Navbar/index.css new file mode 100644 index 0000000..2834efc --- /dev/null +++ b/tauri-app/components/Navbar/index.css @@ -0,0 +1,110 @@ +.main_navbar_container { + padding: 20px 65px; + box-shadow: 0 0 3px 4px rgba(0, 0, 0, 0.1); + display: flex; + justify-content: space-between; + align-items: center; + position: sticky; + top: 0; + background: var(--color-white); + z-index: 5; +} + +.logo_container { + position: relative; +} + +.logo_container i:nth-child(1) { + font-size: 54px; + color: var(--color-blue); +} + +.logo_container i:nth-child(2) { + font-size: 15px; + position: absolute; + left: 12px; + top: 8px; + color: var(--color-white); +} + +.comp_menu_container { + display: flex; + justify-content: center; + align-items: center; +} + +.comp_menu_container div { + font-family: "Roboto"; + font-size: 14px; + margin: 0px 10px; + position: relative; + display: flex; + justify-content: space-between; + align-items: center; +} + +.comp_menu_container div i { + color: var(--color-blue); + margin-right: 4px; +} + +.comp_menu_container div span { + color: var(--color-white); + background: var(--color-red); + font-family: "Roboto"; + display: flex; + justify-content: center; + align-items: center; + border-radius: 5px; + font-size: 14px; + margin-left: 8px; + text-align: center; + padding: 2px 4px; +} + +.comp_menu_container div h3 { + color: var(--color-blue); + font-weight: 800; + transition: 0.3s; +} + +.comp_menu_container div h3:hover { + opacity: 1; +} + +.auth_container { + display: flex; + align-items: center; + justify-content: center; + width: max-content; +} + +.auth_container { + padding: 8px 20px; + padding-right: 8px; + border-radius: 28px; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + color: var(--color-white); + font-family: "Roboto"; + cursor: pointer; + font-weight: 800; +} + +.auth_container i { + background: var(--color-white); + padding: 10px 12px; + border-radius: 50%; + color: var(--color-black); + margin-left: 10px; +} + +@media (max-width: 750px) { + .main_navbar_container { + padding: 15px 25px; + } + + .comp_menu_container { + display: none; + } +} diff --git a/tauri-app/components/Navbar/index.tsx b/tauri-app/components/Navbar/index.tsx new file mode 100644 index 0000000..e00f881 --- /dev/null +++ b/tauri-app/components/Navbar/index.tsx @@ -0,0 +1,39 @@ +import "./index.css"; + +const index = () => { + return ( +
+
+ + +
+
+
+ +

Home

+
+
+ +

Records

+ 28 +
+
+ +

Chats

+ 5 +
+
+ +

DIY Remedies

+ 99+ +
+
+
+

Join us!

+ +
+
+ ); +}; + +export default index; diff --git a/tauri-app/index.html b/tauri-app/index.html index 03abf55..36ecb79 100644 --- a/tauri-app/index.html +++ b/tauri-app/index.html @@ -4,7 +4,21 @@ - Tauri + React + TS + PulsePal + + + + + diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json deleted file mode 100644 index 42b5c04..0000000 --- a/tauri-app/package-lock.json +++ /dev/null @@ -1,5855 +0,0 @@ -{ - "name": "tauri-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tauri-app", - "version": "0.0.0", - "dependencies": { - "@hookform/resolvers": "^3.3.2", - "@radix-ui/react-avatar": "^1.0.4", - "@radix-ui/react-dropdown-menu": "^2.0.6", - "@radix-ui/react-label": "^2.0.2", - "@radix-ui/react-slot": "^1.0.2", - "@radix-ui/react-tabs": "^1.0.4", - "@tauri-apps/api": "^1.5.2", - "@web5/api": "^0.8.3", - "class-variance-authority": "^0.7.0", - "clsx": "^2.0.0", - "lucide-react": "^0.298.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-dropzone": "^14.2.3", - "react-easy-crop": "^5.0.4", - "react-hook-form": "^7.49.2", - "react-pdf": "^7.6.0", - "react-router-dom": "^6.21.1", - "react-spinners": "^0.13.8", - "react-virtualized-auto-sizer": "^1.0.20", - "react-window": "^1.8.10", - "tailwind-merge": "^2.1.0", - "tailwindcss-animate": "^1.0.7", - "zod": "^3.22.4", - "zustand": "^4.4.7" - }, - "devDependencies": { - "@tauri-apps/cli": "^1.5.7", - "@types/node": "^20.10.5", - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@types/react-window": "^1.8.8", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.16", - "postcss": "^8.4.32", - "tailwindcss": "^3.4.0", - "typescript": "^5.0.2", - "vite": "^4.4.4" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", - "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", - "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", - "dependencies": { - "buffer": "6.0.3", - "cross-fetch": "3.1.5", - "hash-wasm": "4.9.0" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@decentralized-identity/ion-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", - "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/secp256k1": "^2.0.0", - "canonicalize": "^2.0.0", - "multiformats": "^12.0.1", - "multihashes": "^4.0.3", - "uri-js": "^4.4.1" - } - }, - "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", - "dependencies": { - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", - "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "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/@hookform/resolvers": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.2.tgz", - "integrity": "sha512-Tw+GGPnBp+5DOsSg4ek3LCPgkBOuOgS5DsDV7qsWNH9LZc433kgsWICjlsh2J9p04H2K66hsXPPb9qn9ILdUtA==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", - "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", - "dependencies": { - "cborg": "^2.0.1", - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-cbor/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.6.tgz", - "integrity": "sha512-wOij3jfDKZsb9yjhQeHp+TQy0pu1vmUkGv324xciFFZ7xGbDfAGTQW03lSA5aJ/7HBBNYgjEE0nvHmNW1Qjfag==", - "dependencies": { - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-temporal/polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", - "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", - "dependencies": { - "jsbi": "^4.3.0", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/@multiformats/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" - }, - "node_modules/@multiformats/murmur3": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.7.tgz", - "integrity": "sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==", - "dependencies": { - "multiformats": "^12.0.1", - "murmurhash3js-revisited": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/murmur3/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@noble/ciphers": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", - "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/ed25519": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", - "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", - "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz", - "integrity": "sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz", - "integrity": "sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-menu": "2.0.6", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", - "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.6.tgz", - "integrity": "sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.3", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", - "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", - "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-use-controllable-state": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/@remix-run/router": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz", - "integrity": "sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tauri-apps/api": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.2.tgz", - "integrity": "sha512-tZK3XJiIUnUdHN7rGqA+j57dvT3/7z2bEiPfWmO3uAymv2JMBJrfGwbyDWLjGue37UVhh0gLYSkA9wV+/bASwA==", - "engines": { - "node": ">= 14.6.0", - "npm": ">= 6.6.0", - "yarn": ">= 1.19.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - } - }, - "node_modules/@tauri-apps/cli": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.5.8.tgz", - "integrity": "sha512-c/mzk5vjjfxtH5uNXSc9h1eiprsolnoBcUwAa4/SZ3gxJ176CwrUKODz3cZBOnzs8omwagwgSN/j7K8NrdFL9g==", - "dev": true, - "bin": { - "tauri": "tauri.js" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - }, - "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.5.8", - "@tauri-apps/cli-darwin-x64": "1.5.8", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.5.8", - "@tauri-apps/cli-linux-arm64-gnu": "1.5.8", - "@tauri-apps/cli-linux-arm64-musl": "1.5.8", - "@tauri-apps/cli-linux-x64-gnu": "1.5.8", - "@tauri-apps/cli-linux-x64-musl": "1.5.8", - "@tauri-apps/cli-win32-arm64-msvc": "1.5.8", - "@tauri-apps/cli-win32-ia32-msvc": "1.5.8", - "@tauri-apps/cli-win32-x64-msvc": "1.5.8" - } - }, - "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.5.8.tgz", - "integrity": "sha512-/AksDWfAt3NUSt8Rq2a3gTLASChKzldPVUjmJhcbtsuzFg2nx5g+hhOHxfBYzss2Te1K5mzlu+73LAMy1Sb9Gw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.5.8.tgz", - "integrity": "sha512-gcfSh+BFRDdbIGpggZ1+5R5SgToz2A9LthH8P4ak3OHagDzDvI6ov6zy2UQE3XDWJKdnlna2rSR1dIuRZ0T9bA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.5.8.tgz", - "integrity": "sha512-ZHQYuOBGvZubPnh5n8bNaN2VMxPBZWs26960FGQWamm9569UV/TNDHb6mD0Jjk9o0f9P+f98qNhuu5Y37P+vfQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.5.8.tgz", - "integrity": "sha512-FFs28Ew3R2EFPYKuyAIouTbp6YnR+shAmJGFNnVy7ibKHL0wxamVKqv1N5N9gUUr+EhbZu2syMBRfG9XQ5mgng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.5.8.tgz", - "integrity": "sha512-dEYvNyLMmWD0jb30FNfVPXmBq6OGg6is3km+4RlGg8tZU5Zvq78ClUZtaZuER+N/hv27+Uc6UHl9X3hin8cGGw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.5.8.tgz", - "integrity": "sha512-ut3TDbtLXmZhz6Q4wim57PV02wG+AfuLSWRPhTL9MsPsg/E7Y6sJhv0bIMAq6SwC59RCH52ZGft6RH7samV2NQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.5.8.tgz", - "integrity": "sha512-k6ei7ETXVZlNpFOhl/8Cnj709UbEr+VuY9xKK/HgwvNfjA5f8HQ9TSKk/Um7oeT1Y61/eEcvcgF/hDURhFJDPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.5.8.tgz", - "integrity": "sha512-l6zm31x1inkS2K5e7otUZ90XBoK+xr2KJObFCZbzmluBE+LM0fgIXCrj7xwH/f0RCUX3VY9HHx4EIo7eLGBXKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.5.8.tgz", - "integrity": "sha512-0k3YpWl6PKV4Qp2N52Sb45egXafSgQXcBaO7TIJG4EDfaEf5f6StN+hYSzdnrq9idrK5x9DDCPuebZTuJ+Q8EA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.5.8.tgz", - "integrity": "sha512-XjBg8VMswmD9JAHKlb10NRPfBVAZoiOJBbPRte+GP1BUQtqDnbIYcOLSnUCmNZoy3fUBJuKJUBT9tDCbkMr5fQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.2.8.tgz", - "integrity": "sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==", - "dependencies": { - "@ipld/dag-cbor": "9.0.3", - "@js-temporal/polyfill": "0.4.4", - "@noble/ed25519": "2.0.0", - "@noble/secp256k1": "2.0.0", - "abstract-level": "1.0.3", - "ajv": "8.12.0", - "blockstore-core": "4.2.0", - "cross-fetch": "4.0.0", - "eciesjs": "0.4.5", - "flat": "5.0.2", - "interface-blockstore": "5.2.3", - "interface-store": "5.1.2", - "ipfs-unixfs-exporter": "13.1.5", - "ipfs-unixfs-importer": "15.1.5", - "level": "8.0.0", - "lodash": "4.17.21", - "lru-cache": "9.1.2", - "ms": "2.1.3", - "multiformats": "11.0.2", - "randombytes": "2.1.0", - "readable-stream": "4.4.2", - "ulidx": "2.1.0", - "uuid": "8.3.2", - "varint": "6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js/node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js/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/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "devOptional": true - }, - "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", - "devOptional": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", - "devOptional": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-window": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", - "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "devOptional": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/@web5/agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.2.5.tgz", - "integrity": "sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "level": "8.0.0", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.8.3.tgz", - "integrity": "sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "@web5/user-agent": "0.2.5", - "level": "8.0.0", - "ms": "2.1.3", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api/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/@web5/common": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.2.tgz", - "integrity": "sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2", - "readable-stream": "4.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.2.tgz", - "integrity": "sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==", - "dependencies": { - "@noble/ciphers": "0.1.4", - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@web5/common": "0.2.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto/node_modules/@web5/common": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", - "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.3.tgz", - "integrity": "sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==", - "dependencies": { - "@decentralized-identity/ion-pow-sdk": "1.0.17", - "@decentralized-identity/ion-sdk": "1.0.1", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "did-resolver": "4.1.0", - "dns-packet": "5.6.1", - "level": "8.0.0", - "ms": "2.1.3", - "pkarr": "1.1.1", - "z32": "1.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids/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/@web5/user-agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.2.5.tgz", - "integrity": "sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==", - "dependencies": { - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/attr-accept": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", - "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bencode": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.1.1.tgz", - "integrity": "sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==", - "dependencies": { - "uint8-util": "^2.1.6" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bittorrent-dht": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.5.tgz", - "integrity": "sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "bencode": "^4.0.0", - "debug": "^4.3.4", - "k-bucket": "^5.1.0", - "k-rpc": "^5.1.0", - "last-one-wins": "^1.0.4", - "lru": "^3.1.0", - "randombytes": "^2.1.0", - "record-cache": "^1.2.0" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bittorrent-dht/node_modules/bencode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", - "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", - "dependencies": { - "uint8-util": "^2.2.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dependencies": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blockstore-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", - "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", - "dependencies": { - "err-code": "^3.0.1", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/canonicalize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", - "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" - }, - "node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cborg": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", - "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", - "bin": { - "cborg": "cli.js" - } - }, - "node_modules/chacha20-universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", - "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-dgram": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", - "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.4", - "run-series": "^1.1.9" - } - }, - "node_modules/chrome-dns": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", - "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", - "dependencies": { - "chrome-net": "^3.3.2" - } - }, - "node_modules/chrome-net": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", - "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", - "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", - "dependencies": { - "clsx": "2.0.0" - }, - "funding": { - "url": "https://joebell.co.uk" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "optional": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true - }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eciesjs": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", - "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", - "dependencies": { - "@noble/ciphers": "^0.3.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eciesjs/node_modules/@noble/ciphers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", - "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.614", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", - "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==", - "dev": true - }, - "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==", - "optional": true - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-selector": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", - "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-goodbye": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", - "integrity": "sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==", - "dependencies": { - "safety-catch": "^1.0.2" - } - }, - "node_modules/hamt-sharding": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", - "integrity": "sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==", - "dependencies": { - "sparse-array": "^1.3.1", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "optional": true - }, - "node_modules/hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interface-blockstore": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", - "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", - "dependencies": { - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/interface-store": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", - "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipfs-unixfs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.0.tgz", - "integrity": "sha512-Lq37nKLJOpRFjx3rcg3y+ZwUxBX7jluKfIt5UPp6wb1L3dP0sj1yaLR0Yg2CdGYvHWyUpZD1iTnT8upL0ToDOw==", - "dependencies": { - "err-code": "^3.0.1", - "protons-runtime": "^5.0.0", - "uint8arraylist": "^2.4.3" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-exporter": { - "version": "13.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", - "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "ipfs-unixfs": "^11.0.0", - "it-filter": "^3.0.2", - "it-last": "^3.0.2", - "it-map": "^3.0.3", - "it-parallel": "^3.0.0", - "it-pipe": "^3.0.1", - "it-pushable": "^3.1.0", - "multiformats": "^11.0.0", - "p-queue": "^7.3.0", - "progress-events": "^1.0.0", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-importer": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", - "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", - "dependencies": { - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.1", - "ipfs-unixfs": "^11.0.0", - "it-all": "^3.0.2", - "it-batch": "^3.0.2", - "it-first": "^3.0.2", - "it-parallel-batch": "^3.0.1", - "multiformats": "^11.0.0", - "progress-events": "^1.0.0", - "rabin-wasm": "^0.1.4", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/it-all": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz", - "integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==" - }, - "node_modules/it-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz", - "integrity": "sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==" - }, - "node_modules/it-filter": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz", - "integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-first": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", - "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" - }, - "node_modules/it-last": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz", - "integrity": "sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==" - }, - "node_modules/it-map": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz", - "integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-merge": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", - "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", - "dependencies": { - "it-pushable": "^3.2.0" - } - }, - "node_modules/it-parallel": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz", - "integrity": "sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-parallel-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz", - "integrity": "sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==", - "dependencies": { - "it-batch": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz", - "integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==" - }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", - "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsbi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", - "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "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==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/k-bucket": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", - "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/k-rpc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", - "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", - "dependencies": { - "k-bucket": "^5.0.0", - "k-rpc-socket": "^1.7.2", - "randombytes": "^2.0.5" - } - }, - "node_modules/k-rpc-socket": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", - "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", - "dependencies": { - "bencode": "^2.0.0", - "chrome-dgram": "^3.0.2", - "chrome-dns": "^1.0.0", - "chrome-net": "^3.3.2" - } - }, - "node_modules/k-rpc-socket/node_modules/bencode": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", - "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" - }, - "node_modules/last-one-wins": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", - "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==" - }, - "node_modules/layerr": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz", - "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==" - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", - "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", - "dependencies": { - "inherits": "^2.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.298.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.298.0.tgz", - "integrity": "sha512-tWoxZ663Zf/n8VxXTHnTJsU/w1ysWT1LORnIL1pzqElFdSqBhWbZeJ3sLdCZ5FpzpbkpkYEtluhuTyG2BTDYNQ==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/make-cancellable-promise": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", - "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", - "funding": { - "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" - } - }, - "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==", - "optional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-event-props": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", - "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", - "funding": { - "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/merge-refs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", - "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", - "funding": { - "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multibase": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", - "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "@multiformats/base-x": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multiformats": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/multihashes": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", - "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", - "dependencies": { - "multibase": "^4.0.1", - "uint8arrays": "^3.0.0", - "varint": "^5.0.2" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multihashes/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/multihashes/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/multihashes/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/murmurhash3js-revisited": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", - "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", - "optional": true - }, - "node_modules/nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", - "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-wheel": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", - "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-defer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", - "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", - "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^5.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path2d-polyfill": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", - "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pdfjs-dist": { - "version": "3.11.174", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz", - "integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==", - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "canvas": "^2.11.2", - "path2d-polyfill": "^2.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkarr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkarr/-/pkarr-1.1.1.tgz", - "integrity": "sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==", - "dependencies": { - "bencode": "^3.0.3", - "bittorrent-dht": "^11.0.4", - "chalk": "^5.2.0", - "dns-packet": "^5.6.1", - "graceful-goodbye": "^1.3.0", - "sodium-universal": "^4.0.0", - "z32": "^1.0.0" - }, - "bin": { - "pkarr": "bin.js" - } - }, - "node_modules/pkarr/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", - "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/protons-runtime": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.0.tgz", - "integrity": "sha512-jL3VSbXllgm17zurKQ/z+Ath0w+4BknJ+l/NLocfjAB8hbeASOZTNtb7zK3nDsKq2pHK9YFumNQvpkZ6gFfWhA==", - "dependencies": { - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.6" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rabin-wasm": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", - "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", - "dependencies": { - "@assemblyscript/loader": "^0.9.4", - "bl": "^5.0.0", - "debug": "^4.3.1", - "minimist": "^1.2.5", - "node-fetch": "^2.6.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "rabin-wasm": "cli/bin.js" - } - }, - "node_modules/rabin-wasm/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-dropzone": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", - "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "node_modules/react-easy-crop": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.0.4.tgz", - "integrity": "sha512-JfzSk4cBHoksgAtgWUHR/jDYretebMxS0rpAlltP1LeELGMj4WTa420m4PsYFpgQXoJZV0DXmINUlBWAoAD/PQ==", - "dependencies": { - "normalize-wheel": "^1.0.1", - "tslib": "2.0.1" - }, - "peerDependencies": { - "react": ">=16.4.0", - "react-dom": ">=16.4.0" - } - }, - "node_modules/react-easy-crop/node_modules/tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - }, - "node_modules/react-hook-form": { - "version": "7.49.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.2.tgz", - "integrity": "sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==", - "engines": { - "node": ">=18", - "pnpm": "8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-pdf": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.6.0.tgz", - "integrity": "sha512-b2/8V6xhe5pn4Y01ELKTQZ+RhdZl1KpSAMGbN+HCZ/kwhYTIc4Pn5ctz1wRQUu1gOJbIEG4CcjMD9vTCzNdwjw==", - "dependencies": { - "clsx": "^2.0.0", - "make-cancellable-promise": "^1.3.1", - "make-event-props": "^1.6.0", - "merge-refs": "^1.2.1", - "pdfjs-dist": "3.11.174", - "prop-types": "^15.6.2", - "tiny-invariant": "^1.0.0", - "tiny-warning": "^1.0.0" - }, - "funding": { - "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz", - "integrity": "sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==", - "dependencies": { - "@remix-run/router": "1.14.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.21.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz", - "integrity": "sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==", - "dependencies": { - "@remix-run/router": "1.14.1", - "react-router": "6.21.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-spinners": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", - "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.20.tgz", - "integrity": "sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==", - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" - } - }, - "node_modules/react-window": { - "version": "1.8.10", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.10.tgz", - "integrity": "sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "dependencies": { - "b4a": "^1.3.1" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safety-catch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", - "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "optional": true - }, - "node_modules/sha256-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", - "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", - "dependencies": { - "b4a": "^1.0.1", - "sha256-wasm": "^2.2.1" - } - }, - "node_modules/sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/sha512-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", - "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", - "dependencies": { - "b4a": "^1.0.1", - "sha512-wasm": "^2.3.1" - } - }, - "node_modules/sha512-wasm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", - "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "optional": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "optional": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/siphash24": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", - "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/sodium-javascript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", - "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/sodium-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", - "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.6.0" - } - }, - "node_modules/sodium-universal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", - "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-array": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", - "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwind-merge": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.1.0.tgz", - "integrity": "sha512-l11VvI4nSwW7MtLSLYT4ldidDEUwQAMWuSHk7l4zcXZDgnCRa0V3OdCwFfM7DCzakVXMNRwAeje9maFFXT71dQ==", - "dependencies": { - "@babel/runtime": "^7.23.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", - "integrity": "sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "optional": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uint8-util": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.4.tgz", - "integrity": "sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.7.tgz", - "integrity": "sha512-ohRElqR6C5dd60vRFLq40MCiSnUe1AzkpHvbCEMCGGP6zMoFYECsjdhL6bR1kTK37ONNRDuHQ3RIpScRYcYYIg==", - "dependencies": { - "uint8arrays": "^4.0.2" - } - }, - "node_modules/uint8arrays": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", - "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", - "dependencies": { - "multiformats": "^12.0.1" - } - }, - "node_modules/uint8arrays/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ulidx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", - "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", - "dependencies": { - "layerr": "^2.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xsalsa20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", - "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/z32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", - "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", - "dependencies": { - "b4a": "^1.5.3" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zustand": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.7.tgz", - "integrity": "sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - } -} diff --git a/tauri-app/pnpm-lock.yaml b/tauri-app/pnpm-lock.yaml new file mode 100644 index 0000000..606e550 --- /dev/null +++ b/tauri-app/pnpm-lock.yaml @@ -0,0 +1,4080 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@hookform/resolvers': + specifier: ^3.3.2 + version: 3.3.3(react-hook-form@7.49.2) + '@radix-ui/react-avatar': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.0.6 + version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-label': + specifier: ^2.0.2 + version: 2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-tabs': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@tauri-apps/api': + specifier: ^1.5.2 + version: 1.5.3 + '@web5/api': + specifier: ^0.8.3 + version: 0.8.3 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.0.0 + version: 2.1.0 + lucide-react: + specifier: ^0.298.0 + version: 0.298.0(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-dropzone: + specifier: ^14.2.3 + version: 14.2.3(react@18.2.0) + react-easy-crop: + specifier: ^5.0.4 + version: 5.0.4(react-dom@18.2.0)(react@18.2.0) + react-hook-form: + specifier: ^7.49.2 + version: 7.49.2(react@18.2.0) + react-pdf: + specifier: ^7.6.0 + version: 7.6.0(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + react-router-dom: + specifier: ^6.21.1 + version: 6.21.1(react-dom@18.2.0)(react@18.2.0) + react-spinners: + specifier: ^0.13.8 + version: 0.13.8(react-dom@18.2.0)(react@18.2.0) + react-virtualized-auto-sizer: + specifier: ^1.0.20 + version: 1.0.20(react-dom@18.2.0)(react@18.2.0) + react-window: + specifier: ^1.8.10 + version: 1.8.10(react-dom@18.2.0)(react@18.2.0) + tailwind-merge: + specifier: ^2.1.0 + version: 2.2.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.0) + zod: + specifier: ^3.22.4 + version: 3.22.4 + zustand: + specifier: ^4.4.7 + version: 4.4.7(@types/react@18.2.46)(react@18.2.0) + +devDependencies: + '@tauri-apps/cli': + specifier: ^1.5.7 + version: 1.5.9 + '@types/node': + specifier: ^20.10.5 + version: 20.10.6 + '@types/react': + specifier: ^18.2.15 + version: 18.2.46 + '@types/react-dom': + specifier: ^18.2.7 + version: 18.2.18 + '@types/react-window': + specifier: ^1.8.8 + version: 1.8.8 + '@vitejs/plugin-react': + specifier: ^4.0.3 + version: 4.2.1(vite@4.5.1) + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.32) + postcss: + specifier: ^8.4.32 + version: 8.4.32 + tailwindcss: + specifier: ^3.4.0 + version: 3.4.0 + typescript: + specifier: ^5.0.2 + version: 5.3.3 + vite: + specifier: ^4.4.4 + version: 4.5.1(@types/node@20.10.6) + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@assemblyscript/loader@0.9.4: + resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} + dev: false + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@decentralized-identity/ion-pow-sdk@1.0.17: + resolution: {integrity: sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==} + dependencies: + buffer: 6.0.3 + cross-fetch: 3.1.5 + hash-wasm: 4.9.0 + transitivePeerDependencies: + - encoding + dev: false + + /@decentralized-identity/ion-sdk@1.0.1: + resolution: {integrity: sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==} + dependencies: + '@noble/ed25519': 2.0.0 + '@noble/secp256k1': 2.0.0 + canonicalize: 2.0.0 + multiformats: 12.1.3 + multihashes: 4.0.3 + uri-js: 4.4.1 + dev: false + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@floating-ui/core@1.5.2: + resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} + dependencies: + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/dom@1.5.3: + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + dependencies: + '@floating-ui/core': 1.5.2 + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/react-dom@2.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.1.6: + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + dev: false + + /@hookform/resolvers@3.3.3(react-hook-form@7.49.2): + resolution: {integrity: sha512-bOMxKkSD3zWcS11TKoUQ8O0ZqKslFohvUsPKSrdCHiuEuMjRo/u3cq9YRJD/+xtNGYup++XD2LkjhegP5XENiw==} + peerDependencies: + react-hook-form: ^7.0.0 + dependencies: + react-hook-form: 7.49.2(react@18.2.0) + dev: false + + /@ipld/dag-cbor@9.0.3: + resolution: {integrity: sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + cborg: 2.0.5 + multiformats: 12.1.3 + dev: false + + /@ipld/dag-pb@4.0.7: + resolution: {integrity: sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 13.0.0 + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@js-temporal/polyfill@0.4.4: + resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} + engines: {node: '>=12'} + dependencies: + jsbi: 4.3.0 + tslib: 2.6.2 + dev: false + + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + optional: true + + /@multiformats/base-x@4.0.1: + resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} + dev: false + + /@multiformats/murmur3@2.1.7: + resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + multiformats: 12.1.3 + murmurhash3js-revisited: 3.0.0 + dev: false + + /@noble/ciphers@0.1.4: + resolution: {integrity: sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==} + dev: false + + /@noble/ciphers@0.3.0: + resolution: {integrity: sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==} + dev: false + + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /@noble/curves@1.3.0: + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + dependencies: + '@noble/hashes': 1.3.3 + dev: false + + /@noble/ed25519@2.0.0: + resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==} + dev: false + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + dev: false + + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: false + + /@noble/secp256k1@2.0.0: + resolution: {integrity: sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==} + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.46)(react@18.2.0) + dev: false + + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.46)(react@18.2.0) + '@types/react': 18.2.46 + react: 18.2.0 + dev: false + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /@remix-run/router@1.14.1: + resolution: {integrity: sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==} + engines: {node: '>=14.0.0'} + dev: false + + /@tauri-apps/api@1.5.3: + resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + dev: false + + /@tauri-apps/cli-darwin-arm64@1.5.9: + resolution: {integrity: sha512-7C2Jf8f0gzv778mLYb7Eszqqv1bm9Wzews81MRTqKrUIcC+eZEtDXLex+JaEkEzFEUrgIafdOvMBVEavF030IA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-darwin-x64@1.5.9: + resolution: {integrity: sha512-LHKytpkofPYgH8RShWvwDa3hD1ws131x7g7zNasJPfOiCWLqYVQFUuQVmjEUt8+dpHe/P/err5h4z+YZru2d0A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm-gnueabihf@1.5.9: + resolution: {integrity: sha512-teGK20IYKx+dVn8wFq/Lg57Q9ce7foq1KHSfyHi464LVt1T0V1rsmULSgZpQPPj/NYPF5BG78PcWYv64yH86jw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm64-gnu@1.5.9: + resolution: {integrity: sha512-onJ/DW5Crw38qVx+wquY4uBbfCxVhzhdJmlCYqnYyXsZZmSiPUfSyhV58y+5TYB0q1hG8eYdB5x8VAwzByhGzw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm64-musl@1.5.9: + resolution: {integrity: sha512-23AYoLD3acakLp9NtheKQDJl8F66eTOflxoPzdJNRy13hUSxb+W9qpz4rRA+CIzkjICFvO2i3UWjeV9QwDVpsQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-x64-gnu@1.5.9: + resolution: {integrity: sha512-9PQA1rE7gh41W2ylyKd5qOGOds55ymaYPml9KOpM0g+cxmCXa+8Wf9K5NKvACnJldJJ6cekWzIyB4eN6o5T+yQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-x64-musl@1.5.9: + resolution: {integrity: sha512-5hdbNFeDsrJ/pXZ4cSQV4bJwUXPPxXxN3/pAtNUqIph7q+vLcBXOXIMoS64iuyaluJC59lhEwlWZFz+EPv0Hqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-arm64-msvc@1.5.9: + resolution: {integrity: sha512-O18JufjSB3hSJYu5WWByONouGeX7DraLAtXLErsG1r/VS3zHd/zyuzycrVUaObNXk5bfGlIP0Ypt+RvZJILN2w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-ia32-msvc@1.5.9: + resolution: {integrity: sha512-FQxtxTZu0JVBihfd/lmpxo7jyMOesjWQehfyVUqtgMfm5+Pvvw0Y+ZioeDi1TZkFVrT3QDYy8R4LqDLSZVMQRA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-x64-msvc@1.5.9: + resolution: {integrity: sha512-EeI1+L518cIBLKw0qUFwnLIySBeSmPQjPLIlNwSukHSro4tAQPHycEVGgKrdToiCWgaZJBA0e5aRSds0Du2TWg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli@1.5.9: + resolution: {integrity: sha512-knSt/9AvCTeyfC6wkyeouF9hBW/0Mzuw+5vBKEvzaGPQsfFJo1ZCp5FkdiZpGBBfnm09BhugasGRTGofzatfqQ==} + engines: {node: '>= 10'} + hasBin: true + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 1.5.9 + '@tauri-apps/cli-darwin-x64': 1.5.9 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.5.9 + '@tauri-apps/cli-linux-arm64-gnu': 1.5.9 + '@tauri-apps/cli-linux-arm64-musl': 1.5.9 + '@tauri-apps/cli-linux-x64-gnu': 1.5.9 + '@tauri-apps/cli-linux-x64-musl': 1.5.9 + '@tauri-apps/cli-win32-arm64-msvc': 1.5.9 + '@tauri-apps/cli-win32-ia32-msvc': 1.5.9 + '@tauri-apps/cli-win32-x64-msvc': 1.5.9 + dev: true + + /@tbd54566975/dwn-sdk-js@0.2.8: + resolution: {integrity: sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==} + engines: {node: '>= 18'} + dependencies: + '@ipld/dag-cbor': 9.0.3 + '@js-temporal/polyfill': 0.4.4 + '@noble/ed25519': 2.0.0 + '@noble/secp256k1': 2.0.0 + abstract-level: 1.0.3 + ajv: 8.12.0 + blockstore-core: 4.2.0 + cross-fetch: 4.0.0 + eciesjs: 0.4.5 + flat: 5.0.2 + interface-blockstore: 5.2.3 + interface-store: 5.1.2 + ipfs-unixfs-exporter: 13.1.5 + ipfs-unixfs-importer: 15.1.5 + level: 8.0.0 + lodash: 4.17.21 + lru-cache: 9.1.2 + ms: 2.1.3 + multiformats: 11.0.2 + randombytes: 2.1.0 + readable-stream: 4.4.2 + ulidx: 2.1.0 + uuid: 8.3.2 + varint: 6.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/node@20.10.6: + resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/react-dom@18.2.18: + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + dependencies: + '@types/react': 18.2.46 + + /@types/react-window@1.8.8: + resolution: {integrity: sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==} + dependencies: + '@types/react': 18.2.46 + dev: true + + /@types/react@18.2.46: + resolution: {integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@vitejs/plugin-react@4.2.1(vite@4.5.1): + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 4.5.1(@types/node@20.10.6) + transitivePeerDependencies: + - supports-color + dev: true + + /@web5/agent@0.2.5: + resolution: {integrity: sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==} + engines: {node: '>=18.0.0'} + dependencies: + '@tbd54566975/dwn-sdk-js': 0.2.8 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + '@web5/dids': 0.2.3 + level: 8.0.0 + readable-stream: 4.4.2 + readable-web-to-node-stream: 3.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@web5/api@0.8.3: + resolution: {integrity: sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==} + engines: {node: '>=18.0.0'} + dependencies: + '@tbd54566975/dwn-sdk-js': 0.2.8 + '@web5/agent': 0.2.5 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + '@web5/dids': 0.2.3 + '@web5/user-agent': 0.2.5 + level: 8.0.0 + ms: 2.1.3 + readable-stream: 4.4.2 + readable-web-to-node-stream: 3.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@web5/common@0.2.1: + resolution: {integrity: sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==} + engines: {node: '>=18.0.0'} + dependencies: + level: 8.0.0 + multiformats: 11.0.2 + dev: false + + /@web5/common@0.2.2: + resolution: {integrity: sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==} + engines: {node: '>=18.0.0'} + dependencies: + level: 8.0.0 + multiformats: 11.0.2 + readable-stream: 4.4.2 + dev: false + + /@web5/crypto@0.2.2: + resolution: {integrity: sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@noble/ciphers': 0.1.4 + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@web5/common': 0.2.1 + dev: false + + /@web5/dids@0.2.3: + resolution: {integrity: sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==} + engines: {node: '>=18.0.0'} + dependencies: + '@decentralized-identity/ion-pow-sdk': 1.0.17 + '@decentralized-identity/ion-sdk': 1.0.1 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + did-resolver: 4.1.0 + dns-packet: 5.6.1 + level: 8.0.0 + ms: 2.1.3 + pkarr: 1.1.1 + z32: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@web5/user-agent@0.2.5: + resolution: {integrity: sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==} + engines: {node: '>=18.0.0'} + dependencies: + '@web5/agent': 0.2.5 + '@web5/common': 0.2.2 + '@web5/crypto': 0.2.2 + '@web5/dids': 0.2.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + requiresBuild: true + dev: false + optional: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /abstract-level@1.0.3: + resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + catering: 2.1.1 + is-buffer: 2.0.5 + level-supports: 4.0.1 + level-transcoder: 1.0.1 + module-error: 1.0.2 + queue-microtask: 1.2.3 + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + requiresBuild: true + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + requiresBuild: true + dev: false + optional: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + optional: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + + /attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + dev: false + + /autoprefixer@10.4.16(postcss@8.4.32): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001572 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: true + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /bencode@2.0.3: + resolution: {integrity: sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==} + dev: false + + /bencode@3.1.1: + resolution: {integrity: sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==} + engines: {node: '>=12.20.0'} + dependencies: + uint8-util: 2.2.4 + dev: false + + /bencode@4.0.0: + resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==} + engines: {node: '>=12.20.0'} + dependencies: + uint8-util: 2.2.4 + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /bittorrent-dht@11.0.5: + resolution: {integrity: sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==} + engines: {node: '>=12.20.0'} + dependencies: + bencode: 4.0.0 + debug: 4.3.4 + k-bucket: 5.1.0 + k-rpc: 5.1.0 + last-one-wins: 1.0.4 + lru: 3.1.0 + randombytes: 2.1.0 + record-cache: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /blake2b-wasm@2.4.0: + resolution: {integrity: sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==} + dependencies: + b4a: 1.6.4 + nanoassert: 2.0.0 + dev: false + + /blake2b@2.1.4: + resolution: {integrity: sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==} + dependencies: + blake2b-wasm: 2.4.0 + nanoassert: 2.0.0 + dev: false + + /blockstore-core@4.2.0: + resolution: {integrity: sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + interface-blockstore: 5.2.3 + interface-store: 5.1.2 + multiformats: 11.0.2 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + requiresBuild: true + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + optional: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browser-level@1.0.1: + resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} + dependencies: + abstract-level: 1.0.3 + catering: 2.1.1 + module-error: 1.0.2 + run-parallel-limit: 1.1.0 + dev: false + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001572 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + /caniuse-lite@1.0.30001572: + resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==} + dev: true + + /canonicalize@2.0.0: + resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} + dev: false + + /canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + nan: 2.18.0 + simple-get: 3.1.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + optional: true + + /catering@2.1.1: + resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} + engines: {node: '>=6'} + dev: false + + /cborg@2.0.5: + resolution: {integrity: sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==} + hasBin: true + dev: false + + /chacha20-universal@1.0.4: + resolution: {integrity: sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==} + dependencies: + nanoassert: 2.0.0 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + requiresBuild: true + dev: false + optional: true + + /chrome-dgram@3.0.6: + resolution: {integrity: sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==} + dependencies: + inherits: 2.0.4 + run-series: 1.1.9 + dev: false + + /chrome-dns@1.0.1: + resolution: {integrity: sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==} + dependencies: + chrome-net: 3.3.4 + dev: false + + /chrome-net@3.3.4: + resolution: {integrity: sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==} + dependencies: + inherits: 2.0.4 + dev: false + + /class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + dependencies: + clsx: 2.0.0 + dev: false + + /classic-level@1.3.0: + resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} + engines: {node: '>=12'} + requiresBuild: true + dependencies: + abstract-level: 1.0.3 + catering: 2.1.1 + module-error: 1.0.2 + napi-macros: 2.2.2 + node-gyp-build: 4.7.1 + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + requiresBuild: true + dev: false + optional: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + requiresBuild: true + dev: false + optional: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + mimic-response: 2.1.0 + dev: false + optional: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + requiresBuild: true + dev: false + optional: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /did-resolver@4.1.0: + resolution: {integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /eciesjs@0.4.5: + resolution: {integrity: sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==} + engines: {node: '>=16.0.0'} + dependencies: + '@noble/ciphers': 0.3.0 + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + dev: false + + /electron-to-chromium@1.4.616: + resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + + /file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + dependencies: + tslib: 2.6.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + dev: false + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + dev: false + optional: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + optional: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + requiresBuild: true + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + optional: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /graceful-goodbye@1.3.0: + resolution: {integrity: sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==} + dependencies: + safety-catch: 1.0.2 + dev: false + + /hamt-sharding@3.0.2: + resolution: {integrity: sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + sparse-array: 1.3.2 + uint8arrays: 4.0.10 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + requiresBuild: true + dev: false + optional: true + + /hash-wasm@4.9.0: + resolution: {integrity: sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + requiresBuild: true + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + requiresBuild: true + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + optional: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /interface-blockstore@5.2.3: + resolution: {integrity: sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + interface-store: 5.1.2 + multiformats: 11.0.2 + dev: false + + /interface-store@5.1.2: + resolution: {integrity: sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /ipfs-unixfs-exporter@13.1.5: + resolution: {integrity: sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-cbor': 9.0.3 + '@ipld/dag-pb': 4.0.7 + '@multiformats/murmur3': 2.1.7 + err-code: 3.0.1 + hamt-sharding: 3.0.2 + interface-blockstore: 5.2.3 + ipfs-unixfs: 11.1.2 + it-filter: 3.0.4 + it-last: 3.0.4 + it-map: 3.0.5 + it-parallel: 3.0.6 + it-pipe: 3.0.1 + it-pushable: 3.2.3 + multiformats: 11.0.2 + p-queue: 7.4.1 + progress-events: 1.0.0 + uint8arrays: 4.0.10 + dev: false + + /ipfs-unixfs-importer@15.1.5: + resolution: {integrity: sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + '@ipld/dag-pb': 4.0.7 + '@multiformats/murmur3': 2.1.7 + err-code: 3.0.1 + hamt-sharding: 3.0.2 + interface-blockstore: 5.2.3 + interface-store: 5.1.2 + ipfs-unixfs: 11.1.2 + it-all: 3.0.4 + it-batch: 3.0.4 + it-first: 3.0.4 + it-parallel-batch: 3.0.4 + multiformats: 11.0.2 + progress-events: 1.0.0 + rabin-wasm: 0.1.5 + uint8arraylist: 2.4.8 + uint8arrays: 4.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /ipfs-unixfs@11.1.2: + resolution: {integrity: sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + err-code: 3.0.1 + protons-runtime: 5.2.1 + uint8arraylist: 2.4.8 + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /it-all@3.0.4: + resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==} + dev: false + + /it-batch@3.0.4: + resolution: {integrity: sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==} + dev: false + + /it-filter@3.0.4: + resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==} + dependencies: + it-peekable: 3.0.3 + dev: false + + /it-first@3.0.4: + resolution: {integrity: sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==} + dev: false + + /it-last@3.0.4: + resolution: {integrity: sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==} + dev: false + + /it-map@3.0.5: + resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==} + dependencies: + it-peekable: 3.0.3 + dev: false + + /it-merge@3.0.3: + resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==} + dependencies: + it-pushable: 3.2.3 + dev: false + + /it-parallel-batch@3.0.4: + resolution: {integrity: sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==} + dependencies: + it-batch: 3.0.4 + dev: false + + /it-parallel@3.0.6: + resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==} + dependencies: + p-defer: 4.0.0 + dev: false + + /it-peekable@3.0.3: + resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==} + dev: false + + /it-pipe@3.0.1: + resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dependencies: + it-merge: 3.0.3 + it-pushable: 3.2.3 + it-stream-types: 2.0.1 + dev: false + + /it-pushable@3.2.3: + resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} + dependencies: + p-defer: 4.0.0 + dev: false + + /it-stream-types@2.0.1: + resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /jsbi@4.3.0: + resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==} + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /k-bucket@5.1.0: + resolution: {integrity: sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==} + dependencies: + randombytes: 2.1.0 + dev: false + + /k-rpc-socket@1.11.1: + resolution: {integrity: sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==} + dependencies: + bencode: 2.0.3 + chrome-dgram: 3.0.6 + chrome-dns: 1.0.1 + chrome-net: 3.3.4 + dev: false + + /k-rpc@5.1.0: + resolution: {integrity: sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==} + dependencies: + k-bucket: 5.1.0 + k-rpc-socket: 1.11.1 + randombytes: 2.1.0 + dev: false + + /last-one-wins@1.0.4: + resolution: {integrity: sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==} + dev: false + + /layerr@2.0.1: + resolution: {integrity: sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==} + dev: false + + /level-supports@4.0.1: + resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} + engines: {node: '>=12'} + dev: false + + /level-transcoder@1.0.1: + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + module-error: 1.0.2 + dev: false + + /level@8.0.0: + resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} + engines: {node: '>=12'} + dependencies: + browser-level: 1.0.1 + classic-level: 1.3.0 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + yallist: 4.0.0 + dev: false + optional: true + + /lru-cache@9.1.2: + resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==} + engines: {node: 14 || >=16.14} + dev: false + + /lru@3.1.0: + resolution: {integrity: sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==} + engines: {node: '>= 0.4.0'} + dependencies: + inherits: 2.0.4 + dev: false + + /lucide-react@0.298.0(react@18.2.0): + resolution: {integrity: sha512-tWoxZ663Zf/n8VxXTHnTJsU/w1ysWT1LORnIL1pzqElFdSqBhWbZeJ3sLdCZ5FpzpbkpkYEtluhuTyG2BTDYNQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /make-cancellable-promise@1.3.2: + resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} + dev: false + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + semver: 6.3.1 + dev: false + optional: true + + /make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + dev: false + + /memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + dev: false + + /merge-refs@1.2.2(@types/react@18.2.46): + resolution: {integrity: sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + requiresBuild: true + dependencies: + brace-expansion: 1.1.11 + dev: false + optional: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + yallist: 4.0.0 + dev: false + optional: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + optional: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /module-error@1.0.2: + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: '>=10'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /multibase@4.0.6: + resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + '@multiformats/base-x': 4.0.1 + dev: false + + /multiformats@11.0.2: + resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /multiformats@13.0.0: + resolution: {integrity: sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==} + dev: false + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + dev: false + + /multihashes@4.0.3: + resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + dependencies: + multibase: 4.0.6 + uint8arrays: 3.1.1 + varint: 5.0.2 + dev: false + + /murmurhash3js-revisited@3.0.0: + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + requiresBuild: true + dev: false + optional: true + + /nanoassert@2.0.0: + resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /napi-macros@2.2.2: + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-gyp-build@4.7.1: + resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} + hasBin: true + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + requiresBuild: true + dependencies: + abbrev: 1.1.1 + dev: false + optional: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-wheel@1.0.1: + resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} + dev: false + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + requiresBuild: true + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + optional: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + requiresBuild: true + dependencies: + wrappy: 1.0.2 + dev: false + optional: true + + /p-defer@4.0.0: + resolution: {integrity: sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==} + engines: {node: '>=12'} + dev: false + + /p-queue@7.4.1: + resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} + engines: {node: '>=12'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 5.1.0 + dev: false + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + + /path2d-polyfill@2.0.1: + resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /pdfjs-dist@3.11.174: + resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} + engines: {node: '>=18'} + optionalDependencies: + canvas: 2.11.2 + path2d-polyfill: 2.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + /pkarr@1.1.1: + resolution: {integrity: sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==} + hasBin: true + dependencies: + bencode: 3.1.1 + bittorrent-dht: 11.0.5 + chalk: 5.3.0 + dns-packet: 5.6.1 + graceful-goodbye: 1.3.0 + sodium-universal: 4.0.0 + z32: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /postcss-import@15.1.0(postcss@8.4.32): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + /postcss-js@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.32 + + /postcss-load-config@4.0.2(postcss@8.4.32): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.32 + yaml: 2.3.4 + + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.15 + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /progress-events@1.0.0: + resolution: {integrity: sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /protons-runtime@5.2.1: + resolution: {integrity: sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==} + dependencies: + uint8arraylist: 2.4.8 + uint8arrays: 5.0.1 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /rabin-wasm@0.1.5: + resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} + hasBin: true + dependencies: + '@assemblyscript/loader': 0.9.4 + bl: 5.1.0 + debug: 4.3.4 + minimist: 1.2.8 + node-fetch: 2.7.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-dropzone@14.2.3(react@18.2.0): + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + dependencies: + attr-accept: 2.2.2 + file-selector: 0.6.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /react-easy-crop@5.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JfzSk4cBHoksgAtgWUHR/jDYretebMxS0rpAlltP1LeELGMj4WTa420m4PsYFpgQXoJZV0DXmINUlBWAoAD/PQ==} + peerDependencies: + react: '>=16.4.0' + react-dom: '>=16.4.0' + dependencies: + normalize-wheel: 1.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.0.1 + dev: false + + /react-hook-form@7.49.2(react@18.2.0): + resolution: {integrity: sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==} + engines: {node: '>=18', pnpm: '8'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + react: 18.2.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react-pdf@7.6.0(@types/react@18.2.46)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-b2/8V6xhe5pn4Y01ELKTQZ+RhdZl1KpSAMGbN+HCZ/kwhYTIc4Pn5ctz1wRQUu1gOJbIEG4CcjMD9vTCzNdwjw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + clsx: 2.1.0 + make-cancellable-promise: 1.3.2 + make-event-props: 1.6.2 + merge-refs: 1.2.2(@types/react@18.2.46) + pdfjs-dist: 3.11.174 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tiny-invariant: 1.3.1 + tiny-warning: 1.0.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.46)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.46)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.46)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.1(@types/react@18.2.46)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.46)(react@18.2.0) + dev: false + + /react-router-dom@6.21.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.14.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.21.1(react@18.2.0) + dev: false + + /react-router@6.21.1(react@18.2.0): + resolution: {integrity: sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.14.1 + react: 18.2.0 + dev: false + + /react-spinners@0.13.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-virtualized-auto-sizer@1.0.20(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OdIyHwj4S4wyhbKHOKM1wLSj/UDXm839Z3Cvfg2a9j+He6yDa6i5p0qQvEiCnyQlGO/HyfSnigQwuxvYalaAXA==} + peerDependencies: + react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc + react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-window@1.8.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==} + engines: {node: '>8.0.0'} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.7 + memoize-one: 5.2.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + dependencies: + readable-stream: 3.6.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /record-cache@1.2.0: + resolution: {integrity: sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==} + dependencies: + b4a: 1.6.4 + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + requiresBuild: true + dependencies: + glob: 7.2.3 + dev: false + optional: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel-limit@1.1.0: + resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /run-series@1.1.9: + resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safety-catch@1.0.2: + resolution: {integrity: sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==} + dev: false + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + lru-cache: 6.0.0 + dev: false + optional: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + requiresBuild: true + dev: false + optional: true + + /sha256-universal@1.2.1: + resolution: {integrity: sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==} + dependencies: + b4a: 1.6.4 + sha256-wasm: 2.2.2 + dev: false + + /sha256-wasm@2.2.2: + resolution: {integrity: sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==} + dependencies: + b4a: 1.6.4 + nanoassert: 2.0.0 + dev: false + + /sha512-universal@1.2.1: + resolution: {integrity: sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==} + dependencies: + b4a: 1.6.4 + sha512-wasm: 2.3.4 + dev: false + + /sha512-wasm@2.3.4: + resolution: {integrity: sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==} + dependencies: + b4a: 1.6.4 + nanoassert: 2.0.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + requiresBuild: true + dev: false + optional: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true + dev: false + optional: true + + /simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + requiresBuild: true + dependencies: + decompress-response: 4.2.1 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + optional: true + + /siphash24@1.3.1: + resolution: {integrity: sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==} + dependencies: + nanoassert: 2.0.0 + dev: false + + /sodium-javascript@0.8.0: + resolution: {integrity: sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==} + dependencies: + blake2b: 2.1.4 + chacha20-universal: 1.0.4 + nanoassert: 2.0.0 + sha256-universal: 1.2.1 + sha512-universal: 1.2.1 + siphash24: 1.3.1 + xsalsa20: 1.2.0 + dev: false + + /sodium-native@4.0.4: + resolution: {integrity: sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==} + requiresBuild: true + dependencies: + node-gyp-build: 4.7.1 + dev: false + + /sodium-universal@4.0.0: + resolution: {integrity: sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==} + dependencies: + blake2b: 2.1.4 + chacha20-universal: 1.0.4 + nanoassert: 2.0.0 + sha256-universal: 1.2.1 + sha512-universal: 1.2.1 + siphash24: 1.3.1 + sodium-javascript: 0.8.0 + sodium-native: 4.0.4 + xsalsa20: 1.2.0 + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /sparse-array@1.3.2: + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tailwind-merge@2.2.0: + resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.4.0): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.4.0 + dev: false + + /tailwindcss@3.4.0: + resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.2(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.32) + postcss-selector-parser: 6.0.15 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + optional: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + dev: false + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + /tslib@2.0.1: + resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uint8-util@2.2.4: + resolution: {integrity: sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==} + dependencies: + base64-arraybuffer: 1.0.2 + dev: false + + /uint8arraylist@2.4.8: + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + dependencies: + uint8arrays: 5.0.1 + dev: false + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + dev: false + + /uint8arrays@4.0.10: + resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==} + dependencies: + multiformats: 12.1.3 + dev: false + + /uint8arrays@5.0.1: + resolution: {integrity: sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==} + dependencies: + multiformats: 13.0.0 + dev: false + + /ulidx@2.1.0: + resolution: {integrity: sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==} + engines: {node: '>=16'} + dependencies: + layerr: 2.0.1 + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: false + + /use-callback-ref@1.3.1(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.46 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + dev: false + + /varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: false + + /vite@4.5.1(@types/node@20.10.6): + resolution: {integrity: sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.10.6 + esbuild: 0.18.20 + postcss: 8.4.32 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + requiresBuild: true + dependencies: + string-width: 4.2.3 + dev: false + optional: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + requiresBuild: true + dev: false + optional: true + + /xsalsa20@1.2.0: + resolution: {integrity: sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + requiresBuild: true + dev: false + optional: true + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + /z32@1.0.1: + resolution: {integrity: sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==} + dependencies: + b4a: 1.6.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zustand@4.4.7(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index fbdf233..6175df4 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -1,20 +1,20 @@ -import useWeb5Store from "./stores/useWeb5Store"; -import { useEffect } from "react"; +import { Route, Routes, BrowserRouter } from "react-router-dom"; -function App() { - const web5 = useWeb5Store((state) => state.web5); - const connect = useWeb5Store((state) => state.connect); - const did = useWeb5Store((state) => state.did); - - useEffect(() => { - if (!web5) connect(); - }, []); +import SharedLayout from "./pages/SharedLayout/"; +import Home from "./pages/Home/"; +function App() { return ( -
- {did} -
- ) + <> + + + }> + } /> + + + + + ); } export default App; diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css new file mode 100644 index 0000000..cc3d57a --- /dev/null +++ b/tauri-app/src/index.css @@ -0,0 +1,15 @@ +:root { + --color-green: #22c55e; + --box-shadow-green: 0 5px 12px rgba(34, 197, 94, 0.5); + --color-red: #ef4444; + --box-shadow-red: 0 5px 12px rgba(239, 68, 68, 0.5); + --color-blue: #0ea5e9; + --color-white: #fff; + --color-black: #000; + --color-orange: #f97316; +} + +* { + margin: 0; + padding: 0; +} diff --git a/tauri-app/src/main.tsx b/tauri-app/src/main.tsx index 24eb0b3..ca0902c 100644 --- a/tauri-app/src/main.tsx +++ b/tauri-app/src/main.tsx @@ -1,10 +1,10 @@ // import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; -import "./globals.css"; +import "./index.css"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( // - + , // {/* */} ); diff --git a/tauri-app/src/pages/Home/index.css b/tauri-app/src/pages/Home/index.css new file mode 100644 index 0000000..b026f0a --- /dev/null +++ b/tauri-app/src/pages/Home/index.css @@ -0,0 +1,52 @@ +.main_container { + padding: 40px 65px; +} + +.info_container h1 { + font-size: 40px; + font-family: "Roboto"; + font-weight: 700; + text-transform: uppercase; + margin: 20px 0px; +} + +.header { + font-family: "Roboto"; + font-size: 20px; + font-weight: 500; +} + +.header b { + font-family: "Pacifico"; + text-transform: capitalize; + color: var(--color-blue); +} + +.info_container p { + font-family: "Open Sans"; + font-weight: 200; + margin-bottom: 20px; +} + +.gs_btn { + width: max-content; + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); + padding: 15px 20px; + border: none; + border-radius: 5px; + font-size: 20px; + font-family: "Pacifico"; + font-weight: 600; +} + +.gs_btn i { + margin-left: 12px; +} + +@media (max-width: 750px) { + .main_container { + padding: 40px 25px; + } +} diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx new file mode 100644 index 0000000..c26364f --- /dev/null +++ b/tauri-app/src/pages/Home/index.tsx @@ -0,0 +1,32 @@ +import "./index.css"; + +export default function Home() { + return ( + <> +
+
+
+ + Hi welcome to, + + pulsepal + + +

Stay up & running while connected

+

+ Pulsepal utilizes web5 to safely store critical user medical + records.Keeping it safe from data loss and give the user full + control over there data as well as keeping,verifying and tracking + home remedies from people with similar conditions while keeping + them connected +

+ +
+
+
+
+ + ); +} diff --git a/tauri-app/src/pages/SharedLayout/index.css b/tauri-app/src/pages/SharedLayout/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/SharedLayout/index.tsx b/tauri-app/src/pages/SharedLayout/index.tsx new file mode 100644 index 0000000..e7f61c9 --- /dev/null +++ b/tauri-app/src/pages/SharedLayout/index.tsx @@ -0,0 +1,40 @@ +import useWeb5Store from "../../stores/useWeb5Store"; +import { useState, useEffect } from "react"; + +import "./index.css"; +import { Outlet } from "react-router-dom"; +import Navbar from "../../../components/Navbar/"; +import MobileNavbar from "../../../components/MobileNavbar/"; + +const index = () => { + const web5 = useWeb5Store((state) => state.web5); + const connect = useWeb5Store((state) => state.connect); + const did = useWeb5Store((state) => state.did); + + useEffect(() => { + if (!web5) connect(); + }, []); + + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + if (window.innerWidth < 750) { + setIsMobile(true); + return; + } + + setIsMobile(false); + }, []); + + return ( +
+ +
+ +
+ {isMobile && } +
+ ); +}; + +export default index; From fa479543e12c878190c483232b968662c6eb81ae Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sun, 31 Dec 2023 18:24:26 +0100 Subject: [PATCH 002/124] done with landing page tho awaiting review --- tauri-app/components/FootNavbar/index.css | 87 ++++++ tauri-app/components/FootNavbar/index.tsx | 35 +++ tauri-app/components/MobileNavbar/index.css | 1 + tauri-app/public/pg.jpg | Bin 0 -> 74547 bytes tauri-app/public/pic.jpg | Bin 0 -> 21888 bytes tauri-app/public/pic2.jpg | Bin 0 -> 54940 bytes tauri-app/public/pm.jpg | Bin 0 -> 47392 bytes tauri-app/public/pma.png | Bin 0 -> 249743 bytes tauri-app/src/index.css | 3 + tauri-app/src/pages/Home/index.css | 277 +++++++++++++++++++- tauri-app/src/pages/Home/index.tsx | 139 +++++++++- tauri-app/src/pages/SharedLayout/index.css | 4 + tauri-app/src/pages/SharedLayout/index.tsx | 13 + 13 files changed, 556 insertions(+), 3 deletions(-) create mode 100644 tauri-app/components/FootNavbar/index.css create mode 100644 tauri-app/components/FootNavbar/index.tsx create mode 100644 tauri-app/public/pg.jpg create mode 100644 tauri-app/public/pic.jpg create mode 100644 tauri-app/public/pic2.jpg create mode 100644 tauri-app/public/pm.jpg create mode 100644 tauri-app/public/pma.png diff --git a/tauri-app/components/FootNavbar/index.css b/tauri-app/components/FootNavbar/index.css new file mode 100644 index 0000000..711ee03 --- /dev/null +++ b/tauri-app/components/FootNavbar/index.css @@ -0,0 +1,87 @@ +.footer-container { + background: #000; + padding: var(--padding-desktop); + color: #fff; + display: flex; + justify-content: space-around; + align-items: center; + padding-top: 20px; +} + +.footer-logo-right-container { + margin-right: 50px; + text-align: center; +} + +.footer-logo-right-container h1 { + margin-bottom: 35px; + font-family: "Roboto"; +} + +.footer-logo-right-container p { + font-family: "Roboto"; +} + +.footer-logo-right-container h1 span { + font-family: "Pacifico"; +} + +.footer-link-container { + width: 100%; +} + +.footer-utils-link-container { + display: flex; + align-items: center; + padding: 10px 0px; + justify-content: space-evenly; +} + +.footer-utils-link-container h1 { + font-family: "Roboto"; + font-size: 18px; +} + +.footer-utils-link-container h1 a { + color: #fff; + text-decoration: none; +} + +.footer-line { + width: 50%; + margin: 10px auto; +} + +.footer-link-container p { + color: #fff; + font-family: "Pacifico"; + margin: 10px auto; +} + +.team-container { + width: 100%; + text-align: center; +} + +@media (max-width: 750px) { + .footer-container { + display: block; + background: #000; + padding: var(--padding-mobile); + } + + .footer-utils-link-container { + display: block; + justify-content: center; + } + + .footer-utils-link-container h1 { + margin: 10px auto; + width: max-content; + } + + .footer-logo-right-container { + width: 100%; + margin: 0; + } +} diff --git a/tauri-app/components/FootNavbar/index.tsx b/tauri-app/components/FootNavbar/index.tsx new file mode 100644 index 0000000..8645bb8 --- /dev/null +++ b/tauri-app/components/FootNavbar/index.tsx @@ -0,0 +1,35 @@ +import "./index.css"; + +const index = () => { + return ( +
+
+

+ PulsePal +

+

Copyright © 2023

+
+
+
+

+ Home +

+

+ DIY Remedies +

+

+ Contact Us +

+
+
+
+

+ Made with by pulsepal team. +

+
+
+
+ ); +}; + +export default index; diff --git a/tauri-app/components/MobileNavbar/index.css b/tauri-app/components/MobileNavbar/index.css index 0bfe306..45b1d1c 100644 --- a/tauri-app/components/MobileNavbar/index.css +++ b/tauri-app/components/MobileNavbar/index.css @@ -12,6 +12,7 @@ justify-content: space-around; align-items: center; background: var(--color-white); + z-index: 5; } .menu_item { diff --git a/tauri-app/public/pg.jpg b/tauri-app/public/pg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86a828a2ea1371b40207e1908eb71532e2af7908 GIT binary patch literal 74547 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 literal 0 HcmV?d00001 diff --git a/tauri-app/public/pic.jpg b/tauri-app/public/pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0195eff6bd02a0ad09ad8cc242f26c82921cbcb2 GIT binary patch literal 21888 zcmbrk1y~$WurAm$gEPRO!5xAJcXxLu1b26Lg1cLS1Sf&umJrZ};>}e}7lik*;G^)#rKfc>{pSOUp?EAP@+UeYt?=EvT-XgoKf*x{9=%qSOlm z0HCspHjYkU7yvjpy1S~&h?DE;>60Ul17H9dKmgbPz{JeWSxG}$6L?8-QWE5DFGBzD zf2Her;H4x0m|>PxB`5zc`u{70Y3A(e4get47ikW23pcYD9R7msz1*Gu(a&Enj;Y;0 z42JuMU0)jbg7N=htN*}E|3l_Ku;@Q*?%-(tBJ;1!&gKs0|8VaMj`H-dc)<|G7aZYf zW8w9JXJ0V2y@!L%3%-59I1UyjZU6uW{YQ7VFtdKatS=bqs;MsVf&~Ep32ODSuwUMw~i zW-R{{`k(3lQQ$u%|JUHZ)yML$zW>x6xuk`qiHE&A`9GzaIoUgTxRSd$o0wUUGymTQ z@&D(H|E*d7tsPA27M2#S7LG4fX}^pz8%L{`?shb{akp`DB)4(=U-j_+$87(t4gcVO zjO!PGUHk;#7_k7b2^;`&G77+9qXLk(A7412|LiwKWNqNz%+n#;`;T$|f?xRmYC(c9E3g z$^jLEDnPZMR!|pc2s8y+0&Rj0K$oCjUa%Ng0jvo&1Y3b!z`o#c zZ~{0BTm=3MZUT3KN5FI74e$~84+MaqLhv9I5M~H3L;|7$(T7+L495x&|95b8%oGhFcoEe-8Tp(N=Tn=10ToYU`+zi|%+&SD6JQ_SP zJR>|myd1nPycN6`d<1+3d?|b*d>{NA{4V@80s;aa!fON`1X%<<1X~0@ggAr`2sH?u z2vZ2#2!9X}5eX0(5rq&{5KR!>5hD<@5kDjTK%7S0MZ85qMIu9DN0LU;M{-08Man>` zMCw4AM%qJqK!zdHAoC-uAe$rmASWUhBex+>AnzhSpkSiBMiD~MM6pE)LCHd?M(IOY zMY%#nMWsaLLsdhyK@CRDLj8(5h`Nb-2gQOiKqa7Wp&rl#Xc@E1ojNOO5i-Umk8b=Pt7AF?x3(h#sIW871C$2WGH*PNOcias;2p%n-9G*R1B3>Qd zJl_2)l2>A{EM7&ws(v;7>IR<(UliX0KL)=Be-8hifSf>zz>Xl9pqXHe5RQ<6P>s-w z@FQU#;V}^okpPhyQ4CQX(K0cZn1NWG*pK)V@hI^h5>gTw5@(WZk{*&{Qan;oQd`nA z(hkxCGHfzoG8?iqvL9rJRl&>kZC_^c0DA%Y^ zsCcO?snV#rsm`g%sFkSwsjH}$X^?4nX{>27X$EL+XkXLn&_>cW)9$~mB1NomtlHUxxd1B>awP!76U17swlV=NMYh$})XJ9vD z&t;$GK;w|+2;ykrxZq^uwBY>6xyXghrNkA<)y?&nn}^$#yPErehnmNjCy!@=7l&7s zH;#9Z51vn)FNp6O-yJ_UzdL^&|Cs=@fSo|4z`o#XK?}iR!EGT*ArqlOp$%bjVPoL} z;SCWA5fhOjku6awQFGB!(LFJGF(=nNC@FSq0f-*#$WgIWxHmxpR3Q`2hJ|1*n3CLXN_gB7>r< zVw)0JNnR;cX;qm<*-^P!1yGSwNmW@>eXZ)E+OCG6rmB{!_Dh{j-Cun`16#vLqf+Bq zQ(QAqb480z%R{SM8$wd8k0vT6MJ9ht# zkQ|I1S{<<*?HqfZNS(Z$rkoj_Bb+x}_+8Rn&RrE;OWi| zVb5I8TQ6;|dT&f`NAFP|2A^o3Jzr_x5c20!az`*nc?e2~UC3A{YiLU7?=YRPws4a0;PCDDGViM*&?8(U79s^A^P}LRY@)`aIij

{KPDk0IVQ~~izJt)V5az{Y^N%vHl>lL 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�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 I0J2~I*{(3C$p8QV literal 0 HcmV?d00001 diff --git a/tauri-app/public/pic2.jpg b/tauri-app/public/pic2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..986a06f3dc0bc89b37b67b2ebf8ad2b5f04d2bb7 GIT binary patch literal 54940 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 z L9K~L!lmiNGKpZ@?InV0Mbi>5lC`IS5Klf0^pWqkCNPOIc^e$&!odq&sH)xy>M zh7D64n1;;Ol^Xn|yx<00Xkoniw-nUKz}wL66btx_2OD|HM~6lOaVfPMd_+RF6uIv- zk1%GX^_owlxQca=eM)oFJ3yr47R=X1qHDt`7Wj5w>|f~$U(0jy5E17z)^X9B_xo1* zSBL!n0MO2}d_iz0L$o#++6&%#z}+nrHv2{I25lGQAjW0RV(QZZw^*k6GX78t+I57r z`AZv3Ur0AVs{prc=B5Lwx6TAn7fTzP#`?`Rfxa$N0TtBRKMphffO1ATiWrl5Ot309lzM=TPN#RZJJSOIKFdf&~hOZ8_)Em>^ z@|Y?QF)?i7CFtE00@`B zmUi_&ys@17LE_zx%TM<*sB#r!CmCEF`^Noq_JjQ^OZh`L$bZaJ?S`H#F@V5KKAnKJ zaRtn|-_}#}oV2a)&RvFZA<3F{-<%C=iQ+tjBWT~!5e|+kOlmt$YcHD* zI5|O43ZG@LL_9YT^p7KJ`E`thg2ceQWjveS#EFfG{iRELqxFr{m=dNXxVQ5F#`wir z6o3OrK@gk?eq=*VtD*N;kC$gCI~!ehw}(oCeD{E9>E#0bAY5%x1AMXeMuK`ztI;*8 z54@^2=&^KVZX)%>OB)ObP5mLo<@!Q3d324W9aoH2_k>{d z#3{m-TpLCO7;maL(PO-`;te;pW~T(hnhcxy4v^NXr^@HYT>ST zCiCuuQLyO-tvsy)@c71ID1Bh>>7Haa=?X?AQO(K4SqeUdtU}h+yx7@0-;xQZa+AE;V@VPC8&=hgU`oaEH={$UqHel3M}gqF zMU~tlx4~z6>C^j+)p+m?rt5J z+CrJX36fWd=vxNc{fh0RiZRXKp%roAo9szONM_VWk+CNI4+>q1l&n*Xo&^Fh5*tWN zLqyBIOKxJljHRN9Wpl&x+_Jf0a#V%*Hsfh+D%7zDjU9=sSql(aZbHK*Op9z>*txip zQ|FXI2unvHvL(xsXr0r+p5}Xz_Y_5>gj{9rUcy$$uVQN@EJV1RScu^br|LKhl5Zuj zQs9iTUdI0bVn0z08!Af3RS8T%Jss6E0kIBXpC&ftnez4Ya^BT60*^0THYBB3D~1}p-8@yc95j|4or^=N_67gnAen_ zPn;C`JHARZR2G&hbnu@juS3K5EIbyt#_z#zK}5EV7t%xIiY`f1DZ+2ir_#y&SUQ?c zKL+a*w@OI2iJ_pywbCh%X}i_VcKM{wwSmMO;LqWu{q zDD(dS1f-h4>I!F6y!vBHk3XuqOPI2>ry08ti*r~P0$MU}%F0X1R9Mrc z%DG9cx>apK*zxLqG*9$lywg%g=M!QsNGfA z+`E-!jIyL~K#Kkjsu!aDvR&(P6RRE%9=Bo&TYTKTEvreA+_4lzPjb7`jqFmLy)G$D z_9}jyui2g?dywgrqMq(i9+fF4zlK-+IeZUFRMoCIS!D5GG@2??+wfA8QYFrPMTcfu z(nfoK$yqB#;U>tc~$fSrt-se6QfJy1L0FavfD?CFb=iRlFHBr9Yt+6KcnWGB>g-eFZ*B z&N8B;yOEaVXV3c}{L1H$>K6oMc%4jD^tI8j+HEY)u)Ydkri`P+{^I%7v#3`{xWtNd zUyZ%LwwqSh@LZwNc#yv95a?qTp6l6_q2wjTkV|U#9@Hw3?u->JvHTSI6s-#p{{W8t zh-OJXf8Letfzy)ASyf=Lxcs}58?n>b(A=)jXo@1s-MKzObdm=oNwT_ZI7*^U^u@^w&*swcbcr;9IQRUDR^-L0e&-xt}I+mAs@7JPT? zX5Gu%g7JK-GBTRs+^XAIO%DvYxVvWYad9*?5-kxbrM;2id})IEM3)TwJ*P)K$jYRB z(B)0@28wc~y>34Z<=B@|1;$3_E?y3&%9qWDqdCzsgf~czRi*Z1qbR)p03=<#jo-Q{ z`88(+i*p7$mo~|S!##~80 zO5G={ZZy{@!F>@3Ni2xBVd|L5oSiT0Bk>A;9YrO?zu4y8iA&^++Tipy_Oaq^M~%gf znoobo{-$3`>rN7r!a6to*?bq$Bwh(=;##a%bj)`r3U88hX@2GWj+`!kPZE_VuR^-Q z{Oyv-3a*^gzmuwhsnbdQ%SYgJ+u@2cznEW5@@{*hoOUG~`-%@G2IEzBCqfb*N7;|1 zmvg{<#nbm>I%-SYNfD0DsjXA8Z0V(XXqKH#N&f&<3wk0oD^G!Rjq=y~BhyFK52mMV zVDRR!$i~HfKRn)*7X?19E2f+uHo=cnEHPMSX;e#7nNoD9X;IO{{Z${IWkh0 zan%0uk90;%QequNyQH{dDnISZ;gFA({ABz;^ndz#b)WXr`yYnO$tCVHtNj*5CqK6&w{v?P z4SyDlU$3cEULuq3LRVUKm166)*y!%J=ht4Z^?j{kJS}>w-5Z%@V|;J-8}&D<+Zi#q zjr>nxMK$tHD`6(w?2ehO#Yr(zz8%~=$>GMlOkw>#C@G7|WF%OSz^@$8*F4 z;4=2dVh;*)NGRwo7UY>b9gGJ;6^~V*7ew6QAy!R!0Xf%40kRt?r7UG>0J>vMf}tyg@sD-6bfFCXRO12Cxg+8GzZPdt=dOzrq%Fw{jDz zq50eQMy3n+ml$v4H~f>tcj%3<4=A}^Q->FTH!3a{-5Jl(GJ=>8a_SL^Gw_6XeK|bB zWhFZe^6I3giTsoJO*6Sz`7h!Kj6_C$Z`o5bS3K;^RXtnSP4xvz=g8ttxN!Yk??o1( z#W*Py8?Z@gyvI{tYWu3(8Nlx7YfLvAgf)6mJ2Qn&^ zt#s@T)Dph~Oh4lb@YMeR({I^U(#7~^kj8^;?6`XYsE+>tFht+UU0qFGPZ_hFuRxo{ zX-~vQs8Pztw(W2sU4Iu+IqqzLY!?h@F~7{&Pe9=(b7T4^Q#LwB^L4de$^QT1o|&15IwHrEJ!{#glk^1Cc*fTN5LfO{}RL z(K|hVd^p>`GBM<&Wz(9$)l+}Cj^8+6hjO2a80C9Co$``5QgLGF-p^z^&9>^0+GZa# z!g2x)!3yB2`p4!mu-e;|6mOB?mbobKik?|d)kibocXZf=M_4D*XARdBjjyM1=%Z*2 zIYq2>9;oUr6NoW59)))~N%v}^am@P>uu;lM)fk-pf^QCx?m$M7k%7;*!>eN~0mjb# z(~7K=wavEVs#}4tHJ!as0dX#sO4-`4Rf~F_Ctu$e^c}-cLOuX*tpqn z*V?3OxFK;O;SPlBp$eZnDvKS^r?V-z+xAlf?B8#ct4`hY`mP-B9=F*R*~*pMT>`2+ zJ-CN;G45x?LJ}9w(t3o(cU$PP_qJOuC*Wc8z^*FOm4qj@$fmf78|pBv;-80?C$r6_ z_fv7F$j3L?fCwXX44w5r^Z16{WmORaJcs+rY#Fo-Ux$=`#_zH*szzF(Kk^HTf4Bbt zutk@a{S$}Zr&T_YJdLuSq9*Hx-z)t>5;W-HWdduIny~ia@TmuI;S=u0o}d){lL=f) z{Sp3HUq!?&Vm?+Dhlghm#zS z@dSLMC+el+H(?n7xa)Kut^Uf2Jn}K8nNDy70FMre`?*un2wq*9_ZGm>!soffYE!9$ z9eZi}E-4ekT7Jb}Fuycgt;YR2tuN7AssY1eaElqtSw;Xl5Tn(j1HWoBXCR(C#c*@^ zBzdCHLIdoxB2!gMZxj5&efcN0Hy(v$lx*;QRE?1GvL4f6blP{H7Kx#a*lMD=cu_`M z-g*V+lDe|Gy5lYp!Q@JH+H*Hvp*78T)9jot=liU`D~R$$N}D8#?c9K=PvtcfckQv) z3U3miXk|MNzEA zyM*7#M_a_&Hj>}sqpz-WZ<)Vk{N}6XA7HAhCzSV|N~b!W+geFcwcl{Xfwf5()0Xo)9v zn(>2+#mby_lQ5)-vOTSK#oDPU_-#A2a6hU0CvmocW(N+R5A2=Bs(|jee(U*#Mq*xb zgSbEXPnI_lTHARdZlLjY>6_j-PvK91`&PJZ&)hr0eJ}tZ*7QJVoY0MtO&!2IvA2AB zs*e(85$SDJLwn^i%_~d>>dFDHZk&J$hr)eS?&a=?)Zi0GbvYDOteiE$zA&mhL(w$> zt`fHGPE6MWgabrz7{uTmsYal3MBMwQ_>Kby?ur|XB;N-3!klUlOz~qgEK~#sEQ6wv zwm3#Rp&UjfH*a?!?;(tvqNDL)CipYQ^iz)N37#Q^)WYq$*~lqIh#-$>?c4vv04ERu z00II60s;d70|5a60000101+WEK~Z6GfsvuH!4T2m@bMu3+5iXv0RRC%5O(SlqRM92 zoClg(WP4rwOLBy|@-on-C9Z%@;6Ij$y3g25m+r^B4;$}BPbhk!k<*o8j99y`3(d_K>>$w4U`?b za_y>_gK>#Z7HT0|YS$Jxp)K^FLaS{+F?1Nz~Sd3k_5m;ZCrj!&(Laz)bQFSu2y|SUT1keGoHEKTY%_0h z??BjWf>5ZX)nC~ST3|eNFJ@4Uxt2o;T%zU`-^@TR9vDNQpc(IoQ6*SM$lNv|gjt*% zlRtKm$J${GMTIV^3mj0F0|H05fDPg|ZiuA}adM6C5CZl=($o5|hT(AIWBQh@bj+Z~Qn{51S{Va;(B=nd^(wauNvV|?*q_OCR@ZT^7IV~N zw2sZ6?gqTKT4j>CAXZg~Ti+3H5K0Wgaaad{iGxHd*mHbW@-Gk=z}TK61hN=;rsd9t ze&Hp+Yn9?F9r=08Ba+M!)U(tAHFa{N%$J`Kwa9%?g@<5qU6RKm#tPqtJN{OUpis7kATZs6hY$q5mae+ed=2ta? z^&D_4`EDke+3pQ@lD;Kot&8A-f&*XV4$DU0`5(Txj1Yt=AbJTE4C>+a7KwN?L`^uU zVhqB}C~gcQC$eSLbrUvBu3iYZC`7p?R|GIkT%c8H0`)5^5ksR>*al@?gW_TW%6UC9 z<2e5S>W`)^+QEP|+^}6Y%uTrF1!g;zqj`*TsA=5<;$~iYbjL2Phf=VVX6pHbQtEHn zG4eL}{{X}^%P3xB3w_JmR|{0T--tW2SdOBlh6)w9)aCs_s}SZ?VRa7`EJ;X}-l9qm zXbm}pJ(1R|s0NgdE^by*(qtt?3S`73g_W|mBtOcOr;gc zt7;~j6=qdqEKoIE#~?}z-FFXays+uZ+`J}Y0bZcCO)xDUE`5kqMNiy#@-}=-?NB(B zlGg%>tXUk-1~0@NlM- z9OD=6APmy?xW=Fko=H`LgHsqlIb!_g7u?{+ss%_8_7FnLs5XC)Ey}m8KQXM81{x@5 zzk+#;va1JobqTwXKG=#|9mXn}+X2a_w~J*#t?>joehH06KB1&9c$G~aVQ!yrn?wW1 zz%)i#3c>#Xu39%=L?Bo%sb+lWxs;Gw4 zRB8=eO1B6208|GlbFi^+T+5_UP1y4YwWisITJXrnIMG=dfD;yy#di%(pyTl{4JH^M zTr@;Ka>Urq^$mHW8qYCiEMW_%R8(zJ^wlCb5X`xhpoyGPZcnI_%mchbXf+9iO)Ql! zxd^=03a<>PWEXP{sZ)&_jlo%*^8!d4JQ2nLB`o&W<_xe~3duwLmnqKM2jdX&k!ZOe z9m^&0p_g)_DX1f){{Re$Y%9ILxrL2#%6?$ZGYT%_DSj5qK;FhU_WEVHq?6WTF{_Dy z#Lp*~WREhUFgc2^WkVGPPGcuvbb#)Y@7@2XHV76){oXrT(XdYnHq2*#ohYIa{ zUozWPg|PFuEd;xBm)xyW-v0nB9NIB#tK&BV5h|o^G*%5m5aeN7MF=K>#VFentKZbB zRon`W80~P)fU;KJW#|{Uml0%Pq>YtGM9?2`xKJtv26^8#!OQs!Z}V$c1#TozP= zcA1Ju;PVl5Z(axy#9Cl;N2nCc-l&x@1=wX|X}j{^gEBaAp|#A+1!DT}mlKm(14_UA zi$Vb|>X%b0nSdw>DZr@I9O@!nv#1n~Al#m!-j{PuTpl#y;;_CYFFS%zy7(m&t!3Oc z<`qMYK)?x=N@Hwy8)fcOS62Z6GGZV+!eszQaKf1UBLJAVl~&}{w*7;5x<6DCW8yA=ACaDc99apS1UO^XEwcX+7E zQr%ukscZ#WuE%lXhSU8*+-qJ;!8J(RQD*w}S!;#r3m6CCQpQNfR2#1d=Et@ml){eS zmX8pcABjsP$tNq1buSTV%qi#8I3qbE6fb&Xh)%lJUi=yi7iAL7xy!o!8 zC4&z)W5aVTVvP2wXa@%dw}{4J534b-Bq3_w(<)z;;qa?Ae!9I~#CWj?!r-YyucDf)(`v#2dt>wHTe0fv^0 zZRIlDPUc*CqAaL4e0|fU_+#?G81^)mez7@KO zeS32Qc#bY&Y_dze4-(uNhX_;!eQ|GiU$R)X)psboAgwX$Y)$JWBQkv@TMvIwt;k0| zr~|W9yxgWQ-dDH@TV*J7-$X@1=L<#u0LbYrmew)L7@HP%mo8=tU`oz^aBP`f;sY9a zBiI*KS&QU^R8u*1a3Gzt$oxRLN`ZFYhF-zjZ^T1N0N|&K?jg)8!hFM5ist?ZAPrDA zkYC9Vs?iEYg#%Pw57e-4HU|Fy5W%e4^Y%g8m02@hW0hRu@^u2E3%_ybG3F>R+yb+n z;KD3;j0&zXL9E8bD$q20f*lxW3iWI-&^;n9%Q;vg%EIw-mk)`JjWr7)SdE{gu{T`m zR|}RkILyi#=4E?=2XRy}N`k275U9$10fpqhGSyU}!Hec#1R0S0#+Y|;&T=aE00jv< zg;&`v5%)CUWHZB{Qi*P9q?;kl-T^OR1GfLx^}Z zY&1Z^p;dJ(Kimo*?jg0JmbUna*53rLLzpzYL;}EVbt>Mag={jGl+<#nI^qG?!xqfO zh|nVv<=kyBOLUAdvVy63xq4nIEG8ft5b|cJr7x>D2o^EA*kj)@5Wo+_10tXmjkpi@ z35a0sFjm~!J&@Ran}gD|@u=?Ix#0>Qn2Ox)TGINK-EkNlA=@ER)EjE!FbhGm8DfPR z7l3OXA~Z14N9(kB{GyRw^o*de6N34u6yYgoj0Giqp)%FI9t}S*xn2yfK4D6`Ipb_a zK>-`PmIC=SeePr|LxGa~$J;^6+$K%Bz9oe+u;ELse~%!cj5A6pQsOdLBh9?(T_yp1 zKA`uA`&y-dH0KifBh)j#Z!FLeMGa0iip>-}(MEOxEW;Fi*4rS5hmoYSG zIhGzF1|mHSN97;D{VQi%Q1#kwqT*HOH7%8p?*zdMsNxN7 zXH8TXK6r?eHS=)n9FSbo%vnO}Cgv+}E6l9p5#eEO;A&!>2*lK|?cZy1(&cKO2x-sWbqYnb`p%+2=GiGJpfpy@sxUj2KII zOWYN`V*UUI{oD_Qo!)$4l{5;=yurgFu)Ru`#r?}Ut~!KRw%9_g!%OP?xQA;!y|Su{ zRvS1i;PnC1dAJ3tzcS&R^KjXsR%hgA3OYcavMz;z9XTC8&kN>>1> znuDRfW&zAC#^Xv^1%N%qyP^|i!kI+^bM(gZLGk_u=qWn53T|RIxR(O0@Q;X|T^~?q z(@c27QqT$?QFO(}sc%xpvKFTdLotADYGNKIjDaeg22cdl5>qzlzfy%elbWA0+#*l~ z`j!UROkL~JwfveBk zs)d@c=HKMBOIvcWy5me2IMf;%B2{SY2Wr4Eu|y;^lJW68O`sYpCT z+O30**}n*P9Iyu9SV2s)j$we1=4&jlEN?iJkxROqTN`C$YAi$Cu%dPaWr!NgxgEhI zA}anOpiito-W~~cHE90;Y-78ROBkDx@wTFGUcnh*Bu51)k0#iWC|%RX`qs8Tr-a;uNNK97gw+ z_=B%s5t{pmKt5QO_`j)LRfzO7wC1C7hig>%aX8|;+kRpe^3mj#FKzpeH`K8f)+HY1 z+Bj>M)O_i+%K)XKQ_}+0iG78#Ia}a0UZMX0Q9Lio{{UiKtLkZk@@A1=7$DVEd#J5J zKyG3wT;?&jt!S-xD@JIU{{XlbfX{?+l7+Y*d-4w_xYT0W94$Nu|pFwkCB)*y|F7`Hhd7Os_Og4QB{hn*54}T zG9p#99NR63IVS_$ZVIW5VhqL*N1#X!51feigohjPqxHJ&1?iMZ)b4ygV=q6mA12+2c z7$~&r@WE_uUGn~j$0FIHY|M5%q5Z)wtAi_6n<52rmzkmTT|`j*q9ALSzPVK~n6ZB0 zN0Cx{=3V7u1vd(X+FnxbUKU(2cwLa7>f(h5LTT%dnRpXsqIX8v6tGW`mrkqF-wX$C z1c{srBXuj>t*prWMHzbfBZh&VOnO|GaT^{?a}5tp8e$-Fw*D_2W=PNuKwVGQHf z529pE8vFOp~=KF0=QUBFB`OrE7%iA6V$&(>!KYB z16{%oY>tLdJ}2lQ^ECnp0*R{gEgt~TpR6KVwy#I}mVW?BmWLE3&rD{FG=R+k9cBBu z{{XQ608{DpRrRTyexv^Yq~uX#EU2z{Goyxz8u#h2p~4rE9O^i zQODaYzByW9iWcO^_=~V#h;Y$qR?r7<-VrXIo*^#LM?s7{J;Gc2sNMv^X>sg_K)&zfv zRa~vFEK{6JUkF=f;-eo93xeC=sivdK3^T=F5DJ&Os+n3-Npr&w@UXzlS%Hrge8Z(^ zY-crsC5;G;s?#2W4Mz&CcwxNpE-ZL>hX4V2IZqK=7gCu+=A~%3f~w$C9>c?Ermj}F zzPSGY%tW{}19qwUhK{)PHJy${@&5p86A}v~w2mq&%2{{p@^coJJ5g$Y8CYygVdvS~ z5YNz?aQ08sRQxM`$gsf8F4FT-u)?e|d54QLzr*G@I4ds^PyWoN^bU^MkS~~`W~aA* z*>6KEGXuTFI%1+yoo-`bPH33Lp2bYULIDh&qnt>vP*9n;h`T$M=wQGc8+^sq@YYH& zDi`iHtciv6jBA|2$gaL$Wt{YU7vB<`p*8;iB^)>A0lb|>sGiw(52}xbl3h7st#5U| znQr46QDt5*&OID*RJ1sGf~{2x-cVe17B80q1TSqK*9kSq(9rCT851WL{{THp@d^k` zONORn-XKzd@`AR@x`@{a_Z_E3pBk76Y+a%rAK7%y?b zGpi<2Czd^;94r$Hd}dw?(|;z(-z9$PPz%kI^>E;$?Ee5Ec3zVe=jermc-%1{rTQU? ztF249vhYyy%sYtMMy$W?R&d-WM5+G(4IkkEw^EXxP_Ix6(8HDsv9>SAGNoWRAy%Tz zfPWBb_!xtfy!*Wv;>_@oO9EpXJ|!8ey)%K~aVg{O5qYfRsN&Jf@bd?!sjC)7?54rc)nZl|i4^h%Uk3Az;2V<_{OU^qv?2o6{A z6>Ry07Vy8Q;X%P%$7aqQ5NiJbL(*FQ(>6G9I+IyRXd8T0t z5{X?AL+AdZF5SP(aMT$unObcQNJnSxA>{Qi)9H%!UcfhPbJXOop#DJi{{SQOKv_94 z*Usf4wdsEC%(@F}BzNJLgZz+k!PHaDOf%%DB7|7ChHbq=9S#u3kvs?Wj ztcJzwiC{Pzlq>!;5@GhE=!rZfJN73d$u2r9nLM4346v8H&0W)%>yI(oAcbvJ3t=Nx zZexlqJC_qRzvT$bgm=WrAkCTV=z?tDn6tWtDZfMpa;58kgj7OmbN(C{bWaNx0a;?n zdzbhxxl?2#0TFn=#BKYH#u#-sbqHv8^&HfNI;&Ew?vtC1!-QGs5-fTq1W99N7$mYe z3Le^oX&2TV;M-S_M^G%e%k!CaE|7xImMoMl=WH>y{lF%Bgh&0s{>xlKXWYM{Q?~4i z0NoFPBK8k%h`~be3F0Ajyy$R6{Ns)pV5)f|w){a_6#oE${9V$%9sEO%*;C-VV)Q=` z^((%-K|ogTe)c~ysbhys3_x`q7DCXA05tpRGhJc(bvBIcm_J@l$be2}$b32Zo5HeM z#7>(1rJTatKm>?vjZsSF_X{eAhy_88XT3ncP-r=Tq4Kj51HMpwv6G1zQL5R3`htI@ z3%~<#0k0DY=$St87^v)VDCs-O6{~$_HRQSzIqCOX`5v)XQCd@^59VSItN!4W$#{R= z1HwK6;i*AMa-|d+p;Yk*$SPcihGyA$H(tC%UwIBqfEKL)TCW5)CO2>NKY}@xgM$g` zJz1Ue1jM2>ClS&UDj7UG@=Nxv&P45UMFzo~wKeF$5mKlFq+K$LvA{f7pP22)@J;b5 z`6f^hS9MHDv-rQ%D-5Nx0^LF6$@r9RP*ha05UfTJb?8cL3ihs2ja;BYH&tLMpkp3q zYdqLyoCAjbAUJ{LIUhuExZr9%hs@Le00cCv@eZPg0^mnzC*~XH?h>xbd_vDa&+=H< zmY1CPo1yoJRzH=*7=d~U{{RO2uZY@z=@JG5_lrrAsT_Z0SSpGzgv;0smOx4sO@LvStqv~3Cue3Yueooujl<-DEo#GOfZkbFm;U*Ie0?wMxD(iB{4N8MIl5$YuE&O6 zMG$FXSpH&^1;aX0%Pl!0{xNhpqdkYt*B4y`-Y5I>D4w9-ATALDkgR zCH&skn?JFtB-IHJn^_MMl{2Dj(wl%6}BVM{+MxAexhhny+mn~J(B+bGd0;T7F?kWRv?_O)bB+o zFXB6j%A5{gsl5FWEexZ0AL0N_79OC4qMEEm(cAvG*>|2u2~YQz$w)h_%jxA2A+IV^((k0sNJr^7Do*U(6u4 zN2zUoS^Wh5#Nf&UVMA^60;`?~%i!PU{{V=&0y`lDq?CBA{L9&N<>a1VFWUbAse-kz zf}a80YJr8?P;ILcMy0iTj+nefP}qJUIyF$}X&Hw#!>FuVFi}@nd{m@o96-6#G7Mck z1oX_1d4&u?IEQ&BS_hBBZ_yNh48fUpqFK&sEEh}<#6hR-XDn6o?eQ!FfAdnmTp`4( zhIxP}ErQfHSouj$D{s`Y6K(i_BP;U#N{6})OK}S7TKv&99;UOl^tbYV5`s?<(m=ZL z8nj%o#4o5ty#CmB;&t4mrC%%)W9}Tjsv;Z@02m#_Sl=TO<1D2PFTW7#nqX=$-}M~e zSPlxE%C;{|(usXVuHbblQi6VGVs;}gf71S?7y+mJOBQS}yqup1R50ObxBZqb9n1~9 zewm6v`zEm`=_~sX-d=7v$4&T`u84+4T_(Cyj+4|Hv=YS7I)yOcCABwpafmf;85xWZ zd6xr^<2;03(glJ=YN66XLjs~)L=+4$xBLdEbvM8s*O`-4dISk5D3~tok7i;9Y?@T* zjRz$_#n-!rY;Ec!7J<~V+_(D*hX8#u1LhQ7qBP}3zWf~xKQfp!VCZpF#0n8iQ6FgF zgDQoXt-9P71hLT84~c-Ul{CshIKdb+nQL2v0n|w~QDDv1d_)B>24F8azbsdBwKCF_ z0`i|QA%x1`^>E$i1^rMzFcADoH3EyRVh<@~G#BldCNw4*jszNd$ueEVaA*m9WsyHj zr<6H>pxNUQ>P7@jXZ{Ixty4#cnuEd-!|9fLn`eiz1+Pt;7mMZMB8hP_k89sVmO1wVI~M9s);sFsb%kMp-t*F%%%9Mk1H0AMEiwc#7{~~ zi#Ha_lzKH9v8W{D(Tkfse8;xxze*~lvmR)^mR|{oNu&@C?0K9HSTMD!7sMupj7k;$ z5s=WogtWoCf+(qNFHqgjqJHjQ7FL7(5JhzsD}D&Vyj~&~sN)IBU>sMzyh^_4Y|Pbg zy~71Kj79S*_ybp%W;G{*{mdsqhL1b-iNdrIJ{x~1rE+!if>2Qa&c+C3 z$r3x4Ug9Wnx_Kbi29lG*1`El9^)cLdK=G`=*q1p}S_tWlO@tnx6a;yXD~(5%0guR{ zh-3=k8&PS_rAV4M<{1@MPk5Rp8kxi;B_ROjD(V*)i7ujCkn|!vqOdUGTuK>BX5#`! zOBBS6YuMM1`as8Nn68JoTld}5ufV&W)h`>tp1*zht3LMf9 zbmCB30*oLs{ssU!&GtatDB@WhRwMgx&e*v}swc}X;b}bp{AN5j#W4$Lx_Y*tPI_mE z3-JUQCo$+h6Pczx0uDXVMy}MvEXWw8`~*x5`^`}KAZmxs5kE8VkFsrl;bL>+1)Ar? zxXDlMD_yOvGL561zi6{y{4%u1!!o+nJ02w_gJ|3r3G8FODV9Vyi?!BePr{2jNJzU( z#Q^Pp5g-n!^#l(D1}ioAf{c+P%*tSN%J^|Eu${=VmNZ#dl(VTt3+>BEl!SV5_1rMA_X4hq`y9dtL;nCn zGgJt+u9;8Yh+3eXYYihFI)XsXu23akA21WQd7IB!wM`ibu4r48fnko)&{Z5$+3IrO=hU{GHz;vADk?!{ATsi-LZB|! zGQn%qw+4EG#Zl|oO>P8vVAyiju#)~sNOje89^%XNl>l0(&u}$CEa`>lq~$S)gmVGt z{{V?%PP6_(%%^Mm%OR&_xTXWu7yFfic%D}Pd+sM}?j$UHm1BndZWc5n=p*|$wD&JH zG2WSOcRFUFhrtP65y0Xp0|{=nR-&ZfkumE`JJm5N!kC=F&mXcFRIvR7FdYN;0B)mw z3~0oZJO2P;Dh0YsiQ%6{3^7}snS~l<2&&Y_PO6`n58$7JWaH#OMH}89KdBCC&13XSrOQNj z1X+y)D{RDERwLOg+~=^>n71)trc`Y&{5W9lyUY-^ScJKx{Ld_3eP~d^{%?|8!L)v2 z3}+mmv(Dr0QYGI6Bm?eRw_c^C9QNF+nQj|#8EVIK36%#g=s_%B2UZ`7xl^n>Or8%+ zHzdpx(>mj)GhCj?3aE9cUEDb?Q00_Sc`>Df>NAQWT!>D`Ik~(Mirxx-5DLIs4X;G4 zm2m#XB2AA|a)c1fzMJ8P)Wz`ua@5dQX9+O{J0RDR197QGnJcr@XtU*~ewl)C^QZp+ zcQFUlMus^hxn(=PVAkBHDdH5>A7uXkS5OOVdLRSsk+lMRUuGZ__N@5G-gVrkjX{;u>vHGzd6@iDOCb4`$WxrV2eo zH0Iz-m^z6GIsX7o;xwyIC=I`;P+J>>v~)UUnhC_etA};f!>L+;5E9al`H56$m#V8n_!~9!P0_Y`^o#G?aGkVP;676|6*AY{1Qt zUBZ(}o+lT+CE&1Q%hbRdroJGjq^t3hQTS)>9>7!z!J=GUgYh_XDK=X5<|eaexJE=- zR{TfAtGG#;seQI+xlY#prKm?;-(s zxm$D*LlL!Otz#-BMJ215e%W}5()lpT8$GbjP!3i{;kfYYK~J(i40gxje4u4&TeLdM zF<(uQtb7c?eTBE^#J1PlFX-YGcIJKG;WDJUE&1*)2Z@NLX|v-oI;Lo1)N3$;jw5u6 zl@QYeU~vJXE{a|ucZ@8P4y9%8RyczCk&cWiyoIk-xs^tguk{~BGF)dh@dI)|3Or_S zz%1Q3l_Q6!wdLapGXVDM@<#-F4gUbClx_CHS$*8no2h6QoDfQsrRG%Kyv9^7%wg_s zyP4s^`r_axZk#L+2SR7;jgfgV0l?0Y1;EXuThs~cB5h4O73le4)H!E~>HwHa?%(8& zRbyxTm~ZY>?dgM5DcwGWV^~+?F<(RV0RI56-4fCX&xQc79~p|Wq^5FV{{SV7J23o8 z7*V@|#UW-f>k&FHdHuq!8nC(}>d(>sqt5;qlY;w+p%%nYV3it`T3yreEdT}PLhgp^ zuO!R|G2*fPg)Iru1X9G{s@o0%p+)m7Gq@;S=2EK61!N|rL0Yj;iPCScGZI+=C}TgP z1B*vVFESjxo=I;DQu1CSOAZK;P`$T%A%*E`*6e9(qE`-08ya92XtQTYkf@?#~n&YqU=5;bz$<#;14ZZ z37eB6kGQKF)UwCPFw~4`>>T|@!TD83E>n*aI*Cfbgtu9k!U^#zYnVn^_Bu~cn}*@Z!}AzHpEqbvpy*JnP8`LX<_FOnlAumNIV;s8tnd45`{O8oWrAw z_I_eUi;hU^`%HKd_hulqJR$v#XzuXDLJox+G%hBasZE)K_$v`;aK9yRN-z#T`40z% zHnIvB8pNZY6w~jiXrle1Tru5Q1mzDUN*n$w`xF%0m^FPSFkN0}pod>b0Q^D0USVXh zi+l#ym8&oODbtBp;7a|5HqVR7d3C=p!TvE~V3n1bM` zQzRCkRpW*#5aC%7DpFmR&%ni6pfb(p>oF=llF;tv>-80i6InIprH#Di;;g@M!{FRw z06Le9zFJ1Cvz3W@C}5Wxg9IVi#m@G37y-X z6y`q1{(GFX^*`}oPX|{7V24#-sGfj-?Xe&)7PbVACr|7cE17GCa~Z{qI?5T&Dr8^A zF=a;$OJJuuDq|aQ+RhK9mr&pYRIIxDhDh6qi*WlQejq&wPmpe+3N=t{9Wx`TZ+8V% zVh75s&A=2S!j3$~Agd*TX*idvxqyAbTvcIZu703y*%*;ST2~|znO0~V)%6%-0}d&7 z8k4==sy#&XLlACaXayx!AVir@QB7n@)`0e3scVgJr`^kW9l5wC+F}cy&V2}6$Td65 z5|>72=WrrhejLOr8A{fO9d*P&+j-T%!ho$1(KwX?@iD@Q=W$@hE4h9+>Icuv7GEgk zMHnuJVJ_oP(#*EpPtme6roR{u=pg87@n7m;kk?E3H-5pt+$qfXliC10TaIEI4&o>Bwwr^B&v8|Euh_Ri-=}1;WDM9!5$2(JlZY2FNnGXzR97gP zfQ1`x#9IhdtR3?Ky5Dgj+05b@?k;K6FF});Lhq;rhTchFF1&*U2&KH`yXYnAEwyTx zG#+8H*VGNAJ;N;?$PFRosboNdSJZ#F1aZMz_Zt&WEYRC#g?ZQ>%+hRWEKr+Afp-?i3b3vcW z0V*?#YN)Kh&`gz~8#Fk#&6? zK3w>iD_~It)CY30Ogr}}Rkiv`h># zgSk@Hfy^|+nu^ez#5Yt+f?5~q0ZqKd_B_fQ9^g-A9V#|GW?2#XeZbB6%KBne_DYRc zuqN5`GWqyHhAHt6>|Rxliu^;9<-fE!woMJci-=MkwfM|J{3BnO94`x5Z`&~mieeE~ z7CK=*7}Oi315*)&Mmc^X>&o`{ z=pao~F82atmvOrjwh4%W1U$;_rC7X7m2nGJmpE`AQEdj%4 za>Xse68R%9A-WNe`naNPAF^N!#8ffNNV}J%=2*GN^f&yMW3}<@{gc2q&-<8`;RH<) z!MW9+A*1&;JNz3G;dE^31^8i*rb623Q_s0ek`%B#4nx5%YM=l>^3=w-RkW?*%l`mU z#ziP0ldH^m()wzk370p|#1au}16S+MGPJ4_$1g%804+BQAUUQOZKT63O4!uR z6)7<;OLQL#Of-RyI&mFa1mgbX8kMfU5Nl-=~S3i>12^UcaY zl&>>7Ym7n+1!u9v{6xR_Gfcdxc~_{eQ0*hD`vUGyu~iBS_>9!K`cx5Mio=%ECF(N4 zH{cUz@N~mCxU%SP9wU@Hg9aaPMF|U{%jm8q1L6Xr@XCzJbrud@xDOL`fx&O*5E@@K zRSlN2{{WI((SgJZN@RS>47EoP4V2XYbK)WtEB^pdoR%K|r{#{YjRWC-AjAAs{{Vn- zU<<2OgD`V~RvMHZi=q&PnN1OY=mVd`QY!+E>%UP9FJMdliBQ7qN-+dqOYRAYb}PwjZKp5=rYgabA~91I@<_VSkU4rJGqk-_L7HMwsaAQHTdlIgh*x;=2xSPepUa2#Ef})BybtVEFau;j#QB4CJBQJK z5d19xqFDm#@y+}de_{wT>jC8yzI^8xIC*{3hK z5F$ma79}EbBnb*prdtg-@5~fmL!IK)<|sjI3t5VyvrdkP0Z2eVUzhG$A#5xL_TFv) za0iS`vZ1!9COtvNxqMpW{z?GKu@gZH;h9_xqC&xWsHr#(pw&muiIad9y-gKmexcAP zULZwxqE}`EEx;1k+PkonD;bpQF$qf5iDgXp5lxl82~}J>gjb<` zLTRT3MFrxDxq+jTh>lCxfhQd)S|O{+e=u6+)@nE`QS{hg zReO#vLhwSeokmS?p1qWn#`x&K}UGqF9zL^P#%FMN#jcYD$+hWoa63f2&fk*|P z%m}ha?g9aOz9QLX)lf8SzA97|aOX)9uvw|@vg2u%fD`(=bynDOE>ZjBKo+iNkFSkxuX zPve=awcak%POIGV3@I*MFjr$`g7@!GSX06MU=9ZRZS+Goo9c@{F$2jQ{{XmR9IgJ3 znRbF*YI0fAw839cb+lxUEX-!Cz90Z-{pmy0yrkfNz-rol$o@;3gF=={+oNO4{h-2B z<{XT?3?=kMH2^pqSNx1x5i!YL;xC4k2PU5kIX$d>nu)@n0>6Y?FO1NBAWBfKIL$*0__Rv=#Khw+$V-<_RoKSqqW&f% z0fkDfO8|KYvSnwO!&WOXg_ODtyv^VjmWZ2zuG-A!me)Smt+dh(YOC?48F)2ZEj;)0 z3{V_3e^nm=LlhAr%7m`nKr30sVM#&K4;L+N1Fp$v=Qv}SCG16gTr&%ia@Hkk^n`8d zP=TT(wpdF+b}z+7hTFfU8jP(TmoNzgP-;-aJfXff2mu=X(lr!p43qO8oDrmj4xtq? zn)pA!W>6IyM+$(Tz+>VCEL(q=PmT~0!^4TA#$f`(Y;CFT@d>4^7sbJ4KwS`((Nr}W z2%%;mDb3IS!~iD|0RRF50s;a80s{d7000000RRypF+ovbaS)M#p|Qcy;qmYw|Jncu z0RjO5KM)FPES@&NxBW=s;e;AIODh(-mos{UsF1xs%pIg);`)q*v>KL3o)A%PH4sbA zCpmA3Xt&IES1bc@F9T3)ntP532Z+*x;wucCR2Wj=3vh@F^RKuqB8NJF$Z-zrAgeTD zBog^9WJTOKBBb5rWxjNOa01&ffo-sXN)1gtAA=c3a?0>=7zGkC=D~3_)WMW{i&n}7 zt!fgRF0xCilywB~h9^2FA^aur*|Gq`F5v{iz5tg|5eW}Ny}*fa)D$^W#1V$DZly^+ z;%ta0*O_c(YGAi8Lo713xDys7Lt4OUP@{0Xtnx>u;)KHz*vrw}Q!eO9iDNekEH}AW z2gxjwgu0s{NC)CrrcmWA5PlNB5lhUtVOYf&7q%)U>gDbJrTOXN2Z0lM<|{F&VJHVV z)EoDu*QgXv6E`*ADM@#jYSjj>WTpc!T$y6i;s7c(Q4KB#n2BQ0VYmmJUl9%f+-lrX zDYzyg)K>yvG-jiz)%P8RXPCcHRhxK@LpiLXe zei)ZtQCw(%fnvGf^*=5S}8J1?C^P4Gq~5S_j0z zq`o3ho6G(sp9`L{qMU6sD2wPOU`tig#6_Qox3wKa3tz+=Rp^byPRQ)T6_ncMTF)_t z>nl)WFjT-Jqag%(&Y?pQ)C@+B<(6i=!D}$3Kn(LVtUxvca4nnaWfeFLviJqVKjv9M zg1Ukj+r+~tI^W7z!+fvAWdN?AP#sLAwDkpXR+|tB@X!gqV&VDm7KRdCr?CX3?m2T7 z6edmTTWDqWYWNr9eaj+>Z$%Yl4Buknr-7a6ro3c#KJ0ED)q6v0}&ZGWg*lsCFz$n_J-H&T>} zMR(E*W(lrhYK|dotPfE<$K0@pxe+L9Q&`-hU_I%UO;?Ff8AKr3SP4?>%Y?oBpde!! zWfjmLaVU1H@ys}^RzDC382Dg5V>kxv_qhCS6@5fJf_+79XSglgs^&72rU53L)L3X; zxatak3uQc{ZxX3k@3^O=MJ0p4f(q0dBATQumhzwWBMkzjFNo?PmlnoUs6B=|XNdcl zAd=W?+_aGj-4_wsA9D8r_z?&0#i%--G`Ij>yvDMJ+}>SOVf$r}-|%nXwqKab4!1E< z7rK;I@N`1~8|RK@SHwsqCCeBD8e+X%E*n$0YL%7=t_kkq;D4**U2#LM;0<7Ew^0c} z%5y0qgUi7Q9SNIn)T5=6^^K+oMyZKN^uy{~jC8@MrzRLLe^DJr7M{GuG>hat7XoEF zRTWi8sw2u0`F^0_k@7?hD5i?z;WU?On_;PT-;Own&9w}T=_5l>s9L#DrMf$e62t9F zcLA7y80rnKk!2mk26KsPe+Z@ODICYB`;`;GL2Jb_oHaN>46M*G;RPNEnQKM*AXfny zd!9$+NON zbSU^8lB!yj#W8vbFId}~;$GNlEVwz;$5M;AI(kVLszrTB!(3U3f^!a}{MCF5~xKj9RWl?O3KxqC-(L$VIbr;~;|=W(f`Pha~p z^cWxUGY+E&7Z;caLZd;&%b--{P%xRqGFRMITpqDoX6s&)dHa?l)+{(!Y`Y^O=5+ob zbX4|P*)(@?Wid6j^1^7_!H83X=@79wG2C1q0UITnZe8wVm3}h-c#!ZUso~UGyT4|i z#0~y21;q!r+<^LLAsj!{qu&xZxU%LM71UI`Ie>vLm&Y)A6tx?^BJA$0<%P;tPcX=| z{{RHU43)St&Sf3PacBu)4O*;3FMj2|Pa;NSc|zKN@Fq>F1lTag;%2d6MfO2XC9KS$ zXi-A^F#iC#M8WjJ!9egoxST!;)DIKU1miW%*ntjPdHC=cieM9xS&;aKg}5e8^)G2? z$`$uJ1Y&^%;9ss`+h;!JfdQq29GW0Zu%y&S5N7x$R^s9#9avwxWsb*LLbvp11Q9%+ zL>Di-LehdJKrXDqghz%cVV#gWsld!^_!5>uO|sKJWbQF!5Mk;K8&^l7<~hQ)OyS6z znKS#8@5FT4iJ7T22B#AehqhoWLDUntMa(-&C7L5HJv=A!%Yrcz3->A7z!OM?3n|2_ z528dVAdN;A1!ygTkxRs+9@pX_-WiBB6)WJdh(9m!7#NB*qn4w9`XQxojMq)w$2k;k z*?=f^_i?;escBcj1FSNHpgsvgahu^)kgf6 z-}r*!OKo~!v`Lu7{$`v?y`L8r`S=nZ$Y9LZ2tb3kT*E+eD}>CplGFimQ!NS~yMb)6 z%^Qd_ktn1r?Xe=z9#eG%q(Sut043S-30no9V1mEeBj zHfji#IF3Z|2M|zcn_&v>->1tqn8Nk8;Td|taK)`&<1Xi`ga$`Qg=M9A@eyDW^LZ|0 z0*=@g2X7dB#}RbQ%SDhrbtxjYKA~oyT0F|qXrt@lqz2()uZzsiw`cW;q6#$Pdc>}! zT^e;BM^My}sU9M2p<1vOh}{{YyJU>H*G%uIV!} zPZ1?m?mDMzSz60Rth~xASx?&t#?r-s{7aw5$d$V@Fa#~7uj8l`vuXXxnglNKh$0)x zoV$hL-bw$&045Ou00IF60|WyB0RR910000101+WEK~WH4ae>(L6)X1u4Qr3peCdo%Z2{{ij;}2 z&~4K)x@-ObSD9JFF)ri8sDz`T2wSVil+R^W`H>M&w&Sh=iN`V%?KwPHZCL@7z4IfMfZ-$KY+T?^7I zdJZZvnoGrj9hzbzP9u)3C|?+VP)w z#i=E>$}!==%LH!b;25LcR7#l(-hTEP&E@pDb5tC|S#T7+<{iAH^&4`;YtZ5?)Wo#; z36M5$k+HA35EVGU@7_D5N}0%A#1*a}2Y5ZlqsnO4nMk(xEEFwkbs12W2COmVro$(No%Q3 z5H?1`QYF{@g$G6*9fTQpmS#EXrC_ z;M33Y9S{%9Nj{LNg&~bKZZU1V%Ud3h@&}~d5p7*3W*z9UxJk2S2 zDpU%KL;~v8R*mzw@hmmk$XPPz8naIS0B_u|0jr_6nOH`VAT3$Y{l+p&4&snf?c64>4W_JJfRqA#oN-=8pc$qv> z<3Ka$N|zPbed2e5sqv&ANPzRCqkxI)7QH22fp0*=l8fNXzYACtr)^`b6ymjnj0;0q zzS5i36^e(53lVTKknS&5T-yu*tKo=j;9A1%L`QS~5AfPh#IU~pY*(XR0_)$t6e z!|?@jr0cP1=Cp}Z<{wu(+aZ|8KUAsAQA;ci^nYMV+i1V?p(qKPo5!&Wg=xfFwV_Tm zflyy*aFkuPz9SzPd;b8Gl))(a4j~$m%_*miATro9TE`pA^4!;auhO8+{QL}yDh#3KqF+GhShoc?zGBn8>6irRncOQdmZL$pT*BI~h>hVI z0>d0X*l5@<%vvFcypL!56J`>{;1lLtx7w1~T(FoC1y@761bksyiXzRZYthck@L z@`oc8I};Qa;-BX-net`Q0M?WuhNkxyC}V*8KxB%5Xwn7XBi#N&Q>B4jDeqsX_EdaK z-xG*_?wR(1rFGh=fV-?xmRD%hS0&sftwi{Zq6;_qW}z)@m}`92U=31sfV=+9N{rp2 zK1p^orjj#gU{bUYx77!AT1{3aR4qQ(d0`NtdKgXOW4u0s{iVw~tI>R=hspSYh{8WZ zJSELangn3>{{V(uY#vL84~wtXrBuA=jyl91tvYEei?qSvi)AX@wAXoP4j!yzmX!E~ z+e?Qj`IbJ*@Qc^Yn@o)ezG5n8+3tgTQZMDOQ+Jk1!HAtZq^B{{UiK*!ENR z9ga(gR2g~y02K*I-Xq+V7kRC!hsg>%LaHe2ZaWEz4Iqi#J|i@N#**Bu%?5D{=B??n zQfRvqI;r1Sk&qR7#zsp@=UJF7*d}`Q0G4`^iH}auwj3nO3?vyH947uFP6GD^UUKFs zXdWFNv32SQJlgnx!l#lJQYPozv#?jR(KR~M&q0+g`@)yxfy_2e`yM0f(k@vMSUpnI zH<}Y5;etbLOQLaA*&!giBF$pEELvy?;T*ZRrZNa4hVaY?uY`$BkVRD65x!NgsM%_{ zT7MwztK5r5#NB;O!`(&8Z#=VpRr(MJyf)f?SyOv-KgN1jnucBnggg30UI-IV#thu0 z%Nq9>+ZQZtE_#y9g?l2>ex%*2;vukkVwx9>%o|d~3s-GlHKbSJMyLmqC)7Nt^|6$6 ze&x27z_WmlBc6bW)}kc+P)5W9(EaG2P#JvU5Ba%sR5aY?3`(=K46O@O+ydpwHt^y# zsCvM;T&%2Z03T!KWSBK#GE6>D*$n1ffJW-7P}DX;{YVrKhFID_Laky&VhvTGnOhd~ zcsq1ccnPLSn2~}do#0&jer1yp(R$P7R3de(^g3r|1+|!+oK6kmZYg`jE&Q;KrQd z!4uMqrUa;r^n}A!1tSw!rS5i$>gdaH!1TF}l?icy&0ZJGD2n%wojoQWr(fl98l%Pj zp+-HlsMI{8`j;h>Z@A2HQm(5sXZ@rY%EOkWZ^Y7c8?e0wSm9dmH&+zIpispqSBpgr zW4Mm+PJ-?sYGpAwY0SnFu}jBp8M48|Ostf{I60WnZRW!&g~Fo)&*OP{q( zGfG}2CD>`H99?EA+myf>GP5e_96dBgqQ^p|%6d~an@13HHn~Fce)EJ3o@WqS=>l(T v^wIItOUhZ`jL{s18AId{Xn1Zb+FgDi)rSXQngwvA>Y4eo^k)meQjn3C0YD%SAO|Dh&koufc}YoQH4Rl6 zc_nF>007YBlx!TGz*qp_;OOqEAu9oWqpJr+oCLrCGJpVZ0Dy^^o3pZ}%xeHvB7!3J~U10{oFwtLZ^)JlwkIuia*k5e!;Ajrh`D?SYxr6y%`~`+1Jv}U77)}X> zBRp*^ykK|^hH30Q9Bg3t7YyS$SeUp000iwX-`&E@8irrOFq-RY4M`Xl1^^^9tN+5L z|ApNxykT|%fTWYNkE@N9wL6r-j1kHqAiximv+%OFaCc`_GcmI>aW#iZIypF-IQjs< zzuNrwC;;cLZ=oC0zk&HC;XgdnOaN$m2LMDX|KZUT003q<0JKj1S9=Kl#*4MPyR#rWyO)<2n~jAT z+h2$NyZpZ@{9E&X4gTwTY=5u!Z{I%Z(^(Xg|a)jDA{;zuY|M0N?vf(fMS6ssY zZpkx%XUqm*P2mA>XX5|_7Zrdr$b(5h|L!*>WNqN@$kU-b_*dM+FiieW{eP>#@vvR6 zn~fFpFI!UMHPp<*)$=cgjfuY%Jb(gV0(by1Kmkw#3;-*@3Ge|zfEXYRC;+O!Yd{w; z0?YtwzyWXtya0b71c(5lfdn8G$O7_#5}*R81sZ`ipbO{&hJZ0(8kh%Gfh}MUI01eF zx4>`MM1}}L2jPNp-fziNtU~(`Wm>tXy76&VWUxN+7R$v#fFE|_=2hIQ& zfvdr-;6Csecpkh3J^|mr0dS~r1aL3lSmF5LB;i!y^x!PvT;T%YqTtftir{MDI^c%k zzQJw5oxX|BG8Qr|vLLc5vN^I3ay)VgatHDh@*eVU6l@fF6cLoyD7GjeC>bcVD1#_#C|9Vc zs8px|sOqRTsKKZisP(8{QMXa=(Qwe1&?M0e&^*xM(8|$1qb;Ldp`)YIp^KsGp}V8U zp;w>}pl_i6!obB~!;r@?#|Xm6#%RTu#W=@A#-zm*$27w9#Z1F&!kof9#X`oS!;-`@ z!3xC6#%jk}#Ja)8#pb|P#dg4s!LGy}!9K)6#G%8H#xchU$0^1cz}dxx!==WR#5KbW z!!5xb#NER~z@x{L$Fs$Y#;d`b#QTYlgU^kxjqi=0jo*#GMF2-YM<7pNPY_SgNU%Wg zKuAs~PG~{+fv}cvmhg^9S;NZdxeP68oeB2g#tBFQ5e zBsnF;BNZYwBaI?$BwZl`lQEHLkol1nlZ}(zkW-M$k~@=Uk`IudQV>vxQP@(XQ1nn7 zQQ}gHQrb|aQ1((DL-C>FPMQ zp>xS_1#x}iy5MH!w&2d=UgE*!QRaEi)6et7%g5`=Tg!XIN5l7)FNbfDACF&+KZgIS z0K9;NK#)L}z`Y=^pu1qB;13~IAv>W;p+jMMVGH3B;aw3b5fhO@ku6cE=v&bO(XCf6 zUYWcqdbJ})EoLrOCUzjsC~hlWEq*TXQo>cDMdD6UP%=RBvlN_^tW=cLq%@ASmUNc% zh76UAl}we)Pgx#WKiSW6@N$ZBiE@kbobt-#(hCniQGbn97^xnEo`AG)p%-F&8sW zF+Z{pu}HEwuoSUOvOKgBu}Zc&vVLWqW_@ZSX_IAhVJl~wZ+mB_YFBRe$6m+2&H>5c ztwXybj-#F97bglQZ>Je&X6Fd!Ef+zTRF|KwimqjDAU8v|PwsfIWNO@l!Q-9Bwx_6P zw&yP|ZLcP8Y;Q;JaUUk14?YLJGQOpL5I-}&e*YK#A^zI|;sJ$$pg_~W{vhh0@Swe5 z+2D^MC?R$s6QM6dlR~eIr)L>L*|F) zDD$Y%=$FxH(T_1^F{7~@u^F*{;w zaFs{ZQMEz!bd6Nar&`w9!a9Pw=z5^uqyD(zZNoyNVqmG!uQel(+(&PDh@dhyN+azrjPZH z_fDKoexF91VV~ukGn_a75c@Iy^Ucq_3)hQ3moZnwSLN5-*ZntYHygJOx4-YAei8rr zc+Y=7{Gju2@Z0MV@iF6x@u}lk@pIhJ(N(AR;0EMgJ{hSb}lmr)vG1@KV$|4BdrGE^EW4=}>^<)94E7f^XDWGExlZ`)a}7(^8rR`Q`w z&^AHI^}{5JQaBctJt9=BsD$Qq1kVJn-hOOwD~OdrEP_TVqNG?48jF`QD~I!c5fn!b zEC*)5k;7sDGl2gm7aIv13E2h`0uhIZ!3lFhs_niDY;%0(mi{PRB7wt-tmKrig_dBp zf@ZhEzp}qTg+!A;lM+FbY8}cMs`=N*za)hv2dl+`VI~L51JY3Bf4F}oas^1R21&t) zwuJ0Ws3Z>ZYinA69JsuG_{b2(LMppck_0RpdwsqAFH(OGqT_&SCy7N$(tuTz8E9Ul zBv2*LBtXQVVl)XSE|KfmWMLJb0(3`4piSGZ}=yYK{TP5Tw zmMJNoH#-<)Fc_PcI2ejW8ZDBaOOlkP<%R_ZL>;mvjwMC~&;Vc%77XDbBuV^j7gB)~ zRQjufGqs9a!i=TVVfIl<>JTl+6`@rPi}y?HoM*D;$C}_WM{Es`e%c%Q38VKa@m&qi z*xR>mJ@4<2b5K+xTM6m~3b4hNx2Gv}2k-o8SSI9kGihX!m`w1HsgOb;p-3f2SO6Y6 zGMFJ$dcfKZgcYtKiBt$Ncxf!?v2KCE2o`sj(02sNEU!zjwKqaz(+WPU?2gi#=Ay}^7^APUaHt_0z5yMQH~1MZ+K!w!BipO zkb;Dm6r>6SH8?XloEM+TE^}zwi@ql_abwy7kzzTEU}smbTR(>&sMJWy{QfFJ;=WW` zR-dM_$40VzKY((=rinILI?(cc2qc$=V4rlFXFT>XMp%D z%BQ>Gy@1+y_NsgLq?3z8*i4NghXOMR2lCI{?e-p7%tO1A;;? zz~sq9zz7W=Khw6Zh!Ch?N2%=UEkx?Nozx|8f1Msn2OAWZQW9@wqX+b=$|> zw%70LQBT6R$;aLIXLZTtR@s<}r9?ifzHe&F@t+)U2yQRImctF}i<5J-_I3Vn(lGeZF*Ob6T_3a?>IS!# zkxLR4`vpWeG{d8&N&;s--N8p(`Yq=8`0!M-jau)igZH3QORJbT8-LC1#Y`2ydgv*E zrc6)j6R}T5$GO9N)y?}MUDv_WK=AQ{%Lmhx90xZdkUcT0I&Bho%JU8r@kSJ}sdw1k z%G9T5N$13Z;KI115N3d<$U*%L1_&|?1M3>nwmF1J$m2gR{rnsFX+SL z?5PQ~F2+!=%{&7qo=C3eXSyr${RO#$B!2q`UK62o0(w#wdoFH$7K@Fzshy3!_H`>sQ5 zzC}@+#GbD$NLfF2V^8Ant=Oh(Ou$Ro68UQ5+8CKfZf>i_wJVCJPTaw#x%sMY3~@S0 z=vyadkN>gDgYcT3#sbG+VPNk=F3^3$Hn0 zRmqDt)ZKex(7%ZRZq^nX1Vsv#CqQw-f)j2tmUlJGLZg)#Xw!HJO37;5;S?kW0M!~< zc|+cL2f^F1KvtAi)k65S)qKHp(f3OZS*-Sr6R#_WeG*eq9`G$ciaWOaEY2;>EoS3k zC7XD|q~5N*mb1=!Dnhp8RsZmgmi!dIEQO6kpavpdq5$H87^ddh|L*FXeVo^o2BcFU zVgT&^ii5--3Qq%11K=T_c?+ER?|k2X=fZW;(a~ zBZ%)#KV4TYb5zT_A0Q!bUbJn!Il-{s!pb#enPRi|da0N%QC9Pnw2#k!BS8*2w5UH6ru)60^bT#+!8ZpEqqFsvhA@(CAEuElWWHNDMwK5(Bc@k zPOf)nI9=tNdwYFoXSHg%>aaIg?omnOPTifu?iynjVe2rEZAP_7;dXVS1;L)5PeZd? z)^pLRO=uzK#al_*<+n%g7)?8!dML%hd{-%9H;_>-i^xm>xy)OYDmuODM zH|^?F6avx!;$qvai^0+9HZD{zj5U|_w9>?~VLnxkg2)vRRuYx_Zx#B2{i>FcO80~W zEhMlwfDDF)$b(p+-?4D8@UZxs!`AvSIXax1Xzh58+Y2*2t4=uuN7bVe^rf_!m)*~= zmsXpvO@=l{Xw#c=(T;uyzT!A>a~E1y`U4ak&hJ!TQ?d^ixW?>XAC&4?o>${PX#e(9 zHqtHp(JLZ8J!XMygQXd!qU`G;mx`jN>#3O;-H;kcj^g|4o6qMa9oj;qB|Rzg7S}fB zY!|14Q0ONrGQ3b&9w#9dDW)d&*F>B}kUU5ZE@v9U-4*W3bkbaati=At(uWQVH!|)z zbKUUbc!k|`c0NsFQSHemlmkUCs@?Q&lw$t$D+i0$2O$TR+nanOr=50jX}m)lL0Uh8 zL~k36-#i)~J=-w&ocIY_vFT`>${PjpPWakbT3e11b4X^F=gztnc5w2ZVH825vWPmQW-45L)3Wi&|xD5kOzr{GQvCx4M9c=g+#t^HTYere0XT2osLu6 zh7nh7^})%NUtdMhInhJ-A-u(!_^c`?)tcdl=aSGTAw$YnRoUsPgp>N`f@I_6r{d_u zJ|g5NoNj!+)l6wLztah_z>oM2U$6cEvi;vCrXu9+M@H3-?j8KEhk0S^@#5GI6%CoJ z?z*>_l-J{Tmj-_Tol#vtBGrk-SsOzID!@DaGh4EsgaTCYl|%!!;@JO$BWD4nkpPRM z8%DK`*)vO!{C>>weQn)o_Db7H6q&}t#*6zj9@nz*^}cLxie&k5drw>bW^%-}BMCcK z{pVxHFNZPr53k`5qMr2i=W2ahx^}kJ#~UkKueRpHBD!&JTW;J0Wth&KPq1`4F65v3sQW#2S+7CRs59=w`L5-@Hl1Cxj^mua zHodU_uvTMXV97jr#3<6!Z0hxH9}QoBiMEZdlyY>=%+&1Ibsb9^BF()?FTP~JhXDa? z@s_$pl?vzZm>E5bn0%S5j#`J`X;$#5dIVYOttnB=w$4N3nAT&{A^pWPdCmTeHe+ z#5Yg$l&7h!k$nI^a)j9wk?!G%V&2o|^Npk9r>n|w66%`hIal|!6*hv|*?VwjSoKG$ z94uG{WrO$m1F2-Fy$W_ijd!iGD|A*VK~*wVM9M5Wti>Exz2`j5F~>vn+Ox2zS};LE z*TcP1R|Q^q?YCV;g{HDdUN&ao;7YI2xIo*!bd~4m{dvv8#X$P7Ot2T-Q>Qfr*Hm3r@zX#$xB8Kt0~3i=uyrebm(uZIZ#fdTQuYvMfhHZFZ?5~Q+z2H28-Cd&q$ zu05d{tB~`y!`ZKh4Tr7=H)%l7XL0K2DQHR|K84t%y@Qm*MKt!I?eNs{sA2I%?J=G) z`Te%E0_Tl?S*)+n7?%9h(T&lMZPDMeS2I3ARrgQ2_clLtuAZXaC}okHxMk<8-&*bK zj~wmB3;gnHukQY$Gc$F1tlaJJ`eo}?vsqcWy?t`tkt?$g?bW9SrSJQz-$u)ob@6UB z^GcMpM^{EHeeBM^QYTj1(g5BFA@?-OBK6Cd=@25P#BI-)wfHj9q$6oH z??35Ff3hqrk){$B6RPx^S^lk65sT>Jl;c=#BAu)z#Q$uqo8Qg-qrG8NS)66=oNY_O zvaGZub;Zc+UeQL4g>c#*pf*6)k@DRGds84sv2lx!&VnA&;~8m&c1n0nbTqRal_GS= z;p_M4NNDUAZ0Hv6`(_90I9`FsMK^;x=>~qVvoqn)R_4!yl^b^Q^9i!j4quKcW9@Wl z?OMITGK-^QqyFV$!0=%#vTj z;!Wx2#>~HUrk*ey1EuCl3MRT$JOt;3__ivlGOIi^c{-Lli7v6Y$hxV`GrWL4u*_Gmi%g$1?}|-nj`)te3G)}aRSxH?OjJ3ed>>wp z6dO&n=&THU8(8U%Z}Y9X|I|$pEAUBiF7Wk5A(FRcHQ2_L{$!ZAX8q z=VM;ZrueYOV-7y*M0Yuc8%vcdykHKK(g=j-LR&Py%ynY_!f?@iC$=3v#Lp93 zW&hcpKAK0~A*|_!i{x_>eOIGEOrDoEO6=?ue5$Eyn)Z6Hk0oHs8M8cEuz#&3i9D)LOab_zB#&`)|YzGfwZ_rh89} z+HY{93vp|^QL}O-A=!>i&2_S`Jp1kYt4c$- zQSL!EJ%?`20V){}>y1h!w_u*DuAquB#YCq6f}#C-CfLQcuc4fjcwQ*4a?1I^>Z+-^ z|9R)0FLmp>KhW5hJY{>M(^T!a{+8o>cznP#R_`WX&(ifR$sRIYr@elhSe|Vb7b%wp zDYk}&IJL}h=zE-B*qq}g%HQl6&6QW4xQP9|jy83#2o5gT3w?el?w{QwR(`pocY1$6 zH7AN{GVV^Ka~5AdIOYD>vnXK2<)_sXfAwlJh{|2~50Il*#VeXypR4>cl`Lh4cf?-0 z#MYamv(e?f_iZKR%H=Zt}*n9Jw8B8aow#H7I(X5~OH6HPSya zWG_A0x{N!$w?5nQ!D!2KKCoMRXV7qcfxqk{_-m$9VM38jI5}tSftt3k4%YyExo;(r z$vaV7RsxwG5l0sZz94>@`l@wmtg6iO4`!>)*Y4^P%a(hw&n^mb9$#JQwcc-pI@<@bEIs$@#}+3(`f9xDjQUYE!3|;3&2}=i zMOI6peWQ4o#)_a@2A)Q;gE~urO39)oh*`$WtW85Lf>e)3da6G#Fu&!2eu_L!^q|p9 z^PF>PcYNv-EH!nH5JlfO4yQrs|+{m)es=<$a)UYSu4Z_=*B$R?Im8Ray}YS_Noh8=N+kY;hR5dKgP^Su+|&)(kD$r<&A!I3mDl`I+nKF; zb<8z_Tvcl&#)+P>DY|)GC42rhgQw^zQ1ki<9XG{VCc-0Xk{jZRPKB-^=h_b{cFn9q z0n~mBCZb-(OTLxW_g?AO@xm@+5rckj`$0l}{%42lMgKDM!6{q8RC|kh-67S|Lv9LU~*>dQ`Gk@UgHnIXS%kLeYE+?m;P1h@f_3A{&iQ> zwRQkvmI+ouizD$1^9@{(S>-}nj3gq$H8?iB4g>it zgtdoXSv8HW4X*7`sn)!kG0d-Way#)~-{kWQc&g%h+}jTl^Ts%CtTZfPWqg}CDzPZQ zQBtnmb(70PGfPKYgims-t98@tR<7#E_ok6M@8M|N5RcZvGIDfYdno+NXBYF@5g|Ph zR$uO}TK`7*kGeS{qyw7uyCOM$0hmquKY#xLxQ34nJf@Ob9u?~> z_}eWD{C1BW$QosNF>*D)NGMfc@duF1wksaLRO*$y^3RqH_0xH$f=7%eqGGupVUDk> z=g`$Yyet}gui4n=)pBWMPUiRvvC2nPl}*L6RY<2sy`5n^Osnq01#&8@rgJ3EF#+uk4GrTaHS$&YNW%n0MI0};!IL(ly?emeC+=FOgh`T`uIyKxxE<2Bdu z22vt(-q`e)9`X8jv@Ac6;FncC`;7)5MlYsk)D-7V@2|fTR4-kv)0iPO?>5HQt@^~<5=pK_`{4*W{WWY8)$W5HK0UV7Mtev(7gP1L zmf1HA3kZVT0ZZd?19L8sN>M2Ic2dD8l%#&WX==u7q+!A5ImhZ;FwbQD@;8AG+hppT zOPsqQg-F`~Q<`j{^Xk0rY2#em*kO-%PM?BpD7?B7Z%aXs7WC>B(`mh6PUYR5vt#Ku ztCfy+C0s@kEqPJvjBiIh%v^nmH5t_o$AS=hgcf5sDbB*1y%;TuFNrZmII4cQ(bqeply#EDvE4z&Bj#6~`U_laO$yCS%o#0s-72VdhF>r>uY>Zf4u0IB zv4aL1^WR=QvNay_uWk%>qWXX9J#?^`*GCP?h`B!#?nZy@&c9O3^US?295;peBeyr^ z4&`x?fX6&K%Zz`=ZcoX1^7Gy%wF$j`^}Zg9ggc#pxHyaYTON$CrK;S{%rxS1E4ICa zY(y^F30KwbmBRE?%1L_zA_|acko^j z=pdv>ICt0puzWB}(2ti_I>H3uuTF6ai93Ws^$3evy~ zJOiQnv*nXmzqqJrklC$tlV-lGexb!dAfPdTKb4m^7146gs>&y}khxt}kRGYnO%=!+ z!Owas$HX_ZTU#~l%%QjFuXv~q49(RSKAxJ1FTv6ii}S`VJq@Hh{N&|yaNRX&sLm}o zX!^v8B#=dlQ%C#l;(@WsPjv74hoZKBN9IA`hu8oz48NTtH`=%6JGU~BLqmh`x_6UA z@8$~Giu0BVN_BTmUax-qva6dYqcO;}E4=(7NlTHM)<#$$t?_I|1Bqzj+-@3oLt)~$ zQDRJBcFw|rDamYY3x^TQ)I)uO6xCMCS-F#Lo=@)NS0lBi2g!v_)0EAON1s;3@|m^Y zlh^%F?J)Vo+9)|X(I{$5nc0At`ff+9q%wM^tnEtOdeo4JnyGQAy>Nfo9pC)!1d4eP zl@ji^oE=ou+6b9*GJ3C|)M?G$JU6P11Eh%|gk(Pwxdk^vCi*PChN;+>-x~CA+3ZF# zNvY6gCaW`A63shIIJL}Ecy3H6+;L}|-Rb19my_iMAG9Cz+|_#*T{EvwcYD9pjD3H+ zGCSOH9C{rkRLxp;>-#F}0iE#4<<)y*LgsuudlB^0jb!kL)$S0yv^atwo?_9bS`9zy z*5guL9xF~oxQOd1(d95+M08>#^Kf+&8$zkAQ;PRExD}Qq33;{3zmS=3bx}<`A`K*( zq?pI>)1~UnzK=2{=;Wd78x1GB&nOeivpB{?EB5`c8?xs#m0@;`z&8r!!r4gfug$GZ z%HEls*{^LFv|UXHJeXT^sA7lkZY%JCKucH_3~oH z-db&rz$k}bJ^EoKdkmY&lMbfV9nP0;G__!^uPw+VN6tn(G@`O2U_Q;v4low^Ddyi(rg)KwjSiXLj&J@V=4 zOs}tmJ0Cim4AQH?Sudp3@zC!Y){Xc0A$3*7qkm)R^xi~Kq#BjGunLt>m04TUvNUs8 zLgCxId!js&c(!M1s_U<(Aj)!F%~ioI?nH7vI*yn0B*glkewxgDE!mkBsMSeQx8~$G z8AGphuL-s8}F zeX#3Ca5vwI-}5l@4xDOZ?dhiQjT33bgBSDRv;U~pn8yyG+g{kBYf@|grOv2_fY-Wu z7Axn0fr=h4qr9o5;nZU4Ez`2?@9m_jwZ(pXlNP+niXkuI!E2MWF-QBa=UUVrH>~nn zt}1B7z96gcL%n|B4QnHYHM-eG(Q$e8<4NKwx$>haz8vQS%d|>$1C46<0c#SkpreK}Y%Gnxl(q>92yyXRTkS3j6ws4hsPPQ~rKu1^WA;I0y{DL9pSmaG(gd zcrV4&-r_sMzP3Vw2|-}cAK+EcV~i)_qvai6@ARu}ukIhuif%y{t0w_Jo^g#Yd>6}F zYJvuw7X3E=00fJAi;pV3Dlks}k1;pHlWWRbo;t&uUUt?WPfvb7Zcd(Z?Yi%JS8MEy z&zw9m> zSX<#JY5uIUA1F6|>HY^`*IQ^g+TE>Dwq|Sj2xcGl-W0m0Oz_V&%9-K zJ)d!nL`hEBV=i`F+#+H`^LVBiYqI(N0BVuzat<2ozg!78 zB;R|u9!=_uX^!t%ZneGP#JG42{sH1;rzMZNC66QDB!KU&wOeQvLcrd?ex*V~d3LpFm)MHNT#5P~K4rlf z9Oq9JVxDMOM)lA!(TWq4iiP-l6jdWZuZ!OojkZ6tEtwoyeW3WfwL$ewoAAP^#{I>u zXt4bkF)6*Yme(~}uhH$)29Thk1kQ_7>E`Vbz(>itZXM^fWU01$sX2<`;?t^9yb)XA4!Ye`C+Av+emn~klvE?q7AaF6@gJg42n1~so4 z{wf9ognBa&EHeoT?w3RH1T+otpD0PTu0FAhyS^$I3bnqe9TsDdRx6YU1{Q)*2#3Ff z5^-Dq9F9ffC`}Y>{=Lw}hIXIJ@~U6}a>;rus1_pe4iygoNVL>ztcPMrh`#(w6H@>C zC(|6aa*1nuLS|yl9t~t}T*2nLH7Rua1p9dX_3VJ8u8-)i!au+#W>uyt$iVa~>rOIK6)w|y z0@|hf*L(MG3{E#yMB1FY@?VU%ig*8bz@X!3$m0I`sw!mn((d`}7jpeQ0c((^X^fD| z;)_Pn&Ds}b8axS$t6Cm&+Ml+oq>EOL@ax@sO6iR9t9A+Y^3N-`o%AZzqwF!aSS>^C zCYXv*(Y4%g`V0eU<+O*s=uL<#ag<5ymRacP_Ezo63cTti*D2&bRf;YTZuJiTV5BhJ zQtHt{%oY2QJh2We%mQ?VQ2BxS8E!Ly=xa@-;B7gU?3TN9wA^e)spz_FFHQK8iE4QEm`4*bQ1v%wS& z8W+{Lts@)c;$l&@9?NxIUGqCvkcG6w8lC~Rnl^SZ&z*Zxg^ntlmc5@^$d;{t0D|@G zYW?A8GpQ67@l6VJ0)D~Zwb%1rw6MB*I)izj_;?f7=-~7Rrqt`%dEb-as-$vy^1Adl zl4G1PwJABN^NNdlM}}-l%z+|7q#tb>Iu?4X#UXF%3lYNNw`PXIWpHN z+Nypo!uP)Jw zO_BBVZr=2`(4I??RdZTsiO-GFL@0vbIUg%U(@Cq308~ftzI*l<(mz~VUPo0&iOWpD zmByl*nazP}f>IrB4XzbosGUbNB>Dr)lxDnv4FueMer2R!sVHtU(UwB2*;p^ioEpxr zGQ1X5t1K*U8rn}8nI`Ph;4Q=3#TL4}PwgVJ-crjxyG-X$NaUvoghFTWUJe`9Jijs$ zWs}|@YBsZ^P`qTFXrrn2a@|{AACpF);Tr957>WbRG0ssVww%2u6?X$)_8|owVo5t9 ze&6I6jl{E2wnw8HebmHedAu;?e6^AGhJva-Cr+evIdl0d3YBsaN!Kb9zKb!z@Rx2^ zuKI>`*MwV({K2|_o&1CWEGdmjwGVZagKaeLUe{37;3G72$^Z5i6o_KCw6u(62D2E8 z<1aGD+@lk^J?0}1?_52WeROQgSsQGH##RcqfsyI5k$4O zF+`IsfDt3oP>s~sIJRXM{3Gh?#CIy9_0#;B-fi)S0#kKuMhT=E+t1CuCt~6=?}>K_ z?1@c@W+V|mpkX^`_lKYpnrX1KCwz=r4X2z|`2$214mZ)>^K0*ckt)IlFN8Jzx^WXf zvW}Bhy9%!RN1&0BqNPYa%~xtYu91%~=#o7IP=YX>G}ETnf0rER#p~y;|sKz{s9ZR=5v+T9uCu)VTWa9G&*W^1b z-#+!Y8B-dB%!I2;pM6N5*jDx^Wa@=IP>fDxjnAJjKS(Y`W{W2*yTM}F_`>Df2NA(O zsxjT#3{yd`3LAXcM%NVWN0?q%nxY(b_GLB5cX+V5=(}N9YHEy-SjM%P`E>iIS5)H% z=!m2j&#BdlW_{-kMHAKpRQA^|PV}aOy(^zpF(dfxkAD%T4|j~(54SEIpw#N@dTK-O zhIqYV<17`0-u%|~4c#@R=GvjqXdW2Yw%e}#+>>7Y5ka64(*#Rl>vY1C?!B*puzw(Z zBpDy$@T2#4{fteD&-W}NPI&z17FC1#w{HDNB7FScC*-4}%lVe=GNNkSFX@_jcY8h# z7xCN~JH)dHnO^)RrwBJn!icZGMr|9B{Z&pcs+D~~dhd5$`y+Axvd7Q1Vbv2or&_Rs zJTG|I|LQ|@Stfe2ALZjFs!?BYJgIQe`Uw!TRLugEp3AA27<0Yoy0vp;N!fd3{xMod*=_k zz#-Fhj+eucvX$4S6!9MqM~A#*3s&hP8!n~EtGV3YG`L(g@YZ|PctmT9!W$T=2pNxF zo~>dN_+)-aPL9M(>P=5HUENsW=GaL+ys4q65}{}oBqxsHEWF04?4>?8s5%M7Xo=j> zF-gDhG+nCDMjUDi5Hp4!M~*C`4#(F$X!WxqgaAEB zcY>JGLx6D8-XsT8tHg0w&$|3=h6QhTSz7m$Ds%MtY!g8@v?J?WyPPWL)K6X5s8%y3 zFjO;+34%&>OFd4XC!{!-7Z_+cV8c|Gt~IIakQwt6CFQz41POcVko?wHq`8*8Agq`v zqh;@sLOy8MND`H~6O%J$z-eV-{9;Ef4ez+<5VW^x?n^755wH`x@{IyqdGpy5q)vU+vm)|4LW%UQhYfE{h9P23EwkL|4cw zuaUm7>&?!db_YbcGL07?;ESqdy~M;N;Wld`%PtG+HK5yi=3fC{HsUgo0Q6_semf-5ujTXM2pa$0@f z+1UZo#wd0pk`(M_#b~1Miy@laQaDXRm)^>mqnGXMm>)B4b}lj(L^f>=oRM0`v@>4XRbxC zs1lJj^)U<@M58`sEDK<)9!l{aQ1GCKnD!~|V$|eVd^i=PiwZ)drr;QNgPUmF&7mLs zIx$jApXw*+4!z!3ZNQW*WpE$kwY=*U<7l{KZ9IE`ZhQNSk|xA)x*+K&9cUXDgDX?i zdnGK%ag#ak8ubYnuY7KH^)koO()X6ltxfxmO|ox9sNJPld(~cERHv`^iu1=&!^2&9 zMbOiwX+@m{?P(=PJ1s9Arr6#S>^Y5WnAt8t*)+x)lXfjUTUwVcilw6uP2LxtiZOiC zru6MM_7oQl)ieUe_p0_7ziw>kPlr;}lX(i#F2nI9oCuWGi!TgdRMU3lG+Wn;Bfl^5 z6&+&Kuz0^D{chw&EorUEbXod(y_5U_B4Olm-i`6WYKBGX&2UP0V?#Ap0Nma|i;%aO zbf|s5r~LKG%|~BtZMPrY4=N7F_p`!pJkrv5cIY$;{&FrA-|F9{|okF~8ZJ zi4b_?*PtLx&9N}_@n-wfKB`x(L(%lt>ZZFKp1@IsO_W&{Zz8ca(xZiChz849WtrCV z7iR9972=f=YdW~IjN!R10mR>>fH#+x`#z#69S}hWu?hVvJlVSd3Y96dD`10nL#3Du z_m{gm{%Zb2wRp5})p3fq^;rig9wg&2ZfxVx0GX$Ut%EnwhtL&ZW{5wiL+DRn03}K1 z_aTaHXgadYT-=UM&Oxn8XyR$X6`(Mih=~-q%0V!`MVs;#JA_8*qd_z~Cw{=}HrO}o zKHvZWsJ?I3AULi^-WE}A%p)9iE&;=Eu3oP0}(UhE90y^wL2X1a6Aeth}EMeaF=jGM0O%G~>6nHi4@F|1T zKwI4e@^kOMEx-UptzEaIr>_sM8YPM^#Sj7AlENZE6;?0UDj>~;)j#F?d4RIZvT7Z%CLL)~T*F^(TGe>zIa%k*W%x?e*W zWG?$KK?hb1iCM5GT7n*g9*ychK8jSPfG3E~`347DR@}yKAXX^G!O6si zTu(~@-%T=#cRYgRlZsRam*!)n0cQz}NCh7;*8s+H_52 z4RB5yBsNA)Rn0CvEZ*UU8G0Ve?s%9Zh&tHlLo_{)sPqtfs8FkjnaOMLqnzZp9PgB7 zq2g?^YoutVqJk?fWtZ*cy{|%S!c4t-FvW`r++g5#2s_taLAM*R(DfeLRaI3);xRMn zbi&8Wzl>jy*N)syHH$YZZK$FrWx8`=>3s}6FttP=g@PW;aG?4D--f2i=yX3$f`wF6 zRK~~NB5}MIDTk9^0X|7`o(=LJeJ@EViP1f@wDchC^{JGC7qs@GmI%H{ZuQ?Hb9{2d&N%pm@Rg0iTS%gIC~%l5E#dotxSaKX`r7-J5{ zMiznwSMsy5*z9$n00C7(gcZ#E^4tbe%-&;^<#-HkVJODQ&tnPc2sKYJ6m(;k?R|Bl zHIrP|spyE^h#^=y@X_o+=pg6-00BaUo_RUtrwL#-)nCWg8=vECw|-q2x=59jKswtN zkJ|ccqcxFP_akw{9Rn*J0vm1E^bkP+0000GOEPjYgR2OQf$}%`UJ#tdJ%Ux=kA;0x z7H`YTZ5|%ip#avktr3x4``*cf7{jp({{a8Q06`D{0RsX91_T2J1p)*I0000100I#M zArKNV1Rx?XK~WPxVR14-Pz4ktQh|{(Vxh6YLsKLrU~(03kiya7@c-HX2mt{A13v-( z0N2cJ5BgO90MVfj{P-miyixxEq0N1vw8vHUeF|WBO>?@Fb+FfA%D~5W3a-gmvEvCv z6(~jpN7Tjv4tM;{mTe9!e#Y0w6HFl~jdj%?g?0*{(890zm0sw?7KGR7^#kPt*viJx zf3j?97RgDZx~nbfscjAL=!%Ep2{R@t=tL=R-+ z*OfH_89@4R-6*1pC@91sfl#NML6ls6t_J*|JcKrWtS~#*L^5GtpEq4Ty(Ll`I1zY2 z^R9(DP>DZJ9D%-FcwAhfiYTHHFHd<+?48+1(gGM1cl}dPLwSQ>k}ijc?|t%%l_Bvx zeV*Tm#QQI^hrvn5-BTKD?M*-EHEfk!KM1qgQ>}VW4n3D}sQ{Y6q7$dnLI@y_ChF>& zKFw=f42HtYQ5FRB;WEFTkzUuKW=-d4{xrd2Wi zn(*2{qQfeLacpcqs-(*PC*7MLm26;>Q)C8DLbe)@nskdtW%e~an=9$N#FR3OvgZ1y zS2593r$~T|5%ltWg-xGmWmbGmD`b5?#QZlQwVw{3@W=J$O(^WMG{H^^N%}C<<0=Lu z^Xk<2T2HdB&x)Ie=%Hj!cQ?ai^(oAPHCe8SKS_@!#%yec!8)crrLF*k-JR0i3cl&& zK?eWPlr@Y1CN-O8TOWOqZ$$I|R@ zlCR0h_E7`psVDSKp;~%%LG1(|qFG9Tfb!Pd;lc+g!(wm!%IMR0rsHF$(PdxGLpg4& zGn+6Qm9x09lzs*_Fd)eD7Uo@9U(H=ya{l>SJICQSUsXx_A*V!SjRJitu4{x4eASit zmh*R9L0ghs;0IOrO@^H=x}S4{8@08=S29o0Y_6~6FTZtlWqw6JzIc!LX*W0P(QRU; zYk%9(Y}q)ekW=>EpwxA`0oZxFb8qBgwE^dP({RsvLr&0m=ac^P+pOCq&ljE~-D<2VonRXdej~i}6bamD>aM2< zIx0a^IyfMJ>X=jb7RLMd6Ih(LyB>QS6Qs>b29LR2;|yDP9#vHQIuQCQRXe zL{LnV4PL15BmBGy<#|Z~d zbn2Qf4!{IlZsurhB>YcFbL5#jmi-A#*n1o zY0Js8r$C!tjY0Fa{{W(OH-a??XWh+Ag`BdUey}PN!~IuCg=D#m`qCROaT6q7!@vyRiU!l>-|r%quJ2&gvVNq|Weo zY4lxpU=o~7S6U2zMJ_4|k;>v8=!YC!;)OjmPH~ca;ckdHNX7YcWij8PW^tZ!&Er+G zil@PIoX&;94h0-TLUW_A{`=3S{LMk_4jZ%u5e3=e_OfAYj@Q7GxLn~)x}i#d9fFsY zd?%9*Y4r)FtbqW5gLQHP;j*7QbVb5x_^pLs2-D8&zm{!?Ll8aDd!+A(x^)N0yGm=s zw8-4eWabO?!OV2E#2(`lqb^oMC*ta|&?-v4;3%WJb#NwZhNVxRy8JW_sqOexb3cbM zs;BA|Bl9X_=2W|>&=pbo{{TcxPfnbPMO6;XNZ+yzA+=gsd#Z07E(KBX8{z|(tSy=3 zsN0;DuDwwm9{)XHMmST_jWAgXTof)#!PGtq5ez+orRZ8Q(!Q!T>lgt^B> zC+I(dHyD0UvqzwdSupBKrP%)IgGP)my=};;Dx1VTpsEh|T;{J0ugv$l+%V{m-ECQ3 zE$|pVtL;whTY31ZgbCw$DZi8m>@kI%~M2T5RTWdGNYqDV%JBarCO7k=7VM7 zS9?c7rQsbugLM?!%&or&bqb&tf;p;@SK(#rBLc?q@2&N#cM ztPDz*pP_IyNaX{+B{jaPa4SHGrBUCO6dW6&z>Flqwj2W)8~*@#+L=$Gx%LafW?`b@ zIGMu!a_V4qQOlf1t`2uZ;56Nr5!n$)j_%wdCh3lP;UpuSTMhxrAlX)S$4;BI%LMmX zn{+TJ`P-ms94*Uhh4oF04O*=o6ByWNfSTcSSx}A0X+6q0W7c<^)7*AcDzNuXEwXcU z3x^x23j4X<0*Dyj&bqy3Q*TnXR?~+>$7M@o*eX7jgIQNsTsx&WYjCGTQN`IoDXmRy zR+FLxNWeO&!V@kNOGhB8w9IM~Dl}RY=#J(0Ogg7UE;w7yHjdpz$4Nkm3oqGqJ#f0V z^rtb&hg8ynhX*<%vXKEixgMy}Y)phm(i3|i6YASQqAA&#Gjx*XotI}Br&VQeuBCBr4NBpF7gabvxn0mCSq7MkV+atd=PyfF4FWuryj8^hj3qoR{P zK!+z(Z8si@>xpqL60f`08Nva?qIV!Fn={E52T+@}Q++7NNVl(|zU|eWxJ)djHv-#s zc11VYR{KxwI&7-q>Ee0*R;ol>gS)Na?(5|y=bJ=TzkhpP+;Nm3_xOrz$sL?mX z%-M&4;ri~tP|PiZz?Gb4M3@QT6?_@?eL9sQYE%$C0DO?J-qp32GYX?e2+ zvmX7G5+$`H_Jrn$A`UlI4QLu3snm{Ho=Mz|h*Tg;oo{W%?KFvSURsMr?GZE;rypF`Dxs)mB)(t&-r&6rfgz{y> z&@16|a;G|>oq2?i2UKaXl==a<<~^=%pvXb*6-JL4w>XsD2~mtA89SB4eF7leQ#})6 z$l;lGP^_=#;;>(i{{UN{9Ig;8r^PbW4qY$-wovsvwq$KemnT8lP&+H?27u;;eZcxo zq;=Jw{3ueP8>Y2WaaY_Rq2Q6!sVXp>AmGDtfw0kE8~M0u{6zLOkLYZUWiA(l=Dy+v zfd|o)T=ivTbsF-3OnoM~xa#a4iNal$-NJw;uA77*$*9*=Y?#YGvZ-36 zxzoB_VGWqc5vIfWEaM*umOMiI=8g+)@b(VpfJB4Wy$SO94ELF_@Ns(VrJgXCYQ zReVZ2g&ZlD?HP~yR#5Y~D=3ns!J&QMgx!w#f^|H#7;{p1mXU?G2vq@8VS_EkzN=-g zTp0CK@{F*W){^67#@2DBs#G^9oOm~FzBf-gquLQ;bw^c^!82*5Us1+70jk*P46YIY zk5#}}--SU@3Pj;3ltJYNS2Lk$3yk7PS#DGWB)H&BGqb(iF8F;Ms!^y~;RRc8y7~_4 zo06G7asWgdN|f!gkYl67XtC~`!a*0plYuoKmO3qtlkD8r>YrZb8qk1smUo2WbXkOzNuxzg zqeR}wAg{T6E#*m7B2AXd^Og2hN;!oVxqY5L&}!J|?8c)hHMvdU2M4%mDIHv^iBN~X=Oo1ASanP)JCOzn<+KZV?!+e-(!$yvkK z2;z1Sjnp?6u!lCpToq4kqvAE7RcPZK{X&5NBC_4zvL!+fx@^j5Y6A-Ntc?yG3Zvt+zOdHf6=pgqMo_kmtd9}a8U$rA z?DbD(pNWYAG(@!bD>G{M%RjQd>=a8=W=KY>ObaK|c9z31j=eb);55@6 z^C#B3Y&(@fqWoU#Wo0=u!r2<{;RNT?@W278cS9TMiNS@w6>o!~>eT8li3A-8(ESgL zFT~z;M~00`Wg;lk&>kb)rUs|etDUCkI+u*m0J3w5=R8 zDxuM*_El=r&r#Vs4yv^l7ck}l6;%9(_FF|+d!elz*3V4b&!P`$AX@+_h7D0F_zW(x z@hK;A8C_V!K#H8Y*P$N9ze92(Ii^jm9$kOF-wj$^e3IX6ZB0E@I7l!m>}w)CrV zWUR`Yf~`d6X^@F|#AEk*W#2or^a>v-uBHwS(HyhWb{)7AToCzh=!0rBI16GKS;elm zvIg&Ug6P`}KLho_?RkE!I7mbsb2uqBS6AG9H%m&{DwCb1hxt~(+Jikp=KjlLX3WRY zrqP&dsXw{^NzrW8wwjeZc8NMF6_4H7t;=21ltJEejg=jV()NeFR<8MR_8kWz`_PF& zSp+mFG2SCZj=PsanGSgN3D0?PLREs{lZdQfIjwiDiR>`uk&E`K&YODa9q zWFb@RsXL+ph17rrI!x<#bTwrstHiBG9d!T>UuCxyS~y2`e98hNQQ-w^^F?{caK&XiN;#5y_TR-(S(&`QAIf%Tv*~dC>T>4KdO^u4MK4a z&fi52!;5AZ&s!V1dZR~BygUwZuBE=@|CRW`6mE(nT`Y1BQ#_9|0)6y|bdU~-jO ztwL-9b2W0LbtO}a5~|WVNKozjD@P|Olw5DQE}T3f*C%ak@fzI}DNu!4S$c&97*@c- zhjaM3E!j4J^4Ul4wIo^2E^o80ymn`Epdi{)OvWlMUMvs0#GpeNA^)r+Qi4yfP)%E>9T>=BevMM%IsgeW8{Z)K_!v~L$3>2^N| zTuU=xgyxA&(OpBm6@)G#A$l*tQGYb?)ThS0i7E6cii)UYBJ;U?Br7k*D%;mm!MfIu zUE)HFX1cx>hZ`W*X@GXAxrS?nv)R|5MV8}54Jre@)&7GeOTq!Aoitb9Br2Irm0bCq zWY*|VO>yB>nm!YN!=~Vk=T&?KPb30U={gVZg_dgP83~V~8yrnsDhkmw(-L${@W_+^ zLBOl4dHF<@;Zug9ck69rk!Fob*{C;6&hES`0b+yD)FLd4PO749LnBm2MN#cJT1u)P zqIHwH*)$C|#X4iT*8$-U^Mo*|c_`vrP!!6S7EWWX5edy{5`{*PQEHH`e7tgV8C2=F z)e?8=?R5YIHN8n&F2hVx8Xl*qO(Mi9WvyT`>B3iBO3WcVGbqtKKU7Es6TSn24b&=8 zV4YRcaQrg0+>o7{MdDL$4-o2zPAIkh>gqz`^Y>XAiQmlSMuyHD*O2H{Dn9O2{{T5z zwK&UH7U5iLhkh4b+beHd0HWxSq$~38%awm2D3M=Ibft-y1G8X>0L+ZbkPcge&e6qv9}{ z--Qy6{gwG6l?r#EO1iR)ZirqhQE7w7z8Bmy_?kGoqDkMK$X8I}oO&m!ZPdzv!XXlm zCd&SG;Bk;WI;MK2rkxCXr!e16>d3c5+SV!5&vCtMZ-F9uDG|{~P`#WiX8rJ^+FjYnA9}s@URHW!|Ao{61NwaO+ zV^!d}t+RDK5GRPh3eYS&V}3>X1L&ctmCu7z*!(B4LuRcNc)JeimZNeH5 z8$CGus-0?Ot_qtfycx0ShYZj3SG#|zr5YJqHb^YLc~m?&@PzkFpz?e$Qy%%s0&~Cs zK;4$|tgnoPb!BvZg+z?Gp~=+hLx5MaKwtQdzzctiNNL<64maH33au99v2UuZ=EGsC zP7=j_WIK~>=|NiydGN-wi&C(C$nU8qeU)9?+y2q*E7SJO{27nbwaI3 z>=dyIdr&@({>uB3F_mmCp4R+DIp*h^E!@84`4i`cY{d$@1#kyML*Z80shY22o7zMt zRB#JNh|{QAdM1sng!D|Qw3z4=6h&;~<)-4L)49dDY;VuL;h5jP=-jde z1V@#pMY-IZ?V~WzDpea8wv~MC(ck3~=ew{()_1-SrS^N@{^tvQx~uMA3*!oWgtcFA z_1vCe9$BptQK(>Oq^}QYZKu&X7u~;!Mc#*^tG3h<038COPh)eBT~j{t^4%pgL#o-m zx|Hg*2S$MnZ(y&xWqcqaRCyS8A`dWN?a6SaAiHZi=1EwV9JawaFA6xn`7D} zHK$cfQ555bAv8dGCWOY&BZ$(ynlp#xsN*ZRF);cRX1%X?6d^04Wdw0RaF40s;a70|fyA z0000101+WE5J6F4AaQ{(k)c3PvBA;s;s4qI2mt{A0Y4D@bN!!T?DP7v9a;C`OhI`@A?Pz z&-Pr8oyY3^t|2pn#>YJpHhD4lh>(-Q#{iC&a&tUlyWCRN_)JDf?DhL-ynu$6yQnh^rFvy|=Z=9kb#5HI(dP#ybYV z{;~KzU&BAFXP#h%9~G~Q5PRgGDf{?l&&B%q6>JAEr$zKfxNW`0{n~;&-P<8{^}Ii| z)91#(yM+G$HnR@Q_|GC2t>(afEg$P2)DOx0a>g7ep)casiEXBJAv&@3WY33#NtOpP zdX~NA$IYKR?S<+IAmq_uw~Ksj?t1dsWs`Sr7GLTf55e%;_yv>rXCH=GL54uFC&Pa} zQQDQ^`(Mh^;MM~PWnT9EARv7~__y+KNORrIx@X4QZ;||TVT$%${AZm106_i$1{YKK z=YYP577JFhwl+4cT>0g(;86}sX|Hkh@zhL~&=!rsiEOtY9yp%t{)SzV!8yg?w6eY! z{{TX^cnC7m{m+sD#KbaRCasIRVSH-Hf%O8|_bT;sVHp`>Ao`qeBo7D-km43h&%-=E zGRt5<2WjAw-G{IAnJ{?EKPK@In`RHg9|1zRcpSjSXHYGJ;so_3PpExI>QAd1aqtO* zdORO&PbnTW$cZiSK#n@*O5w?Yjs@*-IOqB~{ZCh@JZzKrhm2W5-x(7JzaT^6*^oW} z5ZF+Cz`ej?m)8Z2{#S?m-}kE| zZa++*i!s*!05>H@i{U?s(0%;a&NuZmarFuR070MB*^d12G2@N0!ZYI87_!pV2f%SL zEZYaWNp*neyO|n|`iy#+^>W+JYz$!UE$ZN0Ji&*55TGzwFozdQQQT~`dXf+w9=~#K znednJ$Xl9DhrjJ9r3XAWBd%q^-G3bZxjn}h+shVB=z?)JSz{aUJa_JR8((AxfXL;y z>i7f~rN@=iaCL5Z8R9MK*3Zk(b?)Q@kP<#wIPoYv07bQf-QDBkU*Xh?tG|gIi?RX} z>;C{?j12~|0}(Sie&a3$uh-Z5H}KeoaT5iRs{ogL31m&n5mtO^R?*@X^Wj_86RnWi z3c$yUAKqhI-W)*p@O0togDf9t9nE z&IC@5Y(2FvTj~)bAF+q?AfEe=OY3F{_5CCIJ@`IJVPr{gCtnYy)rBCo8#uYP{-6$^ z)*e9-r|L8HdQL2|cdR4NtCvNre2%6Ld@#;u6UlbCiTAyy>%asaTKZsO&#qg6ewczo z`IA$Neq*G6mQdTaoWaT;C;tG52vDw`EsUeUX8Pvhwj7zDX*-H%@6=5RIQBo7xNv&2 zBYS@5h5rCSmRWF1vUofiuz1{uySqd8D#Xy0o?9ch;jN6 zvU`FI>%tlCYDmG766H&l2J(UF^pDdFUI!z|{4s||-FtsOtDYWwJ^mvMM=kR4wE?H8 zMBJNK&-D+$vgXDhGw?dYi0{C0I5>pz*>JL8%eKkrjd|$xY|f(Oo?H-?%(L#?6vE8w z$AmnZpN}DzfmWFef9SBfPueAh9yz;LiCJOH&*pbxua%!vG3vdSQvU!zY#U{Sp)T2D z;6b{dF%sc=iFuy)D@LZAREpK6co&%1(N5S`VGwOWWEQ^N2b2Dd; zejBPE?ayb&kiLaV6reF z_~zu?xH-C@g2K-Pgdq7tU_W=rfcE}Na6gfM#PA=g{{Yw3w)iWR`+yM%;U;JDOhNlg z`uoHD&RErH@im?w^rHK04n>{>2<5Q2r?_D)@4)dcZMPAaKwjqO*TQ%)5oMDwgd=;% z$v%85i<8J7+<@cVtZ$Er@cub;VPDWNk8NAS{_W-nWBok-mUvGB>EVsiS0~7G98D3D zeTjV@AZ$oPIf!@;rv1g157oSb<9%l>G=NuNO{XA zeMnih2;iBwNp4V{Bvf7EApBu?p+-Cd!hL7(jGiXv4Djs@h1laJnP3b}w{m?eOMutY_3&xjMArM9#!X9q?T)h3G z+!+fa364shZU>aUTqtw@08-~S!s1=e#G+kUnf$d!$M!ajw*F7`&l_)@HgB2U=1-s8 z49{0)Sw|g^+=n*r77ihKb7h+#5suzmO6%rikVC4)5W9C1?l7MDy4U!&bc$kRQ}b!= zE$5%9BU3I8SRNy%%LZ99Gx+_m5A!lx*B1W(T>gRJ@xBg)!YN@WM%n_%7rUIxU=03b z9Ef$TJ{VWKuW!0F?phI8mLB2uj!sf9IkFt}BQgHcj+P3OpxNsQvHjTaKscNP=a;$O z@X~xoh;=hRjxYB9*2(txKL+3FZ}d+a44PU1$@qeM+`gjZYbxsG^<-+uEL8oC+>g@- z-P;R<-|sv!VL7@k@1K7JV0Py(cCL@HH&Prgc1Jb@%ePLUEgi$3zlrj&;UD?iXn{j7 zq`vE0GhVFE7vit>xO~Qc5L4Ly02ZU={{UN;tLKSlfEZ*8^hc@vnC@%zT6q-p06kBo{`N0X@*DpE7Ep5M$^K_K-ZxK&-a$0JNUsH)J1*oJC$nV)M19=o z!`ol&4s>srFp7UNI=Aw}=4+ErYbNt-jpL^`8&IENeW=$wW1uunv84|s9JXAy}rpDuN6iTzmPvYnG$nFAM?@XzAPd^@xE{;0RWeU@XJ z`i4K;awX}(+Yteue&V@Zwh%g42%>b3UFT10%l+o-LevHq2OJ?Xk@j=_%hw=tAEEyM zsMt8?P9Nl!$FHpEf$){-aAiG%Xvu zfGk1>!1rQ>Mz39+{lTOP26LYi{iSbzo||5OC{IXVFC^7UPc3$7+_L~ax5>~y&AM>< ziR}LX$#`Rj?j@O*#{M3lf?t(z{{R-b@XfwY5Bf*O!`TB*dFnZ>$6xz7H00s?fNw{C zY!X2L>sbek?4R;E;%&x} z=MZ=NMD!NDK11#UUX!M^<1R5IWF;m&l z`nj2z@cs|-dj8Y@0Jfp?J`XwPJm>l`&7;;w_Io0{0iYSoHgOwuvrz{CA@qA0Ck7ta z65?>Z!c2?bqx(Vjk4o@8zXS6QV}@YY?DYM>bvkE|pVmJQ%;Bd1a0}byNKwI_+0((h zlkpgf${q08@rZGA=twU2A!0X^mp2zN*57STvwh1F9!Y(W5a9Rn{M#V7`OW_Ti4W5X zyafLM0Mm!TpFeTHf3XN0`lhv@5e$$<`3xiK3<~zrkJxcL;Oh%Ed(cs)q1igI6rSK&5h9Y`m}Ms&yF|< zji4{_419aHsp~rWB$h+exbbGG{4<~;R3#5O)INh{1ps&VY+ z=4-rA{`1@uxZ^Gwhr!DpD>6I0Id89+n7bEJTwQWnTmcTV)6^P88>7f=)c_W+^AJ0p zZzi7oe!K&}P!InA*2n?E3=D>l`T6p!R4ZCIcJ54@1g0W``ws3j=M{f~;{-Zv_;KNg z+2D)(**}x;Ivlb+-Rt!Hv+&C-@t!mKW6nBKKOUq&3DN%mC;mmT(&ueLf$$JK4o8ln z&eVFd7&lL_em*84G(WX@&(RDIsdGLElQZ=)A7l1$FR{QrAFtic97G|(usQV^YX1Od zfhUp#9z%;ir5c**ULRfaFbAui2y`b9hzEto;r==XPb7eY&*YpTU&k!7&ROFuv--Qw zFO&YyvSaLheEpyK5X@#nyx{Wv+2Z1K@b{agI#|v z041&YTNNZ^aw9f~o})eyv`&V9hi>-@PHxYKqTvn+QojEH7xB;Zd0lViJ#YTpXD7Gc z@_*f+A}7hs-38a!`N_5)egNbhSd!>F@E`euVf_C9(HH<2czVl-c!v{EG)&2OD&+qF z?{J@(e4k9uT*UTSeaZux`-6ubS@j|qMbcx;*LCJr?DzI`L)a%(%brsY=Fn_nB%9~5 zk4G>i_=hpJBIFO0Et(hyF}^=U>y8Om`Z?z;vdKTApN2~dac|6@2K+Ew$M?hk0PJE= z8;-)o$^0At02fd!+=v}&PTTF{{$yN``2PUY09k{8V1E8vh29*H(2>$@YiGN_sCjS7gpop7)dBA!0`)ru~ z+$reRTII4eIAg}RZWAZuv%^adXbWk$Hq9mWacF@@?kCd#e8~%BLLb%3KP-zZv(I8K z%MLCp2}85zIfW-gHI4_)cl)_?zdC>9A7|}<)buCbT4&VaJja;z49GiP{MrSVvf#&d zJildyrg8(J`re^JPbLNS2YF0(|z&vCYS!Ix) zwzmb^S8gF`;yimBFx;L#i-5~GwA*ei`uA{D@5C^Zvy8-h3q=dyEYprW4pc9&JWnU? zJliMLleatCczcOtT{v;>eZhyHtI~t7m>%`_?!k`wx3rvpIJku#Zj$#0WI6I;VbvmZjz8jX4gh+6{n>M| z(--dN(K?1Zn0Y+s^W{4aA%&Jtaoi&lxPgQI zcgk^Wouj8$=#CT*QveU#gY@wITi7NsIc>wVVGm7z)5&&uESK`7fj+McIXZVbC>Kd` z#KRCNW8e%7$S3dnT*J|9$dHc3*!U#=qdrS*wg`gkqbLrhH@81-+qQv@#<`^BLyS)^ z6}fF3E-o3L{{Th7t48{4A3G#W*&GWX~ z4570nVZ#3aF{BYRX5?_O`@?_c?8Y{2irD$XW^QQd?6}S!zX17S+cBd502>m&KHvPf zZekj;5PpN}^<;teB#w};U!rLY4j$g%PPmD~k3stUJ-}ymmWUKw-__A*kD0d^zP6U| z`HeFD`C|mpzk&VO=ge?ikfC?se;==yb!qgohy2YBF5bVmf$X)gn)ZK_dxmR+=j!%F(BwWoqYHt-&mSxpMAq&0TreCCKg>G&xcvJ+%M3z+ABO6v&(PiE z<{Y~D?}x$XJZFYwx4|;YAn-867A|s2NoZf&i-;|P9w*h2xu3fHw zEZ@N`c6k2)6Z2)%xVl%5i$TC8jyXP))U@ay=i&W9p@ZxnE9kJBf$Sfj=h0&w?K7Au z=mnyEtd5;mmUG6|)h-Kv2G7Cpq}6PE1H-vHOAb`a8lf?6V(Gj#SOzSTr zNZq|#Tut(OxC6T@F3$lbB1?lK%Z%rk{K;3YWIi`T`LM?YjsQJKAHE-{A9tzncn*AX z82*an-E5BxkLYc(;ro^Jqy3zpDh%HZll@(rhGmak!sOT-e9wb?Fqofq{Y)+#$sE?n z+u_<{gWnz;$Cxgdn!e6UKm%w#8~*?^$A=g-kX|AK+uYf3Os8SsXJOyC%{BPD(&6e; z>0>^w8JFmJ5AN#_J}$h<*+ZydC8=<>h<`06>cMC9+kEJ3j^!WRn?Eg>&lg6$Gq&9x z%yj+zea;*QP0IK|%5cYW3w6*&u_>dO4?5aQGEad%;Q2xM-wDPIKy~aKU7UP*brkS5 z`+dKsvObYm!^4Jt3zmK?qvl5$_!?{-FVqaJ2Oqdi=gFCIxVeZxk5A0~wv}EmPg2Oa zF?H|;(jq?rC9qj%k}Ul4&pSXN;SqXqe`YpvfH)sz^2@Iy$?`pnTOpsp+5Z4HJNIN; zZYKv2;kFLzxP@Xkm!)u$JrK&kR}MH_Q<7 zSuqzDu#4nK7W9GqkODUgU>G>~KrU0$a{|B{^o7oS*f!vRY$7jlmX`B!eyk*mdcgI+ zcJ34>8hkfe&jLQCIiH_@%4Cvq^(k8c!?n=qo`vkmaG7eBuyOL_yO(iW_Vo9 znT**UO#o&z$Tn;7u&`^`VZ6W^H6 zfbhAo9gDNBKI4}3S{O=ljw!mdV&Wg3{9tTE&5stKZ#;o&aDkXCWk@NaOob>L`n!Yule+@!?jNbt!#1lCVZ6D9}`M#e*@ zk_}7OpLlZxOCJ445b?gvi5zlkt}(#QKfHnMJ|2IwYXUwu$L%a8yEzZscqoxA)vvZA z5DyRJ^B9Lsvuw#ouX4gIQ`h?F#%^WqJ3=Z7w$HM?EIyQ zm}BFJ2r!+HbO5Tr!P;z@M`!tA+{f<5KT+;8<{oZd3okwoF@~{@i)KT~GfC*ZbNCJr z+>&@6EbuwX0fX(j`G$esAqTvKpl`BI+)%7xct1bQ!x){(#%{<=PRSR+&qv$veaHkv z>~0a@cO{TTu+i0$-2PiKZXh*a8S@(CA3@C6zTUoxH*@9W(|?Wi_hNWqLPpkmTk?({ z)rM!=+Rk)yq9(q2>2oEu=Qrf|o9@1X)*|06A?nw}qE88LnD~yiUOY40M`pJ^Eaio} zUnR>fZeAJW4JJQH$A*xj!^d_*9nM2_w>)$%7NXRK3VLY zCJf#?W>uE>^(y{^#GR}2^C93kjL$`u)-ZPMv2t+MkN3W`FaH1|;lnw8WI%d}1Th$E z-qwO2L#W*4@uM+5KT$C7?-zbgejNKe?5@^xJYAw^GIQg#%E2bgHv?>81M>4fv443R z!Emp8{9PC5bt9mM259lm-O|qmqenI$_h_FauiFy{ZQp09{{V7v9Vq7yncCbcyK=TKVJ8uxq?az-HCq6V~jO@btJ_rtsbi)+&k6+9->@+w3 z04;0c&EGIjk>Q9|IuxPtYtVRU+>xh9U_fkRAwH~tA+h7?$6%1lTP5y$@uDMT$Me$l&GJa&ztYm}ch@{saCQK1ta0JtQZX*`4uY z(<)r{-4OA_O0q?l+)^Gba|^ zBY#u-ecV34`$9=~l-r2`?oqJ41?Nwv{4>-!pA*c8H%-nb5)HAEd)T#pk5-$2_Hs(# zf8l+W4!_c1*so!z`TB})F%I+fCgwYEv3KnR1Wgt%=z=>(j>q$4ARu^bIlBD^{@NR1 zspa5lZ7>9Wq~v!OuLnzsws<}LqJn=oew~tXMqIAo8n<5#;|Lg}eUeMe<(5d28bQEz zu!0@Bb01&!@yN1#o&;5d=DHS1%<_bAUZl?8Er@h}OH4BUWEFRF`%Ag^3`khy{UPVc zJ^uhR3gy}8@^Nx;?$N^G>f%1x`hFwKZZ1iOCqrT+;q`9Y0Ibx)m+il+7LI~uB!&Vb z)3`?QV@9=r1Guq)8N-iF-Oojb_(@{^zgRrO;@x;yydOd-p9M^Eu16A{Qt zY_?k#6b)BCzq}>1(_R7i_&>{Yq8tYS@E)P!OSCj3avaLz9+q)%yJi@gXf^a7j^_;b79 z{m2C5?$mxEQzX6@)FwZf^DajD$;2m(*1?~9wQvsX)BM=vdjmFUSGh(8PlUVAu=WS% z^w^I*mdfs1?PvVU@UaQiKg0A`xj}$3+ABR5kMzGH`;ZXfcnUzABwyvxkGMsaa6IUF$Q3yd82aS-t+QBxg1*gtl! zTwRlkEwnvN_w{a*rIQ@mNx@b~-fTT1u{R|4=y&^`ErG;-ZCi)(+h;anZhhC5V6b&3 zY#=fcY>M{|$KE>q%Ya}vZ?b+#A2uH0^*?bob{q_tBi-->g4>&D{5Y)})1|nB6%xuk z+D{_)CJ!Dbgu$iEy>0G%N8Ox9z^_vzvRYW(Wd{Klze(tQA20TWt^lxit#*&NN(9cj z0RI4x_32##i*K?U4HYoDJa_B{t@nJC1Z%ee?lDU@}xt|cT!wU)E0y|JYYzpe~`t1JzFEOQAw^@5p z81L?7R$;J|dyA6;n=f&fxOwM@4d`G4>g|aL@h7Q`@CSo(`>c9e5x<3*sgy{#!&$eyyAR z#QqWe${*OV8wxfuc}z$yoWm9Dx|d5Rc!{44A$lkgGne1&OF^=DHtgAZ-ZrV{+Pn+ z;U`mBO_N{neYTX$*vkow9lSx}!2Gil zz2ra(>S0OCnE9hU#7Ws}DVU1R!>0R7w{93*(~JB6@h zUHO-ZekWVBoKJxD4ksq)ia{7YGX2OxxjDA(ZvxpK9EleBIsMyP>PoJxw#y(T(;^&A#bJSDvJ6n-?Jh3f8{N)G+r_*@B=Ib5yrLMvjNBz{ybCS1%tZVS zJ+jZ7{{SnP4EZi@iNufq*5l1{;%@}+?Xk@zcqbRBKX*Q3J2{?kl7on7*fHou#EZ9r zTwCHh`)%{mY}$)(Cd`xNFbZI~mLB7^nx{+rg(hXTcT{>w9~h zf7kKjn*B1{f2;WfgC1bZ2D&xYGRc4N`e7NfwK^D}MmM_3rHdDwj)Gk%GybMiL%1MFiE z8gtPp2#GLU)`BynqJnqa23!sIYEEQat18 zVk`!I=5_o;zEaByGF~zgc$hy@m^hQd zY%#N8a=^L2j`$ME^SN7p0#pUmosa-2$Io+U%stL0F|K?x;kuK*9zUNLLjBzYwDLIc z2;s{d{gT|bYo(H$nH$=`EoF>yjQ4Jh#@&0%Pq}*5XCD`9Q?1?+#_KICF4rZQ?p`Km zNj7odT|O=wX8uHR;QmBl(eB@=cHaUCFr3?td|Zy&d`rl{7qSp$$qft;PUY?qjtSy+ z_#m8W7h*Hrmf<|wxgHDQLgo5QtT?lnJG*K_rg+}S5*+w;=Ht{S%*lD%mGJjzE<8RU zl1F5cID|#4ej{zR{sp68(QILD$z{%OP{_&rP)l#e@X6jJF>T zD{+$;Tg>+_iAW^Gg_H0>IQ;T_1PiW+#x7=G0p$9TM#A!DM^thaK$w{bo_MnUcLbBm zh5l@uOd^Da_J_=Ird!Rx4W?bz9lrvE|7CM?o9B{9}C+L!3WQS`UouIScfshBw2h1lMvpZ z9DGJZC)D#i8$*1!~Sx?WyoQFBoBa|Ure@8Jy{zgF+p9GI;zziQR6Jwe1S;!aV zvw%q3-b`E`EzBbCW(NFhad4FG>Yd8@+Pt_c40-&3RR6^`wpIwJ>m9z0$A zovw)R7?)<*@IEr|LE;Tue+K>}c^1pyJc2F|iO3WAxH+kAV<)s6b7)6)ERJDAi*nnG zm;;v#k>UAd^dGC78vB62BOxOn4!06~-OJYLZNQf~Z!mZ}=h49qd$)*Pw3frox_+a@ z!ww@_G`Ty7<&m<_aV+-<>&WBaS6S-r{759S7J2Qy1Hcn3!<%v+@d>yO6D<28IkgD_ zWTtd>I6?f|KzIf3;=$;B%REYkTj02t!@I#`PF&@-c-K4kV;E59K5Q>`yC%ZsOO3U` z451O@+*hgY-ebe$C4sjAVE+I!#@YFQ0_2v$cYYqlbdW02Q%leLdMwbMq;x*rUM~Nm# z?K5WhHRHl3WZ`r+nCD#jx$T7{M$&f@ZW(6Bj%AkMZB^3ZK*Ez9>LC$~8Oi$il9yHG z@Yli)qOnj^CE58HNhe0qlfi*l?B>Kx`l*MVdfad7aTF9)2n zz&SiEXTU)aT@&I}-;hnXYR+#Vc+t3!wHsoG-Wx`LFn!O0I%GE=;)14t7QA|CeLz~j7{y1OMxcF-fpD36nQAE2kWm5w&`;q-sDc< z`my}J<@^g*+w^^~II(#D0Oz?GU4z}%a`J`jS+;2yYxm=C2IL~Pl%k8O=T3-B+a~@x7 zP^3eBY|QL+2nqqw!TpY-7f%b>8$Cl5u`5Pk@oboS@&%VRIzuLK&k#6R_kN`h0t?m5 zOUV#H3wXD{G9M7w@*J_?2gRqT6yBtR?L3TaE$Pk@3>i7NSeS8RxC|2$vU1y=Ubgrx zbg-lRS3v9aD=iLFxmjM~Y#6?wj%Al++9vD{SlbPW64IYf2JM~;h;eBCCz;88B@b3k z+(|fKI@{fiXMRV+Ao0`59sv@^acpg?ZOtlgD$6UJS*LRXy>mDFv)K4ao*nfd-vRQZ z2dmTB^ZSWiga+71nZqZ*8{z`poGY99wgi78`<@>c12|>L4o?YYL@dF(p8AGI!*0K5 zTT$Xnau{(Nijocz?dZ8mMq{2jcpGnjgpUKrSrCD1XFMd~a@xIJJX$Nc)%76jsRe#s zlbCaZTfv7s$)L`M1wMoUpK=gs6U5ognUOid>~6=&`}&LlfN)3vBiO-~YeVB^^(~Y< z+}ZJL=ZWG4ELoPxw#Mbv#>rc#8FNPLUbm)5!rYTlzaAV|?i@h}hV9^p`~eXNL}DmG zg}LpJ&St^RAyRNyn*axEITJvCY$ne={?_UON9NhSnWJm}007?-=Yr1AnFWQUI`9MF zVZRgfB0|qYg73*n^b*5%h)#SR$&B1~2|coz1$lsMe8Z9PU~}SlW#djf0-sBf4~zD@ zLEs>nYvAw@vLJ*!mct6OzJIDWo6ywX=Gu4Nx;V~Hq7U~Qheqdra^??5)sOXNG2-X# zKpu5#+>Tj>?*RIzDaUzqt&uOFhJ+!Nj~>u2je{-p`WQcOxTSqbMtK+mloQWIBaH5h0QT1Vd6H;VV7ww z0!4?&?GkJvGI+J69d-0^wOV@!Czkq~U;3LjL{H>+{cF1x8 za%&e)%YBm>yYQAt>A$gWW~9Dl7JT>?1MtZD6Mi_$Z`oJ-+@{Z)fct<6n#-9Ohakun za!B1xF$#s#59(vO3B|7npej(s^ z5i$`M@nhL7au{)J?o1D;Sbt~4B21jIH9xxjPyYa$L4B;2{A-!z9HZ;hm2JTU%Oja@j-U&V0$rvq(1LbTw=lP^D6~Q_dpj;Y9mWJX+n-X#o~OqbyT^S@;(}go#-qFiwk- zFHzw0c1!hfCr_IqOp_FbWH!mwwa)vK*M1&1DIco|FMbap5g!2j;c#T_0296PYL4M< z2CrE00to1wFJ#TM=w#GSngWO#!R^1P4)OZ7u92Y9t1=o56jmR zi1}@OT=?;!;0BN$7l7rKy{c~~3$BZQGvFrBW8_N`_)>e2zYe6#*_Gg27UoA-po|kU z^JOJ0pE1{v`6X1p1{h0ch>v#TDV{IW!>;YXWO%S*9|=0@*$3?PfB(b)I1vB>0s#X8 z1O);F1q1^C0003301*QaAu$p`1Rzmi6CyBifk2TmLQ38$oy)l*~k}G{gtwbA}g#AnMpQm!?iqG)zUp8tX z`9vBlEeUSOXZWAf{lsS~q?IH4{{W;JGO+nqX_v+1R_P*-=tt2e6E0lwW2sSkY!}{j zD4}p^OvHTDKGy)Kbj6JvklY0%{wK<#YoY7B@g5y>WgRRwA2;dlTrCR-T6I8UAYn#) z9A}Yd)?vcfh-PBeECa`yofG6z=l{7^_&BoOqA!-}| zC;=Bk&VqQg4UwuSp=aq+35N!`SyOkSqNFTiM zJ|E$*Blv!p5RLri7))ar#xS(F3{w^?5lzP8AiWPdyMvG*7D3CE#}T7WnU4cE z0w;s6Oc-&AUo`Na_^?f8c{D?xAXv_gNRe&#V#?e~n7cH%5Wu@yjv zLS{l07@h!war!23qRE|1c&WYae`vVS9wyPYxtDNg#6lci{{U^}gi-2Xec*UHl{LArMpq1VLkgD3w0Q~jb4R1vL8mGtXq)w~EvvVOzTR{OzF1>b-F z0CaERnMs%!mZD}$>NlrUC+5Fhr5iCs$3X8ph!|Ar5SVl$V-!#WLcn$>+sROgUqI_y zb1QgAoQTF|n9Ugbi;QY@LN^cr0En{@>T?LtL#{R~fYn%*dq6&c9)753`a%pU{*h4D z^7e*hgPDl!GUC7C-`l(@L8G?)<*;h7V%$`%&d|2hCKalU%m5ii7p`FO7>fn#7I+uD zy`u3_rFp6m2-c-)VKBDPG4(RwF^tGy=6p&ME?YJa6aJ?^9Yl$b#IR%XuKv+;WIe$9 z2rT!CH;OkA#_$~o6T~8%MS2TZpa-w}OeMx3ANYXYF9Ycqd4NDAXlfDi!w)(Q8LB%% zW=1zhXj&_qig^1)7A8KSu^W2KL>?mYBXbCX9XwKIB{~k*M1Qx#3do?j*J6I#yV@M#F`H$09Wn>$vvFYA*0wyNI zT}(@Q0k`*_A)SaAP$~5${{U}!;gK<2j;rMN`-sArk3*pImJqj_sCB76j6ZPFHQAV2i4o8q(-u5E1xe{Q zVD|e@62WlN-IGA~KJa`Y{HLgU?Hip05~oZe5(F$|N|oivXand(Vh1xTgTxIBts6B$ z1AFaVpfPe0J|t$0B7irjt8jp{-kj*X!4tf0OvwExTfb<&H1K9D!Qzq)_wDTmFo9B_ zf(S?vp5=Kf%amF-+HBN+KfLiE^(h_h;+v1Tg(wM7%Y>LBcsz!;1KKLk(;ma8(k6&% zHYGDIJ*fUB92Ue8?GwWEouVlNc*|SPyVyWBl>`Q(HNoU26XwKEO&&q0>RJ7O{{UF) z(8q1eQ@l_L#>PbHofD!aGe7D_TL2B$`pYmAaj&;ATrk=w+EffgF02jqi_)iZ1o-&w zg9APzc3<8OqsfYZXn4_@^|KAiGONm14oyRqD(`4=s{F+4Vq`204)Zo4M8(+D#(rJQ zA{7#Zp$RY_@d&Tw8dwt_shtH+Sp0|xBF2P9RW}AKnB1^lp;Tq=VVS4kXu`$if8I${3+GQaVRYF(L)C<#!XhTMFo`x&_$*Sslh zc1iU!8rvDri|;z6+_`)CmR6@jIz_}_4&!1d%zp(fy1I=T72NkTGY*zo{%Dv(be1P! zRmDR9Dt6*#BdTLPqxBW5-?Y1gKp~7kU{9fp#F>RG+2BQGUd(>NQxRlz`*R2tRkXGj z$xrVVhy+A5VK?Lu!Q>q3Wy+l79>D9sCOY*H-9Koo%ES?~RUdy%JIu-o!()h_o*nVy1wf&9JWf@03O5&KD51a~Y2gLg{6|pAL`Evn8q`KKB8nPzhZ>W6 zgX$t;`H49jirhDpr{C z^aJW(@k9=e#$c<&=V5=H zY2sIdDjy&*Sgrk_G(^W;BBn(pNF2mAqf4Fj z1IjcbK*Onr2Ws~n=2FCh396Xxxd&1spymN>w8@htY@kN*Il=xTJU@#WK33TF_k=E!VXmB8pCyUbX^s2$-G#A2~x4VWI{Ucmb3ZUM25DUO87)XW0%2*3~`J8<8;YUzR8 zk_YcGyLEJ!yhHQ`h7sjs*hE01ZC3+iBnsGBB+vqQycsc$rK7yV;!6?MYuIrLwQOSK zakHo%;sOA>nacI@AwHYx1WXDSa0!{vD{bjKF!_mth|6{CZYzQ)?0q8^MzAhp>p2TF zUNs(KBEuV>CPHe5GZGaWn>v`jCo{7u^n?d}w?BE6$U-Y}Dixj;$yz<30MCM+o$h#y zYt29gl?bsHJF0h`WvwkAw; zXNPoCSGm_PwelS*VgXQGMg;9DHxjfEm^{K(hi{-v14BG!aFo5wRUIPc45x#m3s^-O zm7?Nv+AoG3%nOZuCPO?sQ+?r?I>$f*lk3~o5Ju1q4x`8n1`!+R0iil%#qkKe=k9 zg8_}L`K}T>m>lF$wR*sS36W+Mvw8`aI9!!m)H$5@gp&@K`HjY&9j$6QgFyPI}0&Et@+mUJi*SF z2{QGlbUGLS@(m1Tn3B!LA$H{YLJxg2D%R~=em^nroiGNvIIfDOWI(1<9+ zHojJz!X^1{$b6t^Om_fGZ`9;h9ihnB+;&FT`yW`i!uF0f(=gaWl|BB^fb9{9uxCfP ziG*~W+kbiRQij}dC_pA7+sb%?9Vp7sXnglB6B+1CYH~I96T~jX#r&J??Fyz`b=idQ z#rjG&DYg2EP>tq6YY3qg3pEHlG7jc4^syd>Alev4iLvsSb}+ytO4RCg>VV3WBQ;En zS%Qx61;vDtI1?EU;j%R~AM`WB*TP!5<9NU3xb_D}5b+;qtW?;8#IgQbmPxY|M%7}S zvRLVW0oR z05}l<0s;X80|EmE1p@>F000010ss*M5Fs%H58FfxIWp%g$uQn3XiP%~n| z(O}{5|Jncu0RsU6KLF5wzzB#CxPx~PnRc4 zjhTT2noxg}xo1ELfnZpuOk8_Fl{;Y)`%G+vaql0iS8Rv^{f48q;=n)oi;NWoe>?Y$ zjYlrOtfcs=fZ|;Pe5$hfp9=Vq%!^#6TcXDiw^emUaC*wrn{p_MmWA#kEoVsQ$AKP_5cd z&2&C>agOi;OiTi|nHROa9S>ftJ6zEpyv>&@C@DaDpCj(Un^vkJI;e`55hgrwR6rn= zqbzYU0KkGakAo0y;G)L|+v#z+n12|TGaGa0>CiJ9;3+ew&NJdG!w(;JOb5_S>VhJ~ zNP;MW0V-58Bymx<6C%-=2iyFnM+&B0pGGWYakHJQQ2ER`TOL5e$K9BXyshC`XHYE6 zYrI8>u~q?~GW0RV^DHwsm~zL=X*b13RN+SaOZyxH@LyVcAS`+~y5lh5)trfxmtK0K~!4zBeq{^5oipYN7f8 zf1lnNaed$fjv>Vgo6&ZOlBPU@V?Ke#&21QMc$LbTem=x!8{iFAX5CVYOJ`W&oG4$>U1m5!xNT8Oj z&oH0@bvS_+<={@JP0x~?S>u6#RzKyW?B_=!Tt&O1!Rk+k7k>lsY#FhQc4ApGN-Vsur%HJ~!( z%lnn)DX|nlHq*4mrI?2I?>cTKRkb2v9j;LFIQm2*Mqyz4TqkJFGi0IuCSlo)LFbbJ zhg*Q|CS?lbKnErh36}xd2A3{e2hMZWLk2gP8o;gxt7JqFl2BL9O}}#1V0+?;WPa%$MAC zC)T9%F%aJo;~1&}i2J6U+!EY`E~^e2ucGB>q#N>a%8M_`NgXP%T-RP5nS7 zw8Yo6#w#p&^58x7$i$%7~;2;hmABx4)#NBkyX zIRUNZ<87N`?+OrVb!*lF7Z<}_w|BO$muMq@&UBcWaWTu2yo1kZ9Q>zN*>e5|D@MSf zN91Cg0Q-+v(Nw@aN>9Oc9^n4)b1^Nv_+$$c8(5VFF?>YEFL5!VcL;wD+d@@$^B*P7 zr@gSUuO?v*n98uN;Wru+yl=xXU|foC+ZGM%)_X+-Ijei^m^o*}}F2XWl~k-9<1 zGbR$IF&(8q*z@y-4;q-!P_f!$#1wq}Ao_6{aT{X8+|HPf-hWNN1y}0BgR`9jFQgnqE+W^JK9@qEgNwXI6^fKLK^ zHoB?UO7_;`ItAsta3@cg*o#aoZ8L_ycnnrP^4s2hqvm!A+d!Xsl^SL~1TGuw-Fq2C z8ae<>49Yp?J1bWE{?og(8a%?l`GwZGm=|k}%tJ;Z`h3Ia3Qq!M#gTCqP^6Cpk^9k| zCQhKS8FAx4cq--p0LrX(D&4AoIN1u>9Lr3KSbibMh)6RAVg$>R?2-kLHkdMIY^VB` zw?0Af6zFGgf)fnN_D+@FKkgs6gS2ukd{48u+t_V7oV}R4y^Q`Rsm#oK7&r{x`mkQ8%w%m!Mp z-(xWb?Saig*X98f#xMv^FwDf&0dcXrSp`A)!%4SrW90aOjohKPhyAAZY;QW0?#ELO zF4)Uc;rTvc5DkW&eLi7>QL-ICxReKN@ys9)2s~-xU~(Io-C`B?fXvy`5CyK!01eGf zm#W2_9@_Hg2wm3aUC@P2 z9&TdDQGxO1GJ>@-j?!i|?qDMuHw<6J4n`YnN3oBQh)}4td;7&W)NVV8hMjoa zc=<-=D($rRKn>gS5wj2}b{?X3?%twfIR|;;+F&bUwyBS)N}_jVM_BJl&97(ea{d5W!fdcP)%F{L;^1r!Om%4f-B@dH;i1JqWS z@(v78CTuH{83uNhu?3lpzSQ#po+nOsB3uRy4;nfK6i=I;CsBVBd5MC!Cyz5C_OTQC zVH?lriv(tjxN!3@3h5Qh6SEoj;HJ_JysVg<*m(M(pDvK@pcwKw*Nn5wqs4x115 ziPdzygSmL}ATfEDF`nFm=MI3&6KH3M#(^`bKapNJ?oAQ^ z02U;l01KTbUX1Ffgpxe%IZIW zY|NNY1rBI?4sLY#F|JU-$*wl3-E*zR0R(x9NS_tCoja3Y`UL(P74ZN7P?>izhuYCx zfJeNuT+203AGI5E2FF5nm+KsAyibT~U7Y~40)$=pjO3Y(&CFRlgzE8RVRg2bw8Clq zc}p{zx{i#XUVv(OgmD1hLQkQD4WQ>r+dyR<1jKdI%xrF2+7WcF;kz!<1uPy!f9Go#sX#4E;2^i5mya0%67x$vgW-%VuJE)MTZveH(Ex;O;?ZXuUo$;{LDzHFLCG zI+drtc&tD*^w1c@Zxe$D&Jm$mLQybF(R~0IMQ8*OM)Mv~jW+ToOofh#w9S&*4LWw( zp%v)K#9m;TleljUUfgQHMKnwtL%`CY5GjLEs2W|$)I!HZOPQX956&u=-+}J|98|xQ z#8?{$Nb?gaw*(p5HOUv4IE-#MrXx}(4Fm=V7v5|on}boH=g2I%_KLu$KH@(x zK@7?)X~Zz@BJl?h8Qrx@m$dP%XgJUa6nYgdDue)-#N^CAXMd#JWI;e0JAC|3qWj1^ z&?oC3{(?*1Vr{A^-XXCHh6ElA9T*39+vyDfv~#>1>c%?JghDoyD$EsePW249Z$$)& zUh<%e&Y)@pL^BpC)jhC#*boHidV(#;+SmcT>}$u^!^^8W* z4)Aj^aizl>m^p$NM9Mb32eb!~D^U&jl`*kX6_K_xE;Rzg5nzK#ov~J9NuMI)#&66S zLy{Yh9wM!pv41mD{VS%+)BIrDs=4@M*;wp9DUcS-!`RNDfmH*6wwD3oVmm>hJ44JI z!48Z(LI@;JoZjUf6zHRI3Xa|&=R@^^4m4gM5G)H62>nW+_cJb5cCuz%BO(# z9RfoGLhH=w@@0HT?gFs@kUW3)7plqpR!l5!?1xkGJ8$|y!G;AUC;$nFYT6E9GNnQ$ Sb@Cw+w6B~1gP_>X>HpcwRqylw literal 0 HcmV?d00001 diff --git a/tauri-app/public/pma.png b/tauri-app/public/pma.png new file mode 100644 index 0000000000000000000000000000000000000000..d60b845a0bdaed3f9aa9eb8c8ed47c860e9c4f50 GIT binary patch literal 249743 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

*sQzOwFw3K==Bos9fY$78~VUeLsr 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 z

Cts?)#-+5lofRd|t7lxIA};{GP5knZUX3Q+mM^=m+ z>EPOpDh_l?F4@v~THJV@W?UNzLP7zWo?Rs)lOt@6dRjF;zG35LECq2^i`htRL4}At zpVi9NqJdmaF!czlXPIy&YKLrV%LQ{rRUY}}LNYaFQswH8Mki|;MC~T%1tZ0e9HfhE zBGl-E>Y2f)vSm()n9;!J@;ba%0>1}niZurD#x*n%rq(@bwAsjcyk)!M*L%@4%S6zJ zfsH$vRP>}(-NRs%0-zCy&NvY78!*R_dloh^%3n3DeSU=T%!?^jzu~&JA2x)~ZMwdg z|GZa8``HcMQ3x=#OKDCYiyS|a(Zv&mA|`w$Xznz542vxBcWfLwrpoA<>|{k27`(Mm zukBP}o`;X0>W91}84HcER~#Vfg>@$k5GV&8tU}4wQrpQdeYtUwT!WzT6d!ct zMm+hD0gZBz4J{TY+_NZ7qcDc(dc3d2==nBsfBzkCd&@E#UFSVDVFP|gHWSLPHBGg znUndP#-;U0+org?QDyUIpp(G-n(=I=zdzQfcH&uxkycul*Ps)@8a2bL!!o@Bk9%MT zJtgd3G^dU@ZP7>2vWEghmX0a{`4@}gvdBhnY_JIT2rp{4Ml*|QZ}B7}~* zA-^NfJi!`F(fEoCu7cVx7;U=dlSmOm>=iT%T9LcixF*WDx9g4AH$T(-cNY$^c)RKY zIU7-7ge8Nh^9=K3wAx1TbVTmRKJW%et=U93vuF=#4y1q=O|L%#XF~RZpO_KF?`$Gr z<@z>@MZ@o-zOY_-;~ujSE4IVYKnW5Tg!fCSVt|=6Bwt2iEXZtN3(P)F5R3` z&3PPPg%R73Jn7G(tgPURYifOx9-XE$#)hw<*qSf%;G15Q5odG^Ba#;Zx?Mj-(J)G9 zb2&uO=2;)ji)9$_*tm!I?7)IqXi@k`7EeA>SY}`93+NgJJfnvi{O;Vm#?F64yTM8s z(WrbT`r@6!(dK$QeDu)hjHxM^4#!Wz@B}+}6p|d-K&Z@8GXu8?9h6&7eZNLu9kYWy z%(9BR=5BRmS36-=&!BvW;qlDjo_(@|2)o={~b{z6m|hW5GLY4CEHu*_ki9Mm`h#b z#x{t~YF|kC>k_wFeRg zyk>z{p4n~Kd?>$XMc_bmq*p=+F8MLYdixZXeGfoDf9c9F=)sJ0tjJ8%ooJux8`$D_-u^T|c8V^x+( zpqFPlvpGbpL#@{~E5)zZ0wL=Q$upU(>)slrQ-(x??bmz^Xd7~4Bu7nKStA77cPyA= z_CxZbBh$NNP|XZ=4s7-)CImJyBL@S&HJ?&*C(k%<*gTRr;SI17G0wt~PA1fa2Rt#U zcihNiVkteokI1a9*OJ*N!C@L)^x4@$R#o3mk#SK#Teum#H^n*ECu(l$so^UW#g3V94Sc{;C#$d2P~v4r=1y7+3@B@tmMoetSj`K zV8|d>-co*}b>4Z)Lx?>vnQpOXBtjV$c)l8H^tg1;W~01(ex7z1%Qbps!Y?cTUk`r_ zY>AoM{sGYl;~Kh5S+#x@t6N3xDLAwF))phhF|Wyuh~?bofS|92$!v{v1=ASC&W(^* zCXm+-y;y*i^Yx%`t_EndH5FO~G=u4pu4G~XLiE`Sh_(rf29thIJ3OUBmIgG12Vk7k|hKwb)n{?ss5SCNUVXa(luG?nauBr{+wE=|v;VuAc_D>kBx1$KHWz%&POACR7P$Yt)O;;+fBt7|ovxcg^LtMP}0jP$xDNw-&cI*5r z42&_}3$yCM_RRGSIJ7)cBF60Ka^1|b%C_}7)N;Xln2saQ9h}B=Vx8v5D8R0oZ%qu= zqTEwQq66+|)hxVrqt6;g8Fmlq7?k-9w85;ccoQS~TR6=X&9oEmokAu63N+ZNx~3<~ zC7Y)4I~e9gSbr3KhKI0GmDv>SfH-XBi$Sq39Drz1I*KlkX$Qq|y zL_?Is53+eJctQ4#wAQ;(^)|)i0SKGKQl~%~Jo0(FcCmpDp;zSB;6AAhI`he8wAb_wYu?-oTQ*E$3c*>p74BHK3ESK=IjsuD5d3f^XLRJ+c<0m3Xh%Qc{)TI5huF>YU{OueXJvSO@=0gW zq|c%06zHHD(|C$DUk1aRYBgH*c&<_TOl&wyW}R6Eo4mm-b{_+H+W$w?qEXl6)Kx`i~yMxajb3{gtNFXzTDpaw_B8y@-)#`rf zB`v+^P5(~sdeK__pd~G-MUl;^SThPpAdz#%Jb3tc{Z3|fdVk;E=a}8=?varI*iEYn zM5Oy2Y&d5R-~RTut=MceLEaQlbPK>%Tl#0yWMY~GL0UFHSJ(lR>JSGx>tfx(9XI2Es|2;C0MGIuG!dZ zLzA2Jvf_5SW6?U*YtE*qnSGR@>yA(IBuO6K(2dumA6FcPaJUk;XBv$B#fduN|Bga! zI_zCE@WGiC!-ClbrPK?{2H})&u4KTXQQ7C7s{VZ$bYLLysL=%60T zBMhz4uW*f{m?YGF6FKuBX|w?5K%~0#Mm(mV{Qbftg%=*Vp?{+^4-Sz-ytpcA0=p8~m)m*Shc{ArT$&}mBUCV{c!;LAq z_YRxIW?c^9haZeiN{hUGpS$Z1xVk4DT?|Oo>qz`R)XEFUn^3IckImh*E$i`F;Nbb*Li{mf9QOM;|i zi#+pB&BCoijb&xz5`)j|s*;gRMze#)%xoLPW!KI@PL;`i08Y1QsYR~Yrg7XqbWdZw za;{O`F_6I{`IMrQ)Z9@`hs7t&3nXGc@lC=-H%P)f6n zt?__+!U8lGpLA$42|OY&25P_|eslj^kRdQOqp(@#cn^AalGB5lgOSh`)tS~V=xBxY zw8B_0XJ_@oq`!f!F%8v}2~@mGEC#qQ@`6nL zBb1WQk+GP#ojNQwyHLx@Pkkpxr>|sVu)`>j-|H|@*@t;q>nS?LYA=}ctYXYl z8}U9$j)=oLJ%bm$SegQp;Au^aode;sY>WcUj4x##4pkAZLN@3K0s;kO>)5}L0Y6`s zatH_pMcPpm)bl`EpiLxf) z6Wo%(VwoXA6A8^y>y@*jcrTZPfUwkec1E(lyUPOjY@!g&>g#Me06uX1);YkeZT4(n&)AiH4QwMdY-7A< zVVeO3^fY4wlgo<2j1ICLAPsE#i>BV#4T(359-fnFJ)Da!M!;n(3_30vFyIN?Y9SlpZfAy- z1uXvFTv)fX={KEbG`X8%cp~{KbtM(P*dVZFOKBrZ{L*h+(wPTaKd@i(IAYX^37b^ zJ#Kw7l!ZGM5vRYJJ`z_hLtvvwS|rv{UGtHht39(e*dQ8yzSw^&N-V%&QdAur%a_Wa zn=Y&H(Ak!+uPs{#7y*m>fagwp*qMD93Xzy0q|jB_#j46llEpT08;x>qqfX7>nL{vR z9xBt^x^?H4+|fS=hZs;bBX1sSZ9ZG@_13vtIa|m?L)qKXkI;+cBFAGwzAXCB`=s|f5+-^-U!T7dg2!rJXJO~QB)IXC z*G69p(e{`@=0=6CdjX-1r)X(&oWPdhuUs!IZTK0*1@V1Yr?n|CW8Mi=JCJ>_W?MM% zp^8pDQSbAFbzH@6CVw1#cprLpcYLL21{&{#&lY2v0O}zQ*#ezeu!l3J*M1#{RpdzDq*RqPvgSkcDQF{@uz4p zy-u>9d7~qJA0uu=g=KFe@dbFuTBp)K)5)Qn#&2b`n98WAjLKL-t<}bxmNn;+Ne4t1 z;)C90q8Z84=Pza1d`Q8_ag|1AHm;B3Fp5Vqg^%k6J1ew7)&k(~J&K|)RDZ?c_l``O zVzBZ;u7hYi_d;Ix<>uhhGi*~0#EnhH;Cp&qM%wVK>7tgN!zZox*3?~dnAatEzu-G{ zo$c)H$bF2H{o-q_E6pk4frp6mI6gX){k=^aeT@cSd5KB*G+A580Wf1=89BI&Ncg3G-jmK`OW7F z2Z4Z6SkoJmrqYbrD*Mjr0t|rKi?Huij^nC>*@b5>KcrrfoYYkXavZ5QD~Z4Mos9*# z1snUWJYWurlC~An^vGV(Lx&{=xe>^a;FB>zXskguGFoI6CyD@UZAx?{>dOsC4ybQ?kxb0G}TXzjC& zq4t3j`E&0UkxPHrg6}B626x4k2a_U?kY-2t zLd{rsVa7tOb_xZ93n#hE{zRwVibcHg!1sB#q^m*g%ergS>Dh{ zaClt{b30Jalbx|W>u!H`mLVfaFod6Ci`)l5=I@ zHF;fkR0*=Oe!X?0vBFA_)M?B|QuJQ$5J5=ms>=9-B*|%hL>qgb9oQ5}2*RNfHk%^I z@R~?^U5bcv2GUy)Mk!4JmUo5wi)>zh76av?$eCK>jI#B~p0>x+8nW5!X7?-$!?R`qo&j~o zxJu`mtOx5_YB#yx#KbKDBf*JSrrxl}Yp6ldSoh|F-Q;Sc7Dgm!VB{+}mXd7}w2f?l zE_tsIw7@P?M-82%AJ^~4OxIotF5B0*m~jL zi6Pi)6|3g>%kdU&tJTfBQ<6>HbMPe`dkki*V>1rlJ-|o`Rwif zR(q<6TZ>DqNUH5Ha_{bQ!l3QmxpV3{I0g(+dXgyOkYC&Rr*+=FB>&c%GZLfp5yapQ zj}EIy(jLYzie&GItJLsp9}u3 zym2{o^{)^yLicy+wF$^Tv56Ar3!_{#3jdYNobkXctU$}T{v-3~Fxj|R0;jR3uQMJKHi+}1RWH3q^S z)1Lcvl5GXAvjD>e4}vTr8*ZN<2s91S@RyAn%$Tt{D2Aqp$3`R0N%1YcRS`vZX!L*w zkN1KCjI3g@n6uvlMWfPN^lQ%~08fp83Aan{Y+p(m56LDLm!-&aiAM@|>E^8UGjS84 zYwz`FZs>wETyun^!&T<6__>5EO6&FL;pA(3&kRX&2Eq9G62jF@f#S>#$2=`4cj_HH zcYkhkX|z2nMz<>w^JPbRcw~2Q6BbVX!F{)W8%UTG5t1ERz&tpV+3}Iq&u?on9TCNC zb^%-PmZ+bm#e}-Tvx8Ui_~~=`(VY+6B72e2ot%Z5DSUN?OuzQCe!hrWGVe8Bi7dso z&5kqCNF^3Np7ZkeWH>Nog;%_c1C}HqKwZ6s#w5WG9_i8;xKu~PdTmWrc4bfwzsn-! zB#OtZJ!Kny4OmxEq1Q^I#+|)wdH?-)eLX6X*YA%vJ+6Ys`qJ>7qUMN=rJX-Y^$umEMEMIXYiO%7R7fgpcqNIt-21E!u<^N70HD z;(AGmlISP`rkUYiXo6vBI(mZ>ZGP?WRh4Tz#MAlpDPm4r)>sp1UNK=KFaCv`syDp_ znGqVEUvSMH z=kINd&`6@nQtegzzLecm%S_ab*+Tlcd+_6&`G%=^+LURgi?NPC%m~ZIvml>O?jIRE zs^&}us2u~|1vS;X?9DG5v_-X9P~9~MyL0oJ{OKnjO4RlJ;`yO$C?o(z4Tj9VJUAka zy4u~6lr0pge&W}|`e88ANA}15R}u|Gk+fWa03~O)ws|DaUN=5;ONCx5(A)g%`DDr> zue~qzHJKU(?#Dv^=V(49g?m#o_OUAqBXDe%YX&)p*Gn2n^IoDPgXD8eTy`XR!xSJT zS$g~*;F+=rxlR^51&h+vA3MlPx;qvXBUU3k%D#fr(E_;t$pNAlNelYUOozx7D8U21DP*cL7pXAkpEJH_zum=_-(WMvX4 z+d^^7*6ZvIKQj7oWAS4QwmKbWL7&fX`{nm`Z6BT4|FM zi-}>jq()aR6Vs-hnBj;1eF&TrZ_gKNPVyM!UU9g!6h3+uoQH?eC|F@PHA!W8^)wAL zJ$*bo&^}2sHiikZZLSqh^@kL!H2l}}l#EiFY6AQ|HgMTMGqTV^^e&f}0}-ka=-LCp z5p}r_?%b5)+c%{-o~kjK$+8?X073RYQOC`B^q{hYly!BpWZK>m2(n6#wz`waMzqT= zpy7S+?1@nC(xxXu@+awqk#dYoyfy!db}M9|*5?5M$2lh-p24Z;?@lzhJa(2Npwlhg z&%?rcwyHs=AC;s)qQg8i4;%|zXS5;b8%uHsg!nSZBNo8V4DXag93V@DAN60iG4gL6wUdOK|>GA)JC z5m-l}DwR5q0i|`8oH+stxjyTGF#<8$C2&GuMP^`;MPMy=HhWT8M-z!Z1A`FTjwwn? zbQ8PA)MzRo*po%>n?cQQ$bbjefdITowhhn8Cnj23LPA-R0Ca#)Six8fzMa#?)-K-ZP%fLZjgniC|+E zv|d^ohwoXM5F!hQrFmX>TU&V62a<|g$w=Fn$eI_4CL27}MBlT5b0tXws7Rv$!+N6q zhdmO@jOe=?mCIk(N}6YYivpSf6-{*)<97u!) zDjO7*VPjTOJ)f~r7tfi~lS>Qyn#MK$1{j;5whaud4UD_`}BP2nPK<+8N&;XT(gnHMGS2| zhIN(B=Cl6o;m-jdC9NpT(B05lgW`JU|xP?ql6_nEVTwteD0!`W`kg57M|JJDRR2FygHrA z^MeyvG!_BJwXBDa1t;56(@j5s@9$<3=Evdd||;L>KqtswSe;wS;_nm5LEnAb(?nW zOxq>}d*K2z?9wC3rA{Lqlq4y93STtS-FQ};ATAqyZPZ%Wg~|yxHg@{=a~wEASvX;+ zAXL=4^JNXGuz4GWq1J4G#a9BF!n|?THURyNjWOD?=dNbPIPju8vQf;2?CQ= z2*lS9N=KGkC)U`#xboI|Z3{MazGxgCGc*M~C8o4v4aUsQYh%5VZIz0?89hm|J zD~99djs|9kA?5{)4mTbRgwSP8ET=?c19peD3@b3|gYu?7Yz!DLI2155ioC%RJLt}(qHQ6p6nXoGG~uVH`EcHI5^F=W2X;hl@+gJpdMP`)YVHSENv%uMSHmh})$4{L z%UlOpDKf5nmN-Nc3|7J%062r)?SV!xjbg3(1kntn_hT8oU>;31^WpPjdGPF|{PBA? z{T>Ntodj_LKsx=_mN*z2q>HKdD44=P;#xprgV+n4tNy$t6UNqi1-iPvtUz|FzY|LPSA32bj8phC z4;l9Guka3Hb7WSdLGMIp3)g#UsNi5q4YtmA_qHTH)?iG7pQ#xAb8>zx|LH&ejqF~# zF7JHs4n^-`um}+DYd~teKi?Qv|J`@)L7Wcn6xP<5jpT&+ATTc;T5{Idz$e^8uy%k9 zV1J#Qo@xPiPWIvyL==3m?*Fs1iDn))CYL$%Vm&NcvNc{bkIYsKwOM6t|0D63G_Wk(v~lzQOOXYf2YlGidk zTO%%cF9ySpsv!&C+uNIZo#%Q#6`tIHaHrbUdQM68@kV9vWNavDGf}7z2Nln8eS;K$ zSvCMMS;ETIKx`at>x78lqq@biHp=KX{C-1@3Qn5DbyS5pdD_%yqb&-D4MAwKT8O@m z_NpMfX7*XqJdf@{P^U&ua>+55X22QY(*VbOYncHomW<*ps5F?xltbH<$T7XXD6J8( z@pO#ZQh+q@83UnQdkC#(A0}vq1&af9qsD8nDbm4$4wYfsh>UEW$Iv%bvvytHki;mk zi*`aUT&GdED!}Qlr~X=V$0co=$8Im6T}$F)_`evX?}3V|QhLV@jA?Wkl(vF$zcyE* zGaMMD(%x0mP>hF&iYAOC>o_u)i1igKQn$edbA9^x*Yf8dzav}Q_B>z=*)1F6D$~Rz zJgh`kbJ2yuB%q7RAcdl=9B;3^H^X{l`UWpWN>;MzduzwH)!D$&#iaf!;=Kw@CKP1y z0FI6UYPE{SGK~~**9yU)DT`gs8s*zuXne2JCyT=CPo=|GWftYLF(auUo1D9)$gST` z){?x}2m7gLO^bq3JsS-T2?!mOQ)yjlMX%u5NI-)b9gR5^BQ^LpAi!%aW3(pCQj6qKYaTP1 zfm|T&0JwhAiG&V%?1^h~4N=;szCh0njxfA#Ew3zzHf9(LhzK(Deh|yrqBp&zLUt;C zr%2tJ=@RMXP4YMcc5Q!V17N=?td7YxHoJOr8V)IO_D*dQ_H{GM#0F%+fT?!bBx+Ew zp@{cD(UEWM{_pO#zEw9r=UO;0nNk zh-4LHhlt(Qwi?U{7BS$#VK#sfk+vGThfiL}p%!rOZ||~8Jw>|74|bb1vR?qS)Y92y zshF3Hi8YoR&}ryR{QmW|4qtDD z&!mp7Gz;w5~e1ANrpsT?1hoV@5IvVYyO9>(WD}ULkozuZ;vYXVNtucSqsR z_Tp{zjMxK2(zBhSYt7Y$NT8+$Z9l^Hdp3D5p+o6ZV(cxNRUGg{$)- zu;2tgx2e?BYph0rpq~3y+;*`UwU8nOu3l@SeQbsOBnj7UJTQleoy{9lNyr`l!rC(- zOK1wR-_C4X+jPMq4(mINCKtll0-UokU=+V#1CVD6`pG7>UVEg;u?ZTi7WCTilr;<$ zirPG3!~d8?FtV#S1rU-KssCbgb4Y_$d$&2ii{58R)w zrFWH4brWTe^gh3-!2h6WpKiix2H@Sp(PX5J-rM@(4Y{UZqfpZ-?s`A^4%8s3>`L6| zc1yJ1(Yg{b($uuxJn1QpUGz${lRrBeT{nGuTKwtLumDXVU}*O~qUcu0ojW&V@Z`j1 zD>Ra4et=qT;hp_c>+yc|#M@(eHDZ5uZu=wwS{({Je36 zU4x`rmowr0^#MlK{?bzF#GHypoG$%gH_}BcgLhx2VNkB61!KTzhhop(sEOW9ZG-P6 zP8ZlYR3t^VS|J@*W7&kMT~X3R`Abgo8BJuCP|Yww;r?w8l(rk;I((8Mow%=)EvOFO6LKa zCzWL%c>h8(UD&m1)N+YIVs0=7*YszsSD*oi= z^vCd1>%%a(1;xu2%}HP*FokPYjJ=(AVS}iO;2K>q7Y0-8-UL7`nyM9m&IY5qVyO>4!hyNcA0RlKJPRF8Ir0G&7l(&(q+21muXQYiZIF zfPN5oUB7W%UvX@mvjf9630v@4X{M?76rJYZJa{7WpS@3BdRA(c&LQT#$j{NHUKz8ciT=*EGY;87_ja;pIEmI7a=_3sg5tm-M&97s zD|`SUIkgm1l;8gKFJ)7MrduDsXHirYdY2nJBiMfy zVi_5u{HDoKG+%?BgxaD?!+|}TL>;I#$~*CUr=ZUCzM$!rbweoq>RO!D3Trl{%%f-i zc%KgovCPZi&6RbXpd;IpY^3CHGVvzWXnjWIK+<%|)+d&-R#O&hHIeR$$tDVxxps98 zmk{Cv&BQoLYb)k+>ON~VOR~=D^xuUA%_*2!JLm|5QOs@beZzVu;UQOdMz0e(#aoMb z*!+h*zO|+QIS5&KnDd3)KC)usP8Ky0o8VD zP29QI$}t*pV8bBDN3GYajKXfu-2yjjjOIPY->pYHlu38*YZAXL)o~NlL<(179+iS; zg)M|STBo*+oVAD^69^Xzfdx~6j$<} zi((~pwVn>Ef)-gyIW_!ruu$PeaN6?P(=@_iSF=5ARI4wJbgsSceRJsOhaK2Z7-2;S zC@xp1tVOvB*L>fRn%=gCBi^;aXe?6_*b1?cu|9~F3%{h!4Y}W5WSrF9e< zRWUM0#z92h7}&dNlW7Sislv5^ML%ECd7#b#$3a-Mvf)w4R%fRZU7uqrn+_bmsP_A@YViC4tp45eCaDi0&@os~OQ=o2FumT! zl-A5tZC>?~eI3);jC5|;in*TGiT?K#G8vx5oG;L6K9afq40MA{P*c~~iz|{MvFq<> zToNU}E?E6)(9?^8BkRNF>qk|2t&Zvqwq8<0++uDp5qeMXnJA*y%O*RB?>o%)6)sWZ z*+8_gv@eH6w4zPTo5rSsz#!%nVKx!eGLZR$qFW734Hs|_o0-|(*7nx>npmSd#nuN` zF$4BFB#r-_Vydp*VUQZ_=tDqD(J-ah9f`_0Mc&6HbQ#3Peu#n8eaq1b< z_0kMW%Oaq@XVkleF*@v!a_#h2SJdl^wfTLQjvyaaQ;#2*b?_}N)K)B)IU>zRziT+O zz0bD@a6Kpre84T6zibZqhG4J~#*Ev6MvkRGh7yq}FRUY8jC#%<6)yP! z6;cs()!vKG)iRT%K^2VXx>Ycr64apS+0!OmC`)z|{z&S7*u!|o-h?v+b#d)Q10KH%vA z8xR9)L*ncs_D8_Ea8KHxCuB!#f+I;F(0QEcJzO|-84l$f;(U#X_(3SL4P|~pFtRLDHmoiyEA_1Cw#<`e8g=xy4J(r&B1~GsQGhkM!3j zuWzC>JT0y5RBNRC3ubd5yYtLuv|)8Z*1OwIXV33^MhDuSGw(Yo{9np4jc}y3zp$`? zD3rN5Qli=SHU(4Ss=8_ZxS=@F3WZh6%?;d|f2_6GqCI*iYr=v+Ap!@q(l<@a9iLqW zU^kysy4>-bes7n@2VA$gMqy2h&T46GdKfz$7dFKVHJRWdY{3~Jj7+P}!dRN>J69~7 z6tA_|hK_7*>KkWHRK)MfB3VLz5H=1KE2wlM*LMqjEO)(QdOaQP{-fsz+Er$l$&$nl zMoVmpK7);P;|^HkcD%%SAjyrq_ojn|*%-jAA3r}(NMcFI1yUBQ8v!>3UR&B{F4cHF zKR%bIua4zxx-T2swz)WqpzY?t+jkksp$I8bk0#g{4A%}xuAK53;uPb;*hp@O%A#8@ z7M}F8n%;%gwG#kbcrmE~#KvJF%^I*H+uHPzQ2#(w-PjEFkzxha=9ZLNu*Ogs)FGBH z6vET%Y_x6%$w)AGFp~G|d?KflnH(u}vj8qNRA>nfV{4O!0z-QCc6ViGdxKrWV8Rft z?e)&!Sz(abTtDaZ<*7XU@{v6H?y(%aI*|zVg=#EEdJQj+kK|PA3oz^>{rLdT0<*vs zH~;#JZ{+>&K9=`C`OpI+gF2!|!tP0Z9h<}mvpJvY89Xv)@tg*-u>!ioRB3Jno*9A% zsQyB`ip|1>?b}+v7R`ZYTBx0)a2u=(o%vnxhE#QSbMGZt359#llC!XbWJ-6k83-m5 z4V83L7cfM`&K7{s-!i?u;0~svgFEz87P+gQYt`!*jql4OkZ8Ra4&O-Q0d92RL*HLs z=#LKbN$f#GV$d;K>jnXJKSx1aAC3BXP*#QppJp5omyKGx7!0kBSQ)pst63H17_6Z0 z*CZlI)gejnv|euumhQ+3JJY>J(uJ!tZ9C*3xkz}oXKJml7ecAtevlK17_#yPGnwG> zB-UTvoK{x{IB=+L6ekhs-2c(8tBVp~uDm(-4LNiv|%MiMXQ|F=L@~PJOZ^lzB&Y^MNu`?3PNy2T$9US15vpO z1N}jc7}qA!{qW4=4|~Mi1ePE>aP$w3PUPV5oIM}pb&t0s3FRd?0fq_P!-r>6bu_Q! z@c5csA8y$IE~iqbx`YM4DaN_vEWFOqFscgK>EYF7@xvRmT4(cR)!FR87@uW>l{&~V zv5)=j(ELJie0Nid?HySn2*KLc`p@{$fkH-ya`NPmsrieS2lDXwGkJb`Do5vy9IEj@ zhrUm#kQusnQ5e;=J5~d5^ZK5=^VVH?@9leXJH!7Qgp^= z8=Np9**UQX#|?5nV~L)f6dtge_LT)o*34{n@Us3a5AjGkDlE-pK!!21;}PuA!X=Yh z)^aPT-QrFa7DZ(-&4hY{#DYr!xJ#r|MxqI2$XkuQJe6g`RPVR~&c=Q1lpkC$v9X}j z_F$U@F>NGvWa$C--XJp}+-L8$KXf4+1zHtu&~0QPX_FGk@Mt*|#H4|f{*>g4HSZ0l z5rXwwBz%){#?+i&XdPtiO*~@MNDjU!3{EM0hHxG8l&dAV+b)_`A#$~Gi^lTvP`}?G z7Q5yj8$l{g8*MTM+OP?&^aW)@u!e*0H(vd*6>Gl{uc&rESrJM613Rayj&OyW>IHq) zBU7^Wba<+c9Ubg&5aJ3NWh$g4M$Uji!m&avUwr#WK6!gz_B3j`wYMS0E=H^UqxCt{g-eojcEwp$sW901O!3xejMc^% z9c>a&rNrPJ*BFB|%icThN^v}sZ@+pdQ?2tHzdDi^r)P2q=%#>h-45Zdi5k>Xg_cg6 z1!tweA#Q&6ME>CypUc~KuggFGvp<#(-o8$$3DyK*$aRgKtMhrP+1|I`K9*BxS}hFf ziE5nB)OjG3&j0bFNAmdbWBK66AGkp-nf7)xa5Ek>W-!jo zIID~j@Lr@I8NX+F@DrMYnVp$1Bqni!o(o610F;GhTm8`30ZZ17{XJLQH?KVi2@WXHs4f?3E7pShkxc|G8*o zOd^WG>abos4z3erMtNZMf!3uxkZ}}N51soQp}`;pDqd(_haW^3nFC%MP@hc*RRu~t zE!iRfh-o-R7UIt->Ee}^Wv`+jHJejInhJ;vvKVB0mcMgkELrjT+7(;IuD2+hNoqkQ z$^ooRHRec20ryUMRH^~%Lp>d~x=&`dU@cgaAm-;HQy3EtV(gNYM46s|PKXU~p2o-) zyipv4L=iHJun?_Og$+`#hKLwS6Zm40y!J|d;$T}b9Sqkq}C`eB>c$Q+(Ug@$h#5&u)il-Os#G|U-!l?UDSBhBHj)W^G zfvX_M?C_WRys+ElBtQ^ti zEYE^97yk494w3>$@BjomBD7ILt_IFyxQT%Y*6f5J0}fvytj(YOSgz?cJ@{AuT3$_R zg{*X6sWBhu`;qcvO>e0IxE6qq~|3UB3N3yF1by!$K<(a`e5kc}F>R~V678ch=(9^!*gJ*6{=7BPlQ zDK$MeG(8SVo6cDbEfQYNmXdmMNIF^6S=)o z)(=34>y9I-M3i(2W;`oz815I=gR_I|JvN3py7m>bgfhWr;;P;b9g7v5D;HsHYg2r# zdNlYfcLLN#&wooZu-HsByFk~s39MFwC7mbKx4U`s_${lIv#X15`SIPK{IX&^QjZ5TYLVzZ?cgN(}C za`IJKBsN33(AHTZw%dvKLAu@b<;_?Xc_u+RCyV5}+Cjw$cqz{E<~u|SD}__XOnrX2 zIL4k96FTy#Fp0FZ_srJgn*Q%PMP5D`i*_6mi*HgGcYMCosN zu{)>mW}sM`;BY<$7^Q(6pSN1aI7JVuKBob7iumic^w*^q^%Y`2o9IuuPnnJO!|Y63Jhnz z7LuTcG|;IR5n9yd5iBUVT3e6`1wnw$9^G@3)g+5lxA*1##!sc%s^sx+zL3MmN7BqN zu3${%Xaq{uF4D?G&to!QFld^n!9CL~1^*uEdVc!sK&G2BbqeaV)UdpqoM`RnSdJ!Y zfENbluoncXs|pzc8%K%J&z8p`nvvxU95pf<Qtf?FlsmBJ zfP3f~TXt)_mS#R*QY)Nkpha&Gw7w}qR!bWegzLt)oM{w(q=uu$`Y4U9hbeO#3RfQ} zBzG!9xv@Qx`Sh615W(DHY2C^;hv$+2$Debe*OqUXt()XXOZHjmQ0VtDAk(Pc*mm9J z>FA>b9Cqh3J(5kjY>(rbLi!thO+%<36f7(+)roWIL6QV8CjN|_!k!*L{&JCZ1{A5Z z5XOwgexx#Q8DG2U+oo$Q?!S!nnEsr2^q%BC(YOK$rg}6Rsw;6RDPblGCr+%zof2I# zxZGP?8|=6>p{7lHDycLWKS@}hbJtmVsC@kPNpypn7P<$ZGSU~4^tmJsIkjF1h^uNbm zco(N57G(FZ(a!K3%{(w1>PUXA|2;d}m5*=Tl%un`><)$;U?u)|c#jJ&<~heccbK!s z#_Jq!c)!Sc@%G2ii_DTfQ#xwTIGWgGW0=WuTxVujA|o0!r4DUJ({Xq=6xJYROLT*7 z4CU@mKbAZ1zOS{2i8SX+jDM$EX+5`jG1v=J-7A!LL2>yUa^({_K0Krr6lxbQPEOSj zPSL(4uhhA`n$6fBalWuF>%xa;aVCx4rwusBn7pa4S=|?G9@Kk%qkG9?Y(OV zi)5kE;Apce0_U<*40#l3^r)eau#`SkGxbnN{$21Xfkt##c!xPPLs>x4NK~_lmzsq( zAXui9#)z3YN@!2?7d7~qV{o!6#KKsR# zEo{YHx~5nLNibiL_wM?>#C0c@m4pO~t_G);Xxn#DR|++gc0sa6%h9n(j>*_o_)`w8 zLY+Iy5;`Z+^}6IQklYxV>M%(g?5ZQIWp3&7idd|^ukWNBF-Q?ylr&yDL11!cwi{7ps6WC>Y}Av zkPt?c#W9SPbL2zIl+0!$S=|7_TxF)HNnQgi^bSlPh(@(nd@x2uqUH*nL6Zzu*{Mw? zS%I=lE%>cB@EDq81-Bqq`3@!xO`jna{Q9~Anu+2S+3=_HTlt(m6C(Y0x+ZrTK{|Ra zGqt{AY(GmXE9nH@Rvl~}t=n41uw`DsB2|raPZwuG%{4f8i7rVL39;}z{QqzQi1UH{ zOGnVdHC{J-YU0c2f~V@(u<;AptTj5uit99tvMqx*dk-j!QiP>o9Oh5?E7Kd z`F9z5mmgN|v2^Sc^3z)z%)}WQr9oFnHDQ2Ba~YWPhz^HEX2?Sme5>8a0R~0%wK){T z{ZF5~)B^eonNewa&Pi)z0@1#s%er9XS?yex9fhNo3W*&b9?3*E+reZaM;gRFIG)SV zVygGgB3?AZ4cHW?0hl_ujk0o_+_GBEQUK#=da9A@P=0dlzTAE1Bi&CLGlsGtf8$les&@zbQ2y4h1aIThgsj&JwC-` zcN3Yd0z1ezcTgY)8e?M-kRck}+f5;Dd-kkE0*0y2-i}r8qmz`#kVfNV}#QIiZGuo(pKL!05vm%;z&X zSGc0eOaqhsh*q8V(X_aK1o1@DEP5Gw4BYz$@LOo6x}>Xja5 z>wIawKnU)!s21~`%QrHL>;6lgP?v_IB(8hw^@JihC2v^b`taiWWlNQKs29vEtLi`O zxbh%hmmlO$PtiWe{I`9ce}HA~AymUv*H zTs)%=smGPGB`MKftHGV9f&JCj4`e)eOK#uT0dmcI%goQO$p$s~6u^`vt_7a07ws~a zJ)M8=epljmmz7k4kLUKPqR70uLn1VgG^DLjkG@tIegwEzcF&l}#W z$6CMm{PS<+!FSK(Oa1%k=#UMuGc};+^Qkcd^}IF}ni@i}SpVF)enYkq1Zng+$B-wz zsn69*Ki44ZyOW8Ws*^gySY0q|k`W3GBe`K^m^ux9>rJc*jScm6I|?)W!*@^Rov)wC z{p;6ctXDbI==Rpzd%X9=(Z!@ja2-kb(^M6#cZY_m@vNsx&S6dolITUTxyy3T7sj-* zV6|Xv2!qy6&$Z5j{wUOBf)&2EHnyal9m-2}uJ7F5kv)exO$5_whpZ)p)wS$85T@Gd z&2J3Q#NZd)hSDjlm#+2%?Z!0Z$d2^}-UMx11{Ct1u-b?>#KI9?=z`l{Me2sWO zmdD+-F)RPJu~`i~dlYvDs3NRw<~9L`%dr-%-sF%M2sY3=^XKX{kJ2=L)L~fam!@;o zy$5AjXu%F-F$$>IIdKMvE^ttBM`IKxaq}0hg=5pJN~Zv)hB~kkC`S=20`gg6ev$;C z{3d8&{T!Gnc+u^ub@nK=|AV5Zos=`Uo>gCeRH@sQDf4TdV~m#@t@M2~*vs}xM#%q~ zhp#0ww#ggO09W!tp_p$TztSMPkoHn}y==<;zY0c~FHRKO|Mge0qd)n{yLaWe)=a9n zA!Dr}49Arlc9-RjhP!v3^<3){MnEh=di`%1$!6rPSXI zeY7xPDt8_Td^BLGi`omG2uM)313^LSb|*0QH5*>PefUKF;&1;>{>|U~t-L%&&%>q` zkk6@CWW%m%GL6nEtKDp&}?DTvV*~<9G_|NT}}RZF_IZ0 zYu*8?X+_Rhl%h_!y2)u+gWpiLHJdoqYd`(wi9G**{Tuo7pZ!d3Y-zE5rm)!G9Vnc& zAs>CLh5r3rit26Z_b$}AkpfCal>#8b?r|`+lmPVRpXIdQ2@7Fv-r& zNRC0TM?>c^prrTdbV*5)rCxZge+JQL_&@sKeHom;k`t}#T;D7>S+H?EF*f)56wP!H z)etL|SDrO;&1JmNWIf`=Cw=Kbs9pN2|MFucyGZj^VtXMj`@R~c*}X^=3}%Uy7wLmF z+Lcwy{_kBj9vU%N9)fyX^Haq=RW&k*IPWaa$^q3%h)<9*K0$$X*_n_o#t-sTQ-H$YyxU|9xYaxJ!YOmFiRE+ogEDLNJ(2Hv| z`i~zR2{P{QX^`OS+ndH20{WM_L*?%%m5*EhChvx3W?>gO)35FJgx z)HX)L`6fUNP#C5$(99BQx%1_cFj!4^D^mCr(e?@ZTv|E})H^&+(t0U~0ef<7Z%;ayjOkHl2hRpc{b1H>6!UuQ(5NocSTA5Vz0H>z>{eH_?~`CoBk5i> z4x8n!cmE7yQQ3DS!9@IOSvRg3CS+KZ!IUu=NTcqC?s~Xe)HyZ=WSIi8H~6@#c}CBC zm?e8galwlDeQNWb>GaFu+Kx@xcqqC|CQVbc`(t~e$lo6wTJH9uxJ|R+SY|vq)s;#j zOJ=IbKnk_>Ri~3_ zTU-=`Y;7jCYYa%tSy2CVmYvv40F!$LR%>E^mlv@vE{Gnq6l~Fl-gRf#BKBV2e~;H{ zST~TKbV-6G{Aik0;sDK(8oc>@Adg<1D+aFx*J3OX0!-2_t0x`}HVLiYcYyl?8Eehp zP@~Vk`|KO}t>bl68mw@Y&~b_ux>j?QF|Tp|G}{ z%IEV(a{bvkb-N&}|Brt3zWn$9^yl*4jj_ULLa7!wil~{VL6a@jT|qAfi-t2MBJ&f4 zXCres}Fl0-jmswewgGm=*vL0b^AX$mV=V-EL|2M^_w_io7E_J$1Gi9Pqw&pstX zM^rEfZPt{7ePCA9)N(=7$=)e>Z)8JXO5fZj24{Np`X`u_y|Lt2e2#{$B&U@Q6J+!z zxkdEmJI^zGT&*c62m=Yk+q>JPY-mlYuBTQj(ff^_+pS$8bcJ<+Xgvpc$wB$qhD0h^ zBgCY7PsU^r0Du65UpD>V*QO_?CE9Ni%nUMa<}OgA4YLjBWrbF3@T1Y5i=y$d;lYVP zruNIZJYd=S^;B4@OU@~d^ngeu2c<yhwR95M1O!B&L`a^GC?7t>l`mT$gmLwNmha}NC;#ykiI!-TnLz9Y(MNb<1_dJr> z?mM5pbM14r?Zo5<9hS;^gBGLZ4LNHRk^rX7ZsW_TEh#|dMxG4zo{QEGgVqAokYT`1Hvw-X#yLcPL1&hI{vxVYf$5WMS+U$ ziT?b#-oq0}lT)d;r4rDF-iMpJJDLTZ%JIQVdFT4b80CnpGjy4rbJwSpY~2qzQUhEP zSL}blMVqkl&ir?hS5L|W;fixEjSw)OOuI@=>x^T z$ej~Y>N@5O#yV5e%lgvI`4n7JOL~;Jm_IiE<0@y_KZoAY_7-x;JHh^YC8J33R?1VY z3(N0eKjO&$BI{$`Xt8@)%EN=XJbZDk7Vx~YWp8hr190%!rH`SFJzTe=-CoGc60RVOcU?Ts zg!9_`5(~>qXTOw;oZvKOXrL;`GSQ;$tH;mf<&he+({oZxA+K?8@X8bp^!=|6PvzT3 zPv}VM;f73)zLmfH&6mua@EMWwU^cj}S7t_s&V3;(AW=l`I(_XbPOIa9l|q&FpK2{|7No;@BDlv<@0^hZhQI zDWs;?Le&QSprhqPmcRN^_HU@;+WO~mcT0= ze3?V#VQnDK9nZoPg@B=ZBt`5~)f((^|{6ytj86G?|7baUGXM z*X1s;7a+-%!DT-a$y9AP?6z6iW5Is$ntj*3Fb$n+ec$&#+y3nz6D{5;d+@gnu`?DQ zp3#`YngRpR(FpY>Qv)B20-XnH3Jivl5=QI-AAT30Fs|D|y52*(aU93&(67`T3Sm+z ztE~stXc$*))|EXk!7|3^w$o-4#TDWKd-jMvS;>J(f+h%?x{g9KBV&x22T!1FbJ6!) zBQ%H{BHSYtZ4j8=qBFBllZ(XH00gric7ra+#>}b-|>L2+N-4ms8yTFFoW!~6$RO_BC*4`wJn|f22NKU~)P3@=q zNiQmT6u4~Ez{PF(_SuPi^<+xyokQSopS@OKHI8UlcCgObCYlIZ?NA-w^87@LqUs>F zxAql(AIo3-&8ISM=kljNephxh>;m7T(BEgt>*!3ZV9%?&rwL~0?QB3+rTBEg;D*!d zFOu+YWFiW$%+YN-Vol-rXd=&Fp2&d~@gF^Tt{KFa%r4&j;6pjnTEVlI2XdzH%3JsE z%b6B}U%on~MjHym$BQ$0IeW|=jKM%_8){I;8)J32)_~RpC?N+r0Bk^$zve`2k8ng! zAui%)v_=@W{k>hezPl?^yL-U+#lOsR?>#IIHlAW9Ta`*bKY$3zZwGe}e z>=m)e3%G51&)v_H&o`RWY`NBCMV~I!9c<5)u5)*B&N;8yMFZQleaE-=WQ;<-;l1~# z@9>Uu8rU)w`P2JS6SGaq#M%If0?!@&PGilw_jd=fxofms44liPAF-f-B9uM5Vxoyg z)Uj58f{ujjE-@I5&Z00U!z{ZhvZG8?XxafEp#Hi>N!A7>ba0)oxdbHxHiZo{nS2|J z2i}QkdpQB3>W1%;s!P?{+Gk6{(8fAnm{C)`#lMfK^*m{!u_5~?Qw_lleabpG+=XIb zF+aUNGpTWk;$=ta%8-4>@k0(eDM^aGE+d(4s1L895q=FW)b!|pWmR7OkfN)UwkG1( zE6=>~QIu5*LoM3*9fSkBBajkUjJM_BMJr!En#kdK6o?c|!R85-b%ncOWNpN=7%UtH zcGxjruBzx(q)lUsN1km&;hga$J!oF^vT6;MU!BC$@? z&^9yWu7UF^+-AB+u3M%%Nl_KOQM(E`oyu>&dnAAR51+|*PhL_X;ra8I>Nt+%o%eq% zU%#5m*AKo^C~8VwtD_gk>SSKY*~yt+--yr*#35^3*(TTfA>=V0%o*J70O3tG# z%%DLJ3W3!^jR_+12-y-XE0`!;3kg5WSBK=gnl654{1Khv{+p!KN#_rLus`S{)2@?ZbSyV6Y0Y@Yhu z!fH@;YahCV8V(>UP%%MCMpGpU#HVl^({s(P)KNeKDoDgcXLy6@eSHulhl*Dx8sw}Cd~%$^v&XKo^|H?($cW;ZxMP8>dUzi)o7 z;hNdrR>!do{Xa;`G!DBmBI9?rb?V9L)gHX2+aJAPGAO}oy}^5+x<<=>*7k=uLJIIm zA8y?lRwQ#2&XA2MjSNotb;42QAHfTScSN%h6hPr!kbzj;vvu{xic`g)d%~C}HG_$D zR3%NgVX5r&b<%c^ujx0?gX8eKtUI(4B8n>s1Q~BztI*+*;OgyInMut|_ zR8){mEg~IZ+9KP~{q0%6XuKiMHFB3mi^BTePk!=qx%JMEWuTkq#nFKl8c*fct!r}s z{yna>!f{)hiWWP_sy_q8fJ6ItFolDpzKhr%kcwp=2D!}UdOa@><=_9^FXeB3^SONX z@QEBN{Ia{fr_SRdP)$w|eW0H8}xBz0jEoDhCHw7$2=##yC@myXVT$4Zk_(OSrb}A3fPUN^f zRAi^&cbGbA)dw5-za}VP&92YLiIUe+|a!6l?ib9p+#B z-LEw>d`mM#i`^hbiq&Px*CrnV!vV%5&dr8(Mb3FSJYUKI3iENqd&OuN#x$6y9x|ly z2z?`G%t}UiuFTa7m+~Oqi-qrQ8kZ(nqoIhklOr|WLEEV;u0}1A ztFa6*u`3+`DHGwtlzd?}pt3RE(%l5n!$E?WoJm-)Qfk3D0;!(Oqb^?b`8Uo|v>@JS z)d)&BopJ5=Km2e!{*p&xXjmXSkpj6Myx<0)Ku#%pe?H>ysdx>hvWU}QD@r`H7`kR# z8S0RD*@o6K5RpLalS8TWM$YuY2QKf7+2XNq%+2<^OSzZMAvR4$V+%AkZ=j8rGlWJ9Cv`lRM}7m}0!TEb1@v#{Yv5+ySD_eO7Q1H@59W0`H=ye=EJ-<5~wwLE(K zNaD)}a_5>BtGD-MM`4kzIHVj3Xp6xyAA=^n*d6-m2%;I?9HayW>ZftOgF-k|6KzZV z?!eg>FHdXvAOENSApha-e<_c&mN3zC9qeC|XX+RZ>!C)&oATQyhcca<%kfm7mDXe0 zi59{&g2rcPSVSr;R1cs(#cfeUNlFAnX2?r-SW$xOFL`~+9UCD7{DBgKSflGupWBx1 z2S6FO?p>3+cemx*{Xdpn{k!;ge=mRY+b5hS|5ED|ErSGM@ftRvZjI{6EF(b)Fg-D4 z84f)p29U4Cwoh3{O|r3P3L5cTjs7ox^FTiT>ZSbb{*KlvW;8<6$*GY=+SYaL<{U)D zAPr)8`cX55We#USrtOeaUaSw^3m6tSTK#jVaM#}Z@5}YLC1HBNs5E5SY!~tOi@XMr zn;}XwH4-%3)T>OQoG~CMU7IuBe_j7b$cHI=uQDM!^$E`i9L}c5Y1{ZrA`=T7dYX}B zR#MOzQa3jVMp$2S+1$~3@ovQoj>T`US5U#bZZa&Ndzt)M+2?f-c#&UY&OAx6Csr0q z1zwa%gpt+*>EJgv>36M69tDM33=I&kW%B2Z3$lVKHY&2 zeDP(Kc~@($BHpUFEYxrjy)~NFZjONkLnv|1i@}CpaHhMyXJE1iEjDTxvBup#;(l$@4Y4%KA(7S$%sbBMH7REh<&blr)XC) z9j^Ph%RPueX5IHf5Hecz+~kdWtdf->HKDg<3X8yPIE}H|5Y?96jctme{@i^0UhG%! z{d#lZ-cPJwB)jY&5gYK7-og!C+~-dYtmB%ut?)V6MvYBV+fk||11$^;IuT#6ge@(y z#kCwwm-3%}^;;=Et<@==$|pB>W%6c5Pd(>vJBBtVoxghPdWZ zB11@UigENpYfA&p=#KTFv7YyiW)lzY@tRE z(3!$EM|0aq<%kXpTAnthG~~#TS=lHUa2LDo^&+OtY|kxiChz}eCM0gy5Nv^@USbwJ zXpGI0#nTTyxF;X{=pDKD-feUe%C&pjazhK)!~gOBC;#!&2bw?)Wv=-0DTXR}ixc(* z0x`%2C)t>Q-CDO94(e;_S&ho(r1THg8fyFv8TFw&JeqO?|OTra;%u6cFA5VE__CE9Q~gq78oA) zy2J5=nEwEDScasFwcsSYr=S9 zliW_3hjDv1H!Bun&d(QI9GjTk;n8)vnKsF)>D_S42H>U3BK^BCMamev@uI;2TsgD+bqC%z9CoUd zFd`6afy4@ROq1cLz$)rPu{o3wGKK$?G8$+58lX82U=jG4m|@nP+5#X;DT& z80&C4m%sb%m-1i#gV`{fM$ajiE+K?w+&O{W&r77(*+*G4IA7;zR*aP-VBY zg%V7Juq5-NaU87sP)3SWtxOkO8YN6(u32EAq;aRz_b+>yM=$kG@WExjkL6$g#ox*^EdP-CQ<|E7PwN-IX#aQF5LdJ-={AiBOB9TQO7I%{errO6mwjs;QRh zIEr>Do4VdVxP49jrl3mTZxWmjR$yjlaKlziNXtFbwpM3DS{N<-#$lrha zwLH=S{{nRwwdf;s@*~i4eW5xU^RQ$T=zRl)KbF=;$fifut(C-egp<(wujl$wgN48P z>~pz){ZHf;w5`;@%{9mZ#Tl6gB;(2e+VPT3a-lUlIFBhZl+dsDC8kc`{Pu0FC53vT z^(4(8HWGzeoS0Jd_Dl~#sU=SfwUN1|sGH`$=hv<6@%|cLVHf&ywh4sk+U1Qxup|=L zH3mnAu95;qTxn5qlfvKO*FaPNL!vn_CRrU8_X9IXvcxcy%QJ>RK zr0Mnh&;2HHpbNe~$tt%U8-omiwp(~M6WkmH3YxXQJ`b2`3?3?8OChDFX@Q2 zBAYIjfw3jJNG5pABj)#Z!|vM-wTm&s1M9F=QKWLM-Nytc6_*HeVKJcqirW3@`Bd@u zYZ_rHp8e`f4d0I4qhP6eQj5$ApVDoTtoa{8*UgHn04!M;{{38GkH6I7_44>Y<_9P8 zU;X$4*}ZvBPG_~;iY9@xn8S%|J4HENYV_;%??jNnNM2abUs76Os1b50|M1y2@|$lT z%0wMT9FK{=HiY|1HtBKwd%8cY3|dHX-w6Y^W!2h5wNPZ~lR~;eXqu8qC$2XH16Coc zRyeb1*_^A9N50W;Vj!~g>s#CM?%licr+@UJ{EL6~iM)OPhG0lX-7c5`M2ZsPyO;9g z58jd+nxTE9*~tfgvm<}?>96I%lVi~Yf!8sI97JPSd!#yRAp2#ajvBc-iHTx=0R0xy z4mXM3@3$5K8YGC;3!zc2OU%Vq5*Tyo{|2|ibajsAi=91VvM|Nm(g5X4Pt24}P z$5j?(?s3Tp8upty!|Qw3pV`xv4e1 zu{zsRYFbt5{3|pN);^I@@AH6?|4tHEJC`e+$C`u5h4v`DCek%1FF{>??=EvP7XoAt z+!84u6sr!*#_BqHR9OvNm!V}NxD^fM(qk^dvdE1FC`?h4;Euw)@Uk}UHU_}3Xw)uE zDR*EVyzxj9k($Xn+cF>PW~a(#(e>$;{hG&r#v>J?EW-Cb2`@h7e}7LZSg-VreE;AX z9AHK;<0vab3Dbj)7U`I}WoyPVpR6kg`4x{4F^p1eAghfilxC_MI0KKilT zdG7;_T1yt{A3sAk^s(&k@3D9enr!mL#f6~3KHGN*jTv&0=P!@sZ-4O{&Jq#MZ7({^q_^=`H>u&ESCm)7^Ux#na)A zZ0_%Jjh#=<6$&yK*vfhaFEC$Lqk5`_;mfBlg+CAU6#Pp_%fY+){wiT=TWC(QSl zHw;>k^-R>UoT=fX9v3C-8>?A~$(>+b*1`7ry?b|M=N!iRtXtx1&$T~s6VbXckPOj) z(S{?bsD%6``NH}djqX4kQoLeg^bM&0ApedI&8Hrk6j7VAxz0cnsIm;1$V^LZFAP52 z*#tAHVdH2wzQLGUoJuHO-{{E^z0n31`>q6;#gbqS zrl8PxUBqi1D7cl;x`I>ZG&c2A7uS*nZcE)1d9b;*n8XK&i#OMV?9em_&s1ZG%uHW6 zv|=!#3K~Sr30X{a(^{cywaYjfFFM=S*jsq5czu24=hhW2ZfuK-*S}_vk^wQHGn+}A z1l#cM6k%WG6w0c&?)>|lSHgYKo zgAIG<;7N+XORYyCrdhPTrP#aHB_4eFP_B>m)ZmWg0AX(LCYgAm7|l3zO_fPjKT!n} za$<2?;b}aY&Xx=;wks`IS6lLGZW&Y&cn!zSv1_4(pBOjkm(kB)-YA;3u^IDi{_}yU42{$hEC4%^0r9mO^jW_s4SQ z);=?c9d(GC8XQsIEiPO*t~GpEKR>i4de}fSOKXaVOc#qe>t=guuztEXl(#;9Uk>j~ z6PvnZ#dz@lft;ZOFZyk<1jvJfBRdZ-u>t!Bvo*Io4qCg%*5I z^@lZR!$G9i6P`ga?4PI4Ur2p>N1@9d8R(kA$OIUe%KH+M$e?5>I+E_sUJp0Y28S1N z8S#U~T{nV#K23i&R-QT}rdFcYid=++@@x!o0aZIC4Gx!{aoE~hCWY)35|7m@NQ%~l zH-qz-=-<;y#+$9p@X+;K4x*zqODzTHGb(HZug#N>tJnE`4kQE@i_8}!ePg!*fk`K) z6CD}qK4vB7$*;K@@{T^dG;-^f9bw!i2E%C7i~&)Qawk3~W!>9{ki{EM0w3d&bm1y{KBCE&dlsQ_qAhaG-mgNzb( zY|sK;**F|#`Y)>~<_e2yO?;3lyKU#S`_AR6qb~zxlF~_5qAzGWT7$iBkGDU0Ha7<}(U@5gT+KaywlTxNO= zU`{b3arhxYihj45Q9+Yyusu>ITWS!rlyRl!E;Dr!jbIw+j{bgIZ_n=LhFlv}vb!;q ztmn; z0jZx0iwKd0VgTA~$-U8N#0sViy2;yRA?L?)SZ~=tlc~NASpXz7bTLrv79$Qu^E0`w znb4k|-}OKGiF|%=BwxNd)|%y(EcCn%<7tLK6ZP3QfCdqoo#=Ud`SMIYeR8Px;I=IE zJL`pE{4*GR-TNo{ozG^CJe_D}B4aXby4chV7bQ9{z)AQ0`Qlu@`Q}@>^X`t`)8I5` zTh}Szg91V-j^k&TOiV(82Wu+^HLUIv9777InjTa7b?CW|Jj-6pn3k>vOO37G2R1J2 zpBwUG_rCrLM2JTOIt>@{tyCzdSGH<=K(GVaueUDY;->ti+80|Mc~oV$35y zDZ#Pw$jm9HR2q&3HLt_t6FEPdsFA>sq@~tB-j?zHU0GHgt?CfvKPk#Di`N<#uOzwU8jlBFrsZpqBXLA4D>vBBYkWYX06(dkGK|<+Gl99nd zU~^kV`ep_xJk3uGvshoUaGhboC@C1bYg(gbCi2mb-j&^3_vEY|$Y1^HOZoiMzmjc@ z)Rys|%I!OE>1sU}WAnA1sRpjMBKpkcI>?KIQ+e?486Cy|HI~}eT3?4OL1^i`F%P^s zJChCF_%}ua`J#ozmt!D_K}o&O|520Up{^*zj|~m z^Wj*wHZY?0oJ!brC-~lB{Q{B9D9?}1<-4Z`va61Geliir?a%c!6VP)ti#(pyER=&; zXDa*2IXig*m^W$aq6Kq>L5~lZ-NoI3!>7UL_>`^@Ar;hW>kJNsVj`cpBk>D5rvcSKET z*gCQgL`UfQ1ulyIrOi<=D5EfLwiS>J-=Ax`3rUmEG_KH?7HuR1h9*^{@l9iKOrNQ1 z>;`+apQ+*Ab>qTa-R}&b%`Aan*T65SOQJ@J;XsJmG3o#~V5+u`+*;oX~QJ)21&AO>Ql@9D9 zNV8ZtqePz-*g_*nRVWNps!@A!s_FgTe<}~Y`i;zvpUFS^qYva{S<06WpUB&x0^*|Q82-(Dm)-x~}5)Es0TXH1BMAy$$p@A2A?#C#`bLdkkHmKcep(JXwMujGQ zROFp|@5n8EhE?;@ss3FSo5mNU-hw1SL}{GTMNZ}FIwM{`o6R_`x?QdYEm-GG-CW2n z);HB^eL*B%5x_=iulRZFOj5#Y@Pi`yHQBv6KEkxrbG35{Z)%EbvhKB5ZAG$}0*NjT zr@aog!a)*;lX)6vlQKwy&BeM~lT}Ix0FKpwxs!^rUnWSpkTfzl9m8Q|uzZ`KYoi;R zeUsjOOnn|?PBqLth|Qrp9K>&pz>3BsNJhgz0ks80)mU6I4munLHS9M>j1CqWDQ%7_ z)UIoPJfgCUK_8vW?xF-5o_J~`Vdx>Pcm0s zWQ}DN%)INg5Hk?SXqOW~8F0kY@H58Y*mc$?-I2Sg)64KQ_fT*BI3)0ARL53ck z%EFw-=`xZ6i}PD7tuvUgDWotq_hd_P^WFVxvU~lO8ldZXU-s2`Y{^K^t--uO{mw5x z|Fw*_#&YZSP1)9S{mDCb<=5XnlV{((q5rLN*7fOPNVmsy3rj~{QmR3=v0Ge!7j3RSszpHy>EnqtsP6Z z)kY$!b3Isk;d}7lna;xojM#&v6i93HIH;*p8W=!tS$PemwQ+?A6h}i7vTK~eI~*8f zLcFX^5xhkl%s7H+4 z-IP_T`V?@lyj&DeG-#wMqqI(FBx ztN!27>q3a20g>qaoF1O2QGrHNp*4`PjCXG6&j<49SC3>lIg&eL6cm@Ty)~kYbt-y; z4S}ft=wvC+6{Cl!VG~9aFihidSCY%@JjFGpMD8g}^^bq{Bl+k5)kpHdyZ3EUA24Vw zXwIh^t*bMr_0QtvL~6zDA-^!y%orL^XQ#(>R5WnQ*84>a-ov>uL$4dZ*D=@7;LPi} zXCcv?F={2yLMybkvU9DHYx{eQrnk1XWmk*vJ3CvlwY{a;;0BA|!@&mk2b7O7nCblJ zl{|j_SdR35-FxSbT;G46RCTIKx zZFKO%N$X}mnw`rTlub$-0u_4?*c4!eeIqoj$UgPYvlq|gbUVu3ZC#74Rl-g4DUGi- zNeoWqizcR6kiKQmGimZy`VM1S)u~sacUhRDl0N@U2hO!?!mC9ZF@`{-XOD_ra2O>8 zys--=@`s2!16+@FmLDDBc~6*uY;OlPC8rt6nWT~)$nSDQo9mM#Qratm-E|3;H$D1L zaAsp&I0v&AESMv0#l73oS_hg1Lu-?;8g!cm6BV3lVQ5?lH#qAYT#1sIv`w@qB9e(4 zeT-pC<`!Sd>;Mzig41F}*0pMy){5{+irhv*uEI5@`)^UQxCbQT$Kk64TUc$Y_xYjw zCj7psFAkHpPRq6XmK|gvM2F{s>nNqDA@zdT zd9+#L-s+&HM-~0Gp;s6MwUrxFvFyR-P5JE0r}E(0ncTRgMoJCS>AaMaGt(*S4}UUB zWe2~tX&6|rULWwg$&!;!mIX~}98Vcc)}HsHFvb&_(8%Ri*8$3RHQtm%&0K%+DK1AH7tj=U|a->CdtxCUjgI(=WGoe_S^7UIcuFK7>r}E_R zNK*MRMdkfkAD^K<4LFAb&60M|KssY`U!Bs-khGhNge_3}v%`J@L60PAlhq z^zjXN(~`A2v(_m}XMI;}pJRAk>q3P|nuJWuC_clYSoz+tzMohA(`t`EUJef$*-?kO zxw)y&9-lvxC|*Z&LI>yQNZ|~}*67B4r3$J{lwR9)q^2xPLm|d4BP=e~C8(NQ7Fo`} zNVLjy+WtLkP$sXv=T!avbt~a-o^2_iyW#_lBsh z^5z%l#q(%2l3MEp&mSJium0ggZrdyv(p7rBCH`qzX#SB=&(SH z7YmwR+;EK+l+y=Oi{$9OVk)Mv7|@Hy3h|2TrJv*#6kM}ep@g;bwKvE zcI2I{fsE&`s36c(Ru>4~m3$F8bEh9;W-j*7knX?NkGPWG+VyxLy5b1z{%jBnEUVJU zBk-8;^ntG zt6(jPcf9_$|7#x}p%jH&Hc9ZxcQxHy<=0)WNk!w4HLrPH zL5B|bZmLG?SHGIbpMJ6<^}8R+zxwi-eEH~=yqej#;pl{c?2p}nSTxpY;aqv%dJZTE zQ{>VedD1=VY7)V-#c18Qx|VizfmGXj^7+HZ(i}XOw>3MMhHcF(hVtaQ&t<WRW_$7k%620PA%5yiEdi~kcd7aF$XL2FQMUEgJ|2Dcp|%G$EI;G3rxQTPRQ z*Tut&hLM;?lVvZ8#)2h_5nS4#G>1Z^1%>Cj_eQq@z5f=|DuP@-BTQs_sKM*?M%3ET zz`YR8pGW2fCj;WjXk$dEOHx!^qiQ~~ucjj=`)=JyhXkmU% z#%l?xuMJIEqi9ynT2k#bT)bZ-1hkzKg9B<@H?Mqy_JSO~`ulp`Fw&WyYYMLgx+AEW4!uKK9D;Go z7ykm5OZft^2)1ktu1Xn4x|lSZ!h%?jWP^1Lvoi!MpmgWq5RSxEXJM&k!cN;a>)A-> zaoMk8T!Xjl?>BVc@Pq$#t$-BWVpH@PSmkId8m%#+LoNkSiX9GE=ON}E&uS>|6V?R`)&De z{@Fic;rE-D$MOn=YRZD(nwEJT_3wMSzXo|WT0bb{`i)Ip!(&o!gOdR`T&iii05YvV zuV(&r(+>JGI7HOtMEPX71*!Q5B6#E45DR$DL zAruoAdX0$Uml%P79uUZfOt>en-`u0jk7c{Tq2mQRnD=$BZlGoqTFS00+Vy}w@Z4;_ zf{j&beMjU3lLHZG05+D^Dc;cyZAd0AC);e$^#E_8klM2sQSRT_kd1OfUq4&1Sh4qP z$iPAYJ$UURrj_SLxLDmYE5{}KZ>8Sl*+cp^o`3L}Ig}GOCDNqm0O%z#m=a8!Aa5I^ zz4UYTGYmnJYa`-X`7BQ%ucS(w(+K`BnY~4Gu5?JL zk*}UFS)e5JHrNH}t$&&B3~KTOZ`+O>h~-@PfH zK0cAZ`Rgb8EDPCGnBiCd8n2Y&DjpNyL!TA+ukmVC{{gu|1oFo1T`ERX(2ctDt;^G-d!5eLXQoTc{V@sB>)+Sf z#VZ}C&Fa5)&%H1zMp#G#k=P&>O}UrNgNOPobPQxibeOMuc@r-BW^5WYV=b`Q$w^< zb?9?-0EF{wf*ap;sdiiRj9RSzGa3)|yP~{!ejv|fDDS_$tB_+wCZ>T`fGSt(ejF-9 z7MAq%MJ!xOHJ~q#+Y*3w5t*pR9=*B1=hb?CmlxCmpaf6Q=y=CZRp(|TUX`6^`zDVX&9EmgAsxapXm zy{y{qM`WFq4t>pT^&#bgL*<$dLXLJFsPpvgBWoez&4z81tLCooc`xnrOCLktEZYo; zl5K_b4#ly^!VLz}*xYGL-%8FH;KVecA2F>PO8HusB{=Zqz$m>--2|l_ms~9i66g=pv^35pSLScf!;*k6yGvVLsND*nyDAL7?6<5>GNa1tb z^M@X3E_+dQB!P64&XzI``anMa=8>FeVRLVHOODhq%}zAdFZX5X4k58gqF2sSI*$H^ z3}tygL*J<6sbg!|NOyQNNcLS}^A0eaNxfB5n&9EF8n9n{@vRi|R*ugO<<9OMiQ^mc zTZPxY_~vVQd^Ax=CCM|GvrWr=Ju_oBJS8HQvbQ(V!ZaeirAFq?yld0d#g%goo>3Sz zS*#e|^BjFLf(2Dw1uVzA(K7Fx(Ma^@&Oa!|%+%s0iWX!rXaHPw4oQ+)8Z-&2vz*WD zZwza~n%~gOV(;1>4bP(1%w&#dyQG9kDI@lHY@^8$4y9hWgH1t;=MRL9ghg|(uAo?) zIQ^90P6gCUcA!PFz@}?9AmVDbwl-yFfZEN3vg2))L+>2W#eR*kw{9q8neTtEw)Vqf zzzatTxYAr9D8;5O@%8m`)sbqSMNwS&dWw@)$++9|w5*Es9WnM*qd@?&kEv{G?ae6g zyCz&gy`n?!WL zVv^vXps3eO7wE?3kW$(SGi~w)6q(Mn+}9KwBn2M3(L61pUbIQ3y-WX!(zWD0>O#7V zsb`RRuzHh4yX!+?i1w78cJ@0UsazR4#zgtUjqrbt!+;LcYYMJJi6b~fm|(m-=R|(^ zk$XFAnvQdy%?SjTpojB6Jko-zI`^Azjpgw-$1+qS_0j#?^4X(fLP0EhW&Fl6zGZC@ z{-CNd7oXXTM>grO%&f>+WZJkFn=b4Wt%I2#S^1ehQmdfD1R-RkhwQuc3H`+|+p z4p)9}I-ng`3@relok0Hulsf8q6^-cAk45s}Hk{kQS#zMA_nQP0s`MHc*1a~G7$kxN zj#L24t~9MO7R(U{ji47ah@|4prn->T$c;Cc$V;N$B07PLLqQz7&3kBuh^c|okvst{ zdf^I9f*dXdA+d8C(+H(g4w@=$wly`T3Y&RAGTH?QuJw*}OYKr0gQa`MsxSsXa9;hY zECErrD;5nW#Q8v)knrzI?;>t~ozJcRGD=qXXC-D0)6vof)-#H!s+@t))B?lwB6CBd zZL~bg^e=y;q0g8|P*@rUlozB88V;QM9<<21sW^EfXV0I>`x`<2&wu_i`EshYgr~2# z!8uX23(9kC1C9fZ0nQ>x=iAv^THHvY2_@e z=;+l3J^7K~4%~Y$YSTO>+twy#ms1q8XX)|p+C~zqhcsH>l`y78<6V#`H6W8qY=Wl# zsWCGg4Ta1)gqm=m#7`BzIy;@p$;p&bi+eY2$kz28HLgqIBt?z6G^N%;3OPlfRxM8&FgcGsGrIo z@7<7h?{3MK?m1*Vaj~$v0W#I1$u}4hMQ8ztg-zE4gN?T-#!NvUf+48)4|6hF$JJ{O zyat{H;CTXGw*bkE8*C1sb9^Awy*UC~*V15Q@<|!0a)<7BX6@c|_5$l@rm!mEGOzLA zXHDDmpiZKoc6iOhq$sU5!DN3b?u|n&o^L(V;`zoFo9`slVmiwqcb@l7#O{~Et$-$( zl|dSc>t;c;W;He=9_bo&iNcO`Y$L$&Y23YiX_lC0RN71&ciLr9WF0$uos+3h8--}D z7wsEoV=(ie&W<d4 zbF3d3NN~9UR8`2MC$^hoyx-$UpP`FZqt)5*q1@9t>rX$vFE{V($~V7$X0Sg+kR57B z@Cu=@fk7FuS!tqN{rs@7G0cL`zLD0XSy*lKt*f$~eyV8rF z>GNV-&ulDkz~&b3O{pmLUV7Hii+Xd`;Xi9FGD{goo@HLA{vPYafdX!V%32Gp4c=?T zyY3^i4#F1+M#SF`^#rPcz1tY;2abb{hP4JxQ~jQ4YkFXmVPDG0*-Tzd&g4vMA;YaL zxqkPy?B3Yd;4awvYcSUud2)0jPfq6QKn`V6jO9#!Hc}{QG@b}2Cal$=a&4zqQ(MU- zi+(KXH!2&qB0q2Z_qEXmX~d_`U&zM24JrtrW{DaD0t9BMK8gTGz0z9{FKvLQQxE<9 zZ2yy-OzDMd)?~avjw6fJAP7zrwz95&iXA8F3*d!xA)N}Z`;d7kz(6ZQD ztUTa9%#kRojt}=9cy1s{DX}{i8k6$!2OfLpkE8X1rE$IGceoQ*owY{x$H!7B#PH8Q zz9aYF+L7m{hjRGzW!DD~`o^N`m5C0!mBpLQfldzgvSWqr+m8?sR5%otroN?nf)ssV zMFY9C*JSN5X%o!PP(Y^D00^}eVxfqc>)z{P=C;!)>5V{-0#b2CS@t6PJu(MS(wDJE zLq_4-;HcOe=@-23Ao&f_`eCrJ7t~1Dle0h|tQh5i)`LEM@Jt@OIFVTx$+1FMCzB=jU%zsg9LIXU zQdoO7@k-vN1tO$@L-bVd({;`2cJ;n2PS0gHZQ+loJr*89DWDOk?LTn zQ-4J(49|;;xia{d7>Nf2Apzb+YY!`Ub5K!ncvEBHixsm&AWg7{wKrP@V%S`J!F+z@ z>g_CEBh?$49DD7lqls?S76JJ*JY#JIXHwKAiP5hi<0YlRQb~?_q0YS>`4>43=)bVKVzUyhhurs;N(KEZ;W{1SzLBkW8UB5EFr*Co4Q^; zxO-D>&$NyP*c*-o`%fX3@n9qdQpCKr(;A9-tV5UmB$7{tk1eUU)86*O2vEbk1Z@CS~e2J0qK+)2?XY<@yZPetSg@5$*iI z{yjcyWp}sM+SH~Oos;9}I_YI?J=^d4KV8%5bNj=4)7YL)sufq+hgE`27ci#l^rucZ zIW~pQQV}NvpcZPs=NQ_hGimryq?|Wo#;{iaQByR2%f_&!yaF~4r4&ek8}KGT{n99+ z!3|Sq7?%rEARTX%A}%eFxbrDDYh0-{cT%t1AY*djM>Z3t<%JRE!3(ijLh$Kje5`Wy z(aYIH-Vox7E-@_`!t1|34Ss@D2d)L8jP=51jI8u{r0ZFa5JHNWLdM*Gzr&+<@Wbn4 z`Q-g;vJ6w1p-`$=D7#-ZK$x&M!PPxm(<4gMz@qG~Z{<{jrN(V;VDil>tC3IaJC7?c z$po7a56AO^q`0$7aHQ`@a8dUOeb?I^mc42b{%j%-pT3aq9=woveIU25jhG1oJB9Ph zNC0R+m%o;O0O~uri@Gs~fPe?m8~EPQcqH?)g^N&1=U8$6b>IvW)O=8&#Qr^=o@+MK z7z4@06PF4{!D#>@#^9y1=|m1SD+K&>s%z`H);N%PfXaG$dMdjLH~#UpTQb_)mqK?d zy5w>Gr{@cKd~hnSmO;KcJeS8>D>+ff>KJoDv<}f0kY5>@?a24J!}%|+l1E_*$6ox!ewx@`@C(TmsVYhavr<={12O|5iVwfnHaqtQr1~9*+$zY5}R;$3mXJ0~WDY0(-CB`Dy z-qs@ca;BTkdO;G66z{Jbf3(!KmnO65ZhT~8BKS#)v1a(1XbYq&itfThI*ghupz=z{ zVkJed3Jgv<1LZB zaxAaT42rPhA|vUt^CT6}m5dwLcCr_GZ_w{?{xH^9f2knfWptgTwB|%O?2B)txW6ZR8+T-Ld*q~me(;d6ckjyp18~`}4+-kHNU-pIEZQy&HkmKM zLR@H}f3C(}9RX;yYPe_9nVf0HaH<>bNFB-yu#~}taKf-`020AbR5&UR#PnP37nKcGi2`KU9K)=6{sb1rAt&9Bi7Z2puk6uv5y>2Ux zMqTfJiLtk|qW4j(Eaf+UUKZu*-Ur^T!Qi>p(&p8++ydzYo$bM!C_Tz&7AS2F2y)i# zlJ1usZ0su&K_h0dQe=e-b;8i2A|xh-2RY$t_vg`cQuT)Ev4EhE*Y$;wmX6v=Yt4jp zsu$tky~1E-ixuiWqN7U4?KcHbH?(M??qGc z`_{jHn>NRVRYfnURc&M@0RFt1~zkr+IGtsBlZBn8BD(*UQP&1yB|D6UMI znu1_6;2ecgQiB<*@)&HRQ4-#3jXI`rWL~kb&a}4Z;!u}*h<-RrtvFWIbBso{A!Ic0|S@kejTSHC<`?7C)WD<;UXa)tR6(IAD~ zI26~NoSkvHdQD;FJt^}DmR($R;5yO4 z{^?iW$@1ix9DjUY_IEbq!|{De>`?5G>=fctWUJYJwJ5Ja?*wK~t6@0Mg7DW5U&_m) zbD60jp&IQeW^YX7;N+A8oX#ftJ2mc0&hyaV3$v~DJ}f{Cfq0?Myh$3yM$|3%Ok&tE zkvHP=cxH|6r9vHhCByxj5;u0_SpWOv)fpL%yVtJEOg3ab9?HS9$C|Au%(VbHWngT+ zU{WK&&3DR*6G$C>FNxP6*)?BWu}1rW0E_H4J`OBCQ2FoOydhgHG{?>*Y*i!}P~l-| z!{6q>Y07jCy>*#ZMv_2TTN8!XI=bcN8Hg(%G)Yi2K{{?E*LQAo^rP)%GGRrNtrKX? zNSVik26dHL(gf4HDv?N{Uk|S_NQTQeherQi%vw1+6$&Q;9t$pz z=zZ{#okv(T->dyhU65&A?wES7RJ{EM2Z~_oeA7s1V#6H8sAjZ%-4($bX z))WiLv`ZT`YQxQ~p0#?iVZ|9Z{802d*w^Yi2s)CSL~(g@c@7R{OPj4N&6&J?=cb%2 zhMEZ&S-z(5`6 zAeiWB;EcCgVYRWmqeb(b_E7J`jM+%*5;QiqqRB?4=wWEKRzj~ZySgr-JA%ZBO3sZW zhhnvEm>o#}{Rt89h#8p{ZJaAIV3Rc&rcdx_`W|xv?1>0g_sGzuv(QbUAUPyI&sID% z2q^~XZefmfh9*p@Ms7CIA2vfnE5x$76qKpJag!bSn@ZBsV`Q7A0f!p2k1YikBXrh@OWbkK_H)|u^c z0$!*N`EmFSkhLSEp)2VjcQVbe?y+0%oIPL%hq^bPDuGfF+5RgFM21VNqVzj=syc{DwJ)mN{`Ge zf(!B*XyJz*UI?{+_9Ij`80?&G2q(=n>kV6bGEqnP*`w#Osr9&9*VSR7r$FB@R2Z+Q zjH)Xx-2vtyRvT(ox9;7QTkjmp!KdHK{phnr5S;fmIkLB%RS2p(4u{0&c zB2zOP`dUD^u|W?P*ANU=6FV5Pzplx=leO$Qio@WYzFN2tS$F6{F0lIu+;qUk;8jVs zJwa*Bh4HkPM`c#W>+ZEFVi>GxdXe#x_XM|@4TER|Xp@tvoS%cT>$37i>|f|rF=6lA zE_p>l2%<4ii`3fbh5j=124StJbeL0M+klVHC?VKcoBd>fO$MARj-Yd$3|lk_hF}^n z;|(=3L*j}K>g2_Znnjhgn+E262w!1bXH{h{S-PXy)B+p1(W$xntqJreHRS!x-#01tBrwczw=m~8@b;n(3d-TQ{()<)vlwVXlz|%OvKqJ20tylQOs<xHtAeoMT`anWdW85U~u%|B$Wc%SW z{aKV{7|Dytv4jPFS1F8U&{q+1DqCI|dqTsI3w1bY{>OAT$A^Lq+>l>ySV1~L)ONq=~q|-^<}7qH3*k9-gF+b zCE0N2T0P&{8!E&<@Xxe(Uw)4;i%YC19G>h{ElRH|=lc-5e64T>74*vJ@M}Y7n7uTq zPp@Q+b3VhpYFXFD^;ec!Vch4Ex;3VAljOfsN@tD(GTziJ1k1|%G^SIqs7#NZE%iRM zgPXav0v9QME{e9fVcwp=0K9Bz7XzL>6nyy*_?@0o!`qdfg5!VDTm^9j8ZlyIMo&D8FUlLsrU;74-Wa!9~tc@TD_d8eI`x_C9E)bTPqn^qX@m{p=d5 zl935X4xx8k$rN)o3Zp8qF4CZp?WoWK?vqzCIG@X(|H+5)jYhW3(UJW8?R%W1@x^yX zQbQ4d^CAX}I9ZP-eVG5XfV-9dsu4|yrBz8gI{6NMZxZ>Jf01NCeC2G7%V2iw}1Vw@3QcI-3mPj4{hGc8iSA1>Wb znO(-L$g{S_2T;|fwA^AyT3eddrPkg+oML9b>=n#$q40#b(N(dY7A2g_qAJusNO22h z{4s`hHl5S38H^ZLSTZJzDAddvL)kK#aUE2pr;IH#jHWQ$5MI)*<%&BQyOcKeieHBB znbT<6)n=C}@t*T%^bB|H8udR!`{s2=D$KF+*5p19{+r%1%9_5w3iHF}m>6@3(k3uO z?s(qx+)&4{qJ2#)e!MZ%XlKs4*6z5LfAZ4}Io}Ax^7r&SKfJvo&o$ZwA8Dcw0y7;- zgw`C-*%)tJE`K7#NTWq69K-73iKRH(v1o+as*k)DAL%0^vg_oiB3+!{*J4?T9#qAS@&tR0kG(O zcBh7rXQxNAJBeD}B$=Xg)zK$*#@Gd9a8@zFdaeIl+)4Xu3kzr+XOq;e53>Yc#CkB1 zmw_a@{F@%6vs_}UTHhX4zDZRd>!W%jOa<8*f<<-2iTe9AiuMk|a3kYz!L4*lY0Ok3;6#8_rx3 zHc1&>bg{veA>+U2k-EJp;hj3+OW!rEiu!$l3GnjSuadq`@s>)-T#ESl<UBk-ozA0Z|&(P>z9-$yVg z`Rk(VLMOKG>&Vz!b}#VRO&_&r96~E32d+4$p+j8>nZZRMS|6~9w#k`iqE08#NSK(- zA%bur8R>ibY}W6eLv1mZvM$pj*@@Y`OFpyVvLP%CtSvgeH=J^6f(+xSrC!`3rQDyxv{YSzXCyhrkmCYs2 zU7Njrg_UBj!(1^p)TLi|;1c9Q*nb(sW08|(u^LM>DYrGQ$3(7a2x2)-eD9re*>&9lLEX~j9P>6qR}6K$(K zbBaDoAc-y}2@1QbKx|HZ~PV`9&;i3XjPoWZbUVSB09 zjv%knx&gQ#i*j4OJ($TawZ^km%;e*PbNOU}*AL`uI+Jg|eZdZIHB<8UUw^8eIo}4XF~n2!Wd~y=ts_ChNeJ$K+hZXyzgN+9hg1B< z*HKyn`Tmt4{0OEpE|!bjXC?VF%(mFx%hoj4is*XUCbOq- zfW$*}fHF8$S0VM;((4*&jBBF$JM_x6T2ave*InBlC$;dI6a6YU!V* z>DvnaFYU4f>xr|yS9&9I%mb-{ON#K>OW}=<`kh1pKP2e`ak=-H=xd%;_{TOO2O}$sweD49-P7c)5$6v0bwva>~$Z(bbB^mHb>RV}~#?uFd_ z=Bey#oykA^@|W`WzxaFk=%bHi>&7kl;^nD4c=lXA`s5}9h@GvGY-^40d>%z&()o$K zrzH+28RRk?cGtx9V2A=P37q5R5mr^c>3fip&)<=3+LF|Jff2KCe2n! zs7QZpr8)u)N4vT{`$=GDG<>c2I?pou{`;yJa>&$X)yOq4gfwh^_3A|Gy@~{yTK}5_ z-RRFF7~QkH!vn2&|mMi%}vrIUcR^c z!C@bs75{8o`ps(NG>iC#Ixw&mq2uV(a$~-)tA{xbeCK>&1GEUu)-8PlM@Y2p%zLRV zCkb*kacdDw;_`AX0e7fPi{ou#Eums_3!*+SL{LPZDPE2X8CIr^LaB8u3{ZSEN*r;L z+{`qtSpBcErc|$T=zly52#E^kQQIX)V1)VoH=moV>U~eNT8E|T-RrpUTzDdMl;?3dccyqwp++Q(%MHe*pt8c;y`4wl=t@c z<=c~qOljyxVo;T&Qi3sF^2oNe?@0kPBDiKLE4o%uzR&$#amrov)%xNGylNwFt32_} zoQ}g}VveYjIq^WFutGZIbj}wu!l|WR=TS407rIgY({H|%v$Ki(_OoBh;o*_I^Rqvd zXHTBVXJ3CqjC}#+1T~Z!+dEPXwLpw&dTcZGJM^MNqknrO=*v0<04ugK8T??)S(CGK z`R(Ul@!U_*v95ob#JUHGp>-i|{{Z$VwQ@mSAzlAaVWqaXx_4>)NS{-tXJ?;AxgAjW zZzy{3Pk#KN+*+Q=?BREEa&Rm=H;0ULhjh@E5iC&92i*O-jgpQKR>k<%>L2Fz8%a|` zskw(hVNlTqaoCam3@C_|YrFb^$4jsI>fp9KUbqjYk=6+~8j&USHbu8fz4yK57E|Z1 zut2;QIb!c0bPi?6v&7SZzyj2Bt|uo@{E!371kB9Q$ohuxZYVyW)-lkv z1Sx#5X+vTAtV&1s!=E+y&+`PaT1kHlq)>CfeeGDC%mbMLg$H=DdL=dyHIqa zn>P!2<}L6_OfL%y8vtc&q?)NJFTCjB5#ol!f@#^6YM(K>aGn{>{_|Vc#$tx!+F3DP z{?Lr6A%+*`_lBI3v$?Uhp)a1lT=43<*Z0`qsUzQa;(*lP3p-EDopg?*5kCx^Y7eK7XhX4?3fV zl0_3e0!1WQDumLw^nG%$!SP*6IXLWO(OOA%PwXj#+I3sTNHt~Gl}gva>tZHh^8b}L zBDOA#&?Sp8*F7NA$jOSK6UEY6Bwn(q_Y_#O`V#-RvRPJx!FCm zXzuCrXMEjwJkq^5%?0F=k}ZXI__jU6xB5}WI;)%o)?4p+tw>kf3t<)F@in=AV7+gk zH)1}OO?|`1@4YQEh5L%xf!L(J!121=sayvacWf4z^vp1(C0L$&t+Son}71*hw?Yi&a?nJ zlR+4gZrMWL%#oiWcDZ5jO_3t!{<$RS?UaE<`@&UcCow;VERpSymEEh5XFjxy)|Q4n z176ilF-+~gVg=3CX{A|iJtPKG1`5om4NSPuxc5#&9&gH{=O=P{c4ApcGn7#~RH*7$ zj!x%P<~^S;0YJ**CokmT<7X7uqq~Sny1Edu{0!jTSlArt#z`Ep_Y8AKvj05Y z&l&51755~st6o|&S}41Wu15mtuL}k?4jZ>?_kMjz6umK~cw^l(tC>o)K#cR!<5IqP z@Qr-9`L4WmV@KlYxfIPTXIEwu(ntA&NFQ^Fs&!feUH?+dL2A>c`5PgxkHVY#Dj)V% z_5zQ>p|LhA-^NV8Pt@tYLNfxNRR5$KS#z3QU8SS{viGb_5*=%eg)!aFZse`$beW_i z703~!I}|PsjTr;83yS*B;*$8*zAC1AqpUnn%l7TO6MW1dyew7%SWnRWUnT2=Aw$0v zgCm^R))oR7@^syH*GvS0*RP1t;KSh%FcOw*sWN!YubZ1&c=XQM=F8|~4D11ym2Dmq zT?>Y92cxAmtx_62P3(wA*UanN6wG?`-0O_;6md7Bn>S`W9BzQh$)%A_p zulPBL-mx-amItLd#bg&&P!9J9{oEiS2K^V)`K>+sJ{)R&G?%Z@PD9TeBkZ|I%Jy0^ zt2ll-EETS@5(JvO4JIqu3&P9;>u6)Np?L6uc-Ek_#cHWnWC}Xg4?sbi%_H+A3+uQw z3Wc#>12+o~6)K`o{T%qFF}}ap3AMt-U&jR-&Cm>mdc|})=dBtl6edN2SFCt%a}zAm zkd<4R5RBI5B>Ro%8?c0j^JaNuQ*yLwuqj=BlhbE<&Dyb-OPy#3ZN7tu;Za5sb^a_qx^^idgK*oNBut z`Yd+TTm1Z^oAT|e=W;F1`0BeY30^%@P zH^0Tc90u_AwQF)y;lQI;hw|jvg4EllHM8I5=+B|Qy3Gy}Q1Q7!#AAh%jgqU5emK(7 z)WlY42m<8y}HkhbFzsGbr%?O-!$JJJK02ho-zb!sS~S!-rz5`hRfP%p$7QfXgC&*oLJS zalOCCN78mTA!RPDHTz-Qu9Gfu4@n9ng3;RB*f_+SvN(sI5)SFl$ec!WZLX@PXn`3Q z17>YYSA|Y?oe-`5-`3Wcl;%c*0;`<}1Lt2s|rjj1WsyxNB>BQ(rz~ zmXR)~EG(+P0v(S{Z>m8{S7kHJEhRN*fi=P2+Q^YxhN)6Vd$FQpZ`n-C0$b-qnha?q zaL6(yp|RrUgl>2ZQ^OALGB$@t5_xgNRlDESAMEG&o6%7(ayRCgI})5DQa3=@Dj-NLZjVwxyAm=ogfAY?z+&JIS2>Thwzn+|H z-C|=GLx%m`jYC$E-rJg?0z2v$sfe+px@N0DHdf>H2;#(T(@mADteX}8h7*CP9@6`& zbm2?Kwo{bX`1-L-$DS`XZHgiXypO##5Ir)_8h9SnVXagKjd2tC;G~&CcDTNBq?s|O z=#0pW(mi=@(-$-3;L*4lOe@SMBbIcIZr`{rKl|VVxv{$^#~T}>K#x3p@q%M!8+5|6 zKg6>S>JOD!8xPksMq!@mqc9^+gNbY(MCmhdQt;FN4_tfY_dorXHO9&&*~P{n{&R8Lre%j=NyLQ21h4tv6QOMd z(g{i!(}OeK7iJ!$v-v2;VPU*^Frr}Whl4I!Cj0@;^U_*y$3ufZmYF7LY^9}UColx4 zcT6>1Z+$V70a6t?zp@A4N@^cX{~be>yGf~~4`xE>7GN@`$*8bp9?XlC%@lJ)-am|? zbrJ|5z1y`(bQ{A9AERRcyW4(l?Vot^B&KDXoKuQlk+Z zKf3-S2(?jR< zIe;kP)-gM!R9i_!)UaZf*5JbEbX~EHQUqBwz9JdB?;dtF0u1u@=#vH!c_Mq`b*t zvO~cm^LFJPrTx@(oO@B3&8~X>npK}2pUBp&dosLnO@^~$yvrcbEW~Gxo4CKVvzAya zb~-YH(muX~hy5tAaO3L^#n03X{nhv19%B%bwnxA$8dPKMjI}*P&$IjYq;|y%32C%M z+riV9TBFs>W%VdLpsRhXZ?|Vt133Ec8h0Xas}wi&=H%L^LSoP#Y&kenc)zLY`U2(6 zgr@{c1{mQhd|%6F)%o&btnd0G)6U5!9qIeUi$YC&0SuUmptM# zGV>_Pu4rlo-KCS;=*4*Z)w+~HhNOyO<=!#s_eQ{eG(w1^T{7~@g)OA6cpa`oIz`$P ztiGw^;LCfFT# z+^Mucx=$BVa6R$BfG!WO4D! z$*9Sgd5Q|tf6JRc*aXL=Z*q)2WjqPS6E`Gy9TLm^-CcSA-M3^@4ZyzM)9GR=PY)rb zK4pNF>r;3`d+~JAo@CC)>7MNhS)h-3$KLXwe3pqYI zmKQIE^1;qXhV4)@-6=E0nzth4j2#hd;oK8GOOJTji&U0Zo-5vu`cv?8?J^Xh5-*`+ zpIe@erb)dG763NhZ$vhyGqw_wtoCdRuyITpRz;CVYIj+0x?h$lG2@Lk1TEDm3s?ST zUHEm*!_rgxe>xA$ttrI10y4DGD`HzSGy=oM=goA__lGRp{(Vi&&OMH3^el>jgk@Z# zYAmOULX1Wu-fsj93(5{TlT<%rW6M;tX+BKQt|ac<7LJ9v@#n(?E*%XYB~=Z4cRXOu z;xKG8_{|xx_}38cHat@^l+s1wQ0VkcHX8cOY9u1gS!QI1b72XfAzlZElnS19Q+pex z|GZ+?h*UZjX!Ahq`wH)zth_t2qY8SOr++VJ3tkImM$?GZjSoU;9cJnoqWsN#XYtd+GY#uDt!$9ho1#lqqOVm3U3j<}5y`HULUOXZv(Ek;jjp$hAA0a%aODe^WHh zh;~h2F`X@$X0f2^Kztjzv7=Wic9{p509%SdQJY?k&`eJf@Y1#Iv3}`{O;sq| zZETKZa(>R}qy}TaBa=c;Y@ok~lUXk3E@|PBSSdawFVZPkhpa^j*kE)#rFCec5vlM_ z&X7lqt`@>q?%W!5z`gJM`1kXCP7X;y|n&%uRO3K4Ze*lI&b};HbETtAtxg0 zejI7`^!AN=vN1oDlan*KR*Yn8SP;TCBWp$3B=pFT%=JpD(iDpUOOZhtF2aoK_kHd0 zt=uDXlF?wM*sYoMH+Itl4W5S~PR)Le)Y)$I?~|>kAZeyhy1y|LmqO9KI5K~~37iHe zAOstdrO$G2r_wc{wsPS50bb;4SL2yp!CW$&&a#0MM$)nD6CT1^;OU=98;vr8_r!qn z1?Uvz31oTGI%%faXQXQIe5Q5L^T-kyehuLXvK?o(&zN~&cs*_`m{z4X2XZEd7^}n# zPLVGPHxi>}t1zI4GN4)JN-pp_Ee&{+46 z9Ll=>7R2h)hfdIuyM|VQ;3a(hT%2IN>!E z-UKW@n+Thx=rW9Sl+FO8N&#$Q;j_zQA-%KB-x=4|KFJJiLO$3{OBisZ5&Pb?E!I1V z(i93T3tx4V=`$pwEk=)RFwrkN0Ef5w&+xVPuI**GW^=jS+Vn;fhuqlQlqu4T2xtv< zcuvYQbk9)RKA%H2N_a!7l;$lPObax&Rq2(%#v3%ymqA9s9P>Cf#Of8bNYO>Z=)Odi z9+1gm87WIL7<$(@KC7thHErvWLd%)vt=|AVq$>6|hFL=h+ZCY}pHi^0c=|^wTIEQX zHzrC~dF+hudJ|MS3Xd!}@&Fz^r@?6kvj3?2$b`b>O;QvgW0!G_Jt0?|e~PxULg!US zuo{nb;ji|tr17167QM-6D;=obKxAFG78v|5#Qj;bElHLhhAsDqJ)ZH-nK#GEtgNiD ztGlbZ8bG&5iWC6|5-5T)$z(E<$z);!4>UcrA)I$4K7*!|l8TO7H;og)SA(|2O>nmZtm|+0wgj zRkF}u(oMzZjYfi$^LXX_8um=FJ24|P^!$_I`T9T*G0tO^BWN_LI=wid>GKD)cRZu{ z`hu#Y{U9z!5M=c^zBy{0MrHYd?B~cyaU8WfieUu`$MDGnP_*zxARfYk{U^L1UR{o zvWCOs2^}A!!~veZ)6uM@!OpTO`+q2E)0wo*5NB?A)NI zCw2f3cxcP;M5pToO=nZNwnoNYp)F~kCETVYbqYe&#ea~{#wN4g=)j7KB!`!WQ>`i= zPZfWLj=$(&aR|O$ZN(6yUIWr5*aSwR80kqsod9j80%BD?)|QJQm_gC%bmb5yv3h-j z7#S9mb>NAB_tjSN-}VeCU9~=L$uLlTpE^Us=%up4i-GOf32{4{72c{bRDDPsEwZ7| zGb42K(z=e}#y?z4L(KfDP~EW4Gz?z{5L?^k2j3SI6`q}MM#CHIUuTO}a8{BqN!4&Y z;Rw%zC-xpaq3h!(bcl&v;R&Fd1aE?zOao@xCKO3JN2Ro-F9@bSYH zR{c7~$Vr{YME;I>ip49zYf!4K41;Ypnj7iwy{r{*8E@p>@CuJ$f;Fp3b`NB#&3akG z-VXlU98SW|tyTJZVVRIWNEiI+`8jR)GwaEeqrIu{=iyZ4wx{le1YO{*pWk3x)LnV6 z5FcMBfCQ`Wp-!pOn1gj?&3Xh5F5#$MC&mmp?L>O=7yTWgx)rbYIY0Aj2ZwZV_6bK% z8~X6$`}E{sO~-Xd6Znr$;bvsUm~X1N#>wiSiYclNPRQ5S+9ntZwv+-s(W|0M5<|*%|AhSf}h;gb{X>64KD{>NDyc;8q~kP7TLV zqFZ-Hw08ii^afjcKmIwq>*F!h`FJNky>~N?p`*)1$Ne>A*p~_iK{h8C+^te`N#&rx zVqI^v@e?+4B+0vNl6t-AWUBe*PWLyo6Gw0$dv&ejRr^I_QPxo>F)Yvl>NBEt|B}TD z@i9wfNOE(+20<*7HUI(~vd{0COp!O)NJtA@O^V}c?Q1RHXL@e$DT?tA1>K~;`f#x$ zk(Fp9=_BnkQ)duGpg&V|$S^-&Y%=if>8DS5YsTmk{dpa^t|IOJez;)bj#gIxZ76a< znk$f;5|M4hkk@bNAf3@yo}19W`>Pdw|M8Tbymv}V5-pirb-SBD-aVYf5=}1M53k!O zU)Nu^=?Lw>2ukO*9wio)?Dp;NYN(Aq?5$6IXkkkwO#Iq z(%HC+!LaDD3jMfhQ=?xT=G`5u;0(y1*gA^+uqWK%+-DtTbbfL{ob9I%-hWKfIf-L& z1ZL*$dCVX_tv`+wuX%o<(;{L&Mumd5*Yym%>rcIpChtwEx5u$P>eUw(YT{8-rl3_H?Gt6_aD;t-d)oLZzN4Z1kg*cUv+p=H*5S@ zvT~T;xZ219qVYs-u0C z{w~RTu?GenEpHoK-kbKTMmyfM7@6G2ELnB0RxrxCe|++U9z1wNNBhs~v*Ga`PbZY& zJL+Kx2n;&(S;|{vG0!SygWO6V^+voxFMbQ=IlDLOavzxm)j#$toDcg`)Xtt*kDwJF z&iAQd7-Re7KD~L14aojY+Ahwd4oF@ptUSYkW%CMJ z|Kmn2SMl#g0QO_tF$A6saoTU+Z=QPMh>eRU@YQK_-8Gfk!RfWqTOng{EMhNDB6C*I z3PljG$JHV=oapdcO*d}M+2G>bfULISEK9_jiv5E6igU00cXsI0oYEn|!uPV2&zBq$ zbEL~0Eoi4%QLc++1cY{i0RG3G@ z4m<7JAyuTNo09L=CQFtAw+WPr4ZJ*ZhcVnoa9*>rC-M*%p1DgGD~lp!6-sB1R2FqO zw4I&mo#CVaF2MShzq(oi}ZNe$a6D7HSHb(H|#_h+EH>to?p@H_q(7BzY{G~lyX?hA=7534#*FY6|ouyM6#t<>Ek2kb;rc3{maE^ zn_Js#GrXId6xnA9->6c$?vv9e^zh+BdhO*qCW8?aPbP!OsBfYr@0EOpQJ`%M67sA?DtgW@O(K~l+qd`>C!Fvi52XwavtkLQ&th8d^Oron%K~apMBgUy2CE?gdyl7 z-Zl2dE1Gc9H*MVMv%B&h?Zw>3;WSyNcbAgyjYNNHB$|Tx1bCe6nd>=IPIL=f$`j>X zZ~aARWXEX>_PbVkTeyRZ=!c=X)mHYWW~&rkX&X^{3uUhZ>x#4Wu(vmnlE}rI#o6DG zL!JvQH`4L75ko?FA1BF!?z6HMY#t2DYCcjOxokO6ODyayf!CC#t#r)7@6OLUj zyU!3!N&~$6mpLS%)U?_26G#HoKD3)`hXs@6A>M4K-bP*&DGlWYh@OE}{`noT8b%@M zQ{jyu3u%+q9I`fai$m>O2Z`QYEzo09JdZ?Is{~io)e(<-liA5bgdmN8h65>-T&J9N z-JfBgu8GsmJY)6rbl;AR_H@8AQPGtsno0zV@Zh(HZAI)~y;W z9~pGsY?I|qnkIYh+eVd4uVzh!T}*{^iFUtM<)nGD>!@Dfl}*A=ZHv$$03YaQn#NL)jadak-Uyu zW3uIdX2c()bcuf3wO)yy$nzlbdzbSFeJf_2)XE0b!oH1ab5$g4rJJ{A3|CcBAEB+i zl%nksmtNwo)A-9Bo)Z!(`a4--~8PgFp9Drfa6lA_PmxZngycI)NBYktLnlbPWU{EHUG+$h- z#H$MuJR})xV2%jUM8>=th`#nWjRCB*onq^}e^0Ol%86Jtti9*$j2L;H(k$ptbEs$B zNzV$h%2Kio1oT#)yt!R0DK!`0)}xws>k8Z}kssrq@k-ylcDXS7zPOCGFnXVPHx?*o z#8~Z&jt_aUHH>ldGe2)pI5bkl$8MPS@H~QCMqW_%v2n=hcjnOUYEjQ;bR{hJr#@0g zPVE$Ds8u7<#mfbC+E}P(QvJe*Io-g>fBLg`Xw3`s%c$H9k0K^y)1^VU3$l;Joi#8uvBRI5UXrz?_B?Rle)~p+(Mc2GQZNuGA=H zq7MzB!*U)f+pmw<^Z1b(Ue~QGa9uDdvn73Pma7j0Efj|;nqVqWx3U)#1rlqo&%;~vh zxY%{Mc7QtVt*sQelMefl6 zhz$(6iUtzSA+tmD^D#L^(xVE4u^SwrugKn@=u33YM)cl0@6h3FpI+OW(D_GC=-k8L zkOnn1l0PsgK{g0mT++bE7$_Rmsb{~7>j%4c=iGY}9)}OgP0r;^Fb5smZ`#J9V)rnI zjs$MkJ$d)q^%~oOQC0SoZ`RSOmzC=1a^O1tdLJGkWfqgc7x;F^XWzDIAp^8uYa zK9T#ob^Eq@zsQwrbuK7O)!0Ji&um@hqc^sGIDJ@++YWuT5ABp@nnBgRmLV9FOXPxi zj_p^{F)oodYOBIpT1vn6{B0VajcLZo|0ib`^r+s_oD=93daQ`~h$^)&u5_?S#7sw- zf5QBaVW$Ny<>xP>y<-OzI?lI5-Z@k@`bwcE$lH|E^xcQ<5wc zPBdKic}?%$!jAF61=S&DB1Ol0?1=NxVCIP`Iw!xS(2vhIt;ZHkC`2XwJ+|8BI}~F) z8mqIPy2{joRf!iQswwBL*Cvrt36w=rZh`BU$U|UQgfPPVATa=2R3MJ)+*%e1LYy4p zSeUcYdm!~pgqjyJnxtdVf{itawQBOaqG8ZMqhdms`7MU3%lNE5@|1D9JQ)T9?2&-J zT8nt>;|2wF-7qm$KD0)wOqGSR^T3LY@o8bRT&wIEdZE=M`0bMB6)$f9yT_m&#B&#N z;*LHIn{b1Al>;ixlz=CX)8)DaK_>faGSeo8TYACc|EqJlvDeZ|Jgz4vjYzUnVMI$> zEeHRCTs+R+p?D6S2{Q#|HIci^AoUzdu3w>9y^{FgS z%)!yL7DLuHJx~9tIinO<%d1$V;@8ph=!UgEUZ>=1%Ll9XpgS|>=4^@9+kzmA*`AN- z0G`nX^6X?C%H z`**YL6z-~07RZz**%du&{DDyUJSi_4|C8oT%1`P47K=T~9Y5;&y&y+f5wIiV$^+fF zJ)%2zrnGl}zb(|kF6L*r6mhp#Z7q3Rvd&wjDi8VdlPY+GuCo>gb+X}TvQDU@x%NC3`4u0x<~&Vg?saM>uNr^1L)k%&4(YjH>t z)@`7Ui<||#Arw1dg9Tm()m8q2XQCbs2Bnq6m(X~}Rw&h`UoPzbB@TQ}Q(%{M=)G*E zw_Y|n`Zx7Nc0=Z0_6UWyNA%flzJ&6yQHdd=z9G$@=J3g{wC9~ovWV3B@Ha@V3pG7^ z?TWs9_n1yUjP%z1wNN*6lNnb-mVcvtP8>Q1R~?BAHnQB3OSe~+Q2z`=Cdt=kn~S<~ zZoncJPc)a5<=~AReu2Zq4poVEh_z_4)L4Uw3PU!u1pQ*)+H76C?e7DIU-7dxBbQG| zL`A`>kOa0}??)#yM!V4_S+tY70m=}K2#_tWJKsBzjB1)`)X~}e*=!Q$G}Oon|AN0R zmP@Jq*ox9Mn?C;gtm>q82y;&~3Ds&)?Irv8oVwDZC)bx=|`=wlH zyBn=iD2d9&tZ>EfbupJEhr&D6L{k3%i`N^B)ftH^7U6itr;`=36`%98=wk=9k~gb2 zqm|>`R+(#7RGt@1ko-)rF)1c|ac*fx=@&#X(|Dz#)Hv|s%>;vIq@E}WBw6v#*Z1di z_r@OGI$6>F=>gk|j;y?l!kA{?a+VyDr@7oMh_BkC*u=kziw94LUJ5uk#ld<}Q z3?Q3K5(n&OKYd%Gxzn>Jba42t7UM#Rwo};(9MW^z3|^>W;f>pT?6e>;8PiJ)?=$RS zrp1!!S2Y%unPPPL8vXo@MrVMXd05B%oNq8peZ=c|@!&qy`?u-U=Q#pd@Rre?OC3O6 zj$=r@0Zlz^yu2Qto6340uE{+9R#)Z8a{rTb!R)-Q#h|#(Yp_bz*bdt&gglMBz}JsB zkmN6-@Z|k9tiC2B$&a8tYyUEj)my2R*xM(%aigN^H%7ES$7a6~uiguy!_cS5=Wz(t z8FhKw0_8VkXwmb)WDxFdR2FD34i4#KUxsS}h)V)eUN^`^H?okmZ<5GEHQJ?fyVZUr zWYzb09hNZ!NLx;}tB4k0EB=MZJSSy>fZB!8z`_UqCwZh0gl8`pXVNdgSE6VN^+#Zd zwPUQB_|}IUY~WgX;9RY@rny+isWCA zIvVQx7c@$XR;b7(TXK1Zq{br|XPtMz`TUsfPVdtGM<4Rf=j4+0?kGuRvpgmwfc>{L z7#|Pqqg8o3b<(M~?kK2MmDVr>$MnNx#*;4``6SGp)}=v$X%SThU+9AKpUVwmm~*0? zYYu}z)t_CNVi>?`gZHbU1Vay6ZJ=AD&1T!)Tui;{ob#Z9Ol%V9w7U zjl$|wb;tOj0D%qdO3586H|xG0L1CMCWre?X+3V!`Yo0Sl9Bu6L^LY7apW>5y)Ue^3 z-#no4KIcDZk6*UX-q!}@?9OlB2unxNF6f!jhPI#8R>4)7G^9W&7w>8W227>vp3NTY zTH9kTp$cIKrtbd|txKf#+K^PZem)H&SnRFrh|~T-q?@-YIyxTF-W+VFM&Tf8vZ1pT ze96{(jghvrcsfj-b1iN6R5T)&0KiEw2w75);yAUWc`cJ9O6W|9eZP@Crj_}rUDI&? zsCPq34pRq2k1lClm8c_|6WjOmP$MK4uwg?nt-X(OCE0m+Q!-&|oy;TY&k-{gtY@@| ztj|Wi(`wlE|PMdam84_b~S{DSneLs#RMk z6Fr&N9r8W(uP&#`KrB&qjUEPRi=NzZaGhSrRzDNU*geX&y-nx1y?HQTS6HMXtcui` zx@sjxL*S4tCg7Nsyh%J-kLZuy{)m=MpckIMOYgt`p|Y_g>!+%)(I#y>7{8b`t%Oa} zb@|b|H}4z1&jVnpQZrx+om6cV{4vdZOh9owp;j`77o%u6wysMk9)PyY^Go zkR3k%TdASZ+=TkK_+KN}y~lZsGltl(VX{X_cdsAQ^z@XToA1%V>=vyben_ivOGigj zkt9jfGttWDIEbQYcMa{j7FQg_!gDF2s}84hS21SormKz=9Lb1=MA*h3dv@UN(HJCX zB~Yqx(KXu6I4KJgmo=XTI_B}Xc5OySHyTcq^FE0@5y%A5#zGR0;Zttex}F+IBqvh+ zUR|c%9HOUBc%nXNF~{8^LO^3+%3^(?nIAqzh%5@7h*XQVYS6-LA%1wR7LxKHi%3fj zGy~kq`6XeF(7KMwR+5|tk!cYbB@azPrel6ko#-Dyg*VnoKfF>V530Z=T8N?dq%HIk zZ4YsL+Z-7$;pz=p~r4rW?4Mi0-BN*vP8oKAkl775+1&6l+;H-S3kMpJ%#rq zJm^Fjs?fQ*dkzivf<6iLh|9mmVIg3NtA^IS8f#=l_SrjdisGC-6q7N=XB-2aEQ@fw z*^<^a_~LX)YK&JD?_$G-V-pT(RbQv?z1z|cKY2|5>fKZN^?&=nOV?;jzyE*#f2tY) zlA{$FyrZEp<#^<>@g3Y%2>G5GYf0V zw*wVihQs8U6`vVx5nZ|g`8iPuWILuG1)3cz9!}biW?_Yo*pyCr^GC}Ag%6{MjZWt? zZAaj6RNF_NLUgbUJg#X1hFQ{zdzDowFU;YnVlLYw5lL?8<()KFVsioK8uQmRzJ~SU zG1+90{^SRHoc}t#Pj{X>;EiQWlWs-Zi;d9q5uF4N3r*42wgO6E< zE){OuRp+7%F(s4yC|{f#AUPG-HP%wfl=j{8k3?mn%@y~Gwj{|5ix4jy4n|%8QC+`2 zk;r2*gQKK^hp`&gC@I0C%ZnmJ*T^fzF3)i{P?Yz{&Wc$x3(?kxk}`V&g`D2{gUEeX zRvXc_LT19bMV(-qq&uLf^b%@Nq7vnz<~nc!ZF{cs&WpXPq}^pTX(2^|CSzP+#$ZkX zla9cuH|va*;&mfa-bJ|6nEnn73F-;(0fJ?#h`o=B4WWfo$!aO;s;?Za)B5=+D{N^(NIxiiLKR zE~4JUEqgS<)6Bdw!)5Vcm7GvSAFUQwRRs>d8-?t8pQ8S026r$?b9m&}m+zE6n<1kx zqXk=pkJg9u)`LX<**|%oKE6owm;T+qM*p4v{{N8v`FFoZdy+qBrDyuaH(~ScB88mr zzT^=Xo3ebSW7?GxKDE!eIslIU4&NS%`*VX{W&b&UrYSym((p)gbh`;iad5)bdP&Y= z3c)uedr$G-Jc!uLpw8B?%R@50x$al#TVA-sw=7>+^MaZJErXAEPB|oYC z+*(ZM_bn1M(P`XQP3&OCT>mVQ4+Vj_+!(e&DYlS?2kdyAox?3Vg=dYjgQ~RV=wpx4 zN1xD$Jq2JVoxtsY*ks5B#lc3muCHy-PHR1P521LSLXqJ$zV&Va<*A zCYP(Q%ZOJ*5_v2u%f~@o01i{r7Eg1?n9~hY^>JOK((eHX|9C=ljg7{wTXPyuk>iC_ z%~qfx3dtGE#RVuNTp7G9hFt1sE_WdG9muP~r3R!if`#QewCFFGq?5)$(R1kA+LFqe+;L`)EQ-FA^3q(7F${3qtUZ&X6TP89 z<=dar5z3+~&nvVoJyRy#y!@#62lceutNbNz(7HpMeOcW}PGx;_LN zD5~Z_CA(xHH_!3^wwNX3BQ_j+bbm9V?|i(W|KblnraykPp<8!eqHq27ze%sW{1W}} zt+!~x&=T@&%g!1!iFf86(9S{##ePFwayH;W6& zEsbl<9aIHO< zI_&+O84fr^vD0GAD5+p+!Fqf=p&K{%7zTnC-da5NpnBz(q6r*r)7tv({?zPA0Xe#4 zY%|=0Gh5ric<3JEEYgvbULYbyv%V@$q!Qlu2HkVjY4R_5j3%`&q$O#Ctc{_B@h7lV zqD%PzH2+Z1uvRoquz*0nok+Jq;9a#X%-%|(z(^<^hS_%E(=qy7r3PB?mM&SAi-j?s!`o_)whRQp3pIZSnadT9tg^R@dzkb(THZ-VzSqD|bR z2b(F~>kjCj{Nw@s{qNqVpPU5RjIPtKed$-|i(mT^Zy={suNU;iyLah>vom`8Ue=y=X=ig@RA>J(5FC z{&Uwu4ng|7|6=)&LE<>Z{9N&SFs{I~!X`eQPIW_+ji8pKdA`;nKjwN?zt}Mp2h7eH zsQ_sMO}S1ZYerZI%=$TRl6MZKbi&uPz>E2M=KO5W`0uN8-u(8G7MW7WY$!RW)kzf} zedW=ZLayqVJ-s8MC-WPt@=qCd9*Sw^P0}1q`V3>FFsbGd>sa-XeBtoP|B`)&oYYp~ zxx-`VR88pGjT!HQ70)+@`YSveL>yZpuMoeCZyH3|s0e5J(>cLHezDI0D~e=~t_9YR zkuz2vE~Ss~F#jSg7aI}NT&$Lo-`K3xFhD*^P@$mgR>0RkY;A>+%B z&f?}>UiD`=eA4;?@t*O!pQFj{XP>{M5_@h%;S?IItBhQs8BAisQSZ}(?mC?ve4hUC zAACfA?_WKlcUJrKnDZN>$&{Xd{WZG#${m_4>g$Ieq?x=jhk&{s#TCx4uu`dFzL? zW>=&}&vy~SY>2LiK9c{NpP>oPF{IRmkg@*8H=)vJ3^w4c^>_Be z`#sl|AMqaJyJIWkz9S3273mMV#?E`tR8r9{g;JX>xsYVZR`L__M=pSbZqbq!C->=FU%E?Y z*Esrkyr4Os=Wu^Yw_ZM?$@)A$*3JkP+s;&9EAM0P0(^31JWQDdW*H@XS}Lc|JtF6iD*{YgG`!qY?~@~L6Zb{(hU%i z%4dk^KlM-|At@9@loLU}OiS9vn&$NV7>Wm#Y;)<7C6e?g`yvcQ@t(D5d#I-n*JnKx z!&F+ce2%DKb{V$$vp#mwgcOk&XU}qcOzqLv=y7_L{`tH2=V_Q zltw(3^NuF_BUw;?;WxiYOCHy^e*P{y66n_*#iNl0T=uUwyet;E3|BkPQ9|50@UnN9!CR(QU&#gn@D=VI;Loy+~ns;klqNsl1A8Zc!T-x#UdK zc#m&o(8Q-KAQj{5>AO|D`gPt&3kD8}^pdXahvWq`QKv8k)-|a-3lv}P&TD#=p{tYA zC9O_RX>)!?H_*TesDedCPH3r124mY_UpW?#5lOYukE1z*>J)Un^2E*o6=rBpAzuY% zCu%E#dB=nH3!#8^6FoILOFQ>}6~n4376<-m8nm70XwLKh_;|!oM=dm5^dt*V5>DDy zyY1GwDc7^yM(KDdQEWAMokyPeT8)7y^kRC7Zkg4@k*R=F=tVNK%!^E4P11W%c7Arj zW2^Z%5@E=#B+ly*=R80y=kcDiV}qt;XBP{TVAqd9y<01D#d&5ruHt5k=cmA#dR>y= z7)dpuTFXu)rIDl&m`yP^;F8#U0l{?LmVDFrEFt7ohgfCD2|HD`6s$CT_D$Ij7bUzB z0t)KkC=;oekTDig0P!5#UIdFyAq$JZ& zrwLEEQQAP{*jrfSPY#y<((u__7IG$?lO}3wy3}TzJ2R|g9Xw@2$Z{IpC7>V_KYNxWR_a8eft!#Ew!L8}HtP_F zn{gRIscJkNIIWfFrB`~H^WA8=cDZ~Lu@p##=+ZrP#klpSxIB=9`G3W9@_dxly{TR_ zPrjq0nyy_NOT;nTgOontD@c2&xS_JD3|8~}z&cP6}jaK5(PebPuEUE4m(U$qD$ zWlF8LO%_c#s*HwSt_15vlC(&8y|jopsZprvkv!8iKkwS~%GPXYK#V|svo{=3iw&*2 zrNCC=J@E(5rW2}x617{Jjwix$S}j*9loo@8HfbCf^HZuW=!jDC)!F2g>s5MhPBfNq z4+cEyzkQXfd#W~^hW~3m%PgsE6t=(^-c;&0N!`|NSdkLWCYz=oqSJh!2f z$EUPdu&2#)t{`C>vJH1EeE6CGm?gO;#iBzqdTx45O z+G(Au_amXJB=BKKYk16@L`FsU#wwm=^NCf)yuH4|>9~=c9TnvLQ6I33`J~o57UVt> zmFfZN;R$`#Afw6z@x0lSEaW<5Jl*?jxNcWU-PKTHP#l_EYQ0m>S&BkCFOrN|u@|yG z`pi0$U1{X=eX|s46msaG9T==iqM=64Rgdc7MA|;t0ibYvY6wgKH8voHe}dO)?3|+Tl&7{#hac(fuY=P z+YEoJbg${1rr;k8XkPZ$&RCixG9t4v3jP8e9B`y@ zZN&eM2)&SEWiskvD+zSpujIdmy7Y!MT=G_Y+-$lJ{u~n(&?5#xV+XSuiz{5ik;AXSYA}x~&L3oZ(csd;`ezxvt$>5k&(UNh-ZSyPh z7=ytJyXIfH({j_HH8)egl-h`y)7hZ(k&HeBeR#g{s6!hrg?K&QxN|{1iOTcj_w@IX zERWF`KU^f)1N96Vq9TAxg_jxgS16J?DV6WKf>M~1cl6XlG@*8)A)SogOMs-s#>p*yatIhUd`t zXlq?;o`A2WY|w6V9^#1qK1P3wW=#kD{9oFOG(!%U9mfe{HR72T4o$A934KC)*Ng6H z?jR~ z4Wi{kQrXo3`8xsCwrakOuWu+o#=v-Z1=ZQTHbwwPN%QYeg4~q zasA`Fx7ld;Mz+UL#*z)iJM=IA<#*`jzw=F+?^kr~)#vH>!;d)ec0#}P&9BopzxpNm z;UE4Bn#EK4=!6q;oJ@9^dW6aS@aBxx@NRq~w#X~SUJ@JLruXuOSMJdV92{rr4bCMM zxY`jej%uauTGu(D&gP4WdE?Q@Cdqu40<1w}pm@pXRXGaoa*I%l+FTVLQ zU27M#{rTH;R4r+;Ii;5m13j5UnygNF7F4{MENDQb3&ZQtZ`6Q1?b=6HU*UbpL9)U4 zwWffez{TbICBTNt)Vh4m5a`mHhx0TRs9SRfUVy8hi_f*KARD0GP9~h!+pFpNjT!Cl z*K9;Mmle@}L)1Zu201+1G5l5olH#+yzJE=J5=pc|zLQ=aV+n#0y=_Iasufmj3*oh- zI$hFk86%G7jX~D_Ic%*Xh{l3&tmhKz^1m*|jWmQg3&sPhL0%DIVTwFnAr;rD%?>Ja?-1iP?E_X zoB*PMyvT~gaJc74{j>4pbRQZ}-y*xex+|`AxKBpY=S!{cM#T&56j#SJzJDbuH>;F9 z$_v(iU13)#z&0k9GS&>Tf@;WQB8mKkkQBxyF2JY~B2$!G5E=5+iq4hS;N|f~f_gle zY9lAXW%QvS!7>_YB1I`%NvqBUC*CSO%_Q6}RY`^-tW909Xon&1rGfGH#lF!^XUQmN zG;O7ckcFhi*H$(bW%x`ILmtlC`@M4ARWc>96#9vtuO;+-xK+-g?{OVX3kUfX?_1%) zNGd{1(cHJMWE)n7urltMNPBvhU(fb9eSF+FiL$V5eyHx1ehGr*2GZ8kywR-r&lj8{ zIt_I3U`uBYH+1oYU4bot+}y>7AdyLytfHh^~QE1sd;WK@*-pFI=0@{us^1mfDJeKK=0C z;=cAgS2ehH%NJH=R1tklCf3)*pkf&V+cP9OtSS-{R!&V;t_or4~dWdldup}~wKsO&{ zpv9b!lLr%r@P>bWG}YJqxm`zBx17$>%&DQ6f$DkJZil4syA^rV- z@c-j{$LsX@&mGZhR@0lWvynM@Ofxp-cW&RL^y7C#y5#PyTXc#dq>a)0l5d?)^UnJ5 z!UkGbeGhTpICfcYyTk~xMIcT=9kPEq56qnh9z>C{#1Vt&CLhn@VJPRDIJ*DffCkzOo

    rx}wGCgV=zj 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 -
    +
    + + + +
    +

    Major Technologies

    +
    +
    + +

    Blockchain

    +

    + Pulsepal utililizes blockchain technology specifically web5 to + ensure the immutability of user data stored making it a breeze + to safely store medical data/records. +

    +
    +
    + +

    A.I

    +

    + Pulsepal uses articial intelligence to aid users with similiar + medical conditions find matches who can relate with them and + also find doctors/specialist within there regions on such + condition. +

    +
    +
    + +

    React

    +

    + Pulsepal employes react a frontend framework to power our + frontend along with typescript enabling better user experience + and smoother and faster development,updates and feature roll + outs giving quality product delivery. +

    +
    +
    +
    + + + +
    +
    +
    +

    + "Our Culture" +

    +

    + A culture where innovation and empathy converge to create + impactful solutions. Team members are driven by a shared + commitment to improving healthcare outcomes through cutting-edge + technology. +

    +
    +
    + + + +
    +

    Testimonials

    +
    +
    +
    +
    + +

    Dave

    +
    +
    +

    + Pulsepal has being awesome so far making it a breeze + to keep track of my medical history coupled with guidance + have made staying healthy so much more accessible. The + user-friendly interface and helpful home remedies{" "} + keep me on prepared for emergency breakouts.{" "} + Thank you +

    +
    +
    +
    +
    + +

    Greg

    +
    +
    +

    + Knowing that blockchain is being used and it's + immutaility makes feel safer from losing such vital records + and there + chat functionality is quite great feel's nice to know + others with the same condition as me.Great job +

    +
    +
    +
    +
    +
    + +

    Nikki

    +
    +
    +

    + Using it for quite a while now and it had being nice + especially a beta feature,i heard it can find out what + is wrong with your just from your + finger print it is cool can't wait for the roll + out,talk about a.i in action +

    +
    +
    +
    +
    + + + ); diff --git a/tauri-app/src/pages/SharedLayout/index.css b/tauri-app/src/pages/SharedLayout/index.css index e69de29..b570e86 100644 --- a/tauri-app/src/pages/SharedLayout/index.css +++ b/tauri-app/src/pages/SharedLayout/index.css @@ -0,0 +1,4 @@ +.b-wave-m { + position: relative; + top: 10px; +} diff --git a/tauri-app/src/pages/SharedLayout/index.tsx b/tauri-app/src/pages/SharedLayout/index.tsx index e7f61c9..5858a40 100644 --- a/tauri-app/src/pages/SharedLayout/index.tsx +++ b/tauri-app/src/pages/SharedLayout/index.tsx @@ -5,6 +5,7 @@ import "./index.css"; import { Outlet } from "react-router-dom"; import Navbar from "../../../components/Navbar/"; import MobileNavbar from "../../../components/MobileNavbar/"; +import FootNavbar from "../../../components/FootNavbar/"; const index = () => { const web5 = useWeb5Store((state) => state.web5); @@ -33,6 +34,18 @@ const index = () => { {isMobile && } + + + + ); }; From 36e4799a814dc1bef1dd1c8edcdec49bb7ab9159 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Wed, 3 Jan 2024 00:44:30 +0100 Subject: [PATCH 003/124] records page done -- awaiting furrher reviews by team mate --- .../components/AddCardComponent/index.css | 198 ++++++++++++++++++ .../components/AddCardComponent/index.tsx | 52 +++++ tauri-app/components/Card/index.css | 61 ++++++ tauri-app/components/Card/index.tsx | 48 +++++ .../components/DetailCardComponent/index.css | 75 +++++++ .../components/DetailCardComponent/index.tsx | 57 +++++ tauri-app/components/MobileNavbar/index.tsx | 23 +- tauri-app/components/Navbar/index.css | 2 +- tauri-app/components/Navbar/index.tsx | 25 ++- tauri-app/public/pma.png | Bin 249743 -> 0 bytes tauri-app/src/App.tsx | 2 + tauri-app/src/index.css | 3 + tauri-app/src/pages/Home/index.css | 6 +- tauri-app/src/pages/Home/index.tsx | 51 ++++- tauri-app/src/pages/RecordDetail/index.css | 0 tauri-app/src/pages/RecordDetail/index.tsx | 9 + tauri-app/src/pages/Records/index.css | 96 +++++++++ tauri-app/src/pages/Records/index.tsx | 111 ++++++++++ 18 files changed, 796 insertions(+), 23 deletions(-) create mode 100644 tauri-app/components/AddCardComponent/index.css create mode 100644 tauri-app/components/AddCardComponent/index.tsx create mode 100644 tauri-app/components/Card/index.css create mode 100644 tauri-app/components/Card/index.tsx create mode 100644 tauri-app/components/DetailCardComponent/index.css create mode 100644 tauri-app/components/DetailCardComponent/index.tsx delete mode 100644 tauri-app/public/pma.png create mode 100644 tauri-app/src/pages/RecordDetail/index.css create mode 100644 tauri-app/src/pages/RecordDetail/index.tsx create mode 100644 tauri-app/src/pages/Records/index.css create mode 100644 tauri-app/src/pages/Records/index.tsx diff --git a/tauri-app/components/AddCardComponent/index.css b/tauri-app/components/AddCardComponent/index.css new file mode 100644 index 0000000..62a2e57 --- /dev/null +++ b/tauri-app/components/AddCardComponent/index.css @@ -0,0 +1,198 @@ +.main-add-card-container { + background: var(--color-white); + width: 500px; + min-height: 300px; + position: relative; + z-index: 7; + border-radius: 15px; + padding: var(--padding-desktop); + margin-bottom: 30px; +} + +.main-add-card-container h1 { + font-family: "Roboto"; + font-size: 35px; + font-weight: 400; + margin-bottom: 20px; +} + +.input-form { + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: column; +} + +.input-form input[type="text"] { + width: 60%; + border: none; + background: var(--color-slate); + padding: 10px 2px; + border-radius: 8px; + font-family: "Roboto"; + text-indent: 10px; + outline: none; + margin-bottom: 10px; + margin-right: 40%; +} + +.input-form textarea { + width: 100%; + border: none; + background: var(--color-slate); + padding: 10px 2px; + border-radius: 8px; + font-family: "Roboto"; + text-indent: 10px; + outline: none; + min-height: 80px; +} + +.input-form button { + width: 30%; + border: none; + color: var(--color-white); + background: var(--color-green); + box-shadow: var(--box-shadow-green); + margin-top: 20px; + padding: 5px 2px; + margin-right: 70%; + font-size: 24px; + border-radius: 8px; + font-family: "Pacifico"; + text-indent: 10px; + outline: none; +} + +.input-form p { + color: var(--color-red); + font-family: "Roboto"; + margin-top: 10px; +} + +.form-container { + border: 2px solid var(--color-blue); + border-style: dashed; + border-radius: 15px; + width: 100%; + height: 100px; + margin: 15px 0; + display: flex; + justify-content: center; + align-items: center; + transition: 0.3s; +} + +.form-container-active { + border: 2px solid var(--color-green); + border-radius: 15px; + width: 100%; + height: 100px; + margin: 15px 0; + display: flex; + justify-content: center; + align-items: center; + transition: 0.3s; +} + +.form-container input { + width: 40%; + position: relative; + margin: auto auto; +} + +.form-container-active input { + width: 40%; + position: relative; + margin: auto auto; +} + +.add-mu { + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); + width: 35px; + height: 35px; + border-radius: 50%; + font-size: 20px; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 15px; + transform: translateY(20px); +} + +.sadd-mu { + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); + width: 35px; + height: 35px; + border-radius: 50%; + font-size: 20px; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + left: 15px; + transform: translateY(50px); + opacity: 0.5; +} + +.uploader-content { + width: 100%; +} + +@media (max-width: 750px) { + .main-add-card-container { + width: 300px; + padding: var(--padding-mobile); + margin-top: 50px; + z-index: 10; + position: relative; + } + + .input-form { + overflow-y: scroll; + height: 400px; + padding: 5px; + } + + .main-add-card-container h1 { + font-size: 25px; + } + + .add-mu, + .sadd-mu { + top: 20px; + left: 265px; + } + + .sadd-mu { + transform: translateY(13px); + } + + .form-container, + .form-container-active { + height: 60px; + } + + .input-form input[type="text"] { + width: 100%; + margin-right: 0; + } + + .input-form input[type="file"] { + padding: 10px 0; + } + + .input-form button { + width: 100%; + margin-right: 0; + } + + .input-form textarea { + width: 100%; + } +} diff --git a/tauri-app/components/AddCardComponent/index.tsx b/tauri-app/components/AddCardComponent/index.tsx new file mode 100644 index 0000000..66c9bb6 --- /dev/null +++ b/tauri-app/components/AddCardComponent/index.tsx @@ -0,0 +1,52 @@ +import "./index.css"; +import { useState } from "react"; + +const FileUploader = () => { + const [file, setFile] = useState(null); + + return ( +
    + { + setFile(e.target.files[0]); + }} + type="file" + accept=".jpg,.png,.jpeg,.docx,.pdf" + /> +
    + ); +}; + +const index = () => { + const [fileUploaders, setUploaderFile] = useState([]); + return ( +
    +

    Create New Record

    +
    + {fileUploaders.length > 2 &&

    Max file uploads reached

    } +
    2 ? "sadd-mu" : "add-mu"} + onClick={() => + fileUploaders.length > 2 + ? null + : setUploaderFile([...fileUploaders, ]) + } + > + +
    + {fileUploaders.map((Uploader) => { + return Uploader; + })} + + + +

    + *ensure inputted information are correct as once saved it cannot be + deleted/edited +

    +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/components/Card/index.css b/tauri-app/components/Card/index.css new file mode 100644 index 0000000..ee364de --- /dev/null +++ b/tauri-app/components/Card/index.css @@ -0,0 +1,61 @@ +.main-card-container { + box-shadow: var(--box-shadow-black); + border-radius: 8px; + height: 300px; + margin: 20px 10px; + min-width: 300px; + width: 300px; + overflow: hidden; +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 26px 20px; + background: var(--color-slate); +} + +.card-header h1 { + font-family: "Roboto"; + font-size: 20px; + font-weight: 300; + text-transform: lowercase; +} + +.card-header i { + font-size: 34px; +} + +.info-container { + padding: 20px 10px; +} + +.info-container p { + font-family: "Open Sans"; +} + +.date-container { + display: flex; + align-items: center; + justify-content: space-between; + font-family: "Open Sans"; + width: 25%; + margin-top: 30px; +} + +.vbtn { + border: none; + font-size: 24px; + padding: 6px 8px; + border-radius: 5px; + font-family: "Pacifico"; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + color: var(--color-white); + margin: 0 auto; + margin-top: 14px; + width: 280px; + outline: none; + cursor: pointer; +} diff --git a/tauri-app/components/Card/index.tsx b/tauri-app/components/Card/index.tsx new file mode 100644 index 0000000..e98d449 --- /dev/null +++ b/tauri-app/components/Card/index.tsx @@ -0,0 +1,48 @@ +import "./index.css"; +import { useState } from "react"; + +const index = ({ file_name, file_extension, title, desc, date, cardUtils }) => { + const [supportedIMGExtensions, setSupportedIMG, Extensions] = useState([ + "jpg", + "png", + "jpeg", + ]); + return ( +
    +
    + {file_extension == "pdf" && ( + + )} + {file_extension == "docx" && ( + + )} + {supportedIMGExtensions.includes(file_extension) && ( + + )} + +

    {title ? title : file_name}

    +
    +
    +

    {desc}

    +
    + + {date} +
    + +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/components/DetailCardComponent/index.css b/tauri-app/components/DetailCardComponent/index.css new file mode 100644 index 0000000..093fbff --- /dev/null +++ b/tauri-app/components/DetailCardComponent/index.css @@ -0,0 +1,75 @@ +.main-detail-container { + width: 500px; + min-height: 450px; + background: var(--color-white); + padding: var(--padding-desktop); + border-radius: 15px; + position: relative; + margin-top: 20px; + overflow-y: scroll; +} + +.main-detail-container h1 { + font-family: "Roboto"; + font-weight: 400; +} + +.image-container img { + width: 100%; + height: 280px; + border-radius: 15px; + margin-top: 20px; +} + +.main-detail-container p { + margin: 20px 0; + font-family: "Open Sans"; +} + +.close-btn { + width: 50px; + height: 50px; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + border-radius: 15px; + position: absolute; + top: 20px; + right: 80px; + color: var(--color-white); + display: flex; + justify-content: center; + align-items: center; + font-size: 25px; + transform: rotate(45deg); +} + +.file-container { + display: flex; + justify-content: left; + align-items: center; +} + +.file-container a { + color: var(--color-blue); + font-family: "Roboto"; + text-decoration: none; + margin-left: 18px; + font-weight: 400; +} + +@media (max-width: 750px) { + .main-detail-container { + padding: var(--padding-mobile); + width: 300px; + height: 400px; + overflow-y: scroll; + } + + .image-container img { + height: 180px; + } + + .close-btn { + right: 25px; + } +} diff --git a/tauri-app/components/DetailCardComponent/index.tsx b/tauri-app/components/DetailCardComponent/index.tsx new file mode 100644 index 0000000..393c33f --- /dev/null +++ b/tauri-app/components/DetailCardComponent/index.tsx @@ -0,0 +1,57 @@ +import "./index.css"; +import { useState } from "react"; + +const index = ({ cardData, close }) => { + const [supportedIMGExtensions, setSupportedIMGExtensions] = useState([ + "jpg", + "png", + "jpeg", + ]); + + return ( +
    +
    close(false)}> + +
    +

    {cardData.title ? cardData.title : cardData.file_name}

    + {supportedIMGExtensions.includes(cardData.file_extension) && ( +
    + +
    + )} +

    {cardData.desc}

    +
    + {cardData.other_files && + cardData.other_files.map((file) => { + return ( +
    + {file.file_extension == "pdf" && ( + + )} + {file.file_extension == "docx" && ( + + )} + {supportedIMGExtensions.includes(file.file_extension) && ( + + )} + +

    {file.file_name}

    +
    +
    + ); + })} +
    +
    + ); +}; + +export default index; diff --git a/tauri-app/components/MobileNavbar/index.tsx b/tauri-app/components/MobileNavbar/index.tsx index 58d1084..5027e7f 100644 --- a/tauri-app/components/MobileNavbar/index.tsx +++ b/tauri-app/components/MobileNavbar/index.tsx @@ -1,17 +1,22 @@ import "./index.css"; +import { NavLink } from "react-router-dom"; const index = () => { return (
    -
    - -

    Home

    -
    -
    - -

    Records

    - 35 -
    + +
    + +

    Home

    +
    +
    + +
    + +

    Records

    + 35 +
    +
    28 diff --git a/tauri-app/components/Navbar/index.css b/tauri-app/components/Navbar/index.css index 2834efc..9ec3d00 100644 --- a/tauri-app/components/Navbar/index.css +++ b/tauri-app/components/Navbar/index.css @@ -7,7 +7,7 @@ position: sticky; top: 0; background: var(--color-white); - z-index: 5; + z-index: 8; } .logo_container { diff --git a/tauri-app/components/Navbar/index.tsx b/tauri-app/components/Navbar/index.tsx index e00f881..e380395 100644 --- a/tauri-app/components/Navbar/index.tsx +++ b/tauri-app/components/Navbar/index.tsx @@ -1,4 +1,5 @@ import "./index.css"; +import { NavLink } from "react-router-dom"; const index = () => { return ( @@ -8,15 +9,19 @@ const index = () => {
    -
    - -

    Home

    -
    -
    - -

    Records

    - 28 -
    + +
    + +

    Home

    +
    +
    + +
    + +

    Records

    + 28 +
    +

    Chats

    @@ -29,7 +34,7 @@ const index = () => {
    -

    Join us!

    +

    Connect Wallet

    diff --git a/tauri-app/public/pma.png b/tauri-app/public/pma.png deleted file mode 100644 index d60b845a0bdaed3f9aa9eb8c8ed47c860e9c4f50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249743 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

    *sQzOwFw3K==Bos9fY$78~VUeLsr z!yQxs0|S=$-Os-0Idt@_D-YV6_u0}6iv^*DwLrW*P<54XJ!q-$7TD`^4KRD8g(lv>Ml=bwhL4 zIfzk>edB6ijFn)uS2v39L}M=LvjknWUSzw*lP!a(N@;8!^ME#*NZbcvk!-NcDgZP zs_DQ2blCd_a|~9ZyY35vrIHmFoJ_Fu8LUsdSt)T5d}a@CX1mYa=R(Um=^0bS03n-b zEO=E2f+;n31DW%Z7H6p!V8KsaST^+X=csEjc{S=0@0cyOz#Ah`p;+!kY?iv;J2~u! zy*bJUFZS}y_a4i;Us=m#+2bqmI%LdEKw(Qik3!g&Y$GD-y4TsdmZfQSy5BG-8B8F^ z2=Tru0ptT#rI@)FbMvZ6d38Fp_`z%A7xOag*RjgGRL|+HtNeanEOfFO=LSs*5fml$ z0Kee|w~x)syf^#4_9N*SkCllvGZQ>Yv^E!P!>slUDwl88DDJ8GSopk&dqJDO`59!( zYzsjs<7)OUr3vGi=43SZSq!b@8d&_=q41IOMh$~sqQ9_!AG}7X5)lW!bdxEql}+ne zhTAJLdZ9Rw4g;YHP}`1rX!M!f{k*w#)GLPibM9t0hNYEOEd&$b_2ExzeYg4%)IX$J zia1$f&|-WxZV!r!c^CIfoB(`(jg{nlOW^@_66keyn9$PT8YJ9l2RJ^*`i%5P6(&<4 zhkcJ;3g_hwXNWrhOO9(O4K4kEds+qD7uQ$F=-p3>&uVrxfD;@porA=r8Vb`8jqN0? zL@QP)wjAnseqZjrRW|ld6%E75CPF^mn}KtXEAH-DvbAq_=T6tP zI9?mOMuRXlc}?%7xNU#2nA==ER3&C;8HF*7^^lAwdU!MT)n#)BGZ?ykhH~xMyb^oh zRG*`64|=M`d8g2n8e8+5HBXBSB0bU?4A#pn|Bx;FMsc%M0u( ztOJmMSf9a}k}-O$M&y*3qw^B$UxDj~!K%uJ#S4S9wGYW&EG!i?4vb4FeSFHTk_6`4 z=gA;jEjRzH{ObE3J(Yj(xlf_8>skv$W-}IUOmq~*CKdAnTRRPe!q7R@=Lsj1v^k2LU;PF8-$t3 zla@rxR2knJFZb_{mA;pPsb!8#lW`51z?-#3VX|<75XCtwXY{I^Bg83CmWVP?-xmj| zd1u;>39!}7Zl+Kg!SnE}_8rh9m3pG*n% zdqyBzgSF+<4P`;cP=dJy2OZZDNjSS5Dt47QDnc-7)`iwAI+Jo|d0Z6qbx|}oMIorN z-j-*&Db~j0=j5Cp$_HKTZg4P2Kv+q(e!{wz=;~<9D`1)iC3x-yA613xR))gKn?6lXv^5QxBqmDc!qffpphwEMt=47V!JaT->{-M#Oj;y)VR5q?Kb)lwr4&djROOcW*Tt3B#lS7YpdWUAeoohC+8f-%#2L46nU%W-ZPs1LyC=m9u62{y zSv>7`{!OkH7Jo8#Ki#gI-(R6OdF{4pHE3_&oEu*043mWwCGtLISgTD4NuxED3lh*4|X}Ucvzxp%B(W3L*ZdR-N(CgEHi<6qE`PWgu3A!zm{$}j-ku;Js}OrM_#B6 zBTKGD``mFrUd?`P?=gte_Y)0_T$K+B!p-v%&d9A?1*p$MSHr6JJc7LgRw~bmCt=;S z;|~*Si1}X2o!8oX-XMxNP2H5J{$5K+jGK*DN3Q|>7K6Csxb^c|Ul8i=lO^-^>?4vk zLKTX^AZSk}i!lN7o^n^O$-eiBz1Vr0hghIcZR+@bQGnn1;D!A9+Ye=J3#qY*GI^u`($mi-Jq_u0EHDVy#1@U2R^i>m3hiUiU0?_e5u%61kJIlUsm+|Jrg))YW6HkV({ra2D$ zc?pgKXs1VQaZf;Ht;J?Uu`=gz*TYvQKEMU@p6L4L&DswYYqjrn#zH=QFLWo}q0LCIYm-O@s3piPzFn(+_`mf=5{yPwR}E-LSAB)i9y zPwo4XrEYE)=nBcOo$Ru!U^d#NE9Pv1$OGE_89F|=uGsrEbm8RJ+?DcIVV9(lKKl4f zvRDlCxhaQ@#(b;{HIl8Z1{-=jWY2z|>sb6*{ZLZT;=tH5&NztaDA}>@6DWR7`gAsw zb#QcgrFl@^))!2uOa_gdP81o~@h`QwT;CgF?k6^-+LHy|p>${K z7EB_Rb43ydsuw^Z?}Q~V1{fmvwfC(!3Z>( zs0Jui6#yGPv4lU*sz)kvJVOiKZ~W{^zV(@ z+3VgZRrd(4@jl|TE-X9P;spBhcDsk52Cq7`_M#s1P>hXMXtqhZ8$z1Q>U&kM^1Ci? z5QX03^WE=vf#*<0%VS~TM+gG58eevyi(QC|PKEu|dn?M!IOMfF*>B|Ow3biGS^DVN zL2h=b-AQSvSm?Y?L{nS-N^yVykS5^%BN{ zya&5D@(q;F2?Jz(A@CJg&nQFiZLIYEjLjY;NxDPfQ^B?lgNqnd_EPLY`sBOOI=e9l z>zW6%RE0C{5toY2ube%Gp&8a|@m8FbpkWDyPDyn|e%IB4{FaOJ8VoSv!$UQO=GNvFqaPKV~^+}tQc1GQ0^W`qo_rD$$-vrb(u zc=SR*+7uOXY!;rM7Yg)J-jnUGbacN^+XT4s;&==}(4VzGdwK7*Y~*K8ck*%B|DSuf zVlthPC}_ACLrE3NY=(|ebr1PMe)=fLfAzf=^5Yj-KKp5r8x5jI=GLT~ZXpKn&W5na zIhzhvNHP5FVa;l69-ReO#QLd9ZDlCdg#7I72bKmh=R6r{AX!4kbVz36l^vF-4V{3oB@$ zDHWBdq0>yk&6bwvmSAN~2Czhw#Z^mBS#Y!+!nOtwCaEP`NmopgmUFF@_t@>| z2QgFJ$75^L%`^CY;Wmur3@zQXyS=gcthBZ_vSDfIxmMD3c3dw=vMW@BL-er0VxGIb z7Aopc;jw-n;lJe1*sXVBuF-6Q*ssZYmG~HH5lvMZlh648ND6|o>w%6mh7c=b4Y^h2 z%sju^%9$oX0`?hdyvc+0`AGFM5N&KEGt{bb4WY8=`uLMu)e6nfz%!$Aa9`WmM~$)O z=mFLw(tMHN+i4@ur)&AaCpYr*r?dR#r`EEbM?l=5!CI~g)+bRps)dByh4Q3N%h~zY z@7>5xp3U;4Y~r`Hx|6~}ab(_;8x7(T7MwK(%l%QUj1RjMS`G!CA=Z5!T-cqwmTb$R z8b#C6!?gJxR)bmUgtD+twN4jk`CWNxPG$(v z8x+9VI4fG4O_gmTgWeJJW_=jB<(*7cbg{R@2$$wtipxt0=rK7M?XD_WalOdrqxF!B z7g1h!?_3@iEb)WuVtK`jvf2M%%>8MzWLt6_i22^O6=@;sYOs1BZOcdKlw8+Ll0w_!cpbCW=UcLFf9Pbbj=j^TRYq{^e zPuv?f^Hmp2eSoZ&d2bBo?8)7iFJE4~{PNsr@o4%=`i#C1v$3g=ODP6XnJ_^MCrg4{ zG1HahTPP&i4yC%t^u8qC@=$;$9}b>>7F+pX!)iT(wv9`t8 zem>1k&lN_je%$mqi_9iW?zI7O7@P5+a;iZ_D12h*kG>OWUO*162L-qxx_F`W{K#$? z@E0>6xxpJ=95perks%rcK#7U@fMMld>W0Q09~NAZh%tBT91hOV`h@EZ?RHxn*ed?1 zmBR}2B6kqlcYsE#<5>Q_3Raw0)~9-qtBtOq6VP1^fIUobsKyC1Jd3kBki@=dPQMn;*N?R{w4VTE{ z^KwA_d4Zn(i!Z+>U(!fkWx@5ZHK#=#G|hqFpwpTy&0(Ei$WI<8`IC=#^4WYr%KH8W zRp0qc>u*l*{LB}ak-*2f@It(E%ofDp+JQu+P%+%%zkX5$^Uu6t#b~_k& zG^(-)U6bJY8H%)MJzloLMJJdz6ueop4h=@KJnTtPx88lICuhCrPTukh5f zaWzl}hSl8xk|JbVc&}S(p;#(ddd@6x^30?<>htRF`u`q@yI!Tq$C1k!gvqVt^0sbW z6@Kuq-nSQf9fISEb7!>rs%9?=!}sTdLq&`P5V&D3F4pqs(V2X3ol%jy7cv-lX46RQ zCVJ)-%kQ7XP-Cs4RZMeVut_L>nqb@_J?nXal{ZeiXgvVFa0GhC!VYj(HhaF1k zerOO$>_{Os6gkGhRBe;I3d5vllGHkfJ1*C<;`c5MTu-NEBr;UCSba@q^Z;hs%--Ll zRbA`7ZZ;?Q+}VtX*x2-fjy@)YSsKJ5uUJj&jlu@YBOTiU=;9GtWT`OFHB<}&STkw1 z+7rocy?v*(M^=Lo&7nZlBrmHnyRxs+32-m&Uq**j~ zZ0#q@!D_VZbx4Q|RH`Y&Td0dG2x#6cu#F##t~&5I2?j<^!JxXBg2C7tWfgc_*Gf+H zd!yCopzcga1y*?_U*9)ZJeO1*M9nd3ef9xzG8TDI8w!YNt|&T_dF4YDUv<`vOIv4; zZT!_1`Z9+>PxgPV7ov*J5G)hz7W8X0BFi4weG(X-W0l5eKUpW*D!37ejU`7h$b)j2 zzVo2KS06o>7jyBJf=Vh!;EIUkLYpkEONSoJJId4^RsVg)0$q2WQRqCoP;&-#o}?L& zoLa;nB5o$?-?Oo@sE*&Do=`V}K}7MmyoO6csKytmo)$g4+-~4HY}^wT^V0q`^?8y5 zSV^SU%3_X!5zI0g$QE5W-L}mhU%@16td2%KK<)4Duy_(QWtSi^Sn(y7ovk%jAmP~S znitIIhA^OZRGd!-gV`EXgQM@@vl8T0R>*JZx_%Yy1?D20O*ffCGAyDhe53Axp-G~E z2%tr!U@{U-sF(h({PSl|_VSbR=bK-@C|6gN$Ko^Z1>xeLn+2%JChM+xgJ%cjV4c0zf!nHJU>xe9$O{&xN75{v($YocO3Z1 z;2GpT%?P;?gcCFdKj3q&iUh|lS4HrApp!I4iztp=j6@g#snOL4j8V7M*%@0l8_bwY zx;+}S3%$1?nr@dc+7d4aW==!^R6wi0?B9&^35f;!?ETCr9ym=fkGZz{)Xh<__0`}5 zAc;kKy37 zN=ujy);Wwlf1`z)wk{cCL2flpnX_(}z56|Ss=Os!0_(nD-rv)>d z#Vb^t8RSt*jnHH;iRN5iM;w*(QbJ2D>;$cIPq@g(A@&vX{Wu?ZH14_jq3ZJr62!jY z>9-XlOPsOI)V`JoYY>nI zwE`S?Rz2*UeaYx7;yjsH8~9Q-44+blrB_A_Fl4@28U6msTq2| zW`q4SiLM8>;`ZokV^mNGWR?T{^6FY1oNmNbn^XN9%T-!5qR~rAjjX^ntjt$}?U-{F z>}!j}U>+QTBdPZ))1!y)&hj6^$b$Df+8W7{s=iIAD=S-tx;iOO%lm)$$&LKhm(IYt z%6rz2so_vH*{7G+Wn9l?8z0KweJt`HfAm7$-)n+ALzGn&%(VZ^<;}i)+NK!Ok_QW_ zg0KXQX>(4SW z%UV>4GJxRom%H`e`mL)j9$Bh{AGce!x?ukwTf=Bv7Ai9~m_(GH6HbJ3X?2|4!pJY> zNxVI<3R9w|yWYVVs?aGEe}h$+*NrWHI8*EoQV1*R+lNfb;D`yP1cDBZ))PQ1Be&Bc z)PuaAmD^X7+Ga5v`w}NqpY+sB=?1({M$Rc6{q!DYYF@b*?k$9d2GhS+7R-=qmHD0b zdPoHpJGiCQ8D#r>ryx%^S8{rGDqnl!b@}Ey7xJUWpUTaAQeL+b?|8Q?W;^ieY*G2+ z>w%*5Y1h!H$>3;`AA!YP=#9X@RPw?!NR4Xb;9LC}^jG>F`g*0Zx?(R_8FO0n-?($E zY@;?~dtekgL*n$^W7mSI6z={x5BTo;?DN^!W{>;TdXDXmk~Mz#;z}Zixh+P3x%2qv zdatfhEA_s!c(Q!9{?X8LG7l1?eGt8_(6w*AWxV>xwvR?9YefLhape3{D=ea^*vV$B zY_?p_J65yno^5SQbLUJQjQSz`+5O(@Apl=T_H^jyRPTFRayZTwgA@i@R?|qEH-^`; zb|cD@eUv}_$z%E7{Kg}By^O*6K*eBXa;6)R&G{R0IX;x1J{jfz_Ip2+|L|csAJ!N0 zBC&={E6Xp-?OdA#hmPqO4a4uBEc4)Wr))50p7&Jo=MytafR( zw%#>j7Dhi>`!=D2W5#^wzheif<*xnM*zUF+_JpD2c7ofaJX$jwdI6AKxHGAJmp9q2 zDb0)5p-v#(&Ah4unGYi%QdGmC^V&ro{l{T|=UfxjfS6*ig1X~4d;h)FFyV7!YeG}M zkAFXbaZ&})S-$kfnVgr2_^jkN6w(4dtI$rcx)8Bvut1yl%D-kC8$_}(w8Uy?&!mvn zoY{{f*;FR?n))%5yRZJckT}kSE?mxgfPotBJL~`daybcNPOW>JSGGG0n=MK+=>&Nh zi_fok09%15p)i5Ay;aGX(J0_Cm}XXz`6y+a-o*?R1kDjN(LTMOz88tZD3ex)TK$w? z4zp3#BZIpS;5+w`H=~KzL0%P!dHG}Cd3pZhHp3N|g*i_xN~;0*txt*tii!ogD#`C> zTlv?}7gHLDKhDY)=sS?8u4y{68yYfF;NK0W$ z*C(4S`t9$#-33m!`n!X{2)u6zuRcJ1eyzPdEI<1$+fnZ=EJ!|{Q)9HSe4jV2O4hDI zjLO@uhin^vZ_r#@<2pvg2q4&uwijG9k<3XYZD{?6&O@>m*MmnwHZB@8=-xtEfkz(E z2Es)S*}zCAVefu5OV~&6^f#efAdcGEJD=q$Qvks(M9HB`Mp15{AIBaJto^4~9P!*u zc&860eI+gqI@7EftPN%zY^An(Ln>Jw{xmF>ibjv$?m)?%hu#@a=aJXy&Gun+f~u!w z2LMMR9I9QTS87l;ylf@KfN+PsKvvdsmBQNAiS$pJE(nr2JdShEB(5^ zYN8LAar2;9B-IZ5g<~MOvOpvRxvOcD&lxfT*}D5VeA4~*uFu4fMy|oi z_;P3`C_89ntpZ#%H`mu-Jc1>s=?1oOu;Q=58k)hYjg9T3W2lYQ_9mato*5)nIEh1( zqc|8w3Mk&(=)cEWpf-foZdm6`Baf9eO+&QpO}s206>E}NiurOqWbCkkL7pXd?b)xO?%Wu%@^;=$5*HFyFYxtz*SfB@$^7$ z#z%M>-kT;U{_?>ztVQdl{e`E*jTuY`42*Wb4{}THVG5V#{$pnWNt;fZ39xReG zeHn%nxJg|U!Ri|P(5lP9I%G}IL80c+XzLGUW;KzR>%yXE+YCq?o7IK*puLV_T;@gP z?s(4G4hg9ZQE=#(8mlW|COdIGj=&*j9}>+|wnGm?6Q7srudm%~Rl+knh+W zQgbUbAQLvYe&1QK+FyTXC4cwXwv1UZC`#GQLwmLbJ1umR9_m+k(;v?TdBM?W5}A%w zqEVJ(^wJ~}qT$kF;cd-**dd4a83|xF8B>H`Xy2LZq3(ID`ly)&h-~$_KEQU34m&pk z%%G^jZHMPLStU|YgxPaenR4f3^;qLEX&bX=Vr2`b{BY^-)@gb6*8|p{ zA=`Qg)%h5ffnFxu+dtDBS;5ZSP^xt`x_@?iHt&LZfE9bvN%Z_fs-C7`t|s>EF5cp4 zF*++%eK3a4bO=Lrk$8n%I@t4mHXP?%zc1J3qixa}lq0p^kVV5uNSgIS(I!-zL=_bA z$+KM zbL3o5Ba?*9ig<7CbkGqA^%l?tb+iJ$;JQvu#qG4$0@+BT+z#4^SP+HLd)lm59m7hh z)Cj5TQqLMD$L$O;?>JO1(MLR?&{*e5?-ROuiM__*{0%(c2BpG})|Up(&8)``6hoTv z&^b%UNBMb#3VziKvzih$>J$Vebp}oiN)l*nS4uAyDti0pj(!-_&@MBHIobfD$@(4j z6NBXnuoldE!;23=0#*hU|4>p8_n+X z7Az9?VloK}VL@nU4T_Q-XweGvyspKeD8E?T<-JC%!Io9Kjt;X~M1>7ujEq`OaZkmr zcR}kz=?M7Kxa+fff-Tt}%)q$w(PQ%Zd0u>{URMaMmS+J2OtbubUF7#?3o^gRg3q`9 z9mJ@@BFiR4;Uy5Rbcs(b8mv*NMw@pR&HA|coZi($?C@gooE|BIMeDm76)H1oo}E|_ z?){u#h4-H&`J@<#2g4gOoUY|ZpY7%M|L!CCw}1X|i8#h$I8NoN9A#7JdT@Zj zr&RE?Tiy@ePo z+?(2G-?P3kc_XC~T(76zM<9ot^xRO5hM2MBIJBqG|D7$$QQu@$jK|v-Z^?JQ^16Kd z>{IzvwPfZI8%c5AFsM~;Fxy?X8M^~|u)g5_%&nhDGc3UA%@Z12nmtfLCK!y>#wFB^ zpkB>pwW&HdXa$T6Ap2qXWJUA5^e`WXuI?nu!jl~=>>fO%N2|}FCNRS7eg91kNTTXqk$TRw=$l?E{|4v6zT>4AL_XOC z64lMgYe2NfAQ=o24#wDA{N>{kjyX9k2iPP(db*XLT%E|*-h5p?d-7a<_s_pC|K`u0 z%hmdUOzShbnkc{!6h60tPeRxTaQb40P1nGjTlF{)xHO0jZ<9 zcP%xW?htCy+uOQ*29Ta(bCer_;FZE2cRd0WXytkF=~ ze?;5e)!)EE>9hQJ+@Cz1L?XNG^~co{L`N1 zdawGsRwO8tP+vpmraah2lMZ$eX=oRji0XTrdyXXMP%-woE68%CPcn+UDbY}27Ke~} z96QG2eLuXJ)M!b`#wuu0kM9F-egp_jy$pNM(68bnSBODc5AGmy{obK^EM6RzyY<<_ z8NK(Q<1@lzn^6tCzx-6b_UK%`_HdM&Clkctri2)@7@A2a=;I@N`&t@aCRJS#s6j_vt(v@o9kMShVe?B zgp%BRzc_<`^!|ht!qhURBlA#Y-mel~K>G#8@ZwX&vl90^_9 z+9L)9$8j(TAih}(Ps8YIr@(P5I^aY3@7kb9i#*!I>j5!MtWt!0aG*p+jNYuiTL_^g zbM&fs-aH?5?y=#9u|c4VoX7EA;m%;G(Z(IGBZfIrzrI-FakGX*LocWCMK2c8M7bZ8 zFr2miz5U$f$<^anE5= zvqaZzFo7Z%U5hIH03&|Oq&K`;qa$LW?^$1heiB_&=85T7xd3y8Tn+PJ!kUOqVhj1P z@VocpiQJrH!ZDX*171*=On+ zP-9Cr*nq=t7=slw_Ge5o!_r_Se?EUICyCTL8M*Dy&U30N4E5RYzi_MDS%C4fJ}0>i z3>!ub26K}FzdHClwzn|HHRoE^Ku0N&lCL>0>`}r?x@R{w&tU!~sgT<|@9_D%y^3%~ zIDdMNEA);TEQ+2hEU)dk1rf2<_spm~&(voT?}UkjxrTBY`O(TV;iSGhu(@Q(>1mcl zq1?a<%j%UH8vr71M-FPdTa#|~>v4FMT34|)j>Ng^L3jst?EejxOa!*;y%W-_E&6(| z#(sd8QAGgxE%}b`^@ybYG+ReO(;Qk2=O?;|k0 z!hHI|rjAfBXG4W8U5CgH_z>Fj2J-Tm18JTX4f|j^JSSDY{jLi%$OTT?jb%4>VQji! zfc~Zyh4(ok%9-0U*`l~>*@vU!Fk8>);g+rxVYtZX>z;K>R?UDY3FoO64<;t=LDL1J z#*D5pAKAmEdG4=f^gUwwVteSWOFuzJdtVIZrJTqQKE0OftE=*}6EsEJs&JsGFF?pq zleOpwSPX1n^bBTHAloyUqXSZ*>3QjMX^RNT?Y9dkLNqE96QL~7&8mOgF5;qw^9c93c6Va$pvc$H56!Rf3s6{ za5*_;WT4HSv{}*0Bq>*G!@fhTG){(+cBln5u@}PxDc!&g4q9Qzoiy@Llis7Lg1ROY zWuhtjozZ)G0CqSywKVYis)uS5r%_bO z4%#6a?wx8)4eL^*vd`ksFW;FJ!GZ8c#XiNP3tW&e^B~ur$HQ=kmQFUtk5$#KOu~EU z=8UKn$ITac?mQ*VcU(Y>4sF51F`0*GbtHZdw+^UyxV@dfIi=c)z#DTNuCK)v!Xi(C^=-vl zjSVHHUflIrA5Fy?J)*2#aA2F_t6h0-*$1ckUadvZT#O8r$%h=to=IDmc=0^QA;o$@ zjSgN3&)TFpZ7mXOd$x~e0D)G@@WEs2ePrJMO#yR1xz@Qk5tsPUJwMjhW;~yYmuT+8 z#S@mT7lfWUQfu5rlaq$P=z;aGGN`ssfNLDY94} z_v~Ata=@q&Jvi7}fla8PoFCOVtPGQt1Gpg|k+p~qyU7RWS1ZkZGkG#w^ z8@{~!SpMN=(%v}ZdXO`H-+U!se)EBR^-E{+*$3AUi!0NP!y4~NOmZj7YxHa}hpT)Z z+IZw!cvq++(#C8U2lG-Q^F-0rV4J4|2f;CIe{;@vdeN0`SbuQjzzpWeXGQ?J!B)l| znc+l?wYGtuo9ae#!_%I_o~nm>OtQrlY{in9{e6Y#H?q9txNs&?{bgSy2&$^}J;?JB zh_#MU7lj@%9(S$hxyxU*zVD%a2JXRHiYnZ&+wW*t^uSX%NF$Mb@!^ezt9@I5nH%Pg z!=gAbP+Kiyqz8@5>koz`+<7G$ioyGT%#0F~&AsP8+Aw6f4-tz7U#ZI04lcR(a_1W6 zGA31ZGWc$<>tSXU_i2Gif*!)UeAN9NEUFC2XtwN^u^z%JvB|{B1OWeN6fK=lr4s|B z%S77q_7KCq6Bp;Ej)dW<{+8u&SBnL3;c9NWz?8-WJ!63^n4+|$# z@56s)5U`%p(4~s*W}7mHofW&SuAvDZxH;L>{4#So!Rk?F+l#(&_+CaHWsuh$JHw-Z zcu$@Hh+|$p*h??pl%df~Lz9o?{D;uI3boEP-n)Ha@B)*kz|p61IgZejv6F_^@@U&QvxT4p8ad9E9zg4#Ur|;WgJ+Q-{E<(sX ztSpJ$HOvW2cHb2xyvhY5Yb`(ZkadCsqP=*KS^Rstg0FmO$#dOc>41*QgS#c#`|0$t za7G-Gn{x+grc_1!{Mz4>J2-wdjUjhRcz9YfpXuSxF`K`6}&Ytq7xGqcQ z!1dWiPd+gmcdmbeGr$Ss1}B8mPgpBjsyD@X5T~sUp;Z<;#kcaqC$=DUZ-z!K*(Tao z5As-#4!zv_cQ#2siNT;0hg7`NSBOig^}}K|g!(W(OQ{J2YY0m-l5x(L9}Hs*9Q~z1 zg~u1EW2&uXm0491g4=K*S7|Lt>9FOyZnVLXGAU+ayBISovJ5uPWArwk%?rgOFPb0q zdOBi@pl2V6;h~*ZE3NRaU7>!@p;zh0h2NKp@>Pj=UEBw3G0!*D;yPgt%EjgQyrHtP z{P{dW48Eal(N8n$iSYehpOW@Gy!Iv)o(y)&UC2?NDfCYrYB1vtjF#QLt`u0*xWpyxxvvCwO)So5s<=PrIs>miJ6l%? z2Zu*urPSxrR^f#*yaJnur&e^P1q+E%JdF9gdQ$nbgbQnU#**!e-0w;Kp zIkRW;G}Voz9#IAceJqNw1eS5F(E@j-7bcx|?ujl$DMOH>(K$9)w);wpfX8uuHf6~* z^n^zmjGLdO-h+D6nugfTngA@57cb<=Jj#>jL4Nl1x%~A9AIcA(ZRJTZMlWvma(-GM zt$1S9ow4$=+aA`{;s?ZmCm|LENvM=hpO4siFny68i!XOpfHW&-V6vEO5hi&f+o+?KQpED2r!v`eL%Y2I!dMAkswxPDN$DiZw}k-GVEEbRJ(= zcy$gn`EysOD7&I`s!g(-o?LTq(iJjV)NnX{(s_SyhEkgoR^HE&vUGFfRA>HS%TjZ~ zgzx3}&6TxQ^MO|2S)DksqE00w1bV{BAc$TLzBdGSU8Gr4K#$MRyl0>HeBf~WJkfDW zP>0?Z!~GJOHIhgQ6=kT0p&0``*yGU7qazPwj#udD?snkkT=yIgb{qF>bX$FSlv~fY zXl0%K8J6SF|GTaYY5BkrHA5Nn;bZwS-zI_H2!Cd0kat$~H88~XUA5+?+viy0oiok+ zDpMEChgoY{GuET!ur&__SC5t3%(Ux5MSI3{*oPt1|MP>m{wB17K^Ou#cG!3CffPvl zHxA!{kw)yoBuvoB;74BnkWvL#W&cPz83b7r`9TthcCuUeR zISEW!X~XLkpr}*~#!WFC?>$cP7ax2sfBW%`JiZ>~YF^2cTt5H&L>@gV$=_YUXlHiJ z(<&SkD$ZR)KAaJF08?f#ZXG{88~)kq6;8z8dT8=f85jp=?I(rSH%K zx*AH-5wRH%oy=9uASW6Rc=K_ICli}aHTw7>>j9fAvL_?HBTd!wSLjfkgd;c3$Tl*P z($)rE-$G4NOM;Kb$Dpxznvo6lo`}J#k)#8bTkBnE2hn!7m(55RLyZ;0E)$JLu(9z7 z2y!CY2KOGeTn@|Sbk|6_e2w38&c|MP`*Il~Pu=D23`Vqdu(YGlsX256+(C^oy!5-> zrXSjv*a9I* zuKjfwgHb1;0oZv6ER@tio0ZnQVq#72VQq&9;XX>DFnP9Tr@CUFKfSz^KmWTc`O{A( z`Dj|p^Lbs8Q;%dGtg=`Q&Xm!!oFVD}6(2+&9*I~buU4IA^0{_cq8LepkLj-VPN_YOmS zZ$0*d6FQ!uj}tZs7BEB<9Y+ZbD&2Vtk+NHkT0Ka`ENHM zF)yQEJZ-4Xyl>=&4%Jt4-6;_O49Phx=-a*XfCyfnJ!gZ?mkp%2XQVR6xYwk?Rd_aI zIWC?fFV}OZKd$$Obz=Dt-zz--C^M9EzYbd@hy7^|kvra%C=_^hc{;!y9p*0P+6o#@ zqkSJf0{%inGirX-qFfja6O=q%QEYZUlZA+rW?)%1iffeW%Rc4oTIU5+LFl2vld?+2 zVKqXp1=amlSj`p=cYKNMt)7Mdq!|FKx;rPWZ&l3)>0W1?EDrU_~x zU~Y@c|Kyf@qD%+}yI(|yUhteK3$UnmF4tx~U}Nga4w>{iyx+eo`61TH%aU&bUEEVR6WxWWe0auf+ zkeb*JqxVuL9Ouj%)CsJpn4AN#b10^x7?5A%Ov9>XpoUc1Ipal>djG8D&~clvv@qXV zI5&WERi16A)cHywUk{9wIVmXkoeD%bMwbw346;y-MBjtmbkQ{ORqAK9rex*WwTH;; zhTU?5eZ^!nmXDJ?nBQC$>eghfofW=@egAsWyqN?)PJ;BOF}s>b?NhHm1B9;oH@J@1 z-HHRK7Xnd5s*_XKp5EJTCgd}dC5g`sY*pc7r(;Fhv$LK=$RpyzuyVZRQwXP7@;{{N z#DIRyn4mfs>YRISFPdhV{z?@iVv373uJ;-1{*CtYxjOtlzP`&^(eOUL*bb}G znV2p5;NDI+{|FT#@=%_?>$m7&sPWK42O1{`Rd|@C&_xmWMpkUbdv$}_<%@^d^@v&b zu5UQp;WaRkwUmO0?VuFXqPZ1pF0Z+IySHD{7kj09Lb(27UZ6=4Xk7`JLX<3Evz|r| z)nOmh;+IA8<<}p`GdYuwwpa4>!^d(yzJ@vu<#p?1^PoYeavY2cd|bE~LkzcFQy(8o zmgz!NY`cHv!5Zzjr`yO5xh7}I0KN}I5f}nj;j{`1$yQ|oFG9c zGIa+P7P3V&q1JZf#q&9a&jE-O)W}VU(V0TOsLRj4DYdHJp6bg);#{R1oEfw{+|2t{ zV`WB2-pS(IBW0=UE%Ov`d@_lH>bkC>a_qI!hNqx)u@c4C5cT`QHw0wXYjeIlN0Hf zx#9K8|LzJI(>@jC!JLgm_S!6@826WdmnYNlUCBBf+BI6|Lf^x_X7yaDIp4HQ+9z++ zB_=F+L=H)hb@r**Q}#VyQ{i`Z4xD&W+bR-W!zxQvgw#Z~X6zS+UcMQIA({*dlS;7eo}Y<_ zmBLEV)wZ3_?6fqJ!v-#_cJ#7a9uBrZV+5np^7x?h018 zk+_=VJMV7F&tI4S;m)iCU=FbNADpzsvNj?z}huEI=!I_>|Ak%K3HKpokzR zlgoC<%n{tvl{BC7+11m`rhM z7;0pxa0}{}Vq8$IdAM6q=q!tTnJYK=9MyGH{Xugt%;~^m&Gdxbm(pD0`Pr&?@avK@ z4AKjs!3(#2JaxH@AuJh~aQx<34jEAid(j^i$xmUnb&mxOs}qESH(yaVBQ}@=~+yf zT%(Fm*{nJQdM2P4cFw4V*EM!_P8Hm6z8MxkdXK@YcbwuFg!=Mv=@OO^}P4$$=T z^-a)^R+wt8c@4u^qZh=n@yKGZgbBlWp5+x0r(ekBn7c3hn(GWsLzP>H*-aT_-Ly0; z*YdFZ{cDc~`PDBMgYmNox>m#L1W8?$NY*8iwD-k0exZ9~lD(_O-gO&hIPN9GQ3weh z1!OC%vdkk%_g+_~G@8<@4Y&gf)g$(r6*FGh*O?jXWQMmllt>?$ftg(Occ3&*>bUav z--oReX@>z1`$IxUsPnlVR%O#}`P{>*!6G3ni|8O(;klAF_rVT)d}olOg=&>X+u{GC zRfZ1>nULep%DR-fLX2J~5DmV-It2@m8b>NGlGE{Mjn0_8FH+bOUu|0G%EH;IQOlYW z8>)vzb&31^f0y_71pSdwk(wI|d_Jrdo{Cb-{<0bHy(%~C?{y-^-V5xJ6X5aL)>(k# zT(2Ik%ydNA@o%}uNz(B-Z*T9F2_%~%5C~~IQ;)RQ;T0jhuD<4;U=R1x!~GJ_dGZjw zs78vDThFk0?joST0#%YzxHmUz?qL;4ya|=6yRz`tM6ia?`f1O7h}v65#j2Bax%&A| z@fxkz=fdNf^)Opmgm9Zi>QT~U)#Qr;oWI8_bWzEx#K~Z%sGy@mF0&>qZ{*SGO8$#) zzbm`pQa=CTW4XM!EK$jM<54SCsZmqBAC^13w{V~(Rj(rlKI%M*NAAomuem{jQyE}Z zH^Vt;J&|7tCJJ;&=EMWTHwtd2>n7-0QCV`;zw&2>w_oK;CR+y#5neS<z+^0eb5ghFJRP{OtT)UCzQvTCZil%#qn_W0``Jk*FW<}J2P!cIii&8ASVK$ zhp^A_d=E@llljsduEPs^I~XYt@T znM$jdp%$HLowYkh{hUFo8kvp*3$wk!9+4nAB-%L2o5T(1c4^V9SU(Tdv+~MBOi}6& z3BwyhwgyXsJpzAKt2jGG%rR>kW21!OA%?CtWHx9er^b@Vp1fM_++>!}aXS~)^EwYQ zJTf|j?RGRWLu?*okH2~@1G$vJBr&qwqNN%V!29k(!{e8YnMphAV$X3e7voyKycuQx z&DZ3Er&mes`@XtO#N&v0eHSM!G3p@hB-raMJyrByr@PG%iLs8r(EnvKz@_s~125G&!R#nHsRPHBrYa)VvvUA+`oWFt3)i2a_rE`U0(o zy1qvbu__LiO>;9WAcp$d+1M+=STrMSrt z%@|wX2ENzXV5G8&N!j>e?1ikULK!Q=z-ME^g_fhJ7>-4f6$2B%hPB!}hFY}9aZ8JP z6?-1`Y|wvN6?A0BLcX_Yg0UF5L60=*13Z5{SagkOCpo|xF5YHp+IL-xHCZFALD==O zoiD-RKMB@BZ!fJLh!GHSbD$X)$0qF%oS&VJI4=em5N^FSxUD0(Aa}Cx{izjhPni_) z)yO=H{um5ZJCkB}Hc|SWEZDir4f#18Lhhmt*CFJ7Nr{FTy=@E`(KJO)WSVA=Jm_sv z<4WJyCw%&3xF=$KdG?-S``P_oVZZVF+{0*W9(~}On}n`h`W((h@2_PdjfWUQ^6uw8 zC+?BCT*7)a-f8heXycIXxYt*7c9)k@IQ4U~aro#`9-)q7Z@dyuw}YI7mokSkNqOq9u2=F`quOcvn< zqtwy>D{QeB?_h=_AeeEw{qS{67mUB9~-MlGI}s zHmTB{-sBksgE+;Y5L=(pavTYNmhFbe?lAWH27jZiHmtY4P|In;wJs<~g#`F4Ml3Ny zj;FMGi5-Xy0ts>NIM)p!@4GW#Xb5Ev51W3)g|w@SelL`L(PKNr?<8lrw<1 zl3Oj4t)$*L3gNaRv>1PJgAi}2Jm`q4iY}as$Xu|be9PhW{7YWE*Y;d3mykNvbm*BI zbSE8WDCDbD6?n4eE@zKe<{V#SvLXwK>Z7OT!E20f@6g8=y_^cGH@{hv53ODf8autL z0y^A2+|@`>+sH9Xsd)R`u@BVZM)%-SlAp&$;1&)R0jRnrBd+^@F2BE-De5+#Y~=Z* zeVj|2F_vWdT-(7{0lQbFAo5^3e%BK^j0N+yoG~`m$c6VFYed#354TzyU@E-&bM*+} zrDo#!hfKCtx?jBq>w-5QMwMUSa^r!dv5*xAIK_$_-N<+Zw77?teXe1&B$vkR5gm@rr)*JMqKriXUT+lGQT$>yn?XNF+rjN;iPODTBO$}t3qArJO+`o)QrGpTh08kgV{HXtua$i7_a416k&xNE z{JWMV*KP-WbuU6s`letn^T-|QzXqwU)?g#;{s!;^Bx{Ii~7qUlE zs0>n`6L57*$FDfGGb0Z4?~ll&5a_Wk2*dvHt{pyez6{&Ir|sJTB*(ua_Gi2 zzch-v@51M3fsuOm<-y7^T>hNOv*}bm`h1cfe)ge!@4Xkr^BfUrr~#p5MHj(^jw6w! z7G8l7WiTOgLvz(v5@|RrJajJ_np^XzWE9GfhsMH6xd~D_SKNN*2eE69(N}2l;T57< zcs*h9clYLJ>nA^&n(w@9y1W>`U|xZX3=*ESCOX-4*EFwD;1u<|G|`<0JC*|1vL4ia z(BEQmNuv-;=ULv3$6GNSO0|uMV9)4~oB!7a10Op?la^5jMw7f|cu`9;x)ga}E7Us| zQmk-HG77FjA?PuY?_70t&vIH2Z-_{fg~{FNxX5Mo!*7SN{~UYYiqUkRtG62f@dWYC zayE(eb9qK^-q8yvMl<$}{gbMKO?Gls@S53s$#+3e+gqAWFqt6*!)k^dCWyFz2?KCPzx+VQM$osw+a}IBp_`+1sPhVY%T0Jf zI0SF_GE*FJ+FJvqun4C;$53(g;3@$_%M0cDHSO{57!t1?h*mV1=lK9Ckz3>K^*v0` zvSM55zO!}WQ>+_@sxq>W5ayVu_X?5BX=+uvQ>xE2&os6UQ~5nF3`}Z}R(9i@m*Zc5 zCtjdsDhvEDQY&qMw9=mr7`8syH+IiahQ&Df=61?Cx=K2w(nt;Bb28s`_Jyf1{lX=ss`rV z)m%?KQ#(3zyj?F=9YoOJb9a9F7)0ddk`;RDCtY7{u})4-)^eS#&O?h})Cp<{Y<|Iw zCYvqv9x8ovFO?z~V~4f7rb{^Lu{&1n*P<1qS>txNg(~B)WN{pc2D(k}?@@Ki79ClI z@J(HVj zZ7k1Z@Zia+EHAAM?Ay<_+LS zsxSMfa1$O${@LfdY&av#*#zj0zsJ8<*Bdmz0uSbSuznhnTC%sR!+^|9f!tWwWyN#D z&o{rXa$$c2XK@|mZlpyzQoZ^6uO3p=oCl&mdj{Ri`yKm!$T3GptT(#Bz|F7pPLFBv z9bfEX^dY8p9i*=z=$x;-ygfpIWN$gH&b`^?DsA6*{-ducf+r4$ihtC>-K;hDvPX{* zHBAnbEQt_zKLrkGGbS(VT~yy=!jEn!(gB2pjEU9f)I67=A8i~$jUo@*O>j!1<({ox z$_xXE2{ZnT1F68?x5lruKdgIepWR1QEkYK~gE@839Gtx^g&J{FKNqU}hR~uneK;h{ z^|2Ke)6WNXj1Qg)98kQx6BPk0n|EgTr5@Wja6>9ZaJOr6Auoe@dh6~3ULQPp@m8al zr91G)qX{Ny2To0hCGX$slGaPgAO=#St=RDX!)M6(Zb3kfn=tQZ@IbEKx*q<6T+2r0 zv$y5xZj`@%|5EeB@CzA`OQFfS0S3KG_lXQJ`f=U>^PO;nIIwNh91Rf~4By`kuwFw%ekWfqfUU`T%F z+&DdVjMB3}RPSp}$C-J~G1u=>OnI;#2i}g=$6B&f4L5z7Bw)GJ($7)1PgU*A(7HT}!>x~>c z{ZVMERnTRA_rS;_Ha-r4#MaScjHa_Bb>0>MM6(CnTQ-DqV9qdyV2qtXf;7W<>~gv{ z4Sn<4fwkwUbLiWF&xUi{5X>I(oKfSUb;D=tU;>D`4vBui+*oA2zi0l)h9b;^Zl*P= zKmHK0*1njuQ0$R_*2&a6r?P!>l3o;!4q_CtcAJx?FWZ6+Yz4`-X9jDd?QoYHIT#?T zboYzQ$rdRui?Mgqq!L*GRjp>q9JQGc*e>l2)GDy>L}r>Rp1UK8ejX@f6NZzDANv@d zoD3`kT=T=}&Fg$JB4GYCiI&`0_A zIx>+vbel6zMhg|Pn{3%g&n!oRQ#X(H4OR~m@(cmQ4GR4QG_KOMsL_pnyGy0m$4Tz; zej!;c#IQ0dZmTmnX1uv7nOpOIJ@tNUo>-qn zU96$3S6!P_YZ%2l;Gw^{-$&h$`V3`#=S?vjFUsF$`SQg^9-Wqh?dB3)6IY5Tr~>%f zyG+i=4Gd7go+?Yt;lL5jWvIqERD(~|TtJ|=itfyjwdgr@KUcxR;EsWK>j1uCGBHYL z#%=dEIEy^Wx0hAe(AkpNpxwx%OuG+5SG>=T+k*4~1OD1Q8t{|#fdB3{a(v_A9Np^R43=vP%nK+XVG9BaBRM;7j$Wz4M8|7CUUo50*BQ_HUwXl643%wl zUZRfk&ALP%C*>zsh(>a>!``XrrnDcecB9RCM#}}U-+6aSzh>*%0cR*JVaQ`M?-l4n z?d<8Vw|te255~32l^q=i7B$)5yLpx4vC-fS_T~l?a4R3auBuQIH~nkyUXMhC9`62TOKx%yD^STt4`|oi z@k3lAmXi~&YW?}7QSQ2YtZI@hNGt3TsWa!&^ZePs5LL`N%Zc2S)%Bo+(`U~~4d`|URPz$@TSGswN zUDEjW_q0MP*L+%z*~?G-7@J}6`U$`0nR^2b+@*+LG+(GiI$Ai5V0c&p6>PxDM zvgvUBBAl0c!0I})f-k+i6*ONnORFyK@$+EP<)K2D{RLQ16Xtz5e{h9vPcG{A{6176 zV7->B=Pw9v8cE_P^E5Y|t$Ch)p$;DTN;BXoH3erU0aEqKu-jy31f?a#c((hoz2!7q zKKoFegEY^Jb=K0o`^KT&s2b9tQFUPGaWgmLNguB@@B^V1!W~32cTw2%(pr-BnqFmasAg{7 z7%^!Y3||zUT%WA~YevXh7U=q-L>O<#U;OZ?eD_CBpS@+?0>pYqwfG4GA78)0Qq z>B=yXZ26uLjgXM)W~|Q;4R(`8?WDjU4Hx@Aq(z0f5*vb1ToD|(XOS(cFfX$a4Lm`Y z>sUGWKGM=lH>llMQci}@6Aev;Ga?T-m){?UKDlfa=y%}LUJ390%b5=frX1V)So?Q+ zZ;$%^IaN+PibzAQYoQ-kKX~e4gEeGh73l>w^U_C!9G{qcI z+MN(hA9*A|oeg63VI9YnIWdh;;?RpHOviDJ_ocacjS$ELl(WZIV=S|=)})VkoXsRC z+C+pEDOKc9*X%hf-DjEgKEY}t#vturvs!?Nb-Ik!5BDDv=Ob$?YH0v_khBP_f4`!3 zW&Bk_sr>z|*B{8KvYB2K_&Ut!mx47iboYa2CaX=1(wdTsoaV|d(tO~!YGR`3sv1Ja zCbY;7QBCJe08K!$zw6H|A`KgtMo+h%S0e%M{Q|ga;qWfkVd_Xjb#0{nWXzR;hjX%z zEOS$D;2LuH%hqykisb%27jyJaAIGMMO~*y*zR-_T*&9gyJj#qbPB$mOQejz!p;^db zkYkPP-NN&*qG8Ykx_-HO1AYUwVlfdWfmFxfwB7*`&pa;+suqLV9b)`US->*E-*;dr z77dDy36BfFBz`1EEYfAlw>$X~s;l@BgQ zc@a-!-mK8~30N_bQ;a-35$s*c(DWxt%_XoiU|J-UhcMWI>rIF}s$+{;KOiHz%W7xf9aJ`M4KGW|2LE zSa17%@j9oiI9+-1TK`Oo3CRwL($jGJi-l5V*ty4=!LsLAzV|p|O4r?H7;Rlj9q?QS zwneq=KE<4cP?q1JWyJ=6m!E~9TAYED%RXl@ozH|0Wua%7yn%G?-^WehGa zFQJKrL&u&4?HNWwW-990+<93#AV12sv`St;?U31+eT?na^Af=b-E*W)YJ`>Tp+Y_EL1a|u*p!(0U2T+|5x8D) z4ja=cFQb^yJBl4kt`Ew&gs=}#zZUzw-p0#bR4*r!w7>I1b4pFrCdh#(XQ-^Oo<8nh z#>ivZTcIGE8%1Mcuv+}?ZL)_Hv3Y$%R}7@8uoaoh#vjj(Dbr2TG?`{hqr?2dt|j~B z_Q(4`j*-I%O`_Q-vqQ__^sjIB*@}Mjzi}n|@k~Crit-=+>T~(-Pj2LLF8Ph&k>sjR@TLL`7TV|hJmIYO zxY&CkQh%?D!}0FR3lT95DIciQzS{i+!=I7I*|TBQcuR-q*qd>OM}JL7%XEmW*i6}H zcP^ZlT-owb9)-X16+E{VZ&TR2=)2+2?#yWPo)^wnlw9*Ot5~sEdy>1K36apybfJ*o zEs)h*j0cO<%$qeR7xSijWNxrduv3mT1FPld=l*cEgfk3>cO0b7)-fl7&zArU>#V=| z=%Pd+Phk|9Xl_o7Gu*s^TBzqJA0T!^5b|Blr&L*dCrfFhrAg;Osy}N^O{n8n4`)D9 zbN#v4eWc|3<>hN?Y0N@T!C=?GiPGr33V!FSbkBVM1%_6jgNXBc+vOv*2-jLq>}MKg zpd=Qlk4&B=2&L(z2@!a_Q#Om&AHtzppK*wtrRUEayXGR#Rf4$>#hk^Y7uY@HP!qCk z3i|5LLAqZxr(e~LkVd$P$-=?0AzE7#J<;e;( zq5UOFa(wkrKDu7XAOG;N{OR9a$>r*SOee3QqI{orST}K4*>@O}gAijRC6;$YF+GcH z7^aZ%v^Z!j+c{f+;X{ddvZwM}A+euesx)68}^rVIUMgFQ*-=1qip#x&z2cF!D(WuFx`%ac0CU`y3=vUhO%Qqu#2*v*Bv0;jfV z7S|2auh*!u){W_Ynt2~692aVYv9F3J%uVSN4_%oZ?a=LRN4#Ia;o41& zw}QdO;>m!hVpu~`WSh@qefB_p_F|OZ|C`71mp^$?B8_4=vL?)TCE}p`huEJiJ%2sJ zozYqlrSvNM2x52H1lsaoQUlAVB>C?TTSw|DP|wXOkNZxH=t(R+hT6tjKOc>16xRk7 zny@1zL{i=Db?yOIcrGjw1FduChROsT9j4P2Id*UY4*kWUGFPaM-#y#j%q>LEse^Hv z`ilT9~o*@u|V5?R!`E{wkqxU>D`SwHzrx89p+M?0rx|51& z*RFD9OjTwb6v~P1Tpiv3#8D3QlhYM*4cUvw+_7@QLn+2iu4Dx8amQ{X%nkJ=FV=W-xkufItJViaKQ_6$CV*Mc@ z`Mw$`x`;WpJje>LV_vLLKv=*tt)IB5aZu)7Z2cBTAkQ^Q7Ryaw{fZgL;AdY;n){Vo zd?a_7QRcKvy#VVh+zKxo7f1%@VNA2sf=Il^Qw}O7sub;+{nA0sDfhDiQ9vNrnE*wz zfS6Ig7HOJ6agRJ#cq&)#i^V+BEr3uPm~bH+_Y}V9v^Oy7PM- zuRfXOSvV;ee87jm<4coG-e?D~>-6yRJeQ%N-!!|lyyiIQBTUZn2!~I6$0&p#$7doO z|7jHCeed9B3RtFZJyB40+~$C6-pvy z@%WsPcFSt@Cc%E}%JqB6ez5|?g{D!%-~k=zL983+KI&;T%!EGs?tvt97<&rc2dy7` zj#anKHOcyCs&wG;I){Z3)pduo8ykm&=*=cTqqWHt3eVcXaoHRYcNGVx{QLC>=OwR{H8iqUS-#Q`glM;@_qOWv z>iTC-!D-iCZ;{BN8v?_m+-g+7GL&5JmxK^JJX=^$cMwh{GMG73_8OK(&*qzFIW|Hy zm#cFc?}qPqhM07JxBvLNMx7#9qg@xuWXn3v&RB}Ld)APd}F=?3tmb|iph!iD-_>z)O2v}0pv zUSJ3>-M~3FEg-O;MjqZfR4%V^07K)(He|0|=VdZ^Ho5QcO%euWT{c~@>^qAf~$ zmvY7#=~-2H`JFRga4?M|3iPt${Y4DcparY!?Vl6ha|nF~%FC;iw<;C(pV>30l4)6~ zM>fgvG3|S+Yc622`WYRZtzpR851Kwns7yf;I|k5U)7)sJ8AWB|;(pzz_Y5snxb=w5 zBW`T)f$L`Q%`bLfDXg5A0!DO_mkbQ&RxSW`zr8Bq3f}i@9*P`!zDFA zSv+D-96BrgcxH1VSg_iCV$OF`=?^iaz2!^5zRvsVJZ+2Pes;RCw$qV0n&cx!g%O?q z?T+hd6id40j@9HiKXYR3p!Go*23af=c-5V#n(HC;kQ5&zF9+dZg)yp06(4u){iV~I z7X!1hi65=cFCe#}^;b~i5>fbdcd?%*3H8S(8&=syi@NkgLc(7-4yyaID-p)yX)VA1 zgZJbIA5C((d0npLtgPz{BcZEhQzDby%^qH+dbo<3D5b9ouOUvKDr2fKGhBqyVSvyz zUXoi{IQ1E#dxQ@0_2ar6FV77`Dp=C{4h`y=YNQs7eUvMG&%a9#ME4$Po#gX-<})s??AL;)W&0W zVX($Y`>D~w+gM8NZyxLiJq(d6HPm~NTh7N|LO^tr)%VO!9BJ(Wyk@~SF^buSVR1NA zrru2QiYLm?&d%VSk_J6<&*XMbq0a^7Y<*K$0lnL@L*fAXujPY)%P^l=^HJ_tBr(`A z)^&5Z?tIo|_s>Q3Q=zYbR=iXh)_th^ z4b+iOxVL;6D9%GAf#|)kXE$+kH3DiFJ#jsoLpxQ}CARgM1rDdq@5Ur# zWMV{}49PfjpVNGYaR_8%#RJ39lV*I*9Qy2?9bebo2l6@L81LJ6B{p|bi@V+2V{x9jn!vV+7c0HmIQ8gnZ$vZ+@Td@sJl(%7sygMh}kW4Uagudmi}V z#l@ZLXE~P0d`qfUysrt-AU3Dlp|YthFj1A;=1@4sX^-Q{LrLR9`O6=DE`R>Bt-Kh| zWgE|mL0MsOD^*r8#G6aC<{KKH`C8I8FADJ>)iI@3-CD;X+n-dwU()@P;Yr%$YM3D$ zH8RVwYr=!xVQr&rP$zQSyIGQ+c1W$TH6zo>>H?&ZAN2p+Lq;{Z9*lBd%=z+*iExJt zmU>u_#u*wNxxYLKiU_m^E!=40U1JYUTI);Uj=jo;xQsgWs4Q;7wAdiIp4Q=|x23f~vlSDDd!X7^xtK>{H^_XjzC-MY zPg*N8&0W4YF>QcnV9i^M%Ni8a6$O(gK@r!`;n01w&>!#~R^uQ2jj|hEecgT5C*SQA zgG~`zqK%N%?TY69YD_O0pI%b9c{)u4iS;I7vEcFA-0nMM(~Yvvc2(C&1>wqY{rJNt z@;5(zB9|p;xZkMZVCzwhogojR6u%UqCZr1-NpNK;LBEBGy3PaVn9S_t%uoaq_I`6N_EX>4D#Yude6s64sBdblL!r_dXr=LF1}-s zL5}CGUUp%;O#A9^O&~Hd_QrH{wzsgxz95?5-hg)}*48kGJd|96Yoi#;H zCW~&4%oSUAn!p{763zkPCene!xEvc|&k1!DaTV`$#@x;DS{=ZBIC}huA<#r^;maa zrlwo&Zc{$`(dj4;%U{-kQW-0aIZ-ZfnQ$y7?(3sMH-GghZ5(yHM=%>_d6oRp zvC9+q(e86v(7yu>gHRw-BYTC=*TwO0y1H2Y>h$!)ghpp;6c|lo&e>M66_5;8nd%kW z>w%i?$+Uj_>2b8?WkC)-sJN7$m>Y%)jJrEv!r_2sr}J{7PR0N_WZ0^mjg){ZP#w~F z8|rDCsBG|*zSM;re*g))jdz=P@%`=w5UHIBX7ydUTV@$~dOV z4bvYss9;W}{i7St)(T8wB0~ltwGV)pN0j+K&&#U^iKs^@v$1j5lih3J0t4g~4JI>3 zOe%(H|76m5z6}{g7xbJVTF7T4bVe27SVaPvTjKo@t{9B--;NPP1vy&;Zmp9O#UNdX zt{3%8Ik(dXhij0NVmMAq)B!53upl>w22YDsxP2OuloJU+}iIaxyw1xxk*+)?Z=WERU#!ktal2% z8yi`3rPF>dcU^jpsS>*8VP0Hb8)Ow1%DWtQ1`8TRC36HxaADrFA_|%oQ0DCQ1XSYs zdW#4GHZ_<$iFE7GJp_DM7T|!miD9fv7~FtumRyHIS`6D6%yGP@()7sBJ();29 zDF^@RMdGv41w*9{>Weiw34D2GpW$F<#b7sH36joMnYp2gFD4h|;QRVpYx&vLUY@Fq za~?6cI*i(jT2*6%Nqay58&3XE&m_ND{qfFZPE@=O;bm|M36W#2*gW6IOj&yU{QSN9xgUa-&0fgbIk z*=gl@80%(%aSE(k$-xc1t+!h2Cd8EON?lF^Y?(-WH^39^^{8l&Ayp!I5$(|nrS*s= zJB`n_>RNsFJyd%I-r4qM2ZO2+38M$Rn!I?MbKNQGvDbbJIE$Bzs%|93Ek3>RP+?&G zyd7NWAe(Y1=zZ*woVK10Ms?PGw%)9a>dqWU-HUc0XL~;NA_?!z?B=Lib2F8DH4@(L zcWA+|n=;l%&;)tH>3MW*a;0^f@$mQeMA3b)5*9FBgK@RGd{ge`>u+Ajx!jb9qa3xtUBuOhw%RY_#3hyzNM++WIWPx#_#5?sTm< z1O;inWVt5+oU6anH4aBbKUX^_Ld25qnY)N0492*N2YEeXf$17iwdj*_M(FEqO0IFg z-yJ@8o3y&c%xY&L?!c(@ci zLEVzD)|7s;Z_2}O#!3FwZ@eX|lR+N;>2ukt6iXSw8)c-R{prAHAl;GM$!UQN zgSlaOfricV01CY=4om)gKdx;Y(!KCryAhGrMeX=Jc+UmDSBhqG(f9r2lhJZ@5s{S8 zXu0#(>cZ_W;&>}ZFuiYGpSExkCScaiee?2O#&38gLf;Y#i z2ula4Mc85q<*JvK?63%Zo`vgGU$5&m868)9ZcGOT_f@XetVb6BX}9{XUh&$W&z&qC zW9`KQFSF35-aM0{w%v)h1`x! z1=jG;a>t0|r|FI(I~)070LyOLPlkSYB(66;B9H12);v@D4N~%^?7(JF-KW>E)S8}D zc7<-7LuN{73!s1hp@Hz+geS)6^)4Zc5SkF9FZdQ!glg1=uK&ipcBmc%{6{S$R70bA zj6?$y`}?;LzlP6Zo`+C~aGkH^>lY{TU;o%&T((}^s+zv(lc=}Jobmr zc7IC<5fs1BlKy>U5)bsXAbT_9nxGY1q_eS+5M^31Ae24*-(ql^ixxUe5{F6*$jQ}2 zr5X!7!{m{JkuGwZ<2DYa(Um%iYL|23dQMd;-1~ZImX;BQ}4UP{YH5I6=a4m@d19BZ}zzlG z{?R{kW?fUVvq0w#1}serJtcr}gA0ptrO&2?<;i&-fIZ|FtHHo}up&TLmo}D2__rTebUK3zKVSN%i3O^!O7Hf!T7L+157yJ}Qot zX-vY*HKMkGPF=3^>XJC_nD`;B@*TTfS(o}b8vV`|p^R;RWP4tBg!nnhNEznH=3GH$ zvB(GO+*<8wx4^hKZ#!d~S+fGs&LJ+(=WJ)2p+ml}6y}=uP0~eoqr$_Q6z|VueBKQ2 zlY2W@!o0scR0H<9pLx*Q!=@fK35P}_FaEoDVU3-A@zAqHzim_PJoKs?Wq4VI9<8$3 z?^UF|c0r{SZ}dWQFx#ZCo?)WYKy(fc?-6|)%HI^)3Q>%C#ISl*-0OATO4vP>ubn=U z|Mh?Qj)cwU@`pdYl8?&*zR{l4U^R?T9;Np%RwR$h;clE@!Y4qd2w z1qX>8yNpI=!3@*-AFW)>M&Y3spEe5zD`Up5wV=UEi>W0puKObXX zf1bAqHR|OXT$R>4JbDo%^I(pV0;FrjQ(iL<`MhKS7mRorj7^s28tee&7Cb$}p z+)sedPtH}S&*xNMsR?@Z(ltl0of4cOh<*mvQ1}6a_1FOc&WxN7DAIt#WWLj>>A8HN zg9yDaw7XeB>(eq0=fzu|}+_oKc6V9j9PTu&jVOF=}wytr~FEG1)>sN2>C$=C&XVn_RY~Js}I= zb?lZ2?a`nk(6|$wDvx|+Saz!HKd|Oj-Ki9^+oJ7fvzvBa4mFBpx5A0JugH1T+N2og zI=9-m4{Wr3g{|)PSbtGhFD>DRkISa(6)eZ%9^$bfA8bWmc=*wS{hY!9|4uwzTfBeC7`M7u; zS7pPkP979PRWNeX&l;r}0{*f4t_^4C{WIj%?_UZJh9mPs+A1f1k}nR8h*0dNO1u*IXLIzMP#X~ zP&uwjo{&2O(3kG*Ixf%au#=3^L?8TS4zwg_Z7kxQy?gR*RsIH;PJa-ufdgIhI zvMBBlLe6>N-1RU@2FbN1q-0d^MV4wbWJtRL=D%WJZonTh>P8 ziuM?fJ^m|ldb*LDslc^+9?T{KW>olG2{hpqj@)U_h}Mm~-fNokE4}xwE8E-_n07Gz|fOQZD72|HE$zVNn}@dZB68v=x$+o8>l?A17fwJ`~WMsSw%|PnZJ)r z1862?_WRXIJ1L$7q#bY?l`#2qz@(n8COJu;$**0U$^YrU`iA`SyU*p{|LITUd!O#* z+4fm6(dQD@XJuUJ(Yx59uHV^1$t+dk!&~aAw+4yy)C{C79R21g#-TI79fn=$zy|vz z3;lggdml}|TNe#gm8l!AUwyT|=6Ks;K@=6)uDG?W4Pc^pWpYl-L&Wb#FFiz8u8m^} z!_g9eL)_4V4rXBXY#AD(v3&X-9QIu?gvDG()1yG|l1zpO;HA*=8KbRbEgB6`7We25 z&N5jm6^G`*ZFMWxHwJgCVeD1w#}6!iW`MMe8xB;D8`Y7A@ofi*!RA<9;_TjIB($k) zz7YxxTRU8XQCDMuaZc$8&+bL1WiN6YpV?@nBXqv3myWfWRc6$6ag27FZ#JopR6TP3 z0i34E<#A|*kdloh7%Qah((-Qb;5m<0KxnhJ=s6QekO&52=9v^)2t}#`R{mX%Wclj( zO5QC|$Exg2buBK=Pm4#cSp6O(52a)17!BF;0z7+0qa_a`TOI?V1Erh!9du9Be%)~d zQ;IEg%QvXhkh&h4aE{db3br2)YdZTg$E53IK6m3J)41*BScUc?QCrcdrPKUQ*9^_%j?@lE)fV7_8&X601)>4y) zIU}iDqpNO=@^T7eFm=~toz7&YzLp)d@VHDNAeaY-?rFW);1DZhlv1mT*FVe^#Et?@ zc1o%WwN|sD@DgxfdRls4>v33k?89hADO-<<#DVeg@){v*nu+VqVJrQd6{KPIE#DE0 zp<{Tmd;WfOR-8D6N(z`ESVD+#w*C% z!^FK3n8r#y#0O=4o!Gs4{>$f%IqggUl{DkP z5V^stxzDlXnm_S817c{4Sdox5l7zqIE&>Ga&gwn_6Tf59dX=a0THMMnzqXdQwC+}^ zq?)u?3nd&ip`SRHkPjbXWfMQMNbQd@cdH z&xR1Dc}F8#JvY0E84^kXGs%J9?2y3HJG<-h@Y{0^iy}C@J=h|WiYxcHDKL12D-=6D zz*FnTWRXrt6nC_ET{jccG}q!b9ke`C1|-_v3f;u{;iy=;;-upg%^2*FRMW}2I6Wy7 za)Zg)te(oFvbg`ncixZ(4^HI2`=d|fyC3NUt&j(qpmlUj!)P9udY{Zar3GB~GJ8DO zSRQst>|v*#-NTL8vB`!`vN`42F_B|5S>-7=MQmZ2c}JX2-E=$CYdU0ndEy>;cVK;l z8_*b=XDNfxln*?KJE9nJ-$73E?IO)OV6x1AEbmsT zQK<0%_l7x^_P%cX^MM@t!KeAJ`U-l20~yR0Wdi92M=z5y4+`7JG@H(mk&U^58SM)l zzPiS^*^3e60Xqq6URz_e)V(A(U3-W$ARh&&fzoUT-i=&TN-24EpxHGmt9bn zD8^ta`|GqE{0d~gdlKcFZ(qpk=cAnLim@oa!|fJ~K4jKqA+KfKC0kC5v=ua33+{jt zPDE98WHY)Dy_JOC0i6i_4Agu??%BIOqG=2siQSf;;qPNp@O_nw2Sby1*c}|A3Y%QMQ0nbmcvA=nb&KT=vV`On)DfqqcR(0Csyad zz%N$=u(En0V2#$EKpmnTY7zuJ)D^3Dwo-qegnhWKSW6IFWZXG$JP1>zdOK=y^ei|W zy3D!;H8cvF3?;vKl6UgWx7PCO-*~&gRZogHTn=JHW4jV5O^B2gW@^!+LWDlv8ud?A zJaxOxt2M9GTmQ zZ2qR_O_q+e6sR@;2z1XrE?W0Qx^UkpkMP}4Df8YQJT8b!-WbZ$1b0!x?@BO0W+k{> ziqz-TinjHdk%>pbKp8qlqt~_Iw2iT0XWnp#jnKvN6;czDJQT!A??avRe$%=KLabQo zVT|#QE=Q0TVeHAub^T{pY*=rj6dooJy$6MaAjjI|M$^tgv6{GIC7C$7e{^uPs1GWm zLe|5{3AJTzZm79)wrMaH8EAryrwLz3ZfN+Yn)tGnLBqwe(0`{S(qI3V-;^(X_XGKV ze($M#UJ~gFRb6XHtczSR@4@?OcM=V10A{jOhLy=_gvLVgh@)bhxqsGJ7q?4|RMth1 z>h1Q>fm4*-D}={pI6b6Od>sd3ywPAt-AF4-7J~yG8e}q?JP27O?LK`icoK4PFopi! z+Im8N>p&Pt3#01u>+e%-an;Q-_jc?KqJ9F zn~*4BJbU&wIqg{;0uosq(Dac-`d&!v8NouMAPH#UJus z`@zCct)N!JupYGH`?5s!S$^kN-j>%^<)EHk5VBOvcT$LkLV~V19|H5I=nxDO{32-|svHVsbjpyS~ZHT!Ze<9e(@s&)L3 zyU7q|+!{mAEBJXRXY^djrlI960p{72E(j+>0XNX`b>~OnrD1S5S|~psr51iVc>{YV zcmbjox{}$)PKmif&g^-#$C(f9v3)`$qDFeM=75_Oqg=g44@{kI2COhxQZ_C{yqpf3 z($agc@Kaj{_4Te^>F=$0wCVpRt0C#>sjeuCL%LJ8Tzp}7Pj_7*v`yfi1nH2dKC750 zKZCC)UDb@EPD(H?eI$&cYNgjVlucIn2KT0T>vjhZ<4jBUU%V&ZI)6j{FaPozC0hBh z{M+w6mrt&ge&<}+VYIB_>F23~zNWNzrZk#l zOIY)xQZ~XwTz-UK$E3{|lXKIpj1*+z*>G3gqQSd&l@%d8TQ)To@sSoI{_q6^TMX!Ftulh zL4M^+59Rgs4*M&WahRqXB)?JcuJ@tErkq$nS*#aAotxBde;PdrTWf0s z?PpA~dM~H#Ldt#=kS-vtZZac^@8yAW0@t+cr#uwdd@^u$9Tn}N3zUDD>(H$ zRjfHX&~YQlDacTH!7~vWfgwW zE81Z7-cE05zBq1R-Ce!3NC#gR z9h`0EFtprXnOJdnCKtsv{Gb2TFUdRaek%X=PgI5X3K9w@@qtVQ%XMK8XCT3Kn5eab z+=H}3i)4ay^jUka-7)Dq$0T=!mv$%)R+DgeYBV-X07K02*<{iOp371;&=A;%dP;pY ztN$&+utL%x5{f)(@cSZESTlsUBGMw;5D!5|E_y$V?!AKbjgPFJW!;1&Q>}(0r9+1V zH-f)GLDznyc=TNtV8X6FZ*LscIQ3Cj1P)y`)gl&OTKho?)~~nd8U%kHKGj24N909=~#FU5IuBKwmlrJ z=4!&6drb!;`IV4eIOFxB!=KjTSs^6=%#qFJrkV9KDy+KO^`r*o^RBNG`T?OufRROD zaBfU0MHD(D>&nqSH7Kn{X&HIMVtXhEOYFA+4gTEW z=YG(lKY|}(ya%$AEODp{tGR#p947;yeQ25HZJBW8kJlt`qURy=wtQZq*P|3cO{V8P z#%r(wug$2FtC;`i@^;?J|Mu4(m1N%o`44~ftQe6`=|QR%5lITjO-DC_xG$8x|sgx@bVxgC@yU2bu*nY$*nP!zE?jE zp|gAL@WgC0W$W4&#BwHtB2?SQQKgic_eDe99j={Wpf(v*Y4zYk!rRy^TsN$^4aPLl zg3e&hJB*q)95M$Ypfa5b0Ia?pc~A{TfwY2Ek4BSi`-Iz2g)buk{8GZ_qCLJ6UGJ%;y>SG}S< zIfhM-H^VrsQ3wda6%_wiWZ4XzbO%uf1DcI!Y{u9{>fIIiyTMqMi^Tt7#ED2}unKm~ z*C;%#MpyGX1-1%X`9_I4{@FKQlXv2kj91Ufl(ABMRT9;^8#0&JizB1Q46E~tm%JGb zn-3Dqfd^bZr)pGjc!KC3nJ_lr5(JEyW2Wn2Z***(I#1VIr>9Sr2V#>k zu}+%%DH(#`u(Tk85bHq$yX{I5W_bOqQ5|a7flM|b?loGA0I;fT&CNt99K9e)VKpkD zDRZnGT25Zn>BXqIN(Q;Z?nc;+4m8|Wto=gMtH{X)Y?W-_2BTF5^ZJ0_>i=m1D}<`8 zgYIXec}L2t_au~BuF?A!WV3QDk7Db~3`rndke7~fsDs#f+WH_lce$54ym0q`%!qjV zQ`cXLR=1#`R^0Eao(v$2!Q`C>x&k+bJNox1_IJ7(pi!d}NNEv@M(VeXBSp}nsS_hH zu9LNWD(C4+e&daI<&EEdN51sNx%`Je|C#*353c1>6J|5VZ=MWKk35-!K?zP)sCj~J zpxoFxre87tAT`H?*M(sbm84F9&!>Rj!s^*7K@-{m-{hp};i4Wkxp(Yt)XbWjY@VuH zk!;4MGVH=a2(SOH_9IvbCV%k(Ci`L+>t$VnUhrB(erWkSTfUC9Lwgeybc%T}Qh?WR zXi{^sB0iVh8-q;X#QP9Kx!|D=rifZyZ|kDi9xxqv-`SVFjVTlys$xJJ^I(VX zDo}dlLA_3u9ARybQ}XLKAFwVLzYAS;e9pBK zW$(bnIJ5&xj!5Rffr<7EY<5Mf%l;@(xt^}&wM~|9zjZ3#c$DQVy(rJbg+(83#+YC( z8JJNaR?nKj>V5D8BXSK;T?T_nXzUdU(G3joL_su$&KqUi5SeWY1bx0nP5~_i%3-H_ z+zaFoi9j=tW1;`uY76I7-@WA&K_D>03mJBe;Ho^47`zvnsxCah*w{IMriKWk zP_b&y`b)Nlh!sMp%q#mZio60Tg!if9CKKZt#wMG6*X8h;7bHy5PIm>H+CzsQSo*2UhW{%Bz9BEJl-ja9Q}%jejSb?Wm{n;Nk?ueVSO)yoU{h z$yFGRI%yt6iUE01K5r*q`|UU7pa04?xBH~6 z>?GE0-j}bs;}fz=trO-W6V4EhI#0TX%v&t?b5@MT>E;CXRoB@twz{U}XS0q4d&Tx4 zB}XRNDNKPs=-9zTxwTmsEW)_&zV8|@>_2tTx{i3EJ;9Lypk>a%Uqe%-xVjpBUB{>8 zmuKZ5|MfRd%FdR zh4Ucg39na;ER8I58gx!yJln$9=vk0h%?AUe3b@5*#2BjKSt&vR0t}6c9^R^PD zKo1*N*7kL!Yh@OPWM49B2V>|C#vSM7Js+X@m%hU*$H@A(&pmkw|7&-d(W%uVeLYXK zbivm;A`etH2Zl6@p1Ag3$dYT9ydhQwlv?4F(+w8v_4Rd4`YAJp)wtA&VooKr+Ndnm z(0HH_jT(IH*=v!OKiGY%+`Pt>^%zFZBLxemxw)cFC=^|lj=Zf=mwF=^RJ8#;AtqG9 z2mE~)_JF057F6vOs=FaIuwdUO8>{3F&5!|#TCuTCDiO$tg0|=KYp*?!FaMJ_<*RRA z$iMyLkL8blbSXc1`dnVblY)(Ir0?l?m*MbgXGBw8F&pzDImYc|6}t!Z5w*xG#yUTk zV^7lhpWIXjhK>R)Rlv?+w05B8+*Ml}#_H9>en=_AB@TDQTzTpCz(S~t#e4|nGd-<- zBzoYgkL<{ns*$D0V(ZZo7}kjAma;`1z8|qJ(O-pej{b6=Tfu4e7v(wNNhG0j$8T=EAk(*y*%! zaIu%DIACkla^bKW{x$G|=C&Y`b=cAe9;9h;ZB5z(8b32(5Ej{(b@I)c2sX0c1vT}Z z5#ZcpZ{z5CFBK^^=n3)}dQuNkql}yz+vawpVr;PPps4Da(n7nzAh+4@MsEZ~F)*^j zZf>@`CxgkxH34-zPoM<{V{qoC1RKI3Ch^6@{^gp>SQj%r$upU+pUHWABES9h0%N`Y zb@_+yZRP*^yFZn`{NP0yhmuSmPRr-T+IOR^87{QiW1`awTfR{0f$aUt{UR1^avTHu zt1m_`=PIEPq(zkd+HLaYCKBjp16B(|VO@l3I9UYA{(1HA$kL)wV^6jF<98~)3f52; zHT5$+p+b15&)P>x(W5>yy!4U>z*CDuFLpVi*y?Sn!=%p*_U_`2z+*K7xj-ZPx6z+^EtvPH^(--=hPxy2F5%c03k(d0(~AW4oLCh@vtvG2 z^bDDbgT01R${seMLdS#EQFsxp7yTcE0PV`jj7@ImlH^*Xn5+TWVOawlAbosmHS3Na zS*Qv1Ev~XKj?Tg|`E`?z0=Wn*&fGa|8hIG@EBT(7r`~_6$uM64n3|#S{2eM`MK{Co z{*(Jd5v(PHPL5Xj{+w6JUME59SnxP4>twEo_H4=9IH z#~>$5KF*ca-C_skR`}PjK$Bcu86tFIG8+8!#qwO?@ZHx%+$gffUC&GkdgCK*y4l9< z{&iO6)71mjY-@7ZlrWD&F8b^o&q3lrkzx{pd|Hjb;6?3l!o$n_)rHtyL zdHLL@DkY-7N5{L__8cr`v~?gf05in^uQkz*0$5}ECaw2c%jMM$Mr8u2AfmsC1mBZf z|9ZgQY^f2Z`$f+VR_W_YgF%ywPOdJmTt~_mv4DN?s-!fk3*I5nLES*MX;ep9vy+8N89KZ$h-lgq`M`wY2PGoJ>wz88ghHzQO{1#f!bO>HRWn&6Qb#!I`w5 zacdGZTcotz&PL^7 z%HpGA=S~5l&ZTnkY|OY;aoUh>KxLMnN=7)qCWXdXpQvAYM}DD(Lwknkr_F3Z)NZPK z28BmEJ*9eYj^m@seu6PyjcYR?u5A=5hPxO$vtqpyGh5LgAS)B>a}S=f8-g{&dK|{} zIXe~|e8AhcKm~V=q@=^YfUE)!185(WwWRXuB;r_a?O~|-AVNVsHerqh*7R)fQ2;Y+ z0$IdZb$ZXiYACwwL_fC+!#dA3&v^)G9lIPrnX|)H;f~h?z(@458SxL9%)xcu$*;Z} zle6l=bmk%gZd;x$yEN;UZf z_T$X8Fhn~4xW6z#M@`eY)FGs5fg&^Bw`b%HCoJq?)j|?_jmybb!@&c=>K$}IMJmMM zFats|^Nuqpzsr(&uX==J!ZhF75W(K3Yj=USi&$TT)TEwG69yi!!&BJrWwRR>9|baE z{AP_dGJ6aw)TCaEZvOpFMG7+&Kr_`RRSfO)WK|5x7WV?0?m#NwY8VXo43subOmx@c zGZmcEdsFrcMEZ1NtEZI>M_vlW46gR&qwKhq(qSMC}&sqq{sN*78Z*7HJvA8(LB zK(wX%2du5gdJd-udySK>r*R}Z34NjGrbz^;n>E)0=Zk6s_#X4FXWMUnl4H-oGUWQ~ zQ1mS?+$m#lX2jt9{w!_*=n*R%Jc4RJRLtEqy6`GfX29P=I}@M@W!3h+?=f|Q?J>;9 zxbSOg_e#&B8ChO|U(nmbRyO&%L>pQDkN@Z^@~sCYPjmIToR)o{PTFPJhnhzjhYfNa z*`h%`!>+Ft{w6lBMuTwTfI5wnlSgPTOL{mDN|ip+%JcPxP8h22g?++xu2lNP;V)&n zU0rTV6q3NE;_zq7X;J4*KX0<));LU%dC{5@%Jg`Rniy8s=L)8>QDNWlxh}W0-5_J;Dw% z2A7M^?pwdkh&^aAD>XuA@;5aH;!1Ja;Z1oyJ(T~~AN-~KyWjh%yx0JHK!m?PlCWa- z9W2Ti+ICi2pN!(ga5(ITE<_cSq;Tv!(|9QA_XC0b>(=-X3IK;|K)Ok@4{LoRW z@5v47Ameew7<+G!FLY(okAgugW1|IpWqo|(QIP-DH{Ou%ynZh6>Z9V++{p8rB$tUt z=W2C=N^+|2?{H{qlyP>p!M&*A0PM2T=$LTT=bt|}&9+h43OQp;;7H8;187Q-gp-j4 zhe3rix1i-KOs&i{eOwLnqbZL^o6p($Vni?MRrd!_#%S-x<5~a7?VE z!C^5#a`WB$E~iGrccUK-57hNTseSginM})#mHw2Ww@>kzg>h4&z{$pXx$oKAMbCud zBU@CLP?iA4M;$7wpdJr_Ngn7%sSLxbq(bh!QeHAMTpx(??ACzZl70CVzRcB8hiKln zCB0o{qkiv9=9G^W&K{$TCiCisAyjA$2_r0=31KNWY(nvo8j1A@2iK*YA=LqoCmMXj z1&d8(*;CZFs0W}CfQIT?&!KD!Y~JGGoW3J}_-CKXzxjjr4yX~sjnP8LYcRxCBtB&ts$b4=23QqTV+Rxo>Z3UJgIt>4G1HJS=B$}QOt zkt(!D4<^|m%1D0;WUJZY>&h9MN*!w}euC{rA8SNf!;0bD@Q86?oF9 z>HV$7a0@vKPRCEJIIZuWbJyk1nNiy?S3*LMtH10*bx9_NE(b>83L}qcCvTTT^l!d( zF2DViH$+3pw_l4d)VBspPcRF^B}k2(+@#K^N~tw$n9tdT7Oq74v3GV4wDh-@Mv z60HW;wZ@K}0>?CWf$|dJYzgZ7G>F+>C(C5CZ1R*1un$UDXXgYH4H{m z&J-L&=w^m4u=ogtOaqOpb|a+W5IYDxtYkr>UTYN(EV%_#mMYr^z;l6@#xvP%-ju(1 z|3?1%KmJ61`fQNP;Z!EzbTje;fCaEY##(p>RK~nqCX4JV`E*2QvIzy+pB{>EuLl^Y zRW&Ct&2s&qxjNH+fQ5$Xi+S#eLV?+ za42!`Y#Kz`BLnN-s^i5VL##(*d zE_2#4a~b-Xh(b&mL4ORG-1Y}MB{rvoM;B$|C(EBAVyXInomX^lIr_qFH&&I9Ch=rY zS{yn!+E}%j(XLC*upRhh#)6O;RU4-2km&h0A}U%_$FBSzwV!id++VdFa`#nv?$TZt zk0e2T06Z6P*L(1AhY8}?jDgt~JE)gE%`0Mb;5|kOR=^%4R$8Xupkz0-T=iY}1qKrg z3^7^c!}n5(BiH*O!^)T?X|}^75SQ|M7Jk=Y3q})WkdiL{z8)^*hc8z0-~HZu@@Mbe z$cy}1F&rva5|E?{`2K7?OGf{+@;y6yB3ZbgT<{r^DgAx&(Cd3c=)E(d3Nzt@+IcWj zvq};VqSbtF z%)Q^a)0t~iEUn2AIu=lrQbhw3vCJl8;g#b4k(1Fcy`tHTUK=2((Bgs-M+?V7S&OafvJ;52A3Ra)x!S028`(c!S z`RiYnUwi#TPG5W~`NfT-vodbu1V?Jtq^;Z(7)cY^6A#vMFPiI6Cu_aY!+HQD6bwdG zs`yYKIzxy|ra+S`@26zn#?|GQa^LE;V-soh;IyJ~coE78~L?%BI z83)VoweyNI0|999Q}A4SQJ+`@7R^(&0%VVYUZxN^Vd+c_u0#l<$H8ZAy=rwVZ3 zgdASEcVfDSa7rr=+%Cy$hqM1+TwwT1=f>r)Ne}KRuhJsm$Wf%0Tds}>iq_^s_o@FX zGq^!(4Q`-Ig#ZaT9*qzwH&3QfsP!?B!Jb?64WG|o2q0~_7szBJ5{wi;Bj27uJz3UH zWOH#zi-vTI8hQv>?xiY#R#&S#yxh43v@RhNARQgBPnRUrkwXKA!Wy< zXwid`2-bM^G?>wuP32WW4VQV}CTUY;=575*0BK>)<`jrE978^6+HY=8U_xX!x+wW1N^OZ@9&fTMX6>&Dpk2wI%bB1Rbhekuicvx~e_(HEI zTdYaqDY?pa>kyh3ceK1mKZ+s9k!MIDUgR5jv*bGd;g=rCufA2H?x#qsEUCD-C`!sXR$b%>wMtH(=n`(q*NH(onciQh*m6!Tn$pvEP&QaqmA`u zO%|s)_H08NI-!D;8&qHi)ZAIoeo=VSp+oJVRB2~YMe2NUp^(eujioPgIvk-$&tP}6 zH?P=8!Pyg4qzfjwV?yzJL86U@uNlV(h>Q#?(0+X&MymEYmVS1&Mot45>2`(?WbX-k zqaElF`S;?Nv4!bTz_({%Oh!eeI}poFXTF$BheSb7SAFkKsN2SWwK7` zeMYyU<|JBzR;ubQBM{Fo;2EP=pUYy5ZFWSe57^?5!I~6E&HcrGu9sM*y5}QV)c(|0VoHa4T`*mh(%-r zI%PUpAlN*a@iADgR|OzDj*#bF#$y=G00#G(BaJGbr0wJSB*|tY7&VlvGxsxWc+EM> zivc^_XAU18cpzfpvi>6eI1}Q9hHjbD*H{jVztYo6j`3c`j#CdA>Zb1`N?4)(v&S zMqAr4XStmm5Jt5+ljT{pCQ)-on&=mE)X+V1U`}^(=O?#bKui_19!JPu=-NcCkgP(D zps3tCBQmCAK9{JiM1(okvmI=!5!&{X@$fy-IS8A@?{UM272v(HZMFlsuAzGw7;Qj$ zxL}@Bhn40!d4yPJtKJmxYD=*L!0}k8Q;t@bfU`JS5lrr|ec=H{D%}KVN*PxASqek7 z!X2aJC4MfDt8naD+*oiIdg@adA$v>yUWXI;;8~V`_n&?u-+#YM#L1?>R4a*K2GfJ_ zp5Kf>62$B1J-TG_P$Mcg*po3NX`*`rhK`ZS(TpoODUjQZ;+@Jq zSLTH#gv*#-sEYD1qeB}o+hFIsdZuy3f;}Y-EFy_ep&f`~o5860ELAVYhHNf<1=%u= z4!`N;BjqedoV5i*i(c2kc;)Utx&OT8IKf#231qASqV72KSO0I<7~80v`ZU$(U@&9v zQAMH-c=x?R;XX0rcIT7X!S8vb6q*`y;P=8PnIR8uH0}PJLeBS+GEWoTBL(-fshoJ> z&)qkS^6$_WC|0iXsej&h{WbZ=zxgY2^W+ox;OdD?<4zubb}3(a{Y);(zEBOZ>#LHN zD2Cxoo2Zq)pPjAf*zlah@A15uwHu7$a*foYks3npJaxA=7$Q=mi-`=Y!ALOC;$%Z<%GNZFb%g~P#$9zB$UagwAt-cl-WBMA^9rH}QFW6{}>v4GPDIE|^dP6J8dxlj{ zFr2&1IUdw@9A3eGeyblq&Q-T5&kRAKTIr4IL#UD=%yUrwn1yOQcpxicxPOYxt915| z{?Ra2wdqw~NS_Z4b`qr{7*WM461F)}sgQlsU=uj7m9*3iWn%=rq!upoOB--=+2~6<&#&YMN|7j+_AWh zVW-l=lj5El4;JP7W8YyAVXgWt&Z zSIImpu?q6Uf>6OhNhf84p48_3TV$YXZ}DtyC~Sxj0o%OT0+Sj+9C+>itTl;PA+2CT z5bA5%Yg-FoWzb>F4GM6hw;Wy$#Oc`?9W4}|HL?Mdk5hMVUA*81CFIVi-RB(GZ=-2o zdDNF3=9HSV${iMx&4}W?Dc2eTkBXcjhv+unZI*{PcDa^jY;82_y*W|ktM9%e7bPM7 zpTGBgd35ta-Y%d2ByZ&#?_S80>rp=a_)~f7(YiP*7bW_*lIyZZ*CQ$P5H95uSwUaK z{#WPh$HRUv}3Ot-eP;SNEwN+p54Fg z*KVZAAgA&K^Emz{hr0ZKY(K`>jB;+eVtTP?H&-TD3?66N8p8J_z*~OxjuhBd=4dc6 z-Z>8Cf3+pIj_pR(b-~svWAANf^%W`ts1KlrD!+7Q9fkVL3v1Tv^pN^DTcU6DYT!;R z&qlEuL<>5jRGD;rFebHwp%A2m?UHK|(ejbL8y64moxnipWY?-X5#Ezmsgo}D$4?Jn zR5_IxY?G0Ul!$@ec9F~;#2gg)bkH2w7ui0`aty5BbQmC7b*N6tS%G?9m%sZU%kO{h zT7L3uB{!!RlpB{|2Xs?erGoDumzU2=5^PPGieM}x^)74y(KuQz=GF%3jYnKYOvyY_ zJ1o)b+2AjaJXra^r}I$$Y{oSVmP#?~cb9TeFuX_QHRlh{OGH+d(3)W$g>8A7Yb7ue z%_WN17L4~A1yoyb=-d6R%VK<3K6?#VKz|=hvV2&Ri3B#1VzOa_Il;Y()f{NZZO~jW zrdYNRU5&CwfIQqI-7MbkcCrGLDzuZew1eO-2W5RVWKBb@$k`2TK=W6e0!XUTUD*z5QQGYlePB#K-| z#_|kmH1DYq$dc~1D|z{kb;(IwoNw@4fA{_eBF{gUHop_X(bCU2u=XZs z7|qj%e1cIO=U1#WKD<&_4hDW9q@#ra$CI*ZR&EesWQy{XQP=8 zyn}t+G!al7wW(a}t@b53m|}j{D2@z!mo$eqDqR%`2eY^)IT9=3i5n;;shBekl=A+4 zTFGb62l?(_e=0xzEX#I$AUAomP21PX@O~=Z8e7X!_rjq|(-q@o|6LZj*D?Jfml}xK zD`&|;2fY+bE|GWMypVtPo8OUdfAy>Km3Q7mUz4acFVPaenI7!rx3$aVSMrE=}l4LmW8bWT=lj473B_gt)jY$POYwM(2ot8NU? z6`4aLh0}VxNT_4hU)i3|&*Hl-s2_w_DZH%CHO1EK2W9Bss^xc3dc})TXXM>()j?#| zSclZ-K79Cn&If};_`ok?K88MuppLy%?^S^I(oRs_7>CX$Cck=K}`O$|@%bJ+w8(%puhh2%*RM%=%_I&y7%c~p1 z_7AL5o#YNyFx$mP9FJiri> z!O=RQ13>2R?2W^+rmj9;X04Ydx8dk3Rkxc*zwkR>XSUBh1wh(2<#BXeH`>1_r;2c> zQ_RT6*jB6J?Pg0(65pZ(F9hwpdJ^o6;R_F5kFO=$&@+^+}IA* zBrA2$-e8CMY%PF&VbdF5h+@dgF2{}!e}>$TCLV=_fQkhTimR6ISeM20zyH_&3;A#V z)jyYC{>qnR4W-WVr$inKEvzDYUpQQ#bD+k5KdAuSELYnbxw^cRXV0F?r=NT(?|t@E ze*E#JJTAuM$&)8EE>9kp*XtTlDd|(opJ8Syq=Uw9TCj#lIe>b(pJ_CZrvdSSd6PaO zsL^NFlnB48(SX=G8?Xix|3#I$VbX3mLa#aGevyc20kOvlg%f8h-V&+I!sxbd2K`ly zix&_O1k50=mti+P6lnN>b( z_p$vL{V21^#!m8uZqSV(i zH_>{IdRO>Rgr)6w!Zgv=7_1b1F3N7=Ed$MSorHjnpZMD|I;32FA!uRh7AwFj&uTJMaDFtv8%O#lk{CZ3{953Nom%Q7x`hg=uHz(ljE} z8WpGjtC3S@Ragx^u9kThb?#>?_SCP?WBTl54G0d*MohyDC>Dl59rnJK1(64D8r=nr z@u+(#&#Yq$KB9rJwi_}~b#Jz8g5mVzlHP*JWW{m(R6Lm{(S7 zlPvkuyn1@l9s$^xt*E$r9yN!eje~ITiOJ!txPFT3LCqqC#1h9F zkyT{>7S&s#U?Rovc;7=kSbV&3wyI~ky_SphS@Du*H6OAmp7c1D&)Du@UIv9+tm0SU zIP^d$5%MZpq8&O{8Q!(l0%>HIAj3K#x3nqidAYCCGFGQ0GS<$W+Tl(Q7_Ec2 z(1QRcGSyPoBk98G3~3j_(R%AZ#>du|QpdODd7l&r>GAcAeER&VB&y5$+?V;3a?hG8 z3Zn{xlsr|!SRfCUTOC7BTByVYn_YL16BM@%IndrDi7Z0>ELC)lWxk$Ysru`UT$DBW zm3QAL=xk%~I0p%NK*_N5Y`7x?ys z`7*_?P*R}ht}vQz#mn}6R%Mv3?%etZAsDxIFCd`upL(d+KiNgbweE;+B%$LMhcgOrZzg-8QWvDb5kfmG zGVJ@U<0$i9(XhhFoF(F-@Zd)p4KQcs2|R5r9E?VfRjFq!3{tOGwXA5x+oB47f1EAm zUbLR0Y`$`|$otPm`P1*0!|%CbyI_Ks*GvX{u%HK6;%e0(i^Ukkr1 zKKk%edHnhFVq6}VXytQxR-)5qDo3Hiu-{w0A_2zI$eB%p^n3N*M>YV`*AC3NU`-fI z=5RUu<=iWh3X^@*63 zRz1S`>m3j!kQ7fqe(Ax(^6J-%k>1H?PoK+Y#Ss7S@lGCZC%G(+)3qf_lX=xjP8ivO z(_}HMo@!_eyIKm*K@zX?aUDF*D-Ne?rAo;9dM}U4Jbd}lMRD>b*%ilZe)L*#3ZBd3 zGS|g~$ZMx3C{$JF4akCe>tk5tFY^l zmtK1A0Tv#H%4Y5Ly+-$*nS>y|=Bxq?-jSLOmg?KU=0=C)O;S6`YcFcu2-_sATmxM^DR`W>!E<0_o`T^fOS zhceH#=f!MnrQgRwII* z5zyJv`zExg8${`yuRnTQrmwy(|KuNiORisB%k}k6w%1e1quj{*Kl?~N`0NsJ*M|l6 zdRm~a4?g%1y$x=PHF;h>{3dzBC|2GA=hx$1Y1<}(sAHp^`5t4#5Whka82bq@!il!; zEOY*7buRC|{Rq|fA3ynA(#?zVo)uoN5uBQ@Q}kNMko8{|80EYih?{bNYA*&I>C-Y- z7y7fZZckQfG)6#^qt09L#$(n<)s$$}5h!`Hu^7pd@;s}=KH%h2u@ATy-ajY}+H{#* zIhu&3iiU1QD{0;=>*DKgU6d%}p?vH0fT->#&z{N8N@S&w;I&`A1@8Q%w;rN% zCt6=eCUD&WTwFO<2;b{A{L;ozeD2WYwcLqH5@Wdac`jYz^%{QG&DLXx&X?GlUOL)1 zE@yL8eW)sgm+M~0iTYO*4lQTZp6E@L(2tzgl&q8heduS<_uVL9eRcMsZ>A20y}^4I zRFSnHwYnIF#S|+g9DJU|eD1j}#Oe|g#Vl%*YA{~L00C@fgGCQ1h_i5jd#aIw^5$R_ znGr&4=!dZ9PC>0lqy@+8*JITi^1~BWU-K&K0nmvWjXJ@7!s>#QycVvM;V1OXaV zN?F$iN`su02;i(d&s(Rj$-6HKv+}%;O9b@Mk3T9=&sN3)|Nh38OJr2`%`j3LJ)4wE_OqwE zJa5P|q@63gU(a9VDv#6uo(@4iFd(_M(`M}i4`sGP2-b6)s0N)gSQHv)kt%pyhoOVD z^lK==)5sa;8(N)r`a}ce402a$7`FsL^UI z9QGZf)%Q4Z$T4>|ri(mU0g4Z#y!3LdCt~y^Q?E42U>aoQ(W6X2>Je_o#X^ilC-*>?a%gR-j4^SmGnPiTuITjDyUsfPMK9gsh? z1%L3cFdp0D>7HL)&{L?A%oJ7hf+0`DYtxr-M?Y_VKUH6~9(XeOa3xi2O$g5om)Q)t zrGQeOMLOewZ6$6zq?hvu?tL^#26Jqcz-Wi#0BDAl?Hrc@L=H>dYF?n^P;@RIK0GVy z?m~X;*WN+$TOp4ZRq z=2X6Pwvp5FoC?J~D8_gD;ze19C81uh{&bUY2x;c@dC5B{2EIX8Mmr>J%;0I72&A+7 zFam&)vJeIgMzgn*OQIbpVuxC=MpTU2!Ft4cFHV6%d5V!wR}!=d&^r(0;k)0KKYi~b z`R;ok%E#qo+Yb*=`Hgj&+$D4-WiW?_^#LA*Zt}%*4Ws8^`pWQ0iQuSgy z$}PF%&VAq2pes8!t(T1FYazUuc^++x!*F_TzmKMnp+&*27GO?hu>R+MRhlX_s5*LE7U?Tr`9-PT93R{`$T@e(YLoUB zhm#t1xO}Wo!>eQv68mhhnsShqm}-YrgLo<}x7oe!%D{g2*Q_2zi9Lk;z0>QT8!47MAzF*7tes(2)@VyuE z`Bc7l^8nw;voT8TL+lS_5gQJsS(9m7{(f`~qDDAKzFAGqgyZKTjpeYqcqlI}FA*VZ zO2T$uHXYaJhG#*|p+#=(DX# zt{@dSqy#AP`pJWG-(@a#ZwRGl$UeE;Ci%EPB_EXh$!DK^CZBxrsr>XOKb22E{|rj1 zFUsL|eWkr0_K4oJnCGH=;J^5-UzdOV&;PM}=iA>bd6&oX&RZM#>-T) zWOq4~AC`4@GBCHXFZZ)PJ0bJS4g+Q2QO3ROm9h?Zm)GoPE>cMllqpGa`RqBzhi*0M z6R?=oQ?)j?2tEK24Rwt~Q&*l%jg}Ghz?uRi^Gl8|YL2ToH)Tn`bNW#J#jkutR`ZSg z!B0Pv4~uD>f+ieRT$eKyoU^p~3NDnG`aQZl@b$T0l;}c90XH`{CAU+~9;NPQlOfg-^<)wTAPaMyS>d?Mv>WIo|g6whJh-JWmh)t$|z|1Uo{R;@!YaFQXvr? zKz)x6qL$=OGaJ9pHH5W}cKBY>>Gbnvt%@%x%ulY*DO z~ zn%L(WhmvyHLxaf(X%WI)=19nla~?^uO%pAwfk+#Ya;$cD1z$XejzeViE?aO8)^lSJ z=6DCF1;9fb4N6rKz-fSidHCQ$zWtSp@_FAZ<2Ip)@yU~?a#;-VRXN~3D+&4c-~T{9 zD~9E&Lt1YS61XG9uH>dsQGgT@Q1Cd3G8tJ%3(cxaV^7;!1AH{ccN+ z=laDZ*DLOUOfIEftDL$P;3=z8BT0zg4OX+H`$k0tHMvo&$5;~oXT!Dpleb=3vbF2Bq2~!d(H1)OniKm|S1VS&1}Or>FAv z`5+hT0^dy~QSLo1vsBor_py(m8TfXkUhjF(Q=5tk7K}Q?e@0>V!qT(L={7rM*!ZGi8H|qJ;-$bf%>^CiR&}@%IhUJ@#3?R zdYM4uRYzc0;ORyYKA5M&T!MjEcuw?_*ZX%_oIqvTO?myJ;+3412yaY#z?RV*6FQ); z2CKJw3(&wq{C1GP9jfx}^786(*WSC&IKA4H5AKO|I`cFcEKTQcvnD%Gf38uPro`5! zaG=pO*Qa9^ZMXa0%GRPf)^j*XAMGfw+Yz{&mv>fkBGJ$2)XsrJRx3k5I(o#^)?^mV z$9qO(6ldy9xe(i!IMz-O9>Bew%65@@T)}}!F2s|^)xh;PpcDoKCR{Z??06f zo)p|twSjK2kFsqPkI(q`sD(dF1x5 zrKTQk$&W#BPb}dpR)suQKvcXV;`zy`JUly>Lssy_E6ap=QMl_(@?dpA^eI_2734^tW|OX zr>7gRV9@I$xn7n}22uXXp|;aMmxFj3AIS&L*YYPn`dmIKMr1AV1oaR$ zn-R4WipgN_u9(ZoX>a+wOlT_G&7)F$-<}K61nWD70+R);kcZs;2py+b)}F#$mwWby zR;n-#jm&3NN%zz9b6KCPYikpA9<&s14vf^J^@LG4QdI-i56?eAc%$cZ6`bqicM&YkGi;FK|eQ6IE_d7!9 zJlQ1-Im{wJowaH`P$bC4^OBEi(uz zQM9wePi2^9SEMz^%il9BV5?jUk#&|8#)pj2c4v7PDoyC+3@%i(t9paM;)H@@Z7mxI zhl8vfVPO9e9dBK`&tGWHr{pUCf3*EswMg2kpmK$2_$9^gh+`k zYABUjrB+uz)ati>>X-gSz3Qp^p;s++bxW(YTBRka#L@tYBuEe>h>;jFfgEEV?sx`w zx7y#gx0(C75s?5W*1-y7#2wCYH#ghEx4-@EamC;i@+cFR$-(;Jd4|d-o~Hifl$Hk6 zK^&U1t=7*}O5O#Z*<-EC%(J#K8e1TQbpl({Rm~ABwT=B8p{u%Ug%|W3=x7Ly44tx*5&D1of6bHG-(jq!2YLq&+l^|H!Mpbxl2J-$M3Xh!Gp(B( z4++{Z`PZsAC|t$<`Z|XR_%onmLVyqFtTqS3R4pudzpQ-_YFkK+2(oDGY%$v*w3A#q z!lT)i9o4>09K_&}uh>Q@{B;(G4OXEJPI5gQ>MD);E6WCUkbtD#;#yOae)T_n^IP(F z|MqXn?|kWX0lj;Y;!U~GWj!;XB)TIf$2m5aJG>r)q<;z|-rN$)Q+0CEH zn-UH~9mM+XLo(x5V0GbZn)yQF1hnK88VS)It`2aFuJWz9Y;7r2r9q9&FYV`6XI>_? z=R6>=_@<}Dr^+NOMtCoES_jvzNdwl|lPB`{;XSSAJktL@k`t|+pm1wrkm(k<-!MkE zO=IdNAY7?A{A`e^4mNl>zO?NyLv@rD5%^ zB{Gxm1N#+3rN$@oZOupeXQ~06)_u08x{aZ5v81ix=hha?KJR`vt|Rq9+3?=2Au;&O zptpMPmlO_-N#?lhrDscY8mtr|;K!S+r{# z%nXVAS}%Lx)j)05g}XXq`-DMpWVl#4!p{z9_&~ui;fXdqW@X zQrE}H7@2!7zF(+CCdnfxF+U81Hs#wDvSJ@7R8KVn zu+hXhkM7RT1o8joqirkRZb){NSFjopuCtBS`-J=nWCHZ8+|ZiNzSca#>5*!*7ks( zTd&RLP$itd-hT22_Q`*Fm7!4uVTh~^QrOhhC$cOP_3mPl?i|cFTptE*_-jc?VsOP< zgFYy%Hq-~+c!S6f7LoEWv$d}3>@3Vs#v)+0c|*D9pf~WTq=ngkn$vJmE{C9C2&n++ z?1MrD4jGf{JQeCMyK)SjV1uV=U;K6H;C zRlD-XKfNm-oap_GXZp1f9iF3R{wM#%I-5yoLuA~UQ=nt?bg)F$$OgUBnFcw9a%ej5 zNJo(q5o?`If5>@*l!$?wt}=#)jjGHnkK}YI^PGKMz%DXRVyrUb3%|P>$+y1yBl+FG z^_#N)_RBIK?dX?J*=Wfox7>&o!v<}VbVA3slN&*Ez}3cn$Ws$HVJ>;5Sv3_&0B4Ii zjKy2(%;BL3oJWP`?&pXADP`Gz`y38N8u(CbW?@ARKl2IPZTbr}Mel#q~o=9ic zm`~tFJx)S_j)swEK5(qxVYnKI1Z1CCF||@?VqR}ibzygJPcH0VlzR$i-MRZfo*Wuu z3&NO-uJ-p%rRldTp@u&b3GUZkY*@|7C#!idmx%_~0`6%SvXfTw^6sweh!%_OyZHt; zUKx8IBq8NB%sAozM&sAIe%{OZ>&%1C$P^5rIDD>WGMY-`GUagql?C4?Vu-Wkic#*3 zz;l6v$mx9WjF++8ok z%QIyk&${X$Gs#(%jTi{eKwA0ynn_PZfh4m!P4?b155gnK_{xY5+3z8p7g(R4DrAG0 zDY!7e$s>dU4^#%5^fS)GGn*-uDB^sIX+PgL4;n_@oue zv|JcC4mwIEQDLm7kWEc4>1u_jZ}xV z&T-!z5(-HH_W@`C&}53X!fqKUA@iE~# z)W{~2sqAj;@V^|IrF#sbk{Duy%)uIi1A{6!hLk&ptEz8uB==jMd9hivGiVicoP;nm z!)<;LnNf%taAvd88w%VNNFWKiQNi|MW=W%-!@L!JC}Aq|*$u_rcV+j&fxM?#$lbe- z2wxDSazmYq>oN2YbSSjzO{XpcXgb%~vYdSmQ*iBY6gzreZqI|fvJ+&sK9P|dm5Cas!|AvN`Kwvm>1Hncu5q8se1Q5`vXAl|D$epKgo43!WsJQ) z`(f~>tV;RYu&B#TGx8#_HD_6h%wrq{Y#Zi@|9@1{(ul{`hOJ2c4(UAH1 z9*VQT2}4f7yN1ffC5p$r0!H%3L>cm_P=U9iWOgDMAkAl`Mumg;`rfWOj|q$F)FG>F z6ad+LIN0QKOUWF()te20!M|o2YyL+D51}lVWrVp|H=Q#Uh0~o)1#iEh21Res2hEvY zt4MxX2%;Lr(aGvU5!HvT?OnVmFKMKEqA=Uhy~oCilUST!KUs0G@BB8q;6j1j`A|{H zwHh_mt~sW)j5P4r*6X`{X@~MIRj`^~>4%d3y?$9;EIX=9w;lex$+C}2b_@8>VD*|y zg+|cnWW?a{mmx!VwatKqbl%pK+f9RgV@-xcJUVw$sdYt%z_P()YQYBwTOo6_P)! z@RJ8M5v&92^XOdZvi3+fiz~7Z#QEY#LYkl%Oqj@>qa@#Z=TsgqHG-XL{;6>kAhJ9| zfz5x}52cU8wNj6 zWXJTLIVYjd0`iMJEwOjVj8sH?U3Agbm3;92J^AK0|6KmY+n-jfK9JQie1IFUKpMoN z=MFzJN6Fqf7a<3~D0Yk8K!B^NZFpI5X&lSix{|#zAizF!T6Xev2(@+gvZmxX4`GFw z&8#SW8v3()`%5d7+a_=dJG!{B*StH@9we`&bD5E#4kft~0i(m5Y4}WwHg&~WSYl+) zu`e*&I_FJeOrVNT85~0#ZtBzrB(_lA+*`7b-hr0)4t)@m1BHwjm;!;pzPQi%d`o82 zGc8<){%MujF{yum;z3DD&t|ax%!3D1xntg34hRQJ8Fx!9lqb2Sh2rk)P|sG&d#T(J zJcSN zWvqtCAh?Hy*khD#nu9WFyzLBIlV4xieZE z1MK?V*%OtXxnf8M=wEI+<;D$9uZ2Q@ozQE)^igEecd8PpFP z{^W^wZt$Y1U-lYMgQ9QhoC@d+keEkb^_N&^s!m7lJd^0W)1HQ_at){|_7QM2aTe5g z(Cyn$MBM&#E_aaJ2}u@6j6yaLYc*|@KmOKV$UE8-{g1<)fSe>7 zUSz4LRX~whA)Zu+JcG(uO~^g~cXHyC&9PVmE{qoCv5*eO!N+f!MEvaFxqvqSCOZF?*lM4tssxoKkRt$VOO;t1gryg)HzA}@9U zf3+7e$Exr4ZU;hOCh_jf8XW4u@7Z`(A9-7@(-<@3*&K1bZk!c6IKkmIh{iBR+9Z!m z*-h&P&6>(FvjdT2B@a(m^1YuP%EwRD_>TAGRO=n9F8D?tnc*n19Gg*h+x8S=vYIj(8(s}JK zXGbv`J$bgTDRh0L3KEBr3A$3B=p0vz1#asjX7R`|Yd%p;sm%suu=HV*#%k*k%Fp$g zUSh;+#<=EMqre~K%t!&DB+@)%oj(Ikri{TyP4_CcnZ&{#tIF$9L=E6P8uoNt-JTG- zs&m$W&wzhV(W-{Y>mUBg6mX&rPMyUb;$Sboz1R=&uv69cFjKzIkbAeprT62DEm-gy z&*PstsnZ#Toj*St#k`p*4_|EP9R(YG;GN)T+Jp#eT}N+iFj{b)ylP)t^OTQAHcgPW z1$B_+ve=cXXjw@?j{M4P#?4>b%N$poGZr=mv13*|rL#zVxo8-b!^pNJO?>_#FVL<0 z`mYyZhIr3B{*sqH$R%@;6n|#U7z2*ETA}c*3ynsXrA2KE|vpWvJeUK z3EH7Hmpym}mJM>UzK%^Zky&eQCpX z8qgJFEaL?wr+7|~);B*I4LnzFGeM(VgsbgRJW?8m`4aWVn5hOILXA408|V?Ko3#~u zjq6uudP`F5&OI~B`fT6ZeEAxYw`Lyu3I`uR7Dm?W^$1A@<)8k(^2?;@ z&2cwvTQYDM^yNB}G8C$=qDS5CP;+MDwTBGra^F-o>KaoYc`ou;=iw=K16O;)U-Af^ zk$mO7K@2XEyr?6=GMwCaXEhIG%@Fl8DJOHp91<5hr|LJB4f!0N6)4}8g^pd5ynil9 zHMF6jpXZS^&U#lOWsP58c0ciz>HW++=mmj+v#4l?fty8d#`N7=(o4;on(!Ryc5QFO zhaTG|(8V%TDDU0O(Pq@^vxOn!-gzfu)Ad?1nT|Gcs%7>rcrdf6&Ev-VO?{>>J9nXv zuRmW;)zhA7ArM$$H2NE(pw3gsM9qzq$m*e_?Y8uuDte(Lx2%%(|`B~=Q>v4atm!&W;Ah|#u zH=HteK?ID}8Wo?814GL?NMNB7LDd65W>~da-*c;;a7GEvW8?3_OvquQ90cHHuy>xh zH zn1j4gWwU3{S4UVaTJI6Fq+|olNIqFNzGsa}Z8U9#o?G$#XNnJO9HvZ&Nz$N`obI== zsh!NIk_EF_5xesYEI+f6qa3HFXJQ4H5 zx^O*3;)Uo%HdQ%rxByW8x~46((HGHp>D?ui=u-w*WpG?INN$|#O2pUW`%(s-M6m~w zw?1W{Gp^|RSfCfPlQ;{{@po+!8y2luLb3shvm-A2YPpu^tg1}s4ZcCMx6UFR`20M1 zk9`-q;Ac&g_Z~0hFMjbz4i&y?Ydf4ZBT%DUvX_F_6Y~m|`wSb!QDNb06zcxxp8HCJ z?>f~pnSl+Z!L47Yg3%7%FdsORXph{8c(KoibquSqjOq!kRMUFI6RaMD0(3y<{pwh* zUEY)5`TCdTi=WkkxjLCfjd>Wy@_|_g%pUO|lzd^V(`QXt1n-4E8RK()@7ZWP!&0BL zs+roGL+QMt`TeYS#o;K1^)^V19mg0B1|2k}FAe7Z60n4>7WOu1oMyygx&P!@M~;?> zMtQ~|lFvxmr~!7vg-EIYZ+cOVDrK2d`ESOop+Ma-q^YW@^)4`DHpg$DihEq~o&W|< z^zwH!u-wu;a)#(S5Kt@kAd-7_M9$OgQyKIogYS17m^INX_NCcWUfP?(MEL&t$Ov&w2IC$o`p{eUQJ>>qUB2nI4-wm;jBLvNc$@&Y-l~`;D4)>oQMv24>R< z*O&|^v0w@{3{0woaASt6#?zXk0JcExh*?IYa}BJ4BChRDBVcsm?FX9(N4f5l&gD?j zuUGCDb8^YAl!iDANQ(suSWViNWgQlIr@^>IUsR{vMlV9X=*2m^Z7mdz` z&SNyOzFv{HPqEq%HkKoLu{1f{=NdG%opUK5pEuZ_;ZTXTqjxBY_(wr4`R_4Iltnu9XY9IFjUa)X${z_N zk81vPUYqjlo6a!HlQb^2O8bF5l0x|&1KN=}>xsilW~YQ=m4KP(SkOP#8T>PyO>8vA zvNP3aw~^M&CuCt+mwDV+i!6uJ z&oRW##+8!5;w*&Dn?>>fb}Hpo)!<-nI+@NJ`Kr1qkV@mz$;iug+&|M~gYW*vm3p&N zu;Q*+48yvy^=q$<*zl(U$~ykeISyXXHRe`jeF>eXnfWmLXV9nz6K~6`GR*A2$k)T8 zQ+e{>RHHGGt5Gu=g?UaJ6r}>49pH_1KzR`#I=09?p&8E!e95oH!d%P50P7@&xRSA? zq^v@+85qOoKd=xP0Fyz@BKZ1;)Yni7-rE?%B8EQe>vH4~Oz{>O)X2NfA;pc}`jHx! zYg;3^d0|Vw^yaJb>W#}ZFjOB39wi3x#?O%%t=x4z%si58)UNV=4t@yC*`LcOh9{=$ z`u?EQJBiG`8NNz0)zAo}ffHpHx^)S&>IZldRNzuqGUf|^Hkv^KQYxiiRf7_so+@(+_Qxo5Ov+NSb8XwZ(E~QY_`g1 zJX0sOvVer~Miif=#Xb-MBG`u>^{$#D!hVahLydepO8(b~md_TN5p=RQ$2eUroG(_A z8CG;gp*QfkzK{_N{@pXJBCv@JUH1!MtDEymZtri&ES)mzsKn|ax!ZZjkiw)ryZ|3% z5yL!-h77vYZzSJ_R!2*zoQ2v)t+r02NM2~KHuk6eY_79r_}$<+uSkYG-Zxl=5$tD* zg0r})xLCi?Y+4hhH;Eow6Wj-B?_wHi$*JbJc-SLSc6Y~I!`Ayf$j$S0VU|G^h?-MF zvnnv&+d9gns1RGkNy(49;*x7tuDsF6j9EuT9x4>A;*)`bD{ z14tVO7XP%)YRf2sds@O!jb$j6N3yw_@tF=tv6=-Vdr$EQhh$bnn+w+i+@6$QA57w& zA3wzI(9Y^F)>dzwo>nB4jfDb#8w`c@!ua=Fvysu%x_%+;00u^eUFZsYz`u9FyR#Vz z$Xu`cAN}s@@>>d7Jz0$8{-c#VIy{pnC#Uk@_*5PrFXiz`lBen{P8&4YQN70_SxhKU ztUgSbnV^VLyK$q~NEE|kgQvWy4<}L%C(GjGh@4*Uxj{#kiYbS!?TW5a=b2@mn+_Pv zy05(!1tX2;1tygm&Mm#x8{0Ga^tA)|%*!`qe|w@o17+S;h6Q_rO5D+VBp=Gx^F5q% z9%9BCj_7&C%8h-Lq!egH0!vi zfcdMJcI2u$km|_^g(T@L>L5eW!IH65c78e^Bb^%nVYJsTXfn2S>Y<#@gF@6WMzzE0 z=~+7^v?msL#!=5uOLJ|!zS6=K1#c4EVzI^*|OE|~$ZXz9`*1r~V*8nCSzJ~>+&yjaty&FL&K^c{+& zl?`3b!8A3ts7{&Am_3SWn9gu#`T@K=gm_omej1 zXG2$9MTyd|-e~w+El$~lhc!4mJ>~UHr#2*Pu~^C+s7K@ ztsGptE_?bXsF4*o4e9{-wRhw($q1Q4YfC}&l-&LmGZ*w!;7>mMsjP|r**JIM+&wuQ z<+~o`=(9ADg?`?mS(1o?s2KP2-uw6E+kgH;`TcMFkv!IY2|m zn;Ljrp6I!Ja#waKT0G+OZ`w0jwa(vT?Hp6o7Lr3zxgR1Ulh2;`U-tSW{+|V)b=^sh zIeLktXGh$Yrx0w^>u8kc2H9;d=@e>`4KQLFBQlmN8-D?t)jH&XSY$d+&iDih6!mLs zIypk1tp#YoWneN%$*!p?=cE_h%t41cT8mu!YYvvRvK|*J?n6U-0ws%r__z$hrsTK1~znUq%J?Std7(WRp7)|6S@BK zTo$)4>SH*NV+}7JpDpFV;i-IlR>{vEc5?SgBS&YgW-2G@Ok2*=K4U-|36UX@UsDzW z+0=-R1voY2GP({Ua;?S?e64aVA#7xfKAXVltR@-L7NH7*aP-kSU6C~&cTo6$7|9*| z%SB!DE4sN}zO^Tx`~0i2wL4NLzp_o)+iP>iVn&-R4q|kX%r-X2MPsP|4uYG`5J$xg zYjvi+h~dmE=e0i1fuuAz!48k)3}*waDt^iv{KO)DFo_7)0;yZ+AwGeQ)v<)#O83eU zN77!t0r+Xe-}6}C>UetH>r*ud>Rh%jD}=Yd>mFMqTOJq(6YWiI=^_i!$n@7IOG=~T znO-{R#PQ_YYcJw2faU#PbU(E$=VX%_O&{_`KpU3H$Hdg-d}v2BeS8tYeq zvO#wy2fE*{&&P87WU0Xsf}D}9=kS39={Lf#?*?QPz3*wekXL6xK6ha%x3((TT0@*v z*Ss<1S+21wRP^S~vop61tXDcoWz}{Yjv#oHEP2~>{kZIrD+W+eBlI(H&O091kk$=l z?p4X>!3K5t=XfJ>a9GjC8$$}GBBQLMDz=b4cZPtYwh(GQ8>=%MYhZHLL%qr5PTG-; zpiXF>oL0;l&-A&G1&edqK*~MZ;4^j^jGfhLjwMsx3q0xzkMbcalgmZ!r1j445mTr9pxGTxHQLSwIr+^6XN%dZv-)ynv9L+6 z1HP*HfDCgS5uT|v;zC-EsNwijAB7d0DxscJuxyACrWTUf zZvt5qSx|PNk`o!z@KwVU$xuU1=(-1V+?EYb(}`97Ek7+QH_id^kUNr)FY(da5@#_=hOSy_GmXGo~ z*bcJYoU%zU`5byaF!Ww|t)pS>&)#?C^@O}d*FMllyjeD!+xPip_94e3Ju!#2B<9R; z(|K5JHE*8*48)8gx!QvTa#KAw?EG#G5rGmeps2;d3f!^KQ=x26P9SJ5*MKVXJ`r;`4-rrv-WHh68?C_l8_#seGv?290W;mZ!P zGlD{occ1_CwX2HqATy%wtQ&L4Zx@5AMzwbVy9COpG8tr7MDkIzHEGFtz>__!+B%K9 zB)Knvfu`40QqfuuZWIQPNg?9%6FhwK=%uq%yHIMka3$W9k83_-NgOw|Lz7u< z?I-CFI3z}7T%)In9`3!#T=o=;y?J>{-uU!uva`F*HA`M>6p=nU3%0TH>GY znOdlvfo4!g1!)g_BATVZbx$sr!1vwUOL36NX1D;;?D%cKLS5?)Uj~s^{}wF%MU%k* zRM~1o7#sY+$TB22;n76b{Y>6@?|tLKYjlpx2$>df@Nxh`|5=_PSyx3UuFo2@JURue zx;AnI8F_FDO(d(Wp6sY&u%L($Et=MJ?G-iCn#w}6g+sZc^@)%5&x41L<*q_bKlnf$ z2KIs0*_H~0X5FbXDk)Diwiq#>X`CuejVzHuec$NV);;u8ujwy8yf5?dPvz=YzNA5v z?#q*7{clYNh}`$ag&nzg|42W#k(ENWEv;Bj(aw7zWaI+TJ9U^=vZX=QOPX!m+MmdF zWz^h4=!n*=nW3=K=Mwr|DZiR2+PIb>;h=S-gbdG5fUV+SW;qRO)z@}&3j#X+5zls& z*CK)#>gsSZ2S~Zy!S?~Xah0oB#!S$51S2NF$y7dy+eS~A+AhgLl?7PnE+12AdsVK_ z1Qo5IZvHntci&f)tBK)^jj9s(oAVH=ja$!@rS6mqYEr4QqVAg$iNc+tdnLd8MO<)Tka7mX?{&}4I)Cnabk-tK4>~}f_kwU+42Fx>E^fvme$#F^EeaWe z>9RHh2YChYpA*N_x3=bTd~(D)m`q2`&S=TckJHiMQ$vyUMkZ9{-VOKg&&6A_)JQT% zXv<^K82V8rh(Zu`>k7}~SmBKkjY;Zo54F5P_SE|1nxesuR# z{(ry!j{M-Gl^))aMuB#X@*F&tgRdyN-uiR4J_QqMd)@&`bg&f~xzt$B75_fa8qX!I zcf9fGSLD{qxBM`+gN$SFJ{wq(Edela6p-;q*C^OlHmw0p1eHSxVg>muBZ9p%A-*3Ka$IN~>_qYQX1XIg z*S2ZM9-f@Zt~xddCnk#;oR*mzzw%hAe6OiwK*hl!N|jvfw0??ag=c^r8rS5?hdt!T>y?^ZaGdj+?uhX$ytXg?(e@`xJk-Ualf}aP|__6@Q0y>jR zDw8&UjaMIh+WDknxGQ{TvQJi!c+smGWYTaFtF`U7v9mIH)L5*x^+mIElCIFzIgS>tAL_8ko$zVJvHzSK$ zwUmi=8=f+WVf$vlj5g@}eYa?gN1&DpX=-!?P}HC+B6^usBt^i`p&=n zH~&HY?Z5v+76uRYFUl<~IKTGFYx2sim*nEXTxN5Vp`Spkb7T&`j-C={Hka7Yu4=%B z>z6;n5}6Jy%y7gH93X=`_l`BgcvtQ}d?N3E@BzR65B}kQEjO-RmE-Ok>Nw|8;rhFU zH}s{__W{xe&cb|a%X%Za&Y?Af2g@~J>Z3azI7RHEA*ja~I0cnvObZgQ^hRVuC2Z8%dWky6S4^oO7P`9~3i~hNsl4R| zXC^01{25&8XqSSHhgxL+<`3VM)#*yU`sz!vr|+{vs6qn@bzYykyeA(&Rj5^KD^W9L zi6eQ2dOdi5WGs7n^`G0H$(OG0%6>T3lKxtXL<=Hp)-y94W9P{FJhGI}rn_rc7cf$W z_1`$5V5hW4c)u0xq0yCLJJ%c` zTN|v8T1E8M1a|=Wm0K>TpOuXDYGsJT+3Z!F;cb&hp#n&-CPbV29t-qm4&SM|SZeE? z2sEG;0a(w3Y4>!+c$SMvnbmHNhlT8rdBFp!tuKiE{nrd5p7YA16tkvG`vL*7;Bo|P zD%6{YXRT)wo7Vv9o7)-;SV4i^ibugIyj^Mb5x>Kf<Gec+dH&ciC7Ax7&deB8J?p;@7%nuU#qDo{LA~?1zX9j;xpHy!C_;hTKcdhCwam%6ES89^tC5-o7kb!6yFA z^(}T$quJe(_q1?+;%|~ydSgGh6M);>)i1qyXbZ?ED$xt z->NY8Ui2z~oBY+Xm1kZ9hXdP?CC{S|Z!0S{NCINq%;dAQ`y9=Gt7WOp+Q2ys?_U$;4C9f*^jhmfMdX|&r2sNpQ? zq1_G}ac~Z(%`sZKVe%wM>pbE%{xDK0;UQ?3&AF<3ezQT42i&f*jO2V*dhPwrq0I~GcHF+Fkw1}kZN1RsC+cj)@VQ!>EeI_^)30gNo1z=5U z)p{+$Qf^+|lPzGSsAG{Uo}LR^ZFY8hjV7~!JO_8zZvO+G+br0`wLjaH%lq4MRbh(P zU%xF|+nVL9&-7W3iv|#%i8xvnjOjtTa|n`$7lC9@jplNs1>AS<-Iag&d*6_M`yc;M zVIhTSMmvOWIIU4H4a|WP$rAd!!+~G4 zPWN6~;z*?DB$Z z85>K?K1xrE^q)_C0k*(d`gtd(3;E#V`|{w)sbv-D|4CL9&$SQE18I#~+PTqBo@GRm z4D5bU>;#O2Jkyj`ZNDd+x!RwtWFlC;lC*I}p|g26aFi!n+y*4|y$?T@Nzi)5)eBm) z==eql4vOxVSSQDL*U$QeXZKkn0jF&V3cuDuqZ1q^L(IE1?ZyXV{ z>7#f?O}pU?VtBFR$j>=P*@R^WR`0J8uvR{*fwquBm{Md#&i`EbdlmZvd~zoi#p@R% z{vDa>R7~xgnLx|~pK3zrCz#vr%+7EQ4YjhBjX0ppy7!n2Uoh?!XMeTCU%| zs-Lrz+;v}v;1l0$yeXTP$aoMIuh6)KNqd-;zHSwEnO>0p`5S*A|KET6ALY*!5_x>2 zIIryJvX2~2GR7Urp9;^}TnU4kaK&{ua0(|&$&GQgcAZ0HzQ%b!c3C_yc<}EO#L68# zA}$gRyh(CwOZfhsJ8FT?vH|ZbvAZcmg!jy$KYCY4EP9h$qhfY9EFC{E{@G# zHnhGqb|A;s#dCf#8o=M}NFCk*7>xo|hG--7Yi|}!NF(!BIGaYPCM@sHTg%+{TAFa;h`yW2m zY$M9&Z|o?DrjV`vxxHJ<-93>zCns7fLG2IDuO`GiZmnn>Vk=weL_VeI$`>#1$ew1j zUeI$CODyv7w+7vP@7_N#yDDS}?09GI~xNJLiZinsS zGyBR|=LVgD@@TW2Mn()sUfW5gP+;s$hul+6(RlhgQuj=i!4{uIH%`sspfu0E4el6u zodUe*JV45}gV#ucHI(26p`OE(YoP68(U{}1GH@KJcOcOK-C`)%7vQm-^_iqnqfIUh z#z8i4Qmydtf#P^}stY|{vl&c$p(oSYGK^#foeIMG9#b`X6+QCGXEwB4FgjFH^7LK+ zeW5t!5+^iFZIe$#iNJbG)<=50H#c??`m`87flb29r}Mc4o_?{E#e3DYPN#BVb|#;B zc_x4S-Z7nAOFZS-2<<%kq<=Z6l+{lY4n;@m z+Mo0HTQ9zjJP06~=MhvhxP=sApWXVt$c(43k@mW=525t4AX{iW1W(cGG91tA5#K~} zap*XG_Vt_c`L{l;P#K={igOx*b##``Y`m|ja`wumDuZPwrjTGVE#iT1oDy#QW zPQ6PWt%qV0#RF&5E5VfFFt6I$2mrYnieoc5D732231pp2i=9qKv{%^tHu131GdE>j z^i1n4%c#&K#23XFeCSAL3jyw%eRH-ZU6%uHA9-7iWQbs=VmGtp6(=esm&FMKYh|N! zVctel>oelI^OthoD3UiAh`MZKY{h7UQtkR+rqx6s_=YS9U6im;puCai&(trF>A)d-mCu!+$er=I@o=a- zI=tE7xUn0n)*k>0Pj!iig1m5n{M)%h|9R^tq3_=Bf2E@tsq}snK$5p!y)N@V_>nwS zhyijGCBcaOdxmpJT5uO_XV1Im89}t1rGV1xwi?4dJxn*R9?0iD`<7h2dRYVA#v*iw z*qEtAGit_OGCsX7y25DKXkY>DD>M}4Uw-31%YXkr{D0&~>rTijRtj~D$1{Wa7`LQy z-$r@%LTaCPOM5Pj-}uKl<<{YfVJS>P(nAiX3AZdFTQ|QbTm#9BO0-C+M)6ZOcjfPV z>23M^r*5eMURn!%d|w3MLnrNQqU>3#p~{$07bljO2ypga0r zSf{J=9l1F_mAeZ6fd;_IiGaNIQ)kF{+B3PeJ(ZigbFG=nghTRwxc(=!rVGD&AVvc7>Necd%WgiZ*Ug?9{$ zGUAIAo7FR0Eqe$)Eip;;f{H;t$0*>#xs1lv54Ku5rFY}ipHrd%IfBoPHo=9=GJ*nc z#zv^n!zZ|>aL^a3>I^_TJZb84wF9!LOxFWV{vqCEHMbn zHC2O}Z)*VN5Dd5&4l9=pg$%MkwTAj+l*1p`jG?m8>G_#^A zYy6ck-aG_qc!h{%z`GyobH1T9jw^cLzx4KJQg2F7x0Aqu0 zT322UqnRw)TK?eAeklL)-~WL;KDEsmb%RgP-@+p3$Pl1mMwX+c3{!^ZIN=SLbZ}qi z?lVeGa4j>ctDz#PHOL|B80!yBb&t*UxgN}?@|$nHB42pz8igRKoI6TZJ8M(v*}#SK zT*RtOK@9E)4SF$06J1Y?I&8cZmde@pu&Yt#=U%_15Z;-5_wKPY_aDpq&9R;>(4=j; zr8OQxGJ8SCF-iuZRD}2$Qv|xdKP4E^= z+p?~)um8R_tL5TE4QO+!hTY)qwKL_)Q{&z;8g;P(4v`EXMoNNVpKnc_*_mXqupSPeJUhE%W3P7RNO1ia8kHTXX@OY* zzVp5^=&l)M*j;bx(IUSAv%?{|PL>PW67w25p8?tvECNf;YD-PF8O{K*X>k@faTrw9 zSNt>0YdF!5cv?LuQsrX1V~(C3TfsLaZeZ~T!N#4oZ~yOHW+VTO9r!*Q%ITNE6E5B0 z%%08k)lxz9W1Qj8L*!2^B%o9?=Q3+rsLsKP?lu&Po_FQ*j5{-`*m$*%wM1Ikw(By} zqjeo9lVdg>J&fIyjW)i?h%CG~S~5)(an@I`9u${s$-ws&DY*CM*m>3tOK3h_{6ck_s+PIYkOPrsasd%%~x;BjPls4 zl6f+n?OaGO+QwzRzqVmXNg=OB4a@1emjC$8KbQZNtJNwsUd7?#FEfUAh zBKB%r55ynyUQ4Vo1ZOv;Ob`nelyrkYBSV}r+?5-tn(d)Z?DN>A?Dx(=!3ZEUn7FLh zF=^D8>%shuw_cXt{qh@fBYVhb76c2}v734L7H%Ho9N14pPAamM{ciqv^d$LNo z_xuO-HbP&JCpnXmUeCTh$6FV-3KlC)u#0gy=&(X|7ZO9GXOSiWsvWuRf z2H8*JTi$zea)2rpG{lt8e{w_BxD81%WdEf6Q2n){GIFG$&F7PPedlA2!O@^2DowMA zznjnHa6jgt70;2DGTXR(yr60eYOmfa90i=5FsrHgZ}BJ{Y$}Q%uB|3&jt~_-YbAh# z!JSpn7-nEBlE_pWZP#RxT-90Ecs#MDzC1UCMQ$J^l`|f_mdg5&NO3qe{z4>66}29u znJl|yU8e07Y*1Co1cKJjr)Af)k@;~jqToR_{GW2o=j_l1f4V%pun_^C?< zQI%iw6%5n#b`TNSj0!d|j9dtEBhNIyihkoR4W4^TgEb;Tq>QDQ*5`;I&8^I9TQ{oV z)mhy%8*~(`Vlt7vwoBf_(exQuG6K%?V5#gEjs25;bw-G@CQux0H1n7%EOcdWrbeYR z=?^cY^f^Tk8}#E2d4N8qA_8utfkfrpAXoPH!-hv|M$Q8hJ5?SKbP_LRW)vVvU<8A7Q&(%4m#=uhR?WD zQpm%*jy|oB&~s1NTO+K^V13q>g}8J}a@Z5uYc_%#k2+rn_Ks&BY{Ug@hN`B3~FvzgF=Tkh6C-7r*i$mW!X_fG}C>(t%hrgt`S|7seXStf{eb+ z#u%ZP8X*R1>GetvrYb6KUBdn5Fx#DZTl@R;)9|oMFR>AV7rdfVgY9>-)JE2& z$<*P=7%A4Tfe$jB@c73W5=vr=Fh;mi2 z=!d7B8OLb&eE!_cwLbr*g+s!JG}hg4_41Cq@#ZbLapR(X?aWeJKrz8b5Dy$U3v3)Y ztUm+BiNY91i(0<@vk&F}^)LPx`IGOzC#%sm`!gOtzORn@gwF$fa+GK~#l%ON1x^AY zlVh5t~ZPs>g%P{{|?*LFaSMr_puD}*-%m(5ydrk1rhTQU2nHDa6UmoIDTc10uU zEBgGl+atNWH`OBf%knvetHyfYHDRH#)+mfb5i?xn8JvmNnMPXKxFVY^9?r4~jSW~r zD4eJd)EEN`UFKS&7^AxwQ!mwl1T>(Eu+L{tuYXVX=e}k)7v}Z{T2qKuVW8*gH0Gnq ziuuqZ(pm}Z6(DnyHdm-n*Oz05iL~YU4OT0eKx{7rmdGLNveM7TXI|f#%l+e1IaN5V zQ^&TY&;I&kCYR?kegDo^6wg3240RlH*7?vhS2G$N>#c6<=U>^KY9_1qxCGW;alA30 zt>B&7$^4Ztd~opdW6>|*WKO+w9CB#VGIZ0pEwW;HC>_xoyPa&RIItfUurSh3 zApR^hc(HjKxqoZeZ7zPT>s9N)RNt<^#y(7rtWD)x9C`(t>g?o1o;*30ZQXAe=Zy73 zW8a$Oh?XNGunvneedha9LG$D3sqO>)nUtGjft-NPhQhbjPSy*v*E{pEe(o7>9LY@O z?5R+78;5>a7dfk|Ph8tcrs@!oJ0T+0bJM2w$r;GW8r zJ^4M#nFNcvotI54wl-XBMEaUB8xRq#7RwR=lXc=wAy2>>oWF9**|4rw1EIy(dvi93 zjeJrUJ0*=$iN!URh86)AXS`l4z{$y}Y|U!Zd2x>q!~xhln{|>KRMJi&Jv(4$6uCNa zkL>DXb!8o$$)PDaoNjYiPZnnsSCyp$rq)(N=WEVP>>ffW*ENiKs$p}KGvX-Ep`SmS ztmU=qBYF9P;?*aOJO*nfjrpUUZ+6O#r<|ajs}uD{6}%p;V|4P$%a`TV*VTaTBD-oz z)?oyJR5Gv}b@6~B;?qstX`SOQe||^)>A(0r`Np6ANSf)kOtgkD-<#-Rc%ZO{LPuvu zAY{qbcuQ_w+1BWEs@c=79)fM}ZqNHbad}PgkB*Kh*8ycws-5ZqHKl?|PEM`6m$RMK zFdv1L7Hdtgj(rlAzbNXY_n_Cd)W87^cz9M580<6sqebf1F4pq-H(!$1KXpScE6zLx z4LpuLB3U_H=!I5h5-uPb>M~~{(}Ah0oi^ePXQna@1=lfEV}0nC zLx60sR6{mZ2asv5+;>$ZEOM&O^>iHxy&>4UvA2+8b!15m{_XihzIth2u7Qj~1|pxj zW)}+e=~`ZZl)PxxM7O7FtM4(>_nys0B&%RX%ZdITbfBU$Y=>9GDF-C*yXo}Gf#&r!1(`bOpuqB+SiMHQ|288C3OY#p}L z&l~w{oK~InWSj68G8EF=QD4E3EEd{3$-QM=>dOqh)JR`^_kT&&1;qYYFZI z#U*iQCTgzE_Nrfyl-Ti2y^+ZXQ7i>#qoUQWw3{P{S{n*`zU!%!)v{~~enl`>=Du!EP ze{cZ($gUejIcV?Xb>RaIuD1`lgzA$Un*K{()Bp;`@aPc5uFo_wjdJtSmW)0GL@{Ob zL_tWgNRw1TKcJiI+m$R5kP3{>h25Flx_Mc46$-1z7I`I?!Dr;*uvgLZBF`1?0Ij95 z{O~XD%m4WQ|4;H4KX^|M#U87Ew_d)XwT?%6ttY&OSF{-anOAPhn=ijCFJIl4Hx(k< zRR_YTC)gYVyd@&d6OGu8_0Q2EBDbgNfKFwpkiy}^#|qPo`J4~{kX|l1t$2q~u>mW{H91q!+t9MxEddj}bEjW|~)D_Lj_sL=ptTWb}Ub0SqZ-M%3R*T!-*=8eJ%!ecx873<+pdN%K z#lyu~wok#H(lt~V?V^?k-@b84Ub(POh)f)=G{XFvh4V4zaadr*=wGZKg$AygIgMY; z5GOOb1wKv5&#>X^p?*Hpk{w5;leVsSL1XKz%f@S=lH`}Z@?fZ;YVPoR*7v}vHswrr z=Q0@vvaQ+1hOl7tc^*A6W3gD20Bba|0y>-tf+G7leLl#DYom*!7bvS(SPjSK6k%22 zTqw1(HoHTKomE4dx;S0g^w(*{779Z2sf6pSm6q4Arqg!vA|e~EXfg#c#;DwYlvB#K zAV@8r@G3_mSw@oSyEekq3obsV+}Mpa7sgG3fZ+t21@R1G~9F}2J12@iazTa{rG z;+Ne(iXx?=z(DRjKg0D|nuZwTXks6dJIwLGF!X1s2BUA7aTW!oN@~6z(#z!dNp;RS z0Q>Gdia`-^v&;Oi^JT4Ie1B}x$|Ny%_2C}u0!}#bTF6SqacbE@W!66BC`ty;lz-{x zw*!y9u&vp^)obiO2*C{5UIl^b$h zVX$w%`vcjp8u{{PUYFnfjW5gRU%M>_T1dUJx2@Q&4-IO}FoV&=!f6v_q0!c{W<$rC zW$lEe999~=>Gv+~j0qzlVq9_lwq?2)y^5wp)GBaTgGS8Q^bq)5AU1BnN;7D37ck7u z9;f4NYdr*?z1B>j(JXUS8-!T3xt}B$tmsi1rt+c1QKZil^E~tnAqRIh$(2}9*lg9A zQJ`>*?6@OVjpncw7;I~;xoD(5?E(oJBS5MkP~bWk03?et;bg@M-IM98P&px~zooy& z@um<0txZ({NWeC>gjXKv%c69Q8;$`%El_~z!~)BVsx)1@@y@7Iz#I_vYAw^q@+jCRH2S2_TJ0s( zR?J4g!$LdJ8(Rlb{2|fqC<~gY5##_FsUhngt)_zMgOo4Q&)nKpcaEmv<@@p_@ zDH57o?j&`+-RcGz80q!{``wzmJt z?1q4YriiS-y4`CRGHktQjBi%^^5MT2e^WX{`=DIE(_+P_>vyP8)W7-n-<03`qwj0Btjeq6vaLO){7ibpdqS z9%+q4pW#F?-5qrhh=Pu_rqb5d!*jB*`T)DEbRG z)?Q{B0gm->oj!f4XKYI6dj`)HO$oOf8F?a7#HeTY8T1CCKAYAgu*j% z{A7@g1k?MPPp1a8CX*KGC@V5HWmm7WG58zV#6t|M!uo-Ni@l626oviyr9C-SOdUiD z)L3G&S@rlRBnXZEeG8HF6zkLQj8T`|x@K7yMD{qXLLc<;45mR$IWSy+1kas^f?)8l zgu4O84ONqk&u>$+W#fJ)JZKuONzy_VOwJ+56kp>rod zINtk1wxh}Un+H)w-;PYeub`wk%|Hx|bDa5;xtu;a%TURq#3YFCfT60$BsKRD)D7M+~tl>B=Y|Wf1`uwZNH6PqF?|tPp&5AxPd;jEbYPK*XSs_I93>>S$SI9%_Pb+l{ zs8IpN3Ctvb_3FRX&~{qWST7)|h%RY;p89hm$Xy46KSE`W3@|i50{t`C+3ad zrfJ28Y4G|NT7Yi!o*J#QoM`>#3{x%Dc|18flqZKz)z_@}^V3)ra*eHZ;DO9C>)Z_D+MaADU@m%124xj^SX{3MStMY!99SP8of7c?+%z6p6wgVhZm;m3 zt2K1pD%u(AHt#q+5Er~!Sm2ENIo1b`8ZK;Bi+WzOA{);7+7jCfhUkGgflcPt@O3^5 zw0&&^kFK@KXjaSSn&C>UfvRGPl<|IUP^_?Hi>M744rsG&5xHl{y#M;C6JS)fWe`+@Cidsg4cZtd^Jq3p7-<8*Ae=!41d<04Ko?@ z{B#_tq60)kxIZ7s)r&Lv(Y<3i(+yO|k$+^OtO^?XjK;Vs45ahU0kY?p6xZIL&nYb- zFT7gsZ^6ODz3Td2zIjdlyMO$5<;_>$&}h1qtJf~e=Rg03Z0{-zGj3!Thon1`)#)L1 zeh~5NqhT!r`;GRx$apw;WMqjS?$&vP-{nJQXtC;MwjDfy&gQB&gh6?cL>FUT?hy&7()xe_34?l z4v>8oqsy-w`<2;57cEE@dVWTR|Gi zuFQ&uWHz-D5W87@npR{ARvU9FCttiTb9iZ(F$L?26=WZ6_goi{e=c~_mg#u;CJvqv zQi`HAMoG*#aimcS-WP!)F%B*w#@)$WZtTouFCH?Ik7@`Yv}crelOQp;p*M^Lf->F+ zi*q|_Y{nEmThic0AE1-x1DHx^TW%Pey1~r$2)5Fz^7>1+^fLn;M4V_wpbi79oa8-* z7NDA=Krh2g@$%)_DIGXwfge9U;(yOHNyviVA8pW*1%njiWzGdMsQ{%*aw7S!(GwOE7PQ^_=PQ=!eqh&{Y4dC!aFST*|W zqG2Brbg1s&VXkZvAS)N#a|8^?<{C3d!uze3sbn`4 zl3lcHQm%b+AFoy(ICm`gl>a2nmufOjT|cxY!4*P+cAy5&K+rR+sqY+p^sL* zgix}MzKOp$>7v4&1L9!cr}JQM0LEfMZo9VOKsH>(J$SG}G7L92k1IB2nU9EBggkmN^N39vA^Ln_UQIVpd*r6FVl}m+GR+mZT{OIt@&ZT=QOE;5cCi&o1fF^kJsQlAhov+{i4quR7;vFk->Gu(&)=qPOFv8+6rWf;O@q&3 zlc8^DH$0S>GB;7=zfH5!HZt{WF#Dpio{AO-<3lyDdcc;gJb3>;9mvVqne`0mPma_9>}Vl>O1$1)TVSg^ zJ(S1yAJX|eK73+O)zmtTceD_`e{o+A+LX9>(>6Y_Z7B;)jTIM4YIgFvwFDEENrbG$E&G}T$GG`j#>?C|u2a`1qz zpdZwr*r^7EWD@bHk*p+>Co%SoF}Ik|U{C7%qN}>C?0n!HZ0Ws%jyoG`mQ+EuUu#iM z4*9*G-@hv#-Fu*rMzOMpF@8-NW)GW2Cb(!`Z5XeBz6HYw{N z;_4Gdy{GeUO;gHji8a?AYfyx`(|X-E+}4T;U{c{2Q#IEe>m=|rpsA;1*N;bG?8m_0 zsXPe8K08~s2Gt_#A(btgdWR?B_QwFV1(zy18qw!%lebfEXf5UMGDd1oe4v2 zc4&HPH5|{#=-icLA^8DJGE?iobx)oa=5EgXpocOh86WSu7h`SbUrgEc^F}N#t(j>U z-OmoN38{G@-V007Jv*+zrp~3|C2#@G7A;vt+cVR&qFj4rAIJ?3e31{J<0h@7D%Vcf z4v<}K*+r8F)VQpBf9-~k8#Wk9_!Q!Rp7_EWw+BW!7^Jg|K!d><>P#Vs1`)s2QXNO! zmDPAh&ZgTMnOu-dH^y@1+EVVmccR5+#n+*b%xs~O@En}YoK;^cBdyW}+(7ljZplT+ z%&M~fg2c^gk}Cc0Czp4(A2drxjs*S<=dm`UirN(nBH*coI*H>aPl*FRRwwe&$M+R3 zQAc>;g519Gl3aP|nqv0{GJ^Jx%SZ6@u)p+LR_Z`L`o%Bgy`TL|e(~eShp7dPa>*t~O3YVNXTMY&76xb`En3!acx%ZD%b123 zQFFq`R`JYKzs`}u$)z56?}~v#ZC0}<&@zuS>j1If=mh^hl~WW_sbD?k9^(1w+$d+N zXfnswmZq)1h#OGYE_y5G6PX}e)Y{IT)~haEy(&9ku<75?SMd1pBMEAZAAk6<{QM_B zlMmnjQ0_mtBR|^Rm4EWz{6pO@2c@&$aD0>Zh_%UlquxWgaaTFc8GFj454Sg12};}~ zn{_hND0mCmCk&4o;!HXzR?MT_>N&LbVeNs_^D8Ue)Cd~7vlPGNOzG~HvTE1MZKn?_eRcZW!}Rdm&At%poaFp-X0>=}`i;LeRf z{tLRzB|j2*R*03g>1cs@GyG1f~~;vSTn zv^Jjnh(dOuq;iff@ZWVXN$DZ~+aeoJ-x#eJy9m({pc!I^6uB>3l?Tq44$Z~`vd!o&)vwC!x89V? z*RM%69Wy%%a2hE5xkF`^hXbvKzuue6>(>wD_UAq=w}0}Ey!Ydu%6mV3S3daY1KHW# zmN(w~wCnO%y=$g>2Dm<&;_}>tW@*ERurH@0YjSJJI`Y0HF>16iSd2;3QC2*7_m(lM zy0z5~0U^P;Gz-f(j*sCuj^!~6 zBtMx>4d&7HgaNwpsh8yXt1rv-mtK;C>sMs|@+FQwm~PFu{nwh6!Brx=JG}o$e(|Fp z%ZESvx%~LMKb3#}&;Nz|*5CY^eBtwNabE)u4Ss&>XyTug4%hWt$LOOAl24>F93VH; zMt2;TcL-;?rE3Gx#}VNdgLfEAwKm%(RQ<*w0x_sDG);dp464e1kAtr8&MCc{S-<4J zdnTWokZBZw9IP!HKt_zd7MLVRf|NcjKYymMVZWa<6W6US+Hi0SF+)7cs>T9 z3HRkfolsRAOiQuFwp&}1aDjkQvB8_A;~ui}MKJY@P|EPNG*oz>WK!#`Z_9yZ8@tmj`S88>jf0$lrrHE#@bvV;gCG1(ppEAA2wmrFI6tp(FQ9@9Xr)nj9bNJwJN-l=se=2(^vT zU9rxBs4&lSi0q9(*;Y;xEXdCS&ak%Xp@?aT1Zw-u!cZmCgL+ncH!}8u6toGtX~MN-zcU^wzvaoTZ*YmDsOkzAskpl4W|s-kZGER;+i1tkZN^^AOp5SXr*O zin#$WE8kkAYI83t8X~sAOX>x{p7ZKFvdEtDg)_(fVtety%}r6>FIiVHib!KNxa1#m zEVgsUWGxT?BL3oo_n3W}D(6vn@J~>dNbqwr?wxu%|yfp-f5c^5#4a zb%8|NfuJ$3MF(+v7c}eYE}zI$Ar6A;H*ETh0 zg25IHf~pZ^S1PiZ^vjd6GrHPB^W}=hSh|?W3}TVI^7@~VFe;304QoE<&Sy5jfhC(4V(juNB3aRRRTx<|tdJs_OfmXqNKi@I*6>TA`>5vOSrzZ-+)qA+G)F zSLKyAUYD2Nd`+%?@eP?@xulL`OS1lu8UM!mW+<0mv*D7GydyPE(@x%e^GymUe)qe7 zMkjmWU{|JU@N*O2Fr&;h$>cRS*W(azT{QL_5wDd+|RKxQ$U7ZQ2yq#!1& zrF5peOZXD7dGH~3YcKL|qB>TqOfH(pEGD_LGuzR+oh8)Sm>d+vHaTyorqf-o8Y9gl z>*kO3i1uaOoY~Z4Kvq!KMH95%*i=*LM45Ngagx_zy1}yy&tT?kWf<7ne&Ah4Hljgy zHpS40OqCCP^B$B9gOGZu5v11ETVV@0a>$5jy$JcSKwQA4J)xxltBdImt|cVm-wKCB&v2hDvGEhZweS~>0x%A74q$1J1sC>aYw z`FQZzeFS4w*`zju%(4_kF3$HwwQz0`D4vMlACDvq>K_(tJjZ?TOq%mBsdi0|1xctr zu*r_hF2Aaf)h&*1O<~R-Y9X|iOvlN3Kh|UjA&dCRm)@4Y@wK1I_ulze8eN~sq@FRw zt-aF~&jW&Zp!;6fnal3>O!D~3=RYLb@F|4nl2JsHt7xKz05%Caz)>t-V@^2OQ%_A^ z=OtQ!u~}KRMQ7RBMZ)QU>J4#Fu)!7z&B0lo=zo{1wF!gL(pdxthd@Ud42r|g z9%-fmY<*kdNHE7x|7Euxuc|Ver%xhAH@Z4Kj=_^>cpujh6RVzu!h9%bKkjv1enZ+_fg+ zH4-ZpQ&e$Wm$m?&>2Wsr49RIMs}MHo7s&3~m7PB{h$2wnHIICr1;`gCEw#Hw-k``1 z_Z0m)y550wgL`m$lH37tn(4SA0}J;A+cX{-)J9eo`#jccJjCUL>@f~Cd!fd`p|aWt z9zcsusr3epEbFbSIZh$D1MR$Cl{OYOg~56!aZ*$?WFlE+-+8-+nLT5c;Z@uFw59}! z#YI#WIvPu=J;wYnyr`1Xnq*l=jsS;sj$Q?KP&;Y6Qdno?)>x6=#Q#E(cOb(72aD0C zwdoUP3Z~ji`XnV9j7h*CS}YC3YkO->O!4FpN}hIIXq3Z)0#0cGN5cl-=z2h_mEoQ9 ziD?1l6q^|bIy!?z109RWfxpjG(4%9n5Z1#PSi{Xu1KTvdZUZtxUN;e|A4H?pt-I18 z#%XsA99%t>i#K1BFu$x(%7lkfP~66SPZA9!Wu9?hnKo;Lr1<@o8l1oN)i29G`{(~! zQ(uS!TBKvMlp_r&>IqeQCf5%x%8u3qs&F>gRQ+KRXIHUj!aL@xFd|&R(Y}qrjES0C ziO|amjzggv7*Z6BpQ@pHpiX40PU`i~d`4bY=T=|Q!Zslw8+gT;sp8pDHJD)z6*#h^ z))a>ezS)JD8hSA*8Zo@jcyvMbbX~4Ky(PyFAIhWqcV%nuHJhH-n%p_A9WuPZDUjG_ zz{TUtdt{<@@e_7L;53;SO*xtiBe>CeGiH9_TG2tydDKhRE{p+W83!0tD3U{2mCpf` zR}E|ya60-vhYD3y^O-_bTe7vi%imdY^yf&6+t=i+uYN^de*0~i-n=S7vxNqn|Helh zRDK?i9pj9^2yl*w?$yPKbSwR{K1M}Fm+`6Yhhr_YDs(%!z;oO(lk!@l{+TQ6)Xb-H zrUm|-)x>_$iydeU*%o!-0uc53_FOJvHaDyc6N z2EbfT$e$O@;Z%9@pq(F9j$EG$FQe<`I%{x6?5a?Zdl-sE3jRJan&ldSOCptghS?}C zv0;)-HSH1PWXiF?xn91$E1W)!VX6?xE%mBdQyv&EXu(il^CP|u=1 z40^qDK93GJ=NC;aV{L5#2JP9Rdr3A^b?va?CQ*!`7p+YnsE(V%dd|PXxoEU}y$4DM z7ust_vCzJC z{tJWk>Hoq(SRT-oS@5V4qXLG=LZO_X@J0LdR2_hN#DxuesgT}=ak(xyIFp;GHnuZZY;TRO$ieMtrSV7&^vL_qcuQ6?yf|x8(9m*QM1A>LYao^6^KqtF^idnz7Xl z97s!Y0cN}af?OP`gT{FRTSqggRx^ucsm|lFFlBaB z7#J5mH)r{f8R<~O`5MizQ8e`F$z ztYtRKd^1EKK;Ql$Y&_?*|(xl{MH#XH|OU;fJQ^ zQCY+lgZ#C=at4BhMbuN~2A_wsf^Vp31FDQCzApGCN5nEyO0FX%4qJ%_?U5>@cn@^X zqRaN=^h6J5YqVamjndQpLjN9O)J3#OgpfV13$Ilc;a~%CuVh{P7u;`QOZ;*HtBo}h zXOFR4I{Lf@z=-MyKYI5ka`%HLY7+tt#`RZk$d#9`vp8C5%_2|-G->oYCC+|R>mGma zcYa&`;xB$8kI$@OE;8ck9DVO(OMmam<%?uzjDnLTy8gcWTx>d&bFa>oi38^!uPl;5 zitiB(-s^%ojvFuEmTR|e$z*4nQI_?TbY3+v#neP9to4i$wYDa_auB@k zCau$<>Am#l7y8^QxqS74VZXs5HSb%MZ261aO0b#@q_neov9a>ZX_VAG7X&<5$aCx& z1Rz6+mXQ)B(x~lpbn04fSso(qwcypF;F-4CSjf_k=NfSa7ErIgbX%^x_G$Tev6Mgj z<~QZ%5AR7(NNBE*(_89*|NfVMQ!XmB)o3OIzUMVI7sv`jJ)9L zFjFozXXGNoug^UfosGD)c7m#88lUva1?#*&O?)tvb2bz)B|VyqLW5(o^Ju-%u&8C9 z``Ao`u^NgLNsk<2(COB3P(1JFl3QXNj{bJ+l#_^#)X-7vsx~WsI^zC~A%|dq;O5WIc#Sh&)x80=lrx zS=U~y?rhwnhe^?Y&q-PagRwifcELEikEt3|b`?9rt4TeJi);co9WZ#nSP(PZg~jFS zjh3!g-hD3Kd2Jo1d7(?>MDBrvGT4 z0qk<|>J{0&d|AfxxpftSD~n7bp}`3S!!e;9G|(Mup_$`o8x)@v&e6}D>pGxgdQvs) ztLR+foCk|rvk}v!Yl!V*ZFlx|e4q42i90QLWShc({Ge+;F^LmKd!7X|DnpILhkYUN z==|VQm@wnPjrEK~Hi6mPaB}3^mfC0(^hCB7gR=l^77pqjn1!;?+Q!-OLL=2i_AgzP zTc7)q{Pg2H^6$U-2l8lnCQlPog+a58l2+2-pi(1_a3*9FZ5D03cB4ZaX&J0>d1L)Xg*>in!2sxH@ z_28ERt|1ihM9Qu}+!2NQwFQ76O~LkA7FKj46EU{hJ)H$+q1Q*rkGATWLgEboZSbc#6&aBUt;;~J*>(YqU4SH-NHQih9W?SKlIYu*5K@j*WX^^yZzYJPj_%6tiZ(PTa@Ll?4?aJ}?mb#F5i^?3U3|N9L1V<)#2=I?Z}1g zsoc7vxcbgaW-g_^t;TbkeLw0{1a-SW=yHz1Unq2E23*Q~cV`cIs>-#ltgAYao@Yj; zM8&?}SqH;GjRxrCz(M?bWa0rD#NZ=b+L=BlbhV!?is)#{Or_wm7Cud`iDRt?oywtR z1mo=;dFkdYdFSyH`Mp2;wtR4SMA61my@<2c7;d_7^1YwDD?u}q>o=~-7k=|=^4ZV6 zLBm55g*vjOLWL{znB4tX?!W(@JXE;r!P$M;(Hhgm-Cf=n>Mw8xppar6`)iaE6*B_{ z6ykdoeKF(~I?NY6X&LL!O!b*ye#n^ZFAG1H_FkmTCbup5bcDRX;(^MhfiCuDaJ)8Q zbbp39qmWIfW4&6Hv!=}UWVP*Bg1tOe))AO6m&HV z*gmmqbFYnEmpKx@nq*m^%^O;?`4WNnvR+ZM47LdfLabXN2qtdp*V~y=K!&YC#`667 z2nV{|%54pJA^5}ISamilJ!j37Y!Qd8;5fz_d2sq)H&kMjp}mvgqap3nFAj#owBAj3 zsu>Vb!|>hC)lPDAj#0||CS8w;4oJ)(HErut(kf~gvEipR>Eukg!_T6D?Np7>V$taa zw)C-fIcxT6w5_XR`h(K{LK<6`T6P@!$fzL2jl#EWs;moT7%>f{8~U8~<)%7$4!C1! zasTk*i=ZsiBjJ=fMhq;#E(t}v@tHT}>dm*cxEJN11KJb$vp@MBsjxe{ zbGh}Y+gvM4MO!txTk_WHFUzN1eo5|s?;UfJBE&8sw1u1xi`mrt zK}zhJE*T$X_6MH18VxowabugRFNYJU^Vr(kGo63-OkfJ&u{^r_SneKo^0W8v%AbDs zhw>LcdPnX(UC7B|#rfH-rrs#VBf^;~Oo=^k<6vL@tFM1n9zH#>QL*~9i5e}ijgr3S zMECE6kyl57#v3=T$$|bCMa&+l_vp~Q0-M+napf#oOyVK9ba#eTVkr_kI|vS@vUE4( z{S79{3f;({Og^RTI+_IYz_h$aOfSxQm`)T%dZ=r857b_*Id18Dex%R*&X0ab2hwtM zubwYV_5+-!1{&q)`|5N~r#o_3Pi3{eCwp(ct&Ub}Ou9O zr`Q;1>8YI+PchKL5dAQnXLxQNm*<)8bKe%9@q>?{{fGr(|D^h?{d$r<2A9DeH_9~W zyw22o<`q8ik~XhA^zS`Z` zOx0Z|R^xY;%gl_!%oo=k+_c2M`YSlP62w_z4ecvlr0OCqVT*fd^0N=iqI$gP;7xJv zUn^9yz!Yrq7d$A7eeU@|v&~E`E86%(tdy@W^$wu3 z7I8vla3~55RLl(QCPAV{VJRe|#j%q(8eW*05h$=SVsxiPi8^Mjw)ulMMK)c|SX%E} zaV*t;3mxj6G$pFy_tJBmu>X9@lt)P$`_!4ClJWT9xbRdRz*qkEm-P2`1>}sg!!tF& zr?OOIb@$PI`PR3;CBOLjd-5Ou^}mt-(|`Bh%D!U#5YUsfP#k?rZeKf)TWUoA^anqc zC0QT2sE5w$k&z}q?~~*ZLnsDBM#ci6|0HH>8c3Z-HNj!V2#skpVZwNz{nXiUXh7qk zfzA_@Y;}Kp`0-u&qwoDhe)Qpy{N?-iPqo&D;Ee1l zpXx|wgutLe|6D6imJ9h%o#?XCI$%Aapx{G&ukXI|b2-vI4dTN}ozP63M2urf)|_fB zqgv^EYf<{q*-GC1@UDDa&*~D_uU}hhRvLD<2#0j)M7H7;xeT@9qceGT*~mM;_&^TS z5l=M>0c&Va9anPYPdrgdqqsy014PKv``NLwMe8GQ67QYd4%~aU(0i}hhXvVvRxvU_ zAz?EXea28(y`@K!65#NZ3C!fjAHq2u1{td%9@nzoSChPOq06QZCnIL!LG?w zw0S1w8~rs5<%aV2vg71h36icA2FsN=DXB0$Zn8(Y5z(!i1T_TqbEGL zX6HsWxU$8evH+kqI5_Zv>Sz#7=f)L$dP=HC8;WBomCyT?;Nu{ZWg3~Wf^PK6p^V^i z!6}tZNh8u2u3iR4iBV#E8lO9v%mPRz?QXnggOf;mgHuYWY&u+jZEdbBq~lD3MKYZl zB!%dSQ6&d9wZzm%W9vGlj;UVj(hKNG`hCLdflPs8wwzI7;p;|LQn?0D!9bm+$xY)U zc!#etA#t!FIVT-|SzA9rATdD5#8Iq4-*c?>kE9s}#+2^UmEP)Z%UcRr-1+cBdFRJJ zknjJ=pUM}%`gz$txIlZL=JMw2ugLt5zNL|aMT99kXf|+~GX}Sus<*-6o?sk! z6p~w?&tiH`k%r91joP3s^s{g#0q%2cQXM>1`g>XadK61>?8Yl3Dh)MHX* z3>AYVD+-7v@tWSq=*wNm9l65DFRpccP8v#!9G{-h!MAQq_}*gUS`q3(wfgW(od@bV z`V*RK$@boXy#2+`%a1?&NS){kY+|Q)j?{s+G&U6FG|-Ws13kkhj~>bT$D^4S|lQfNEOK<%d;Z}CToa? z`nXy$AlI&tjSE9R35?m=um&_9&PO&=1I)iAoEz|biccaUYpek_ZP=@4Uhz3&MT4BH zH~3V)x=`No&q?W0ANDmQKhUjLge~(MIHnLv?U8U|e!no3@(41V$6%Rc>(0OxeC-_! z_H;>=E@jnmW7?61-x*m2o)z;>gi{#Tj(E6}b$dvmML5Jp$iO4m(pmow<%Xa`hdNtr z{~l9Bv}L!s#BeUlGT5-q@Zh-sw{3gURB$m!*5oLyR*^CvJv*)QJnB?%Y!f)Xdey$rTSxRm+lEPGCGaDmZ47s1^0bCb&h5xVXxjR3Qy<6Ah%FP3L z_a{G;$M^2bOzT3`WEVq9)S%Dhsusp~=VN&Y?mmoIpZr)v=Jey>>xa*5eLd)8AoBsZ z4s0r44Q5`I0bwa+BkIoAo%&KCw>x+4$;Wr^%l#({=`@1=!WX|Jx4!t>@|Smx<@g(a zA{Q@Rl4CXA?>+vQ2Rs+={muIzfel- zP-N}OvHU5m}HzDji2nOMPIbAk>WkQ5@A^1@p}_m-?Ec1R0LH_Ai#7lhnh_!|S2k zjXVoMdom(kMzGmNKC0IstGv!A@<$%ozs8`>(!OlJi?}D$_A^V?1qiRtYYx7iAy>U zV+{-*YzSq>20fcQ4`^Qv*EQ2Qf$=StO_2i`jru`L`61;xN_HH1amSp1)V$1+GEea-k@KKhJ8fsGk?G!gPo^vp;j@V)DojwPjqmSgt(Z#ps>q75~m-2*&~V!8PF;LR_{yorm1X>tz^h z1&Ml)EVuP%4)(U>@BhxGmRvk+1gxlto8)Xsm*SFr1Aci1PD^1R;4iC*4e3S={hgfc`P42 zm8Xv$%cBPmO@77)*@Vsv3ek9H4(8bxG&*53IQnHT)1zuiUGSHbFrIl4DoQ;HFoqpS z=OAS9o-_I7=d%}!wb!twVsa@KXr}H3$_&9IKgh1~{_3nm_8j_%KdMPh#e&^Fex2;5>2X@kuMdmW9^ZE070Nm9fK8 z7Dlw6GA{_KF1t5QMZ2D1%L}P%9 zva=xjAqC>Il@Fgf(`c1ZNN^f#h(4EGqi$v!)@8g_C$yv3E+td^AzKuL*%Jx}G}iK8 zv8g6f?x9`T%-_=4jVKWu_{#e~YI7{>#^|!SQ@v+X1hSOa`Y)RV`176i#qmAod;KpB zH%)61Zs>7bIt_j^701!B+ZL1jY8pjG$4es<%oN97>qcr0kEOYPPb2F~x~?<1rkTf$ zO9%4Kdk=K|ryN9tOX4KEwH3orC#qZ^GxI7<0YHf7BPE8gVGY4RHMr=xKvyoiW-}q6 zvprz5K}<{R+I$=8Jj{gZtv!ibI~)r8_{l@X-7A^RE4lNN_w<^M^Z+zAC2+ujXW*gx zWbeu)dGO%AJXS+?S??!#k;rOy4Qn5jIvxndp$Qa{<)>;K;VjuWhrP4AO)aKIA*F<@ zayqv{K018YYwm@>eT#k9`Y2-`4i?R^ns{Sn3`Ev`S|?!$$HQWx;~AcZtFl7HwZ>FO z8L^g-YXxJ7ed=G|e))?0t-t>dvmhL0xGWU6Z|q!@ zYX=AN;m_aItYgVJ8i2bOO)FXQyQLmo;F)9J6FJvQnQ4a7P1WE`_E;mFf}yuNhh7F3 z9FrDD`ZK$jvbnpb1*Zeq-+!V-_H8+O@|aTdigl}_*Pv1}wuu&Ox3{LUHQkcA8kwYZ z9Ah0d9t8Oa*tRJ(2y{Pl2-4bEleB3*kGgf8v39`P96Equj|Tm?+lg%Khx0u0s~QAz zouqQ?&KKE17OBToFX{4vhPSbg3CJ2-`KL13rg0e5YHTk54vCW$9D`q95?9=9JwR~U zxR~9IZmz|)3qPZw(uMGu0YO=UvWtdzh;1$!wnNP))&l}3Gn$x6uq7s7)*@hU*|mON zR;urx32Z>b2iKj=R6^%J<0Lmoyag=Il+8x14WB8$?vY=zK*Qv`Tc5Jkf8dZW&6{rx zGq=>tCvbT$M83GG8n3hVtbeesH-H%n!-tHAGNOKqQ5q>FQ5p0_RcsDrNtC%B_NNeL zApO!Z8-jCeH1epu%OY^G$fiiJ?sv@8uByI>j$IAs7kze#VWVv+gjEBr{EdddG}xf> z*YG0O+8-`997m)EZh%e;$6(_u757fZM{@l1M4^pF=IqC4Nn@R>A-J%&Z3a<{8;?VZ zHHWj-B1CDP+hB`Cr&3qO7oRD7#Aw9FX(Ah9+7HK;hyDbEIxQ`3S$u{+T8hmGui1#! zQiE$UvY}g?hPG_W^T>k$bwG;0x`>$SdqZS!xw9aH3H#I_MoX#1XJPnbG>5DEW~?=h z=ImIbu_LX2Xx2J1DHL2QuzX~imfJ@oSa8sjK_-J`c;*#Ly{eNTeTe-{8tp>PWHcS~ zzSoU8^+aQ6`yAH{x;n-Uy!P5l^3~t@P5JuoeogkS?#RxA8I1!34q#Xi0O8DSR}=0e z6jQ;b`;9MsMRsS~@>2~G=H8sgMT4|Y@=?ev-usz`BT>h;hG3yyz$MMhl0GmzpKJRU z#ZpZ-RG9qNu1yPUNY9{3B9ihd${91wXeOX*}rP_+`KMqF3$1p-2GglKe6T*ZJ45#lakQ#jKOT z6k#>Dhiw73o_Pgt+6E*`GE3J`V#TIO+DxLE21Y?nIYT}N{BXt-jVv%by{fEd#2PgF z_s&cDNrJX`QSzusg=QYSucijgUc41-x$a!THX zb*z~Q4ggLCMyPY?6T?}}a9|Unh(EG+5uZn55fnGP*8(=9lH81Bf8d~Ol3n*q&&;p$ z>YJ&JdDU@tG~kgyn+L}l72B;9iaGr7j=cYqcjQMu_yJ|Wo78$`qSa`#(wh60QFKkq zfZxab0EqV`f0libv40rE^c@mNPR+$Gw5hm>>abueRg1;Lx{$M7>Tw%rec+3XGg*r$;sGT>5@p*Y`lhsJ4;i0vh-EZDej!^QX?8Z! zb$|nblR@pHjBvJ(v3`2};_mjo{N~rcE}#GUmu0j+m!w(Pl^a*&*2_0E(%+U_SFg&! z_8v10tV0BYMnCuE8!u_*bx9sRc_a(ev{2uwjErJ)fMB%s529zicl;f&$6B+kZ9V)q zFCNGhecv6eKh1QVb~Iz?k@{pTwCD|EE+h&91J(=ohx${7Qd=LRKuEc==33S(qh)4R z&n!p88%?cXOR|OsU+uXw(z*0U3NKdU&igbwqw}@Jp~U#F`obAQtt3wdelO(g2FMkcD1(d248g^Xn;IKb&4`HtAAOrYf}uZ z^bnr&$DW7HGAbYhvnOP+{Qay~WMX43ILPjBFH{5asa)K!$==F}tG%{=Fbvjt(r6Up z%;>eta|AQ`!`U01&wa*?z?qQkgN@HCw2n&HAc_i#&6l>pCN_?B4Gpd+?4n$0)n4^E`>s7cuc0qe{S1XwU&1PQ5uVw*2_?M7pZgd(jWCHn}54N4ZxE3`$H)vCVr z-1wZ7hOvU-lHKyP8p+T^xpnP=y!GmBdH>E6`Rq%t$fG+Cv~Ye(xWziR6TALz?p>5u zwWvOh3rV+M1_5wy)3)AWXu_-ZY9xIy!xx2Fn7<#o3zhS#pg!C@WX)06-C^%0x8AQMArO zBWeU0$afffDUUcfFPlCbebBnHcUI>eW(t}1A7j{ry?DU-_se9S9Eci8q#H0U`!;C&P1 z0`sjgIqC?~i50suK&r*s0Psqe`LL9mTpgp2ilu2#os2#(gc8D?^euYj4=yp77xd@L1)&0BXkby1}vBr zf4(7P<2b#TIAPsZB{j@jA;WKW?Rg`*s$~cptg08)HF76s6!|sMV1s2Sw+%X<4T3h- z14F)G-*bH%9PFtU#BaU+n#|O3%=PcJ!jYh%VubBT3(1!?x<&g33g2xzmaWN_9BR!2 z&=uAXJtS+5WJg*DfU(5Tq_IY)D4ey9neq|EP!4LUVn1Tn4?~hZGevhfg1AmaQ2Ynj*D;KhnBQWMgAP z_XEd`sNIxz?cf@(E~nU;AmVf8qcPINom^IdWszNfd|xAbQ#+`*9uP`YkWLyWXp9tg z*t@hZTj<9K0IiMWf!>S%`hWMgL|On2}3lxU96eM#Jjrx4bZPc{iPPgi}At;T-+iy0cEm;B2X3@yfE79{Yss zapMyRQCI_uXXK+^#hcVHFdkT6MfzDKd2V^?@__eHBK+va+&<4ANV4cA`jkN;+?5jn zAVp7RWo^^B8e`xvokn^-_QJ9FNL<6i97~pGUw?IEs(*`8Yp_N>Lzmz*6oZZ{9!Seh zA}0v4vlt{# zofJtxbo}ws)n(3@21eZIythk!ML5hHS8y8NntE(i zU%&L9$Tc6-8ED%i!&DW6=JB*<+rUcCEQ;jVgBLUyoT?38oF3`VA+N+7rZdXUjMKP? zzXq@0k{#Gcfx&VuI=?bS-m>M+=)uXDvm`JwiMNK0VC9gr)F+**A7?^ z4!bS7RVirKE-6piD2q@1M#1$_%d0m2K7Y=qXH|9U|E*mgs>f8FtWHZ=_DnKJqHM(K zJm)(}QEc@Fpv*RT-ixq(^k?A8#(K31Jsimd0+CaF=&ff!*{~tyM zYB@boLozvKF*Ve4xpe73E?m4I^6+E+931wsLSCF+r<*Tf=0h-;0zC<16vyz)%j{}# zXrmXCqmRqCo$^63by`MhG!WKA*pbm^GBK@2#zCIScD<{`-?x~m|LLE7M-I;(bMqf; zt8uSqWO*DuzAI0j-j~aob$ssaPxH`Ja2V7nGCaRR9YrIqpqbP1_)y>fn1$cP$srr& z_O*U6yST@~Zvw;$F*-E74QRnx+pVvI^oM)+0;~r8C>oIvJQGW$ZkU{2iG5Q95?7rb z`crvHvxw>LR9X$YZ@+d^oeRkdsG`O^8a&E-Y2TX0Z&y7*xg)r&kO@9jL;XXbd+46h$)`t^cAe1SV{xdg|i8w%hsFGc>c!8y(?MeHWr-o`TTWefyvV4nyIeO8rQ#{ zDCANfJ(g;AAe7HYRf&=bM}oFDL37)P4PD$PYOEJe4(0Kar?RWi6R^@P%{mapx9tZS zg`0fHQrGJ6@Q4PU!)3S}z4Wq`cOA>cGi*)X0}+~W)e{eW-t^K1-v>VT7`-@F^)&jo zn7H0rjafKTJbZj6d((aS-QWJATshd1Z+-VW@{^zaOg{eLo}6fuP5Byq!224Z|HJ?N z-;vi}zAh6rwpC}@F9t-xSVk@6wP2g6QCuB8m9vv0V!oJDf1tm+r?mv6;SJSQE6Su; zQ8qhk8Ng3cGT3sk2QL^i-nR!ZEL2w}oi7{+WXu{!jbQ(wm?=%o?C$DI*X1j}{S_^c z>oeJ#YC#{TcEv!Zh0IE4bLk=ZQ7u+-br$8yXJ41!dh=B_6($y{E3JL(k>B4uzOP2) zlngc)+vV}8jRDs6XjW%(s%!D&(L+vie297Khq^ZEF!$7Py!^(eDn8{ni`~ z)S4U-Ee5{adeE4I!N7aMc|23dvz~2R6C^SsPN7?i9XcFi>>0$A?Uel%)vudW>K~!>ur*Y; zZJJ-w!-6ccwd|?P_lZ@3u!r|ywHxcJBYNX-UGO;Hf_1fR{$EPq=zfaZwajOraJMcD zYqe?g=-KGlXh=@VkeHZquxDoCjh(onJSGFz%SOYg*R5bDmexCj9x1M^Jcpf-nNL+z zV^mp>2MkLQT9sVSuuLM*7@lEBlc#@c5TyLJh;Gm&>DmQM0EOW@9WQyi|-7gtlw1}LJGxsWO?UdU{J1I zHsU#Z__aN+*qE~!VJ3HbM#I*uk4X7N(Z3pBkk5VL(^^2jtdPoY$j{&ZKpsAQEGH|4 zw`N=Nvet6m_{O9wq@8baN&PEdVb{YLsnHgDj zoH9UQF}yR_FIredLlMe7zwi+mOV0xlgHx@@OX-ei>b&#WobfyA07uOkYjMaL&eTEd zUpzJC2EY42kSZhW1@7-_IPWg3kHdSR8xaTDn|_r`oLtt<;qDZL-I(lnIFtXy8i5aGTUkZDW0o2 zvL~wT{IjjEq0D6&{7&+LC1z`K_AEt4gzP#WhQ+45QB@eK`OoufnYlLTKj)q0qfxy9 zTVKPc8$1Ls>CER%0jEZT+PfTm4nMQ27toz*p<6O~gh$_^!q z{_sMiQFAEGic2=~4Py_-3=gPdM(s1X-_Gk7wZmC?)<^D2HI`Oz$jqZ%Pw%2PuVGYT zg<62Ph#}|x`uhp+N;Jx7)CVIK&8aoqNQw0t4xFz|dSkUh2la%-x)PB@dw4XAA(!VQ z<8nS$(!cbAh9b*&hW{M=BMtuJPO-Qk8g1RI=~NbvKa}NoN@ya@E~;%A3rtw8wIg<* z=K72mv`~-Q#`>%*Em&(rKGmZ5%^TMU(`7~l4Bf-SCmO{pWgBB{C6*}DWH*M!ba+zz zpFuVt$Lv^!w`UQ#^ie&U@fHqgsUvB%7}21}cl1cMwV1v8(t*7E$~B9m*lgO`*ieP; z79W4Wf-ef>i>GiD7SH`}ss(RrL_Oxn-UuVRw)yp=*^JSj1)z~V2xhPo zSy&c%TPJrmpu+&jYn;}D;9ULSwHyvGVP(6YG#b^f+EX*iC|WjF%m&DefoG?hk>bCcY2B=CL;(kIo6*CbST8mE zI62{&yR>^jwlxF$)T^J8>zV=0v_>Y*-pOPZkDIb6ii9Fumr65ViDcbC;TMn{u0ZL< zdg^*dWG*Pqt8<_FFs{lN-jq5n%tY@*Ch_S zi4=Jx1hiQJe5y4L%zj4@Nj4j_rJ@DiP|w}ln_9M~!54Zv*rQT;y(k+LJlEEqWj>K~ zT(vb9lQr9U|4r$u3Dkr`F&+>y$F+r?^31s;jBbMo2a-aTtcPOcot}tF!J^`L?_k{Y z5hVzc$v(SAK6Ro{5FJ5YVnuuxlX=FzAWX@EQ~y2VVB-s=ylX;N(CHzJ{^E{QIUWY0(`RTaiBck#46@s5%qRX=l1L)sx!tlnaqj_Y7#^CzyO2=lFRcAwaKN;8Ocx(67Pq-b8v8x z9sj3iE2|6YJ>Am`;O^Z!a{1;3QkGNKJ7(5zh>Zm9v#A#PBN#P$&kHe1F(T6Z88!?k z+T3rCZsxn&JWGf|A)Ah-ML>QxcXwp(l3vf=o^0=FRyw!(7&Cs_!&Kq}UP)%;beox` zmoSSF5iy}cj2d2Pp&UDXy04B~{dRY}R0BBHz1z@9w)9Gg{Y6zFWQgyz$a8^vTsr`f zXOuI59G;nBUl*UD2QLo6+iCLA!G2cZ6sj0~hL7#z)`KWR0#Z>C;5`k_NEo0Ztve+s zV&sft*kkfc;N*MFjI9C>rHLYnF$VgWNe8X!?U+YNDkceIMJf9e)AOF&yY!3ah^KGC>Od1 z^x9V0po^4-K+Y9`*qtf9F)Bku0%FBf9VqrzH8QQKsamfHHlXfj=$^5`b+Sd4RAz!j z4@|@hqHONOx&@1lpASSx-$*MKF_KXh(;$7c7xvEtlOV+f>(sHKoB!jF@5<{ZFU!_= zZb6WTHkxY_vx6~G3GcxQ5k&`jXrZY6lUMJ45(|$Gw z58~^VUX+}RI5EZB18QT^<>5`w<`#KxbVaecFGLTYmXrq^h zOR1lNf_^`F_}{>7p2x#4N}9tgT_Xw z;(zcWC}yIcp*_^-_XvOvyNxl>C$?7Xhv7TcA}c7R^7>UXh&jsi6hEJMn=|d1p;&=E zI4r;+U8}Xk_z4Fo`1oPn-Y{U$=0dixf}zj|J*^r>LIK%CYYlkp=og`bV6n1Zn|9WS zs&r)ckj_XcYOx?B8ViuurQcsc-W(DiXqG}6P5IZxw4d5kAUN!svy)SemM8M7z9_H3 z?kutX2(nPSX~XLdQ8n zMx?b9$m3UGL|J&~51Fo8)b~4)@%Bt+lQ4kMEHXyJ7@Sx(hK*Zw%uS(;0_uES*DEat z8@pf~$g!UsS)7Oc9V{dqL3F;uEKT)3X8K$qccjsd{8e6Aq?66Tjj^9BTX=q`#Vuljq8Ot~h#&z58@Z}4ry&J{;6fJML{Ozc z&GNL}(7MWq5!F1}=vkU&A~@?dhBkR8VT(D@R^I>x5<`4e8s*pq#EsX5y4G=`Ut45* z^WsLw5iPUu<;K4`3wO;FGq=6x$i53M3qrAOx%281%~m7M1o{8~}RU-iWl zl3CG8R$44Rd-#!zb}mWW88iA`rNFt=+#u^lvThX$uA`)fMmH8Th^Dh08b&~Xkq#kp zZp(7Ll!p%=SxTD>D;GXvaYj)n1~y0Dwh0Zk8m|5MLyJLYGv|)BKqu7Xy0SB$hGSR{ZguzdUqC#V0dw_`mZLM@2DoBy5 zgJN+wHSYYZuEwY!SY$PhCg-2`Z;onvGDIu^PhONnW}>b+`b+$)=nX)x6pTNk=hoDM z;c%Zkc_NP_N{~8m1NmV6+4#k!X`0+l3SKhD20;*tMe&Wpn|Ss^@s z2GuaQ7Y#W7=7^n^<4M)KmmgHh-g|;12v&c_ zWsKNYV?P6jV;$zktZW(^5pD|TcFlAiCZS*>TQR%^7ctu!IgDhK(8Ve00f|N&tdOjux`wrVJiYrpH#b(f2_A!^RztjE0tHicB<$ z#Kx@>bgKHzRaIHW+KXd@O+pd1+B(mzgEZs$Hi(|B`##*BQI<2p$_(HtZs40khSmQT zSxBZ(0=lZwQYK(49X^ot4D0qKuxoaTC11J+XLEz&NE;pv7=Wz>WmM?p z{E?B2bUngs?EMxj#~XDtB^fHgTA!d5Sd$M00<_(%y^$=LaWSRoirw+(LE*K=b8_Ym zV@VG#l+_&W^?ZMQeKQ%=IX!zWa<54LwY~`$(&Tw;M6OAM^UznmmggrcgC83FD|kjo zyV(>6ZP%Nj=kVgQAR%wRa*x4bcVnQcT^k2Z3q+DJpH`&Z&L&n5o>KG>w$`L&niX0U z^o-0v<4pzTL-33}WK&xE=Ijv#`*Qkdi`K4IeXuWfp3oR*L+m2Q1}x4n!Ei-IZu$+} z!BP*{Oj9~U7&vIa*(@uleEQm&g>GVojW+>CpQGSLIczMB6j=uMNk6 zuwE>Km25hk;oRs#uUwxBo722xpcf{-u954S@+7&K&RB&R4GMIYDQ!N!W*z*H8*NbX zm|8ywY;3En!xNuDt~67{XKA=)u>HCF|Es;iFZnJgkSm#>pL+FF7EkZ0LA)Vhdy81N zcx@-q`N3#bglfVv$ z=z@1@EG7G=MMS^qEf(B6c-18L%K&n0*Iv1^XUYAQn^RlU@2Q-TAmQco8z+aO%hr|!gR^PPGJ>g2M;G=qS)4@Df$%hyg$eQEUdcHuHn(v+=xzO zMB!Q3OrkSjN^~mc=(xj(G(WNY+T5H&`d;$1(Y|gh2|I9`l-}M@XS(2;XMPqY(w#hz z?&15ofuA^8Tj1N!dv231`N(8DU*?c{CGOzeK-ev6P0{mq98_O9)a}0Xs$T`^_X-1z9KI|DG)*GxSN6KGiMi7a7Fnei@TN~NS=B5}Hh`a6unMVkl z(j{3Yz?}#;VH|YuifnGaT*(BMs+(d`=>}OJN%!=Q#MuQ2^8>xcDe-<#j#t^RVIjk7saQ1xa z?{x@QjOzYyCXw?q5>m>ka=*HLM45aKCJ!>AJBplf7~dKa@6=C1u(MLq zLWvsDot~`q4`!g~VVyX3AHAuowRPq^b)2Er#R@6?;ZP0E6#O82R$33Ne2xd%Q`Waa z

    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

      rx}wGCgV=zj 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 }> } /> + } /> diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index eda7ffc..de785d5 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -5,8 +5,11 @@ --box-shadow-red: 0 5px 12px rgba(239, 68, 68, 0.5); --color-blue: #0ea5e9; --box-shadow-blue: 0 5px 12px rgba(14, 165, 233, 0.3); + --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.2); + --color-white: #fff; --color-black: #000; + --color-slate: #e2e8f0; --color-orange: #f97316; --padding-desktop: 40px 65px; --padding-mobile: 40px 25px; diff --git a/tauri-app/src/pages/Home/index.css b/tauri-app/src/pages/Home/index.css index 514d9a2..991884d 100644 --- a/tauri-app/src/pages/Home/index.css +++ b/tauri-app/src/pages/Home/index.css @@ -96,7 +96,7 @@ align-items: center; justify-content: center; flex-direction: column; - padding: 18px 15px; + padding: 15px 18px; margin: 20px; box-shadow: 0 4px 3px rgba(0, 0, 0, 0.2); } @@ -119,8 +119,9 @@ .tech-container { display: flex; - justify-content: space-between; + justify-content: space-around; align-items: center; + flex-wrap: wrap; } .more-info-container { @@ -286,6 +287,7 @@ .tech-container { flex-direction: column; + flex-wrap: nowrap; } .more-info-container { diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 409a2db..8d24ccb 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -105,7 +105,7 @@ export default function Home() {
      - +

      Dave

      @@ -163,6 +163,55 @@ export default function Home() { d="M0,128L10,154.7C20,181,40,235,60,240C80,245,100,203,120,160C140,117,160,75,180,69.3C200,64,220,96,240,133.3C260,171,280,213,300,218.7C320,224,340,192,360,202.7C380,213,400,267,420,256C440,245,460,171,480,122.7C500,75,520,53,540,48C560,43,580,53,600,96C620,139,640,213,660,229.3C680,245,700,203,720,176C740,149,760,139,780,117.3C800,96,820,64,840,69.3C860,75,880,117,900,149.3C920,181,940,203,960,208C980,213,1000,203,1020,170.7C1040,139,1060,85,1080,53.3C1100,21,1120,11,1140,42.7C1160,75,1180,149,1200,192C1220,235,1240,245,1260,229.3C1280,213,1300,171,1320,149.3C1340,128,1360,128,1380,128C1400,128,1420,128,1430,128L1440,128L1440,0L1430,0C1420,0,1400,0,1380,0C1360,0,1340,0,1320,0C1300,0,1280,0,1260,0C1240,0,1220,0,1200,0C1180,0,1160,0,1140,0C1120,0,1100,0,1080,0C1060,0,1040,0,1020,0C1000,0,980,0,960,0C940,0,920,0,900,0C880,0,860,0,840,0C820,0,800,0,780,0C760,0,740,0,720,0C700,0,680,0,660,0C640,0,620,0,600,0C580,0,560,0,540,0C520,0,500,0,480,0C460,0,440,0,420,0C400,0,380,0,360,0C340,0,320,0,300,0C280,0,260,0,240,0C220,0,200,0,180,0C160,0,140,0,120,0C100,0,80,0,60,0C40,0,20,0,10,0L0,0Z" > +
      +

      Major Features

      +
      +
      + +

      Secure Storage

      +

      + Pulsepal employes blockchain for.storing user data and this + ensures that effective data protection from data loss or + manipulation and this is due to the immutability of data stored + on a blockchain. +

      +
      +
      + +

      Find Your Tribe

      +

      + Pulsepal uses articial intelligence to aid users with similiar + medical conditions find matches who can relate with them and + also find doctors/specialist within there regions on such + condition. +

      +
      +
      + +

      Home Remedies

      +

      + Pulsepal home remedies help users find a quick for emergency + situations and a also find better ways to cope with issues + bothering them. +

      +
      +
      + +

      Find Specialist

      +

      + Pulsepal use of artifical intelligence aids in making users + easily locate specialist within there region on medical + conditions affecting giving them easier access to a health + professional. +

      +
      +
      +
      ); diff --git a/tauri-app/src/pages/RecordDetail/index.css b/tauri-app/src/pages/RecordDetail/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/RecordDetail/index.tsx b/tauri-app/src/pages/RecordDetail/index.tsx new file mode 100644 index 0000000..47af476 --- /dev/null +++ b/tauri-app/src/pages/RecordDetail/index.tsx @@ -0,0 +1,9 @@ +import "./index.css"; + +const index = () => { + return
      +

      RecordDetail

      +
      ; +}; + +export default index; diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css new file mode 100644 index 0000000..13c38ab --- /dev/null +++ b/tauri-app/src/pages/Records/index.css @@ -0,0 +1,96 @@ +.main-records-container { + padding: var(--padding-desktop); +} + +.records-header { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.records-header h1 { + font-family: "Pacifico"; + font-size: 45px; +} + +.add-records-btn { + width: 60px; + height: 60px; + background: var(--color-blue); + font-size: 34px; + color: var(--color-white); + box-shadow: var(--box-shadow-blue); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + cursor: pointer; + z-index: 7; + transition: 0.3s; +} + +.close-add-records-btn { + width: 60px; + height: 60px; + background: var(--color-red); + font-size: 34px; + color: var(--color-white); + box-shadow: var(--box-shadow-red); + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + cursor: pointer; + z-index: 7; + transform: rotate(45deg); + transition: 0.3s; +} + +.cards-container { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +.add-card-container { + background: rgba(0, 0, 0, 0.3); + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 6; +} + +.component-container { + position: relative; +} + +@media (max-width: 750px) { + .main-records-container { + padding: var(--padding-mobile); + } + + .add-records-btn { + position: fixed; + bottom: 140px; + right: 30px; + } + + .close-add-records-btn { + position: fixed; + bottom: 140px; + right: 30px; + } + + .cards-container { + flex-direction: column; + justify-content: center; + flex-wrap: nowrap; + } +} diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx new file mode 100644 index 0000000..b1119c0 --- /dev/null +++ b/tauri-app/src/pages/Records/index.tsx @@ -0,0 +1,111 @@ +import "./index.css"; +import { useState } from "react"; + +import AddCardComponent from "../../../components/AddCardComponent/"; +import DetailCardComponent from "../../../components/DetailCardComponent"; + +import Card from "../../../components/Card/"; + +const index = () => { + const [cardsData, setCardsData] = useState([ + { + title: "Diabetes Docs", + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "pdf", + file_name: "Diabetes_scan.pdf", + }, + { + title: "Diabetes Docs", + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "pdf", + file_name: "Diabetes_scan.pdf", + other_files: [ + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + ], + }, + { + title: "Diabetes Docs", + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "docx", + file_name: "Diabetes_test.docx", + other_files: [ + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + ], + }, + { + desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + date: "1/2/24", + file_extension: "jpg", + file_name: "D_IMG1103.jpg", + file_1_url: "../../../public/pic.jpg", + other_files: [ + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + ], + }, + ]); + + const [isAddCardActive, setIsAddCardActive] = useState(false); + const [isCardDetailActive, setIsCardDetailActive] = useState(false); + const [activeCard, setActiveCard] = useState(null); + + const isCardClicked = (cardDetail) => { + setIsCardDetailActive(!isCardDetailActive); + setIsAddCardActive(false); + setActiveCard(cardDetail); + }; + + return ( +
      +
      +

      Records

      +
      +
      setIsAddCardActive(!isAddCardActive)} + > + +
      +
      +
      + {cardsData.map((card) => { + return ( + + ); + })} +
      + {(isAddCardActive || isCardDetailActive) && ( +
      +
      + {isAddCardActive && } + {isCardDetailActive && ( + + )} +
      +
      + )} +
      + ); +}; + +export default index; From 1bfc61ed429c5422c82bf635d2b5b5c794cd87db Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Thu, 4 Jan 2024 01:22:51 +0100 Subject: [PATCH 004/124] ratings design moved to 8:00am today --- tauri-app/components/MobileNavbar/index.tsx | 12 +- tauri-app/components/Navbar/index.tsx | 12 +- .../Ratings}/index.css | 0 .../Ratings}/index.tsx | 6 +- tauri-app/components/RemedyCard/index.css | 58 +++++++ tauri-app/components/RemedyCard/index.tsx | 75 +++++++++ tauri-app/pnpm-lock.yaml | 12 +- tauri-app/src/App.tsx | 2 + tauri-app/src/pages/Records/index.css | 5 +- tauri-app/src/pages/Remedies/index.css | 152 ++++++++++++++++++ tauri-app/src/pages/Remedies/index.tsx | 126 +++++++++++++++ 11 files changed, 440 insertions(+), 20 deletions(-) rename tauri-app/{src/pages/RecordDetail => components/Ratings}/index.css (100%) rename tauri-app/{src/pages/RecordDetail => components/Ratings}/index.tsx (57%) create mode 100644 tauri-app/components/RemedyCard/index.css create mode 100644 tauri-app/components/RemedyCard/index.tsx create mode 100644 tauri-app/src/pages/Remedies/index.css create mode 100644 tauri-app/src/pages/Remedies/index.tsx diff --git a/tauri-app/components/MobileNavbar/index.tsx b/tauri-app/components/MobileNavbar/index.tsx index 5027e7f..5fd1e7a 100644 --- a/tauri-app/components/MobileNavbar/index.tsx +++ b/tauri-app/components/MobileNavbar/index.tsx @@ -22,11 +22,13 @@ const index = () => { 28

      Chats

      -
      - -

      DIY Remedies

      - 99+ -
      + +
      + +

      DIY Remedies

      + 99+ +
      +
      ); }; diff --git a/tauri-app/components/Navbar/index.tsx b/tauri-app/components/Navbar/index.tsx index e380395..4ce03a0 100644 --- a/tauri-app/components/Navbar/index.tsx +++ b/tauri-app/components/Navbar/index.tsx @@ -27,11 +27,13 @@ const index = () => {

      Chats

      5 -
      - -

      DIY Remedies

      - 99+ -
      + +
      + +

      DIY Remedies

      + 99+ +
      +

      Connect Wallet

      diff --git a/tauri-app/src/pages/RecordDetail/index.css b/tauri-app/components/Ratings/index.css similarity index 100% rename from tauri-app/src/pages/RecordDetail/index.css rename to tauri-app/components/Ratings/index.css diff --git a/tauri-app/src/pages/RecordDetail/index.tsx b/tauri-app/components/Ratings/index.tsx similarity index 57% rename from tauri-app/src/pages/RecordDetail/index.tsx rename to tauri-app/components/Ratings/index.tsx index 47af476..a62c374 100644 --- a/tauri-app/src/pages/RecordDetail/index.tsx +++ b/tauri-app/components/Ratings/index.tsx @@ -1,9 +1,7 @@ import "./index.css"; - + const index = () => { - return
      -

      RecordDetail

      -
      ; + return
      ; }; export default index; diff --git a/tauri-app/components/RemedyCard/index.css b/tauri-app/components/RemedyCard/index.css new file mode 100644 index 0000000..7c02190 --- /dev/null +++ b/tauri-app/components/RemedyCard/index.css @@ -0,0 +1,58 @@ +.ratings-container { + margin: 10px 0; +} + +.ratings-container i { + margin-right: 5px; +} + +.remedy-card { + height: 400px; + width: 300px; + border-radius: 15px; + padding: px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + overflow: hidden; + margin: 20px 0px; +} + +.remedy-card-image-container { + height: 200px; + color: var(--color-white); + padding: 15px; + font-weight: 500; + border-radius: 0 0 15px 15px; +} + +.remedy-card-image-container h1 { + font-family: "Roboto"; + margin-bottom: 15px; + text-transform: capitalize; + font-size: 30px; +} + +.remedy-card-image-container p { + font-family: "Roboto"; +} + +.remedy-info-container p { + padding: 15px; + font-family: "Open Sans"; +} + +.remedy-info-container button { + margin-top: 20px; + border: none; + font-family: "Pacifico"; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + padding: 10px 15px; + width: 90%; + color: var(--color-white); + font-size: 24px; + margin: auto auto; + border-radius: 8px; + margin-left: 5%; + cursor: pointer; + outline: none; +} diff --git a/tauri-app/components/RemedyCard/index.tsx b/tauri-app/components/RemedyCard/index.tsx new file mode 100644 index 0000000..f4dacfb --- /dev/null +++ b/tauri-app/components/RemedyCard/index.tsx @@ -0,0 +1,75 @@ +import "./index.css"; + +const Rating = ({ rating }) => { + return ( +
      + {rating >= 1 && rating < 2 && ( +
      + +
      + )} + {rating >= 2 && rating < 3 && ( +
      + + +
      + )} + {rating >= 3 && rating < 4 && ( +
      + + + +
      + )} + {rating >= 4 && rating < 5 && ( +
      + + + + +
      + )} + {rating >= 5 && ( +
      + + + + + +
      + )} +
      + ); +}; + +const index = ({ + title, + coverIMGUrl, + desc_snippet, + created_by, + rating, + isClicked, +}) => { + return ( +
      +
      +

      {title}

      +

      --by {created_by}

      + +
      +
      +

      {desc_snippet}

      + +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/pnpm-lock.yaml b/tauri-app/pnpm-lock.yaml index 606e550..38b38b7 100644 --- a/tauri-app/pnpm-lock.yaml +++ b/tauri-app/pnpm-lock.yaml @@ -699,11 +699,11 @@ packages: resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} dev: false - /@multiformats/murmur3@2.1.7: - resolution: {integrity: sha512-Yf0UpAaONjed+8PTt5NM/GG4Z4Ai4m1qfT7bqevjnkwRQ12K+0jxtRomirz+VJx4PokpA2St1ZSD1iMkZTqPRQ==} + /@multiformats/murmur3@2.1.8: + resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: - multiformats: 12.1.3 + multiformats: 13.0.0 murmurhash3js-revisited: 3.0.0 dev: false @@ -2163,6 +2163,7 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + requiresBuild: true /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -2455,7 +2456,7 @@ packages: dependencies: '@ipld/dag-cbor': 9.0.3 '@ipld/dag-pb': 4.0.7 - '@multiformats/murmur3': 2.1.7 + '@multiformats/murmur3': 2.1.8 err-code: 3.0.1 hamt-sharding: 3.0.2 interface-blockstore: 5.2.3 @@ -2477,7 +2478,7 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: '@ipld/dag-pb': 4.0.7 - '@multiformats/murmur3': 2.1.7 + '@multiformats/murmur3': 2.1.8 err-code: 3.0.1 hamt-sharding: 3.0.2 interface-blockstore: 5.2.3 @@ -2529,6 +2530,7 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + requiresBuild: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index d71cf98..478eac0 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -3,6 +3,7 @@ import { Route, Routes, BrowserRouter } from "react-router-dom"; import SharedLayout from "./pages/SharedLayout/"; import Home from "./pages/Home/"; import Records from "./pages/Records/"; +import Remedies from "./pages/Remedies/"; function App() { return ( @@ -12,6 +13,7 @@ function App() { }> } /> } /> + } /> diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css index 13c38ab..f1bf303 100644 --- a/tauri-app/src/pages/Records/index.css +++ b/tauri-app/src/pages/Records/index.css @@ -27,7 +27,6 @@ border-radius: 50%; cursor: pointer; z-index: 7; - transition: 0.3s; } .close-add-records-btn { @@ -93,4 +92,8 @@ justify-content: center; flex-wrap: nowrap; } + + .records-header h1 { + font-size: 35px; + } } diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css new file mode 100644 index 0000000..28fc17d --- /dev/null +++ b/tauri-app/src/pages/Remedies/index.css @@ -0,0 +1,152 @@ +.main-remedies-container { + padding: var(--padding-desktop); +} + +.main-remedy-cards-container { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; +} + +.main-remedies-container h1 { + font-family: "Pacifico"; + font-size: 45px; +} + +.view-card-detail-container { + background: rgba(0, 0, 0, 0.3); + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 6; +} + +.active-remedy-container { + width: 500px; + min-height: 400px; + background: var(--color-white); + border-radius: 15px; + padding: 25px 20px; + position: relative; +} + +.active-remedy-container h1 { + font-family: "Roboto"; + font-weight: 400; + font-size: 30px; + margin: 10px 0px; +} + +.active-remedy-container p { + font-family: "Open Sans"; + margin: 20px 0px; +} + +.rimg-container { + width: 100%; + height: 300px; + border-radius: 15px; +} + +.r-close-btn { + width: 40px; + height: 40px; + background: var(--color-red); + color: var(--color-white); + border-radius: 50%; + box-shadow: var(--box-shadow-red); + position: absolute; + right: 30px; + top: 60px; + font-size: 20px; + display: flex; + justify-content: center; + align-items: center; + transform: rotate(45deg); +} + +.report-btn { + background: var(--color-red); + color: var(--color-white); + border-radius: 20px; + box-shadow: var(--box-shadow-red); + position: absolute; + right: 80px; + top: 60px; + display: flex; + justify-content: space-between; + align-items: center; + font-family: "Roboto"; + padding: 8px 15px; + text-transform: uppercase; +} + +.report-btn i { + font-size: 25px; + margin-left: 10px; +} + +.remedy-main-info-container { + height: 300px; + overflow-y: scroll; + padding: 5px; + border-radius: 5px; +} + +.remedy-main-info-container h3 { + font-family: "Roboto"; +} + +.remedy-main-info-container p { + font-family: "Open Sans"; + margin-left: 30px; +} + +@media (max-width: 750px) { + .main-remedies-container { + padding: var(--padding-mobile); + } + + .main-remedies-container h1 { + font-size: 35px; + } + + .main-remedy-cards-container { + flex: nowrap; + flex-direction: column; + } + + .active-remedy-container { + width: 91%; + height: 70%; + margin-top: 20px; + padding: 15px 10px; + } + + .rimg-container { + height: 180px; + } + + .remedy-main-info-container { + height: 180px; + overflow-y: scroll; + padding: 5px; + } + + .report-btn, + .r-close-btn { + top: 40px; + transform: translateX(15px); + } + + .r-close-btn { + transform: rotate(45deg); + right: 20px; + } +} diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx new file mode 100644 index 0000000..cdf6857 --- /dev/null +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -0,0 +1,126 @@ +import "./index.css"; +import { useState } from "react"; +import RemedyCard from "../../../components/RemedyCard/"; + +const index = () => { + const [remedies, setRemedies] = useState([ + { + title: "Lavendar Scalp Treament", + desc_snippet: + "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", + desc: "Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.", + coverIMGUrl: "/pg.jpg", + rating: 1.5, + created_by: "draky", + steps: [ + { + title: "Clean Scalp Throughly", + desc: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + }, + { + title: "Apply Anti-Flammtory Cream", + desc: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", + }, + ], + }, + { + title: "Aloe Vera Eczema Fix", + desc_snippet: + "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", + coverIMGUrl: "/pg.jpg", + rating: 4, + created_by: "dave", + }, + { + title: "Asthma Breathing Exercises", + desc_snippet: + "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", + coverIMGUrl: "/pg.jpg", + rating: 3.5, + created_by: "nikki", + }, + ]); + + const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); + const [activeRemedy, setActiveRemedy] = useState(null); + + const remedyClicked = (remedyDetail) => { + setActiveRemedy(remedyDetail); + setIsDetailRemedyActive(true); + }; + + return ( +
      +

      Get a quick fix!

      +
      + {remedies.map((remedy) => { + return ( + + ); + })} +
      + {isDetailRemedyActive && ( +
      +
      +
      { + setIsDetailRemedyActive(false); + setActiveRemedy(null); + }} + > + +
      +
      { + alert("Report Sent!!"); + }} + > +

      Report

      + +
      + +
      +
      +

      {activeRemedy.star_stats}

      +
      +
      +

      {activeRemedy.title}

      + +
      +

      {activeRemedy.desc}

      + {activeRemedy.steps && + activeRemedy.steps.map((step, indx) => { + return ( +
      +

      + #Step - {indx + 1} {step.title} +

      +

      {step.desc}

      +
      + ); + })} +
      +
      +
      + )} +
      + ); +}; + +export default index; From 78c8d976bdcd5f4136332d18d7eec20c44f3309c Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 08:32:10 +0000 Subject: [PATCH 005/124] inpmenented some bits of the connect page --- tauri-app/src/pages/connect.tsx | 64 +++++++++++++++++-- tauri-app/src/pages/medic.tsx | 23 +++++-- tauri-app/src/stores/useDocuments.ts | 61 +++++++++++++++++- tauri-app/src/stores/useWeb5Store.ts | 7 +- .../src/utils/protocols/medical-conditions.ts | 30 +++++++++ 5 files changed, 171 insertions(+), 14 deletions(-) create mode 100644 tauri-app/src/utils/protocols/medical-conditions.ts diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index 650cec8..e6f9ec4 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -1,9 +1,65 @@ -// import React from "react"; +import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; +import { useDocuments } from "@/stores/useDocuments"; +import { useEffect, useState } from "react"; + +function Connect() { + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) + const { fetchDocumentsWithCondition } = useDocuments(web5, did) + const [similarConditions, setSimilarConditions] = useState<{ did: string, condition: string }[]>([]) + const [form, setForm] = useState<{ + condition: string + }>({ + condition: "" + }) + + useEffect(() => { + fetchDocumentsWithCondition("cancer") + }, []) + + const connectCondition = async () => { + const res = await fetchDocumentsWithCondition(form.condition) + console.log(res) + if (res) + setSimilarConditions(res) + } + -function Connect (){ return ( -
      + <> +
      +
      { + e.preventDefault() + connectCondition() + }}> + { + setForm({ ...form, condition: e.target.value }) + }} + placeholder="Condition" /> + +
      +
      +
      +
      + People with similar conditions: +
      +
      + {similarConditions.map((condition, index) => ( +
      +
      + {condition.did} +
      +
      + {condition.condition} +
      +
      + ))} +
      +
      + ) } -export default Connect; \ No newline at end of file +export default Connect; diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 58fa9b5..40ed80e 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -3,8 +3,8 @@ import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store import { useDocuments } from "@/stores/useDocuments"; const MedicPage: FunctionComponent = () => { - const { web5, connect } = useWeb5Store((state) => ({ web5: state.web5!, connect: state.connect })); - const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5) + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) + const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5, did) const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ document: typeof documents[0], url: string @@ -12,10 +12,12 @@ const MedicPage: FunctionComponent = () => { const [form, setForm] = useState<{ name: string - doc: File + doc: File, + condition: string }>({ name: "", - doc: new File([], "") + doc: new File([], ""), + condition: "" }) useEffect(() => { @@ -47,7 +49,7 @@ const MedicPage: FunctionComponent = () => { }, [documents]) const saveMedicalRecord = async () => { - const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc }) + const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) // console.log(res) if (res) { @@ -90,6 +92,17 @@ const MedicPage: FunctionComponent = () => { }} placeholder="Document" />
      +
      + { + setForm({ + ...form, + condition: e.target.value.toLowerCase() + }) + }} + placeholder="Condition" /> +
      diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 9227b2d..599cdd4 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -1,6 +1,7 @@ import { Web5, Record as Web5Record } from '@web5/api'; import { useState, useEffect } from 'react'; import { schemaOrgProtocolDefinition } from './useWeb5Store'; +import MedicalConditionsProtocol, { did as MedicalConditionsProtocolDID } from '@/utils/protocols/medical-conditions'; import _ from "lodash" export type DigitalDocument = { @@ -24,7 +25,7 @@ type Document = { data: DigitalDocument } -export function useDocuments(web5: Web5) { +export function useDocuments(web5: Web5, did: string) { const [documents, setDocuments] = useState([]); async function fetchDocuments() { @@ -51,6 +52,40 @@ export function useDocuments(web5: Web5) { setDocuments(docs); } + async function fetchDocumentsWithCondition(condition: string) { + + const res = await web5.dwn.records.query({ + from: MedicalConditionsProtocolDID, + message: { + filter: { + protocolPath: 'medicalCondition', + schema: MedicalConditionsProtocol.types.medicalCondition.schema, + }, + }, + }); + console.log(res) + console.log(res.records) + + return [] + const { records } = await web5.dwn.records.query({ + from: MedicalConditionsProtocolDID, + message: { + filter: { + protocolPath: 'medicalCondition', + schema: MedicalConditionsProtocol.types.medicalCondition.schema, + }, + dateSort: "createdAscending", + }, + }); + if (!records) return false + + const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) + .then(results => results + .filter(result => result.status === 'fulfilled') + .map(result => result.value)) + return fetchedRecords + } + async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { const { record: uploadedFileResponse } = await web5.dwn.records.create({ data: new Blob([file], { type: file.type }), @@ -83,6 +118,28 @@ export function useDocuments(web5: Web5) { if (!record) return false; + const { record: medicalConditionRecord, status } = await web5.dwn.records.create({ + data: { + condition, + did + }, + message: { + protocol: MedicalConditionsProtocol.protocol, + protocolPath: 'medicalCondition', + schema: MedicalConditionsProtocol.types.medicalCondition.schema, + dataFormat: MedicalConditionsProtocol.types.medicalCondition.dataFormats[0], + } + }) + + console.log(status) + console.log(medicalConditionRecord) + if (!medicalConditionRecord) return false + + await medicalConditionRecord.send(MedicalConditionsProtocolDID) + console.log('sent to pulsepal dwn') + await medicalConditionRecord.send(did) + console.log('sent to user dwn') + const data = await record.data.json(); const doc = { record, data, id: record.id }; @@ -158,5 +215,5 @@ export function useDocuments(web5: Web5) { return file; } - return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile, fetchDocuments }; + return { documents, createDocument, updateDocument, deleteDocument, getDocumentFile, fetchDocuments, fetchDocumentsWithCondition }; } diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 637f0f3..0dcdf84 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,5 +1,6 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; +import MedicalConditionsProtocol from "@/utils/protocols/medical-conditions"; interface Web5State { web5: Web5 | null; @@ -56,9 +57,9 @@ const useWeb5Store = create((set, get) => ({ return; } - // protocol already exists if (protocols.length > 0) { - // console.log("protocol already exists"); + console.log("protocol already exists:", await protocols[0]) + continue } // configure protocol on local DWN @@ -190,4 +191,4 @@ export const schemaOrgProtocolDefinition = { }, }; -const protocols = [schemaOrgProtocolDefinition]; +const protocols = [schemaOrgProtocolDefinition, MedicalConditionsProtocol]; diff --git a/tauri-app/src/utils/protocols/medical-conditions.ts b/tauri-app/src/utils/protocols/medical-conditions.ts new file mode 100644 index 0000000..6cb4ee9 --- /dev/null +++ b/tauri-app/src/utils/protocols/medical-conditions.ts @@ -0,0 +1,30 @@ +const MedicalConditionsProtocol = { + protocol: "https://pulsepal.com/medical-conditions", + published: true, + types: { + medicalCondition: { + schema: "https://pulsepal.com/medical-conditions/schemas/medical-condition.json", + dataFormats: [ + "application/json" + ] + } + }, + structure: { + medicalCondition: { + $actions: [ + { + who: "anyone", + can: "read" + }, + { + who: "anyone", + can: "write" + } + ] + } + } +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default MedicalConditionsProtocol From 78db4cd9035583a80cabfba8f7950704b03fd2b5 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 08:54:25 +0000 Subject: [PATCH 006/124] removing some strict checks --- tauri-app/src/stores/useDocuments.ts | 35 ++++++++++++++-------------- tauri-app/src/stores/useRemedy.ts | 1 + tauri-app/src/stores/useWeb5Store.ts | 7 +++--- tauri-app/tsconfig.json | 4 ++-- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 599cdd4..5a8ab1c 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -34,6 +34,7 @@ export function useDocuments(web5: Web5, did: string) { filter: { schema: "https://schema.org/DigitalDocument", }, + // @ts-ignore dateSort: "createdAscending", }, }); @@ -67,23 +68,23 @@ export function useDocuments(web5: Web5, did: string) { console.log(res.records) return [] - const { records } = await web5.dwn.records.query({ - from: MedicalConditionsProtocolDID, - message: { - filter: { - protocolPath: 'medicalCondition', - schema: MedicalConditionsProtocol.types.medicalCondition.schema, - }, - dateSort: "createdAscending", - }, - }); - if (!records) return false - - const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) - .then(results => results - .filter(result => result.status === 'fulfilled') - .map(result => result.value)) - return fetchedRecords + // const { records } = await web5.dwn.records.query({ + // from: MedicalConditionsProtocolDID, + // message: { + // filter: { + // protocolPath: 'medicalCondition', + // schema: MedicalConditionsProtocol.types.medicalCondition.schema, + // }, + // dateSort: "createdAscending", + // }, + // }); + // if (!records) return false + // + // const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) + // .then(results => results + // .filter(result => result.status === 'fulfilled') + // .map(result => result.value)) + // return fetchedRecords } async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts index 852cebd..3c4b4f5 100644 --- a/tauri-app/src/stores/useRemedy.ts +++ b/tauri-app/src/stores/useRemedy.ts @@ -35,6 +35,7 @@ export function useRemedies(web5: Web5) { filter: { schema: "https://schema.org/Collection", }, + // @ts-ignore dateSort: "createdAscending", }, }); diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 0dcdf84..f7da3bd 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -21,10 +21,11 @@ const useWeb5Store = create((set, get) => ({ try { // Connect to Web5 const { web5, did } = await Web5.connect({ - techPreview: { - dwnEndpoints: [], - }, + // techPreview: { + // dwnEndpoints: [], + // }, // sync: "1000", + sync: "5s", }); // Set the Web5 instance and DID diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 4a83aa7..22b1db8 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -16,8 +16,8 @@ /* Linting */ "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "baseUrl": ".", From bf21238d725de95278b8858976cb08ebf85fe589 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 11:42:12 +0000 Subject: [PATCH 007/124] added a bit more logs --- tauri-app/src/stores/useDocuments.ts | 62 ++++++++----------- tauri-app/src/stores/useWeb5Store.ts | 22 +++++-- .../{medical-conditions.ts => conditions.ts} | 12 ++-- 3 files changed, 47 insertions(+), 49 deletions(-) rename tauri-app/src/utils/protocols/{medical-conditions.ts => conditions.ts} (85%) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 5a8ab1c..3864381 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -1,7 +1,7 @@ import { Web5, Record as Web5Record } from '@web5/api'; import { useState, useEffect } from 'react'; import { schemaOrgProtocolDefinition } from './useWeb5Store'; -import MedicalConditionsProtocol, { did as MedicalConditionsProtocolDID } from '@/utils/protocols/medical-conditions'; +import ConditionsProtocol, { did as ConditionsProtocolDID } from '@/utils/protocols/conditions'; import _ from "lodash" export type DigitalDocument = { @@ -54,37 +54,24 @@ export function useDocuments(web5: Web5, did: string) { } async function fetchDocumentsWithCondition(condition: string) { - - const res = await web5.dwn.records.query({ - from: MedicalConditionsProtocolDID, + const { records } = await web5.dwn.records.query({ + from: ConditionsProtocolDID, message: { filter: { - protocolPath: 'medicalCondition', - schema: MedicalConditionsProtocol.types.medicalCondition.schema, + protocolPath: 'condition', + schema: ConditionsProtocol.types.condition.schema, }, + dateSort: "createdAscending", }, }); - console.log(res) - console.log(res.records) - - return [] - // const { records } = await web5.dwn.records.query({ - // from: MedicalConditionsProtocolDID, - // message: { - // filter: { - // protocolPath: 'medicalCondition', - // schema: MedicalConditionsProtocol.types.medicalCondition.schema, - // }, - // dateSort: "createdAscending", - // }, - // }); - // if (!records) return false - // - // const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) - // .then(results => results - // .filter(result => result.status === 'fulfilled') - // .map(result => result.value)) - // return fetchedRecords + if (!records) return false + + const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) + .then(results => results + .filter(result => result.status === 'fulfilled') + .map(result => result.value)) + + return fetchedRecords } async function createDocument({ name, file, condition }: { name: string | undefined, file: File, condition: string }): Promise { @@ -119,27 +106,28 @@ export function useDocuments(web5: Web5, did: string) { if (!record) return false; - const { record: medicalConditionRecord, status } = await web5.dwn.records.create({ + const { record: conditionRecord, status } = await web5.dwn.records.create({ data: { condition, did }, message: { - protocol: MedicalConditionsProtocol.protocol, - protocolPath: 'medicalCondition', - schema: MedicalConditionsProtocol.types.medicalCondition.schema, - dataFormat: MedicalConditionsProtocol.types.medicalCondition.dataFormats[0], + protocol: ConditionsProtocol.protocol, + protocolPath: 'condition', + schema: ConditionsProtocol.types.condition.schema, + dataFormat: ConditionsProtocol.types.condition.dataFormats[0], } }) console.log(status) - console.log(medicalConditionRecord) - if (!medicalConditionRecord) return false + console.log(conditionRecord) + if (!conditionRecord) return false - await medicalConditionRecord.send(MedicalConditionsProtocolDID) + await conditionRecord.send(ConditionsProtocolDID) console.log('sent to pulsepal dwn') - await medicalConditionRecord.send(did) - console.log('sent to user dwn') + + // await conditionRecord.send(did) + // console.log('sent to user dwn') const data = await record.data.json(); const doc = { record, data, id: record.id }; diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index f7da3bd..9f0a7a9 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,6 +1,6 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; -import MedicalConditionsProtocol from "@/utils/protocols/medical-conditions"; +import ConditionsProtocol from "@/utils/protocols/conditions"; interface Web5State { web5: Web5 | null; @@ -27,6 +27,7 @@ const useWeb5Store = create((set, get) => ({ // sync: "1000", sync: "5s", }); + console.log("did:", did) // Set the Web5 instance and DID set({ web5, did }); @@ -59,20 +60,29 @@ const useWeb5Store = create((set, get) => ({ } if (protocols.length > 0) { - console.log("protocol already exists:", await protocols[0]) + console.log("protocol already exists:", p.protocol) continue } + console.log("Configuring protocol:", p.protocol) // configure protocol on local DWN - const { protocol } = await web5.dwn.protocols.configure({ + const { protocol, status: protocolConfigurationStatus } = await web5.dwn.protocols.configure({ message: { definition: p, }, }); - // console.log("configure protocol local status", configureStatus); + if (!protocol) { + console.log("Failed to configure protocol:", p.protocol) + console.log(protocolConfigurationStatus) + continue + } + + console.log("configured protocol:", protocol); // configure protocol on remote DWN, because sync may not have occured yet - await protocol!.send(did); + console.log("sending protocol to remote DWN...") + const protocolSendStatus = await protocol.send(did); + console.log("sent protocol to remote DWN:", protocolSendStatus); // console.log("configure protocol remote status", remoteConfigureStatus); } }, @@ -192,4 +202,4 @@ export const schemaOrgProtocolDefinition = { }, }; -const protocols = [schemaOrgProtocolDefinition, MedicalConditionsProtocol]; +const protocols = [schemaOrgProtocolDefinition, ConditionsProtocol]; diff --git a/tauri-app/src/utils/protocols/medical-conditions.ts b/tauri-app/src/utils/protocols/conditions.ts similarity index 85% rename from tauri-app/src/utils/protocols/medical-conditions.ts rename to tauri-app/src/utils/protocols/conditions.ts index 6cb4ee9..d1a41d4 100644 --- a/tauri-app/src/utils/protocols/medical-conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -1,16 +1,16 @@ -const MedicalConditionsProtocol = { - protocol: "https://pulsepal.com/medical-conditions", +const ConditionsProtocol = { + protocol: "https://dschema.org/conditions", published: true, types: { - medicalCondition: { - schema: "https://pulsepal.com/medical-conditions/schemas/medical-condition.json", + condition: { + schema: "https://schema.org/conditions/schemas/condition.json", dataFormats: [ "application/json" ] } }, structure: { - medicalCondition: { + condition: { $actions: [ { who: "anyone", @@ -27,4 +27,4 @@ const MedicalConditionsProtocol = { export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" -export default MedicalConditionsProtocol +export default ConditionsProtocol From 7045a72a826a515252cc56cbaf4a0608df9410ec Mon Sep 17 00:00:00 2001 From: Adophilus Date: Thu, 4 Jan 2024 12:08:27 +0000 Subject: [PATCH 008/124] set some dummy conditions --- tauri-app/src/pages/medic.tsx | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 40ed80e..0d8e9e2 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -2,6 +2,15 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; import { useDocuments } from "@/stores/useDocuments"; +const possibleConditions = [ + "Cancer", + "Diabetes", + "Heart Disease", + "High Blood Pressure", + "High Cholesterol", + "Mental Illness", +] + const MedicPage: FunctionComponent = () => { const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5, did) @@ -51,7 +60,6 @@ const MedicPage: FunctionComponent = () => { const saveMedicalRecord = async () => { const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) - // console.log(res) if (res) { alert(`Medical record saved: ${res}`) } @@ -93,15 +101,18 @@ const MedicPage: FunctionComponent = () => { placeholder="Document" />
      - { setForm({ ...form, - condition: e.target.value.toLowerCase() + condition: e.target.value }) - }} - placeholder="Condition" /> + }}> + {possibleConditions.map((condition) => ( + + ))} +
      +

      + *ensure inputted information are correct as once saved it cannot be + deleted/edited +

      + + + ); +}; + +export default index; diff --git a/tauri-app/src/components/MobileNavbar/index.tsx b/tauri-app/src/components/MobileNavbar/index.tsx index 5fd1e7a..8fd49dd 100644 --- a/tauri-app/src/components/MobileNavbar/index.tsx +++ b/tauri-app/src/components/MobileNavbar/index.tsx @@ -17,11 +17,13 @@ const index = () => { 35 -
      - - 28 -

      Chats

      -
      + +
      + + 28 +

      Chats

      +
      +
      diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index e7b716a..306f248 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -22,11 +22,13 @@ const index = () => { 28
      -
      - -

      Chats

      - 5 -
      + +
      + +

      Chats

      + 5 +
      +
      diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index de785d5..0b0b566 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -6,7 +6,7 @@ --color-blue: #0ea5e9; --box-shadow-blue: 0 5px 12px rgba(14, 165, 233, 0.3); --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.2); - + --color-slate-accent: #f1f5f9; --color-white: #fff; --color-black: #000; --color-slate: #e2e8f0; diff --git a/tauri-app/src/pages/Chat/FindFriends/index.css b/tauri-app/src/pages/Chat/FindFriends/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/Chat/FindFriends/index.tsx b/tauri-app/src/pages/Chat/FindFriends/index.tsx new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx new file mode 100644 index 0000000..7a3fff2 --- /dev/null +++ b/tauri-app/src/pages/Chat/index.tsx @@ -0,0 +1,12 @@ +import "./index.css"; +import { FC } from "react"; + +const index: FC = () => { + return ( +
      +

      Chat Page

      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index b2e39a2..9a61790 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -64,7 +64,6 @@ const index = () => {

      Records

      -
      { const [remedies, setRemedies] = useState([ { @@ -52,7 +54,6 @@ const index = () => { const [isRated, setIsRated] = useState(false); const Rate = () => { - console.log(activeRemedy); if (!isRated) { setActiveRemedy({ ...activeRemedy, @@ -65,12 +66,24 @@ const index = () => { }); } setIsRated(!isRated); - console.log(activeRemedy); }; + const [isAddRemedyActive, setIsAddRemedyActive] = useState(false); + return (
      -

      Get a quick fix!

      +
      +

      Get a quick Fix!

      +
      setIsAddRemedyActive(!isAddRemedyActive)} + > + +
      +
      +
      {remedies.map((remedy) => { return ( @@ -142,6 +155,15 @@ const index = () => {
      )} + + {isAddRemedyActive && ( +
      + +
      + )}
      ); }; From 0738b6ca886d618801c684d4f28be42ab2f32e1c Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 00:18:09 +0100 Subject: [PATCH 015/124] contact page added --- tauri-app/src/App.tsx | 2 + tauri-app/src/pages/Chat/index.tsx | 3 +- tauri-app/src/pages/Contact/index.css | 83 ++++++++++++++++++++++++++ tauri-app/src/pages/Contact/index.tsx | 79 ++++++++++++++++++++++++ tauri-app/src/pages/Remedies/index.css | 2 +- 5 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 tauri-app/src/pages/Contact/index.css create mode 100644 tauri-app/src/pages/Contact/index.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 07c359f..043b4b3 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -11,6 +11,7 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Remedies from "./pages/Remedies"; import Chat from "./pages/Chat/"; +import Contact from "./pages/Contact/"; const router = createHashRouter([ { @@ -25,6 +26,7 @@ const router = createHashRouter([ { path: "/medic", element: }, { path: "/nearbyDoctors", element: }, { path: "/chat", element: }, + { path: "/contact", element: }, ], }, ]); diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 7a3fff2..ab8d90e 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,7 +1,6 @@ import "./index.css"; -import { FC } from "react"; -const index: FC = () => { +const index= () => { return (

      Chat Page

      diff --git a/tauri-app/src/pages/Contact/index.css b/tauri-app/src/pages/Contact/index.css new file mode 100644 index 0000000..32b3cf2 --- /dev/null +++ b/tauri-app/src/pages/Contact/index.css @@ -0,0 +1,83 @@ +.row-container { + display: flex; + justify-content: space-between; + align-items: center; + width: 70%; + + box-shadow: var(--box-shadow-black); + border-radius: 8px; + margin: 20px auto; + font-family: "Open Sans"; +} + +.row-container div { + padding: 10px 14px; + width: 100px; + border-radius: 15px; + margin: 10px; + text-align: center; +} + +.row-container div:nth-child(2) { + background: var(--color-green); + color: var(--color-white); + box-shadow: var(--box-shadow-green); +} + +.row-container div:nth-child(4) { + background: var(--color-red); + color: var(--color-white); + box-shadow: var(--box-shadow-red); +} + +.locate-container { + padding: var(--padding-desktop); +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.header h1 { + font-family: "Pacifico"; + margin: auto 0; +} + +.header button { + width: 150px; + border-radius: 50px; + background: var(--color-blue); + color: var(--color-white); + border: none; + outline: none; + font-size: 28px; + font-family: "Pacifico"; + padding: 8px 20px; + box-shadow: var(--box-shadow-blue); +} + +@media (max-width: 750px) { + .locate-container { + padding: var(--padding-mobile); + } + + .header { + flex-direction: column; + justify-content: center; + } + + .header button { + margin-top: 20px; + } + + .row-container { + width: 100%; + flex-direction: column; + } + + .row-container div { + width: 80%; + } +} diff --git a/tauri-app/src/pages/Contact/index.tsx b/tauri-app/src/pages/Contact/index.tsx new file mode 100644 index 0000000..ca84645 --- /dev/null +++ b/tauri-app/src/pages/Contact/index.tsx @@ -0,0 +1,79 @@ +import "./index.css"; +import React, { FC, useState } from "react"; + +interface RowProp { + name: String; + address: String; + city: String; + distance: Number; +} + +const RowComponent: FC = ({ name, address, city, distance }) => { + return ( +
      +
      +

      {name}

      +
      +
      +

      {address}

      +
      +
      +

      {city}

      +
      +
      +

      {distance}

      +
      +
      + ); +}; + +const index: FC = () => { + const [fetchedLocations, setFetchedLocations] = useState([ + { + name: "Hopsital", + address: "No 4 Dress road", + city: "Kumkubaga", + distance: 47, + }, + { + name: "Hopsital", + address: "No 4 Dress road", + city: "Kumkubaga", + distance: 47, + }, + { + name: "Hopsital", + address: "No 4 Dress road", + city: "Kumkubaga", + distance: 47, + }, + ]); + return ( +
      +
      +

      Find Hospitals/Drs. Near You.

      + +
      +
      + + {fetchedLocations.map((location) => { + return ( + + ); + })} +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index 229b2ca..62df5a5 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -138,7 +138,7 @@ } .remedy-main-info-container { - height: 300px; + min-height: 300px; overflow-y: scroll; padding: 5px; border-radius: 5px; From 606f81b25bcd17a8076c0c39f9947c672985d324 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:30:22 +0000 Subject: [PATCH 016/124] added the server --- server/.gitignore | 146 +++++++++++++++++++++++++++++++++++++++ server/package.json | 18 +++++ server/server.ts | 9 +++ server/src/app.ts | 31 +++++++++ server/src/middleware.ts | 22 ++++++ server/src/utils.ts | 84 ++++++++++++++++++++++ server/tsconfig.json | 19 +++++ 7 files changed, 329 insertions(+) create mode 100644 server/.gitignore create mode 100644 server/package.json create mode 100644 server/server.ts create mode 100644 server/src/app.ts create mode 100644 server/src/middleware.ts create mode 100644 server/src/utils.ts create mode 100644 server/tsconfig.json diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..5b81ddf --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,146 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node + +DATA/ diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..ce20a8d --- /dev/null +++ b/server/package.json @@ -0,0 +1,18 @@ +{ + "scripts": { + "dev": "tsx --watch server.ts" + }, + "dependencies": { + "@hono/node-server": "^1.4.0", + "@hono/zod-validator": "^0.1.11", + "@web5/api": "^0.8.3", + "hono": "^3.12.0", + "true-myth": "5", + "tsconfig-paths": "^4.2.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } +} diff --git a/server/server.ts b/server/server.ts new file mode 100644 index 0000000..f321b00 --- /dev/null +++ b/server/server.ts @@ -0,0 +1,9 @@ +import app from "./src/app"; +import { serve } from '@hono/node-server' + +serve({ + fetch: app.fetch, + port: process.env.PORT || 5000, +}, (addr) => { + console.log("Server running on port:", addr.port) +}) diff --git a/server/src/app.ts b/server/src/app.ts new file mode 100644 index 0000000..82f695f --- /dev/null +++ b/server/src/app.ts @@ -0,0 +1,31 @@ +import { Hono } from "hono"; +import { fetchConditions } from "./utils"; +import { agentMiddleware } from "./middleware"; +import { zValidator } from '@hono/zod-validator' +import { z } from 'zod' +import { logger } from "hono/logger" +import { cors } from 'hono/cors' + +const app = new Hono() + .basePath("/api") + .use("*", cors()) + .use("*", logger()) + .get("/conditions", + zValidator( + 'query', + z.object({ + condition: z.string() + })), + agentMiddleware, async (c) => { + const { condition } = c.req.valid("query") + const res = await fetchConditions(c.get("agent")) + if (res.isErr) + return c.json({ error: res.error }) + + const conditions = res.value.filter(record => record.condition === condition) + return c.json(conditions) + }) + +export type App = typeof app + +export default app diff --git a/server/src/middleware.ts b/server/src/middleware.ts new file mode 100644 index 0000000..e6503bc --- /dev/null +++ b/server/src/middleware.ts @@ -0,0 +1,22 @@ +import { type Agent, configureProtocol, setupAgent } from "./utils"; +import { MiddlewareHandler } from "hono" + +let agent: Agent + +export const agentMiddleware: MiddlewareHandler<{ + Variables: { + agent: Agent + } +}> = async (c, next) => { + if (!agent) + agent = await setupAgent() + + const connectionResult = await configureProtocol(agent) + if (connectionResult.isErr) { + console.log(connectionResult.error) + process.exit() + } + + c.set('agent', agent) + await next() +} diff --git a/server/src/utils.ts b/server/src/utils.ts new file mode 100644 index 0000000..6460426 --- /dev/null +++ b/server/src/utils.ts @@ -0,0 +1,84 @@ +import { Web5 } from "@web5/api"; +import ConditionsProtocol, { type Record, did as ConditionsProtocolDID } from "@frontend/utils/protocols/conditions" +import Result, { ok, err } from "true-myth/result" + +export type Agent = { + web5: Web5, + did: string +} + +export type Status = { + code: number, + detail: string, +} + +export async function configureProtocol(agent: Agent): Promise> { + const { protocols } = await agent.web5.dwn.protocols.query({ + message: { + filter: { + protocol: ConditionsProtocol.protocol, + } + } + }) + + if (protocols.length > 0) + return ok(undefined) + + const { protocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ + message: { + definition: ConditionsProtocol, + } + }); + + if (!protocol) + return err({ + type: "LOCAL_PROTOCOL_CONFIGURATION_FAILED", + status: localProtocolConfigurationStatus, + }) + + const { status: remoteProtocolConfigurationStatus } = await protocol.send(ConditionsProtocolDID) + + if (remoteProtocolConfigurationStatus.code !== 202) + return err({ + type: "REMOTE_PROTOCOL_CONFIGURATION_FAILED", + status: remoteProtocolConfigurationStatus, + }) + + return ok(undefined) +} + +export async function fetchConditions(agent: Agent): Promise> { + const { records, status } = await agent.web5.dwn.records.query({ + from: ConditionsProtocolDID, + message: { + filter: { + protocolPath: 'condition', + schema: ConditionsProtocol.types.condition.schema, + protocol: ConditionsProtocol.protocol, + }, + dateSort: "createdAscending", + } + }) + + if (!records) { + if (status.code !== 200) + return err(status) + + return ok([]) + } + + const conditions: Record.Condition[] = [] + for (const record of records) { + conditions.push(await record.data.json()) + } + + return ok(conditions) +} + +export async function setupAgent(): Promise { + const { web5, did } = await Web5.connect({ + sync: "5s", + }); + + return { web5, did } +} diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..3cb9101 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "composite": true, + "noEmit": true + }, + "include": [ + "server.ts", + "./src/**/*.ts" + ], + "exclude": [ + "node_modules" + ], + "references": [ + { + "path": "../tsconfig.json" + } + ], + "extends": "../tsconfig.json" +} From 6e48466e369f6cf3b9d2db22ebfe971d269e2aed Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:31:23 +0000 Subject: [PATCH 017/124] updated the types to work with the backend --- .gitignore | 2 + tauri-app/package.json | 1 + tauri-app/src/pages/connect.tsx | 133 +++++++++++--------- tauri-app/src/pages/medic.tsx | 5 +- tauri-app/src/utils/protocols/conditions.ts | 7 ++ tauri-app/tsconfig.json | 29 +++-- tauri-app/vite.config.ts | 3 + tsconfig.json | 42 +++++++ 8 files changed, 154 insertions(+), 68 deletions(-) create mode 100644 .gitignore create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..649ac14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +pnpm-lock.yaml +*.tsbuildinfo diff --git a/tauri-app/package.json b/tauri-app/package.json index 7b4e845..be51e78 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -21,6 +21,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", "react": "^18.2.0", diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index e6f9ec4..31b8dc9 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -1,65 +1,86 @@ -import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; -import { useDocuments } from "@/stores/useDocuments"; -import { useEffect, useState } from "react"; +import useWeb5Store from "@/stores/useWeb5Store"; +import { useState } from "react"; +import { hc } from "hono/client" +import { App } from "@backend/app" -function Connect() { - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) - const { fetchDocumentsWithCondition } = useDocuments(web5, did) - const [similarConditions, setSimilarConditions] = useState<{ did: string, condition: string }[]>([]) - const [form, setForm] = useState<{ - condition: string - }>({ - condition: "" - }) +const backendClient = hc("/") + +const possibleConditions = [ + "Cancer", + "Diabetes", + "Heart Disease", + "High Blood Pressure", + "High Cholesterol", + "Mental Illness", +] - useEffect(() => { - fetchDocumentsWithCondition("cancer") - }, []) +function Connect() { + const [similarConditions, setSimilarConditions] = useState<{ did: string, condition: string }[]>([]) + const [form, setForm] = useState({ condition: "" }) - const connectCondition = async () => { - const res = await fetchDocumentsWithCondition(form.condition) - console.log(res) - if (res) - setSimilarConditions(res) - } + const fetchDocumentsWithCondition = async (condition: string) => { + const maybeConditions = await backendClient.api.conditions.$get({ + query: { + condition + } + }) + .then(res => res.json()) + if (!Array.isArray(maybeConditions)) + return [] + const conditions = maybeConditions + return conditions + } + const connectCondition = async () => { + const res = await fetchDocumentsWithCondition(form.condition) + setSimilarConditions(res) + } - return ( - <> -
      -
      { - e.preventDefault() - connectCondition() - }}> - { - setForm({ ...form, condition: e.target.value }) - }} - placeholder="Condition" /> - -
      -
      -
      -
      - People with similar conditions: -
      -
      - {similarConditions.map((condition, index) => ( -
      -
      - {condition.did} -
      -
      - {condition.condition} -
      -
      - ))} -
      + return ( + <> +
      +
      { + e.preventDefault() + connectCondition() + }}> +
      + +
      + +
      +
      +
      +
      + People with similar conditions: +
      +
      + {similarConditions.map((condition, index) => ( +
      +
      + {condition.did} +
      +
      + {condition.condition} +
      - - ) + ))} +
      +
      + + ) } export default Connect; diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 0d8e9e2..9ae13ff 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -1,5 +1,5 @@ -import { FunctionComponent, useEffect, useRef, useState } from "react"; -import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; +import { FunctionComponent, useEffect, useState } from "react"; +import useWeb5Store from "@/stores/useWeb5Store"; import { useDocuments } from "@/stores/useDocuments"; const possibleConditions = [ @@ -58,6 +58,7 @@ const MedicPage: FunctionComponent = () => { }, [documents]) const saveMedicalRecord = async () => { + console.log(form) const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) if (res) { diff --git a/tauri-app/src/utils/protocols/conditions.ts b/tauri-app/src/utils/protocols/conditions.ts index d1a41d4..5ffae94 100644 --- a/tauri-app/src/utils/protocols/conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -25,6 +25,13 @@ const ConditionsProtocol = { } } +export namespace Record { + export type Condition = { + did: string + condition: string + } +} + export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" export default ConditionsProtocol diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 22b1db8..27ffeda 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -1,11 +1,15 @@ { "compilerOptions": { + "composite": true, "target": "ES2020", "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], "module": "ESNext", "skipLibCheck": true, - /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -13,18 +17,23 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - /* Linting */ "strict": true, // "noUnusedLocals": true, // "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } + "outDir": "./build" }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] + "include": [ + "./src/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "../tsconfig.json" + } + ], + "extends": "../tsconfig.json" } diff --git a/tauri-app/vite.config.ts b/tauri-app/vite.config.ts index d54908f..4cb61b7 100644 --- a/tauri-app/vite.config.ts +++ b/tauri-app/vite.config.ts @@ -19,6 +19,9 @@ export default defineConfig(async () => ({ server: { port: 1420, strictPort: true, + proxy: { + "/api": "http://127.0.0.1:5000/" + }, watch: { // 3. tell vite to ignore watching `src-tauri` ignored: ["**/src-tauri/**"], diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6b70144 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "paths": { + "@frontend/*": [ + "./tauri-app/src/*" + ], + "@backend/*": [ + "./server/src/*" + ], + "@/*": [ + "./tauri-app/src/*" + ] + }, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "strictFunctionTypes": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "allowUnreachableCode": false, + "target": "ES2020", + "useDefineForClassFields": true, + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + /* Linting */ + "strict": true, + "noFallthroughCasesInSwitch": true, + "outDir": "./build", + "rootDir": "." + } +} From 99cf8162b299ecf38c32d0f1316045e54831aa12 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:36:47 +0000 Subject: [PATCH 018/124] updated protocol --- tauri-app/src/utils/protocols/conditions.ts | 4 +- tauri-app/src/utils/protocols/user-details.ts | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tauri-app/src/utils/protocols/user-details.ts diff --git a/tauri-app/src/utils/protocols/conditions.ts b/tauri-app/src/utils/protocols/conditions.ts index 5ffae94..e513310 100644 --- a/tauri-app/src/utils/protocols/conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -1,9 +1,9 @@ const ConditionsProtocol = { - protocol: "https://dschema.org/conditions", + protocol: "https://dschema.org/protocols/conditions", published: true, types: { condition: { - schema: "https://schema.org/conditions/schemas/condition.json", + schema: "https://dschema.org/protocols/conditions/schemas/condition.json", dataFormats: [ "application/json" ] diff --git a/tauri-app/src/utils/protocols/user-details.ts b/tauri-app/src/utils/protocols/user-details.ts new file mode 100644 index 0000000..c047683 --- /dev/null +++ b/tauri-app/src/utils/protocols/user-details.ts @@ -0,0 +1,38 @@ +const UserDetailsProtocol = { + protocol: "https://dschema.org/protocols/user", + published: true, + types: { + details: { + schema: "https://dschema.org/protocols/user/schemas/details.json", + dataFormats: [ + "application/json" + ] + } + }, + structure: { + details: { + $actions: [ + { + who: "author", + can: "read" + }, + { + who: "anyone", + can: "write" + } + ] + } + } +} + +export namespace Record { + export type UserDetails = { + firstName: string + lastName: string + profilePictureUrl: string + } +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default UserDetailsProtocol From c1c27d70ac8c34dbb7db24d79732aa56e3b58807 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:38:20 +0000 Subject: [PATCH 019/124] updated import --- tauri-app/src/stores/useWeb5Store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 9f0a7a9..ad26103 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,4 +1,4 @@ -import { Web5 } from "@web5/api/browser"; +import { Web5 } from "@web5/api"; import { create } from "zustand"; import ConditionsProtocol from "@/utils/protocols/conditions"; From eed78b1fb43e010a7eedea2e7a54e5ad9de041b0 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 02:39:10 +0000 Subject: [PATCH 020/124] renamed protocol file --- tauri-app/src/utils/protocols/{user-details.ts => user.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tauri-app/src/utils/protocols/{user-details.ts => user.ts} (100%) diff --git a/tauri-app/src/utils/protocols/user-details.ts b/tauri-app/src/utils/protocols/user.ts similarity index 100% rename from tauri-app/src/utils/protocols/user-details.ts rename to tauri-app/src/utils/protocols/user.ts From 5814cfb877c905d5012a3cc81d7fc5a9c53b44a8 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 03:06:57 +0000 Subject: [PATCH 021/124] updated tsconfigs --- server/tsconfig.json | 20 +++++----- tauri-app/src/utils/document.ts | 0 tauri-app/src/utils/protocols/conditions.ts | 4 +- tauri-app/tsconfig.json | 31 ++++++--------- tsconfig.json | 42 --------------------- 5 files changed, 25 insertions(+), 72 deletions(-) create mode 100644 tauri-app/src/utils/document.ts delete mode 100644 tsconfig.json diff --git a/server/tsconfig.json b/server/tsconfig.json index 3cb9101..b77ecc0 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,7 +1,15 @@ { "compilerOptions": { - "composite": true, - "noEmit": true + "noEmit": true, + "strict": false, + "noImplicitAny": true, + "noFallthroughCasesInSwitch": true, + "module": "CommonJS", + "baseUrl": ".", + "paths": { + "@backend/*": ["./src/*"], + "@frontend/*": ["../tauri-app/src/*"] + } }, "include": [ "server.ts", @@ -9,11 +17,5 @@ ], "exclude": [ "node_modules" - ], - "references": [ - { - "path": "../tsconfig.json" - } - ], - "extends": "../tsconfig.json" + ] } diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts new file mode 100644 index 0000000..e69de29 diff --git a/tauri-app/src/utils/protocols/conditions.ts b/tauri-app/src/utils/protocols/conditions.ts index e513310..aaf5811 100644 --- a/tauri-app/src/utils/protocols/conditions.ts +++ b/tauri-app/src/utils/protocols/conditions.ts @@ -1,9 +1,9 @@ const ConditionsProtocol = { - protocol: "https://dschema.org/protocols/conditions", + protocol: "https://dschema.org/protocols/condition", published: true, types: { condition: { - schema: "https://dschema.org/protocols/conditions/schemas/condition.json", + schema: "https://dschema.org/protocols/condition/schemas/condition.json", dataFormats: [ "application/json" ] diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 27ffeda..36ff4af 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -1,15 +1,11 @@ { "compilerOptions": { - "composite": true, "target": "ES2020", "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], + "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, + /* Bundler mode */ "moduleResolution": "bundler", "allowImportingTsExtensions": true, @@ -17,23 +13,20 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", + /* Linting */ "strict": true, // "noUnusedLocals": true, // "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, - "outDir": "./build" - }, - "include": [ - "./src/**/*.ts" - ], - "references": [ - { - "path": "./tsconfig.node.json" - }, - { - "path": "../tsconfig.json" + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + "@backend/*": ["../server/src/*"], + "@frontend/*": ["./src/*"] } - ], - "extends": "../tsconfig.json" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 6b70144..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "baseUrl": ".", - "paths": { - "@frontend/*": [ - "./tauri-app/src/*" - ], - "@backend/*": [ - "./server/src/*" - ], - "@/*": [ - "./tauri-app/src/*" - ] - }, - // "noUnusedLocals": true, - // "noUnusedParameters": true, - // "strictFunctionTypes": true, - "esModuleInterop": true, - "experimentalDecorators": true, - "allowUnreachableCode": false, - "target": "ES2020", - "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "module": "ESNext", - "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - /* Linting */ - "strict": true, - "noFallthroughCasesInSwitch": true, - "outDir": "./build", - "rootDir": "." - } -} From e2b754949fa6365da19bad5333c5acc5d83bf4e2 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 03:07:10 +0000 Subject: [PATCH 022/124] updated web5 import --- tauri-app/src/stores/useWeb5Store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index ad26103..9f0a7a9 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,4 +1,4 @@ -import { Web5 } from "@web5/api"; +import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; import ConditionsProtocol from "@/utils/protocols/conditions"; From 3b585e511dbc517f6b2c413c9acb2eaf147df3e3 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 03:07:18 +0000 Subject: [PATCH 023/124] defined document protocol --- tauri-app/src/utils/protocols/document.ts | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tauri-app/src/utils/protocols/document.ts diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts new file mode 100644 index 0000000..e4a148b --- /dev/null +++ b/tauri-app/src/utils/protocols/document.ts @@ -0,0 +1,63 @@ +const DocumentProtocol = { + protocol: "https://dschema.org/protocols/document", + published: true, + types: { + document: { + schema: "https://schema.org/protocols/document/schemas/document.json", + dataFormats: [ + "application/json" + ] + }, + blob: { + schema: "https://dschema.org/protocols/document/schemas/blob.json", + dataFormats: [ + "application/json" + ] + } + }, + structure: { + document: { + $actions: [ + { + who: "anyone", + can: "read" + }, + { + who: "author", + can: "write" + } + ] + }, + blob: { + $actions: [ + { + who: "anyone", + can: "read" + }, + { + who: "author", + of: "parentId", + can: "write" + } + ] + } + } +} + +export namespace Record { + export type File = Blob + + export type Document = { + name: string + encodingFormat: string + size: number + url: string + condition: string + dateCreated?: string + dateModified?: string + }; +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default DocumentProtocol From 29a01403cffa9e9edae370d8b8b184ba2441143f Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 05:00:38 +0000 Subject: [PATCH 024/124] added some tsignores --- tauri-app/src/stores/useDocuments.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tauri-app/src/stores/useDocuments.ts b/tauri-app/src/stores/useDocuments.ts index 3864381..c6914f7 100644 --- a/tauri-app/src/stores/useDocuments.ts +++ b/tauri-app/src/stores/useDocuments.ts @@ -61,6 +61,7 @@ export function useDocuments(web5: Web5, did: string) { protocolPath: 'condition', schema: ConditionsProtocol.types.condition.schema, }, + // @ts-ignore dateSort: "createdAscending", }, }); @@ -69,6 +70,7 @@ export function useDocuments(web5: Web5, did: string) { const fetchedRecords = await Promise.allSettled(records.map(record => record.data.json())) .then(results => results .filter(result => result.status === 'fulfilled') + // @ts-ignore .map(result => result.value)) return fetchedRecords From 1ed113ca91e6e5f1f0646f67028494d94e1789ef Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 05:00:49 +0000 Subject: [PATCH 025/124] removed checks from package.json --- tauri-app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/package.json b/tauri-app/package.json index be51e78..39b4c47 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", + "build": "vite build", "preview": "vite preview", "tauri": "tauri" }, From a61e87658df6e1fc73c030975b229499427a77aa Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 11:42:04 +0100 Subject: [PATCH 026/124] porting javascript to ttpescript --- .../src/components/AddCardComponent/index.tsx | 14 +++++++--- .../components/AddRemedyComponent/index.tsx | 27 ++++++++++++++----- tauri-app/src/components/Card/index.tsx | 22 ++++++++++++--- .../components/DetailCardComponent/index.tsx | 26 ++++++++++++++++-- tauri-app/src/pages/Contact/index.tsx | 21 ++++++++++----- tauri-app/src/pages/Remedies/index.css | 2 +- 6 files changed, 89 insertions(+), 23 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index 66c9bb6..3da12d8 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -1,14 +1,18 @@ import "./index.css"; -import { useState } from "react"; +import React, { useState } from "react"; + +interface FileProp { + file: File | null | undefined; +} const FileUploader = () => { - const [file, setFile] = useState(null); + const [file, setFile] = useState({ file: null }); return (
      { - setFile(e.target.files[0]); + setFile({ file: e?.target?.files?.[0] }); }} type="file" accept=".jpg,.png,.jpeg,.docx,.pdf" @@ -18,7 +22,9 @@ const FileUploader = () => { }; const index = () => { - const [fileUploaders, setUploaderFile] = useState([]); + const [fileUploaders, setUploaderFile] = useState([ + , + ]); return (

      Create New Record

      diff --git a/tauri-app/src/components/AddRemedyComponent/index.tsx b/tauri-app/src/components/AddRemedyComponent/index.tsx index bdf446a..31d8dc4 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.tsx +++ b/tauri-app/src/components/AddRemedyComponent/index.tsx @@ -1,14 +1,18 @@ import "./index.css"; -import { useState } from "react"; +import React, { FC, useState } from "react"; -const FileUploader = () => { - const [file, setFile] = useState(null); +interface FileProp { + file: File | null | undefined; +} + +const FileUploader: FC = () => { + const [file, setFile] = useState({ file: null }); return (
      { - setFile(e.target.files[0]); + setFile({ file: e?.target?.files?.[0] }); }} type="file" accept=".jpg,.png,.jpeg" @@ -17,7 +21,13 @@ const FileUploader = () => { ); }; -const StepField = ({ addStep, index }) => { +interface StepProp { + index: React.ReactNode; +} + +//add stepFunction +//to trigger when save in main form is clicked +const StepField: FC = ({ index }) => { return (

      Step #{index}

      @@ -27,8 +37,11 @@ const StepField = ({ addStep, index }) => { ); }; -const index = () => { - const [steps, setSteps] = useState([]); +const index: FC = () => { + const [steps, setSteps] = useState([ + , + ]); + return (

      Create New Remedy

      diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index e98d449..d61c871 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -1,8 +1,24 @@ import "./index.css"; -import { useState } from "react"; +import React, { FC, useState } from "react"; -const index = ({ file_name, file_extension, title, desc, date, cardUtils }) => { - const [supportedIMGExtensions, setSupportedIMG, Extensions] = useState([ +interface CardProp { + file_name: String; + file_extension: string; + title: String; + desc: String; + date: String; + cardUtils: any[]; +} + +const index: FC = ({ + file_name, + file_extension, + title, + desc, + date, + cardUtils, +}) => { + const [supportedIMGExtensions, setSupportedIMGExtensions] = useState([ "jpg", "png", "jpeg", diff --git a/tauri-app/src/components/DetailCardComponent/index.tsx b/tauri-app/src/components/DetailCardComponent/index.tsx index 393c33f..9ae854b 100644 --- a/tauri-app/src/components/DetailCardComponent/index.tsx +++ b/tauri-app/src/components/DetailCardComponent/index.tsx @@ -1,7 +1,29 @@ import "./index.css"; -import { useState } from "react"; +import React, { FC, useState } from "react"; -const index = ({ cardData, close }) => { +interface OtherFileProp { + title: String; + file_extension: string; + file_name: string; + + file_url: string; +} + +interface CardDataProps { + file_name: String; + file_extension: string; + title: String; + desc: String; + date: String; + other_files: OtherFileProp[]; +} + +interface CardProp { + cardData: CardDataProps; + close: (isCardDetailActive: boolean) => void; +} + +const index: FC = ({ cardData, close }) => { const [supportedIMGExtensions, setSupportedIMGExtensions] = useState([ "jpg", "png", diff --git a/tauri-app/src/pages/Contact/index.tsx b/tauri-app/src/pages/Contact/index.tsx index ca84645..4c07599 100644 --- a/tauri-app/src/pages/Contact/index.tsx +++ b/tauri-app/src/pages/Contact/index.tsx @@ -55,12 +55,21 @@ const index: FC = () => {
      - +
      +
      +

      Hospital/Dr. name

      +
      +
      +

      Address

      +
      +
      +

      City

      +
      +
      +

      Distance

      +
      +
      + {fetchedLocations.map((location) => { return ( Date: Fri, 5 Jan 2024 17:10:09 +0530 Subject: [PATCH 027/124] fixed all errors --- server/package-lock.json | 2354 +++++++++++++++++ server/src/app.ts | 1 + server/src/utils.ts | 5 + tauri-app/package-lock.json | 9 + tauri-app/src/components/RemedyCard/index.tsx | 9 + tauri-app/src/pages/Contact/index.tsx | 8 +- tauri-app/src/pages/Records/index.tsx | 3 + tauri-app/src/pages/Remedies/index.tsx | 22 +- 8 files changed, 2402 insertions(+), 9 deletions(-) create mode 100644 server/package-lock.json diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..9794805 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,2354 @@ +{ + "name": "server", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@hono/node-server": "^1.4.0", + "@hono/zod-validator": "^0.1.11", + "@web5/api": "^0.8.3", + "hono": "^3.12.0", + "true-myth": "5", + "tsconfig-paths": "^4.2.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", + "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" + }, + "node_modules/@decentralized-identity/ion-pow-sdk": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", + "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", + "dependencies": { + "buffer": "6.0.3", + "cross-fetch": "3.1.5", + "hash-wasm": "4.9.0" + } + }, + "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@decentralized-identity/ion-sdk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", + "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", + "dependencies": { + "@noble/ed25519": "^2.0.0", + "@noble/secp256k1": "^2.0.0", + "canonicalize": "^2.0.0", + "multiformats": "^12.0.1", + "multihashes": "^4.0.3", + "uri-js": "^4.4.1" + } + }, + "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", + "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hono/node-server": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.0.tgz", + "integrity": "sha512-bhDkhldW7w9VgjrX0gG1vJ2YyvTxFWd5WG9nHjSR4UauhVECQZC3qy7mVVuQ054I5NWhKttHfKzYfoPzmUzAjw==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@hono/zod-validator": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.1.11.tgz", + "integrity": "sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==", + "peerDependencies": { + "hono": ">=3.9.0", + "zod": "^3.19.1" + } + }, + "node_modules/@ipld/dag-cbor": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", + "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", + "dependencies": { + "cborg": "^2.0.1", + "multiformats": "^12.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-cbor/node_modules/multiformats": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", + "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.7.tgz", + "integrity": "sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==", + "dependencies": { + "multiformats": "^13.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/@js-temporal/polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", + "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", + "dependencies": { + "jsbi": "^4.3.0", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@multiformats/base-x": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", + "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" + }, + "node_modules/@multiformats/murmur3": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", + "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", + "dependencies": { + "multiformats": "^13.0.0", + "murmurhash3js-revisited": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@multiformats/murmur3/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/@noble/ciphers": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", + "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/ed25519": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", + "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", + "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@tbd54566975/dwn-sdk-js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.2.8.tgz", + "integrity": "sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==", + "dependencies": { + "@ipld/dag-cbor": "9.0.3", + "@js-temporal/polyfill": "0.4.4", + "@noble/ed25519": "2.0.0", + "@noble/secp256k1": "2.0.0", + "abstract-level": "1.0.3", + "ajv": "8.12.0", + "blockstore-core": "4.2.0", + "cross-fetch": "4.0.0", + "eciesjs": "0.4.5", + "flat": "5.0.2", + "interface-blockstore": "5.2.3", + "interface-store": "5.1.2", + "ipfs-unixfs-exporter": "13.1.5", + "ipfs-unixfs-importer": "15.1.5", + "level": "8.0.0", + "lodash": "4.17.21", + "lru-cache": "9.1.2", + "ms": "2.1.3", + "multiformats": "11.0.2", + "randombytes": "2.1.0", + "readable-stream": "4.4.2", + "ulidx": "2.1.0", + "uuid": "8.3.2", + "varint": "6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@web5/agent": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.2.5.tgz", + "integrity": "sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==", + "dependencies": { + "@tbd54566975/dwn-sdk-js": "0.2.8", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "@web5/dids": "0.2.3", + "level": "8.0.0", + "readable-stream": "4.4.2", + "readable-web-to-node-stream": "3.0.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/api": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.8.3.tgz", + "integrity": "sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==", + "dependencies": { + "@tbd54566975/dwn-sdk-js": "0.2.8", + "@web5/agent": "0.2.5", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "@web5/dids": "0.2.3", + "@web5/user-agent": "0.2.5", + "level": "8.0.0", + "ms": "2.1.3", + "readable-stream": "4.4.2", + "readable-web-to-node-stream": "3.0.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/common": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.2.tgz", + "integrity": "sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==", + "dependencies": { + "level": "8.0.0", + "multiformats": "11.0.2", + "readable-stream": "4.4.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/crypto": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.2.tgz", + "integrity": "sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==", + "dependencies": { + "@noble/ciphers": "0.1.4", + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@web5/common": "0.2.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/crypto/node_modules/@web5/common": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", + "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", + "dependencies": { + "level": "8.0.0", + "multiformats": "11.0.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/dids": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.3.tgz", + "integrity": "sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==", + "dependencies": { + "@decentralized-identity/ion-pow-sdk": "1.0.17", + "@decentralized-identity/ion-sdk": "1.0.1", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "did-resolver": "4.1.0", + "dns-packet": "5.6.1", + "level": "8.0.0", + "ms": "2.1.3", + "pkarr": "1.1.1", + "z32": "1.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web5/user-agent": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.2.5.tgz", + "integrity": "sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==", + "dependencies": { + "@web5/agent": "0.2.5", + "@web5/common": "0.2.2", + "@web5/crypto": "0.2.2", + "@web5/dids": "0.2.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bencode": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.1.1.tgz", + "integrity": "sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==", + "dependencies": { + "uint8-util": "^2.1.6" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-dht": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.5.tgz", + "integrity": "sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "bencode": "^4.0.0", + "debug": "^4.3.4", + "k-bucket": "^5.1.0", + "k-rpc": "^5.1.0", + "last-one-wins": "^1.0.4", + "lru": "^3.1.0", + "randombytes": "^2.1.0", + "record-cache": "^1.2.0" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bittorrent-dht/node_modules/bencode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", + "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", + "dependencies": { + "uint8-util": "^2.2.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blake2b": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", + "dependencies": { + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blockstore-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", + "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", + "dependencies": { + "err-code": "^3.0.1", + "interface-blockstore": "^5.0.0", + "interface-store": "^5.0.0", + "multiformats": "^11.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/canonicalize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", + "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cborg": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", + "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", + "bin": { + "cborg": "cli.js" + } + }, + "node_modules/chacha20-universal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", + "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", + "dependencies": { + "nanoassert": "^2.0.0" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-dgram": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", + "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "inherits": "^2.0.4", + "run-series": "^1.1.9" + } + }, + "node_modules/chrome-dns": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", + "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", + "dependencies": { + "chrome-net": "^3.3.2" + } + }, + "node_modules/chrome-net": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", + "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/did-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", + "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eciesjs": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", + "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", + "dependencies": { + "@noble/ciphers": "^0.3.0", + "@noble/curves": "^1.2.0", + "@noble/hashes": "^1.3.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/eciesjs/node_modules/@noble/ciphers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", + "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eciesjs/node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", + "dependencies": { + "@noble/hashes": "1.3.3" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eciesjs/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/graceful-goodbye": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", + "integrity": "sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==", + "dependencies": { + "safety-catch": "^1.0.2" + } + }, + "node_modules/hamt-sharding": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", + "integrity": "sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==", + "dependencies": { + "sparse-array": "^1.3.1", + "uint8arrays": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/hash-wasm": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", + "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" + }, + "node_modules/hono": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.0.tgz", + "integrity": "sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interface-blockstore": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", + "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", + "dependencies": { + "interface-store": "^5.0.0", + "multiformats": "^11.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/interface-store": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", + "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.2.tgz", + "integrity": "sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==", + "dependencies": { + "err-code": "^3.0.1", + "protons-runtime": "^5.0.0", + "uint8arraylist": "^2.4.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs-exporter": { + "version": "13.1.5", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", + "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", + "dependencies": { + "@ipld/dag-cbor": "^9.0.0", + "@ipld/dag-pb": "^4.0.0", + "@multiformats/murmur3": "^2.0.0", + "err-code": "^3.0.1", + "hamt-sharding": "^3.0.0", + "interface-blockstore": "^5.0.0", + "ipfs-unixfs": "^11.0.0", + "it-filter": "^3.0.2", + "it-last": "^3.0.2", + "it-map": "^3.0.3", + "it-parallel": "^3.0.0", + "it-pipe": "^3.0.1", + "it-pushable": "^3.1.0", + "multiformats": "^11.0.0", + "p-queue": "^7.3.0", + "progress-events": "^1.0.0", + "uint8arrays": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ipfs-unixfs-importer": { + "version": "15.1.5", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", + "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", + "dependencies": { + "@ipld/dag-pb": "^4.0.0", + "@multiformats/murmur3": "^2.0.0", + "err-code": "^3.0.1", + "hamt-sharding": "^3.0.0", + "interface-blockstore": "^5.0.0", + "interface-store": "^5.0.1", + "ipfs-unixfs": "^11.0.0", + "it-all": "^3.0.2", + "it-batch": "^3.0.2", + "it-first": "^3.0.2", + "it-parallel-batch": "^3.0.1", + "multiformats": "^11.0.0", + "progress-events": "^1.0.0", + "rabin-wasm": "^0.1.4", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/it-all": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz", + "integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==" + }, + "node_modules/it-batch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz", + "integrity": "sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==" + }, + "node_modules/it-filter": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz", + "integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-first": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", + "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" + }, + "node_modules/it-last": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz", + "integrity": "sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==" + }, + "node_modules/it-map": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz", + "integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-merge": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", + "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", + "dependencies": { + "it-pushable": "^3.2.0" + } + }, + "node_modules/it-parallel": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz", + "integrity": "sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-parallel-batch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz", + "integrity": "sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==", + "dependencies": { + "it-batch": "^3.0.0" + } + }, + "node_modules/it-peekable": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz", + "integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==" + }, + "node_modules/it-pipe": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", + "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", + "dependencies": { + "it-merge": "^3.0.0", + "it-pushable": "^3.1.2", + "it-stream-types": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", + "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/jsbi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", + "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" + }, + "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==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/k-bucket": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", + "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/k-rpc": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", + "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", + "dependencies": { + "k-bucket": "^5.0.0", + "k-rpc-socket": "^1.7.2", + "randombytes": "^2.0.5" + } + }, + "node_modules/k-rpc-socket": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", + "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", + "dependencies": { + "bencode": "^2.0.0", + "chrome-dgram": "^3.0.2", + "chrome-dns": "^1.0.0", + "chrome-net": "^3.3.2" + } + }, + "node_modules/k-rpc-socket/node_modules/bencode": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", + "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" + }, + "node_modules/last-one-wins": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", + "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==" + }, + "node_modules/layerr": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz", + "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==" + }, + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", + "dependencies": { + "inherits": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/lru-cache": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", + "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "engines": { + "node": ">=10" + } + }, + "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/multibase": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", + "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "@multiformats/base-x": "^4.0.1" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multiformats": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", + "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/multihashes": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", + "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", + "dependencies": { + "multibase": "^4.0.1", + "uint8arrays": "^3.0.0", + "varint": "^5.0.2" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/multihashes/node_modules/multiformats": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" + }, + "node_modules/multihashes/node_modules/uint8arrays": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", + "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/multihashes/node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/p-defer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", + "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkarr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkarr/-/pkarr-1.1.1.tgz", + "integrity": "sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==", + "dependencies": { + "bencode": "^3.0.3", + "bittorrent-dht": "^11.0.4", + "chalk": "^5.2.0", + "dns-packet": "^5.6.1", + "graceful-goodbye": "^1.3.0", + "sodium-universal": "^4.0.0", + "z32": "^1.0.0" + }, + "bin": { + "pkarr": "bin.js" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", + "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/protons-runtime": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.1.tgz", + "integrity": "sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==", + "dependencies": { + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/protons-runtime/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/protons-runtime/node_modules/uint8arrays": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", + "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rabin-wasm": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", + "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", + "dependencies": { + "@assemblyscript/loader": "^0.9.4", + "bl": "^5.0.0", + "debug": "^4.3.1", + "minimist": "^1.2.5", + "node-fetch": "^2.6.1", + "readable-stream": "^3.6.0" + }, + "bin": { + "rabin-wasm": "cli/bin.js" + } + }, + "node_modules/rabin-wasm/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/record-cache": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", + "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", + "dependencies": { + "b4a": "^1.3.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safety-catch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", + "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" + }, + "node_modules/sha256-universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", + "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", + "dependencies": { + "b4a": "^1.0.1", + "sha256-wasm": "^2.2.1" + } + }, + "node_modules/sha256-wasm": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", + "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/sha512-universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", + "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", + "dependencies": { + "b4a": "^1.0.1", + "sha512-wasm": "^2.3.1" + } + }, + "node_modules/sha512-wasm": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", + "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/siphash24": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", + "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", + "dependencies": { + "nanoassert": "^2.0.0" + } + }, + "node_modules/sodium-javascript": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", + "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", + "dependencies": { + "blake2b": "^2.1.1", + "chacha20-universal": "^1.0.4", + "nanoassert": "^2.0.0", + "sha256-universal": "^1.1.0", + "sha512-universal": "^1.1.0", + "siphash24": "^1.0.1", + "xsalsa20": "^1.0.0" + } + }, + "node_modules/sodium-native": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", + "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.6.0" + } + }, + "node_modules/sodium-universal": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", + "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", + "dependencies": { + "blake2b": "^2.1.1", + "chacha20-universal": "^1.0.4", + "nanoassert": "^2.0.0", + "sha256-universal": "^1.1.0", + "sha512-universal": "^1.1.0", + "siphash24": "^1.0.1", + "sodium-javascript": "~0.8.0", + "sodium-native": "^4.0.0", + "xsalsa20": "^1.0.0" + } + }, + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/true-myth": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-5.4.0.tgz", + "integrity": "sha512-MonJqkJf+VOXZ2msbpvAI1uJWoyfCN7nirR8/fNK+IlFDWYNLb9iqeAc2uhIbAQBynHtM02azZgepQDQclOwAw==", + "engines": { + "node": "12.* || 14.* || 16.* || >= 18.*" + } + }, + "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==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uint8-util": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.4.tgz", + "integrity": "sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arraylist/node_modules/multiformats": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", + "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" + }, + "node_modules/uint8arraylist/node_modules/uint8arrays": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", + "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/uint8arrays": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", + "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", + "dependencies": { + "multiformats": "^12.0.1" + } + }, + "node_modules/uint8arrays/node_modules/multiformats": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", + "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/ulidx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", + "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", + "dependencies": { + "layerr": "^2.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/xsalsa20": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", + "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" + }, + "node_modules/z32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", + "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", + "dependencies": { + "b4a": "^1.5.3" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/server/src/app.ts b/server/src/app.ts index 82f695f..9344854 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -22,6 +22,7 @@ const app = new Hono() if (res.isErr) return c.json({ error: res.error }) + // @ts-ignore const conditions = res.value.filter(record => record.condition === condition) return c.json(conditions) }) diff --git a/server/src/utils.ts b/server/src/utils.ts index 6460426..4a9c280 100644 --- a/server/src/utils.ts +++ b/server/src/utils.ts @@ -1,5 +1,6 @@ import { Web5 } from "@web5/api"; import ConditionsProtocol, { type Record, did as ConditionsProtocolDID } from "@frontend/utils/protocols/conditions" +// @ts-ignore import Result, { ok, err } from "true-myth/result" export type Agent = { @@ -12,6 +13,7 @@ export type Status = { detail: string, } +// @ts-ignore export async function configureProtocol(agent: Agent): Promise> { const { protocols } = await agent.web5.dwn.protocols.query({ message: { @@ -47,6 +49,7 @@ export async function configureProtocol(agent: Agent): Promise> { const { records, status } = await agent.web5.dwn.records.query({ from: ConditionsProtocolDID, @@ -56,6 +59,7 @@ export async function fetchConditions(agent: Agent): Promise { const { web5, did } = await Web5.connect({ sync: "5s", diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json index c747970..e01b1d3 100644 --- a/tauri-app/package-lock.json +++ b/tauri-app/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", "react": "^18.2.0", @@ -3509,6 +3510,14 @@ "node": ">= 0.4" } }, + "node_modules/hono": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.0.tgz", + "integrity": "sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index e271b75..234198c 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -1,5 +1,6 @@ import "./index.css"; +// @ts-ignore const Rating = ({ rating }) => { return (
      @@ -42,6 +43,7 @@ const Rating = ({ rating }) => { ); }; +// @ts-ignore const createRatingsIcons = (ratings) => { const icons = []; for (let n = 0; n < ratings; n++) { @@ -51,12 +53,19 @@ const createRatingsIcons = (ratings) => { return icons; }; + const index = ({ + // @ts-ignore title, + // @ts-ignore coverIMGUrl, + // @ts-ignore desc_snippet, + // @ts-ignore created_by, + // @ts-ignore rating, + // @ts-ignore isClicked, }) => { return ( diff --git a/tauri-app/src/pages/Contact/index.tsx b/tauri-app/src/pages/Contact/index.tsx index 4c07599..d37ad95 100644 --- a/tauri-app/src/pages/Contact/index.tsx +++ b/tauri-app/src/pages/Contact/index.tsx @@ -5,7 +5,7 @@ interface RowProp { name: String; address: String; city: String; - distance: Number; + distance: string; } const RowComponent: FC = ({ name, address, city, distance }) => { @@ -33,19 +33,19 @@ const index: FC = () => { name: "Hopsital", address: "No 4 Dress road", city: "Kumkubaga", - distance: 47, + distance: '47', }, { name: "Hopsital", address: "No 4 Dress road", city: "Kumkubaga", - distance: 47, + distance: '47', }, { name: "Hopsital", address: "No 4 Dress road", city: "Kumkubaga", - distance: 47, + distance: '47', }, ]); return ( diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 9a61790..d95d177 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -54,6 +54,7 @@ const index = () => { const [isCardDetailActive, setIsCardDetailActive] = useState(false); const [activeCard, setActiveCard] = useState(null); + // @ts-ignore const isCardClicked = (cardDetail) => { setIsCardDetailActive(!isCardDetailActive); setIsAddCardActive(false); @@ -79,6 +80,7 @@ const index = () => { { {isAddCardActive && } {isCardDetailActive && ( diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index 627b7c6..8045d24 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -1,7 +1,7 @@ import "./index.css"; import { useState } from "react"; -import Ratings from "../../../components/Ratings/"; +import Ratings from "../../components/Ratings"; import RemedyCard from "../../components/RemedyCard/"; import AddRemedyComponent from "../../components/AddRemedyComponent/"; @@ -47,6 +47,7 @@ const index = () => { const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); const [activeRemedy, setActiveRemedy] = useState(null); + // @ts-ignore const remedyClicked = (remedyDetail) => { setActiveRemedy(remedyDetail); setIsDetailRemedyActive(true); @@ -56,12 +57,16 @@ const index = () => { const Rate = () => { if (!isRated) { setActiveRemedy({ + // @ts-ignore ...activeRemedy, + // @ts-ignore rating: activeRemedy.rating + 1, }); } else { setActiveRemedy({ + // @ts-ignore ...activeRemedy, + // @ts-ignore rating: activeRemedy.rating - 1, }); } @@ -104,6 +109,7 @@ const index = () => {
      {
      Rate()} className="rd-container"> - {activeRemedy.rating} + {// @ts-ignore + activeRemedy.rating}
      -

      {activeRemedy.title}

      +

      {// @ts-ignore + activeRemedy.title}

      -

      {activeRemedy.desc}

      - {activeRemedy.steps && +

      { + // @ts-ignore + activeRemedy.desc}

      + {// @ts-ignore + activeRemedy.steps && + // @ts-ignore activeRemedy.steps.map((step, indx) => { return (
      From d7908030837d856a9647912a2b6c3cef6cfcebd1 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 11:41:06 +0000 Subject: [PATCH 028/124] trying something out with the docs schema --- tauri-app/src/utils/document.ts | 58 +++++++++++++++++++++++ tauri-app/src/utils/protocols/document.ts | 5 +- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index e69de29..58f6970 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -0,0 +1,58 @@ +import { Record, Web5 } from "@web5/api/browser" +import DocumentProtocol from "./protocols/document"; + +type Agent = { + web5: Web5 + did: string +} + +type DocumentSchema = typeof DocumentProtocol["types"][keyof typeof DocumentProtocol["types"]]["schema"] + +type FilterObj = { + schema?: DocumentSchema +} + +async function fetchDocumentRecords(agent: Agent, filter?: FilterObj) { + const { records } = await agent.web5.dwn.records.query({ + message: { + filter: { + ...filter, + protocol: DocumentProtocol.protocol, + }, + // @ts-ignore + dateSort: "createdAscending", + }, + }); + + if (!records) return false + + return records +} + +async function createRecord() { + const docs = []; + for (const record of records) { + const data = await record.data.json(); + docs.push({ + record, + data, + id: record.id + }); + } + + setDocuments(docs); +} + +async function createBlobRecord(web5: Web5, file: File) { + const { record: uploadedRecord } = await web5.dwn.records.create({ + data: new Blob([file], { type: file.type }), + message: { + schema: DocumentProtocol.types.blob.schema, + protocol: DocumentProtocol.protocol + } + }) + + if (!uploadedRecord) return false + + return uploadedRecord +} diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index e4a148b..ce134ca 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -11,7 +11,7 @@ const DocumentProtocol = { blob: { schema: "https://dschema.org/protocols/document/schemas/blob.json", dataFormats: [ - "application/json" + "application/binary" ] } }, @@ -36,13 +36,12 @@ const DocumentProtocol = { }, { who: "author", - of: "parentId", can: "write" } ] } } -} +} as const export namespace Record { export type File = Blob From 326a9e699811359549718ec0111a37c7889eb1f7 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 13:27:32 +0100 Subject: [PATCH 029/124] added contact link to nav --- tauri-app/src/components/MobileNavbar/index.tsx | 6 ++++++ tauri-app/src/components/Navbar/index.tsx | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/tauri-app/src/components/MobileNavbar/index.tsx b/tauri-app/src/components/MobileNavbar/index.tsx index 8fd49dd..bf5ec08 100644 --- a/tauri-app/src/components/MobileNavbar/index.tsx +++ b/tauri-app/src/components/MobileNavbar/index.tsx @@ -31,6 +31,12 @@ const index = () => { 99+
      + +
      + +

      Contact

      +
      +
      ); }; diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 306f248..dbdee85 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -36,6 +36,12 @@ const index = () => { 99+
      + +
      + +

      Contact

      +
      +

      Join us!

      From e1a644c57dfea7480f430c928874981282eae4be Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 14:29:43 +0100 Subject: [PATCH 030/124] landing page ficed --- tauri-app/src/pages/Home/index.css | 5 ++--- tauri-app/src/pages/Home/index.tsx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/pages/Home/index.css b/tauri-app/src/pages/Home/index.css index 991884d..1016240 100644 --- a/tauri-app/src/pages/Home/index.css +++ b/tauri-app/src/pages/Home/index.css @@ -21,13 +21,13 @@ margin: 20px 0px; } -.header { +#header { font-family: "Roboto"; font-size: 20px; font-weight: 500; } -.header b { +#header b { font-family: "Pacifico"; text-transform: capitalize; color: var(--color-blue); @@ -150,7 +150,6 @@ } @keyframes morphBorder { - 0%, 100% { border-radius: 70% 30% 41% 59% / 47% 73% 27% 53%; diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 45fb46d..0e8f03e 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -6,7 +6,7 @@ export default function HomePage() {
      - + Hi welcome to, pulsePal From f7fd39c174801c8646e44b1cd4a8c97aac0093d2 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 15:14:50 +0100 Subject: [PATCH 031/124] fix add card modal padding --- .../src/components/AddCardComponent/index.css | 33 +++++++++++++++---- .../src/components/AddCardComponent/index.tsx | 2 +- .../components/AddRemedyComponent/index.css | 8 ++--- .../components/AddRemedyComponent/index.tsx | 2 +- .../components/DetailCardComponent/index.css | 21 ++++++++++-- 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.css b/tauri-app/src/components/AddCardComponent/index.css index 62a2e57..a10a401 100644 --- a/tauri-app/src/components/AddCardComponent/index.css +++ b/tauri-app/src/components/AddCardComponent/index.css @@ -1,7 +1,7 @@ .main-add-card-container { background: var(--color-white); width: 500px; - min-height: 300px; + max-height: 600px; position: relative; z-index: 7; border-radius: 15px; @@ -21,6 +21,25 @@ justify-content: space-between; align-items: center; flex-direction: column; + padding: 10px; + overflow-y: scroll; + min-height: 300px; +} + +.input-form::-webkit-scrollbar { + width: 6px; +} + +.input-form::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.input-form::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; } .input-form input[type="text"] { @@ -74,9 +93,9 @@ border: 2px solid var(--color-blue); border-style: dashed; border-radius: 15px; - width: 100%; - height: 100px; - margin: 15px 0; + width: 90%; + min-height: 60px; + margin: 15px; display: flex; justify-content: center; align-items: center; @@ -86,9 +105,9 @@ .form-container-active { border: 2px solid var(--color-green); border-radius: 15px; - width: 100%; - height: 100px; - margin: 15px 0; + width: 90%; + min-height: 60px; + margin: 15px; display: flex; justify-content: center; align-items: center; diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index 3da12d8..9e324bd 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -9,7 +9,7 @@ const FileUploader = () => { const [file, setFile] = useState({ file: null }); return ( -
      +
      { setFile({ file: e?.target?.files?.[0] }); diff --git a/tauri-app/src/components/AddRemedyComponent/index.css b/tauri-app/src/components/AddRemedyComponent/index.css index 6d610f5..13c1aa5 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.css +++ b/tauri-app/src/components/AddRemedyComponent/index.css @@ -29,7 +29,7 @@ flex-direction: column; overflow-y: scroll; overflow-x: hidden; - max-height: 300px; + height: 400px; } .input-form::-webkit-scrollbar { @@ -101,7 +101,7 @@ border-style: dashed; border-radius: 15px; width: 100%; - height: 100px; + min-height: 60px; margin: 15px 0; display: flex; justify-content: center; @@ -113,7 +113,7 @@ border: 2px solid var(--color-green); border-radius: 15px; width: 100%; - height: 100px; + min-height: 60px; margin: 15px 0; display: flex; justify-content: center; @@ -167,7 +167,7 @@ } .uploader-content { - width: 100%; + width: 90%; } @media (max-width: 750px) { diff --git a/tauri-app/src/components/AddRemedyComponent/index.tsx b/tauri-app/src/components/AddRemedyComponent/index.tsx index 31d8dc4..323808c 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.tsx +++ b/tauri-app/src/components/AddRemedyComponent/index.tsx @@ -9,7 +9,7 @@ const FileUploader: FC = () => { const [file, setFile] = useState({ file: null }); return ( -
      +
      { setFile({ file: e?.target?.files?.[0] }); diff --git a/tauri-app/src/components/DetailCardComponent/index.css b/tauri-app/src/components/DetailCardComponent/index.css index 093fbff..e93f6dd 100644 --- a/tauri-app/src/components/DetailCardComponent/index.css +++ b/tauri-app/src/components/DetailCardComponent/index.css @@ -1,12 +1,11 @@ .main-detail-container { width: 500px; - min-height: 450px; + max-height: 600px; background: var(--color-white); padding: var(--padding-desktop); border-radius: 15px; position: relative; margin-top: 20px; - overflow-y: scroll; } .main-detail-container h1 { @@ -24,6 +23,24 @@ .main-detail-container p { margin: 20px 0; font-family: "Open Sans"; + max-height: 300px; + overflow-y: scroll; +} + +.main-detail-container::-webkit-scrollbar { + width: 6px; +} + +.main-detail-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.main-detail-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; } .close-btn { From 521207eb47b9de63522542fa9c017ec599c9074b Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 14:54:26 +0000 Subject: [PATCH 032/124] updated the protocol --- tauri-app/src/stores/useWeb5Store.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 9f0a7a9..ba32509 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,6 +1,7 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; import ConditionsProtocol from "@/utils/protocols/conditions"; +import DocumentProtocol from "@/utils/protocols/document"; interface Web5State { web5: Web5 | null; @@ -68,7 +69,7 @@ const useWeb5Store = create((set, get) => ({ // configure protocol on local DWN const { protocol, status: protocolConfigurationStatus } = await web5.dwn.protocols.configure({ message: { - definition: p, + definition: Object.assign(p), }, }); if (!protocol) { @@ -202,4 +203,4 @@ export const schemaOrgProtocolDefinition = { }, }; -const protocols = [schemaOrgProtocolDefinition, ConditionsProtocol]; +const protocols = [schemaOrgProtocolDefinition, ConditionsProtocol, DocumentProtocol]; From 6eba629e49187d095bd4c44abd6cc08dbf57c830 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 14:54:32 +0000 Subject: [PATCH 033/124] updated the medic page --- tauri-app/src/pages/medic.tsx | 99 ++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 9ae13ff..b732166 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -1,6 +1,9 @@ import { FunctionComponent, useEffect, useState } from "react"; -import useWeb5Store from "@/stores/useWeb5Store"; -import { useDocuments } from "@/stores/useDocuments"; +import useWeb5Store from "@/stores/useWeb5Store"; +import DocumentUtils from "@/utils/document"; +import { Record as DocumentRecord } from "@/utils/protocols/document"; +import { Record as Web5Record } from "@web5/api/browser"; +import AuthGuard from "@/components/Auth/Guard"; const possibleConditions = [ "Cancer", @@ -11,55 +14,46 @@ const possibleConditions = [ "Mental Illness", ] -const MedicPage: FunctionComponent = () => { - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) - const { fetchDocuments, documents, createDocument, getDocumentFile } = useDocuments(web5, did) - const [docsWithImageUrls, setDocsWithImageUrls] = useState<{ - document: typeof documents[0], - url: string - }[]>([]) - - const [form, setForm] = useState<{ - name: string - doc: File, - condition: string - }>({ +const Page: FunctionComponent = () => { + const agent = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) + const [documentsWithUrl, setDocumentsWithUrl] = useState<{ document: DocumentRecord.Document, fileUrl: string, record: Web5Record }[]>([]) + const [form, setForm] = useState({ name: "", - doc: new File([], ""), - condition: "" + file: new File([], ""), + condition: possibleConditions[0] }) useEffect(() => { - if (web5) { - fetchDocuments() - } - }, [web5]) - - async function processDocsImage() { - const docsWithImageUrls: { document: typeof documents[0], url: string }[] = [] - - for (const doc of documents) { - const file = await getDocumentFile(doc) - let url = "" - if (file) - url = URL.createObjectURL(file) - - docsWithImageUrls.push({ - document: doc, - url - }) - } - - setDocsWithImageUrls(docsWithImageUrls) - } - - useEffect(() => { - processDocsImage() - }, [documents]) + (async () => { + const docRecords = await DocumentUtils.fetchDocumentRecords(agent) + if (!docRecords) { + console.log("Failed to fetch document records") + return + } + + const docsWithUrl = [] + for (const docRecord of docRecords) { + const data: DocumentRecord.Document = await docRecord.data.json() + const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.url) + + if (!fileRecord) + continue + + const file = new File([await fileRecord.data.blob()], data.name, { type: data.encodingFormat }) + + docsWithUrl.push({ + record: docRecord, + document: data, + fileUrl: URL.createObjectURL(file), + }) + } + + setDocumentsWithUrl(docsWithUrl) + })() + }, []) const saveMedicalRecord = async () => { - console.log(form) - const res = await createDocument({ name: form.name ? form.name : undefined, file: form.doc, condition: form.condition }) + const res = await DocumentUtils.createDocumentRecord(agent, form) if (res) { alert(`Medical record saved: ${res}`) @@ -69,8 +63,6 @@ const MedicPage: FunctionComponent = () => { } } - console.log(documents) - return (
      { @@ -96,7 +88,7 @@ const MedicPage: FunctionComponent = () => { setForm({ ...form, - doc: file + file: file }) }} placeholder="Document" /> @@ -105,6 +97,7 @@ const MedicPage: FunctionComponent = () => {
      diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css new file mode 100644 index 0000000..2c3dd37 --- /dev/null +++ b/tauri-app/src/components/UserProfile/index.css @@ -0,0 +1,55 @@ +.userprofile-container { + box-shadow: var(--box-shadow-black); + width: 200px; + text-align: center; + border-radius: 15px; + padding: 8px 12px; + position: relative; +} + +.userprofile-info-container img { + width: 80px; + height: 80px; + border-radius: 50%; + background: var(--color-white); + padding: 10px; + position: absolute; + top: 80px; + left: 50%; + transform: translateX(-50%); +} + +.userprofile-info-container p { + font-family: "Open Sans"; + margin-top: 40px; +} + +.cover-container { + height: 130px; + border-radius: 15px; + text-align: left; +} + +.cover-container h3 { + color: var(--color-white); + font-family: "Roboto"; + font-size: 18px; + position: relative; + left: 6px; + top: 10px; +} + +.cover-container p { + color: var(--color-white); + font-family: "Open Sans"; + font-size: 14px; + position: relative; + left: 6px; + top: 15px; +} + +@media (max-width: 750px) { + .userprofile-container { + width: 100%; + } +} diff --git a/tauri-app/src/components/UserProfile/index.tsx b/tauri-app/src/components/UserProfile/index.tsx new file mode 100644 index 0000000..59c87f0 --- /dev/null +++ b/tauri-app/src/components/UserProfile/index.tsx @@ -0,0 +1,42 @@ +import React, { FC } from "react"; + +import "./index.css"; + +interface UserProfileProps { + username: String; + profile_pic: String; + cover_pic: String; + about_user: String; + friends: Number; +} +const index: FC = ({ + username, + profile_pic, + cover_pic, + about_user, + friends, +}) => { + return ( +
      +
      +

      @{username}

      +

      + Friends | {friends} +

      +
      +
      + +

      {about_user}

      +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index e69de29..322a4e5 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -0,0 +1,12 @@ +.main-chat-container { + padding: var(--padding-desktop); + display: flex; + justify-content: center; + align-items: center; +} + +@media (max-width: 750px) { + .main-chat-container { + padding: var(--padding-mobile); + } +} diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index ab8d90e..89b5b1f 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,9 +1,18 @@ import "./index.css"; +import UserProfile from "../../components/UserProfile/"; -const index= () => { +const index = () => { return ( -
      -

      Chat Page

      +
      +
      ); }; From 2e416aacb1a371fc422eef09b23c0bd336ad37f4 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:29:46 +0000 Subject: [PATCH 043/124] updated the protocol defs --- tauri-app/src/utils/document.ts | 2 + tauri-app/src/utils/medical-document.ts | 206 ------------------------ tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 2 + tauri-app/src/utils/user.ts | 180 +++++++++++++++++++++ 5 files changed, 185 insertions(+), 207 deletions(-) delete mode 100644 tauri-app/src/utils/medical-document.ts create mode 100644 tauri-app/src/utils/user.ts diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index 01c36de..7ffa21d 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -238,6 +238,8 @@ const DocumentUtils = { fetchDocumentRecords, updateDocumentRecord, createDocumentRecord, + createBlobRecord, + updateBlobRecord, fetchBlobRecord, } diff --git a/tauri-app/src/utils/medical-document.ts b/tauri-app/src/utils/medical-document.ts deleted file mode 100644 index 7296af3..0000000 --- a/tauri-app/src/utils/medical-document.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { Record as Web5Record, Web5 } from "@web5/api" - -export namespace MedicalRecord { - export type NullFlavor = "253|unknown|" | "271|no information|" | "272|masked|" | "273|not applicable|" - - export type QuantityComment = { - "@type": "DV_TEXT", - value: string - } - - export type QuantityMagnitude = { - "@type": "DV_MAGNITUDE", - magnitude: number, - unit: string, - comment?: string - } - - type Quantity = QuantityMagnitude | QuantityComment - - export type Element = { - "@type": "ELEMENT", - name: string, - value: Quantity - } & ({ - null_flavor?: NullFlavor, - null_reason?: string - } | { - null_flavor: NullFlavor, - null_reason: string - }) - - export type ItemSingle = { - "@type": "ITEM_SINGLE", - item: Element - } - - export type ItemList = { - "@type": "ITEM_LIST", - items: Item[] - } - - export type Item = ItemSingle | ItemList - - export type HistoryEvent = { - "@type": "EVENT", - time: Date, - state: Item - } - - export type History = { - "@type": "HISTORY", - origin?: Date, - period?: Date, - duration?: Date, - events: HistoryEvent[] - } - - export type Document = { - history?: History, - comment?: string - } -} - -export function createQuantityMagnitude(quantity: Omit): MedicalRecord.QuantityMagnitude { - return { - ...quantity, - "@type": "DV_MAGNITUDE" - } -} - -export function createQuantityComment(quantity: Omit): MedicalRecord.QuantityComment { - return { - ...quantity, - "@type": "DV_TEXT" - } -} - - -export function createItem(element: Omit): MedicalRecord.ItemSingle { - return { - "@type": "ITEM_SINGLE", - item: { - ...element, - "@type": "ELEMENT" - } - } -} - -export class MedicalDocument { - declare private _web5: Web5 - declare private _protocol: string - private _id: string | undefined = undefined - declare private _history: MedicalRecord.History - private _comment: string | undefined = "" - declare private _record: Web5Record - - constructor(web5: Web5, protocol: string, doc?: MedicalRecord.Document & { id: string }) { - this._web5 = web5 - this._protocol = protocol - - this._history = { - "@type": "HISTORY", - events: [] - } - - if (doc) { - if (doc.history) - this._history = doc.history - this._comment = doc.comment - this._id = doc.id - } - } - - setHistory(payload: { origin?: Date, period?: Date, duration?: Date }) { - this._history = { - '@type': 'HISTORY', - origin: payload.origin, - period: payload.period, - duration: payload.duration, - events: [] - } - } - - addHistoryEvent(payload: { time: Date, state: MedicalRecord.Item }) { - this._history.events.push({ - "@type": "EVENT", - time: payload.time, - state: payload.state - }) - - return this._history.events.length - 1 - } - - set comment(comment: string | undefined) { - this._comment = comment - } - - get comment() { - return this._comment - } - - static async getById(web5: Web5, protocol: string, id: string) { - const { records } = await web5.dwn.records.query({ - message: { - filter: { - recordId: id, - protocol - } - } - }) - - if (!records) - return null - - const firstRecordResponse = records[0] - if (!firstRecordResponse) - return null - - const medicalRecord: MedicalRecord.Document = await firstRecordResponse.data.json() - - return new MedicalDocument(web5, protocol, Object.assign(medicalRecord, { id })) - } - - async save(): Promise { - let record: Web5Record | undefined = undefined - - if (this._id) { - const res = await this._record.update({ - data: { - history: this._history, - comment: this._comment - } - }) - - if (res.status.code === 200) - return this._id - - return false - } - - const res = await this._web5.dwn.records.create({ - data: { - "@context": "https://schema.org", - "@type": "MEDICAL_RECORD", - history: this._history, - comment: this._comment - }, - message: { - schema: "https://schema.org/Person", - dataFormat: "application/json", - protocol: this._protocol, - protocolPath: "person", - }, - }) - - record = res.record - console.log(res) - - if (!record) - return false - - this._id = record.id - - return record.id - } -} diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 9a68b17..89846ca 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.1" as const +export const url = "https://dschema.org/v0.0.2" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index fd61a66..afbc382 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -17,6 +17,7 @@ const UserDetailsProtocol = { $actions: [ { who: "author", + of: "details", can: "read" }, { @@ -33,6 +34,7 @@ export namespace Record { firstName: string lastName: string profilePictureUrl: string + dateCreated: string } } diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts new file mode 100644 index 0000000..44a53a2 --- /dev/null +++ b/tauri-app/src/utils/user.ts @@ -0,0 +1,180 @@ +import { Web5, Record as Web5Record } from "@web5/api/browser" +import UserDetailsProtocol, { Record as UserDetailsProtocolRecord, did as UserDetailsProtocolDID } from "./protocols/user"; +import DocumentUtils from "./document"; +import _ from "lodash"; + +type Agent = { + web5: Web5 + did: string +} + +type FilterObj = { + recordId: string, +} + +type Type = keyof typeof UserDetailsProtocol["types"] +type Schema = typeof UserDetailsProtocol["types"][T]["schema"] +type DataFormat = typeof UserDetailsProtocol["types"][T]["dataFormats"][number] + +type FullFilterObj = { + protocolPath: T + schema: Schema +} + +type FullMessageObj = { + schema: Schema + protocolPath: T + dataFormat: DataFormat + published: typeof UserDetailsProtocol["published"] +} + +async function createRecord(agent: Agent, data: UserDetailsProtocolRecord.Details, message: FullMessageObj) { + const { record, status } = await agent.web5.dwn.records.create({ + data, + message: Object.assign({ + ...message, + protocol: UserDetailsProtocol.protocol, + }) + }); + + if (!record) { + console.error("Failed to create record:", status) + return false + } + + const { status: syncStatus } = await record.send(UserDetailsProtocolDID) + + if (syncStatus.code !== 202) { + console.log("Failed to sync record with remote DWN:", syncStatus) + } + + return record +} + +async function fetchRecords(agent: Agent, filter: FullFilterObj) { + const { records, status } = await agent.web5.dwn.records.query({ + from: UserDetailsProtocolDID, + message: { + filter: { + ...filter, + protocol: UserDetailsProtocol.protocol, + }, + // @ts-ignore + dateSort: "createdAscending", + }, + }); + + if (!records) { + console.log("Failed to fetch records:", status) + return false + } + return records +} + +async function fetchUserDetailsRecord(agent: Agent) { + const records = await fetchRecords(agent, { + schema: UserDetailsProtocol.types.details.schema, + protocolPath: "details", + }) + + if (!records || !records[0]) return false + + return records[0] +} + +async function fetchUserDetailsRecords(agent: Agent) { + return fetchRecords(agent, { + protocolPath: "details", + schema: UserDetailsProtocol.types.details.schema, + }) +} + +type UpdatePayload = Partial<{ + firstName: string + lastName: string + profilePicture: File +}> + +async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Record, payload: Partial) { + let record: Web5Record + + if (typeof idOrRecord === "string") { + const fetchedRecord = await fetchUserDetailsRecord(agent, { recordId: idOrRecord }) + + if (!fetchedRecord) return false + + record = fetchedRecord + } + else { + record = idOrRecord + } + + const data: UserDetailsProtocolRecord.Details = await record.data.json() + const { profilePicture, ...restPayload } = payload + + let url = data.profilePictureUrl + if (profilePicture) { + const blobRecord = await DocumentUtils.updateBlobRecord(agent, url, profilePicture) + if (!blobRecord) return false + + url = blobRecord.id + } + + const { status } = await record.update({ + data: _.merge(data, Object.assign(restPayload, { url })) + }) + + if (status.code !== 202) { + console.log("Failed to sync document record update with remote DWN:", status) + return false + } + + return record +} + +type CreatePayload = { + firstName: string + lastName: string + profilePicture: File, +} +async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { + const existingRecord = await fetchUserDetailsRecord(agent) + if (existingRecord) { + console.error("User details record already exists") + return false + } + + const blobRecord = await DocumentUtils.createBlobRecord(agent, payload.profilePicture) + if (!blobRecord) return false + + const { profilePicture, ...restPayload } = payload + + const record = await createRecord( + agent, + { + ...restPayload, + profilePictureUrl: blobRecord.id, + dateCreated: new Date().toISOString() + }, + { + schema: UserDetailsProtocol.types.details.schema, + protocolPath: "details", + dataFormat: UserDetailsProtocol.types.details.dataFormats[0], + published: UserDetailsProtocol.published, + }) + + if (!record) { + console.error("Failed to create document record") + return false + } + + return record +} + +const UserDetailsUtils = { + fetchUserDetailsRecord, + updateUserDetailsRecord, + createUserDetailsRecord, +} + +export default UserDetailsUtils From 336689b1e060f21843d37784156660e70007bc8b Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:29:53 +0000 Subject: [PATCH 044/124] added new components for the auth --- .../src/components/Auth/Account/Guard.tsx | 18 ++++++++++++++++++ tauri-app/src/components/Navbar/index.tsx | 16 ++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 tauri-app/src/components/Auth/Account/Guard.tsx diff --git a/tauri-app/src/components/Auth/Account/Guard.tsx b/tauri-app/src/components/Auth/Account/Guard.tsx new file mode 100644 index 0000000..c558411 --- /dev/null +++ b/tauri-app/src/components/Auth/Account/Guard.tsx @@ -0,0 +1,18 @@ +import { PropsWithChildren, ReactNode } from "react"; +import AuthGuard from "../Guard"; +import { useProfile } from "@/stores/profile"; + +const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { + const isSignedIn = useProfile(state => state.state.isSignedIn) + + if (!isSignedIn) + return <>{fallback} ?? null + + return <>{children} +} + +export default function AccountGuard(props: PropsWithChildren & { fallback?: ReactNode }) { + return + + +} diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index dbdee85..71fc31e 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -1,3 +1,4 @@ +import AccountGuard from "../Auth/Account/Guard"; import "./index.css"; import { NavLink } from "react-router-dom"; @@ -43,10 +44,17 @@ const index = () => {
      -
      -

      Join us!

      - -
      + +

      Join us!

      + +
      + }> +
      +

      Profile

      + +
      +
      ); }; From 3e86282f6f0dafcd8667b9c4676241b8593edecb Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:30:00 +0000 Subject: [PATCH 045/124] added a new profile store --- tauri-app/src/stores/profile.ts | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tauri-app/src/stores/profile.ts diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts new file mode 100644 index 0000000..df439f2 --- /dev/null +++ b/tauri-app/src/stores/profile.ts @@ -0,0 +1,77 @@ +import { create } from "zustand" +import { combine } from "zustand/middleware"; +import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; +import { Agent } from "@/components/Auth/types"; +import UserDetailsUtils from "@/utils/user"; +import DocumentUtils from "@/utils/document"; + +type State = { + profile: { + firstName: string, + lastName: string, + profilePictureUrl: string + }, + isSignedIn: true +} | { + profile: null, + isSignedIn: false +} + +type Payload = { + firstName: string, + lastName: string, + profilePicture: File +} + +export const useProfile = create( + combine({ + state: { + profile: null, + isSignedIn: false + } as State + }, (set, get) => ({ + signOut: () => { + if (get().state.isSignedIn) { + set({ + state: { + isSignedIn: false, + profile: null + } + }) + } + }, + signIn: async (agent: Agent) => { + const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) + if (!profileRecord) return false + + const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() + console.log(profile) + + const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureUrl) + let profilePictureUrl = "" + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob() + profilePictureUrl = URL.createObjectURL(profilePictureBlob) + } + + set({ + state: { + isSignedIn: true, + profile: { + firstName: profile.firstName, + lastName: profile.lastName, + profilePictureUrl + } + } + }) + + return true + }, + signUp: async (agent: Agent, payload: Payload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) + if (!profile) return false + + return true + } + })) +) From 8253b5d277a3d1629a420898a637fe5ca22cd19e Mon Sep 17 00:00:00 2001 From: Adophilus Date: Fri, 5 Jan 2024 19:30:15 +0000 Subject: [PATCH 046/124] updated the es version on the server --- server/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/tsconfig.json b/server/tsconfig.json index b77ecc0..880f229 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -5,6 +5,7 @@ "noImplicitAny": true, "noFallthroughCasesInSwitch": true, "module": "CommonJS", + "target": "ES2020", "baseUrl": ".", "paths": { "@backend/*": ["./src/*"], @@ -12,7 +13,7 @@ } }, "include": [ - "server.ts", + "*.ts", "./src/**/*.ts" ], "exclude": [ From 6e07780dcb36ca11498922e45f4d8cb3c01e3095 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Fri, 5 Jan 2024 22:04:33 +0100 Subject: [PATCH 047/124] fixed some bugs again --- tauri-app/src/components/AddCardComponent/index.css | 3 ++- tauri-app/src/components/AddRemedyComponent/index.css | 3 ++- tauri-app/src/components/Navbar/index.css | 2 +- tauri-app/src/pages/Remedies/index.css | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.css b/tauri-app/src/components/AddCardComponent/index.css index a10a401..e82047b 100644 --- a/tauri-app/src/components/AddCardComponent/index.css +++ b/tauri-app/src/components/AddCardComponent/index.css @@ -23,7 +23,8 @@ flex-direction: column; padding: 10px; overflow-y: scroll; - min-height: 300px; + overflow-x: hidden; + max-height: 300px; } .input-form::-webkit-scrollbar { diff --git a/tauri-app/src/components/AddRemedyComponent/index.css b/tauri-app/src/components/AddRemedyComponent/index.css index b2ba7cd..47a106b 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.css +++ b/tauri-app/src/components/AddRemedyComponent/index.css @@ -29,7 +29,8 @@ flex-direction: column; padding: 10px; overflow-y: scroll; - height: 300px; + overflow-x: hidden; + max-height: 300px; } .input-form-r::-webkit-scrollbar { diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index 9ec3d00..056aa0b 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -7,7 +7,7 @@ position: sticky; top: 0; background: var(--color-white); - z-index: 8; + z-index: 10; } .logo_container { diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index 52d4931..483959e 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -69,6 +69,7 @@ justify-content: center; align-items: center; z-index: 6; + margin-top: 30px; } .active-remedy-container { From 457d3a51acd732746f2609d617a2df65b417746b Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 08:18:50 +0530 Subject: [PATCH 048/124] integrated remedy Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 - .../components/AddRemedyComponent/index.tsx | 46 +++++----- tauri-app/src/components/Navbar/index.tsx | 2 +- tauri-app/src/components/RemedyCard/index.tsx | 14 ++- tauri-app/src/pages/Remedies/index.tsx | 89 ++++++++++--------- tauri-app/src/pages/remedy.tsx | 75 ++++++++++------ tauri-app/src/stores/useRemedy.ts | 10 ++- 7 files changed, 133 insertions(+), 105 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 043b4b3..3035450 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import Doctors from "./pages/nearbyDoctor"; import HomePage from "./pages/Home"; import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; -import Remedies from "./pages/Remedies"; import Chat from "./pages/Chat/"; import Contact from "./pages/Contact/"; @@ -20,7 +19,6 @@ const router = createHashRouter([ children: [ { path: "/", element: }, { path: "/records", element: }, - { path: "/remedies", element: }, { path: "/connect", element: }, { path: "/remedy", element: }, { path: "/medic", element: }, diff --git a/tauri-app/src/components/AddRemedyComponent/index.tsx b/tauri-app/src/components/AddRemedyComponent/index.tsx index 323808c..9d00665 100644 --- a/tauri-app/src/components/AddRemedyComponent/index.tsx +++ b/tauri-app/src/components/AddRemedyComponent/index.tsx @@ -1,5 +1,6 @@ import "./index.css"; import React, { FC, useState } from "react"; +import Remedies from '../../pages/Remedies' interface FileProp { file: File | null | undefined; @@ -37,7 +38,8 @@ const StepField: FC = ({ index }) => { ); }; -const index: FC = () => { +//@ts-ignore +const index: FC = ({saveFunc, formFunc, form}) => { const [steps, setSteps] = useState([ , ]); @@ -45,29 +47,29 @@ const index: FC = () => { return (

      Create New Remedy

      - + {/* */} + { + e.preventDefault() + saveFunc() + }} + >
      - - -
      -
      - setSteps([...steps, ]) - } - > - -
      - {steps.map((Field) => { - return Field; - })} -
      - -

      - *ensure inputted information are correct as once saved it cannot be - deleted/edited -

      + formFunc({ ...form, name: e.target.value })} + /> + + + +
      +
      + )}
      ); diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index 483959e..e39bc8a 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -33,7 +33,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 8; + z-index: 9; } .close-add-records-btn { @@ -48,7 +48,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 8; + z-index: 9; transform: rotate(45deg); transition: 0.3s; } @@ -69,7 +69,7 @@ justify-content: center; align-items: center; z-index: 6; - margin-top: 30px; + margin-top: 40px; } .active-remedy-container { diff --git a/tauri-app/src/stores/pulseGlobalStore.ts b/tauri-app/src/stores/pulseGlobalStore.ts new file mode 100644 index 0000000..069b0b7 --- /dev/null +++ b/tauri-app/src/stores/pulseGlobalStore.ts @@ -0,0 +1,13 @@ +import { create } from "zustand"; + +type PulseGlobalStore = { + isAuthBtnClicked: boolean; + toggleIsAuthBtnClicked: () => void; +}; + +export const usePulseGlobalStore = create((set) => ({ + isAuthBtnClicked: true, + toggleIsAuthBtnClicked: () => { + set((state) => ({ isAuthBtnClicked: !state.isAuthBtnClicked })); + }, +})); From 7b6bf959963f896b6c9f2691723bd5bbe1261b97 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 19:03:10 +0530 Subject: [PATCH 058/124] fixed remedy bug Signed-off-by: coder12git --- tauri-app/src/components/RemedyCard/index.tsx | 4 ++-- tauri-app/src/pages/Remedies/index.tsx | 12 ++++++------ tauri-app/src/pages/remedy.tsx | 2 +- tauri-app/src/stores/useRemedy.ts | 1 + 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 4acf880..0144f85 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -60,7 +60,7 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, url, + created_by, useUrl, // @ts-ignore rating, // @ts-ignore @@ -70,7 +70,7 @@ const index = ({
      { description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", desc: "Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.", - url: "/pg.jpg", + useUrl: "/pg.jpg", rating: '1.5', created_by: "draky", // steps: [ @@ -31,7 +31,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { name: "Aloe Vera Eczema Fix", description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", - url: "/pg.jpg", + useUrl: "/pg.jpg", rating: '4', created_by: "dave", }, @@ -39,7 +39,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { name: "Asthma Breathing Exercises", description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", - url: "/pg.jpg", + useUrl: "/pg.jpg", rating: '3.5', created_by: "nikki", }, @@ -105,7 +105,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { { { className="rimg-container" style={{ // @ts-ignore - background: `url(/pg.jpg)`, + background: `url(${activeRemedy.useUrl})`, backgroundPosition: "center", backgroundSize: "cover", }} diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index 7fb9f6f..eb39b90 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -57,7 +57,7 @@ const Remedy: FunctionComponent = () => { if (file) url = URL.createObjectURL(file) console.log(url); - + doc.data.useUrl=url docsWithImageUrls.push({ document: doc, url diff --git a/tauri-app/src/stores/useRemedy.ts b/tauri-app/src/stores/useRemedy.ts index 4170818..8e5199e 100644 --- a/tauri-app/src/stores/useRemedy.ts +++ b/tauri-app/src/stores/useRemedy.ts @@ -9,6 +9,7 @@ export type Remedy = { name: string; description: string; created_by: string; + useUrl: string; encodingFormat: string; size: string; url: string; From 891f92544bdfe3749fc08aa83d1b597ce143c119 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sat, 6 Jan 2024 14:48:37 +0100 Subject: [PATCH 059/124] fixed buttin z-index --- tauri-app/src/App.tsx | 4 +- tauri-app/src/components/RemedyCard/index.tsx | 2 +- tauri-app/src/pages/Remedies/index.css | 4 +- tauri-app/src/pages/Remedies/index.tsx | 75 +++++++++++-------- 4 files changed, 50 insertions(+), 35 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 28269fe..ff8e222 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -35,7 +35,9 @@ function App() { if (!web5) connect(); }, []); - return <>{web5 ? :
      Connecting...
      }; + return ( + <>{true ? :
      Connecting...
      } + ); } export default App; diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 5110d2c..79e6422 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -45,7 +45,7 @@ const index = ({
      -

      {desc_snippet.slice(0, 150) + "..."}

      +

      {description.substring(0, 150) + "..."}

      diff --git a/tauri-app/src/pages/Remedies/index.css b/tauri-app/src/pages/Remedies/index.css index e39bc8a..cffe86d 100644 --- a/tauri-app/src/pages/Remedies/index.css +++ b/tauri-app/src/pages/Remedies/index.css @@ -33,7 +33,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 9; + z-index: 8; } .close-add-records-btn { @@ -48,7 +48,7 @@ align-items: center; border-radius: 50%; cursor: pointer; - z-index: 9; + z-index: 8; transform: rotate(45deg); transition: 0.3s; } diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index e6fdc4c..c4ca609 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -6,7 +6,7 @@ import RemedyCard from "../../components/RemedyCard/"; import AddRemedyComponent from "../../components/AddRemedyComponent/"; import Remedy from "../remedy"; //@ts-ignore -const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { +const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { const [remedies, setRemedies] = useState([ { name: "Lavendar Scalp Treament", @@ -14,7 +14,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", desc: "Lorem ipsum dolor sit amet, officia excepteur ex fugiat reprehenderit enim labore culpa sint ad nisi Lorem pariatur mollit ex esse exercitation amet. Nisi anim cupidatat excepteur officia. Reprehenderit nostrud nostrud ipsum Lorem est aliquip amet voluptate voluptate dolor minim nulla est proident. Nostrud officia pariatur ut officia. Sit irure elit esse ea nulla sunt ex occaecat reprehenderit commodo officia dolor Lorem duis laboris cupidatat officia voluptate. Culpa proident adipisicing id nulla nisi laboris ex in Lorem sunt duis officia eiusmod. Aliqua reprehenderit commodo ex non excepteur duis sunt velit enim. Voluptate laboris sint cupidatat ullamco ut ea consectetur et est culpa et culpa duis.", useUrl: "/pg.jpg", - rating: '1.5', + rating: "1.5", created_by: "draky", // steps: [ // { @@ -32,7 +32,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", useUrl: "/pg.jpg", - rating: '4', + rating: "4", created_by: "dave", }, { @@ -40,7 +40,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { description: "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat...", useUrl: "/pg.jpg", - rating: '3.5', + rating: "3.5", created_by: "nikki", }, ]); @@ -48,7 +48,7 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); const [activeRemedy, setActiveRemedy] = useState(null); - const url = ''; + const url = ""; // @ts-ignore const remedyClicked = (remedyDetail) => { setActiveRemedy(remedyDetail); @@ -113,22 +113,23 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { ); })} - {/* Remedy Created by user */} - {//@ts-ignore - docsWithImageUrls.map(({document, url}) => { - return ( - - ); - })} + { + //@ts-ignore + docsWithImageUrls.map(({ document, url }) => { + return ( + + ); + }) + }
      {isDetailRemedyActive && (
      @@ -162,21 +163,30 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => {
      Rate()} className="rd-container"> - {// @ts-ignore - activeRemedy.rating} + { + // @ts-ignore + activeRemedy.rating + }
      -

      {// @ts-ignore - activeRemedy.name}

      +

      + { + // @ts-ignore + activeRemedy.name + }{" "} +

      -

      { - // @ts-ignore - activeRemedy.description}

      +

      + { + // @ts-ignore + activeRemedy.description + } +

      @@ -185,11 +195,14 @@ const index = ({save, formFunc, form, remediesData, docsWithImageUrls}) => { {isAddRemedyActive && (
      - +
      )}
      From 261b68cb0667a279a189833e3757632ee4522611 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 22:57:53 +0530 Subject: [PATCH 060/124] fix text overflow in remedy Signed-off-by: coder12git --- tauri-app/src/components/RemedyCard/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 79e6422..32ae41e 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -16,8 +16,7 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, - url, + created_by, useUrl, // @ts-ignore rating, // @ts-ignore @@ -27,7 +26,7 @@ const index = ({
      -

      {description.substring(0, 150) + "..."}

      +

      {description.substring(0,50) + "..."}

      From ca7c7028fdc9edf220abc4f61c76177e91f3436e Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 23:14:02 +0530 Subject: [PATCH 061/124] Revert "fix text overflow in remedy" This reverts commit 261b68cb0667a279a189833e3757632ee4522611. --- tauri-app/src/components/RemedyCard/index.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 32ae41e..79e6422 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -16,7 +16,8 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, useUrl, + created_by, + url, // @ts-ignore rating, // @ts-ignore @@ -26,7 +27,7 @@ const index = ({
      -

      {description.substring(0,50) + "..."}

      +

      {description.substring(0, 150) + "..."}

      From d14636da7853f14601bdd49c075eaed236d7262d Mon Sep 17 00:00:00 2001 From: coder12git Date: Sat, 6 Jan 2024 23:18:59 +0530 Subject: [PATCH 062/124] changes Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 +- tauri-app/src/components/RemedyCard/index.tsx | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index ff8e222..de7a969 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -36,7 +36,7 @@ function App() { }, []); return ( - <>{true ? :
      Connecting...
      } + <>{web5 ? :
      Connecting...
      } ); } diff --git a/tauri-app/src/components/RemedyCard/index.tsx b/tauri-app/src/components/RemedyCard/index.tsx index 79e6422..21709a2 100644 --- a/tauri-app/src/components/RemedyCard/index.tsx +++ b/tauri-app/src/components/RemedyCard/index.tsx @@ -16,8 +16,7 @@ const index = ({ // @ts-ignore description, // @ts-ignore - created_by, - url, + created_by, useUrl, // @ts-ignore rating, // @ts-ignore @@ -27,7 +26,7 @@ const index = ({
      -

      {description.substring(0, 150) + "..."}

      +

      {description.substring(0, 50) + "..."}

      From 98d192bfcd014689aa635c968563cd74d19ac632 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sat, 6 Jan 2024 21:37:03 +0000 Subject: [PATCH 063/124] updated the protocol schema --- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/document.ts | 6 ++---- tauri-app/src/utils/protocols/index.ts | 4 ++-- tauri-app/src/utils/protocols/user.ts | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 89846ca..a634369 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.2" as const +export const url = "https://dschema.org/v0.0.5" as const diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index eddff20..c1b6883 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -29,8 +29,7 @@ const DocumentProtocol = { can: "read" }, { - who: "author", - of: "document", + who: "anyone", can: "write" } ] @@ -42,8 +41,7 @@ const DocumentProtocol = { can: "read" }, { - who: "author", - of: "blob", + who: "anyone", can: "write" } ] diff --git a/tauri-app/src/utils/protocols/index.ts b/tauri-app/src/utils/protocols/index.ts index ce802f2..1c0a671 100644 --- a/tauri-app/src/utils/protocols/index.ts +++ b/tauri-app/src/utils/protocols/index.ts @@ -4,6 +4,6 @@ import UserDetailsProtocol from "./user" export const protocols = [ DocumentProtocol, - UserDetailsProtocol - // ConditionsProtocol, + UserDetailsProtocol, + ConditionsProtocol, ] diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 7402ca6..227b09f 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -16,8 +16,7 @@ const UserDetailsProtocol = { details: { $actions: [ { - who: "author", - of: "details", + who: "anyone", can: "read" }, { From 300e87740a5cc44d3471ac4bf925aaf691bd6b2c Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sat, 6 Jan 2024 21:37:23 +0000 Subject: [PATCH 064/124] integrated auth --- tauri-app/package.json | 1 + tauri-app/src/App.tsx | 9 +- .../src/components/Auth/Profile/Guard.tsx | 10 +- tauri-app/src/components/Navbar/index.css | 5 + tauri-app/src/components/Navbar/index.tsx | 37 +++-- tauri-app/src/pages/Home/SignUpForm.tsx | 142 ++++++++++++++++++ tauri-app/src/pages/Home/index.tsx | 58 ++----- tauri-app/src/stores/profile.ts | 7 +- tauri-app/src/stores/pulseGlobalStore.ts | 10 +- tauri-app/src/stores/useWeb5Store.ts | 3 - 10 files changed, 211 insertions(+), 71 deletions(-) create mode 100644 tauri-app/src/pages/Home/SignUpForm.tsx diff --git a/tauri-app/package.json b/tauri-app/package.json index 39b4c47..ff5225a 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -29,6 +29,7 @@ "react-dropzone": "^14.2.3", "react-easy-crop": "^5.0.4", "react-hook-form": "^7.49.2", + "react-hot-toast": "^2.4.1", "react-pdf": "^7.6.0", "react-router-dom": "^6.21.1", "react-spinners": "^0.13.8", diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index de7a969..77b379a 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,6 +9,7 @@ import HomePage from "./pages/Home"; import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; +import { Toaster } from "react-hot-toast"; const router = createHashRouter([ { @@ -36,7 +37,13 @@ function App() { }, []); return ( - <>{web5 ? :
      Connecting...
      } + <> + <>{web5 ? :
      Connecting...
      } + + ); } diff --git a/tauri-app/src/components/Auth/Profile/Guard.tsx b/tauri-app/src/components/Auth/Profile/Guard.tsx index d36719a..b20e4e8 100644 --- a/tauri-app/src/components/Auth/Profile/Guard.tsx +++ b/tauri-app/src/components/Auth/Profile/Guard.tsx @@ -1,9 +1,15 @@ -import { PropsWithChildren, ReactNode } from "react"; +import { PropsWithChildren, ReactNode, useEffect } from "react"; import AuthGuard from "../Guard"; import { useProfile } from "@/stores/profile"; +import useWeb5Store from "@/stores/useWeb5Store"; const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { - const isSignedIn = useProfile(state => state.state.isSignedIn) + const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) + const { isSignedIn, signIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) + + useEffect(() => { + signIn(agent) + }, [signIn]) if (!isSignedIn) return <>{fallback} ?? null diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index 056aa0b..b433b8d 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -72,7 +72,12 @@ opacity: 1; } +.auth_container:focus { + outline: none; +} + .auth_container { + border: 0; display: flex; align-items: center; justify-content: center; diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 02fca70..73a729e 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -2,11 +2,24 @@ import ProfileGuard from "../Auth/Profile/Guard"; import "./index.css"; import { NavLink } from "react-router-dom"; import { usePulseGlobalStore } from "../../stores/pulseGlobalStore.ts"; +import useWeb5Store from "@/stores/useWeb5Store.ts"; +import { Agent } from "../Auth/types"; +import { useProfile } from "@/stores/profile.ts"; const index = () => { - const toggleIsAuthBtnClicked = usePulseGlobalStore( - (store) => store.toggleIsAuthBtnClicked, - ); + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5, did: state.did })); + const { signIn, setShowAuthModal, signOut } = useProfile(state => ({ + signIn: state.signIn, + signOut: state.signOut, + setShowAuthModal: state.setShowAuthModal + })) + + const beginAuthFlow = async (agent: Agent) => { + const signedIn = await signIn(agent) + if (!signedIn) + setShowAuthModal(true) + } + return (
      @@ -50,19 +63,23 @@ const index = () => {
      toggleIsAuthBtnClicked()} + onClick={() => web5 && did ? beginAuthFlow({ web5, did }) : null} >

      Join us!

      -
      + } > -
      -

      Profile

      - -
      +
      ); diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx new file mode 100644 index 0000000..ed71e4c --- /dev/null +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -0,0 +1,142 @@ +import "./index.css"; +import useWeb5Store from "@/stores/useWeb5Store"; +import { useProfile } from "@/stores/profile"; +import { Agent } from "@/components/Auth/types"; +import { FunctionComponent, useRef, useState } from "react"; +import { z } from "zod" +import { zodResolver } from "@hookform/resolvers/zod" +import { Controller, useForm } from "react-hook-form" +import { parse } from "path"; +import toast from "react-hot-toast"; + +const formSchema = z.object({ + firstName: z.string().min(1), + lastName: z.string().min(1), + description: z.string().min(1), + profilePicture: z.instanceof(File) +}) + +interface FileProp { + file: File | null | undefined; +} + +const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> = ({ onChange }) => { + const [file, setFile] = useState({ file: null }); + + return ( +
      +

      Profile Picture

      +
      + { + const file = e?.target?.files?.[0] + onChange(file ? file : null) + setFile({ file: e?.target?.files?.[0] }); + }} + type="file" + accept=".jpg,.png,.jpeg" + /> +
      + ); +}; + +export default function SignUpForm() { + const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); + const submitBtnRef = useRef(null); + const { setShowAuthModal, signUp, signIn } = useProfile( + (state) => ({ signUp: state.signUp, signIn: state.signIn, setShowAuthModal: state.setShowAuthModal }), + ); + // const [form, setForm] = useState({ + // firstName: "", + // lastName: "", + // description: "", + // profilePicture: new File([], ""), + // }) + + const form = useForm>({ + resolver: zodResolver(formSchema) + }) + + form.watch((value) => { + if (!submitBtnRef.current) return + + const isValid = formSchema.safeParse(value).success + + if (isValid) { + submitBtnRef.current.classList.remove("not-filled-btn") + submitBtnRef.current.classList.add("filled-btn") + submitBtnRef.current.disabled = false + } + else { + submitBtnRef.current.classList.add("not-filled-btn") + submitBtnRef.current.classList.remove("filled-btn") + submitBtnRef.current.disabled = true + } + }) + + type Payload = { + firstName: string + lastName: string + description: string + profilePicture: File + } + + const createProfile = async (agent: Agent, payload: Payload) => { + const hasSignedUpSuccessfully = await signUp(agent, payload) + + if (!hasSignedUpSuccessfully) { + toast.success('Sorry an error occurred!') + + return + } + + if (!await signIn()) return + + toast.success('Successfully signed up!') + + + setShowAuthModal(false) + } + + const onSubmit = (value: z.infer) => { + if (web5 && did) createProfile({ web5, did }, value) + } + + return ( +
      + + form.setValue("profilePicture", file as File)} + /> + + + + - - -
      -
      + {showAuthModal && ( + + + )} -
      +
      ); } diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index df439f2..4d45e9c 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -28,8 +28,12 @@ export const useProfile = create( state: { profile: null, isSignedIn: false - } as State + } as State, + showAuthModal: false }, (set, get) => ({ + setShowAuthModal: (showAuthModal: boolean) => { + set({ showAuthModal }) + }, signOut: () => { if (get().state.isSignedIn) { set({ @@ -45,7 +49,6 @@ export const useProfile = create( if (!profileRecord) return false const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() - console.log(profile) const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureUrl) let profilePictureUrl = "" diff --git a/tauri-app/src/stores/pulseGlobalStore.ts b/tauri-app/src/stores/pulseGlobalStore.ts index 069b0b7..9252348 100644 --- a/tauri-app/src/stores/pulseGlobalStore.ts +++ b/tauri-app/src/stores/pulseGlobalStore.ts @@ -1,13 +1,13 @@ import { create } from "zustand"; type PulseGlobalStore = { - isAuthBtnClicked: boolean; - toggleIsAuthBtnClicked: () => void; + showAuthModal: boolean; + toggleAuthModal: () => void; }; export const usePulseGlobalStore = create((set) => ({ - isAuthBtnClicked: true, - toggleIsAuthBtnClicked: () => { - set((state) => ({ isAuthBtnClicked: !state.isAuthBtnClicked })); + showAuthModal: true, + toggleAuthModal: () => { + set((state) => ({ showAuthModal: !state.showAuthModal })); }, })); diff --git a/tauri-app/src/stores/useWeb5Store.ts b/tauri-app/src/stores/useWeb5Store.ts index 37eff48..2451557 100644 --- a/tauri-app/src/stores/useWeb5Store.ts +++ b/tauri-app/src/stores/useWeb5Store.ts @@ -1,8 +1,5 @@ import { Web5 } from "@web5/api/browser"; import { create } from "zustand"; -import ConditionsProtocol from "@/utils/protocols/conditions"; -import DocumentProtocol from "@/utils/protocols/document"; -import UserDetailsProtocol from "@/utils/protocols/user"; import { protocols as AllProtocols } from "@/utils/protocols"; interface Web5State { From 82082514ffd36a2178b038b897855109e67ff200 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sat, 6 Jan 2024 21:37:32 +0000 Subject: [PATCH 065/124] added a SS script for testing --- server/script.ts | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 server/script.ts diff --git a/server/script.ts b/server/script.ts new file mode 100644 index 0000000..e58a7e5 --- /dev/null +++ b/server/script.ts @@ -0,0 +1,94 @@ +import { Web5 } from "@web5/api"; +import { protocols } from "@frontend/utils/protocols"; +import DocumentUtils from "@frontend/utils/document"; +import { Agent } from "@backend/utils"; + +async function configureProtocols(agent: Agent) { + console.log("=== CONFIGURE PROTOCOL ===") + + for (const protocol of protocols) { + const { protocols } = await agent.web5.dwn.protocols.query({ + message: { + filter: { + protocol: protocol.protocol, + } + } + }) + + if (protocols.length > 0) { + console.log("Protocol already exists:", protocol.protocol) + continue + } + + const { protocol: configuredProtocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ + message: { + definition: Object.assign({ ...protocol }), + } + }); + + if (!configuredProtocol) { + console.log("Failed to configure protocol:", localProtocolConfigurationStatus) + return + } + + console.log("Configured protocol on local DWN:", protocol.protocol) + const { status: remoteProtocolConfigurationStatus } = await configuredProtocol.send(agent.did) + + console.log("Sent protocol to remote DWN") + console.log(protocol.protocol, remoteProtocolConfigurationStatus) + } + + console.log("=== END CONFIGURE PROTOCOL ===") +} + +async function queryConditions(agent: Agent) { + console.log("=== QUERY CONDITIONS ===") + + const records = await DocumentUtils.fetchDocumentRecords(agent) + if (!records) { + console.log("No records found") + return + } + + if (records.length > 0) { + for (const record of records) { + // console.log("author:", record.author) + // console.log("recipient:", record.recipient) + // Bun.write("records/" + record.id + ".json", JSON.stringify(record)) + // console.log(record.author === record.target) + console.log(await record.data.json()) + } + } + + console.log("=== END QUERY CONDITIONS ===") +} + +async function createCondition(agent: Agent) { + console.log("=== CREATE CONDITION ===") + + const record = await DocumentUtils.createDocumentRecord(agent, { name: "test", condition: "command", file: new File([], "", { type: "image/png" }) }) + + if (!record) return false + + console.log("=== END CREATE CONDITION ===") +} + +async function connect() { + console.log("=== CONNECT ===") + const agent = await Web5.connect({ + sync: "5s", + }); + + console.log("=== END CONNECT ===") + + return agent +} +async function main() { + const agent = await connect() + await configureProtocols(agent) + await queryConditions(agent) + // await createCondition(agent) + // await queryConditions(agent) +} + +main() From b83bdda525cdc1c516e36303d964f4dc690197b2 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sat, 6 Jan 2024 23:01:21 +0100 Subject: [PATCH 066/124] chat still in dev moving to add minor feature --- tauri-app/src/components/Chat/index.css | 74 ++++++++++++++++++ tauri-app/src/components/Chat/index.tsx | 48 ++++++++++++ .../src/components/UserFriendList/index.css | 78 +++++++++++++++++++ .../src/components/UserFriendList/index.tsx | 61 +++++++++++++++ .../src/components/UserProfile/index.css | 2 +- tauri-app/src/index.css | 4 + tauri-app/src/pages/Chat/index.css | 15 +++- tauri-app/src/pages/Chat/index.tsx | 35 ++++++--- 8 files changed, 305 insertions(+), 12 deletions(-) create mode 100644 tauri-app/src/components/Chat/index.css create mode 100644 tauri-app/src/components/Chat/index.tsx create mode 100644 tauri-app/src/components/UserFriendList/index.css create mode 100644 tauri-app/src/components/UserFriendList/index.tsx diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css new file mode 100644 index 0000000..b2b6a6f --- /dev/null +++ b/tauri-app/src/components/Chat/index.css @@ -0,0 +1,74 @@ +.chat-component-container { + box-shadow: var(--box-shadow-black); + border-radius: 15px; + padding: 20px; + width: 100%; + height: 100%; + min-height: 500px; +} + +.chat-message-input-container { + width: 100%; + padding: 15px 0px; + display: flex; + justify-content: space-around; + align-items: center; +} + +.chat-message-input-container input { + width: 80%; + height: 30px; + padding: 8px 12px; + background: var(--color-slate-accent); + border: none; + border-radius: 25px; + outline: none; + font-family: "Roboto"; + font-size: 20px; + text-indent: 8px; +} + +.chat-message-input-container button { + width: 40px; + height: 40px; + border: none; + border-radius: 50%; + color: var(--color-white); + background: var(--color-blue); + box-shadow: var(--box-shadow-blue); + font-size: 20px; +} + +.chats-container { + width: 95%; + background: var(--color-light-grey); + height: 90%; + padding: 12px; + border-radius: 15px; + margin: 0 auto; +} + +.msg-container { + width: 100%; + margin: 25px 2px; +} + +.msg-f { + width: max-content; + background: var(--color-light-green); + font-family: "Roboto"; + padding: 4px 10px; + border-radius: 8px 8px 8px 0px; + margin-right: auto; + max-width: 300px; +} + +.msg-t { + width: max-content; + background: var(--color-light-blue); + font-family: "Roboto"; + padding: 4px 10px; + border-radius: 8px 8px 0px 8px; + margin-left: auto; + max-width: 300px; +} diff --git a/tauri-app/src/components/Chat/index.tsx b/tauri-app/src/components/Chat/index.tsx new file mode 100644 index 0000000..9492f36 --- /dev/null +++ b/tauri-app/src/components/Chat/index.tsx @@ -0,0 +1,48 @@ +import "./index.css"; +import React, { FC } from "react"; + +interface MessageProp { + message: string; + isLeft: boolean; +} + +const Message: FC = ({ message, isLeft }) => { + return ( +
      +
      +

      {message}

      +
      +
      + ); +}; + +const index: FC = () => { + return ( +
      +
      + + + + +
      +
      + + +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css new file mode 100644 index 0000000..dc82b4b --- /dev/null +++ b/tauri-app/src/components/UserFriendList/index.css @@ -0,0 +1,78 @@ +.friend-tag-container { + display: flex; + justify-content: space-between; + align-items: center; + margin: 12px 0; + border-radius: 8px; + transition: 0.3s; + padding: 8px; + transition: 0.3s; +} + +.friend-tag-container h1 { + font-size: 18px; + font-family: "Roboto"; +} + +.friend-tag-container img { + width: 40px; + height: 40px; + border-radius: 5px; +} + +.friends-list-container hr { + width: 60%; + margin: 0 auto; +} + +.friends-list-container hr:last-child { + display: none; +} + +.friend-tag-container:hover { + background: var(--color-slate-accent); +} + +.friends-list-container { + box-shadow: var(--box-shadow-black); + padding: 8px 14px; + border-radius: 15px; + margin-top: 30px; + width: 300px; +} + +.friends-list-header { + background: var(--color-blue); + padding: 4px 12px; + border-radius: 10px; + color: var(--color-white); + font-family: "Roboto"; + text-align: center; +} + +.friend-main-list-container { + overflow-y: scroll; + height: 300px; + margin: 15px 0; + padding: 5px; +} + +.friend-main-list-container::-webkit-scrollbar { + width: 6px; +} + +.friend-main-list-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.friend-main-list-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; +} + +.friends-list-header b { + font-family: "Pacifico"; +} diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx new file mode 100644 index 0000000..d76e959 --- /dev/null +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -0,0 +1,61 @@ +import "./index.css"; +import React, { FC, useState } from "react"; + +interface FriendTagProp { + friendProfileImg: string; + friendName: string; + isFriendOnline: boolean; +} + +const FriendTag: FC = ({ + friendProfileImg, + friendName, + isFriendOnline, +}) => { + return ( +
      + +

      {friendName.slice(0, 60) + "..."}

      + +
      + ); +}; + +interface UserFriendListProp { + friendList: FriendTagProp[]; +} + +const index: FC = ({ friendList }) => { + return ( +
      +
      +

      + Friends 45 +

      +
      +
      + {friendList.map((friend) => { + return ( + <> + +
      + + ); + })} +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css index 2c3dd37..b426bd5 100644 --- a/tauri-app/src/components/UserProfile/index.css +++ b/tauri-app/src/components/UserProfile/index.css @@ -1,6 +1,6 @@ .userprofile-container { box-shadow: var(--box-shadow-black); - width: 200px; + width: 300px; text-align: center; border-radius: 15px; padding: 8px 12px; diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index 0b0b566..5bfae8d 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -11,6 +11,10 @@ --color-black: #000; --color-slate: #e2e8f0; --color-orange: #f97316; + --color-light-green: #4ade80; + --color-light-blue: #7dd3fc; + --color-light-grey: #f8fafc; + --color-grey: #d1d5db; --padding-desktop: 40px 65px; --padding-mobile: 40px 25px; } diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index 322a4e5..d96fd05 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -1,8 +1,19 @@ .main-chat-container { padding: var(--padding-desktop); display: flex; - justify-content: center; - align-items: center; + justify-content: space-between; + align-items: flex-start; + position: relative; +} + +.utils-container { + width: 35%; +} + +.chat-container { + width: 60%; + height: 100%; + height: 40vh; } @media (max-width: 750px) { diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 89b5b1f..560826e 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,18 +1,35 @@ import "./index.css"; import UserProfile from "../../components/UserProfile/"; +import UserFriendList from "../../components/UserFriendList/"; +import Chat from "../../components/Chat/"; + +import { useState } from "react"; const index = () => { + const [friends, setFriends] = useState([ + { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false }, + { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false }, + { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true }, + { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false }, + ]); + return (
      - +
      + + +
      +
      + +
      ); }; From c086371345a5b41cd9b21d13ffc0bf6ec81c4e6d Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 00:03:36 +0000 Subject: [PATCH 067/124] made the schema to match the site --- tauri-app/src/pages/Home/SignUpForm.tsx | 9 +- tauri-app/src/pages/Records/index.tsx | 79 ++++++++++++++-- tauri-app/src/pages/connect.tsx | 2 +- tauri-app/src/pages/medic.tsx | 2 +- tauri-app/src/stores/profile.ts | 19 ++-- tauri-app/src/utils/document.ts | 105 ++++++++++++++++++---- tauri-app/src/utils/protocols/document.ts | 21 +++-- 7 files changed, 187 insertions(+), 50 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index ed71e4c..0a1f2fd 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -5,8 +5,7 @@ import { Agent } from "@/components/Auth/types"; import { FunctionComponent, useRef, useState } from "react"; import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" -import { Controller, useForm } from "react-hook-form" -import { parse } from "path"; +import { useForm } from "react-hook-form" import toast from "react-hot-toast"; const formSchema = z.object({ @@ -46,12 +45,6 @@ export default function SignUpForm() { const { setShowAuthModal, signUp, signIn } = useProfile( (state) => ({ signUp: state.signUp, signIn: state.signIn, setShowAuthModal: state.setShowAuthModal }), ); - // const [form, setForm] = useState({ - // firstName: "", - // lastName: "", - // description: "", - // profilePicture: new File([], ""), - // }) const form = useForm>({ resolver: zodResolver(formSchema) diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index d95d177..54ef08d 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -1,23 +1,75 @@ import "./index.css"; -import { useState } from "react"; +import { useEffect, useState } from "react"; +import { Record as DocumentRecord } from "@/utils/protocols/document"; import AddCardComponent from "../../components/AddCardComponent"; import DetailCardComponent from "../../components/DetailCardComponent"; import Card from "../../components/Card"; +import { Agent } from "@/components/Auth/types"; +import DocumentUtils from "@/utils/document"; +import { ProfileState, useProfile } from "@/stores/profile"; +import useWeb5Store from "@/stores/useWeb5Store"; + +const fetchRecords = async (agent: Agent, profile: ProfileState) => { + const records = await DocumentUtils.fetchDocumentRecords(agent) + if (!records) return false + + const profileRecords = [] + for (const record of records) { + const data: DocumentRecord.Document = await record.data.json() + const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) + if (!fileRecord) continue + const fileData = await fileRecord.data.blob() + + const otherFiles = await Promise.all(data.otherFiles.map(async file => { + const record = await DocumentUtils.fetchBlobRecord(agent, file.id) + if (!record) return false + + const data = await record.data.blob() + return { + name: file.name, + type: file.type, + url: URL.createObjectURL( + new File([data], file.name, { type: file.type }) + ) + } + })) + + if (data.profileId === profile.id) { + profileRecords.push({ + title: data.title, + description: data.description, + dateCreated: data.dateCreated, + file: { + name: data.file.name, + type: data.file.type, + url: URL.createObjectURL( + new File([fileData], data.file.name, { type: data.file.type }) + ) + }, + otherFiles + }) + } + } + return profileRecords +} const index = () => { + const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) + const profile = useProfile(state => state.state.profile!) + const [cardsData, setCardsData] = useState([ { title: "Diabetes Docs", - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + description: "documentation of test ran for diagonese of diabtets slated for type dissertion", date: "1/2/24", file_extension: "pdf", file_name: "Diabetes_scan.pdf", }, { title: "Diabetes Docs", - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + description: "documentation of test ran for diagonese of diabtets slated for type dissertion", date: "1/2/24", file_extension: "pdf", file_name: "Diabetes_scan.pdf", @@ -28,7 +80,7 @@ const index = () => { }, { title: "Diabetes Docs", - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + description: "documentation of test ran for diagonese of diabtets slated for type dissertion", date: "1/2/24", file_extension: "docx", file_name: "Diabetes_test.docx", @@ -50,6 +102,17 @@ const index = () => { }, ]); + useEffect(() => { + (async () => { + const records = await fetchRecords(agent, profile) + console.log(records) + + if (!records) return + + return + })() + }, []) + const [isAddCardActive, setIsAddCardActive] = useState(false); const [isCardDetailActive, setIsCardDetailActive] = useState(false); const [activeCard, setActiveCard] = useState(null); @@ -75,7 +138,7 @@ const index = () => {
      - {cardsData.map((card) => { + {cardsData.length > 0 ? cardsData.map((card) => { return ( { // @ts-ignore title={card.title} date={card.date} - desc={card.desc} + desc={card.description} cardUtils={[card, isCardClicked]} /> ); - })} + }) :
      No Records Found
      }
      {(isAddCardActive || isCardDetailActive) && (
      { {isAddCardActive && } {isCardDetailActive && ( diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index 88c7fcc..7519602 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -74,7 +74,7 @@ function Connect() { {similarConditionDocuments.map((doc, index) => (
      - {doc.name} + {doc.title}
      {doc.condition} diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx index 17ad038..9ca1924 100644 --- a/tauri-app/src/pages/medic.tsx +++ b/tauri-app/src/pages/medic.tsx @@ -39,7 +39,7 @@ const Page: FunctionComponent = () => { if (!fileRecord) continue - const file = new File([await fileRecord.data.blob()], data.name, { type: data.encodingFormat }) + const file = new File([await fileRecord.data.blob()], data.title, { type: data.encodingFormat }) docsWithUrl.push({ record: docRecord, diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 4d45e9c..62d2eee 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -5,21 +5,23 @@ import { Agent } from "@/components/Auth/types"; import UserDetailsUtils from "@/utils/user"; import DocumentUtils from "@/utils/document"; +export type ProfileState = { + id: string + // username: string + firstName: string, + lastName: string, + profilePictureUrl: string +} + type State = { - profile: { - firstName: string, - lastName: string, - profilePictureUrl: string - }, + profile: ProfileState, isSignedIn: true } | { profile: null, isSignedIn: false } -type Payload = { - firstName: string, - lastName: string, +type Payload = Omit & { profilePicture: File } @@ -61,6 +63,7 @@ export const useProfile = create( state: { isSignedIn: true, profile: { + id: profileRecord.id, firstName: profile.firstName, lastName: profile.lastName, profilePictureUrl diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index 6e66835..ab8245d 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -73,18 +73,45 @@ async function fetchRecords(agent: Agent, filter: FullFilterObj< return records } -async function createDocumentRecord(agent: Agent, { name, file, condition }: { name: string | undefined, file: File, condition: string }) { +type CreatePayload = Omit & +{ + title?: string + file: File, + otherFiles: File[] +} + +async function createDocumentRecord(agent: Agent, payload: CreatePayload) { + const { file, otherFiles, ...restPayload } = payload + const blobRecord = await createBlobRecord(agent, file) if (!blobRecord) return false + const fileData = { + id: blobRecord.id, + size: file.size, + type: file.type, + name: file.name, + } + + const otherFilesData = [] + for (const file of otherFiles) { + const blobRecord = await createBlobRecord(agent, file) + if (!blobRecord) return false + + otherFilesData.push({ + id: blobRecord.id, + size: file.size, + type: file.type, + name: file.name, + }) + } + const record = await createRecord( agent, { - name: name ?? file.name, - encodingFormat: file.type, - size: file.size, - url: blobRecord.id, - condition, + ..._.merge({ title: file.name }, restPayload), + file: fileData, + otherFiles: otherFilesData, dateCreated: new Date().toISOString(), dateModified: new Date().toISOString() }, @@ -160,11 +187,13 @@ async function fetchBlobRecords(agent: Agent) { }) } -type UpdatePayload = Partial<{ - name: string - condition: string - file: File -}> +type UpdatePayload = Partial< + Omit & + { + file: File, + otherFiles: File[] + } +> async function updateDocumentRecord(agent: Agent, id: string, payload: UpdatePayload): Promise; async function updateDocumentRecord(agent: Agent, record: Web5Record, payload: UpdatePayload): Promise; @@ -184,18 +213,56 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor } const data: DocumentProtocolRecord.Document = await record.data.json() - const { file, ...restPayload } = payload + const { file, otherFiles, ...restPayload } = payload - let url = data.url + const fileData = data.file if (file) { - const blobRecord = await updateBlobRecord(agent, url, file) + const blobRecord = await updateBlobRecord(agent, data.file.id, file) if (!blobRecord) return false - url = blobRecord.id + fileData.id = blobRecord.id + fileData.name = file.name + fileData.size = file.size + fileData.type = file.type + } + + const otherFilesData = data.otherFiles + if (otherFiles) { + for (let i = 0; i < otherFiles.length; i++) { + const file = otherFiles[i] + const otherFile = otherFilesData[i] + + const blobRecord = await updateBlobRecord(agent, otherFile.id, file) + if (!blobRecord) return false + + otherFile.id = blobRecord.id + otherFile.name = file.name + otherFile.size = file.size + otherFile.type = file.type + } + + if (otherFiles.length < otherFilesData.length) { + otherFilesData.splice(otherFiles.length, otherFilesData.length - otherFiles.length) + } + else { + for (let i = otherFilesData.length; i < otherFiles.length; i++) { + const file = otherFiles[i] + + const blobRecord = await createBlobRecord(agent, file) + if (!blobRecord) return false + + otherFilesData.push({ + id: blobRecord.id, + name: file.name, + size: file.size, + type: file.type, + }) + } + } } const { status } = await record.update({ - data: _.merge(data, Object.assign(restPayload, { url })) + data: _.merge(data, Object.assign(restPayload, { file: fileData, otherFiles: otherFilesData })) }) if (status.code !== 202) { @@ -252,9 +319,13 @@ async function deleteDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor const document: DocumentProtocolRecord.Document = await record.data.json() - const hasDeletedBlobRecord = await deleteBlobRecord(agent, document.url) + const hasDeletedBlobRecord = await deleteBlobRecord(agent, document.file.id) if (!hasDeletedBlobRecord) return false + for (const otherFile of document.otherFiles) { + await deleteBlobRecord(agent, otherFile.id) + } + const { status } = await agent.web5.dwn.records.delete({ message: { recordId: record.id diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index c1b6883..a248fe6 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -50,17 +50,24 @@ const DocumentProtocol = { } as const export namespace Record { + type FileMeta = { + id: string + size: number + type: string + name: string + } + export type File = Blob export type Document = { - name: string - encodingFormat: string - size: number - url: string - // profileUrl: string + title: string + file: FileMeta, + description?: string + otherFiles: FileMeta[], + profileId: string condition: string - dateCreated?: string - dateModified?: string + dateCreated: string + dateModified: string }; } From 7ff667f1ac59ca339a8df674a7df33e0771b9f3f Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:12:14 +0000 Subject: [PATCH 068/124] integrated the record feature --- tauri-app/src/App.tsx | 3 +- .../src/components/AddCardComponent/index.css | 21 +++ .../src/components/AddCardComponent/index.tsx | 157 ++++++++++++---- .../components/DetailCardComponent/index.tsx | 67 ++++--- tauri-app/src/pages/Home/SignUpForm.tsx | 5 +- tauri-app/src/pages/Records/index.tsx | 167 +++++++----------- tauri-app/src/pages/Records/utils.tsx | 54 ++++++ tauri-app/src/utils/protocols/document.ts | 2 +- 8 files changed, 306 insertions(+), 170 deletions(-) create mode 100644 tauri-app/src/pages/Records/utils.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 77b379a..be69d99 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -10,6 +10,7 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; +import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -17,7 +18,7 @@ const router = createHashRouter([ element: , children: [ { path: "/", element: }, - { path: "/records", element: }, + { path: "/records", element: }, { path: "/connect", element: }, { path: "/remedies", element: }, { path: "/medic", element: }, diff --git a/tauri-app/src/components/AddCardComponent/index.css b/tauri-app/src/components/AddCardComponent/index.css index e82047b..a644737 100644 --- a/tauri-app/src/components/AddCardComponent/index.css +++ b/tauri-app/src/components/AddCardComponent/index.css @@ -56,6 +56,20 @@ margin-right: 40%; } +.input-form select { + width: 60%; + border: none; + background: var(--color-slate); + padding: 10px 2px; + border-radius: 8px; + font-family: "Roboto"; + text-indent: 10px; + outline: none; + margin-bottom: 10px; + margin-right: 40%; +} + + .input-form textarea { width: 100%; border: none; @@ -66,6 +80,7 @@ text-indent: 10px; outline: none; min-height: 80px; + margin-bottom: 10px; } .input-form button { @@ -203,6 +218,12 @@ margin-right: 0; } + .input-form select { + width: 100%; + margin-right: 0; + } + + .input-form input[type="file"] { padding: 10px 0; } diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index 9e324bd..a30753f 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -1,56 +1,153 @@ import "./index.css"; -import React, { useState } from "react"; +import React, { FunctionComponent, useState } from "react"; +import { z } from "zod" +import { zodResolver } from "@hookform/resolvers/zod" +import { useForm } from "react-hook-form" +import toast from "react-hot-toast"; +import DocumentUtils from "@/utils/document"; +import { Agent } from "../Auth/types"; +import { ProfileState } from "@/stores/profile"; + +const possibleConditions = [ + "Cancer", + "Diabetes", + "Heart Disease", + "High Blood Pressure", + "High Cholesterol", + "Mental Illness", +] interface FileProp { file: File | null | undefined; } -const FileUploader = () => { +const FileUploader: FunctionComponent<{ required?: boolean, onChange: (file: File | null) => void }> = ({ required, onChange }) => { const [file, setFile] = useState({ file: null }); return ( -
      +
      { + const file = e?.target?.files?.[0] + onChange(file ? file : null) setFile({ file: e?.target?.files?.[0] }); }} type="file" - accept=".jpg,.png,.jpeg,.docx,.pdf" + accept=".jpg,.png,.jpeg" />
      ); }; -const index = () => { - const [fileUploaders, setUploaderFile] = useState([ - , - ]); +// const FileUploader = () => { +// const [file, setFile] = useState({ file: null }); +// +// return ( +//
      +// { +// setFile({ file: e?.target?.files?.[0] }); +// }} +// type="file" +// accept=".jpg,.png,.jpeg,.docx,.pdf" +// /> +//
      +// ); +// }; + +const formSchema = z.object({ + title: z.string().optional(), + description: z.string().min(1), + condition: z.string().min(1), + file: z.instanceof(File), + otherFiles: z.array(z.instanceof(File)) +}) + +const index: FunctionComponent<{profile: ProfileState, agent: Agent, onClose: () => void}> = ({ profile, agent, onClose }) => { + const [numFileUploaders, setNumFileUploaders] = useState(0) + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + otherFiles: [] + } + }) + // console.log(form.formState.errors) + + const onSubmit = async (data: z.infer) => { + const payload = { + ...data, + profileId: profile.id + } + const createdRecord = await DocumentUtils.createDocumentRecord(agent, payload) + if (!createdRecord) { + toast.error('Sorry an error occurred!') + return + } + + toast.success('Successfully created record!') + + onClose() + } + return (

      Create New Record

      -
      - {fileUploaders.length > 2 &&

      Max file uploads reached

      } -
      2 ? "sadd-mu" : "add-mu"} - onClick={() => - fileUploaders.length > 2 - ? null - : setUploaderFile([...fileUploaders, ]) - } - > - + +
      + {numFileUploaders > 2 &&

      Max file uploads reached

      } +
      2 ? "sadd-mu" : "add-mu"} + onClick={() => + numFileUploaders > 2 + ? null + : setNumFileUploaders(numFileUploaders + 1) + } + > + +
      + {Array.from({ length: numFileUploaders }) + .map((_, index) => ( + { + const otherFiles = form.getValues("otherFiles") + otherFiles[index] = file as File + form.setValue("otherFiles", otherFiles) + }} /> + ))} + + - -

      - *ensure inputted information are correct as once saved it cannot be - deleted/edited -

      -
      +
      ); }; diff --git a/tauri-app/src/components/DetailCardComponent/index.tsx b/tauri-app/src/components/DetailCardComponent/index.tsx index 9ae854b..b22aedb 100644 --- a/tauri-app/src/components/DetailCardComponent/index.tsx +++ b/tauri-app/src/components/DetailCardComponent/index.tsx @@ -1,25 +1,27 @@ import "./index.css"; import React, { FC, useState } from "react"; +import { CardData } from "@/pages/Records/utils"; -interface OtherFileProp { - title: String; - file_extension: string; - file_name: string; +// interface OtherFileProp { +// title: String; +// file_extension: string; +// file_name: string; +// +// file_url: string; +// } - file_url: string; -} - -interface CardDataProps { - file_name: String; - file_extension: string; - title: String; - desc: String; - date: String; - other_files: OtherFileProp[]; -} +// interface CardDataProps { +// file_name: String; +// file_extension: string; +// title: String; +// desc: String; +// date: String; +// other_files: OtherFileProp[]; +// } interface CardProp { - cardData: CardDataProps; + // cardData: CardDataProps; + cardData: CardData close: (isCardDetailActive: boolean) => void; } @@ -33,40 +35,37 @@ const index: FC = ({ cardData, close }) => { return (
      close(false)}> - +
      -

      {cardData.title ? cardData.title : cardData.file_name}

      - {supportedIMGExtensions.includes(cardData.file_extension) && ( +

      {cardData.title ? cardData.title : cardData.file.name}

      + {supportedIMGExtensions.includes(cardData.file.type.split("/")[1]) && (
      - + {cardData.file.name}
      )} -

      {cardData.desc}

      +

      {cardData.description}

      - {cardData.other_files && - cardData.other_files.map((file) => { + {cardData.otherFiles.map((file) => { + const fileExtension = file.type.split("/")[1] return (
      - {file.file_extension == "pdf" && ( + {fileExtension === "pdf" && ( + className="fa-solid fa-file-pdf" /> )} - {file.file_extension == "docx" && ( + {fileExtension === "docx" && ( + className="fas fa-file-word" /> )} - {supportedIMGExtensions.includes(file.file_extension) && ( + {supportedIMGExtensions.includes(fileExtension) && ( + style={{ color: "var(--color-blue)" }} /> )} - -

      {file.file_name}

      +
      +

      {file.name}

      ); diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 0a1f2fd..2dfb6f6 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -78,12 +78,11 @@ export default function SignUpForm() { const hasSignedUpSuccessfully = await signUp(agent, payload) if (!hasSignedUpSuccessfully) { - toast.success('Sorry an error occurred!') - + toast.error('Sorry an error occurred!') return } - if (!await signIn()) return + if (!await signIn(agent)) return toast.success('Successfully signed up!') diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 54ef08d..46983e9 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -1,117 +1,76 @@ import "./index.css"; import { useEffect, useState } from "react"; -import { Record as DocumentRecord } from "@/utils/protocols/document"; +import { format } from "date-fns"; import AddCardComponent from "../../components/AddCardComponent"; import DetailCardComponent from "../../components/DetailCardComponent"; import Card from "../../components/Card"; -import { Agent } from "@/components/Auth/types"; -import DocumentUtils from "@/utils/document"; -import { ProfileState, useProfile } from "@/stores/profile"; +import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; - -const fetchRecords = async (agent: Agent, profile: ProfileState) => { - const records = await DocumentUtils.fetchDocumentRecords(agent) - if (!records) return false - - const profileRecords = [] - for (const record of records) { - const data: DocumentRecord.Document = await record.data.json() - const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) - if (!fileRecord) continue - const fileData = await fileRecord.data.blob() - - const otherFiles = await Promise.all(data.otherFiles.map(async file => { - const record = await DocumentUtils.fetchBlobRecord(agent, file.id) - if (!record) return false - - const data = await record.data.blob() - return { - name: file.name, - type: file.type, - url: URL.createObjectURL( - new File([data], file.name, { type: file.type }) - ) - } - })) - - if (data.profileId === profile.id) { - profileRecords.push({ - title: data.title, - description: data.description, - dateCreated: data.dateCreated, - file: { - name: data.file.name, - type: data.file.type, - url: URL.createObjectURL( - new File([fileData], data.file.name, { type: data.file.type }) - ) - }, - otherFiles - }) - } - } - return profileRecords -} +import { fetchRecords } from "./utils"; const index = () => { const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) const profile = useProfile(state => state.state.profile!) - const [cardsData, setCardsData] = useState([ - { - title: "Diabetes Docs", - description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "pdf", - file_name: "Diabetes_scan.pdf", - }, - { - title: "Diabetes Docs", - description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "pdf", - file_name: "Diabetes_scan.pdf", - other_files: [ - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - ], - }, - { - title: "Diabetes Docs", - description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "docx", - file_name: "Diabetes_test.docx", - other_files: [ - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - ], - }, - { - desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", - date: "1/2/24", - file_extension: "jpg", - file_name: "D_IMG1103.jpg", - file_1_url: "../../../public/pic.jpg", - other_files: [ - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - ], - }, + const [cardsData, setCardsData] = useState([ + // { + // title: "Diabetes Docs", + // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "pdf", + // file_name: "Diabetes_scan.pdf", + // }, + // { + // title: "Diabetes Docs", + // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "pdf", + // file_name: "Diabetes_scan.pdf", + // other_files: [ + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // ], + // }, + // { + // title: "Diabetes Docs", + // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "docx", + // file_name: "Diabetes_test.docx", + // other_files: [ + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // ], + // }, + // { + // desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", + // date: "1/2/24", + // file_extension: "jpg", + // file_name: "D_IMG1103.jpg", + // file_1_url: "../../../public/pic.jpg", + // other_files: [ + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, + // ], + // }, ]); useEffect(() => { - (async () => { - const records = await fetchRecords(agent, profile) - console.log(records) + refetchRecords() + }, []) - if (!records) return + const refetchRecords = async () => { + const records = await fetchRecords(agent, profile) + console.log('records:', records) - return - })() - }, []) + if (!records) return + + setCardsData(records) + + return + } const [isAddCardActive, setIsAddCardActive] = useState(false); const [isCardDetailActive, setIsCardDetailActive] = useState(false); @@ -141,11 +100,10 @@ const index = () => { {cardsData.length > 0 ? cardsData.map((card) => { return ( @@ -158,7 +116,14 @@ const index = () => { style={{ zIndex: `${isCardDetailActive ? "7" : "6"}` }} >
      - {isAddCardActive && } + {isAddCardActive && { + setIsAddCardActive(false) + refetchRecords() + }} /> + } {isCardDetailActive && ( { + const records = await DocumentUtils.fetchDocumentRecords(agent) + if (!records) return false + + const profileRecords = [] + for (const record of records) { + const data: DocumentRecord.Document = await record.data.json() + const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) + if (!fileRecord) continue + const fileData = await fileRecord.data.blob() + + const otherFilesProcessing = await Promise.all(data.otherFiles.map(async file => { + const record = await DocumentUtils.fetchBlobRecord(agent, file.id) + if (!record) return false + + const data = await record.data.blob() + return { + name: file.name, + type: file.type, + url: URL.createObjectURL( + new File([data], file.name, { type: file.type }) + ) + } + })) + + if (otherFilesProcessing.includes(false)) continue + + const otherFiles = otherFilesProcessing as Exclude[] + + if (data.profileId === profile.id) { + profileRecords.push({ + title: data.title, + description: data.description, + dateCreated: data.dateCreated, + file: { + name: data.file.name, + type: data.file.type, + url: URL.createObjectURL( + new File([fileData], data.file.name, { type: data.file.type }) + ) + }, + otherFiles + }) + } + } + return profileRecords +} + +export type CardData = Exclude>, false>[0] diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index a248fe6..33838c2 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -62,7 +62,7 @@ export namespace Record { export type Document = { title: string file: FileMeta, - description?: string + description: string otherFiles: FileMeta[], profileId: string condition: string From 8ffc12ce623bc94279782c61a20f35097a9eb784 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:13:03 +0000 Subject: [PATCH 069/124] added date fns --- tauri-app/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tauri-app/package.json b/tauri-app/package.json index ff5225a..9c9b086 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -21,6 +21,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "date-fns": "^3.1.0", "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", From 3c38834dc41b0d1d166e6a806511c120eb032aa3 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:22:44 +0000 Subject: [PATCH 070/124] removed medic page --- tauri-app/src/App.tsx | 2 - tauri-app/src/pages/Records/index.tsx | 4 +- tauri-app/src/pages/medic.tsx | 134 -------------------------- 3 files changed, 2 insertions(+), 138 deletions(-) delete mode 100644 tauri-app/src/pages/medic.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index be69d99..d609656 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -3,7 +3,6 @@ import useWeb5Store from "./stores/useWeb5Store"; import { useEffect } from "react"; import Connect from "./pages/connect"; import Remedy from "./pages/remedy"; -import MedicPage from "./pages/medic"; import Doctors from "./pages/nearbyDoctor"; import HomePage from "./pages/Home"; import SharedLayout from "./pages/SharedLayout/"; @@ -21,7 +20,6 @@ const router = createHashRouter([ { path: "/records", element: }, { path: "/connect", element: }, { path: "/remedies", element: }, - { path: "/medic", element: }, { path: "/contact", element: }, { path: "/chat", element: }, ], diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 46983e9..7c0d7e8 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -8,7 +8,7 @@ import DetailCardComponent from "../../components/DetailCardComponent"; import Card from "../../components/Card"; import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; -import { fetchRecords } from "./utils"; +import { CardData, fetchRecords } from "./utils"; const index = () => { const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) @@ -93,7 +93,7 @@ const index = () => { } onClick={() => setIsAddCardActive(!isAddCardActive)} > - +
      diff --git a/tauri-app/src/pages/medic.tsx b/tauri-app/src/pages/medic.tsx deleted file mode 100644 index 9ca1924..0000000 --- a/tauri-app/src/pages/medic.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { FunctionComponent, useEffect, useState } from "react"; -import useWeb5Store from "@/stores/useWeb5Store"; -import DocumentUtils from "@/utils/document"; -import { Record as DocumentRecord } from "@/utils/protocols/document"; -import { Record as Web5Record } from "@web5/api/browser"; -import AuthGuard from "@/components/Auth/Guard"; - -const possibleConditions = [ - "Cancer", - "Diabetes", - "Heart Disease", - "High Blood Pressure", - "High Cholesterol", - "Mental Illness", -] - -const Page: FunctionComponent = () => { - const agent = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })) - const [documentsWithUrl, setDocumentsWithUrl] = useState<{ document: DocumentRecord.Document, fileUrl: string, record: Web5Record }[]>([]) - const [form, setForm] = useState({ - name: "", - file: new File([], ""), - condition: possibleConditions[0] - }) - - useEffect(() => { - (async () => { - const docRecords = await DocumentUtils.fetchDocumentRecords(agent) - if (!docRecords) { - console.log("Failed to fetch document records") - return - } - - const docsWithUrl = [] - for (const docRecord of docRecords) { - const data: DocumentRecord.Document = await docRecord.data.json() - const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.url) - - if (!fileRecord) - continue - - const file = new File([await fileRecord.data.blob()], data.title, { type: data.encodingFormat }) - - docsWithUrl.push({ - record: docRecord, - document: data, - fileUrl: URL.createObjectURL(file), - }) - } - - setDocumentsWithUrl(docsWithUrl) - })() - }, []) - - const saveMedicalRecord = async () => { - const res = await DocumentUtils.createDocumentRecord(agent, form) - - if (res) { - alert(`Medical record saved: ${res}`) - } - else { - alert("Failed to save record") - } - } - - return ( -
      -
      { - e.preventDefault() - saveMedicalRecord() - }}> -
      - setForm({ ...form, name: e.target.value })} - placeholder="Name" /> -
      -
      - { - const fileList = e.target.files - if (!fileList) return - - const file = fileList[0] - if (!file) return - - setForm({ - ...form, - file: file - }) - }} - placeholder="Document" /> -
      -
      - -
      - -
      -
      - {documentsWithUrl.map(({ record, document, fileUrl: url }) => ( -
      - -
      - ))} -
      -
      - ) -} - -const MedicPage: FunctionComponent = () => { - return ( - - - - ) -} - -export default MedicPage From 1af754135a87dc8eeca6be6be34c411c68db1ac9 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:22:49 +0000 Subject: [PATCH 071/124] updated dev deps --- tauri-app/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tauri-app/package.json b/tauri-app/package.json index 9c9b086..63472a0 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -48,6 +48,7 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@types/react-window": "^1.8.8", + "@types/readable-stream": "^4.0.10", "@vitejs/plugin-react": "^4.0.3", "autoprefixer": "^10.4.16", "postcss": "^8.4.32", From ccb8c54c2378a0c5f5191e5176802bda9af6df14 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:22:53 +0000 Subject: [PATCH 072/124] updated tsconfig --- tauri-app/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tauri-app/tsconfig.json b/tauri-app/tsconfig.json index 36ff4af..0a1cb27 100644 --- a/tauri-app/tsconfig.json +++ b/tauri-app/tsconfig.json @@ -5,6 +5,7 @@ "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, + "esModuleInterop": true, /* Bundler mode */ "moduleResolution": "bundler", From ac3ef61814695982b31c50db515be16c3c7739df Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:23:16 +0000 Subject: [PATCH 073/124] remved comments --- tauri-app/src/pages/Records/index.tsx | 43 +-------------------------- 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 7c0d7e8..6a3c4ef 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -14,48 +14,7 @@ const index = () => { const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) const profile = useProfile(state => state.state.profile!) - const [cardsData, setCardsData] = useState([ - // { - // title: "Diabetes Docs", - // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "pdf", - // file_name: "Diabetes_scan.pdf", - // }, - // { - // title: "Diabetes Docs", - // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "pdf", - // file_name: "Diabetes_scan.pdf", - // other_files: [ - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // ], - // }, - // { - // title: "Diabetes Docs", - // description: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "docx", - // file_name: "Diabetes_test.docx", - // other_files: [ - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // ], - // }, - // { - // desc: "documentation of test ran for diagonese of diabtets slated for type dissertion", - // date: "1/2/24", - // file_extension: "jpg", - // file_name: "D_IMG1103.jpg", - // file_1_url: "../../../public/pic.jpg", - // other_files: [ - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // { file_name: "cat scan", file_extension: "pdf", file_url: "some url" }, - // ], - // }, - ]); + const [cardsData, setCardsData] = useState([]); useEffect(() => { refetchRecords() From 7863d645dc273651d1e3b04fe12b21e6e955defc Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 01:26:33 +0000 Subject: [PATCH 074/124] fixed some type issues --- tauri-app/src/stores/profile.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 62d2eee..f916d86 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -21,7 +21,7 @@ type State = { isSignedIn: false } -type Payload = Omit & { +type Payload = Omit & { profilePicture: File } From 618aa1e5100f6a988f0d407fe5c5be798b9b843b Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 07:28:55 +0000 Subject: [PATCH 075/124] updated the protocol version --- tauri-app/src/utils/user.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 6d04b12..10dec36 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -93,7 +93,7 @@ async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { agent, { ...restPayload, - profilePictureUrl: blobRecord.id, + profilePictureId: blobRecord.id, dateCreated: new Date().toISOString() }, { @@ -153,7 +153,7 @@ async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Re const data: UserDetailsProtocolRecord.Details = await record.data.json() const { profilePicture, ...restPayload } = payload - let url = data.profilePictureUrl + let url = data.profilePictureId if (profilePicture) { const blobRecord = await DocumentUtils.updateBlobRecord(agent, url, profilePicture) if (!blobRecord) return false @@ -179,7 +179,7 @@ async function deleteUserDetailsRecord(agent: Agent) { const profile: UserDetailsProtocolRecord.Details = await record.data.json() - const hasDeletedProfilePictureRecord = await DocumentUtils.deleteBlobRecord(agent, profile.profilePictureUrl) + const hasDeletedProfilePictureRecord = await DocumentUtils.deleteBlobRecord(agent, profile.profilePictureId) if (!hasDeletedProfilePictureRecord) return false const { status } = await agent.web5.dwn.records.delete({ From b29f11b4d8a32c412bfb8e7261142c5bca2ae180 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 07:29:08 +0000 Subject: [PATCH 076/124] updated the protocol version --- tauri-app/src/utils/protocols/defns.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index a634369..7af44e2 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.5" as const +export const url = "https://dschema.org/v0.0.6" as const From b600b3f78dd36adf3b3b1e6509ad3076a08465d1 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 08:18:53 +0000 Subject: [PATCH 077/124] fixed bug --- tauri-app/src/App.tsx | 10 ++++++++-- tauri-app/src/components/Navbar/index.tsx | 11 ++++++----- tauri-app/src/pages/Home/SignUpForm.tsx | 13 ++++--------- tauri-app/src/pages/Home/index.tsx | 1 + tauri-app/src/pages/Records/utils.tsx | 2 ++ tauri-app/src/stores/profile.ts | 6 +++--- tauri-app/src/stores/pulseGlobalStore.ts | 13 ------------- tauri-app/src/utils/user.ts | 22 ++++++++++------------ 8 files changed, 34 insertions(+), 44 deletions(-) delete mode 100644 tauri-app/src/stores/pulseGlobalStore.ts diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index d609656..c88dc27 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -1,4 +1,4 @@ -import { RouterProvider, createHashRouter } from "react-router-dom"; +import { RouterProvider, createHashRouter, Navigate } from "react-router-dom"; import useWeb5Store from "./stores/useWeb5Store"; import { useEffect } from "react"; import Connect from "./pages/connect"; @@ -17,7 +17,13 @@ const router = createHashRouter([ element: , children: [ { path: "/", element: }, - { path: "/records", element: }, + { + path: "/records", element: ( + }> + + + ) + }, { path: "/connect", element: }, { path: "/remedies", element: }, { path: "/contact", element: }, diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 73a729e..5b48669 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -1,7 +1,6 @@ import ProfileGuard from "../Auth/Profile/Guard"; import "./index.css"; import { NavLink } from "react-router-dom"; -import { usePulseGlobalStore } from "../../stores/pulseGlobalStore.ts"; import useWeb5Store from "@/stores/useWeb5Store.ts"; import { Agent } from "../Auth/types"; import { useProfile } from "@/stores/profile.ts"; @@ -16,8 +15,10 @@ const index = () => { const beginAuthFlow = async (agent: Agent) => { const signedIn = await signIn(agent) - if (!signedIn) + if (!signedIn) { + console.log("displaying auth modal") setShowAuthModal(true) + } } return ( @@ -74,9 +75,9 @@ const index = () => { } > diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 2dfb6f6..68a1fe6 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -7,6 +7,7 @@ import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import toast from "react-hot-toast"; +import { CreatePayload } from "@/utils/user"; const formSchema = z.object({ firstName: z.string().min(1), @@ -40,6 +41,7 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> }; export default function SignUpForm() { + console.log("kfjle") const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile( @@ -67,14 +69,7 @@ export default function SignUpForm() { } }) - type Payload = { - firstName: string - lastName: string - description: string - profilePicture: File - } - - const createProfile = async (agent: Agent, payload: Payload) => { + const createProfile = async (agent: Agent, payload: CreatePayload) => { const hasSignedUpSuccessfully = await signUp(agent, payload) if (!hasSignedUpSuccessfully) { @@ -82,7 +77,7 @@ export default function SignUpForm() { return } - if (!await signIn(agent)) return + if (!await signIn(agent)) return toast.success('Successfully signed up!') diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 8ab5cf9..867031f 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -221,6 +221,7 @@ export default function HomePage() {
      {showAuthModal && ( + {console.log("fjekkfle") || null} )} diff --git a/tauri-app/src/pages/Records/utils.tsx b/tauri-app/src/pages/Records/utils.tsx index 6f36241..c1d36b6 100644 --- a/tauri-app/src/pages/Records/utils.tsx +++ b/tauri-app/src/pages/Records/utils.tsx @@ -32,6 +32,8 @@ export const fetchRecords = async (agent: Agent, profile: ProfileState) => { const otherFiles = otherFilesProcessing as Exclude[] + console.log(data.profileId) + console.log(data.profileId === profile.id) if (data.profileId === profile.id) { profileRecords.push({ title: data.title, diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index f916d86..bce5670 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -2,7 +2,7 @@ import { create } from "zustand" import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; -import UserDetailsUtils from "@/utils/user"; +import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import DocumentUtils from "@/utils/document"; export type ProfileState = { @@ -52,7 +52,7 @@ export const useProfile = create( const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() - const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureUrl) + const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) let profilePictureUrl = "" if (profilePicture) { const profilePictureBlob = await profilePicture.data.blob() @@ -73,7 +73,7 @@ export const useProfile = create( return true }, - signUp: async (agent: Agent, payload: Payload) => { + signUp: async (agent: Agent, payload: CreatePayload) => { const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) if (!profile) return false diff --git a/tauri-app/src/stores/pulseGlobalStore.ts b/tauri-app/src/stores/pulseGlobalStore.ts deleted file mode 100644 index 9252348..0000000 --- a/tauri-app/src/stores/pulseGlobalStore.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { create } from "zustand"; - -type PulseGlobalStore = { - showAuthModal: boolean; - toggleAuthModal: () => void; -}; - -export const usePulseGlobalStore = create((set) => ({ - showAuthModal: true, - toggleAuthModal: () => { - set((state) => ({ showAuthModal: !state.showAuthModal })); - }, -})); diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 10dec36..91db42d 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -51,9 +51,9 @@ async function createRecord(agent: Agent, data: UserDetailsProto return record } -async function fetchRecords(agent: Agent, filter: FullFilterObj) { +async function fetchRecords(agent: Agent, filter: FullFilterObj, from?: string) { const { records, status } = await agent.web5.dwn.records.query({ - from: UserDetailsProtocolDID, + from, message: { filter: { ...filter, @@ -71,12 +71,10 @@ async function fetchRecords(agent: Agent, filter: FullFilterObj< return records } -type CreatePayload = { - firstName: string - lastName: string - description: string +export type CreatePayload = Omit & { profilePicture: File, } + async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { const existingRecord = await fetchUserDetailsRecord(agent) if (existingRecord) { @@ -129,12 +127,12 @@ async function fetchUserDetailsRecords(agent: Agent) { }) } -type UpdatePayload = Partial<{ - firstName: string - lastName: string - description: string - profilePicture: File -}> +type UpdatePayload = Partial< + Omit & + { + profilePicture: File, + } +> async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Record, payload: Partial) { let record: Web5Record From a18ea86ebb4352a8ecbf375e7fbaa93b591ce536 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 08:19:42 +0000 Subject: [PATCH 078/124] updated protocol --- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 7af44e2..d2f24d1 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.6" as const +export const url = "https://dschema.org/v0.0.7" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 227b09f..95967af 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -32,7 +32,7 @@ export namespace Record { export type Details = { firstName: string lastName: string - profilePictureUrl: string + profilePictureId: string description: string dateCreated: string } From b37e2c6028964db7630317869d2ef59874474930 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sun, 7 Jan 2024 11:06:25 +0100 Subject: [PATCH 079/124] ahhhh finally found the right one for mobile about to start implementing it --- tauri-app/src/App.tsx | 9 ++--- .../src/components/Auth/Profile/Guard.tsx | 38 ++++++++++++------- tauri-app/src/components/Card/index.tsx | 2 +- tauri-app/src/components/Chat/index.css | 36 ++++++++++++++---- tauri-app/src/components/Chat/index.tsx | 12 ++++++ tauri-app/src/components/Navbar/index.tsx | 2 +- .../src/components/UserFriendList/index.css | 6 +-- .../src/components/UserFriendList/index.tsx | 6 +-- .../src/components/UserProfile/index.css | 5 ++- tauri-app/src/pages/Chat/index.css | 6 +-- 10 files changed, 82 insertions(+), 40 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 77b379a..54a6107 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -38,11 +38,10 @@ function App() { return ( <> - <>{web5 ? :
      Connecting...
      } - + <> + {web5 ? :
      Connecting...
      } + + ); } diff --git a/tauri-app/src/components/Auth/Profile/Guard.tsx b/tauri-app/src/components/Auth/Profile/Guard.tsx index b20e4e8..d74f652 100644 --- a/tauri-app/src/components/Auth/Profile/Guard.tsx +++ b/tauri-app/src/components/Auth/Profile/Guard.tsx @@ -3,22 +3,34 @@ import AuthGuard from "../Guard"; import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; -const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { - const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) - const { isSignedIn, signIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) +const Guard = ({ + children, + fallback, +}: PropsWithChildren & { fallback?: ReactNode }) => { + const agent = useWeb5Store((state) => ({ + web5: state.web5!, + did: state.did!, + })); + const { isSignedIn, signIn } = useProfile((state) => ({ + isSignedIn: state.state.isSignedIn, + signIn: state.signIn, + })); useEffect(() => { - signIn(agent) - }, [signIn]) + signIn(agent); + }, [signIn]); - if (!isSignedIn) - return <>{fallback} ?? null + if (!isSignedIn) return <>{fallback} ?? null; - return <>{children} -} + return <>{children}; +}; -export default function ProfileGuard(props: PropsWithChildren & { fallback?: ReactNode }) { - return - - +export default function ProfileGuard( + props: PropsWithChildren & { fallback?: ReactNode }, +) { + return ( + + + + ); } diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index d61c871..994dabd 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -48,7 +48,7 @@ const index: FC = ({

      {title ? title : file_name}

      -

      {desc}

      +

      {desc.slice(0, 150)}

      {date} diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index b2b6a6f..a5a6d6c 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -16,9 +16,8 @@ } .chat-message-input-container input { - width: 80%; - height: 30px; - padding: 8px 12px; + width: 85%; + padding: 12px 8px; background: var(--color-slate-accent); border: none; border-radius: 25px; @@ -37,15 +36,36 @@ background: var(--color-blue); box-shadow: var(--box-shadow-blue); font-size: 20px; + outline: none; } .chats-container { - width: 95%; + width: 98%; background: var(--color-light-grey); - height: 90%; + height: 85%; padding: 12px; - border-radius: 15px; + border-radius: 15px 5px 5px 15px; margin: 0 auto; + overflow-y: scroll; + overflow-x: hidden; + height: 600px; +} + +.chats-container::-webkit-scrollbar { + width: 6px; +} + +.chats-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 0 15px 15px 0; + transform: translateX(-4px); +} + +.chats-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; } .msg-container { @@ -60,7 +80,7 @@ padding: 4px 10px; border-radius: 8px 8px 8px 0px; margin-right: auto; - max-width: 300px; + max-width: 400px; } .msg-t { @@ -70,5 +90,5 @@ padding: 4px 10px; border-radius: 8px 8px 0px 8px; margin-left: auto; - max-width: 300px; + max-width: 400px; } diff --git a/tauri-app/src/components/Chat/index.tsx b/tauri-app/src/components/Chat/index.tsx index 9492f36..4bc8898 100644 --- a/tauri-app/src/components/Chat/index.tsx +++ b/tauri-app/src/components/Chat/index.tsx @@ -34,6 +34,18 @@ const index: FC = () => { } isLeft={true} /> + +
      diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 73a729e..8bbe621 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -68,7 +68,7 @@ const index = () => { className="auth_container" onClick={() => web5 && did ? beginAuthFlow({ web5, did }) : null} > -

      Join us!

      +

      Connect Wallet

      } diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css index dc82b4b..9082926 100644 --- a/tauri-app/src/components/UserFriendList/index.css +++ b/tauri-app/src/components/UserFriendList/index.css @@ -10,7 +10,7 @@ } .friend-tag-container h1 { - font-size: 18px; + font-size: 15px; font-family: "Roboto"; } @@ -38,12 +38,12 @@ padding: 8px 14px; border-radius: 15px; margin-top: 30px; - width: 300px; + width: 200px; } .friends-list-header { background: var(--color-blue); - padding: 4px 12px; + padding: 8px 12px; border-radius: 10px; color: var(--color-white); font-family: "Roboto"; diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index d76e959..38833b0 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -15,7 +15,7 @@ const FriendTag: FC = ({ return (
      -

      {friendName.slice(0, 60) + "..."}

      +

      {friendName.slice(0, 6) + "..."}

      { return (
      -

      - Friends 45 -

      +

      Friends

      {friendList.map((friend) => { diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css index b426bd5..084e0cd 100644 --- a/tauri-app/src/components/UserProfile/index.css +++ b/tauri-app/src/components/UserProfile/index.css @@ -1,10 +1,11 @@ .userprofile-container { box-shadow: var(--box-shadow-black); - width: 300px; + width: 200px; text-align: center; border-radius: 15px; - padding: 8px 12px; + padding: 8px 11px; position: relative; + padding-bottom: 12px; } .userprofile-info-container img { diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index d96fd05..4632a88 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -4,16 +4,16 @@ justify-content: space-between; align-items: flex-start; position: relative; + max-height: 100%; } .utils-container { - width: 35%; + width: 30%; } .chat-container { - width: 60%; + width: 70%; height: 100%; - height: 40vh; } @media (max-width: 750px) { From a4bd25e15182a81276f7905f193fc1863668811a Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 11:36:59 +0000 Subject: [PATCH 080/124] removed log --- tauri-app/src/pages/Home/SignUpForm.tsx | 1 - tauri-app/src/pages/Home/index.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 68a1fe6..f059f00 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -81,7 +81,6 @@ export default function SignUpForm() { toast.success('Successfully signed up!') - setShowAuthModal(false) } diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 867031f..8ab5cf9 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -221,7 +221,6 @@ export default function HomePage() {
      {showAuthModal && ( - {console.log("fjekkfle") || null} )} From d822ec116cab61011c499bfad2dd453036f6af08 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 11:37:16 +0000 Subject: [PATCH 081/124] return profile record after creating it --- tauri-app/src/stores/profile.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index bce5670..0592e03 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -55,7 +55,9 @@ export const useProfile = create( const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) let profilePictureUrl = "" if (profilePicture) { + console.log('fetching blob:', profilePicture.data) const profilePictureBlob = await profilePicture.data.blob() + console.log(profilePictureBlob) profilePictureUrl = URL.createObjectURL(profilePictureBlob) } @@ -77,7 +79,7 @@ export const useProfile = create( const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) if (!profile) return false - return true + return profile } })) ) From c44e436aa1c32b467ed362c96be27b64bb27d36e Mon Sep 17 00:00:00 2001 From: Suruchi Kumari Date: Sun, 7 Jan 2024 17:46:29 +0530 Subject: [PATCH 082/124] Update README.md --- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d3ea6a..5c39ce2 100644 --- a/README.md +++ b/README.md @@ -1 +1,59 @@ -# Web5-Hack \ No newline at end of file +# PulsePal 🌟 + +Safely store medical records with decentralized identifiers and web nodes, ensuring data security. Connect with similar conditions, share home remedies with a rating system, and access specialized doctors based on your location. PulsePal – where advanced technology meets user-friendly design for your secure, connected health journey. + +## What it does + +1. Secure Medical Record Storage: +- Users can securely store their medical records using decentralized identifiers (DIDs) in the app. +- Data stored through decentralized web nodes (DWNs) ensures security and user ownership. + +2. Connect with Similar Medical Conditions: +- An algorithm will match users based on their medical records, enabling them to chat and connect. +- Users can share experiences, insights, and support each other within the platform. + +3. Home Remedies Section: +- Users can contribute and share simple, effective home remedies. +- Remedies will be rated by users to gauge their usefulness. + +4. Recommend specialized doctors in your nearby areas, based on your current location + +## Setting up Local Development + +1. Clone the repository + +``` +git clone https://github.com/coder12git/Web5-Hack.git +``` + +2. Navigate to the project folder + +``` +cd Web5-Hack/tauri-app +``` + +3. Install dependencies + +``` +npm install +``` + +4. To start the server run + +``` +npm run dev +``` + +## What's next for Pulsepal + +1. Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." + +2. Natural Language Processing (NLP) Chatbot: "We aim to implement an NLP-powered chatbot that assists users in comprehending medical terminology, interpreting test results, and providing preliminary guidance in emergencies based on entered symptoms." + +3. AI-Driven Diagnostics: "Incorporating an AI system for preliminary diagnostics, we intend to analyze symptoms and user-entered data to provide suggestive measures or identify potential health issues, prompting users to seek professional medical advice." + +4. Augmented Reality (AR) for First Aid Guidance: "Our future plan involves integrating AR technology to guide users through basic first aid procedures by overlaying instructional visuals onto real-time surroundings." + +5. Health Gamification and Incentivization: "To encourage healthy habits, we plan to introduce gamification within PulsePal, utilizing AI to personalize challenges, rewards, and reminders aligned with individual health goals." + +6. Predictive Appointment Scheduling: "Utilizing AI algorithms, we aim to predict potential health concerns or follow-up appointments based on stored medical records, proactively suggesting relevant appointments or check-ups." From 128a22c1278b68d73c4d9de785ffe2c8b9e85eff Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:32:50 +0000 Subject: [PATCH 083/124] removed script --- server/script.ts | 94 ------------------------------------------------ 1 file changed, 94 deletions(-) delete mode 100644 server/script.ts diff --git a/server/script.ts b/server/script.ts deleted file mode 100644 index e58a7e5..0000000 --- a/server/script.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Web5 } from "@web5/api"; -import { protocols } from "@frontend/utils/protocols"; -import DocumentUtils from "@frontend/utils/document"; -import { Agent } from "@backend/utils"; - -async function configureProtocols(agent: Agent) { - console.log("=== CONFIGURE PROTOCOL ===") - - for (const protocol of protocols) { - const { protocols } = await agent.web5.dwn.protocols.query({ - message: { - filter: { - protocol: protocol.protocol, - } - } - }) - - if (protocols.length > 0) { - console.log("Protocol already exists:", protocol.protocol) - continue - } - - const { protocol: configuredProtocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ - message: { - definition: Object.assign({ ...protocol }), - } - }); - - if (!configuredProtocol) { - console.log("Failed to configure protocol:", localProtocolConfigurationStatus) - return - } - - console.log("Configured protocol on local DWN:", protocol.protocol) - const { status: remoteProtocolConfigurationStatus } = await configuredProtocol.send(agent.did) - - console.log("Sent protocol to remote DWN") - console.log(protocol.protocol, remoteProtocolConfigurationStatus) - } - - console.log("=== END CONFIGURE PROTOCOL ===") -} - -async function queryConditions(agent: Agent) { - console.log("=== QUERY CONDITIONS ===") - - const records = await DocumentUtils.fetchDocumentRecords(agent) - if (!records) { - console.log("No records found") - return - } - - if (records.length > 0) { - for (const record of records) { - // console.log("author:", record.author) - // console.log("recipient:", record.recipient) - // Bun.write("records/" + record.id + ".json", JSON.stringify(record)) - // console.log(record.author === record.target) - console.log(await record.data.json()) - } - } - - console.log("=== END QUERY CONDITIONS ===") -} - -async function createCondition(agent: Agent) { - console.log("=== CREATE CONDITION ===") - - const record = await DocumentUtils.createDocumentRecord(agent, { name: "test", condition: "command", file: new File([], "", { type: "image/png" }) }) - - if (!record) return false - - console.log("=== END CREATE CONDITION ===") -} - -async function connect() { - console.log("=== CONNECT ===") - const agent = await Web5.connect({ - sync: "5s", - }); - - console.log("=== END CONNECT ===") - - return agent -} -async function main() { - const agent = await connect() - await configureProtocols(agent) - await queryConditions(agent) - // await createCondition(agent) - // await queryConditions(agent) -} - -main() From 683c2b7bfa00c20d647c1f1cc431bdee4c672c0f Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:35:25 +0000 Subject: [PATCH 084/124] updated the protocol and record form --- .gitignore | 1 + tauri-app/src/components/Auth/Profile/Guard.tsx | 8 +------- tauri-app/src/components/Card/index.tsx | 2 +- tauri-app/src/pages/Home/SignUpForm.tsx | 1 - tauri-app/src/pages/Records/utils.tsx | 5 +++-- tauri-app/src/stores/profile.ts | 6 ++---- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 649ac14..a873b84 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ pnpm-lock.yaml *.tsbuildinfo +utils/ diff --git a/tauri-app/src/components/Auth/Profile/Guard.tsx b/tauri-app/src/components/Auth/Profile/Guard.tsx index b20e4e8..527f8bf 100644 --- a/tauri-app/src/components/Auth/Profile/Guard.tsx +++ b/tauri-app/src/components/Auth/Profile/Guard.tsx @@ -1,15 +1,9 @@ import { PropsWithChildren, ReactNode, useEffect } from "react"; import AuthGuard from "../Guard"; import { useProfile } from "@/stores/profile"; -import useWeb5Store from "@/stores/useWeb5Store"; const Guard = ({ children, fallback }: PropsWithChildren & { fallback?: ReactNode }) => { - const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) - const { isSignedIn, signIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) - - useEffect(() => { - signIn(agent) - }, [signIn]) + const { isSignedIn } = useProfile(state => ({ isSignedIn: state.state.isSignedIn, signIn: state.signIn })) if (!isSignedIn) return <>{fallback} ?? null diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index d61c871..4edfdac 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -48,7 +48,7 @@ const index: FC = ({

      {title ? title : file_name}

      -

      {desc}

      +

      {desc.substring(0, 50)}

      {date} diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index f059f00..b232969 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -41,7 +41,6 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> }; export default function SignUpForm() { - console.log("kfjle") const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile( diff --git a/tauri-app/src/pages/Records/utils.tsx b/tauri-app/src/pages/Records/utils.tsx index c1d36b6..852ceac 100644 --- a/tauri-app/src/pages/Records/utils.tsx +++ b/tauri-app/src/pages/Records/utils.tsx @@ -2,6 +2,7 @@ import { Agent } from "@/components/Auth/types" import { ProfileState } from "@/stores/profile" import { Record as DocumentRecord } from "@/utils/protocols/document"; import DocumentUtils from "@/utils/document" +import BlobUtils from "@/utils/blob"; export const fetchRecords = async (agent: Agent, profile: ProfileState) => { const records = await DocumentUtils.fetchDocumentRecords(agent) @@ -10,12 +11,12 @@ export const fetchRecords = async (agent: Agent, profile: ProfileState) => { const profileRecords = [] for (const record of records) { const data: DocumentRecord.Document = await record.data.json() - const fileRecord = await DocumentUtils.fetchBlobRecord(agent, data.file.id) + const fileRecord = await BlobUtils.fetchBlobRecord(agent, { recordId: data.file.id }) if (!fileRecord) continue const fileData = await fileRecord.data.blob() const otherFilesProcessing = await Promise.all(data.otherFiles.map(async file => { - const record = await DocumentUtils.fetchBlobRecord(agent, file.id) + const record = await BlobUtils.fetchBlobRecord(agent, { recordId: file.id }) if (!record) return false const data = await record.data.blob() diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 0592e03..69aa213 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -3,7 +3,7 @@ import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; -import DocumentUtils from "@/utils/document"; +import BlobUtils from "@/utils/blob"; export type ProfileState = { id: string @@ -52,12 +52,10 @@ export const useProfile = create( const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() - const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) + const profilePicture = await BlobUtils.fetchBlobRecord(agent, { recordId: profile.profilePictureId }) let profilePictureUrl = "" if (profilePicture) { - console.log('fetching blob:', profilePicture.data) const profilePictureBlob = await profilePicture.data.blob() - console.log(profilePictureBlob) profilePictureUrl = URL.createObjectURL(profilePictureBlob) } From ba64d6d679442ae0a457de901c4af8aec6474e8c Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:36:31 +0000 Subject: [PATCH 085/124] updated protocols --- tauri-app/src/utils/document.ts | 124 +++------------------- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/document.ts | 23 ---- tauri-app/src/utils/protocols/index.ts | 2 + tauri-app/src/utils/user.ts | 37 ++++--- 5 files changed, 41 insertions(+), 147 deletions(-) diff --git a/tauri-app/src/utils/document.ts b/tauri-app/src/utils/document.ts index ab8245d..47382b6 100644 --- a/tauri-app/src/utils/document.ts +++ b/tauri-app/src/utils/document.ts @@ -1,5 +1,6 @@ import { Web5, Record as Web5Record } from "@web5/api/browser" -import DocumentProtocol, { Record as DocumentProtocolRecord, did as DocumentProtocolDID } from "./protocols/document"; +import DocumentProtocol, { Record } from "./protocols/document"; +import BlobUtils from "./blob"; import _ from "lodash"; type Agent = { @@ -27,10 +28,7 @@ type FullMessageObj = { published: typeof DocumentProtocol["published"] } -async function createRecord(agent: Agent, data: DocumentProtocolRecord.Document, message: FullMessageObj<"document">): Promise; -async function createRecord(agent: Agent, data: DocumentProtocolRecord.File, message: FullMessageObj<"blob">): Promise; - -async function createRecord(agent: Agent, data: DocumentProtocolRecord.Document | DocumentProtocolRecord.File, message: FullMessageObj) { +async function createRecord(agent: Agent, data: Record.Document, message: FullMessageObj) { const { record, status } = await agent.web5.dwn.records.create({ data, message: Object.assign({ @@ -44,7 +42,8 @@ async function createRecord(agent: Agent, data: DocumentProtocol return false } - const { status: syncStatus } = await record.send(DocumentProtocolDID) + // const { status: syncStatus } = await record.send(DocumentProtocolDID) + const { status: syncStatus } = await record.send(agent.did) if (syncStatus.code !== 202) { console.log("Failed to sync record with remote DWN:", syncStatus) @@ -55,7 +54,7 @@ async function createRecord(agent: Agent, data: DocumentProtocol async function fetchRecords(agent: Agent, filter: FullFilterObj) { const { records, status } = await agent.web5.dwn.records.query({ - from: DocumentProtocolDID, + // from: DocumentProtocolDID, message: { filter: { ...filter, @@ -73,7 +72,7 @@ async function fetchRecords(agent: Agent, filter: FullFilterObj< return records } -type CreatePayload = Omit & +type CreatePayload = Omit & { title?: string file: File, @@ -83,7 +82,7 @@ type CreatePayload = Omit, - published: DocumentProtocol.published, - } - ) - - if (!record) { - console.error("Failed to create blob record") - return false - } - - return record -} - async function fetchDocumentRecord(agent: Agent, filter: FilterObj) { const records = await fetchRecords(agent, { ...filter, @@ -169,26 +148,8 @@ async function fetchDocumentRecords(agent: Agent) { }) } -async function fetchBlobRecord(agent: Agent, id: string) { - const records = await fetchRecords(agent, { - protocolPath: "blob", - schema: DocumentProtocol.types.blob.schema, - }) - - if (!records || !records[0]) return false - - return records[0] -} - -async function fetchBlobRecords(agent: Agent) { - return fetchRecords(agent, { - protocolPath: "blob", - schema: DocumentProtocol.types.blob.schema, - }) -} - type UpdatePayload = Partial< - Omit & + Omit & { file: File, otherFiles: File[] @@ -212,12 +173,12 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor record = idOrRecord } - const data: DocumentProtocolRecord.Document = await record.data.json() + const data: Record.Document = await record.data.json() const { file, otherFiles, ...restPayload } = payload const fileData = data.file if (file) { - const blobRecord = await updateBlobRecord(agent, data.file.id, file) + const blobRecord = await BlobUtils.updateBlobRecord(agent, data.file.id, { file }) if (!blobRecord) return false fileData.id = blobRecord.id @@ -232,7 +193,7 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor const file = otherFiles[i] const otherFile = otherFilesData[i] - const blobRecord = await updateBlobRecord(agent, otherFile.id, file) + const blobRecord = await BlobUtils.updateBlobRecord(agent, otherFile.id, { file }) if (!blobRecord) return false otherFile.id = blobRecord.id @@ -248,7 +209,7 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor for (let i = otherFilesData.length; i < otherFiles.length; i++) { const file = otherFiles[i] - const blobRecord = await createBlobRecord(agent, file) + const blobRecord = await BlobUtils.createBlobRecord(agent, { file }) if (!blobRecord) return false otherFilesData.push({ @@ -273,33 +234,6 @@ async function updateDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor return record } -async function updateBlobRecord(agent: Agent, id: string, file: File): Promise; -async function updateBlobRecord(agent: Agent, record: Web5Record, file: File): Promise; - -async function updateBlobRecord(agent: Agent, idOrRecord: string | Web5Record, file: File): Promise { - let record: Web5Record - - if (typeof idOrRecord === "string") { - const blobRecord = await fetchBlobRecord(agent, idOrRecord) - if (!blobRecord) return false - record = blobRecord - } - else { - record = idOrRecord - } - - const { status } = await record.update({ - data: new Blob([file], { type: file.type }) - }) - - if (status.code !== 202) { - console.log("Failed to sync blob record update with remote DWN:", status) - return false - } - - return record -} - async function deleteDocumentRecord(agent: Agent, id: string): Promise; async function deleteDocumentRecord(agent: Agent, record: Web5Record): Promise; @@ -317,13 +251,13 @@ async function deleteDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor record = idOrRecord } - const document: DocumentProtocolRecord.Document = await record.data.json() + const document: Record.Document = await record.data.json() - const hasDeletedBlobRecord = await deleteBlobRecord(agent, document.file.id) + const hasDeletedBlobRecord = await BlobUtils.deleteBlobRecord(agent, document.file.id) if (!hasDeletedBlobRecord) return false for (const otherFile of document.otherFiles) { - await deleteBlobRecord(agent, otherFile.id) + await BlobUtils.deleteBlobRecord(agent, otherFile.id) } const { status } = await agent.web5.dwn.records.delete({ @@ -339,36 +273,12 @@ async function deleteDocumentRecord(agent: Agent, idOrRecord: string | Web5Recor return true } -async function deleteBlobRecord(agent: Agent, id: string): Promise; -async function deleteBlobRecord(agent: Agent, record: Web5Record): Promise; - -async function deleteBlobRecord(agent: Agent, idOrRecord: string | Web5Record): Promise { - const record = typeof idOrRecord === "string" ? await fetchBlobRecord(agent, idOrRecord) : idOrRecord - if (!record) return false - - const { status } = await agent.web5.dwn.records.delete({ - message: { - recordId: record.id - } - }) - if (status.code !== 202) { - console.log("Failed to delete blob record:", status) - return false - } - - return true -} - const DocumentUtils = { createDocumentRecord, - createBlobRecord, fetchDocumentRecord, fetchDocumentRecords, - fetchBlobRecord, updateDocumentRecord, - updateBlobRecord, deleteDocumentRecord, - deleteBlobRecord } export default DocumentUtils diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index d2f24d1..b1ffec6 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.7" as const +export const url = "https://dschema.org/v0.0.8" as const diff --git a/tauri-app/src/utils/protocols/document.ts b/tauri-app/src/utils/protocols/document.ts index 33838c2..a13f7e6 100644 --- a/tauri-app/src/utils/protocols/document.ts +++ b/tauri-app/src/utils/protocols/document.ts @@ -10,15 +10,6 @@ const DocumentProtocol = { dataFormats: [ "application/json" ] - }, - blob: { - schema: `${protocol}/schema/blob.json`, - dataFormats: [ - "image/png", - "image/jpeg", - "image/jpg", - "application/pdf" - ] } }, structure: { @@ -33,18 +24,6 @@ const DocumentProtocol = { can: "write" } ] - }, - blob: { - $actions: [ - { - who: "anyone", - can: "read" - }, - { - who: "anyone", - can: "write" - } - ] } } } as const @@ -57,8 +36,6 @@ export namespace Record { name: string } - export type File = Blob - export type Document = { title: string file: FileMeta, diff --git a/tauri-app/src/utils/protocols/index.ts b/tauri-app/src/utils/protocols/index.ts index 1c0a671..e6a7e25 100644 --- a/tauri-app/src/utils/protocols/index.ts +++ b/tauri-app/src/utils/protocols/index.ts @@ -1,9 +1,11 @@ import DocumentProtocol from "./document" import ConditionsProtocol from "./conditions" import UserDetailsProtocol from "./user" +import BlobProtocol from "./blob" export const protocols = [ DocumentProtocol, + BlobProtocol, UserDetailsProtocol, ConditionsProtocol, ] diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 91db42d..73b8238 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -1,7 +1,7 @@ import { Web5, Record as Web5Record } from "@web5/api/browser" import UserDetailsProtocol, { Record as UserDetailsProtocolRecord, did as UserDetailsProtocolDID } from "./protocols/user"; -import DocumentUtils from "./document"; import _ from "lodash"; +import BlobUtils from "./blob"; type Agent = { web5: Web5 @@ -42,18 +42,22 @@ async function createRecord(agent: Agent, data: UserDetailsProto return false } - const { status: syncStatus } = await record.send(UserDetailsProtocolDID) + const { status: protocolDwnSyncStatus } = await record.send(UserDetailsProtocolDID) + if (protocolDwnSyncStatus.code !== 202) { + console.log("Failed to sync record with protocol remote DWN:", protocolDwnSyncStatus) + } - if (syncStatus.code !== 202) { - console.log("Failed to sync record with remote DWN:", syncStatus) + const { status: remoteDwnSyncStatus } = await record.send(agent.did) + if (remoteDwnSyncStatus.code !== 202) { + console.log("Failed to sync record with remote DWN:", remoteDwnSyncStatus) } return record } -async function fetchRecords(agent: Agent, filter: FullFilterObj, from?: string) { +async function fetchRecords(agent: Agent, filter: FullFilterObj, remote?: boolean) { const { records, status } = await agent.web5.dwn.records.query({ - from, + from: remote ? UserDetailsProtocolDID : undefined, message: { filter: { ...filter, @@ -82,7 +86,7 @@ async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { return false } - const blobRecord = await DocumentUtils.createBlobRecord(agent, payload.profilePicture) + const blobRecord = await BlobUtils.createBlobRecord(agent, { file: payload.profilePicture }, true) if (!blobRecord) return false const { profilePicture, ...restPayload } = payload @@ -109,13 +113,13 @@ async function createUserDetailsRecord(agent: Agent, payload: CreatePayload) { return record } -async function fetchUserDetailsRecord(agent: Agent) { +async function fetchUserDetailsRecord(agent: Agent, remote?: boolean) { const records = await fetchRecords(agent, { schema: UserDetailsProtocol.types.details.schema, protocolPath: "details", - }) + }, remote) - if (!records || !records[0]) return false + if (!records) return false return records[0] } @@ -124,7 +128,7 @@ async function fetchUserDetailsRecords(agent: Agent) { return fetchRecords(agent, { protocolPath: "details", schema: UserDetailsProtocol.types.details.schema, - }) + }, true) } type UpdatePayload = Partial< @@ -151,16 +155,16 @@ async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Re const data: UserDetailsProtocolRecord.Details = await record.data.json() const { profilePicture, ...restPayload } = payload - let url = data.profilePictureId + let profilePictureId = data.profilePictureId if (profilePicture) { - const blobRecord = await DocumentUtils.updateBlobRecord(agent, url, profilePicture) + const blobRecord = await BlobUtils.updateBlobRecord(agent, profilePictureId, { file: profilePicture }) if (!blobRecord) return false - url = blobRecord.id + profilePictureId = blobRecord.id } const { status } = await record.update({ - data: _.merge(data, Object.assign(restPayload, { url })) + data: _.merge(data, Object.assign(restPayload, { profilePictureId })) }) if (status.code !== 202) { @@ -177,7 +181,7 @@ async function deleteUserDetailsRecord(agent: Agent) { const profile: UserDetailsProtocolRecord.Details = await record.data.json() - const hasDeletedProfilePictureRecord = await DocumentUtils.deleteBlobRecord(agent, profile.profilePictureId) + const hasDeletedProfilePictureRecord = await BlobUtils.deleteBlobRecord(agent, profile.profilePictureId) if (!hasDeletedProfilePictureRecord) return false const { status } = await agent.web5.dwn.records.delete({ @@ -196,6 +200,7 @@ async function deleteUserDetailsRecord(agent: Agent) { const UserDetailsUtils = { fetchUserDetailsRecord, + fetchUserDetailsRecords, updateUserDetailsRecord, createUserDetailsRecord, deleteUserDetailsRecord From a05c87d667beb5b0440025550b44dc5bcad73e53 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 12:37:03 +0000 Subject: [PATCH 086/124] added a new blob protocol --- tauri-app/src/utils/blob.ts | 181 ++++++++++++++++++++++++++ tauri-app/src/utils/protocols/blob.ts | 42 ++++++ 2 files changed, 223 insertions(+) create mode 100644 tauri-app/src/utils/blob.ts create mode 100644 tauri-app/src/utils/protocols/blob.ts diff --git a/tauri-app/src/utils/blob.ts b/tauri-app/src/utils/blob.ts new file mode 100644 index 0000000..67ea009 --- /dev/null +++ b/tauri-app/src/utils/blob.ts @@ -0,0 +1,181 @@ +import { Web5, Record as Web5Record } from "@web5/api/browser" +import BlobProtocol, { Record, did as BlobProtocolDID } from "./protocols/blob"; +import _ from "lodash"; + +type Agent = { + web5: Web5 + did: string +} + +type FilterObj = { + recordId: string, +} + +type Type = keyof typeof BlobProtocol["types"] +type Schema = typeof BlobProtocol["types"][T]["schema"] +type DataFormat = typeof BlobProtocol["types"][T]["dataFormats"][number] + +type FullFilterObj = { + protocolPath: T + schema: Schema +} + +type FullMessageObj = { + schema: Schema + protocolPath: T + dataFormat: DataFormat + published: typeof BlobProtocol["published"] +} + +async function createRecord(agent: Agent, data: Record.Blob, message: FullMessageObj, remote?: boolean) { + const { record, status } = await agent.web5.dwn.records.create({ + data, + message: Object.assign({ + ...message, + protocol: BlobProtocol.protocol, + }) + }); + + if (!record) { + console.error("Failed to create record:", status) + return false + } + + if (remote) { + const { status: syncStatus } = await record.send(BlobProtocolDID) + + if (syncStatus.code !== 202) { + console.log("Failed to sync record protocol with remote DWN:", syncStatus) + return false + } + } + + const { status: syncStatus } = await record.send(agent.did) + + if (syncStatus.code !== 202) { + console.log("Failed to sync record with remote DWN:", syncStatus) + + if (remote) + return false + } + + return record +} + +async function fetchRecords(agent: Agent, filter: FullFilterObj, remote?: boolean) { + const { records, status } = await agent.web5.dwn.records.query({ + from: remote ? BlobProtocolDID : undefined, + message: { + filter: { + ...filter, + protocol: BlobProtocol.protocol, + }, + // @ts-ignore + dateSort: "createdAscending", + }, + }); + + if (!records) { + console.log("Failed to fetch records:", status) + return false + } + return records +} + +type CreatePayload = { + file: File +} +async function createBlobRecord(agent: Agent, payload: CreatePayload, remote?: boolean) { + const { file } = payload + + const record = await createRecord( + agent, + new Blob([file], { type: file.type }), + { + schema: BlobProtocol.types.blob.schema, + protocolPath: "blob", + dataFormat: file.type as DataFormat<"blob">, + published: BlobProtocol.published, + }, + remote + ) + + if (!record) { + console.error("Failed to create blob record") + return false + } + + return record +} + +async function fetchBlobRecord(agent: Agent, filter: FilterObj) { + const records = await fetchRecords(agent, { + ...filter, + protocolPath: "blob", + schema: BlobProtocol.types.blob.schema, + }) + + if (!records || !records[0]) return false + + return records[0] +} + +async function fetchBlobRecords(agent: Agent) { + return fetchRecords(agent, { + protocolPath: "blob", + schema: BlobProtocol.types.blob.schema, + }) +} + +type UpdatePayload = CreatePayload + +async function updateBlobRecord(agent: Agent, id: string, payload: UpdatePayload): Promise; +async function updateBlobRecord(agent: Agent, record: Web5Record, payload: UpdatePayload): Promise; + +async function updateBlobRecord(agent: Agent, idOrRecord: string | Web5Record, payload: UpdatePayload): Promise { + const { file } = payload + + const record = typeof idOrRecord === "string" ? await fetchBlobRecord(agent, { recordId: idOrRecord }) : idOrRecord + if (!record) return false + + const { status } = await record.update({ + data: new Blob([file], { type: file.type }) + }) + + if (status.code !== 202) { + console.log("Failed to sync blob record update with remote DWN:", status) + return false + } + + return record +} + +async function deleteBlobRecord(agent: Agent, id: string): Promise; +async function deleteBlobRecord(agent: Agent, record: Web5Record): Promise; + +async function deleteBlobRecord(agent: Agent, idOrRecord: string | Web5Record): Promise { + const record = typeof idOrRecord === "string" ? await fetchBlobRecord(agent, { recordId: idOrRecord }) : idOrRecord + if (!record) return false + + const { status } = await agent.web5.dwn.records.delete({ + message: { + recordId: record.id + } + }) + if (status.code !== 202) { + console.log("Failed to delete blob record:", status) + return false + } + + return true +} + +const BlobUtils = { + createBlobRecord, + fetchBlobRecords, + fetchBlobRecord, + updateBlobRecord, + deleteBlobRecord +} + +export default BlobUtils diff --git a/tauri-app/src/utils/protocols/blob.ts b/tauri-app/src/utils/protocols/blob.ts new file mode 100644 index 0000000..f6d65a5 --- /dev/null +++ b/tauri-app/src/utils/protocols/blob.ts @@ -0,0 +1,42 @@ +import { url } from "./defns" +const protocol = `${url}/protocols/blob` as const + +const BlobProtocol = { + protocol, + published: true, + types: { + blob: { + schema: `${protocol}/schema/blob.json`, + dataFormats: [ + "image/png", + "image/jpeg", + "image/jpg", + "application/pdf" + ] + } + }, + structure: { + blob: { + $actions: [ + { + who: "anyone", + // of: "blob", + can: "read" + }, + { + who: "anyone", + // of: "blob", + can: "write" + } + ] + } + } +} as const + +export namespace Record { + export type Blob = globalThis.Blob +} + +export const did = "did:ion:EiAx_twrw3f0yLOv3Pe6pk4gWG4miV9SVXiHe_Q4lMn8Ow:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJkd24tc2lnIiwicHVibGljS2V5SndrIjp7ImNydiI6IkVkMjU1MTkiLCJrdHkiOiJPS1AiLCJ4IjoiV1M1QXFqeDA1V2Z0YWMwYUhYRnpGNV9wZjM2eTVPQ0N0Qy1tM1lCTFo4WSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifSx7ImlkIjoiZHduLWVuYyIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJzZWNwMjU2azEiLCJrdHkiOiJFQyIsIngiOiJpSnpYYkljR0FHdm1QMzd2Z2VfTjB1M3FadllmLWpteGdyM2RTaDUtOE5vIiwieSI6InBBc1BuQ1hLcXlXRWhiS1ZDWjFJejhrWkljVVRXQXBNS2NOS3VtQ3R4T2cifSwicHVycG9zZXMiOlsia2V5QWdyZWVtZW50Il0sInR5cGUiOiJKc29uV2ViS2V5MjAyMCJ9XSwic2VydmljZXMiOlt7ImlkIjoiZHduIiwic2VydmljZUVuZHBvaW50Ijp7ImVuY3J5cHRpb25LZXlzIjpbIiNkd24tZW5jIl0sIm5vZGVzIjpbImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduNSIsImh0dHBzOi8vZHduLnRiZGRldi5vcmcvZHduMyJdLCJzaWduaW5nS2V5cyI6WyIjZHduLXNpZyJdfSwidHlwZSI6IkRlY2VudHJhbGl6ZWRXZWJOb2RlIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBSVIyQWFjQXZFVi16ODgwWHl2eHB4bWMzWDJkbDdYVmcwRHdWTGtfTms0QSJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpRGlvWktVc3cyZ0gzU29Nb0V5T0duVE9NQkZURFhZZ1hFX3Z6am5RU0M5aUEiLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUQzU0JIaEtXXzduUF9QamV1WDcybDRjcXVTMWVPVTBCUk1EcW1vdnFpVGxnIn19" + +export default BlobProtocol From 5c090e30102a1df35560867a13b90f2e156ec8c7 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sun, 7 Jan 2024 18:10:52 +0530 Subject: [PATCH 087/124] added chat initialization and deleted server Signed-off-by: coder12git --- server/.gitignore | 146 --- server/package-lock.json | 2354 ---------------------------------- server/package.json | 18 - server/script.ts | 94 -- server/server.ts | 9 - server/src/app.ts | 32 - server/src/middleware.ts | 22 - server/src/utils.ts | 89 -- server/tsconfig.json | 22 - tauri-app/package-lock.json | 54 +- tauri-app/src/pages/chat.tsx | 278 ++++ 11 files changed, 330 insertions(+), 2788 deletions(-) delete mode 100644 server/.gitignore delete mode 100644 server/package-lock.json delete mode 100644 server/package.json delete mode 100644 server/script.ts delete mode 100644 server/server.ts delete mode 100644 server/src/app.ts delete mode 100644 server/src/middleware.ts delete mode 100644 server/src/utils.ts delete mode 100644 server/tsconfig.json create mode 100644 tauri-app/src/pages/chat.tsx diff --git a/server/.gitignore b/server/.gitignore deleted file mode 100644 index 5b81ddf..0000000 --- a/server/.gitignore +++ /dev/null @@ -1,146 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -### Node Patch ### -# Serverless Webpack directories -.webpack/ - -# Optional stylelint cache - -# SvelteKit build / generate output -.svelte-kit - -# End of https://www.toptal.com/developers/gitignore/api/node - -DATA/ diff --git a/server/package-lock.json b/server/package-lock.json deleted file mode 100644 index 9794805..0000000 --- a/server/package-lock.json +++ /dev/null @@ -1,2354 +0,0 @@ -{ - "name": "server", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@hono/node-server": "^1.4.0", - "@hono/zod-validator": "^0.1.11", - "@web5/api": "^0.8.3", - "hono": "^3.12.0", - "true-myth": "5", - "tsconfig-paths": "^4.2.0", - "zod": "^3.22.4" - }, - "devDependencies": { - "tsx": "^4.7.0", - "typescript": "^5.3.3" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", - "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==" - }, - "node_modules/@decentralized-identity/ion-pow-sdk": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-pow-sdk/-/ion-pow-sdk-1.0.17.tgz", - "integrity": "sha512-vk7DTDM8aKDbFyu1ad/qkoRrGL4q+KvNeL/FNZXhkWPaDhVExBN/qGEoRLf1YSfFe+myto3+4RYTPut+riiqnw==", - "dependencies": { - "buffer": "6.0.3", - "cross-fetch": "3.1.5", - "hash-wasm": "4.9.0" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/@decentralized-identity/ion-pow-sdk/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@decentralized-identity/ion-sdk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.1.tgz", - "integrity": "sha512-+P+DXcRSFjsEsI5KIqUmVjpzgUT28B2lWpTO+IxiBcfibAN/1Sg20NebGTO/+serz2CnSZf95N2a1OZ6eXypGQ==", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/secp256k1": "^2.0.0", - "canonicalize": "^2.0.0", - "multiformats": "^12.0.1", - "multihashes": "^4.0.3", - "uri-js": "^4.4.1" - } - }, - "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@hono/node-server": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.0.tgz", - "integrity": "sha512-bhDkhldW7w9VgjrX0gG1vJ2YyvTxFWd5WG9nHjSR4UauhVECQZC3qy7mVVuQ054I5NWhKttHfKzYfoPzmUzAjw==", - "engines": { - "node": ">=18.14.1" - } - }, - "node_modules/@hono/zod-validator": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@hono/zod-validator/-/zod-validator-0.1.11.tgz", - "integrity": "sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==", - "peerDependencies": { - "hono": ">=3.9.0", - "zod": "^3.19.1" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", - "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", - "dependencies": { - "cborg": "^2.0.1", - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-cbor/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.7.tgz", - "integrity": "sha512-EqJtSAcELiYbp9K0Y5ckbg+W0pD5cSy5PnE/QsCrpKvoq+u0E8Vi07chNGDLaShd5AjDq0AMtnuudKUUuEuSjg==", - "dependencies": { - "multiformats": "^13.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/@js-temporal/polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", - "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", - "dependencies": { - "jsbi": "^4.3.0", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@multiformats/base-x": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz", - "integrity": "sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==" - }, - "node_modules/@multiformats/murmur3": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", - "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", - "dependencies": { - "multiformats": "^13.0.0", - "murmurhash3js-revisited": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/murmur3/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/@noble/ciphers": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.1.4.tgz", - "integrity": "sha512-d3ZR8vGSpy3v/nllS+bD/OMN5UZqusWiQqkyj7AwzTnhXFH72pF5oB4Ach6DQ50g5kXxC28LdaYBEpsyv9KOUQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/ed25519": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", - "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", - "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@tbd54566975/dwn-sdk-js": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.2.8.tgz", - "integrity": "sha512-oiKk+ekAQO94bUkt6yk+xkDY8uCGmNC+rKaYQLhAoTrhYrczeRSuDT04F5/vPBT5K6NfAoRcQsIyBmvgRCUvgA==", - "dependencies": { - "@ipld/dag-cbor": "9.0.3", - "@js-temporal/polyfill": "0.4.4", - "@noble/ed25519": "2.0.0", - "@noble/secp256k1": "2.0.0", - "abstract-level": "1.0.3", - "ajv": "8.12.0", - "blockstore-core": "4.2.0", - "cross-fetch": "4.0.0", - "eciesjs": "0.4.5", - "flat": "5.0.2", - "interface-blockstore": "5.2.3", - "interface-store": "5.1.2", - "ipfs-unixfs-exporter": "13.1.5", - "ipfs-unixfs-importer": "15.1.5", - "level": "8.0.0", - "lodash": "4.17.21", - "lru-cache": "9.1.2", - "ms": "2.1.3", - "multiformats": "11.0.2", - "randombytes": "2.1.0", - "readable-stream": "4.4.2", - "ulidx": "2.1.0", - "uuid": "8.3.2", - "varint": "6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@web5/agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.2.5.tgz", - "integrity": "sha512-Z9JY/43Yrg0xKK26y/iZFdHNtVf/k9XLxw8mXP5zfYidrqfAgVR0i4LKA7qZKfUSxC7/uaD/STYYIKpNByd/cw==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "level": "8.0.0", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.8.3.tgz", - "integrity": "sha512-YXQ++ZShtd5LeFRqEMGlhVqJ7Zg5P6bMequpaLl068bCGjtjCwiFFgDtM1KeL36IAzQ4pFLFyj9aTGZ/JgCXHA==", - "dependencies": { - "@tbd54566975/dwn-sdk-js": "0.2.8", - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3", - "@web5/user-agent": "0.2.5", - "level": "8.0.0", - "ms": "2.1.3", - "readable-stream": "4.4.2", - "readable-web-to-node-stream": "3.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/common": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.2.tgz", - "integrity": "sha512-dRn6SmALExeTLMTK/W5ozGarfaddK+Lraf5OjuIGLAaLfcX1RWx3oDMoY5Hr9LjfxHJC8mGXB8DnKflbeYJRgA==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2", - "readable-stream": "4.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-0.2.2.tgz", - "integrity": "sha512-vHFg0wXQSQXrwuBNQyDHnmSZchfTfO6/Sv+7rDsNkvofs+6lGTE8CZ02cwUYMeIwTRMLer12c+fMfzYrXokEUQ==", - "dependencies": { - "@noble/ciphers": "0.1.4", - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@web5/common": "0.2.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/crypto/node_modules/@web5/common": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-0.2.1.tgz", - "integrity": "sha512-Tt5P17HgQCx+Epw0IHnhRKqp5UU3E4xtsE8PkdghOBnvntBB0op5P6efvR1WqmJft5+VunDHt3yZAZstuqQkNg==", - "dependencies": { - "level": "8.0.0", - "multiformats": "11.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-0.2.3.tgz", - "integrity": "sha512-Y3PHOavNkSyjBxZQEpKE6XueaqemBO5w0UMOnFh4xH6+5B43ENEE4LHIqVyn2bCpfEBGLXENgDZYqyJphBu0pA==", - "dependencies": { - "@decentralized-identity/ion-pow-sdk": "1.0.17", - "@decentralized-identity/ion-sdk": "1.0.1", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "did-resolver": "4.1.0", - "dns-packet": "5.6.1", - "level": "8.0.0", - "ms": "2.1.3", - "pkarr": "1.1.1", - "z32": "1.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/user-agent": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.2.5.tgz", - "integrity": "sha512-qv5M698C5HSvq30xUgLWtcsbZppjfOH5qZthpTRx4ItL5UWA/eQ9DsQiQeb4vet3uIUy3NHRDIQezclOdwYErw==", - "dependencies": { - "@web5/agent": "0.2.5", - "@web5/common": "0.2.2", - "@web5/crypto": "0.2.2", - "@web5/dids": "0.2.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bencode": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-3.1.1.tgz", - "integrity": "sha512-btsxX9201yoWh45TdqYg6+OZ5O1xTYKTYSGvJndICDFtznE/9zXgow8yjMvvhOqKKuzuL7h+iiCMpfkG8+QuBA==", - "dependencies": { - "uint8-util": "^2.1.6" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bittorrent-dht": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-11.0.5.tgz", - "integrity": "sha512-R09D6uNaziRqsc+B/j5QzkjceTak+wH9vcNLnkmt8A52EWF9lQwBP0vvCKgSA3AJOYYl+41n3osA2KYYn/z5uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "bencode": "^4.0.0", - "debug": "^4.3.4", - "k-bucket": "^5.1.0", - "k-rpc": "^5.1.0", - "last-one-wins": "^1.0.4", - "lru": "^3.1.0", - "randombytes": "^2.1.0", - "record-cache": "^1.2.0" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bittorrent-dht/node_modules/bencode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", - "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", - "dependencies": { - "uint8-util": "^2.2.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blake2b": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", - "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", - "dependencies": { - "blake2b-wasm": "^2.4.0", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blake2b-wasm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", - "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/blockstore-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", - "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", - "dependencies": { - "err-code": "^3.0.1", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/canonicalize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz", - "integrity": "sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==" - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cborg": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", - "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", - "bin": { - "cborg": "cli.js" - } - }, - "node_modules/chacha20-universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", - "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chrome-dgram": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", - "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.4", - "run-series": "^1.1.9" - } - }, - "node_modules/chrome-dns": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chrome-dns/-/chrome-dns-1.0.1.tgz", - "integrity": "sha512-HqsYJgIc8ljJJOqOzLphjAs79EUuWSX3nzZi2LNkzlw3GIzAeZbaSektC8iT/tKvLqZq8yl1GJu5o6doA4TRbg==", - "dependencies": { - "chrome-net": "^3.3.2" - } - }, - "node_modules/chrome-net": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/chrome-net/-/chrome-net-3.3.4.tgz", - "integrity": "sha512-Jzy2EnzmE+ligqIZUsmWnck9RBXLuUy6CaKyuNMtowFG3ZvLt8d+WBJCTPEludV0DHpIKjAOlwjFmTaEdfdWCw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "inherits": "^2.0.1" - } - }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eciesjs": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", - "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", - "dependencies": { - "@noble/ciphers": "^0.3.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eciesjs/node_modules/@noble/ciphers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", - "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/eciesjs/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" - }, - "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/graceful-goodbye": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", - "integrity": "sha512-hcZOs20emYlTM7MmUE0FpuZcjlk2GPsR+UYTHDeWxtGjXcbh2CawGi8vlzqsIvspqAbot7mRv3sC/uhgtKc4hQ==", - "dependencies": { - "safety-catch": "^1.0.2" - } - }, - "node_modules/hamt-sharding": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", - "integrity": "sha512-f0DzBD2tSmLFdFsLAvOflIBqFPjerbA7BfmwO8mVho/5hXwgyyYhv+ijIzidQf/DpDX3bRjAQvhGoBFj+DBvPw==", - "dependencies": { - "sparse-array": "^1.3.1", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/hash-wasm": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.9.0.tgz", - "integrity": "sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w==" - }, - "node_modules/hono": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.0.tgz", - "integrity": "sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interface-blockstore": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", - "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", - "dependencies": { - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/interface-store": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", - "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.1.2.tgz", - "integrity": "sha512-HVjrACOhU8RgMskcrfydk+FDAE9pFKr8tneKLaVYQ2f81HUKXoiSdgsAJY/jt7Ieyj4tE12TZGduIeWtNpScOw==", - "dependencies": { - "err-code": "^3.0.1", - "protons-runtime": "^5.0.0", - "uint8arraylist": "^2.4.3" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-exporter": { - "version": "13.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", - "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "ipfs-unixfs": "^11.0.0", - "it-filter": "^3.0.2", - "it-last": "^3.0.2", - "it-map": "^3.0.3", - "it-parallel": "^3.0.0", - "it-pipe": "^3.0.1", - "it-pushable": "^3.1.0", - "multiformats": "^11.0.0", - "p-queue": "^7.3.0", - "progress-events": "^1.0.0", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-importer": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", - "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", - "dependencies": { - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.1", - "ipfs-unixfs": "^11.0.0", - "it-all": "^3.0.2", - "it-batch": "^3.0.2", - "it-first": "^3.0.2", - "it-parallel-batch": "^3.0.1", - "multiformats": "^11.0.0", - "progress-events": "^1.0.0", - "rabin-wasm": "^0.1.4", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/it-all": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.4.tgz", - "integrity": "sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==" - }, - "node_modules/it-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.4.tgz", - "integrity": "sha512-WRu2mqOYIs+T9k7+yxSK9VJdk0UE4R0jKQsWQcti5c6vhb1FhjC2+yCB5XBrctQ9edNfCMU/wVzdDj8qSwimbA==" - }, - "node_modules/it-filter": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.4.tgz", - "integrity": "sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-first": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.4.tgz", - "integrity": "sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==" - }, - "node_modules/it-last": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.4.tgz", - "integrity": "sha512-Ns+KTsQWhs0KCvfv5X3Ck3lpoYxHcp4zUp4d+AOdmC8cXXqDuoZqAjfWhgCbxJubXyIYWdfE2nRcfWqgvZHP8Q==" - }, - "node_modules/it-map": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.5.tgz", - "integrity": "sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-merge": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.3.tgz", - "integrity": "sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==", - "dependencies": { - "it-pushable": "^3.2.0" - } - }, - "node_modules/it-parallel": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.6.tgz", - "integrity": "sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-parallel-batch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.4.tgz", - "integrity": "sha512-O1omh8ss8+UtXiMjE+8kM5C20DT0Ma4VtKVfrSHOJU0UHZ+iWBXarabzPYEp+WiuQmrv+klDPPlTZ9KaLN9xOA==", - "dependencies": { - "it-batch": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.3.tgz", - "integrity": "sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==" - }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", - "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/jsbi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.0.tgz", - "integrity": "sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==" - }, - "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==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/k-bucket": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", - "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/k-rpc": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-5.1.0.tgz", - "integrity": "sha512-FGc+n70Hcjoa/X2JTwP+jMIOpBz+pkRffHnSl9yrYiwUxg3FIgD50+u1ePfJUOnRCnx6pbjmVk5aAeB1wIijuQ==", - "dependencies": { - "k-bucket": "^5.0.0", - "k-rpc-socket": "^1.7.2", - "randombytes": "^2.0.5" - } - }, - "node_modules/k-rpc-socket": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.11.1.tgz", - "integrity": "sha512-8xtA8oqbZ6v1Niryp2/g4GxW16EQh5MvrUylQoOG+zcrDff5CKttON2XUXvMwlIHq4/2zfPVFiinAccJ+WhxoA==", - "dependencies": { - "bencode": "^2.0.0", - "chrome-dgram": "^3.0.2", - "chrome-dns": "^1.0.0", - "chrome-net": "^3.3.2" - } - }, - "node_modules/k-rpc-socket/node_modules/bencode": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", - "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" - }, - "node_modules/last-one-wins": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", - "integrity": "sha512-t+KLJFkHPQk8lfN6WBOiGkiUXoub+gnb2XTYI2P3aiISL+94xgZ1vgz1SXN/N4hthuOoLXarXfBZPUruyjQtfA==" - }, - "node_modules/layerr": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz", - "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==" - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lru": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", - "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", - "dependencies": { - "inherits": "^2.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, - "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/multibase": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz", - "integrity": "sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "@multiformats/base-x": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multiformats": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/multihashes": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz", - "integrity": "sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==", - "dependencies": { - "multibase": "^4.0.1", - "uint8arrays": "^3.0.0", - "varint": "^5.0.2" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/multihashes/node_modules/multiformats": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", - "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - }, - "node_modules/multihashes/node_modules/uint8arrays": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.1.1.tgz", - "integrity": "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==", - "dependencies": { - "multiformats": "^9.4.2" - } - }, - "node_modules/multihashes/node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/murmurhash3js-revisited": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", - "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", - "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/p-defer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", - "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", - "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^5.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkarr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pkarr/-/pkarr-1.1.1.tgz", - "integrity": "sha512-X27LKqf83X3WuJd2Z9qdfVxkmfOu6HUbY0pm11LqeBbFmgmZRPgOxJG8bKiIsmmD6Vjc25j45KHYflF2lfodyQ==", - "dependencies": { - "bencode": "^3.0.3", - "bittorrent-dht": "^11.0.4", - "chalk": "^5.2.0", - "dns-packet": "^5.6.1", - "graceful-goodbye": "^1.3.0", - "sodium-universal": "^4.0.0", - "z32": "^1.0.0" - }, - "bin": { - "pkarr": "bin.js" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", - "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/protons-runtime": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.2.1.tgz", - "integrity": "sha512-Rt4ORm1WR62ysrXX5sCV32a5jPwVoIpU90XUzrdAfMIOSNTizvqlx/7wedNpogvZjUUY/gLJp3VftpA+ebx/og==", - "dependencies": { - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.1" - } - }, - "node_modules/protons-runtime/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/protons-runtime/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rabin-wasm": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", - "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", - "dependencies": { - "@assemblyscript/loader": "^0.9.4", - "bl": "^5.0.0", - "debug": "^4.3.1", - "minimist": "^1.2.5", - "node-fetch": "^2.6.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "rabin-wasm": "cli/bin.js" - } - }, - "node_modules/rabin-wasm/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/record-cache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz", - "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==", - "dependencies": { - "b4a": "^1.3.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safety-catch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz", - "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==" - }, - "node_modules/sha256-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", - "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", - "dependencies": { - "b4a": "^1.0.1", - "sha256-wasm": "^2.2.1" - } - }, - "node_modules/sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/sha512-universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", - "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", - "dependencies": { - "b4a": "^1.0.1", - "sha512-wasm": "^2.3.1" - } - }, - "node_modules/sha512-wasm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", - "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/siphash24": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", - "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", - "dependencies": { - "nanoassert": "^2.0.0" - } - }, - "node_modules/sodium-javascript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", - "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/sodium-native": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.4.tgz", - "integrity": "sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.6.0" - } - }, - "node_modules/sodium-universal": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.0.tgz", - "integrity": "sha512-iKHl8XnBV96k1c75gwwzANFdephw/MDWSjQAjPmBE+du0y3P23Q8uf7AcdcfFsYAMwLg7WVBfSAIBtV/JvRsjA==", - "dependencies": { - "blake2b": "^2.1.1", - "chacha20-universal": "^1.0.4", - "nanoassert": "^2.0.0", - "sha256-universal": "^1.1.0", - "sha512-universal": "^1.1.0", - "siphash24": "^1.0.1", - "sodium-javascript": "~0.8.0", - "sodium-native": "^4.0.0", - "xsalsa20": "^1.0.0" - } - }, - "node_modules/sparse-array": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", - "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/true-myth": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-5.4.0.tgz", - "integrity": "sha512-MonJqkJf+VOXZ2msbpvAI1uJWoyfCN7nirR8/fNK+IlFDWYNLb9iqeAc2uhIbAQBynHtM02azZgepQDQclOwAw==", - "engines": { - "node": "12.* || 14.* || 16.* || >= 18.*" - } - }, - "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==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", - "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uint8-util": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.4.tgz", - "integrity": "sha512-uEI5lLozmKQPYEevfEhP9LY3Je5ZmrQhaWXrzTVqrLNQl36xsRh8NiAxYwB9J+2BAt99TRbmCkROQB2ZKhx4UA==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", - "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", - "dependencies": { - "uint8arrays": "^5.0.1" - } - }, - "node_modules/uint8arraylist/node_modules/multiformats": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.0.0.tgz", - "integrity": "sha512-xiIB0p7EKmETm3wyKedOg/xuyQ18PoWwXCzzgpZAiDxL9ktl3XTh8AqoDT5kAqRg+DU48XAGPsUJL2Rn6Bx3Lw==" - }, - "node_modules/uint8arraylist/node_modules/uint8arrays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.0.1.tgz", - "integrity": "sha512-ND5RpJAnPgHmZT7hWD/2T4BwRp04j8NLKvMKC/7bhiEwEjUMkQ4kvBKiH6hOqbljd6qJ2xS8reL3vl1e33grOQ==", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/uint8arrays": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", - "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", - "dependencies": { - "multiformats": "^12.0.1" - } - }, - "node_modules/uint8arrays/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ulidx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", - "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", - "dependencies": { - "layerr": "^2.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/xsalsa20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", - "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" - }, - "node_modules/z32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/z32/-/z32-1.0.1.tgz", - "integrity": "sha512-Uytfqf6VEVchHKZDw0NRdCViOARHP84uzvOw0CXCMLOwhgHZUL9XibpEPLLQN10mCVLxOlGCQWbkV7km7yNYcw==", - "dependencies": { - "b4a": "^1.5.3" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/server/package.json b/server/package.json deleted file mode 100644 index ce20a8d..0000000 --- a/server/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "scripts": { - "dev": "tsx --watch server.ts" - }, - "dependencies": { - "@hono/node-server": "^1.4.0", - "@hono/zod-validator": "^0.1.11", - "@web5/api": "^0.8.3", - "hono": "^3.12.0", - "true-myth": "5", - "tsconfig-paths": "^4.2.0", - "zod": "^3.22.4" - }, - "devDependencies": { - "tsx": "^4.7.0", - "typescript": "^5.3.3" - } -} diff --git a/server/script.ts b/server/script.ts deleted file mode 100644 index e58a7e5..0000000 --- a/server/script.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Web5 } from "@web5/api"; -import { protocols } from "@frontend/utils/protocols"; -import DocumentUtils from "@frontend/utils/document"; -import { Agent } from "@backend/utils"; - -async function configureProtocols(agent: Agent) { - console.log("=== CONFIGURE PROTOCOL ===") - - for (const protocol of protocols) { - const { protocols } = await agent.web5.dwn.protocols.query({ - message: { - filter: { - protocol: protocol.protocol, - } - } - }) - - if (protocols.length > 0) { - console.log("Protocol already exists:", protocol.protocol) - continue - } - - const { protocol: configuredProtocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ - message: { - definition: Object.assign({ ...protocol }), - } - }); - - if (!configuredProtocol) { - console.log("Failed to configure protocol:", localProtocolConfigurationStatus) - return - } - - console.log("Configured protocol on local DWN:", protocol.protocol) - const { status: remoteProtocolConfigurationStatus } = await configuredProtocol.send(agent.did) - - console.log("Sent protocol to remote DWN") - console.log(protocol.protocol, remoteProtocolConfigurationStatus) - } - - console.log("=== END CONFIGURE PROTOCOL ===") -} - -async function queryConditions(agent: Agent) { - console.log("=== QUERY CONDITIONS ===") - - const records = await DocumentUtils.fetchDocumentRecords(agent) - if (!records) { - console.log("No records found") - return - } - - if (records.length > 0) { - for (const record of records) { - // console.log("author:", record.author) - // console.log("recipient:", record.recipient) - // Bun.write("records/" + record.id + ".json", JSON.stringify(record)) - // console.log(record.author === record.target) - console.log(await record.data.json()) - } - } - - console.log("=== END QUERY CONDITIONS ===") -} - -async function createCondition(agent: Agent) { - console.log("=== CREATE CONDITION ===") - - const record = await DocumentUtils.createDocumentRecord(agent, { name: "test", condition: "command", file: new File([], "", { type: "image/png" }) }) - - if (!record) return false - - console.log("=== END CREATE CONDITION ===") -} - -async function connect() { - console.log("=== CONNECT ===") - const agent = await Web5.connect({ - sync: "5s", - }); - - console.log("=== END CONNECT ===") - - return agent -} -async function main() { - const agent = await connect() - await configureProtocols(agent) - await queryConditions(agent) - // await createCondition(agent) - // await queryConditions(agent) -} - -main() diff --git a/server/server.ts b/server/server.ts deleted file mode 100644 index f321b00..0000000 --- a/server/server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import app from "./src/app"; -import { serve } from '@hono/node-server' - -serve({ - fetch: app.fetch, - port: process.env.PORT || 5000, -}, (addr) => { - console.log("Server running on port:", addr.port) -}) diff --git a/server/src/app.ts b/server/src/app.ts deleted file mode 100644 index 9344854..0000000 --- a/server/src/app.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Hono } from "hono"; -import { fetchConditions } from "./utils"; -import { agentMiddleware } from "./middleware"; -import { zValidator } from '@hono/zod-validator' -import { z } from 'zod' -import { logger } from "hono/logger" -import { cors } from 'hono/cors' - -const app = new Hono() - .basePath("/api") - .use("*", cors()) - .use("*", logger()) - .get("/conditions", - zValidator( - 'query', - z.object({ - condition: z.string() - })), - agentMiddleware, async (c) => { - const { condition } = c.req.valid("query") - const res = await fetchConditions(c.get("agent")) - if (res.isErr) - return c.json({ error: res.error }) - - // @ts-ignore - const conditions = res.value.filter(record => record.condition === condition) - return c.json(conditions) - }) - -export type App = typeof app - -export default app diff --git a/server/src/middleware.ts b/server/src/middleware.ts deleted file mode 100644 index e6503bc..0000000 --- a/server/src/middleware.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type Agent, configureProtocol, setupAgent } from "./utils"; -import { MiddlewareHandler } from "hono" - -let agent: Agent - -export const agentMiddleware: MiddlewareHandler<{ - Variables: { - agent: Agent - } -}> = async (c, next) => { - if (!agent) - agent = await setupAgent() - - const connectionResult = await configureProtocol(agent) - if (connectionResult.isErr) { - console.log(connectionResult.error) - process.exit() - } - - c.set('agent', agent) - await next() -} diff --git a/server/src/utils.ts b/server/src/utils.ts deleted file mode 100644 index 4a9c280..0000000 --- a/server/src/utils.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Web5 } from "@web5/api"; -import ConditionsProtocol, { type Record, did as ConditionsProtocolDID } from "@frontend/utils/protocols/conditions" -// @ts-ignore -import Result, { ok, err } from "true-myth/result" - -export type Agent = { - web5: Web5, - did: string -} - -export type Status = { - code: number, - detail: string, -} - -// @ts-ignore -export async function configureProtocol(agent: Agent): Promise> { - const { protocols } = await agent.web5.dwn.protocols.query({ - message: { - filter: { - protocol: ConditionsProtocol.protocol, - } - } - }) - - if (protocols.length > 0) - return ok(undefined) - - const { protocol, status: localProtocolConfigurationStatus } = await agent.web5.dwn.protocols.configure({ - message: { - definition: ConditionsProtocol, - } - }); - - if (!protocol) - return err({ - type: "LOCAL_PROTOCOL_CONFIGURATION_FAILED", - status: localProtocolConfigurationStatus, - }) - - const { status: remoteProtocolConfigurationStatus } = await protocol.send(ConditionsProtocolDID) - - if (remoteProtocolConfigurationStatus.code !== 202) - return err({ - type: "REMOTE_PROTOCOL_CONFIGURATION_FAILED", - status: remoteProtocolConfigurationStatus, - }) - - return ok(undefined) -} - -// @ts-ignore -export async function fetchConditions(agent: Agent): Promise> { - const { records, status } = await agent.web5.dwn.records.query({ - from: ConditionsProtocolDID, - message: { - filter: { - protocolPath: 'condition', - schema: ConditionsProtocol.types.condition.schema, - protocol: ConditionsProtocol.protocol, - }, - // @ts-ignore - dateSort: "createdAscending", - } - }) - - if (!records) { - if (status.code !== 200) - return err(status) - - return ok([]) - } - - const conditions: Record.Condition[] = [] - for (const record of records) { - conditions.push(await record.data.json()) - } - - return ok(conditions) -} - -// @ts-ignore -export async function setupAgent(): Promise { - const { web5, did } = await Web5.connect({ - sync: "5s", - }); - - return { web5, did } -} diff --git a/server/tsconfig.json b/server/tsconfig.json deleted file mode 100644 index 880f229..0000000 --- a/server/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "noEmit": true, - "strict": false, - "noImplicitAny": true, - "noFallthroughCasesInSwitch": true, - "module": "CommonJS", - "target": "ES2020", - "baseUrl": ".", - "paths": { - "@backend/*": ["./src/*"], - "@frontend/*": ["../tauri-app/src/*"] - } - }, - "include": [ - "*.ts", - "./src/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/tauri-app/package-lock.json b/tauri-app/package-lock.json index e01b1d3..5bfe707 100644 --- a/tauri-app/package-lock.json +++ b/tauri-app/package-lock.json @@ -19,6 +19,7 @@ "axios": "^1.6.3", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", + "date-fns": "^3.1.0", "hono": "^3.12.0", "lodash": "^4.17.21", "lucide-react": "^0.298.0", @@ -27,6 +28,7 @@ "react-dropzone": "^14.2.3", "react-easy-crop": "^5.0.4", "react-hook-form": "^7.49.2", + "react-hot-toast": "^2.4.1", "react-pdf": "^7.6.0", "react-router-dom": "^6.21.1", "react-spinners": "^0.13.8", @@ -44,6 +46,7 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@types/react-window": "^1.8.8", + "@types/readable-stream": "^4.0.10", "@vitejs/plugin-react": "^4.0.3", "autoprefixer": "^10.4.16", "postcss": "^8.4.32", @@ -2095,6 +2098,22 @@ "@types/react": "*" } }, + "node_modules/@types/readable-stream": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz", + "integrity": "sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", @@ -2991,8 +3010,16 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/date-fns": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.1.0.tgz", + "integrity": "sha512-ZO7yefXV/wCWzd3I9haCHmfzlfA3i1a2HHO7ZXjtJrRjXt8FULKJ2Vl8wji3XYF4dQ0ZJ/tokXDZeYlFvgms9Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } }, "node_modules/debug": { "version": "4.3.4", @@ -3458,6 +3485,14 @@ "node": ">=4" } }, + "node_modules/goober": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.13.tgz", + "integrity": "sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/graceful-goodbye": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/graceful-goodbye/-/graceful-goodbye-1.3.0.tgz", @@ -4870,6 +4905,21 @@ "react": "^16.8.0 || ^17 || ^18" } }, + "node_modules/react-hot-toast": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", + "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", + "dependencies": { + "goober": "^2.1.10" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx new file mode 100644 index 0000000..fbd5444 --- /dev/null +++ b/tauri-app/src/pages/chat.tsx @@ -0,0 +1,278 @@ +import { Web5 } from "@web5/api"; +import { useState, useEffect } from "react"; + +export default function Home() { + + const [web5, setWeb5] = useState(null); + const [myDid, setMyDid] = useState(null); + const [activeRecipient, setActiveRecipient] = useState(null); + + const [noteValue, setNoteValue] = useState(""); + const [errorMessage, setErrorMessage] = useState(''); + const [recipientDid, setRecipientDid] = useState(""); + + const [didCopied, setDidCopied] = useState(false); + const [showNewChatInput, setShowNewChatInput] = useState(false); + + const [allDings, setAllDings] = useState([]); + + const sortedDings = allDings.sort( + //@ts-ignore + (a, b) => new Date(a.timestampWritten) - new Date(b.timestampWritten) + ); + + const groupedDings = allDings.reduce((acc, ding) => { + //@ts-ignore + const recipient = ding.sender === myDid ? ding.recipient : ding.sender; + //@ts-ignore + if (!acc[recipient]) acc[recipient] = []; + //@ts-ignore + acc[recipient].push(ding); + return acc; + }, {}); + + useEffect(() => { + const initWeb5 = async () => { + const { web5, did } = await Web5.connect(); + //@ts-ignore + setWeb5(web5); + //@ts-ignore + setMyDid(did); + + if (web5 && did) { + await configureProtocol(web5, did); + await fetchDings(web5, did); + } + }; + initWeb5(); + }, []); + + useEffect(() => { + if (!web5 || !myDid) return; + const intervalId = setInterval(async () => { + await fetchDings(web5, myDid); + }, 2000); + + return () => clearInterval(intervalId); + }, [web5, myDid]); + + const createProtocolDefinition = () => { + const dingerProtocolDefinition = { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + published: true, + types: { + ding: { + schema: "https://blackgirlbytes.dev/ding", + dataFormats: ["application/json"], + }, + }, + structure: { + ding: { + $actions: [ + { who: "anyone", can: "write" }, + { who: "author", of: "ding", can: "read" }, + { who: "recipient", of: "ding", can: "read" }, + ], + }, + }, + }; + return dingerProtocolDefinition; + }; + + //@ts-ignore + const queryForProtocol = async (web5) => { + return await web5.dwn.protocols.query({ + message: { + filter: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + }, + }, + }); + }; + + //@ts-ignore + const installProtocolLocally = async (web5, protocolDefinition) => { + return await web5.dwn.protocols.configure({ + message: { + definition: protocolDefinition, + }, + }); + }; + + //@ts-ignore + const configureProtocol = async (web5, did) => { + const protocolDefinition = await createProtocolDefinition(); + + const { protocols: localProtocol, status: localProtocolStatus } = + await queryForProtocol(web5); + console.log({ localProtocol, localProtocolStatus }); + if (localProtocolStatus.code !== 200 || localProtocol.length === 0) { + + const { protocol, status } = await installProtocolLocally(web5, protocolDefinition); + console.log("Protocol installed locally", protocol, status); + + const { status: configureRemoteStatus } = await protocol.send(did); + console.log("Did the protocol install on the remote DWN?", configureRemoteStatus); + } else { + console.log("Protocol already installed"); + } + }; + + + const constructDing = () => { + const currentDate = new Date().toLocaleDateString(); + const currentTime = new Date().toLocaleTimeString(); + const ding = { + sender: myDid, + note: noteValue, + recipient: recipientDid, + timestampWritten: `${currentDate} ${currentTime}`, + }; + return ding; + }; + + //@ts-ignore + const writeToDwn = async (ding) => { + //@ts-ignore + const { record } = await web5.dwn.records.write({ + data: ding, + message: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + protocolPath: "ding", + schema: "https://blackgirlbytes.dev/ding", + recipient: recipientDid, + }, + }); + return record; + }; + + //@ts-ignore + const sendRecord = async (record) => { + return await record.send(recipientDid); + }; + //@ts-ignore + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!noteValue.trim()) { + setErrorMessage('Please type a message before sending.'); + return; + } + + const ding = constructDing(); + const record = await writeToDwn(ding); + const { status } = await sendRecord(record); + + console.log("Send record status", status); + + await fetchDings(web5, myDid); + setNoteValue(""); + }; + + const handleCopyDid = async () => { + if (myDid) { + try { + await navigator.clipboard.writeText(myDid); + setDidCopied(true); + console.log("DID copied to clipboard"); + + setTimeout(() => { + setDidCopied(false); + }, 3000); + } catch (err) { + console.log("Failed to copy DID: " + err); + } + } + }; + + //@ts-ignore + const fetchSentMessages = async (web5, did) => { + const response = await web5.dwn.records.query({ + message: { + filter: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + }, + }, + }); + + if (response.status.code === 200) { + const sentDings = await Promise.all( + //@ts-ignore + response.records.map(async (record) => { + const data = await record.data.json(); + return data; + }) + ); + console.log(sentDings, "I sent these dings"); + return sentDings; + } else { + console.log("error", response.status); + } + }; + + //@ts-ignore + const fetchReceivedMessages = async (web5, did) => { + const response = await web5.dwn.records.query({ + from: did, + message: { + filter: { + protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", + schema: "https://blackgirlbytes.dev/ding", + }, + }, + }); + + if (response.status.code === 200) { + const receivedDings = await Promise.all( + //@ts-ignore + response.records.map(async (record) => { + const data = await record.data.json(); + return data; + }) + ); + console.log(receivedDings, "I received these dings"); + return receivedDings; + } else { + console.log("error", response.status); + } + }; + + //@ts-ignore + const fetchDings = async (web5, did) => { + const sentMessages = await fetchSentMessages(web5, did); + const receivedMessages = await fetchReceivedMessages(web5, did); + const allMessages = [...(sentMessages || []), ...(receivedMessages || [])]; + //@ts-ignore + setAllDings(allMessages); + + }; + + const handleStartNewChat = () => { + setActiveRecipient(null); + setShowNewChatInput(true); + }; + + //@ts-ignore + const handleSetActiveRecipient = (recipient) => { + setRecipientDid(recipient); + setActiveRecipient(recipient); + setShowNewChatInput(false); + }; + + const handleConfirmNewChat = () => { + //@ts-ignore + setActiveRecipient(recipientDid); + //@ts-ignore + setActiveRecipient(recipientDid); + setShowNewChatInput(false); + //@ts-ignore + if (!groupedDings[recipientDid]) { + //@ts-ignore + groupedDings[recipientDid] = []; + } + }; + + return ( +
      + ); +} \ No newline at end of file From 9276266508034a74b3b2255a56ffe073ae66d1fe Mon Sep 17 00:00:00 2001 From: koko_codes <58889001+EnebeliEmmanuel@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:02:41 +0100 Subject: [PATCH 088/124] Update README.md --- README.md | 136 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 5c39ce2..1d306c8 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,34 @@ -# PulsePal 🌟 - -Safely store medical records with decentralized identifiers and web nodes, ensuring data security. Connect with similar conditions, share home remedies with a rating system, and access specialized doctors based on your location. PulsePal – where advanced technology meets user-friendly design for your secure, connected health journey. - -## What it does +# Pulsepal-MVP 🌟 + +## Welcome to the Pulsepal MVP repository + +

      + site +

      + +> ## Table of contents +- [Overview](#overview) +- [Core Features Implemented](#core-features-implemented) +- [Technologies](#technologies) +- [Repo Setup](#repo-setup) +- [Requirements](#requirements) +- [Setup the Project](#setup-the-project) +- [Setup the Frontend](#setup-the-frontend) + - [Install Dependencies](#install-dependencies) + - [Steps to host the live site on Vercel](#steps-to-host-the-live-site-on-vercel) +- [Live Link](#live-link) +- [Contributors](#contributors) +- [Contributing to the project](#contributing-to-the-project) +# +> ## Overview +

      +Welcome to PulsePal, your health guardian in WEB5. Safely store medical records with decentralized identifiers and web nodes, ensuring data security. Connect with similar conditions, share home remedies with a rating system, and access specialized doctors based on your location. PulsePal – where advanced technology meets user-friendly design for your secure, connected health journey. +

      + + + +# +> ## Core Features Implemented 1. Secure Medical Record Storage: - Users can securely store their medical records using decentralized identifiers (DIDs) in the app. @@ -18,8 +44,43 @@ Safely store medical records with decentralized identifiers and web nodes, ensur 4. Recommend specialized doctors in your nearby areas, based on your current location -## Setting up Local Development + +

      + +# +> ## Technologies +| Stack | Usage | +| :------------------ | :------------------ | +| **`Web5`** | Backend | +| **`React JS + tauri + tailwind`** | Frontend | + +# +> ## Repo Setup + +

      +To setup the repo, first fork the Web5-hack Repo, then clone the forked repository to create a copy on the local machine. +

      + + $ git clone https://github.com/coder12git/Web5-Hack.git + +

      +Change directory to the cloned repo and set the original Web5-Hack repository as the "upstream" and your forked repository as the "origin" using gitbash. and make sure to switch to dev branch +

      + + $ git remote add upstream https://github.com/coder12git/Web5-Hack.git + +# + +> ## Requirements +# +- [Cors extension](https://chromewebstore.google.com/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf) +- Node JS + +# +> ## Setup the Frontend +- First run the frontend on your local server to ensure it's fully functional before building for production. +# 1. Clone the repository ``` @@ -44,16 +105,65 @@ npm install npm run dev ``` -## What's next for Pulsepal -1. Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." +# + +## Useful links + +## View attribution files here + + + +## Explainer video (User POV) + + + +## Demo Video (Clients POV) + + + + +- [Pitch Deck](https://github.com/coder12git/Web5-Hack/files/13853501/PULSEPal.pdf) +- [Frontend Deployment](https://web5-hack-413v.vercel.app/#/) + + + +> ## Contributors + +This Project was created by these awesome dedicated members + +

      + Team +

      + + +> ## What's next for Pulsepal + +- Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." + +- Natural Language Processing (NLP) Chatbot: "We aim to implement an NLP-powered chatbot that assists users in comprehending medical terminology, interpreting test results, and providing preliminary guidance in emergencies based on entered symptoms." + +- AI-Driven Diagnostics: "Incorporating an AI system for preliminary diagnostics, we intend to analyze symptoms and user-entered data to provide suggestive measures or identify potential health issues, prompting users to seek professional medical advice." + +- Augmented Reality (AR) for First Aid Guidance: "Our future plan involves integrating AR technology to guide users through basic first aid procedures by overlaying instructional visuals onto real-time surroundings." + +- Health Gamification and Incentivization: "To encourage healthy habits, we plan to introduce gamification within PulsePal, utilizing AI to personalize challenges, rewards, and reminders aligned with individual health goals." + +- Predictive Appointment Scheduling: "Utilizing AI algorithms, we aim to predict potential health concerns or follow-up appointments based on stored medical records, proactively suggesting relevant appointments or check-ups." + -2. Natural Language Processing (NLP) Chatbot: "We aim to implement an NLP-powered chatbot that assists users in comprehending medical terminology, interpreting test results, and providing preliminary guidance in emergencies based on entered symptoms." +# +> ## Contributing to the project -3. AI-Driven Diagnostics: "Incorporating an AI system for preliminary diagnostics, we intend to analyze symptoms and user-entered data to provide suggestive measures or identify potential health issues, prompting users to seek professional medical advice." +If you find something worth contributing, please fork the repo, make a pull request and add valid and well-reasoned explanations about your changes or comments. -4. Augmented Reality (AR) for First Aid Guidance: "Our future plan involves integrating AR technology to guide users through basic first aid procedures by overlaying instructional visuals onto real-time surroundings." +Before adding a pull request, please note: -5. Health Gamification and Incentivization: "To encourage healthy habits, we plan to introduce gamification within PulsePal, utilizing AI to personalize challenges, rewards, and reminders aligned with individual health goals." +- This is an open source project. +- Your contributions should be inviting and clear. +- Any additions should be relevant. +- New features should be easy to contribute to. -6. Predictive Appointment Scheduling: "Utilizing AI algorithms, we aim to predict potential health concerns or follow-up appointments based on stored medical records, proactively suggesting relevant appointments or check-ups." +All **`suggestions`** are welcome! +# +> ##### README Created by `Enebeli Emmanuel` for Pulsepal From bbee27406a1ea4d5a3b7fd350c099243fb3c4cf4 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 13:02:41 +0000 Subject: [PATCH 089/124] updated the protocols --- .../src/components/AddCardComponent/index.tsx | 9 +++- tauri-app/src/pages/Home/SignUpForm.tsx | 4 +- tauri-app/src/stores/profile.ts | 50 +++++++++++++++---- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 1 + 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/tauri-app/src/components/AddCardComponent/index.tsx b/tauri-app/src/components/AddCardComponent/index.tsx index a30753f..f939403 100644 --- a/tauri-app/src/components/AddCardComponent/index.tsx +++ b/tauri-app/src/components/AddCardComponent/index.tsx @@ -6,7 +6,7 @@ import { useForm } from "react-hook-form" import toast from "react-hot-toast"; import DocumentUtils from "@/utils/document"; import { Agent } from "../Auth/types"; -import { ProfileState } from "@/stores/profile"; +import { ProfileState, useProfile } from "@/stores/profile"; const possibleConditions = [ "Cancer", @@ -64,7 +64,8 @@ const formSchema = z.object({ otherFiles: z.array(z.instanceof(File)) }) -const index: FunctionComponent<{profile: ProfileState, agent: Agent, onClose: () => void}> = ({ profile, agent, onClose }) => { +const index: FunctionComponent<{ agent: Agent, onClose: () => void }> = ({ agent, onClose }) => { + const { profile, addCondition } = useProfile(store => ({ profile: store.state.profile!, addCondition: store.addCondition })) const [numFileUploaders, setNumFileUploaders] = useState(0) const form = useForm>({ @@ -86,6 +87,10 @@ const index: FunctionComponent<{profile: ProfileState, agent: Agent, onClose: () return } + const hasAddedCondition = await addCondition(agent, data.condition) + if (hasAddedCondition) + console.log("Added condition to profile") + toast.success('Successfully created record!') onClose() diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index b232969..fd4254f 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -7,7 +7,7 @@ import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import toast from "react-hot-toast"; -import { CreatePayload } from "@/utils/user"; +import { SignUpPayload } from "@/stores/profile"; const formSchema = z.object({ firstName: z.string().min(1), @@ -68,7 +68,7 @@ export default function SignUpForm() { } }) - const createProfile = async (agent: Agent, payload: CreatePayload) => { + const createProfile = async (agent: Agent, payload: SignUpPayload) => { const hasSignedUpSuccessfully = await signUp(agent, payload) if (!hasSignedUpSuccessfully) { diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 69aa213..f332ecb 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -4,27 +4,27 @@ import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; +import { Record as Web5Record } from "@web5/api/browser" -export type ProfileState = { +export type SignUpPayload = Omit + +export type ProfileState = Omit & +{ id: string // username: string - firstName: string, - lastName: string, profilePictureUrl: string } type State = { profile: ProfileState, isSignedIn: true + record: Web5Record } | { profile: null, + record: null, isSignedIn: false } -type Payload = Omit & { - profilePicture: File -} - export const useProfile = create( combine({ state: { @@ -41,6 +41,7 @@ export const useProfile = create( set({ state: { isSignedIn: false, + record: null, profile: null } }) @@ -62,10 +63,10 @@ export const useProfile = create( set({ state: { isSignedIn: true, + record: profileRecord, profile: { + ...profile, id: profileRecord.id, - firstName: profile.firstName, - lastName: profile.lastName, profilePictureUrl } } @@ -73,8 +74,35 @@ export const useProfile = create( return true }, - signUp: async (agent: Agent, payload: CreatePayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) + addCondition: async (agent: Agent, condition: string) => { + const state = get().state + if (!state.isSignedIn) return false + + const { profilePictureUrl, ...payload } = state.profile + if (payload.conditions.indexOf(condition) < -1) return + + payload.conditions.push(condition) + + const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord(agent, state.record, payload) + if (!updatedRecord) return false + const profile = await updatedRecord.data.json() + + set({ + state: { + isSignedIn: true, + record: updatedRecord, + profile: { + ...profile, + id: updatedRecord.id, + profilePictureUrl + } + } + }) + + return updatedRecord + }, + signUp: async (agent: Agent, payload: SignUpPayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [] }) if (!profile) return false return profile diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index b1ffec6..3a26bbd 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.8" as const +export const url = "https://dschema.org/v0.0.10a" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 95967af..7f63622 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -33,6 +33,7 @@ export namespace Record { firstName: string lastName: string profilePictureId: string + conditions: string[] description: string dateCreated: string } From dc87ecf3b986ed62bdeeca87d1f8d29254b488cb Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 13:28:03 +0000 Subject: [PATCH 090/124] updated the schema --- tauri-app/src/stores/profile.ts | 4 ++-- tauri-app/src/utils/protocols/defns.ts | 2 +- tauri-app/src/utils/protocols/user.ts | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index f332ecb..9740536 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -6,7 +6,7 @@ import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; import { Record as Web5Record } from "@web5/api/browser" -export type SignUpPayload = Omit +export type SignUpPayload = Omit export type ProfileState = Omit & { @@ -102,7 +102,7 @@ export const useProfile = create( return updatedRecord }, signUp: async (agent: Agent, payload: SignUpPayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [] }) + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [], did: agent.did }) if (!profile) return false return profile diff --git a/tauri-app/src/utils/protocols/defns.ts b/tauri-app/src/utils/protocols/defns.ts index 3a26bbd..0614789 100644 --- a/tauri-app/src/utils/protocols/defns.ts +++ b/tauri-app/src/utils/protocols/defns.ts @@ -1 +1 @@ -export const url = "https://dschema.org/v0.0.10a" as const +export const url = "https://dschema.org/v0.0.10b" as const diff --git a/tauri-app/src/utils/protocols/user.ts b/tauri-app/src/utils/protocols/user.ts index 7f63622..0fd726f 100644 --- a/tauri-app/src/utils/protocols/user.ts +++ b/tauri-app/src/utils/protocols/user.ts @@ -30,6 +30,7 @@ const UserDetailsProtocol = { export namespace Record { export type Details = { + did: string firstName: string lastName: string profilePictureId: string From f09be33892f5d96a86e2d61f380aa7778c052632 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Sun, 7 Jan 2024 13:28:15 +0000 Subject: [PATCH 091/124] added guard to the remedies page --- tauri-app/src/App.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index fd55a1b..02ae5d6 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -25,7 +25,13 @@ const router = createHashRouter([ ) }, { path: "/connect", element: }, - { path: "/remedies", element: }, + { + path: "/remedies", element: ( + }> + + + ) + }, { path: "/contact", element: }, { path: "/chat", element: }, ], From 42a729136a95767d52a98c04e26ef24de4d5f9d6 Mon Sep 17 00:00:00 2001 From: koko_codes <58889001+EnebeliEmmanuel@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:59:08 +0100 Subject: [PATCH 092/124] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1d306c8..c0625bb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Pulsepal-MVP 🌟 +# PulsePal-MVP 🌟 -## Welcome to the Pulsepal MVP repository +## Welcome to the PulsePal MVP repository

      site @@ -137,7 +137,7 @@ This Project was created by these awesome dedicated members

      -> ## What's next for Pulsepal +> ## What's next for PulsePal - Personalized Health Insights: "Our plan includes integrating AI-driven analytics to offer personalized health insights, assessing individual health risks and predicting future health trends based on users' medical records." @@ -166,4 +166,4 @@ Before adding a pull request, please note: All **`suggestions`** are welcome! # -> ##### README Created by `Enebeli Emmanuel` for Pulsepal +> ##### README Created by `Enebeli Emmanuel` for PulsePal From 402d66ccee7417a3b8bf1521291c3d95ef82ec69 Mon Sep 17 00:00:00 2001 From: coder12git Date: Sun, 7 Jan 2024 21:37:51 +0530 Subject: [PATCH 093/124] added toast for alert and fix slice in record for text Signed-off-by: coder12git --- tauri-app/src/components/Card/index.tsx | 2 +- tauri-app/src/pages/chat.tsx | 6 +++++- tauri-app/src/pages/remedy.tsx | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/components/Card/index.tsx b/tauri-app/src/components/Card/index.tsx index 994dabd..c1b8abf 100644 --- a/tauri-app/src/components/Card/index.tsx +++ b/tauri-app/src/components/Card/index.tsx @@ -48,7 +48,7 @@ const index: FC = ({

      {title ? title : file_name}

      -

      {desc.slice(0, 150)}

      +

      {desc.substring(0, 50) + "..."}

      {date} diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index fbd5444..7ac018d 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -273,6 +273,10 @@ export default function Home() { }; return ( -
      +
      +

      {myDid}

      + + +
      ); } \ No newline at end of file diff --git a/tauri-app/src/pages/remedy.tsx b/tauri-app/src/pages/remedy.tsx index eb39b90..ac456cf 100644 --- a/tauri-app/src/pages/remedy.tsx +++ b/tauri-app/src/pages/remedy.tsx @@ -1,6 +1,7 @@ import { FunctionComponent, useEffect, useRef, useState } from "react"; import useWeb5Store, { schemaOrgProtocolDefinition } from "@/stores/useWeb5Store"; import { useRemedies } from "@/stores/useRemedy"; +import toast from "react-hot-toast"; import Remedies from './Remedies'; const cards = [ @@ -76,10 +77,10 @@ const Remedy: FunctionComponent = () => { console.log(res) if (res) { - alert(`Remedy record saved: ${res}`) + toast.success('Successfully created remedy!') } else { - alert("Failed to save record") + toast.error('Failed to create remedy!') console.error(); } } From 0ea5c26ae74d86daacf6233a01c7b2983230f74a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Sun, 7 Jan 2024 23:06:29 +0100 Subject: [PATCH 094/124] partially done awating reviews --- tauri-app/package.json | 1 + tauri-app/src/App.tsx | 5 +- tauri-app/src/components/Chat/index.css | 2 +- tauri-app/src/components/MobileChat/index.css | 101 ++++++++++++ tauri-app/src/components/MobileChat/index.tsx | 70 +++++++++ tauri-app/src/components/Navbar/index.css | 31 ++++ tauri-app/src/components/Navbar/index.tsx | 41 +++-- .../src/components/UserFriendList/index.css | 19 ++- .../src/components/UserFriendList/index.tsx | 12 +- .../components/UserMobileFriendList/index.css | 69 +++++++++ .../components/UserMobileFriendList/index.tsx | 79 ++++++++++ .../components/UserMobileProfile/index.css | 53 +++++++ .../components/UserMobileProfile/index.tsx | 42 +++++ tauri-app/src/index.css | 2 +- tauri-app/src/pages/Chat/index.css | 21 ++- tauri-app/src/pages/Chat/index.tsx | 54 ++++++- tauri-app/src/pages/Home/SignUpForm.tsx | 89 ++++++----- tauri-app/src/pages/Home/index.tsx | 11 +- tauri-app/src/pages/Records/index.css | 44 ++++++ tauri-app/src/pages/Records/index.tsx | 98 ++++++++---- tauri-app/src/pages/Remedies/index.tsx | 31 +++- tauri-app/src/stores/profile.ts | 146 ++++++++++-------- 22 files changed, 846 insertions(+), 175 deletions(-) create mode 100644 tauri-app/src/components/MobileChat/index.css create mode 100644 tauri-app/src/components/MobileChat/index.tsx create mode 100644 tauri-app/src/components/UserMobileFriendList/index.css create mode 100644 tauri-app/src/components/UserMobileFriendList/index.tsx create mode 100644 tauri-app/src/components/UserMobileProfile/index.css create mode 100644 tauri-app/src/components/UserMobileProfile/index.tsx diff --git a/tauri-app/package.json b/tauri-app/package.json index 63472a0..f90ccef 100644 --- a/tauri-app/package.json +++ b/tauri-app/package.json @@ -34,6 +34,7 @@ "react-pdf": "^7.6.0", "react-router-dom": "^6.21.1", "react-spinners": "^0.13.8", + "react-toastify": "^9.1.3", "react-virtualized-auto-sizer": "^1.0.20", "react-window": "^1.8.10", "tailwind-merge": "^2.1.0", diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index fd55a1b..5b8ba6c 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -18,11 +18,12 @@ const router = createHashRouter([ children: [ { path: "/", element: }, { - path: "/records", element: ( + path: "/records", + element: ( }> - ) + ), }, { path: "/connect", element: }, { path: "/remedies", element: }, diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index a5a6d6c..4ecba23 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -64,7 +64,7 @@ .chats-container::-webkit-scrollbar-thumb { width: 2px; background: var(--color-blue); - border-radius: 5px; + border-radius: 0 5px 5px 0; margin: 0 3px; } diff --git a/tauri-app/src/components/MobileChat/index.css b/tauri-app/src/components/MobileChat/index.css new file mode 100644 index 0000000..3113d50 --- /dev/null +++ b/tauri-app/src/components/MobileChat/index.css @@ -0,0 +1,101 @@ +.m-chat-m-container { + width: 320px; + height: 440px; + background: var(--color-white); + border-radius: 15px; + padding: 8px; +} + +.m-chat-component-container { + box-shadow: var(--box-shadow-black); + border-radius: 15px; + padding: 20px; + width: 80%; + height: 100%; + min-height: 500px; +} + +.m-chat-message-input-container { + width: 100%; + padding: 15px 0px; + display: flex; + justify-content: space-around; + align-items: center; +} + +.m-chat-message-input-container input { + width: 65%; + padding: 8px 5px; + background: var(--color-slate-accent); + border: none; + border-radius: 25px; + outline: none; + font-family: "Roboto"; + font-size: 20px; + text-indent: 8px; +} + +.m-chat-message-input-container button { + width: 40px; + height: 40px; + border: none; + border-radius: 50%; + color: var(--color-white); + background: var(--color-blue); + box-shadow: var(--box-shadow-blue); + font-size: 20px; + outline: none; +} + +.m-chats-container { + width: 90%; + background: var(--color-light-grey); + padding: 12px; + border-radius: 15px 5px 5px 15px; + margin: 0 auto; + overflow-y: scroll; + overflow-x: hidden; + height: 350px; +} + +.m-chats-container::-webkit-scrollbar { + width: 6px; +} + +.m-chats-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 0 15px 15px 0; + transform: translateX(-4px); +} + +.m-chats-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 0 5px 5px 0; + margin: 0 3px; +} + +.msg-container { + width: 100%; + margin: 25px 2px; +} + +.msg-f { + width: max-content; + background: var(--color-light-green); + font-family: "Open Sans"; + padding: 4px 10px; + border-radius: 8px 8px 8px 0px; + margin-right: auto; + max-width: 200px; +} + +.msg-t { + width: max-content; + background: var(--color-light-blue); + font-family: "Open Sans"; + padding: 4px 10px; + border-radius: 8px 8px 0px 8px; + margin-left: auto; + max-width: 200px; +} diff --git a/tauri-app/src/components/MobileChat/index.tsx b/tauri-app/src/components/MobileChat/index.tsx new file mode 100644 index 0000000..b462dc6 --- /dev/null +++ b/tauri-app/src/components/MobileChat/index.tsx @@ -0,0 +1,70 @@ +import "./index.css"; +import React, { FC } from "react"; + +interface MessageProp { + message: string; + isLeft: boolean; +} + +const Message: FC = ({ message, isLeft }) => { + return ( +
      +
      +

      {message}

      +
      +
      + ); +}; + +const index: FC = ({ setHideChat, hideChat }) => { + return ( +
      +
      + + + + + + +
      +
      + + + +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index b433b8d..0227c4f 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -104,6 +104,37 @@ margin-left: 10px; } +.did-container { + width: 200px; + height: 150px; + background: var(--color-white); + box-shadow: var(--box-shadow-black); + position: absolute; + top: 100px; + right: 45px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 8px; + border-radius: 5px; +} + +.did-container .auth_container { + background: var(--color-red); + box-shadow: var(--box-shadow-red); +} + +.did-container input { + background: var(--color-slate-accent); + border-radius: 5px; + border: none; + font-family: "Roboto"; + outline: none; + padding: 8px 4px; + margin: 14px 0px; +} + @media (max-width: 750px) { .main_navbar_container { padding: 15px 25px; diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index 7482576..a6b8649 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -4,23 +4,28 @@ import { NavLink } from "react-router-dom"; import useWeb5Store from "@/stores/useWeb5Store.ts"; import { Agent } from "../Auth/types"; import { useProfile } from "@/stores/profile.ts"; +import { useState } from "react"; const index = () => { - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5, did: state.did })); - const { signIn, setShowAuthModal, signOut } = useProfile(state => ({ + const { web5, did } = useWeb5Store((state) => ({ + web5: state.web5, + did: state.did, + })); + const { signIn, setShowAuthModal, signOut } = useProfile((state) => ({ signIn: state.signIn, signOut: state.signOut, - setShowAuthModal: state.setShowAuthModal - })) + setShowAuthModal: state.setShowAuthModal, + })); const beginAuthFlow = async (agent: Agent) => { - const signedIn = await signIn(agent) + const signedIn = await signIn(agent); if (!signedIn) { - console.log("displaying auth modal") - setShowAuthModal(true) + console.log("displaying auth modal"); + setShowAuthModal(true); } - } + }; + const [showSignOutUtils, setShowSignOutUtils] = useState(false); return (
      @@ -67,18 +72,32 @@ const index = () => { } > + {showSignOutUtils && ( +
      +
      + DID: + +
      + +
      + )} + diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css index 9082926..9fe13c0 100644 --- a/tauri-app/src/components/UserFriendList/index.css +++ b/tauri-app/src/components/UserFriendList/index.css @@ -20,6 +20,22 @@ border-radius: 5px; } +.friend-tag-container span { + font-family: "Roboto"; + background: var(--color-red); + border-radius: 3px; + padding: 2px 3px; + color: var(--color-white); + border: 2px solid var(--color-white); + border-radius: 8px; + + font-size: 8px; + position: relative; + left: -5px; + width: 20px; + height: 20px; +} + .friends-list-container hr { width: 60%; margin: 0 auto; @@ -42,7 +58,6 @@ } .friends-list-header { - background: var(--color-blue); padding: 8px 12px; border-radius: 10px; color: var(--color-white); @@ -52,7 +67,7 @@ .friend-main-list-container { overflow-y: scroll; - height: 300px; + height: 250px; margin: 15px 0; padding: 5px; } diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index 38833b0..210ade9 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -5,16 +5,21 @@ interface FriendTagProp { friendProfileImg: string; friendName: string; isFriendOnline: boolean; + newChat?: number; } const FriendTag: FC = ({ friendProfileImg, friendName, isFriendOnline, + newChat, }) => { return (
      - +
      + + {newChat && {newChat}} +

      {friendName.slice(0, 6) + "..."}

      = ({ interface UserFriendListProp { friendList: FriendTagProp[]; + setHideChat: () => void; + hideChat: boolean; } -const index: FC = ({ friendList }) => { +const index: FC = ({ friendList, setHideChat, hideChat }) => { return (
      @@ -46,6 +53,7 @@ const index: FC = ({ friendList }) => { friendProfileImg={friend.profile_pic} isFriendOnline={friend.isOnline} friendName={friend.username} + newChat={friend.newChat} />
      diff --git a/tauri-app/src/components/UserMobileFriendList/index.css b/tauri-app/src/components/UserMobileFriendList/index.css new file mode 100644 index 0000000..68bbd6e --- /dev/null +++ b/tauri-app/src/components/UserMobileFriendList/index.css @@ -0,0 +1,69 @@ +.m-friend-tag-container { + display: flex; + justify-content: space-around; + align-items: center; + border-radius: 15px; + padding: 2px 8px; + transition: 0.3s; + margin: 15px 20px; + background: var(--color-slate-accent); + box-shadow: var(--box-shadow-black); + height: 80px; +} + +.m-friend-tag-container h1 { + font-size: 15px; + font-family: "Roboto"; +} + +.m-friend-tag-container img { + width: 60px; + height: 60px; + border-radius: 50%; +} + +.m-friend-tag-container span { + font-family: "Roboto"; + background: var(--color-red); + border-radius: 3px; + padding: 2px 3px; + color: var(--color-white); + border: 2px solid var(--color-white); + border-radius: 8px; + font-size: 8px; + position: relative; + left: -15px; + top: -4px; + width: 40px; + height: 40px; +} + +.m-friends-list-container hr { + width: 80%; + margin: 0 auto; +} + +.m-friends-list-container hr:last-child { + display: none; +} + +.m-friends-list-container { + border-radius: 15px; +} + +.m-friends-list-header { + padding: var(--padding-mobile); + font-family: "Roboto"; + text-align: left; +} + +.m-friend-main-list-container { + overflow: hidden; +} + +.m-header { + background: var(--color-blue); + color: var(--color-white); + font-family: "Roboto"; + padding: 8px 25px; +} diff --git a/tauri-app/src/components/UserMobileFriendList/index.tsx b/tauri-app/src/components/UserMobileFriendList/index.tsx new file mode 100644 index 0000000..2d22492 --- /dev/null +++ b/tauri-app/src/components/UserMobileFriendList/index.tsx @@ -0,0 +1,79 @@ +import "./index.css"; +import React, { FC, useState } from "react"; + +interface FriendTagProp { + friendProfileImg: string; + friendName: string; + isFriendOnline: boolean; + newChat?: number; + setHideChat: () => void; + hideChat: boolean; +} + +interface UserFriendListProp { + friendList: FriendTagProp[]; +} + +const FriendTag: FC = ({ + friendProfileImg, + friendName, + isFriendOnline, + newChat, + setHideChat, + hideChat, +}) => { + return ( +
      setHideChat(!hideChat)} + className="m-friend-tag-container" + > +
      + + {newChat && {newChat}} +
      +
      +

      {friendName.slice(0, 20) + "..."}

      +
      + +
      + ); +}; + +const index: FC = ({ + friendList, + hideChat, + setHideChat, +}) => { + return ( +
      +
      +

      Friends

      +
      +
      + {friendList.map((friend) => { + return ( + <> + + + ); + })} +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserMobileProfile/index.css b/tauri-app/src/components/UserMobileProfile/index.css new file mode 100644 index 0000000..2704664 --- /dev/null +++ b/tauri-app/src/components/UserMobileProfile/index.css @@ -0,0 +1,53 @@ +.m-userprofile-container { + box-shadow: var(--box-shadow-black); + text-align: center; + position: relative; + padding-bottom: 15px; +} + +.m-userprofile-info-container img { + width: 80px; + height: 80px; + border-radius: 50%; + background: var(--color-white); + padding: 10px; + position: absolute; + top: 80px; + right: 20px; +} + +.m-userprofile-info-container p { + font-family: "Open Sans"; + margin-top: 50px; +} + +.m-cover-container { + height: 130px; + width: auto; + text-align: left; + padding-right: 6px; +} + +.m-cover-container h3 { + color: var(--color-white); + font-family: "Roboto"; + font-size: 18px; + position: relative; + left: 6px; + top: 10px; +} + +.m-cover-container p { + color: var(--color-white); + font-family: "Open Sans"; + font-size: 14px; + position: relative; + left: 6px; + top: 25px; +} + +@media (max-width: 750px) { + .m-userprofile-container { + width: auto; + } +} diff --git a/tauri-app/src/components/UserMobileProfile/index.tsx b/tauri-app/src/components/UserMobileProfile/index.tsx new file mode 100644 index 0000000..e25db19 --- /dev/null +++ b/tauri-app/src/components/UserMobileProfile/index.tsx @@ -0,0 +1,42 @@ +import React, { FC } from "react"; + +import "./index.css"; + +interface UserProfileProps { + username: String; + profile_pic: String; + cover_pic: String; + about_user: String; + friends: Number; +} +const index: FC = ({ + username, + profile_pic, + cover_pic, + about_user, + friends, +}) => { + return ( +
      +
      +

      @{username}

      +

      + Friends | {friends} +

      +
      +
      + +

      {about_user}

      +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/index.css b/tauri-app/src/index.css index 5bfae8d..1696928 100644 --- a/tauri-app/src/index.css +++ b/tauri-app/src/index.css @@ -5,7 +5,7 @@ --box-shadow-red: 0 5px 12px rgba(239, 68, 68, 0.5); --color-blue: #0ea5e9; --box-shadow-blue: 0 5px 12px rgba(14, 165, 233, 0.3); - --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.2); + --box-shadow-black: 0 3px 12px rgba(0, 0, 0, 0.1); --color-slate-accent: #f1f5f9; --color-white: #fff; --color-black: #000; diff --git a/tauri-app/src/pages/Chat/index.css b/tauri-app/src/pages/Chat/index.css index 4632a88..866178c 100644 --- a/tauri-app/src/pages/Chat/index.css +++ b/tauri-app/src/pages/Chat/index.css @@ -1,14 +1,14 @@ .main-chat-container { padding: var(--padding-desktop); display: flex; - justify-content: space-between; + justify-content: space-around; align-items: flex-start; position: relative; max-height: 100%; } .utils-container { - width: 30%; + width: 25%; } .chat-container { @@ -16,8 +16,17 @@ height: 100%; } -@media (max-width: 750px) { - .main-chat-container { - padding: var(--padding-mobile); - } +.data-container { + background: rgba(0, 0, 0, 0.3); + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 7; } + +@media (max-width: 750px) {} diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 560826e..307e28b 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,18 +1,64 @@ import "./index.css"; import UserProfile from "../../components/UserProfile/"; import UserFriendList from "../../components/UserFriendList/"; + import Chat from "../../components/Chat/"; -import { useState } from "react"; +import UserMobileProfile from "../../components/UserMobileProfile/"; +import UserMobileFriendList from "../../components/UserMobileFriendList/"; +import MobileChat from "../../components/MobileChat"; + +import { useEffect, useState } from "react"; const index = () => { const [friends, setFriends] = useState([ { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false }, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false }, - { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false }, + { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1 }, + { + profile_pic: "/pm.jpg", + username: "@gregidd", + isOnline: true, + newChat: 7, + }, + { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 }, ]); + const [isMobile, setIsMobile] = useState(false); + const [hideChat, setHideChat] = useState(false); + + useEffect(() => { + if (window.innerWidth < 750) { + setIsMobile(true); + return; + } + + setIsMobile(false); + }, []); + if (isMobile) { + return ( +
      + + + {hideChat && ( +
      + +
      + )} +
      + ); + } return (
      diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 68a1fe6..95e7547 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -3,9 +3,9 @@ import useWeb5Store from "@/stores/useWeb5Store"; import { useProfile } from "@/stores/profile"; import { Agent } from "@/components/Auth/types"; import { FunctionComponent, useRef, useState } from "react"; -import { z } from "zod" -import { zodResolver } from "@hookform/resolvers/zod" -import { useForm } from "react-hook-form" +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; import toast from "react-hot-toast"; import { CreatePayload } from "@/utils/user"; @@ -13,14 +13,16 @@ const formSchema = z.object({ firstName: z.string().min(1), lastName: z.string().min(1), description: z.string().min(1), - profilePicture: z.instanceof(File) -}) + profilePicture: z.instanceof(File), +}); interface FileProp { file: File | null | undefined; } -const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> = ({ onChange }) => { +const FileUploader: FunctionComponent<{ + onChange: (file: File | null) => void; +}> = ({ onChange }) => { const [file, setFile] = useState({ file: null }); return ( @@ -29,8 +31,8 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }>
      { - const file = e?.target?.files?.[0] - onChange(file ? file : null) + const file = e?.target?.files?.[0]; + onChange(file ? file : null); setFile({ file: e?.target?.files?.[0] }); }} type="file" @@ -41,58 +43,64 @@ const FileUploader: FunctionComponent<{ onChange: (file: File | null) => void }> }; export default function SignUpForm() { - console.log("kfjle") - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); + console.log("kfjle"); + const { web5, did } = useWeb5Store((state) => ({ + web5: state.web5!, + did: state.did!, + })); const submitBtnRef = useRef(null); - const { setShowAuthModal, signUp, signIn } = useProfile( - (state) => ({ signUp: state.signUp, signIn: state.signIn, setShowAuthModal: state.setShowAuthModal }), - ); + const { setShowAuthModal, signUp, signIn } = useProfile((state) => ({ + signUp: state.signUp, + signIn: state.signIn, + setShowAuthModal: state.setShowAuthModal, + })); const form = useForm>({ - resolver: zodResolver(formSchema) - }) + resolver: zodResolver(formSchema), + }); form.watch((value) => { - if (!submitBtnRef.current) return + if (!submitBtnRef.current) return; - const isValid = formSchema.safeParse(value).success + const isValid = formSchema.safeParse(value).success; if (isValid) { - submitBtnRef.current.classList.remove("not-filled-btn") - submitBtnRef.current.classList.add("filled-btn") - submitBtnRef.current.disabled = false - } - else { - submitBtnRef.current.classList.add("not-filled-btn") - submitBtnRef.current.classList.remove("filled-btn") - submitBtnRef.current.disabled = true + submitBtnRef.current.classList.remove("not-filled-btn"); + submitBtnRef.current.classList.add("filled-btn"); + submitBtnRef.current.disabled = false; + } else { + submitBtnRef.current.classList.add("not-filled-btn"); + submitBtnRef.current.classList.remove("filled-btn"); + submitBtnRef.current.disabled = true; } - }) + }); const createProfile = async (agent: Agent, payload: CreatePayload) => { - const hasSignedUpSuccessfully = await signUp(agent, payload) + const hasSignedUpSuccessfully = await signUp(agent, payload); if (!hasSignedUpSuccessfully) { - toast.error('Sorry an error occurred!') - return + toast.error("Sorry an error occurred!"); + return; } - if (!await signIn(agent)) return - - toast.success('Successfully signed up!') + if (!(await signIn(agent))) return; + toast.success("Successfully signed up!"); - setShowAuthModal(false) - } + setShowAuthModal(false); + }; const onSubmit = (value: z.infer) => { - if (web5 && did) createProfile({ web5, did }, value) - } + if (web5 && did) createProfile({ web5, did }, value); + }; return ( -
      -
      +
      setShowAuthModal(false)}> + e.stopPropagation()} + onSubmit={form.handleSubmit(onSubmit)} + > form.setValue("profilePicture", file as File)} /> @@ -124,6 +132,5 @@ export default function SignUpForm() {
      - ) + ); } - diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 867031f..6e99dae 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -4,7 +4,7 @@ import SignUpForm from "./SignUpForm"; import AuthGuard from "@/components/Auth/Guard"; export default function HomePage() { - const showAuthModal = useProfile(state => state.showAuthModal); + const showAuthModal = useProfile((state) => state.showAuthModal); return ( <> @@ -219,13 +219,8 @@ export default function HomePage() {
      - {showAuthModal && ( - - {console.log("fjekkfle") || null} - - - )} -
      + {showAuthModal && } +
      ); } diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css index f1bf303..fc6c53d 100644 --- a/tauri-app/src/pages/Records/index.css +++ b/tauri-app/src/pages/Records/index.css @@ -70,6 +70,50 @@ position: relative; } +.no-records { + font-family: "Open Sans"; +} + +.connect-wallet-container { + width: 300px; + height: 200px; + background: var(--color-white); + border-radius: 15px; + padding: 18px 8px; + text-align: center; +} + +.connect-wallet-container h1 { + font-family: "Roboto"; + font-size: 25px; + margin-top: 30px; +} + +.connect-wallet-container button { + padding: 8px 20px; + border-radius: 8px; + background: var(--color-green); + box-shadow: var(--box-shadow-green); + color: var(--color-white); + font-family: "Roboto"; + cursor: pointer; + font-weight: 800; + border: none; + min-width: 180px; + font-size: 25px; + text-align: center; + margin-top: 40px; + outline: none; +} + +.connect-wallet-container button i { + background: var(--color-white); + padding: 10px 12px; + border-radius: 50%; + color: var(--color-black); + margin-left: 10px; +} + @media (max-width: 750px) { .main-records-container { padding: var(--padding-mobile); diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 6a3c4ef..5d53c6f 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -9,32 +9,46 @@ import Card from "../../components/Card"; import { useProfile } from "@/stores/profile"; import useWeb5Store from "@/stores/useWeb5Store"; import { CardData, fetchRecords } from "./utils"; +import toast, { Toaster } from "react-hot-toast"; const index = () => { - const agent = useWeb5Store(state => ({ web5: state.web5!, did: state.did! })) - const profile = useProfile(state => state.state.profile!) + const agent = useWeb5Store((state) => ({ + web5: state.web5!, + did: state.did!, + })); + const profile = useProfile((state) => state.state.profile!); + const isSignedIn = useProfile((state) => state.state.isSignedIn); + const [showConnectWalletComponent, setShowConnectWalletComponent] = + useState(false); const [cardsData, setCardsData] = useState([]); useEffect(() => { - refetchRecords() - }, []) + refetchRecords(); + }, []); const refetchRecords = async () => { - const records = await fetchRecords(agent, profile) - console.log('records:', records) + const records = await fetchRecords(agent, profile); + console.log("records:", records); - if (!records) return + if (!records) return; - setCardsData(records) + setCardsData(records); - return - } + return; + }; const [isAddCardActive, setIsAddCardActive] = useState(false); const [isCardDetailActive, setIsCardDetailActive] = useState(false); const [activeCard, setActiveCard] = useState(null); + const SignedInCheck = () => { + if (isSignedIn) { + setIsAddCardActive(!isAddCardActive); + } else { + setShowConnectWalletComponent(true); + } + }; // @ts-ignore const isCardClicked = (cardDetail) => { setIsCardDetailActive(!isCardDetailActive); @@ -50,24 +64,28 @@ const index = () => { className={ !isAddCardActive ? "add-records-btn" : "close-add-records-btn" } - onClick={() => setIsAddCardActive(!isAddCardActive)} + onClick={() => SignedInCheck()} >
      - {cardsData.length > 0 ? cardsData.map((card) => { - return ( - - ); - }) :
      No Records Found
      } + {cardsData.length > 0 ? ( + cardsData.map((card) => { + return ( + + ); + }) + ) : ( +
      No Records Found
      + )}
      {(isAddCardActive || isCardDetailActive) && (
      { style={{ zIndex: `${isCardDetailActive ? "7" : "6"}` }} >
      - {isAddCardActive && { - setIsAddCardActive(false) - refetchRecords() - }} /> - } + {isAddCardActive && ( + { + setIsAddCardActive(false); + refetchRecords(); + }} + /> + )} {isCardDetailActive && ( {
      )} + {showConnectWalletComponent && ( +
      setShowConnectWalletComponent(false)} + className="add-card-container" + > +
      { + e.stopPropagation(); + }} + > +

      Unauthorized - Please Sign in

      + +
      +
      + )}
      ); }; diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index c4ca609..f126edb 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -1,5 +1,6 @@ import "./index.css"; import { useState } from "react"; +import { useProfile } from "@/stores/profile"; import Ratings from "../../components/Ratings"; import RemedyCard from "../../components/RemedyCard/"; @@ -45,6 +46,10 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { }, ]); + const isSignedIn = useProfile((state) => state.state.isSignedIn); + const [showConnectWalletComponent, setShowConnectWalletComponent] = + useState(false); + const [isDetailRemedyActive, setIsDetailRemedyActive] = useState(false); const [activeRemedy, setActiveRemedy] = useState(null); @@ -83,6 +88,13 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { }; const [isAddRemedyActive, setIsAddRemedyActive] = useState(false); + const SignedInCheck = () => { + if (isSignedIn) { + setIsAddRemedyActive(!isAddRemedyActive); + } else { + setShowConnectWalletComponent(true); + } + }; return (
      @@ -92,7 +104,7 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { className={ !isAddRemedyActive ? "add-records-btn" : "close-add-records-btn" } - onClick={() => setIsAddRemedyActive(!isAddRemedyActive)} + onClick={() => SignedInCheck()} >
      @@ -205,6 +217,23 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { />
      )} + + {showConnectWalletComponent && ( +
      setShowConnectWalletComponent(false)} + className="add-remedy-container" + > +
      { + e.stopPropagation(); + }} + > +

      Unauthorized - Please Sign in

      + +
      +
      + )}
      ); }; diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index bce5670..8c3670b 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -1,4 +1,4 @@ -import { create } from "zustand" +import { create } from "zustand"; import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; @@ -6,78 +6,94 @@ import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import DocumentUtils from "@/utils/document"; export type ProfileState = { - id: string + id: string; // username: string - firstName: string, - lastName: string, - profilePictureUrl: string -} + firstName: string; + lastName: string; + profilePictureUrl: string; +}; -type State = { - profile: ProfileState, - isSignedIn: true -} | { - profile: null, - isSignedIn: false -} +type State = + | { + profile: ProfileState; + isSignedIn: true; + } + | { + profile: null; + isSignedIn: false; + }; -type Payload = Omit & { - profilePicture: File -} +type Payload = Omit< + UserDetailsProtocolRecord.Details, + "dateCreated" | "profilePictureUrl" +> & { + profilePicture: File; +}; export const useProfile = create( - combine({ - state: { - profile: null, - isSignedIn: false - } as State, - showAuthModal: false - }, (set, get) => ({ - setShowAuthModal: (showAuthModal: boolean) => { - set({ showAuthModal }) - }, - signOut: () => { - if (get().state.isSignedIn) { - set({ - state: { - isSignedIn: false, - profile: null - } - }) - } + combine( + { + state: { + profile: null, + isSignedIn: false, + } as State, + showAuthModal: false, }, - signIn: async (agent: Agent) => { - const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) - if (!profileRecord) return false - - const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() + (set, get) => ({ + setShowAuthModal: (showAuthModal: boolean) => { + set({ showAuthModal }); + }, + signOut: () => { + if (get().state.isSignedIn) { + set({ + state: { + isSignedIn: false, + profile: null, + }, + }); + } + }, + signIn: async (agent: Agent) => { + const profileRecord = + await UserDetailsUtils.fetchUserDetailsRecord(agent); + if (!profileRecord) return false; - const profilePicture = await DocumentUtils.fetchBlobRecord(agent, profile.profilePictureId) - let profilePictureUrl = "" - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob() - profilePictureUrl = URL.createObjectURL(profilePictureBlob) - } + const profile: UserDetailsProtocolRecord.Details = + await profileRecord.data.json(); - set({ - state: { - isSignedIn: true, - profile: { - id: profileRecord.id, - firstName: profile.firstName, - lastName: profile.lastName, - profilePictureUrl - } + const profilePicture = await DocumentUtils.fetchBlobRecord( + agent, + profile.profilePictureId, + ); + let profilePictureUrl = ""; + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob(); + profilePictureUrl = URL.createObjectURL(profilePictureBlob); } - }) - return true - }, - signUp: async (agent: Agent, payload: CreatePayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, payload) - if (!profile) return false + set({ + state: { + isSignedIn: true, + profile: { + id: profileRecord.id, + firstName: profile.firstName, + lastName: profile.lastName, + profilePictureUrl, + }, + }, + }); - return true - } - })) -) + return true; + }, + signUp: async (agent: Agent, payload: CreatePayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord( + agent, + payload, + ); + if (!profile) return false; + + return true; + }, + }), + ), +); From 99dd61bd10b3ad6a62d10b80e6ec0bf62f343a0c Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 00:29:20 +0100 Subject: [PATCH 095/124] resolved errors --- tauri-app/src/pages/Home/SignUpForm.tsx | 11 +- tauri-app/src/pages/Home/index.tsx | 376 ++++++++++++------------ tauri-app/src/stores/profile.ts | 180 ++++++------ 3 files changed, 281 insertions(+), 286 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 6b3a019..dd58adb 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -43,15 +43,12 @@ const FileUploader: FunctionComponent<{ }; export default function SignUpForm() { -<<<<<<< HEAD console.log("kfjle"); const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did!, })); -======= - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile((state) => ({ signUp: state.signUp, @@ -79,8 +76,8 @@ export default function SignUpForm() { } }); - const createProfile = async (agent: Agent, payload: SignUpPayload) => { - const hasSignedUpSuccessfully = await signUp(agent, payload) + const createProfile = async (agent: Agent, payload: SignUpPayload) => { + const hasSignedUpSuccessfully = await signUp(agent, payload); if (!hasSignedUpSuccessfully) { toast.error("Sorry an error occurred!"); @@ -93,8 +90,6 @@ export default function SignUpForm() { setShowAuthModal(false); }; - setShowAuthModal(false) - } const onSubmit = (value: z.infer) => { if (web5 && did) createProfile({ web5, did }, value); diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index aa0fc24..5e65db7 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -7,219 +7,219 @@ export default function HomePage() { const showAuthModal = useProfile((state) => state.showAuthModal); return ( - <> -
      -
      -
      - - Hi welcome to, - - pulsePal - +
      +
      +
      + + Hi welcome to, + + pulsePal -

      Stay up & running while connected

      +
      +

      Stay up & running while connected

      +

      + Welcome to PulsePal, your health guardian in WEB5. Safely store + medical records with decentralized identifiers and web nodes, + ensuring data security. Connect with similar conditions, share home + remedies with a rating system, and access specialized doctors based + on your location. PulsePal – where advanced technology meets + user-friendly design for your secure, connected health journey. +

      + +
      +
      +
      + + + +
      +

      Major Technologies

      +
      +
      + +

      WEB5

      - Welcome to PulsePal, your health guardian in WEB5. Safely store - medical records with decentralized identifiers and web nodes, - ensuring data security. Connect with similar conditions, share - home remedies with a rating system, and access specialized doctors - based on your location. PulsePal – where advanced technology meets - user-friendly design for your secure, connected health journey. + PulsePal utililizes WEB5 to ensure the immutability of user data + stored making it a breeze to safely store medical data and + records.

      -
      -
      -
      - - - -
      -

      Major Technologies

      -
      -
      - -

      WEB5

      -

      - PulsePal utililizes WEB5 to ensure the immutability of user data - stored making it a breeze to safely store medical data and - records. -

      -
      -
      - -

      A.I

      -

      - PulsePal uses artificial intelligence to aid users with similiar - medical conditions, find matches who can relate with them and - also find doctors/specialist within there regions on such - condition. -

      -
      -
      - -

      React

      -

      - PulsePal employes react a frontend framework to power our - frontend along with typescript enabling better user experience - and smoother and faster development,updates and feature roll - outs giving quality product delivery. -

      -
      +
      + +

      A.I

      +

      + PulsePal uses artificial intelligence to aid users with similiar + medical conditions, find matches who can relate with them and also + find doctors/specialist within there regions on such condition. +

      -
      - - - -
      -
      -
      -

      - "Our Culture" -

      +
      + +

      React

      - A culture where innovation and empathy converge to create - impactful solutions. Team members are driven by a shared - commitment to improving healthcare outcomes through cutting-edge - technology. + PulsePal employes react a frontend framework to power our frontend + along with typescript enabling better user experience and smoother + and faster development,updates and feature roll outs giving + quality product delivery.

      - - - -
      -

      Testimonials

      -
      -
      -
      -
      - -

      Dave

      -
      -
      -

      - PulsePal has being awesome so far making it a breeze - to keep track of my medical history coupled with guidance - have made staying healthy so much more accessible. The - user-friendly interface and helpful home remedies{" "} - keep me on prepared for emergency breakouts.{" "} - Thank you -

      -
      +
      + + + +
      +
      +
      +

      + "Our Culture" +

      +

      + A culture where innovation and empathy converge to create impactful + solutions. Team members are driven by a shared commitment to + improving healthcare outcomes through cutting-edge technology. +

      +
      +
      + + + +
      +

      Testimonials

      +
      +
      +
      +
      + +

      Dave

      -
      -
      - -

      Greg

      -
      -
      -

      - Knowing that blockchain is being used and it's - immutaility makes feel safer from losing such vital records - and there - chat functionality is quite great feel's nice to know - others with the same condition as me.Great job -

      -
      +
      +

      + PulsePal has being awesome so far making it a breeze to + keep track of my medical history coupled with guidance have + made staying healthy so much more accessible. The + user-friendly interface and helpful home remedies keep + me on prepared for emergency breakouts. Thank you +

      -
      +
      - -

      Nikki

      + +

      Greg

      - Using it for quite a while now and it had being nice - especially a beta feature,i heard it can find out what - is wrong with your just from your - finger print it is cool can't wait for the roll - out,talk about a.i in action + Knowing that blockchain is being used and it's + immutaility makes feel safer from losing such vital records + and there + chat functionality is quite great feel's nice to know + others with the same condition as me.Great job

      -
      - - - -
      -

      Major Features

      -
      -
      - -

      Secure Storage

      -

      - Medical records are stored with the utmost security using WEB5, - guaranteeing data integrity and user control over their personal - health information. -

      -
      -
      - -

      Find Your Tribe

      -

      - Our platform goes beyond conventional networking by employing a - sophisticated algorithm to match users based on their medical - records. PulsePal becomes a virtual community where individuals - can share experiences, insights, and support each other on their - health journeys. -

      -
      -
      - -

      Home Remedies

      -

      - PulsePal empowers users to contribute and share simple yet - effective home remedies. A user-driven rating system ensures the - most beneficial remedies rise to the top, creating a - community-driven repository of wellness solutions. -

      +
      +
      + +

      Nikki

      -
      - -

      Find Specialist

      +

      - Wherever you are, PulsePal provides a seamless experience by - recommending specialized doctors in your nearby areas based on - your current location, enhancing accessibility to healthcare - professionals. + Using it for quite a while now and it had being nice especially + a beta feature,i heard it can find out what is wrong with + your just from your + finger print it is cool can't wait for the roll out,talk + about a.i in action

      - {showAuthModal && } - +
      + + + +
      +

      Major Features

      +
      +
      + +

      Secure Storage

      +

      + Medical records are stored with the utmost security using WEB5, + guaranteeing data integrity and user control over their personal + health information. +

      +
      +
      + +

      Find Your Tribe

      +

      + Our platform goes beyond conventional networking by employing a + sophisticated algorithm to match users based on their medical + records. PulsePal becomes a virtual community where individuals + can share experiences, insights, and support each other on their + health journeys. +

      +
      +
      + +

      Home Remedies

      +

      + PulsePal empowers users to contribute and share simple yet + effective home remedies. A user-driven rating system ensures the + most beneficial remedies rise to the top, creating a + community-driven repository of wellness solutions. +

      +
      +
      + +

      Find Specialist

      +

      + Wherever you are, PulsePal provides a seamless experience by + recommending specialized doctors in your nearby areas based on + your current location, enhancing accessibility to healthcare + professionals. +

      +
      +
      +
      + {showAuthModal && ( + + + + )} +
      ); } diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 551144c..069f337 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -4,9 +4,8 @@ import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; -import { Record as Web5Record } from "@web5/api/browser" +import { Record as Web5Record } from "@web5/api/browser"; -<<<<<<< HEAD export type ProfileState = { id: string; // username: string @@ -32,24 +31,28 @@ type Payload = Omit< profilePicture: File; }; -export type SignUpPayload = Omit +export type SignUpPayload = Omit; -export type ProfileState = Omit & -{ - id: string +export type ProfileState = Omit< + UserDetailsProtocolRecord.Details, + "profilePictureId" +> & { + id: string; // username: string - profilePictureUrl: string -} - -type State = { - profile: ProfileState, - isSignedIn: true - record: Web5Record -} | { - profile: null, - record: null, - isSignedIn: false -} + profilePictureUrl: string; +}; + +type State = + | { + profile: ProfileState; + isSignedIn: true; + record: Web5Record; + } + | { + profile: null; + record: null; + isSignedIn: false; + }; export const useProfile = create( combine( @@ -94,7 +97,6 @@ export const useProfile = create( set({ state: { -<<<<<<< HEAD isSignedIn: true, profile: { id: profileRecord.id, @@ -104,18 +106,11 @@ export const useProfile = create( }, }, }); -======= - isSignedIn: false, - record: null, - profile: null - } - }) - } - }, - signIn: async (agent: Agent) => { - const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) - if (!profileRecord) return false ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + }, + signIn: async (agent: Agent) => { + const profileRecord = + await UserDetailsUtils.fetchUserDetailsRecord(agent); + if (!profileRecord) return false; return true; }, @@ -126,67 +121,72 @@ export const useProfile = create( ); if (!profile) return false; -<<<<<<< HEAD return true; - }, - }), - ), -); -======= - const profilePicture = await BlobUtils.fetchBlobRecord(agent, { recordId: profile.profilePictureId }) - let profilePictureUrl = "" - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob() - profilePictureUrl = URL.createObjectURL(profilePictureBlob) - } - - set({ - state: { - isSignedIn: true, - record: profileRecord, - profile: { - ...profile, - id: profileRecord.id, - profilePictureUrl - } - } - }) - return true - }, - addCondition: async (agent: Agent, condition: string) => { - const state = get().state - if (!state.isSignedIn) return false - - const { profilePictureUrl, ...payload } = state.profile - if (payload.conditions.indexOf(condition) < -1) return - - payload.conditions.push(condition) - - const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord(agent, state.record, payload) - if (!updatedRecord) return false - const profile = await updatedRecord.data.json() - - set({ - state: { - isSignedIn: true, - record: updatedRecord, - profile: { - ...profile, - id: updatedRecord.id, - profilePictureUrl - } + const profilePicture = await BlobUtils.fetchBlobRecord(agent, { + recordId: profile.profilePictureId, + }); + let profilePictureUrl = ""; + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob(); + profilePictureUrl = URL.createObjectURL(profilePictureBlob); } - }) - return updatedRecord - }, - signUp: async (agent: Agent, payload: SignUpPayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [], did: agent.did }) - if (!profile) return false + set({ + state: { + isSignedIn: true, + record: profileRecord, + profile: { + ...profile, + id: profileRecord.id, + profilePictureUrl, + }, + }, + }); - return profile - } - })) -) ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + return true; + }, + addCondition: async (agent: Agent, condition: string) => { + const state = get().state; + if (!state.isSignedIn) return false; + + const { profilePictureUrl, ...payload } = state.profile; + if (payload.conditions.indexOf(condition) < -1) return; + + payload.conditions.push(condition); + + const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord( + agent, + state.record, + payload, + ); + if (!updatedRecord) return false; + const profile = await updatedRecord.data.json(); + + set({ + state: { + isSignedIn: true, + record: updatedRecord, + profile: { + ...profile, + id: updatedRecord.id, + profilePictureUrl, + }, + }, + }); + + return updatedRecord; + }, + signUp: async (agent: Agent, payload: SignUpPayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { + ...payload, + conditions: [], + did: agent.did, + }); + if (!profile) return false; + + return profile; + }, + }), + ), +); From 8beb0b5fe663506ce7d2a9ac82cb09f388b32d3e Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 01:18:13 +0100 Subject: [PATCH 096/124] minor bugs fixed --- tauri-app/src/App.tsx | 5 ----- tauri-app/src/components/Chat/index.css | 4 ++-- tauri-app/src/components/Navbar/index.tsx | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index e924f54..ced8e50 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; -import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -20,17 +19,13 @@ const router = createHashRouter([ { path: "/records", element: ( - }> - ), }, { path: "/connect", element: }, { path: "/remedies", element: ( - }> - ) }, { path: "/contact", element: }, diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index 4ecba23..dd76343 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -80,7 +80,7 @@ padding: 4px 10px; border-radius: 8px 8px 8px 0px; margin-right: auto; - max-width: 400px; + max-width: 600px; } .msg-t { @@ -90,5 +90,5 @@ padding: 4px 10px; border-radius: 8px 8px 0px 8px; margin-left: auto; - max-width: 400px; + max-width: 600px; } diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index a6b8649..c0d7567 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -72,7 +72,7 @@ const index = () => { + + +
      From 087f38d6bcba4c770739ad3c7f881329adcd81e4 Mon Sep 17 00:00:00 2001 From: koko_codes <58889001+EnebeliEmmanuel@users.noreply.github.com> Date: Mon, 8 Jan 2024 01:35:18 +0100 Subject: [PATCH 099/124] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c0625bb..0d7151e 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ npm run dev ## Explainer video (User POV) +https://github.com/coder12git/Web5-Hack/assets/58889001/b5c4aa11-426c-492b-88fb-37425991ab47 ## Demo Video (Clients POV) From cb67de2089f3b58efc21dc911a19651a99c91346 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 00:29:20 +0100 Subject: [PATCH 100/124] resolved errors --- tauri-app/src/pages/Home/SignUpForm.tsx | 11 +- tauri-app/src/pages/Home/index.tsx | 376 ++++++++++++------------ 2 files changed, 191 insertions(+), 196 deletions(-) diff --git a/tauri-app/src/pages/Home/SignUpForm.tsx b/tauri-app/src/pages/Home/SignUpForm.tsx index 6b3a019..dd58adb 100644 --- a/tauri-app/src/pages/Home/SignUpForm.tsx +++ b/tauri-app/src/pages/Home/SignUpForm.tsx @@ -43,15 +43,12 @@ const FileUploader: FunctionComponent<{ }; export default function SignUpForm() { -<<<<<<< HEAD console.log("kfjle"); const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did!, })); -======= - const { web5, did } = useWeb5Store((state) => ({ web5: state.web5!, did: state.did! })); ->>>>>>> 402d66ccee7417a3b8bf1521291c3d95ef82ec69 + const submitBtnRef = useRef(null); const { setShowAuthModal, signUp, signIn } = useProfile((state) => ({ signUp: state.signUp, @@ -79,8 +76,8 @@ export default function SignUpForm() { } }); - const createProfile = async (agent: Agent, payload: SignUpPayload) => { - const hasSignedUpSuccessfully = await signUp(agent, payload) + const createProfile = async (agent: Agent, payload: SignUpPayload) => { + const hasSignedUpSuccessfully = await signUp(agent, payload); if (!hasSignedUpSuccessfully) { toast.error("Sorry an error occurred!"); @@ -93,8 +90,6 @@ export default function SignUpForm() { setShowAuthModal(false); }; - setShowAuthModal(false) - } const onSubmit = (value: z.infer) => { if (web5 && did) createProfile({ web5, did }, value); diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index aa0fc24..5e65db7 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -7,219 +7,219 @@ export default function HomePage() { const showAuthModal = useProfile((state) => state.showAuthModal); return ( - <> -
      -
      -
      - - Hi welcome to, - - pulsePal - +
      +
      +
      + + Hi welcome to, + + pulsePal -

      Stay up & running while connected

      +
      +

      Stay up & running while connected

      +

      + Welcome to PulsePal, your health guardian in WEB5. Safely store + medical records with decentralized identifiers and web nodes, + ensuring data security. Connect with similar conditions, share home + remedies with a rating system, and access specialized doctors based + on your location. PulsePal – where advanced technology meets + user-friendly design for your secure, connected health journey. +

      + +
      +
      +
      + + + +
      +

      Major Technologies

      +
      +
      + +

      WEB5

      - Welcome to PulsePal, your health guardian in WEB5. Safely store - medical records with decentralized identifiers and web nodes, - ensuring data security. Connect with similar conditions, share - home remedies with a rating system, and access specialized doctors - based on your location. PulsePal – where advanced technology meets - user-friendly design for your secure, connected health journey. + PulsePal utililizes WEB5 to ensure the immutability of user data + stored making it a breeze to safely store medical data and + records.

      -
      -
      -
      - - - -
      -

      Major Technologies

      -
      -
      - -

      WEB5

      -

      - PulsePal utililizes WEB5 to ensure the immutability of user data - stored making it a breeze to safely store medical data and - records. -

      -
      -
      - -

      A.I

      -

      - PulsePal uses artificial intelligence to aid users with similiar - medical conditions, find matches who can relate with them and - also find doctors/specialist within there regions on such - condition. -

      -
      -
      - -

      React

      -

      - PulsePal employes react a frontend framework to power our - frontend along with typescript enabling better user experience - and smoother and faster development,updates and feature roll - outs giving quality product delivery. -

      -
      +
      + +

      A.I

      +

      + PulsePal uses artificial intelligence to aid users with similiar + medical conditions, find matches who can relate with them and also + find doctors/specialist within there regions on such condition. +

      -
      - - - -
      -
      -
      -

      - "Our Culture" -

      +
      + +

      React

      - A culture where innovation and empathy converge to create - impactful solutions. Team members are driven by a shared - commitment to improving healthcare outcomes through cutting-edge - technology. + PulsePal employes react a frontend framework to power our frontend + along with typescript enabling better user experience and smoother + and faster development,updates and feature roll outs giving + quality product delivery.

      - - - -
      -

      Testimonials

      -
      -
      -
      -
      - -

      Dave

      -
      -
      -

      - PulsePal has being awesome so far making it a breeze - to keep track of my medical history coupled with guidance - have made staying healthy so much more accessible. The - user-friendly interface and helpful home remedies{" "} - keep me on prepared for emergency breakouts.{" "} - Thank you -

      -
      +
      + + + +
      +
      +
      +

      + "Our Culture" +

      +

      + A culture where innovation and empathy converge to create impactful + solutions. Team members are driven by a shared commitment to + improving healthcare outcomes through cutting-edge technology. +

      +
      +
      + + + +
      +

      Testimonials

      +
      +
      +
      +
      + +

      Dave

      -
      -
      - -

      Greg

      -
      -
      -

      - Knowing that blockchain is being used and it's - immutaility makes feel safer from losing such vital records - and there - chat functionality is quite great feel's nice to know - others with the same condition as me.Great job -

      -
      +
      +

      + PulsePal has being awesome so far making it a breeze to + keep track of my medical history coupled with guidance have + made staying healthy so much more accessible. The + user-friendly interface and helpful home remedies keep + me on prepared for emergency breakouts. Thank you +

      -
      +
      - -

      Nikki

      + +

      Greg

      - Using it for quite a while now and it had being nice - especially a beta feature,i heard it can find out what - is wrong with your just from your - finger print it is cool can't wait for the roll - out,talk about a.i in action + Knowing that blockchain is being used and it's + immutaility makes feel safer from losing such vital records + and there + chat functionality is quite great feel's nice to know + others with the same condition as me.Great job

      -
      - - - -
      -

      Major Features

      -
      -
      - -

      Secure Storage

      -

      - Medical records are stored with the utmost security using WEB5, - guaranteeing data integrity and user control over their personal - health information. -

      -
      -
      - -

      Find Your Tribe

      -

      - Our platform goes beyond conventional networking by employing a - sophisticated algorithm to match users based on their medical - records. PulsePal becomes a virtual community where individuals - can share experiences, insights, and support each other on their - health journeys. -

      -
      -
      - -

      Home Remedies

      -

      - PulsePal empowers users to contribute and share simple yet - effective home remedies. A user-driven rating system ensures the - most beneficial remedies rise to the top, creating a - community-driven repository of wellness solutions. -

      +
      +
      + +

      Nikki

      -
      - -

      Find Specialist

      +

      - Wherever you are, PulsePal provides a seamless experience by - recommending specialized doctors in your nearby areas based on - your current location, enhancing accessibility to healthcare - professionals. + Using it for quite a while now and it had being nice especially + a beta feature,i heard it can find out what is wrong with + your just from your + finger print it is cool can't wait for the roll out,talk + about a.i in action

      - {showAuthModal && } - +
      + + + +
      +

      Major Features

      +
      +
      + +

      Secure Storage

      +

      + Medical records are stored with the utmost security using WEB5, + guaranteeing data integrity and user control over their personal + health information. +

      +
      +
      + +

      Find Your Tribe

      +

      + Our platform goes beyond conventional networking by employing a + sophisticated algorithm to match users based on their medical + records. PulsePal becomes a virtual community where individuals + can share experiences, insights, and support each other on their + health journeys. +

      +
      +
      + +

      Home Remedies

      +

      + PulsePal empowers users to contribute and share simple yet + effective home remedies. A user-driven rating system ensures the + most beneficial remedies rise to the top, creating a + community-driven repository of wellness solutions. +

      +
      +
      + +

      Find Specialist

      +

      + Wherever you are, PulsePal provides a seamless experience by + recommending specialized doctors in your nearby areas based on + your current location, enhancing accessibility to healthcare + professionals. +

      +
      +
      +
      + {showAuthModal && ( + + + + )} +
      ); } From 0421ca8b95136e6e794e9b9f2e94681553dbb377 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 01:18:13 +0100 Subject: [PATCH 101/124] minor bugs fixed --- tauri-app/src/App.tsx | 5 ----- tauri-app/src/components/Chat/index.css | 4 ++-- tauri-app/src/components/Navbar/index.tsx | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index e924f54..ced8e50 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; -import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -20,17 +19,13 @@ const router = createHashRouter([ { path: "/records", element: ( - }> - ), }, { path: "/connect", element: }, { path: "/remedies", element: ( - }> - ) }, { path: "/contact", element: }, diff --git a/tauri-app/src/components/Chat/index.css b/tauri-app/src/components/Chat/index.css index 4ecba23..dd76343 100644 --- a/tauri-app/src/components/Chat/index.css +++ b/tauri-app/src/components/Chat/index.css @@ -80,7 +80,7 @@ padding: 4px 10px; border-radius: 8px 8px 8px 0px; margin-right: auto; - max-width: 400px; + max-width: 600px; } .msg-t { @@ -90,5 +90,5 @@ padding: 4px 10px; border-radius: 8px 8px 0px 8px; margin-left: auto; - max-width: 400px; + max-width: 600px; } diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index a6b8649..c0d7567 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -72,7 +72,7 @@ const index = () => { +
      + )} + + + + ) +} + const index = () => { const { web5, did } = useWeb5Store((state) => ({ web5: state.web5, @@ -25,44 +62,43 @@ const index = () => { } }; - const [showSignOutUtils, setShowSignOutUtils] = useState(false); return (
      - - + +
      - +

      Home

      - +

      Records

      28
      - +

      Chats

      5
      - +

      DIY Remedies

      99+
      - +

      Contact

      @@ -72,34 +108,14 @@ const index = () => { } > - {showSignOutUtils && ( -
      -
      - DID: - -
      - -
      - )} - - +
      ); diff --git a/tauri-app/src/stores/profile.ts b/tauri-app/src/stores/profile.ts index 069f337..9740536 100644 --- a/tauri-app/src/stores/profile.ts +++ b/tauri-app/src/stores/profile.ts @@ -1,192 +1,111 @@ -import { create } from "zustand"; +import { create } from "zustand" import { combine } from "zustand/middleware"; import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; import { Agent } from "@/components/Auth/types"; import UserDetailsUtils, { CreatePayload } from "@/utils/user"; import BlobUtils from "@/utils/blob"; -import { Record as Web5Record } from "@web5/api/browser"; +import { Record as Web5Record } from "@web5/api/browser" -export type ProfileState = { - id: string; - // username: string - firstName: string; - lastName: string; - profilePictureUrl: string; -}; - -type State = - | { - profile: ProfileState; - isSignedIn: true; - } - | { - profile: null; - isSignedIn: false; - }; - -type Payload = Omit< - UserDetailsProtocolRecord.Details, - "dateCreated" | "profilePictureUrl" -> & { - profilePicture: File; -}; +export type SignUpPayload = Omit -export type SignUpPayload = Omit; - -export type ProfileState = Omit< - UserDetailsProtocolRecord.Details, - "profilePictureId" -> & { - id: string; +export type ProfileState = Omit & +{ + id: string // username: string - profilePictureUrl: string; -}; - -type State = - | { - profile: ProfileState; - isSignedIn: true; - record: Web5Record; - } - | { - profile: null; - record: null; - isSignedIn: false; - }; + profilePictureUrl: string +} + +type State = { + profile: ProfileState, + isSignedIn: true + record: Web5Record +} | { + profile: null, + record: null, + isSignedIn: false +} export const useProfile = create( - combine( - { - state: { - profile: null, - isSignedIn: false, - } as State, - showAuthModal: false, + combine({ + state: { + profile: null, + isSignedIn: false + } as State, + showAuthModal: false + }, (set, get) => ({ + setShowAuthModal: (showAuthModal: boolean) => { + set({ showAuthModal }) }, - (set, get) => ({ - setShowAuthModal: (showAuthModal: boolean) => { - set({ showAuthModal }); - }, - signOut: () => { - if (get().state.isSignedIn) { - set({ - state: { - isSignedIn: false, - profile: null, - }, - }); - } - }, - signIn: async (agent: Agent) => { - const profileRecord = - await UserDetailsUtils.fetchUserDetailsRecord(agent); - if (!profileRecord) return false; - - const profile: UserDetailsProtocolRecord.Details = - await profileRecord.data.json(); - - const profilePicture = await DocumentUtils.fetchBlobRecord( - agent, - profile.profilePictureId, - ); - let profilePictureUrl = ""; - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob(); - profilePictureUrl = URL.createObjectURL(profilePictureBlob); - } - + signOut: () => { + if (get().state.isSignedIn) { set({ state: { - isSignedIn: true, - profile: { - id: profileRecord.id, - firstName: profile.firstName, - lastName: profile.lastName, - profilePictureUrl, - }, - }, - }); - }, - signIn: async (agent: Agent) => { - const profileRecord = - await UserDetailsUtils.fetchUserDetailsRecord(agent); - if (!profileRecord) return false; - - return true; - }, - signUp: async (agent: Agent, payload: CreatePayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord( - agent, - payload, - ); - if (!profile) return false; - - return true; - - const profilePicture = await BlobUtils.fetchBlobRecord(agent, { - recordId: profile.profilePictureId, - }); - let profilePictureUrl = ""; - if (profilePicture) { - const profilePictureBlob = await profilePicture.data.blob(); - profilePictureUrl = URL.createObjectURL(profilePictureBlob); + isSignedIn: false, + record: null, + profile: null + } + }) + } + }, + signIn: async (agent: Agent) => { + const profileRecord = await UserDetailsUtils.fetchUserDetailsRecord(agent) + if (!profileRecord) return false + + const profile: UserDetailsProtocolRecord.Details = await profileRecord.data.json() + + const profilePicture = await BlobUtils.fetchBlobRecord(agent, { recordId: profile.profilePictureId }) + let profilePictureUrl = "" + if (profilePicture) { + const profilePictureBlob = await profilePicture.data.blob() + profilePictureUrl = URL.createObjectURL(profilePictureBlob) + } + + set({ + state: { + isSignedIn: true, + record: profileRecord, + profile: { + ...profile, + id: profileRecord.id, + profilePictureUrl + } } + }) - set({ - state: { - isSignedIn: true, - record: profileRecord, - profile: { - ...profile, - id: profileRecord.id, - profilePictureUrl, - }, - }, - }); - - return true; - }, - addCondition: async (agent: Agent, condition: string) => { - const state = get().state; - if (!state.isSignedIn) return false; - - const { profilePictureUrl, ...payload } = state.profile; - if (payload.conditions.indexOf(condition) < -1) return; - - payload.conditions.push(condition); - - const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord( - agent, - state.record, - payload, - ); - if (!updatedRecord) return false; - const profile = await updatedRecord.data.json(); - - set({ - state: { - isSignedIn: true, - record: updatedRecord, - profile: { - ...profile, - id: updatedRecord.id, - profilePictureUrl, - }, - }, - }); + return true + }, + addCondition: async (agent: Agent, condition: string) => { + const state = get().state + if (!state.isSignedIn) return false + + const { profilePictureUrl, ...payload } = state.profile + if (payload.conditions.indexOf(condition) < -1) return + + payload.conditions.push(condition) + + const updatedRecord = await UserDetailsUtils.updateUserDetailsRecord(agent, state.record, payload) + if (!updatedRecord) return false + const profile = await updatedRecord.data.json() + + set({ + state: { + isSignedIn: true, + record: updatedRecord, + profile: { + ...profile, + id: updatedRecord.id, + profilePictureUrl + } + } + }) - return updatedRecord; - }, - signUp: async (agent: Agent, payload: SignUpPayload) => { - const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { - ...payload, - conditions: [], - did: agent.did, - }); - if (!profile) return false; + return updatedRecord + }, + signUp: async (agent: Agent, payload: SignUpPayload) => { + const profile = await UserDetailsUtils.createUserDetailsRecord(agent, { ...payload, conditions: [], did: agent.did }) + if (!profile) return false - return profile; - }, - }), - ), -); + return profile + } + })) +) From 421449b24ccbd3a4feffa8481cd43dcaff3d8327 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 02:08:04 +0000 Subject: [PATCH 104/124] added code to sync profile updates with remote dwn --- tauri-app/src/pages/connect.tsx | 1 - tauri-app/src/utils/user.ts | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/pages/connect.tsx b/tauri-app/src/pages/connect.tsx index 5bd976a..d3dcc6b 100644 --- a/tauri-app/src/pages/connect.tsx +++ b/tauri-app/src/pages/connect.tsx @@ -12,7 +12,6 @@ const fetchProfilesWithCondition = async (agent: Agent, condition: string) => { const matchingProfiles = [] for (const record of profileRecords) { const profile: UserDetailsProtocolRecord.Details = await record.data.json() - console.log(profile) if (profile.conditions.indexOf(condition) > -1 && profile.did !== agent.did) { matchingProfiles.push(profile) diff --git a/tauri-app/src/utils/user.ts b/tauri-app/src/utils/user.ts index 73b8238..4c0c46c 100644 --- a/tauri-app/src/utils/user.ts +++ b/tauri-app/src/utils/user.ts @@ -172,6 +172,11 @@ async function updateUserDetailsRecord(agent: Agent, idOrRecord: string | Web5Re return false } + const { status: protocolDwnSyncStatus } = await record.send(UserDetailsProtocolDID) + if (protocolDwnSyncStatus.code !== 202) { + console.log("Failed to sync document record update with protocol remote DWN:", protocolDwnSyncStatus) + } + return record } From 5c3204db28d5f8d7613c9bf4a453df0a356d27f9 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 02:08:24 +0000 Subject: [PATCH 105/124] updated gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a873b84..b5fa95f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ pnpm-lock.yaml *.tsbuildinfo -utils/ +server/ From 0c4eef1c047b81f9d98f597153ff7abe26abb982 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 8 Jan 2024 09:53:27 +0530 Subject: [PATCH 106/124] add chat feature Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 + tauri-app/src/pages/chat.tsx | 485 ++++++++++++++++------------------- 2 files changed, 220 insertions(+), 267 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index ced8e50..14be1c1 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,6 +9,7 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; +import ChatConnect from "./pages/chat"; const router = createHashRouter([ { @@ -30,6 +31,7 @@ const router = createHashRouter([ }, { path: "/contact", element: }, { path: "/chat", element: }, + { path: "/chatConnect", element: }, ], }, ]); diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index 7ac018d..f886fe0 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -1,282 +1,233 @@ -import { Web5 } from "@web5/api"; -import { useState, useEffect } from "react"; - -export default function Home() { - - const [web5, setWeb5] = useState(null); - const [myDid, setMyDid] = useState(null); - const [activeRecipient, setActiveRecipient] = useState(null); - - const [noteValue, setNoteValue] = useState(""); - const [errorMessage, setErrorMessage] = useState(''); - const [recipientDid, setRecipientDid] = useState(""); - - const [didCopied, setDidCopied] = useState(false); - const [showNewChatInput, setShowNewChatInput] = useState(false); - - const [allDings, setAllDings] = useState([]); - - const sortedDings = allDings.sort( - //@ts-ignore - (a, b) => new Date(a.timestampWritten) - new Date(b.timestampWritten) - ); - - const groupedDings = allDings.reduce((acc, ding) => { - //@ts-ignore - const recipient = ding.sender === myDid ? ding.recipient : ding.sender; - //@ts-ignore - if (!acc[recipient]) acc[recipient] = []; - //@ts-ignore - acc[recipient].push(ding); - return acc; - }, {}); - - useEffect(() => { - const initWeb5 = async () => { - const { web5, did } = await Web5.connect(); - //@ts-ignore - setWeb5(web5); +// Import necessary libraries and modules +import React, { useEffect } from 'react'; +import { Web5 } from "@web5/api/browser"; +import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; + +// Define your dingerProtocolDefinition object + +const ChatConnect: React.FC = () => { + useEffect(() => { + const initDinger = async () => { + const copyDidElement = document.querySelector('#copy-did'); + const dingForm = document.querySelector('#ding-form'); + const dingErrorElement = document.querySelector('#ding-error'); + const dingProgressElement = document.querySelector('#ding-progress'); + const dingedList = document.querySelector('#dinged-list'); + const dingedByList = document.querySelector('#dinged-by-list'); + + const { web5, did: myDid } = await Web5.connect(); + await configureProtocol(web5); + + setInterval(async () => { + await renderDings(web5, myDid, dingedList, dingedByList); + }, 2000); + + //@ts-ignore + copyDidElement.addEventListener('click', async () => { + try { + await navigator.clipboard.writeText(myDid); + } catch (err) { //@ts-ignore - setMyDid(did); - - if (web5 && did) { - await configureProtocol(web5, did); - await fetchDings(web5, did); - } - }; - initWeb5(); - }, []); - - useEffect(() => { - if (!web5 || !myDid) return; - const intervalId = setInterval(async () => { - await fetchDings(web5, myDid); - }, 2000); - - return () => clearInterval(intervalId); - }, [web5, myDid]); - - const createProtocolDefinition = () => { - const dingerProtocolDefinition = { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - published: true, - types: { - ding: { - schema: "https://blackgirlbytes.dev/ding", - dataFormats: ["application/json"], - }, - }, - structure: { - ding: { - $actions: [ - { who: "anyone", can: "write" }, - { who: "author", of: "ding", can: "read" }, - { who: "recipient", of: "ding", can: "read" }, - ], - }, - }, - }; - return dingerProtocolDefinition; - }; - + alert('Failed to copy DID: ', err); + } + }); + + //@ts-ignore + dingForm.addEventListener('submit', async (event) => { + // ... (your existing form submission logic) + event.preventDefault(); + +//@ts-ignore + dingErrorElement.textContent = ''; + //@ts-ignore + dingProgressElement.textContent = ''; +//@ts-ignore + const did = document.querySelector('#did').value; + //@ts-ignore + const note = document.querySelector('#note').value; + + if (did.length === 0) { //@ts-ignore - const queryForProtocol = async (web5) => { - return await web5.dwn.protocols.query({ - message: { - filter: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - }, - }, - }); - }; + dingErrorElement.textContent = 'DID required'; + return; + } + const ding = { dinger: myDid }; + if (note) { //@ts-ignore - const installProtocolLocally = async (web5, protocolDefinition) => { - return await web5.dwn.protocols.configure({ - message: { - definition: protocolDefinition, - }, - }); - }; + ding.note = note; + } +//@ts-ignore + dingProgressElement.textContent = 'writing ding to local DWN...'; + + try { + const { record, status } = await web5.dwn.records.write({ + data: ding, + message: { + protocol: dingerProtocolDefinition.protocol, + protocolPath: 'ding', + schema: 'ding', + recipient: did + } + }); + + if (status.code !== 202) { + //@ts-ignore + dingErrorElement.textContent = `${status.code} - ${status.detail}`; + return; + } + const shortenedDid = did.substr(0, 22); //@ts-ignore - const configureProtocol = async (web5, did) => { - const protocolDefinition = await createProtocolDefinition(); - - const { protocols: localProtocol, status: localProtocolStatus } = - await queryForProtocol(web5); - console.log({ localProtocol, localProtocolStatus }); - if (localProtocolStatus.code !== 200 || localProtocol.length === 0) { - - const { protocol, status } = await installProtocolLocally(web5, protocolDefinition); - console.log("Protocol installed locally", protocol, status); - - const { status: configureRemoteStatus } = await protocol.send(did); - console.log("Did the protocol install on the remote DWN?", configureRemoteStatus); - } else { - console.log("Protocol already installed"); - } - }; - - - const constructDing = () => { - const currentDate = new Date().toLocaleDateString(); - const currentTime = new Date().toLocaleTimeString(); - const ding = { - sender: myDid, - note: noteValue, - recipient: recipientDid, - timestampWritten: `${currentDate} ${currentTime}`, - }; - return ding; - }; + dingProgressElement.textContent = `Ding written locally! Dinging ${shortenedDid}...`; +//@ts-ignore + const { status: sendStatus } = await record.send(did); + console.log('send status', sendStatus); - //@ts-ignore - const writeToDwn = async (ding) => { + if (sendStatus.code !== 202) { //@ts-ignore - const { record } = await web5.dwn.records.write({ - data: ding, - message: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - protocolPath: "ding", - schema: "https://blackgirlbytes.dev/ding", - recipient: recipientDid, - }, - }); - return record; - }; - + dingErrorElement.textContent = `${sendStatus.code} - ${sendStatus.detail}`; + return; + } +//@ts-ignore + dingProgressElement.textContent = `Dinged ${shortenedDid}!`; + } catch (e) { //@ts-ignore - const sendRecord = async (record) => { - return await record.send(recipientDid); + dingErrorElement.textContent = e.message; + return; + } + }); }; - //@ts-ignore - const handleSubmit = async (e) => { - e.preventDefault(); - - if (!noteValue.trim()) { - setErrorMessage('Please type a message before sending.'); - return; - } - - const ding = constructDing(); - const record = await writeToDwn(ding); - const { status } = await sendRecord(record); - - console.log("Send record status", status); - await fetchDings(web5, myDid); - setNoteValue(""); - }; - - const handleCopyDid = async () => { - if (myDid) { - try { - await navigator.clipboard.writeText(myDid); - setDidCopied(true); - console.log("DID copied to clipboard"); + initDinger(); + }, []); - setTimeout(() => { - setDidCopied(false); - }, 3000); - } catch (err) { - console.log("Failed to copy DID: " + err); - } + const configureProtocol = async (web5: any) => { + // ... (your existing configureProtocol function) + const { protocols, status } = await web5.dwn.protocols.query({ + message: { + filter: { + protocol: 'https://dinger.app/protocol' } - }; - - //@ts-ignore - const fetchSentMessages = async (web5, did) => { - const response = await web5.dwn.records.query({ - message: { - filter: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - }, - }, - }); - - if (response.status.code === 200) { - const sentDings = await Promise.all( - //@ts-ignore - response.records.map(async (record) => { - const data = await record.data.json(); - return data; - }) - ); - console.log(sentDings, "I sent these dings"); - return sentDings; - } else { - console.log("error", response.status); + } + }); + + if (status.code !== 200) { + alert('Failed to query protocols. check console'); + console.error('Failed to query protocols', status); + + return; + } + + // protocol already exists + if (protocols.length > 0) { + console.log('protocol already exists'); + return; + } + + // create protocol + const { status: configureStatus } = await web5.dwn.protocols.configure({ + message: { + definition: dingerProtocolDefinition + } + }); + + console.log('configure protocol status', configureStatus); + }; + + const renderDings = async (web5: any, myDid: string, dingedList: any, dingedByList: any) => { + // ... (your existing renderDings function) + const { records, status } = await web5.dwn.records.query({ + message: { + filter: { + protocol: dingerProtocolDefinition.protocol } - }; - - //@ts-ignore - const fetchReceivedMessages = async (web5, did) => { - const response = await web5.dwn.records.query({ - from: did, - message: { - filter: { - protocol: "https://blackgirlbytes.dev/dinger-chat-protocol", - schema: "https://blackgirlbytes.dev/ding", - }, - }, + } + }); + + if (status.code !== 200) { + alert('Failed to query for dings. check console'); + console.error('Failed to query dings', status); + } + + for (let record of records) { + const recordExists = document.getElementById(record.id); + if (recordExists) { + continue; + } + + const { dinger, note } = await record.data.json(); + if (dinger === myDid) { + const shortenedDid = record.recipient.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + dingBackButton.textContent = 'Ding agane'; + dingBackButton.dataset.toDing = record.recipient; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; }); - - if (response.status.code === 200) { - const receivedDings = await Promise.all( - //@ts-ignore - response.records.map(async (record) => { - const data = await record.data.json(); - return data; - }) - ); - console.log(receivedDings, "I received these dings"); - return receivedDings; - } else { - console.log("error", response.status); - } - }; - - //@ts-ignore - const fetchDings = async (web5, did) => { - const sentMessages = await fetchSentMessages(web5, did); - const receivedMessages = await fetchReceivedMessages(web5, did); - const allMessages = [...(sentMessages || []), ...(receivedMessages || [])]; - //@ts-ignore - setAllDings(allMessages); - - }; - - const handleStartNewChat = () => { - setActiveRecipient(null); - setShowNewChatInput(true); - }; - - //@ts-ignore - const handleSetActiveRecipient = (recipient) => { - setRecipientDid(recipient); - setActiveRecipient(recipient); - setShowNewChatInput(false); - }; - - const handleConfirmNewChat = () => { - //@ts-ignore - setActiveRecipient(recipientDid); - //@ts-ignore - setActiveRecipient(recipientDid); - setShowNewChatInput(false); - //@ts-ignore - if (!groupedDings[recipientDid]) { - //@ts-ignore - groupedDings[recipientDid] = []; - } - }; - - return ( -
      -

      {myDid}

      - - -
      - ); -} \ No newline at end of file + + dingElement.appendChild(dingBackButton); + dingedList.appendChild(dingElement); + } else { + const shortenedDid = dinger.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + dingBackButton.textContent = 'Ding Back'; + dingBackButton.dataset.toDing = dinger; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; + }); + + dingElement.appendChild(dingBackButton); + dingedByList.appendChild(dingElement); + } + } + + }; + + return ( +
      + +
      +

      + +
      + +
      + + +
      + +

      You Dinged:

      +
        + {/* List items will be added here dynamically */} +
      + +

      You were Dinged by:

      +
        + {/* List items will be added here dynamically */} +
      +
      + ); +}; + +export default ChatConnect; From adf3eeca6884bcccd9f24cc91707d26be68007d6 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 8 Jan 2024 10:18:23 +0530 Subject: [PATCH 107/124] fixed err Signed-off-by: coder12git --- tauri-app/src/components/MobileChat/index.tsx | 2 +- tauri-app/src/pages/Chat/index.tsx | 9 +++- tauri-app/src/pages/chat.tsx | 41 +++++++++++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/tauri-app/src/components/MobileChat/index.tsx b/tauri-app/src/components/MobileChat/index.tsx index b462dc6..617b14e 100644 --- a/tauri-app/src/components/MobileChat/index.tsx +++ b/tauri-app/src/components/MobileChat/index.tsx @@ -15,7 +15,7 @@ const Message: FC = ({ message, isLeft }) => {
      ); }; - +//@ts-ignore const index: FC = ({ setHideChat, hideChat }) => { return (
      diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 307e28b..eb2f26d 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -47,13 +47,16 @@ const index = () => { friends={45} /> {hideChat && (
      - +
      )}
      @@ -71,7 +74,9 @@ const index = () => { cover_pic={"/pic.jpg"} friends={45} /> - +
      diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index f886fe0..010a4bc 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -2,6 +2,7 @@ import React, { useEffect } from 'react'; import { Web5 } from "@web5/api/browser"; import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; +import '../components/Chat/index.css'; // Define your dingerProtocolDefinition object @@ -167,7 +168,7 @@ const ChatConnect: React.FC = () => { const dingBackButton = document.createElement('button'); dingBackButton.className = 'ding-back'; - dingBackButton.textContent = 'Ding agane'; + // dingBackButton.textContent = 'Ding agane'; dingBackButton.dataset.toDing = record.recipient; dingBackButton.addEventListener('click', event => { @@ -188,7 +189,7 @@ const ChatConnect: React.FC = () => { const dingBackButton = document.createElement('button'); dingBackButton.className = 'ding-back'; - dingBackButton.textContent = 'Ding Back'; + // dingBackButton.textContent = 'Ding Back'; dingBackButton.dataset.toDing = dinger; dingBackButton.addEventListener('click', event => { @@ -211,9 +212,9 @@ const ChatConnect: React.FC = () => {


      - +
      - + @@ -231,3 +232,35 @@ const ChatConnect: React.FC = () => { }; export default ChatConnect; + + +interface MessageProp { + message: string; + isLeft: boolean; + } + //@ts-ignore + const Message: FC = ({ message, isLeft }) => { + return ( +
      +
      +

      {message}

      +
      +
      + ); + }; + //@ts-ignore + export const index: FC = () => { + return ( +
      +
      +
      +
      + + +
      +
      + ); + }; + From 63e97d3a73d0870ab7c8b964ec1e995dcec964d8 Mon Sep 17 00:00:00 2001 From: coder12git Date: Mon, 8 Jan 2024 10:31:26 +0530 Subject: [PATCH 108/124] remove text Signed-off-by: coder12git --- tauri-app/src/pages/chat.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index 010a4bc..41b8929 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -80,7 +80,7 @@ const ChatConnect: React.FC = () => { const shortenedDid = did.substr(0, 22); //@ts-ignore - dingProgressElement.textContent = `Ding written locally! Dinging ${shortenedDid}...`; + dingProgressElement.textContent = `Ding written! Dinging ${shortenedDid}...`; //@ts-ignore const { status: sendStatus } = await record.send(did); console.log('send status', sendStatus); From 3d76a1d0857f8a829e7a6418796692e880076aa2 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 15:36:01 +0100 Subject: [PATCH 109/124] minor.feature added --- tauri-app/src/App.tsx | 11 ++--- tauri-app/src/components/Navbar/index.css | 1 + tauri-app/src/components/Navbar/index.tsx | 40 +++++++++++++++---- .../src/components/UserFriendList/index.tsx | 2 +- .../components/UserMobileFriendList/index.tsx | 2 +- tauri-app/src/hooks/useCopy.tsx | 0 6 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 tauri-app/src/hooks/useCopy.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 14be1c1..f5fabe9 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -19,15 +19,12 @@ const router = createHashRouter([ { path: "/", element: }, { path: "/records", - element: ( - - ), + element: , }, { path: "/connect", element: }, { - path: "/remedies", element: ( - - ) + path: "/remedies", + element: , }, { path: "/contact", element: }, { path: "/chat", element: }, @@ -48,7 +45,7 @@ function App() { return ( <> <> - {web5 ? :
      Connecting...
      } + {true ? :
      Connecting...
      } diff --git a/tauri-app/src/components/Navbar/index.css b/tauri-app/src/components/Navbar/index.css index 0227c4f..50ace42 100644 --- a/tauri-app/src/components/Navbar/index.css +++ b/tauri-app/src/components/Navbar/index.css @@ -133,6 +133,7 @@ outline: none; padding: 8px 4px; margin: 14px 0px; + margin-right: 8px; } @media (max-width: 750px) { diff --git a/tauri-app/src/components/Navbar/index.tsx b/tauri-app/src/components/Navbar/index.tsx index ea02e2a..4ea6ab3 100644 --- a/tauri-app/src/components/Navbar/index.tsx +++ b/tauri-app/src/components/Navbar/index.tsx @@ -4,7 +4,7 @@ import { NavLink } from "react-router-dom"; import useWeb5Store from "@/stores/useWeb5Store.ts"; import { Agent } from "../Auth/types"; import { useProfile } from "@/stores/profile.ts"; -import { useState } from "react"; +import { useState, useRef } from "react"; const SignedInBtn = () => { const { profile, signOut } = useProfile((store) => ({ @@ -12,6 +12,8 @@ const SignedInBtn = () => { signOut: store.signOut, })); const [showSignOutUtils, setShowSignOutUtils] = useState(false); + const [isCopied, setIsCopied] = useState(false); + const copyRef = useRef(null); return ( <> @@ -19,12 +21,30 @@ const SignedInBtn = () => {
      DID: - + + {!isCopied ? ( + { + copyRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )}
      @@ -34,14 +54,20 @@ const SignedInBtn = () => { - ) -} + ); +}; const index = () => { const { web5, did } = useWeb5Store((state) => ({ diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index 210ade9..b229d75 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -22,7 +22,7 @@ const FriendTag: FC = ({

      {friendName.slice(0, 6) + "..."}

      = ({

      {friendName.slice(0, 20) + "..."}

      Date: Mon, 8 Jan 2024 20:53:26 +0530 Subject: [PATCH 110/124] added chat to frontend Signed-off-by: coder12git --- tauri-app/src/components/Chat/index.tsx | 277 ++++++++++++++++++++++-- tauri-app/src/pages/Home/index.tsx | 5 - tauri-app/src/pages/chat.tsx | 51 +---- 3 files changed, 269 insertions(+), 64 deletions(-) diff --git a/tauri-app/src/components/Chat/index.tsx b/tauri-app/src/components/Chat/index.tsx index 4bc8898..64148bd 100644 --- a/tauri-app/src/components/Chat/index.tsx +++ b/tauri-app/src/components/Chat/index.tsx @@ -1,22 +1,231 @@ import "./index.css"; -import React, { FC } from "react"; +import React, { useEffect, FC } from "react"; -interface MessageProp { - message: string; - isLeft: boolean; -} +// Import necessary libraries and modules +// import React, { useEffect } from 'react'; +import { Web5 } from "@web5/api/browser"; +import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; +// import Chat from '../components/Chat'; -const Message: FC = ({ message, isLeft }) => { - return ( -
      -
      -

      {message}

      +// Define your dingerProtocolDefinition object + +//@ts-ignore +const index: React.FC = () => { + useEffect(() => { + const initDinger = async () => { + // const copyDidElement = document.querySelector('#copy-did'); + const dingForm = document.querySelector('#ding-form'); + const dingErrorElement = document.querySelector('#ding-error'); + const dingProgressElement = document.querySelector('#ding-progress'); + const dingedList = document.querySelector('#dinged-list'); + const dingedByList = document.querySelector('#dinged-by-list'); + + const { web5, did: myDid } = await Web5.connect(); + await configureProtocol(web5); + + setInterval(async () => { + await renderDings(web5, myDid, dingedList, dingedByList); + }, 2000); + + //@ts-ignore + // copyDidElement.addEventListener('click', async () => { + // try { + // await navigator.clipboard.writeText(myDid); + // } catch (err) { + // //@ts-ignore + // alert('Failed to copy DID: ', err); + // } + // }); + + //@ts-ignore + dingForm.addEventListener('submit', async (event) => { + // ... (your existing form submission logic) + event.preventDefault(); + + //@ts-ignore + dingErrorElement.textContent = ''; + //@ts-ignore + dingProgressElement.textContent = ''; + //@ts-ignore + const did = document.querySelector('#did').value; + //@ts-ignore + const note = document.querySelector('#note').value; + + if (did.length === 0) { + //@ts-ignore + dingErrorElement.textContent = 'DID required'; + return; + } + + const ding = { dinger: myDid }; + if (note) { + //@ts-ignore + ding.note = note; + } + //@ts-ignore + dingProgressElement.textContent = 'writing ding to local DWN...'; + + try { + const { record, status } = await web5.dwn.records.write({ + data: ding, + message: { + protocol: dingerProtocolDefinition.protocol, + protocolPath: 'ding', + schema: 'ding', + recipient: did + } + }); + + if (status.code !== 202) { + //@ts-ignore + dingErrorElement.textContent = `${status.code} - ${status.detail}`; + return; + } + + const shortenedDid = did.substr(0, 22); + //@ts-ignore + dingProgressElement.textContent = `Ding written! Dinging ${shortenedDid}...`; + //@ts-ignore + const { status: sendStatus } = await record.send(did); + console.log('send status', sendStatus); + + if (sendStatus.code !== 202) { + //@ts-ignore + dingErrorElement.textContent = `${sendStatus.code} - ${sendStatus.detail}`; + return; + } + //@ts-ignore + dingProgressElement.textContent = `Dinged ${shortenedDid}!`; + } catch (e) { + //@ts-ignore + dingErrorElement.textContent = e.message; + return; + } + }); + }; + + initDinger(); + }, []); + + const configureProtocol = async (web5: any) => { + // ... (your existing configureProtocol function) + const { protocols, status } = await web5.dwn.protocols.query({ + message: { + filter: { + protocol: 'https://dinger.app/protocol' + } + } + }); + + if (status.code !== 200) { + alert('Failed to query protocols. check console'); + console.error('Failed to query protocols', status); + + return; + } + + // protocol already exists + if (protocols.length > 0) { + console.log('protocol already exists'); + return; + } + + // create protocol + const { status: configureStatus } = await web5.dwn.protocols.configure({ + message: { + definition: dingerProtocolDefinition + } + }); + + console.log('configure protocol status', configureStatus); + }; + + const renderDings = async (web5: any, myDid: string, dingedList: any, dingedByList: any) => { + // ... (your existing renderDings function) + const { records, status } = await web5.dwn.records.query({ + message: { + filter: { + protocol: dingerProtocolDefinition.protocol + } + } + }); + + if (status.code !== 200) { + alert('Failed to query for dings. check console'); + console.error('Failed to query dings', status); + } + + for (let record of records) { + const recordExists = document.getElementById(record.id); + if (recordExists) { + continue; + } + + const { dinger, note } = await record.data.json(); + if (dinger === myDid) { + const shortenedDid = record.recipient.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + // dingBackButton.textContent = 'Ding agane'; + dingBackButton.dataset.toDing = record.recipient; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; + }); + + dingElement.appendChild(dingBackButton); + dingedList.appendChild(dingElement); + } else { + const shortenedDid = dinger.substr(0, 22); + const formattedDing = `[${new Date(record.dateCreated).toLocaleString()}] ${shortenedDid}... - ${note || ''}`; + + const dingElement = document.createElement('li'); + dingElement.id = record.id; + dingElement.textContent = formattedDing; + + const dingBackButton = document.createElement('button'); + dingBackButton.className = 'ding-back'; + // dingBackButton.textContent = 'Ding Back'; + dingBackButton.dataset.toDing = dinger; + + dingBackButton.addEventListener('click', event => { + const didInput = document.querySelector('#did'); + //@ts-ignore + didInput.value = event.target.dataset.toDing; + }); + + dingElement.appendChild(dingBackButton); + dingedByList.appendChild(dingElement); + } + } + + }; + + + interface MessageProp { + message: string; + isLeft: boolean; + } + + const Message: FC = ({ message, isLeft }) => { + return ( +
      +
      +

      {message}

      +
      -
      - ); -}; + ); + }; -const index: FC = () => { + // const index: FC = () => { return (
      @@ -46,13 +255,45 @@ const index: FC = () => { } isLeft={false} /> + + {/*

      You Dinged:

      */} +
        + {/* List items will be added here dynamically */} +
      + + {/*

      You were Dinged by:

      */} +
        + {/* List items will be added here dynamically */} +
      - - + {/* */} +
      { + e.preventDefault(); + }} + id="ding-form"> +

      + {/*
      */} + + + {/*
      */} + + +
      + + {/*

      You Dinged:

      +
        */} + {/* List items will be added here dynamically */} + {/*
      + +

      You were Dinged by:

      */} + {/*
        */} + {/* List items will be added here dynamically */} + {/*
      */}
      ); }; diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 21c534a..467bf42 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -50,11 +50,6 @@ export default function HomePage() { stored making it a breeze to safely store medical data and records.

      - - -
      diff --git a/tauri-app/src/pages/chat.tsx b/tauri-app/src/pages/chat.tsx index 41b8929..0703ca4 100644 --- a/tauri-app/src/pages/chat.tsx +++ b/tauri-app/src/pages/chat.tsx @@ -2,7 +2,7 @@ import React, { useEffect } from 'react'; import { Web5 } from "@web5/api/browser"; import { dingerProtocolDefinition } from '@/stores/useWeb5Store'; -import '../components/Chat/index.css'; +import Chat from '../components/Chat'; // Define your dingerProtocolDefinition object @@ -207,7 +207,8 @@ const ChatConnect: React.FC = () => { return (
      - + + {/*

      @@ -216,51 +217,19 @@ const ChatConnect: React.FC = () => {
      -
      + */} -

      You Dinged:

      -
        + {/*

        You Dinged:

        +
          */} {/* List items will be added here dynamically */} -
        + {/*

      You were Dinged by:

      -
        +
          */} {/* List items will be added here dynamically */} -
        + {/*
      */}
      ); }; -export default ChatConnect; - - -interface MessageProp { - message: string; - isLeft: boolean; - } - //@ts-ignore - const Message: FC = ({ message, isLeft }) => { - return ( -
      -
      -

      {message}

      -
      -
      - ); - }; - //@ts-ignore - export const index: FC = () => { - return ( -
      -
      -
      -
      - - -
      -
      - ); - }; - +export default ChatConnect; \ No newline at end of file From 4a5b04d1e5f83752d5096846693d156a44c4705b Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 16:58:09 +0100 Subject: [PATCH 111/124] features added --- .../src/components/UserFriendList/index.css | 19 ++++++++++ .../src/components/UserFriendList/index.tsx | 36 +++++++++++++++++-- .../components/UserMobileFriendList/index.css | 24 ++++++++++--- .../components/UserMobileFriendList/index.tsx | 31 ++++++++++++++-- tauri-app/src/pages/Chat/index.tsx | 7 ++-- tauri-app/src/pages/Home/index.tsx | 7 +--- tauri-app/src/pages/Records/index.css | 28 ++------------- tauri-app/src/pages/Records/index.tsx | 1 - tauri-app/src/pages/Remedies/index.tsx | 1 - 9 files changed, 108 insertions(+), 46 deletions(-) diff --git a/tauri-app/src/components/UserFriendList/index.css b/tauri-app/src/components/UserFriendList/index.css index 9fe13c0..7cd7e00 100644 --- a/tauri-app/src/components/UserFriendList/index.css +++ b/tauri-app/src/components/UserFriendList/index.css @@ -65,8 +65,27 @@ text-align: center; } +.d-did-container { + display: flex; + justify-content: center; + align-items: center; +} + +.friend-tag-container input { + background: var(--color-light-grey); + border-radius: 5px; + border: none; + font-family: "Roboto"; + outline: none; + padding: 8px 4px; + margin: 14px 0px; + margin-right: 8px; + width: 40px; +} + .friend-main-list-container { overflow-y: scroll; + overflow-x: hidden; height: 250px; margin: 15px 0; padding: 5px; diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index b229d75..02676a3 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -1,11 +1,12 @@ import "./index.css"; -import React, { FC, useState } from "react"; +import React, { FC, useState, useRef } from "react"; interface FriendTagProp { friendProfileImg: string; friendName: string; isFriendOnline: boolean; newChat?: number; + did?: string; } const FriendTag: FC = ({ @@ -13,14 +14,42 @@ const FriendTag: FC = ({ friendName, isFriendOnline, newChat, + did, }) => { + const [isCopied, setIsCopied] = useState(false); + + const didRef = useRef(null); + return (
      {newChat && {newChat}}
      -

      {friendName.slice(0, 6) + "..."}

      +
      +

      {friendName.slice(0, 6) + "..."}

      +
      + + + {!isCopied ? ( + { + e.stopPropagation(); + didRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
      +
      { return (
      -
      +

      Friends

      @@ -54,6 +83,7 @@ const index: FC = ({ friendList, setHideChat, hideChat }) => { isFriendOnline={friend.isOnline} friendName={friend.username} newChat={friend.newChat} + did={friend.did} />
      diff --git a/tauri-app/src/components/UserMobileFriendList/index.css b/tauri-app/src/components/UserMobileFriendList/index.css index 68bbd6e..5da9c63 100644 --- a/tauri-app/src/components/UserMobileFriendList/index.css +++ b/tauri-app/src/components/UserMobileFriendList/index.css @@ -26,18 +26,34 @@ font-family: "Roboto"; background: var(--color-red); border-radius: 3px; - padding: 2px 3px; + padding: 2px 4px; color: var(--color-white); border: 2px solid var(--color-white); border-radius: 8px; - font-size: 8px; + font-size: 10px; position: relative; - left: -15px; - top: -4px; width: 40px; + top: -25px; height: 40px; } +.m-friend-tag-container input { + background: var(--color-white); + border-radius: 5px; + border: none; + font-family: "Roboto"; + outline: none; + padding: 8px 4px; + margin: 14px 0px; + margin-right: 8px; +} + +.m-did-container { + display: flex; + justify-content: center; + align-items: center; +} + .m-friends-list-container hr { width: 80%; margin: 0 auto; diff --git a/tauri-app/src/components/UserMobileFriendList/index.tsx b/tauri-app/src/components/UserMobileFriendList/index.tsx index 39dc86f..7de5ce9 100644 --- a/tauri-app/src/components/UserMobileFriendList/index.tsx +++ b/tauri-app/src/components/UserMobileFriendList/index.tsx @@ -1,5 +1,5 @@ import "./index.css"; -import React, { FC, useState } from "react"; +import React, { FC, useState, useRef } from "react"; interface FriendTagProp { friendProfileImg: string; @@ -8,6 +8,7 @@ interface FriendTagProp { newChat?: number; setHideChat: () => void; hideChat: boolean; + didi?: string; } interface UserFriendListProp { @@ -21,7 +22,11 @@ const FriendTag: FC = ({ newChat, setHideChat, hideChat, + did, }) => { + const [isCopied, setIsCopied] = useState(false); + const didRef = useRef(null); + return (
      setHideChat(!hideChat)} @@ -31,8 +36,29 @@ const FriendTag: FC = ({ {newChat && {newChat}}
      -
      +

      {friendName.slice(0, 20) + "..."}

      +
      + + + {!isCopied ? ( + { + e.stopPropagation(); + didRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
      = ({ newChat={friend.newChat} setHideChat={setHideChat} hideChat={hideChat} + did={friend.did} /> ); diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index eb2f26d..04e3063 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -12,15 +12,16 @@ import { useEffect, useState } from "react"; const index = () => { const [friends, setFriends] = useState([ - { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false }, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1 }, + { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false ,did:"1020383*@(wppwsj)"}, + { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1,did:"apqpwpudrZpwpsAaap" }, { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true, newChat: 7, + did:"12340APDPDISavavagaAjd" }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 }, + { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 ,did:"APSOWJEHDHaksosodoQPPE1O"}, ]); const [isMobile, setIsMobile] = useState(false); const [hideChat, setHideChat] = useState(false); diff --git a/tauri-app/src/pages/Home/index.tsx b/tauri-app/src/pages/Home/index.tsx index 21c534a..2f374bd 100644 --- a/tauri-app/src/pages/Home/index.tsx +++ b/tauri-app/src/pages/Home/index.tsx @@ -50,12 +50,7 @@ export default function HomePage() { stored making it a breeze to safely store medical data and records.

      - - - -
      +

      A.I

      diff --git a/tauri-app/src/pages/Records/index.css b/tauri-app/src/pages/Records/index.css index fc6c53d..8c0bd43 100644 --- a/tauri-app/src/pages/Records/index.css +++ b/tauri-app/src/pages/Records/index.css @@ -76,7 +76,6 @@ .connect-wallet-container { width: 300px; - height: 200px; background: var(--color-white); border-radius: 15px; padding: 18px 8px; @@ -87,31 +86,8 @@ font-family: "Roboto"; font-size: 25px; margin-top: 30px; -} - -.connect-wallet-container button { - padding: 8px 20px; - border-radius: 8px; - background: var(--color-green); - box-shadow: var(--box-shadow-green); - color: var(--color-white); - font-family: "Roboto"; - cursor: pointer; - font-weight: 800; - border: none; - min-width: 180px; - font-size: 25px; - text-align: center; - margin-top: 40px; - outline: none; -} - -.connect-wallet-container button i { - background: var(--color-white); - padding: 10px 12px; - border-radius: 50%; - color: var(--color-black); - margin-left: 10px; + color: var(--color-red); + margin: auto auto; } @media (max-width: 750px) { diff --git a/tauri-app/src/pages/Records/index.tsx b/tauri-app/src/pages/Records/index.tsx index 5d53c6f..3ef81dd 100644 --- a/tauri-app/src/pages/Records/index.tsx +++ b/tauri-app/src/pages/Records/index.tsx @@ -125,7 +125,6 @@ const index = () => { }} >

      Unauthorized - Please Sign in

      -
      )} diff --git a/tauri-app/src/pages/Remedies/index.tsx b/tauri-app/src/pages/Remedies/index.tsx index f126edb..f70582a 100644 --- a/tauri-app/src/pages/Remedies/index.tsx +++ b/tauri-app/src/pages/Remedies/index.tsx @@ -230,7 +230,6 @@ const index = ({ save, formFunc, form, remediesData, docsWithImageUrls }) => { }} >

      Unauthorized - Please Sign in

      -
      )} From 455d96c995f747dbe09efecf4fe7d9e8f8861499 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 17:02:52 +0100 Subject: [PATCH 112/124] fixed a minor typo --- tauri-app/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index f5fabe9..9a6d57d 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -45,7 +45,7 @@ function App() { return ( <> <> - {true ? :
      Connecting...
      } + {web5 ? :
      Connecting...
      } From 78b7d13758bb2f9073058958f29b9a909cdca34d Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 16:50:46 +0000 Subject: [PATCH 113/124] added profile guard to chat route --- tauri-app/src/App.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 9a6d57d..30924eb 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -10,6 +10,7 @@ import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; import ChatConnect from "./pages/chat"; +import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ { @@ -27,7 +28,7 @@ const router = createHashRouter([ element: , }, { path: "/contact", element: }, - { path: "/chat", element: }, + { path: "/chat", element: }, { path: "/chatConnect", element: }, ], }, From 43248891423ca6a2144bd72149bdb93c0df70631 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 16:50:55 +0000 Subject: [PATCH 114/124] updated arguments to blob helper --- tauri-app/src/utils/blob.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/utils/blob.ts b/tauri-app/src/utils/blob.ts index 67ea009..935c040 100644 --- a/tauri-app/src/utils/blob.ts +++ b/tauri-app/src/utils/blob.ts @@ -108,12 +108,12 @@ async function createBlobRecord(agent: Agent, payload: CreatePayload, remote?: b return record } -async function fetchBlobRecord(agent: Agent, filter: FilterObj) { +async function fetchBlobRecord(agent: Agent, filter: FilterObj, remote?: boolean) { const records = await fetchRecords(agent, { ...filter, protocolPath: "blob", schema: BlobProtocol.types.blob.schema, - }) + }, remote) if (!records || !records[0]) return false From 499f1964de53b184725503bcf7efa766f1394645 Mon Sep 17 00:00:00 2001 From: Adophilus Date: Mon, 8 Jan 2024 16:51:08 +0000 Subject: [PATCH 115/124] integrated the conntect feature to the chats integrated the connect feature to the chats --- .../src/components/UserFriendList/index.tsx | 7 +- tauri-app/src/pages/Chat/index.tsx | 140 ++++++++++++++---- 2 files changed, 112 insertions(+), 35 deletions(-) diff --git a/tauri-app/src/components/UserFriendList/index.tsx b/tauri-app/src/components/UserFriendList/index.tsx index 02676a3..05d80f7 100644 --- a/tauri-app/src/components/UserFriendList/index.tsx +++ b/tauri-app/src/components/UserFriendList/index.tsx @@ -1,3 +1,4 @@ +import { Friend } from "@/pages/Chat"; import "./index.css"; import React, { FC, useState, useRef } from "react"; @@ -68,7 +69,7 @@ interface UserFriendListProp { hideChat: boolean; } -const index: FC = ({ friendList, setHideChat, hideChat }) => { +const index: FC<{ friendList: Friend[]}> = ({ friendList, setHideChat, hideChat }) => { return (
      @@ -79,10 +80,10 @@ const index: FC = ({ friendList, setHideChat, hideChat }) => { return ( <>
      diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 04e3063..e7e7e6d 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -9,23 +9,104 @@ import UserMobileFriendList from "../../components/UserMobileFriendList/"; import MobileChat from "../../components/MobileChat"; import { useEffect, useState } from "react"; +import { Agent } from "@/components/Auth/types"; +import UserDetailsUtils from "@/utils/user"; +import { Record as UserDetailsProtocolRecord } from "@/utils/protocols/user"; +import BlobUtils from "@/utils/blob"; +import { useProfile } from "@/stores/profile"; +import useWeb5Store from "@/stores/useWeb5Store"; + +const fetchProfilesWithConditions = async (agent: Agent, conditions: string[]) => { + const profileRecords = await UserDetailsUtils.fetchUserDetailsRecords(agent) + if (!profileRecords) + return [] + + const profilesWithRank = [] + for (const record of profileRecords) { + const profile: UserDetailsProtocolRecord.Details = await record.data.json() + + if (profile.did === agent.did) continue + + const profileWithRank = { + profile, + rank: 0 + } + + for (const condition of conditions) { + if (profile.conditions.indexOf(condition) > -1) { + profileWithRank.rank += 1 + } + } + + if (profileWithRank.rank === 0) continue + + profilesWithRank.push(profileWithRank) + } + + const sortedProfiles = profilesWithRank + .sort((a, b) => b.rank - a.rank) + .map((profileWithRank) => profileWithRank.profile) + + const matchingProfiles: (Omit & { profilePictureUrl: string })[] = [] + + for (const p of sortedProfiles) { + const { profilePictureId, ...profile } = p + const profilePictureRecord = await BlobUtils.fetchBlobRecord(agent, { recordId: profilePictureId }, true) + + const payload = { + ...profile, + profilePictureUrl: "" + } + + if (profilePictureRecord) { + const profilePicture = await profilePictureRecord.data.blob() + payload.profilePictureUrl = URL.createObjectURL(profilePicture) + } + + matchingProfiles.push(payload) + } + + return matchingProfiles +} + +export type Friend = Awaited>[number] & { + isOnline: boolean + username: string +} const index = () => { - const [friends, setFriends] = useState([ - { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false ,did:"1020383*@(wppwsj)"}, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1,did:"apqpwpudrZpwpsAaap" }, - { - profile_pic: "/pm.jpg", - username: "@gregidd", - isOnline: true, - newChat: 7, - did:"12340APDPDISavavagaAjd" - }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 ,did:"APSOWJEHDHaksosodoQPPE1O"}, + const [friends, setFriends] = useState([ + // { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false, did: "1020383*@(wppwsj)" }, + // { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1, did: "apqpwpudrZpwpsAaap" }, + // { + // profile_pic: "/pm.jpg", + // username: "@gregidd", + // isOnline: true, + // newChat: 7, + // did: "12340APDPDISavavagaAjd" + // }, + // { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4, did: "APSOWJEHDHaksosodoQPPE1O" }, ]); const [isMobile, setIsMobile] = useState(false); const [hideChat, setHideChat] = useState(false); + const profile = useProfile(store => store.state.profile!) + const { web5, did } = useWeb5Store(store => ({ web5: store.web5!, did: store.did! })) + + useEffect(() => { + const fetchProfiles = async () => { + const res = await fetchProfilesWithConditions({ web5, did }, profile.conditions) + const newFriends = res.map(profile => ({ + ...profile, + isOnline: true, + username: `${profile.firstName}${profile.lastName}` + })) + setFriends(newFriends) + } + + fetchProfiles() + }, [profile, web5, did]) + useEffect(() => { if (window.innerWidth < 750) { setIsMobile(true); @@ -39,25 +120,23 @@ const index = () => { return (
      {hideChat && (
      - +
      )}
      @@ -67,17 +146,14 @@ const index = () => {
      - +
      From e951d031e71f32698c9b76bac68fabed9053884a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:08:08 +0100 Subject: [PATCH 116/124] done tho still need's work --- tauri-app/src/App.tsx | 2 +- .../src/components/FindFriends/index.css | 79 +++++++++++ .../src/components/FindFriends/index.tsx | 79 +++++++++++ .../src/components/FriendRequests/index.css | 127 ++++++++++++++++++ .../src/components/FriendRequests/index.tsx | 60 +++++++++ .../components/UserMobileProfile/index.tsx | 27 ++++ .../src/components/UserProfile/index.css | 55 ++++++++ .../src/components/UserProfile/index.tsx | 33 ++++- tauri-app/src/pages/Chat/index.tsx | 90 +++++++++++-- 9 files changed, 537 insertions(+), 15 deletions(-) create mode 100644 tauri-app/src/components/FindFriends/index.css create mode 100644 tauri-app/src/components/FindFriends/index.tsx create mode 100644 tauri-app/src/components/FriendRequests/index.css create mode 100644 tauri-app/src/components/FriendRequests/index.tsx diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 9a6d57d..f5fabe9 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -45,7 +45,7 @@ function App() { return ( <> <> - {web5 ? :
      Connecting...
      } + {true ? :
      Connecting...
      } diff --git a/tauri-app/src/components/FindFriends/index.css b/tauri-app/src/components/FindFriends/index.css new file mode 100644 index 0000000..1c3afee --- /dev/null +++ b/tauri-app/src/components/FindFriends/index.css @@ -0,0 +1,79 @@ +.find-friends-container { + width: 500px; + height: max-content; + min-height: 420px; + background: var(--color-white); + border-radius: 15px; + padding: 20px; +} + +.find-friends-container h3 { + font-family: "Pacifico"; +} + +.loading-container { + display: flex; + justify-content: center; + align-items: center; + flex-direction: center; + width: 480px; + height: max-content; + margin: auto auto; + min-height: 300px; + position: relative; +} + +.pluse-container { + width: 100px; + height: 100px; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + border-radius: 50%; + font-size: 30px; + color: var(--color-white); + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.g-pluse { + position: absolute; + width: 100px; + height: 100px; + background: var(--color-green); + border-radius: 50%; + top: 100px; + transform: scale(1.5); + animation: pulseAnim 2s ease-out infinite; +} + +.b-pluse { + position: absolute; + width: 100px; + height: 100px; + background: var(--color-blue); + border-radius: 50%; + top: 100px; + transform: scale(1.5); + animation: pulseAnim 2s ease-out infinite; + animation-delay: 1s; +} + +@keyframes pulseAnim { + 100% { + transform: scale(2.5); + opacity: 0; + } +} + +@media (max-width: 750px) { + .find-friends-container { + width: 320px; + padding: 10px; + } + + .loading-container { + width: 310px; + } +} diff --git a/tauri-app/src/components/FindFriends/index.tsx b/tauri-app/src/components/FindFriends/index.tsx new file mode 100644 index 0000000..4a288d1 --- /dev/null +++ b/tauri-app/src/components/FindFriends/index.tsx @@ -0,0 +1,79 @@ +import "./index.css"; +import React, { FC, useState, useRef } from "react"; + +const FriendRequest: FC = () => { + const [isCopied, setIsCopied] = useState(false); + const copyRef = useRef(null); + + return ( +
      +
      + +
      +

      @Hello.world

      +
      + + {!isCopied ? ( + { + copyRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
      +
      +
      +
      + +
      +
      + ); +}; + +const index: FC = () => { + const [isLoading, setIsLoading] = useState(true); + setTimeout(() => { + setIsLoading(false); + }, 5000); + return ( +
      + {isLoading ? ( + <> +
      +
      +
      + +
      + +
      +
      +

      Recommending friends based off medical records...

      + + ) : ( + <> +
      + {[1, 2, 3, 4, 5, 6, 7].map((num) => { + return ; + })} +
      + + )} +
      + ); +}; + +export default index; diff --git a/tauri-app/src/components/FriendRequests/index.css b/tauri-app/src/components/FriendRequests/index.css new file mode 100644 index 0000000..ba82165 --- /dev/null +++ b/tauri-app/src/components/FriendRequests/index.css @@ -0,0 +1,127 @@ +.friend-request-container { + box-shadow: var(--box-shadow-black); + padding: 5px 8px; + border-radius: 5px; + width: 280px; + margin: 18px 0px; +} + +.friend-requests-container:n-child(1) { + margin-top: 60px; +} + +.btn-container { + display: flex; + justify-content: space-around; + align-items: center; +} + +.btn-container button { + width: max-content; + padding: 4px 12px; + outline: none; + border-radius: 3px; + border: none; + font-family: "Roboto"; + margin: 8px 0px; + font-weight: 800; + color: var(--color-white); + text-transform: uppercase; +} + +.btn-container button:nth-child(1) { + background: var(--color-green); + box-shadow: var(--box-shadow-green); +} + +.btn-container button:nth-child(2) { + background: var(--color-red); + box-shadow: var(--box-shadow-red); +} + +.friend-request-header { + display: flex; + justify-content: space-between; + align-items: center; + font-family: "Roboto"; + text-align: left; +} + +.friend-request-header img { + width: 50px; + height: 50px; + border-radius: 5px; +} + +.friend-request-header input { + padding: 4px 8px; + background: var(--color-slate-accent); + border: none; + border-radius: 3px; + font-family: "Roboto"; + margin: 8px 0; + margin-right: 10px; + outline: none; +} + +.friend-requests-container { + width: 400px; + height: max-content; + border-radius: 15px; + background: var(--color-white); + padding: 20px; +} + +.friend-requests-container h1 { + padding: 8px 10px; + font-family: "Pacifico"; +} + +.requests-container { + height: 420px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + overflow-y: scroll; + overflow-x: hidden; + text-align: center; +} + +.requests-container::-webkit-scrollbar { + width: 6px; +} + +.requests-container::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; +} + +.requests-container::-webkit-scrollbar-thumb { + width: 2px; + background: var(--color-blue); + border-radius: 5px; + margin: 0 3px; +} + +@media (max-width: 750px) { + .friend-requests-container { + width: 300px; + } + + .friend-request-container { + width: 270px; + } + + .friend-request-header img { + margin-right: 5px; + } + + .btn-container button { + padding: 8px 10px; + } + + .friend-requests-container:n-child(1) { + margin-top: 110px; + } +} diff --git a/tauri-app/src/components/FriendRequests/index.tsx b/tauri-app/src/components/FriendRequests/index.tsx new file mode 100644 index 0000000..ad5d819 --- /dev/null +++ b/tauri-app/src/components/FriendRequests/index.tsx @@ -0,0 +1,60 @@ +import "./index.css"; +import React, { FC, useState, useRef } from "react"; + +const FriendRequest: FC = () => { + const [isCopied, setIsCopied] = useState(false); + const copyRef = useRef(null); + + return ( +
      +
      + +
      +

      @Hello.world

      +
      + + {!isCopied ? ( + { + copyRef.current.select(); + document.execCommand("copy"); + setIsCopied(true); + }} + className="fa-regular fa-copy" + > + ) : ( + + )} +
      +
      +
      +
      + + +
      +
      + ); +}; +const index: FC = () => { + return ( +
      e.stopPropagation()} + > +

      Friend Requests!

      +
      + {[1, 2, 3, 4, 5, 6, 7].map((num) => { + return ; + })} +
      +
      + ); +}; + +export default index; diff --git a/tauri-app/src/components/UserMobileProfile/index.tsx b/tauri-app/src/components/UserMobileProfile/index.tsx index e25db19..272b42c 100644 --- a/tauri-app/src/components/UserMobileProfile/index.tsx +++ b/tauri-app/src/components/UserMobileProfile/index.tsx @@ -2,19 +2,35 @@ import React, { FC } from "react"; import "./index.css"; +interface friendUtils { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + +interface findFriends { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + interface UserProfileProps { username: String; profile_pic: String; cover_pic: String; about_user: String; friends: Number; + friendRequetsUtils: friendUtils[]; + findFriendsUtils: findFriendUtils[]; } + const index: FC = ({ username, profile_pic, cover_pic, about_user, friends, + friendRequests, + friendRequestsUtils, + findFriendsUtils }) => { return (
      @@ -30,6 +46,17 @@ const index: FC = ({

      Friends | {friends}

      +

      + +

      + +
      + friendRequestsUtils[1](!friendRequestsUtils[0])} + className="fa fa-bell" + > + {friendRequests} +
      diff --git a/tauri-app/src/components/UserProfile/index.css b/tauri-app/src/components/UserProfile/index.css index 084e0cd..d827ddc 100644 --- a/tauri-app/src/components/UserProfile/index.css +++ b/tauri-app/src/components/UserProfile/index.css @@ -49,8 +49,63 @@ top: 15px; } +.bell-container { + position: absolute; + right: 10px; + top: 22px; +} + +.bell-container i { + font-size: 25px; + color: var(--color-white); +} + +.bell-container span { + font-family: "Roboto"; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + color: var(--color-white); + padding: 2px 4px; + border-radius: 10px; + border: 2px solid var(--color-white); + font-size: 10px; + position: relative; + left: -8px; +} + +.find-friend-btn { + background: transparent; + color: var(--color-white); + font-family: "Roboto"; + border: none; + outline: none; + text-decoration: underline; + cursor: pointer; +} + @media (max-width: 750px) { .userprofile-container { width: 100%; } + + .bell-container { + top: 18px; + } + + .bell-container i { + font-size: 30px; + } + + .find-friend-btn { + padding: 4px 6px; + margin-top: 5px; + background: var(--color-red); + box-shadow: var(--box-shadow-red); + color: var(--color-white); + border-radius: 5px; + font-family: "Roboto"; + border: none; + outline: none; + text-decoration: none; + } } diff --git a/tauri-app/src/components/UserProfile/index.tsx b/tauri-app/src/components/UserProfile/index.tsx index 59c87f0..fe9ff90 100644 --- a/tauri-app/src/components/UserProfile/index.tsx +++ b/tauri-app/src/components/UserProfile/index.tsx @@ -2,19 +2,35 @@ import React, { FC } from "react"; import "./index.css"; +interface friendUtils { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + +interface findFriends { + showFriendRequests: boolean; + setShowFriendRequests: () => void; +} + interface UserProfileProps { username: String; profile_pic: String; cover_pic: String; about_user: String; friends: Number; + friendRequetsUtils: friendUtils[]; + findFriendsUtils: findFriendUtils[]; } + const index: FC = ({ username, profile_pic, cover_pic, about_user, friends, + friendRequests, + friendRequestsUtils, + findFriendsUtils, }) => { return (
      @@ -28,8 +44,23 @@ const index: FC = ({ >

      @{username}

      - Friends | {friends} + Friends {friends} +

      +

      +

      +
      + friendRequestsUtils[1](!friendRequestsUtils[0])} + className="fa fa-bell" + > + {friendRequests} +
      diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 04e3063..282d2c4 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -1,8 +1,9 @@ import "./index.css"; import UserProfile from "../../components/UserProfile/"; import UserFriendList from "../../components/UserFriendList/"; - import Chat from "../../components/Chat/"; +import FriendRequests from "../../components/FriendRequests/"; +import FindFriends from "../../components/FindFriends/"; import UserMobileProfile from "../../components/UserMobileProfile/"; import UserMobileFriendList from "../../components/UserMobileFriendList/"; @@ -12,19 +13,38 @@ import { useEffect, useState } from "react"; const index = () => { const [friends, setFriends] = useState([ - { profile_pic: "/pg.jpg", username: "@scriptkidd", isOnline: false ,did:"1020383*@(wppwsj)"}, - { profile_pic: "/pg.jpg", username: "@nikki", isOnline: false, newChat: 1,did:"apqpwpudrZpwpsAaap" }, + { + profile_pic: "/pg.jpg", + username: "@scriptkidd", + isOnline: false, + did: "1020383*@(wppwsj)", + }, + { + profile_pic: "/pg.jpg", + username: "@nikki", + isOnline: false, + newChat: 1, + did: "apqpwpudrZpwpsAaap", + }, { profile_pic: "/pm.jpg", username: "@gregidd", isOnline: true, newChat: 7, - did:"12340APDPDISavavagaAjd" + did: "12340APDPDISavavagaAjd", + }, + { + profile_pic: "/pic.jpg", + username: "@scdd", + isOnline: false, + newChat: 4, + did: "APSOWJEHDHaksosodoQPPE1O", }, - { profile_pic: "/pic.jpg", username: "@scdd", isOnline: false, newChat: 4 ,did:"APSOWJEHDHaksosodoQPPE1O"}, ]); const [isMobile, setIsMobile] = useState(false); const [hideChat, setHideChat] = useState(false); + const [showFriendRequests, setShowFriendRequests] = useState(false); + const [showFindFriends, setShowFindFriends] = useState(false); useEffect(() => { if (window.innerWidth < 750) { @@ -33,7 +53,7 @@ const index = () => { } setIsMobile(false); - }, []); + }, [window.innerWidth]); if (isMobile) { return ( @@ -46,18 +66,40 @@ const index = () => { profile_pic={"/pg.jpg"} cover_pic={"/pic.jpg"} friends={45} + friendRequests={5} + friendRequestsUtils={[showFriendRequests, setShowFriendRequests]} + findFriendsUtils={[showFindFriends, setShowFindFriends]} /> {hideChat && (
      - + +
      + )} + + {showFriendRequests && ( +
      setShowFriendRequests(false)} + className="data-container" + > + +
      + )} + {showFindFriends && ( +
      setShowFindFriends(false)} + className="data-container" + > +
      )}
      @@ -74,14 +116,36 @@ const index = () => { profile_pic={"/pg.jpg"} cover_pic={"/pic.jpg"} friends={45} + friendRequests={5} + friendRequestsUtils={[showFriendRequests, setShowFriendRequests]} + findFriendsUtils={[showFindFriends, setShowFindFriends]} + /> + -
      + + {showFriendRequests && ( +
      setShowFriendRequests(false)} + className="data-container" + > + +
      + )} + + {showFindFriends && ( +
      setShowFindFriends(false)} + className="data-container" + > + +
      + )}
      ); }; From 7552db063ec523f144ed9d3b79079b12e3d1a32a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:11:55 +0100 Subject: [PATCH 117/124] minor typo fix --- tauri-app/src/App.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 3a39460..78b72c9 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -28,7 +28,14 @@ const router = createHashRouter([ element: , }, { path: "/contact", element: }, - { path: "/chat", element: }, + { + path: "/chat", + element: ( + + + + ), + }, { path: "/chatConnect", element: }, ], }, @@ -46,7 +53,7 @@ function App() { return ( <> <> - {true ? :
      Connecting...
      } + {web5 ? :
      Connecting...
      } From 27a7c669dc1c11cd53b00bd4d1d70969a04b148a Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:20:18 +0100 Subject: [PATCH 118/124] fixed some merge conflicts --- tauri-app/src/components/FindFriends/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/components/FindFriends/index.tsx b/tauri-app/src/components/FindFriends/index.tsx index 4a288d1..9bb907e 100644 --- a/tauri-app/src/components/FindFriends/index.tsx +++ b/tauri-app/src/components/FindFriends/index.tsx @@ -50,7 +50,7 @@ const index: FC = () => { setIsLoading(false); }, 5000); return ( -
      +
      e.stopPropagation()}> {isLoading ? ( <>
      From d10c18c3963a74bbd88123a72c57acc484d42281 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 22:20:34 +0100 Subject: [PATCH 119/124] fixed some merge conflicts --- tauri-app/src/pages/Chat/index.tsx | 49 ++++++------------------------ 1 file changed, 10 insertions(+), 39 deletions(-) diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index acc49b7..044dd82 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -154,27 +154,15 @@ const index = () => { return (
      >>>>>> 499f1964de53b184725503bcf7efa766f1394645 - /> - {
      @@ -204,9 +191,7 @@ const index = () => { className="data-container" > -======= setHideChat={setHideChat} hideChat={hideChat} /> ->>>>>>> 499f1964de53b184725503bcf7efa766f1394645
      )}
      @@ -216,32 +201,18 @@ const index = () => {
      - -======= - username={`${profile.firstName}${profile.lastName}`} + username={`${profile.firstName}${profile.lastName}`} about_user={profile.description} profile_pic={profile.profilePictureUrl} cover_pic={profile.profilePictureUrl} friends={friends.length} + friendRequests={5} + friendRequestsUtils={[showFriendRequests, setShowFriendRequests]} + findFriendsUtils={[showFindFriends, setShowFindFriends]} + /> ->>>>>>> 499f1964de53b184725503bcf7efa766f1394645
      From 643dad47182122e5311a1ab400a3d6fecc3bd9c1 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 23:33:15 +0100 Subject: [PATCH 120/124] bugs fixed --- tauri-app/src/App.tsx | 2 +- tauri-app/src/components/FindFriends/index.tsx | 5 ++++- tauri-app/src/pages/Chat/index.tsx | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 78b72c9..a911cd8 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -53,7 +53,7 @@ function App() { return ( <> <> - {web5 ? :
      Connecting...
      } + {true ? :
      Connecting...
      } diff --git a/tauri-app/src/components/FindFriends/index.tsx b/tauri-app/src/components/FindFriends/index.tsx index 9bb907e..ce07ba3 100644 --- a/tauri-app/src/components/FindFriends/index.tsx +++ b/tauri-app/src/components/FindFriends/index.tsx @@ -50,7 +50,10 @@ const index: FC = () => { setIsLoading(false); }, 5000); return ( -
      e.stopPropagation()}> +
      e.stopPropagation()} + > {isLoading ? ( <>
      diff --git a/tauri-app/src/pages/Chat/index.tsx b/tauri-app/src/pages/Chat/index.tsx index 044dd82..5450385 100644 --- a/tauri-app/src/pages/Chat/index.tsx +++ b/tauri-app/src/pages/Chat/index.tsx @@ -191,7 +191,6 @@ const index = () => { className="data-container" > - setHideChat={setHideChat} hideChat={hideChat} />
      )}
      From c15abe2ab75eb5c9dbf9a25bd2999a88ab526a55 Mon Sep 17 00:00:00 2001 From: lawrenceuchenye Date: Mon, 8 Jan 2024 23:54:22 +0100 Subject: [PATCH 121/124] fixes done and pushed --- tauri-app/src/components/FindFriends/index.css | 1 + tauri-app/src/components/UserMobileProfile/index.tsx | 11 ++++++++--- tauri-app/src/components/UserProfile/index.tsx | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tauri-app/src/components/FindFriends/index.css b/tauri-app/src/components/FindFriends/index.css index 1c3afee..3618e78 100644 --- a/tauri-app/src/components/FindFriends/index.css +++ b/tauri-app/src/components/FindFriends/index.css @@ -5,6 +5,7 @@ background: var(--color-white); border-radius: 15px; padding: 20px; + margin-top: 30px; } .find-friends-container h3 { diff --git a/tauri-app/src/components/UserMobileProfile/index.tsx b/tauri-app/src/components/UserMobileProfile/index.tsx index 272b42c..eae5b80 100644 --- a/tauri-app/src/components/UserMobileProfile/index.tsx +++ b/tauri-app/src/components/UserMobileProfile/index.tsx @@ -30,7 +30,7 @@ const index: FC = ({ friends, friendRequests, friendRequestsUtils, - findFriendsUtils + findFriendsUtils, }) => { return (
      @@ -42,12 +42,17 @@ const index: FC = ({ }} className="m-cover-container" > -

      @{username}

      +

      @{username.slice(0, 10) + "..."}

      Friends | {friends}

      - +

      diff --git a/tauri-app/src/components/UserProfile/index.tsx b/tauri-app/src/components/UserProfile/index.tsx index fe9ff90..038de71 100644 --- a/tauri-app/src/components/UserProfile/index.tsx +++ b/tauri-app/src/components/UserProfile/index.tsx @@ -42,7 +42,7 @@ const index: FC = ({ }} className="cover-container" > -

      @{username}

      +

      @{username.slice(0, 10) + "..."}

      Friends {friends}

      From 97d92dc61cbc72b97389cef9edb88dc0de77eb0b Mon Sep 17 00:00:00 2001 From: coder12git Date: Tue, 9 Jan 2024 10:29:20 +0530 Subject: [PATCH 122/124] removed unwanted routes Signed-off-by: coder12git --- tauri-app/src/App.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index a911cd8..985fc9b 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -9,7 +9,6 @@ import SharedLayout from "./pages/SharedLayout/"; import Records from "./pages/Records"; import Chat from "./pages/Chat/"; import { Toaster } from "react-hot-toast"; -import ChatConnect from "./pages/chat"; import ProfileGuard from "./components/Auth/Profile/Guard"; const router = createHashRouter([ @@ -35,8 +34,7 @@ const router = createHashRouter([ ), - }, - { path: "/chatConnect", element: }, + } ], }, ]); From cdb8a79ff8444a07b8c97dfab0900d4e7ffd260b Mon Sep 17 00:00:00 2001 From: Suruchi Kumari Date: Tue, 9 Jan 2024 11:08:47 +0530 Subject: [PATCH 123/124] Update video in readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d7151e..ebe173e 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,10 @@ npm run dev ## Explainer video (User POV) -https://github.com/coder12git/Web5-Hack/assets/58889001/b5c4aa11-426c-492b-88fb-37425991ab47 + + +https://github.com/coder12git/Web5-Hack/assets/108334168/f465aff5-d1b9-4116-bb91-87e1906baec6 + ## Demo Video (Clients POV) From b9fe504b1d0f328542013b50db6d4e2c02509c4f Mon Sep 17 00:00:00 2001 From: coder12git Date: Tue, 9 Jan 2024 11:18:55 +0530 Subject: [PATCH 124/124] make web5 in app.tsx Signed-off-by: coder12git --- tauri-app/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri-app/src/App.tsx b/tauri-app/src/App.tsx index 985fc9b..0f543ce 100644 --- a/tauri-app/src/App.tsx +++ b/tauri-app/src/App.tsx @@ -51,7 +51,7 @@ function App() { return ( <> <> - {true ? :
      Connecting...
      } + {web5 ? :
      Connecting...
      }