From 4b7bf4c6b2d7aae462be592d019d509abf59e0a1 Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 13:34:16 +0700 Subject: [PATCH] feat: add signup --- package-lock.json | 280 +++++++++++++++++++++++++++ package.json | 1 + src/app/auth/signup/page.tsx | 32 +++ src/components/auth/signupButton.tsx | 25 +++ src/components/auth/signupForm.tsx | 60 ++++++ src/types/database.types.ts | Bin 0 -> 34556 bytes 6 files changed, 398 insertions(+) create mode 100644 src/app/auth/signup/page.tsx create mode 100644 src/components/auth/signupButton.tsx create mode 100644 src/components/auth/signupForm.tsx create mode 100644 src/types/database.types.ts diff --git a/package-lock.json b/package-lock.json index ac30d67..2d4a09d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8", + "supabase": "^1.200.3", "tailwindcss": "^3.4.1", "typescript": "^5" } @@ -254,6 +255,18 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -1881,6 +1894,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2174,6 +2199,21 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/bin-links": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", + "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", + "dev": true, + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -2322,6 +2362,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/class-variance-authority": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", @@ -2354,6 +2403,15 @@ "node": ">=6" } }, + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2552,6 +2610,15 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -3482,6 +3549,29 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3576,6 +3666,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3902,6 +4004,19 @@ "node": ">= 0.4" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4660,6 +4775,49 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4784,6 +4942,43 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4792,6 +4987,15 @@ "node": ">=0.10.0" } }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5472,6 +5676,15 @@ "pify": "^2.3.0" } }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6073,6 +6286,25 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/supabase": { + "version": "1.200.3", + "resolved": "https://registry.npmjs.org/supabase/-/supabase-1.200.3.tgz", + "integrity": "sha512-3NdhqBkfPVlm+rAhWQoVcyr54kykuAlHav/GWaAoQEHBDbbYI1lhbDzugk8ryQg92vSLwr3pWz0s4Hjdte8WyQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bin-links": "^4.0.3", + "https-proxy-agent": "^7.0.2", + "node-fetch": "^3.3.2", + "tar": "7.4.3" + }, + "bin": { + "supabase": "bin/supabase" + }, + "engines": { + "npm": ">=8" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6158,6 +6390,23 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6444,6 +6693,15 @@ "d3-timer": "^3.0.1" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -6653,6 +6911,19 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -6681,6 +6952,15 @@ "@babel/runtime-corejs3": "^7.16.5" } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/yaml": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", diff --git a/package.json b/package.json index 1ea5e8a..24ab385 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8", + "supabase": "^1.200.3", "tailwindcss": "^3.4.1", "typescript": "^5" } diff --git a/src/app/auth/signup/page.tsx b/src/app/auth/signup/page.tsx new file mode 100644 index 0000000..b280f2b --- /dev/null +++ b/src/app/auth/signup/page.tsx @@ -0,0 +1,32 @@ +import Image from "next/image"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardFooter, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; + +import { SignupButton } from "@/components/auth/signupButton"; +import { SignupForm } from "@/components/auth/signupForm"; + +export default function Signup() { + return ( +
+ + + Join Our Community + + Create an account and be a part of a thriving community of investors and innovators. + + + +

Sign Up With

+ +
+ +
+ + By signing up, you agree to the Terms of Service and acknowledge you’ve read our Privacy Policy. + +
+
+ ); +} diff --git a/src/components/auth/signupButton.tsx b/src/components/auth/signupButton.tsx new file mode 100644 index 0000000..4e7e339 --- /dev/null +++ b/src/components/auth/signupButton.tsx @@ -0,0 +1,25 @@ +"use client"; + +import Image from "next/image"; +import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; +import { Button } from "@/components/ui/button"; + +export function SignupButton(props: { nextUrl?: string }) { + const supabase = createSupabaseClient(); + + const handleSignup = async () => { + await supabase.auth.signInWithOAuth({ + provider: "google", + options: { + redirectTo: `${location.origin}/auth/callback?next=${props.nextUrl || ""}`, + }, + }); + }; + + return ( + + ); +} diff --git a/src/components/auth/signupForm.tsx b/src/components/auth/signupForm.tsx new file mode 100644 index 0000000..aaca740 --- /dev/null +++ b/src/components/auth/signupForm.tsx @@ -0,0 +1,60 @@ +"use client"; + +import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; +import { useState } from "react"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { useRouter } from "next/navigation"; +import toast from "react-hot-toast"; + +export function SignupForm() { + const router = useRouter(); + const supabase = createSupabaseClient(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + + const handleSignup = async (event: React.MouseEvent) => { + event.preventDefault(); + + if (password !== confirmPassword) { + alert("Passwords do not match!"); + return; + } + + const { error } = await supabase.auth.signUp({ + email, + password, + }); + + if (error) { + toast.error(error.message); + } else { + toast.success("Account created successfully!"); + router.push("/"); + } + }; + + return ( +
+ setEmail(e.target.value)} placeholder="Email" /> + setPassword(e.target.value)} + placeholder="Password" + /> + setConfirmPassword(e.target.value)} + placeholder="Confirm Password" + /> + +
+ ); +} diff --git a/src/types/database.types.ts b/src/types/database.types.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd875f5903da834733f1af5922cb8ddeb10be53d GIT binary patch literal 34556 zcmeHQTW{P{5cV??{~^i)0;w;&qSC6RjT8_xYExcT(JI%nB{yZ$LR9+Kf%$xPaxOEr z$H(@r16H*4*6TB8F5g_v#r8jcpB8@>*Tq$FQ`{C?^tq$|ozk}-izS`Cq;KCBUlw1` zajW=?K1;ghrdZG~@1paU#fRdeIHI;U(fK2ya#ftu`9o?GQbLP!`U}r}q8?_&?{xKD z@mlCFa6Tg9h) zde_w75pldIj!RzrFVN0@*%Fd2m0xkiGve=r^n)v^uEBM$Nn?Lh(7^BbJ0>n*tyD|S zN~vzS6(5hO2j~vAyeoEzE6~ww$SwGIT=EY+LEH0EV<``8QEtP>MT>rbNnq`e^!)>U zhn3TQY_eVx$5+M25+TRgR2=S4sr_vxA4}3WY?dR3$298_$6c}*a0=grZel!!S29|j zX7b)IUL+TFh;dh2u&H52_LYa4Tsk3c@@X(~awzE7c}sErr1V~g$8}=INnx?57Hy;s zCiH}PH1vCX_i;yRuGtrK^t`61b6%onL9rE4=r@XO*K|Z2n%!s2l$UCh;mR|jh3vSX z+TybKiN4(xzfdn1^bK^klMFhiESTo8IZ<)-!*(SX=nE~+DI#B#+&iwf6?)sNx*?T> z|GyxaUlEN{%KulZZ=iNoW-dhMDs+MZq&=e#j+fLsa%!quCpmJU&)D^{X;jf(%8QI# zC*kMfk;=cTrC0|zN}N0=ewSs|?W5i~N~ndn2y4=2M1$Lu+CCu-buV-s#w8oIHg(N= zvIDATSlZQ_IrRW!I44TSfe(WB_L_i=fIn*uDD4bh?3GBWdA4ItY^t-Q%rSOb%C=QL ztXVTxlGL8Lbo#NVy*`*MT7`}wENa81?xksFSy$G6p2Y5XW&G`yy;CG|RIkf$h#~9B z;i(=xe^m$qcjL_F%saA*)aY!mPYqx4sj64wautY~(t9SE|@uGUnILzg3)5v*2 z5eYM%ZzvXGjuo}sgrD`tv4@JEopO|qy0dQmz>=9U7lT$iVH`3qC|eJo zrQOW^d+PO=d|{WkK%e3G+#c8M*}7SB86}1oTlOivJ%f)|dRxsSvoWGaQ&!h-gm!vm zi(l{uU7?7dHwOh3sulI4yk>@Y4 z6>8~c#3Qerr1gU>Z!@K^D%YwJ8#UCHDIc2skYN^qrjcv7S7<)ng~M5ik1{)?y*Bf! zW5^yEbbCttHgf{0*bbpZWmV9QR%+8+da$Z&+s3X^D^;zfWo6IJTF`B4kA;(M-L5$H zH$G}UI}Y1!stT^l7xR0sPCe1r#^2H!b(Jqb>-t(gM~js1SZd@KtNax5S1%{V8tHC< ze%JM(&8}mfdTYzr4YmZ!GrRdvIf*&~m6YP%r3cu*@JGl4twfu3Wi%FJ=M*Qp+}F!g3Qyhq5c})dIzHZlYYKSvHq0C z`nV6{UB}$jCg-?4{TKIR^Y$4IYklw3_FDXxk|TfEb5`4ts?#d+x6Dtr4Bm%)_FT0| z`J{&I7TjEp3jJnI^_I7Ix0n`E8cR$YS5@B6cq_J__qJ}<^K`~yyZtgwZn~1NLF~+w8w32aQWZ2cUbTBY3q>gIPJ_FZraA}=Rq+3 z)Arb6jIp2@MT|4`d|=s|aaOV0J%2>JXfb=TsE`e7*?77do{rIe9E}WlQMT4}2YT&S z=Hfi2X{W0Cf}L(?RS(Y#>yMvXs>ne3yeFD^#R-0G`(NsClw11)NwRH~o`Dw4PeLp? zYD>}_@0qrZLaNau`Lj_R4o|rp)gvm0s*Wl9SboA3KSwhcQ_^Zx-qRGNBqbY9>q6By z#>QHF$Gi~dYSdi%-DSuqz9P%p=Uhj7ELGV~h5VbY%laQxH)BEO0FQureM~!`XEa(v zeNcz%F3+rs=LFJK{BAY(2}OjyR^6b3w4$ww@fYQ)gxrgO*pt$*Mfa5ATdJ$vh@^du zCA}f#Ns~*jG3<4#ZVQ*~+RFfI$V{p6?Zznj-VoSBQt4umTzUGmiM{TdY*P0WS7{T8 z6%BE^r;MX+O5^LC#_!d>;j?63om5A=E}y_>*Y$+BR3l@Vzv{nEN+q41jsYFZzZ`J{cez9veTm;1H!YV1+QJ(TX*%I;}f;XI)| zrrN8IcJ+cLd46UeM)uSy`ph)YJyzL=%%=GshV`j#KBiYypxNGY+W2c9J8A76rAwLX zCG9ZUhopA@8Hc1&v-UXIRC~7f7Os*ePicM=%sB9q#veO+CQtEi*|2!Zep&5w^NjJv z{V_-CT;4VrTR%r*0aVDR^!(4N8e~Rm7pUm)mN=~0V;%N}-j@Qj`TvK$9n*KK0(iD3 zzePsJY1e*U5;u6$%TRJ){D3E-;*DkQo=46|L-go$=>COnZ&&Xw*(&x(N`61x8+s}Z z?o7a}hkK7*`gXfn@si&Chc)rT^7*QdSMSZaqVeX|>fI#%U3ib^+&0PRd)O|X7~ZLe z_ye9W_x<=DT_LCb3f}eqigTeJX3roxHwTTi7Yo zp2twfPZOEG7WkM&I<#;J-G+LDb`R*?QM!#nZg`d?)oh~)n!QTN#@q>l`zw0Ddb2t zEFN_xJ^HMWMR{dap*UfvgbO-m5GL3iX il@>jOxi-XLT6;2WX*FoW-ZHK`nJUXBIrh@(QRiR9Sc78# literal 0 HcmV?d00001