From b74f4b0e066b66715bf1e7015b29b065d4008e3e Mon Sep 17 00:00:00 2001 From: Cecilia Sanare Date: Wed, 6 Mar 2024 17:12:51 -0600 Subject: [PATCH] chore: migrated ui from db --- .editorconfig | 17 +++++++ .github/workflows/ci.yml | 59 ++++++++++++++++++++++ .gitignore | 8 +++ .postcssrc.json | 8 +++ .prettierrc | 7 +++ .vscode/settings.json | 23 +++++++++ .vscode/tailwind.json | 55 ++++++++++++++++++++ LICENSE | 7 +++ Makefile | 6 +++ README.md | 8 +++ bun.lockb | Bin 0 -> 134506 bytes flake.lock | 27 ++++++++++ flake.nix | 15 ++++++ index.html | 28 +++++++++++ nixpkgs.nix | 8 +++ package.json | 33 ++++++++++++ shell.nix | 15 ++++++ src/App.tsx | 35 +++++++++++++ src/components/AppFooter.tsx | 47 ++++++++++++++++++ src/components/AppHeader.tsx | 77 ++++++++++++++++++++++++++++ src/components/AppImage.tsx | 25 ++++++++++ src/components/Button.tsx | 71 ++++++++++++++++++++++++++ src/components/Card.tsx | 11 ++++ src/components/Code.tsx | 33 ++++++++++++ src/components/Divider.tsx | 5 ++ src/components/Label.tsx | 15 ++++++ src/components/Pill.tsx | 9 ++++ src/context/search.ts | 5 ++ src/index.css | 11 ++++ src/index.tsx | 34 +++++++++++++ src/pages/Dashboard.tsx | 39 +++++++++++++++ src/pages/Tweak.tsx | 94 +++++++++++++++++++++++++++++++++++ src/types/index.ts | 1 + src/types/tweaks.ts | 22 ++++++++ src/utils/cn.ts | 6 +++ src/utils/fetch.ts | 12 +++++ tailwind.config.ts | 7 +++ tsconfig.json | 27 ++++++++++ vite.config.ts | 23 +++++++++ 39 files changed, 933 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .postcssrc.json create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 .vscode/tailwind.json create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 index.html create mode 100644 nixpkgs.nix create mode 100644 package.json create mode 100644 shell.nix create mode 100644 src/App.tsx create mode 100644 src/components/AppFooter.tsx create mode 100644 src/components/AppHeader.tsx create mode 100644 src/components/AppImage.tsx create mode 100644 src/components/Button.tsx create mode 100644 src/components/Card.tsx create mode 100644 src/components/Code.tsx create mode 100644 src/components/Divider.tsx create mode 100644 src/components/Label.tsx create mode 100644 src/components/Pill.tsx create mode 100644 src/context/search.ts create mode 100644 src/index.css create mode 100644 src/index.tsx create mode 100644 src/pages/Dashboard.tsx create mode 100644 src/pages/Tweak.tsx create mode 100644 src/types/index.ts create mode 100644 src/types/tweaks.ts create mode 100644 src/utils/cn.ts create mode 100644 src/utils/fetch.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d330a4c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab +indent_size = 4 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5fb2562 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,59 @@ +name: Deploy tweaks to GitHub Pages + +on: + push: + branches: ['main'] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: write + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: 'pages' + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - run: bun ci + + - name: Validate Tweaks + run: bun test + + - run: bun run build + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: './dist' + + deploy: + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c09d625 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +tweaks/schema.json +tweaks/tweaks.json +tweaks/*.md +# Ignore any sub directories under tweaks +tweaks/*/ +dist/ +*.py diff --git a/.postcssrc.json b/.postcssrc.json new file mode 100644 index 0000000..9ac0be0 --- /dev/null +++ b/.postcssrc.json @@ -0,0 +1,8 @@ +{ + "plugins": { + "autoprefixer": {}, + "tailwindcss/nesting": {}, + "tailwindcss": {}, + "cssnano": {} + } +} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b088170 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "trailingComma": "es5", + "semi": true, + "singleQuote": true, + "editorconfig": true, + "printWidth": 120 +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..509f1b3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,23 @@ +{ + "css.customData": [".vscode/tailwind.json"], + "nixEnvSelector.suggestion": false, + "editor.detectIndentation": false, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": ["source.addMissingImports", "source.fixAll.eslint"], + "[nix]": { + "editor.defaultFormatter": "jnoortheen.nix-ide" + }, + "nix.enableLanguageServer": true, + "nix.serverPath": "nixd", + "[toml]": { + "editor.defaultFormatter": "tamasfe.even-better-toml" + }, + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer" + }, + "nixEnvSelector.nixFile": "${workspaceFolder}/shell.nix", + "nixEnvSelector.args": "--impure", + "tailwindCSS.suggestions": true, + "tailwindCSS.experimental.classRegex": ["className: '(.*)'"] +} diff --git a/.vscode/tailwind.json b/.vscode/tailwind.json new file mode 100644 index 0000000..96a1f57 --- /dev/null +++ b/.vscode/tailwind.json @@ -0,0 +1,55 @@ +{ + "version": 1.1, + "atDirectives": [ + { + "name": "@tailwind", + "description": "Use the `@tailwind` directive to insert Tailwind's `base`, `components`, `utilities` and `screens` styles into your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#tailwind" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS. This is useful when you find a common utility pattern in your HTML that you’d like to extract to a new component.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply" + } + ] + }, + { + "name": "@responsive", + "description": "You can generate responsive variants of your own classes by wrapping their definitions in the `@responsive` directive:\n```css\n@responsive {\n .alert {\n background-color: #E53E3E;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#responsive" + } + ] + }, + { + "name": "@screen", + "description": "The `@screen` directive allows you to create media queries that reference your breakpoints by **name** instead of duplicating their values in your own CSS:\n```css\n@screen sm {\n /* ... */\n}\n```\n…gets transformed into this:\n```css\n@media (min-width: 640px) {\n /* ... */\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#screen" + } + ] + }, + { + "name": "@variants", + "description": "Generate `hover`, `focus`, `active` and other **variants** of your own utilities by wrapping their definitions in the `@variants` directive:\n```css\n@variants hover, focus {\n .btn-brand {\n background-color: #3182CE;\n }\n}\n```\n", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variants" + } + ] + } + ] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..df09573 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2023 Rainbow Café + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e9f5960 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +develop: +ifeq ($(shell printenv IN_NIX_SHELL),) + @nix develop --impure --command $(shell printenv SHELL) +else + $(info You are already running in a nix shell!) +endif diff --git a/README.md b/README.md new file mode 100644 index 0000000..147d2f4 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +## Protontweaks UI + +> [!IMPORTANT] +> This is the Protontweaks UI repository, you can find its sister repositories at the following links! + +- [CLI](https://github.com/rain-cafe/protontweaks) +- [App](https://github.com/rain-cafe/protontweaks-ui) _(you are here)_ +- [Database](https://github.com/rain-cafe/protontweaks-db) diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..75186a93ce2087acc0fad98f2944d0b16f9e30b0 GIT binary patch literal 134506 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ðeZJinz}qnE}~Hp&+Ed!-M>hy8SK}w zOS9*M?)|%au#Zt301wx|tJC?l}8d(PSU(hdYi&{D|B``9%eV%^YRp~>GN1c5-bFH5h zpUK(m{edoJqhnOX(T1}AU%Iis{@z88T-V>5##JJVo5VtNY#!zN>U8bf@4f2h zS+*0Ak~uNwS;=%akn3vjBnZ7t>wfi7D|IBZT}`4%sM7XpWoq&28^P*7K16AKdwwGN z!up2ApG8aQ21P%&^PAt_wX<5_`%R?|hrRP0Q^<7n$#pM#u{XYRReT;h&@et6yNY}M zy5(jkJmarAoZq7wcxkA`Vru0?t?9$2oMW0gkC#bYOfNh5ur4EX-Regq*`kR;52e%jB zD-&;a-FrUAy7<*@M)`=5Wx;z26Q&FGbc+`i$=&wpNz#4pPNs|ADPkjNJP(|X`>fJ; zJj_*Ny)l!eoVDd98X3jJ8fC-XE<5rWUJ_b;ZSK4OsII>JBI4fi2hF?3qk5NIHDZW= z*Ud?*ORj5-MF9y7&T%6CB@=$zDp$PSBf(P9p)a&MfUYFG(Err^P3(*pMXvnt)37;r z{d?fcRb7H^XV-fz89Q~gn)lYcOH-cgYezu?&odKpU6w^sm2Rg@l|F81ynkFFK5~TZ z+k=BAHqaM!?AjJNyjdVYJiN*$Wpubm6()3 zW+c15+nFnJB2jx{m(<(3AT!x0X{!(UqK=zeW0!9_X=&^t9si82;*{w}@e_>|$~A7` z96`xWuJ>JOBXip7&Z9Yt<257KowS|oNjq47a+TD=#+mLP<}<}q+IM%EdFZUtEVQP7 zw%)brlZr{ylTR=C?w>w0oyZ^7I!H%&zOyGMr15s2-6u3wSl66f_nsJ|lDln6r|pJU z9zv6XzRfseRvoXD$7E>kft zZ7d_x-AJzcW$b?KYvrNK7e(&fzk9$ww{&M%njc*S+vV?kENh#9d`P8gQXFQh~UC0{*A>0p^SQL=J zsd8x9=4I@`U%w>fzWzzL6MgQ2fGR_meo}KxrQI@N@00`eyTk4X-x$%~B|2PWW_`0* zcD3z=d*4)}g9GX}7JeqvwIbKO&A|IjMq@%sdu-#AkA04znjTFK)hqY^y!GPsPW?Sh zyEm$RXzjZ9v#dWwRmJ7-K;37C;*yDxhPu|f+{sB7E%%e@T9fNa?a6v?f6Y?)=qu-m z9jkpKZfkBa-W9)x{iA(%Tglblv(_iaWu7}Fn=GXZ`*u1vpVzxUQh_SthS~-hOQxzL z#UIFYZOC;w9Bb*0eSFXBvD#e4;O&FzQOElEQH8P8hC3Psqd#<%^Qd!ve$Kq$$3x@P3?~p?#?rdyGEvq&hFRGU&=0ELxzEe*2Y6 zx#1@V%kM?Ks|N>8CTFoKIi02Hzh}OQJG9HaI^&L2*Tv?0HV1O@vzkB%kDDD91tdgl zDZDN2pQe3WP|1bu@|X96tM6)ZMrP~Jm8a86q)WOa^1J~4P*D-2>kfwPjx=IPV8%`_sruG8=rUr4VP;8!1kza zx3q4xtD`0Y&L6BsX7Z*}+E@2=nrjKQZ_PLMq??u|)7?z2`$I3k@U5bZw+|JE zoA8=_PM5r|np|AIwoIZyrMI0-7rkr8M!2)LjgMwU%<}`X=AG~Jl|sg%U7DI#iH%9M z30c{O_kPV)@wDG4(ZQ(cTru)9;{M0ak)FLjRV*I1+^#Y`*3j(<+* zmhnmDtgE_fW_X8B1w9I^l2&o(r+eG7u_-S4{MLOkj+gX*YM3mp8m3C%W3#l=ED2y~ zI=Z)t=i=J*gefvzM{?bVQ#0wi#=#aW zTS0mfq09cmLhB7x_mhU7Y&}4Dm#5KLS6>xEHC)YieJK3cmGC8DHeFBIjm~|MBGYvy z*R?w%Lp5klYr*kwP~<}T`vsaSLXy~On`$zgowu%t4*T@{fi$n5`-RPHLB3J(wv z@#}e8ys7X@ui5#<>G`#tvRXa*Zo&JRWDZx&7xaUDkH@W4Bk8%Rvwep8nTOT$)sLmE zFJ>pxbtBgud~(@j&o-le$;$aXw1az?FM8N0ro33bNZjk_wnK-xZtrb5+ke*X^`}pA z>JK|El`Ohuv*#h<;GK4ws~`P*KG&Tl(?w?qY=o!5OkBs?a&7Mj=V^ZI>#rZ(#i>om zTEoE?ll4w;hgG=E^*2h3xtJVx9bGf8Kd_I_LDGh)rH+ldcSO zFW7HoFXmg6p)Fl&^l*BiSd7P|El-k?_t3n%DM_a5O|EPH#b}$T{WlRlPDgj)F+;&6 zn@zYCWiyp)O3P*Ha$obr)%e|eKKsSuit1guC+83zMlM}!j?%i}b=rZe|+56E`40~VG-*YzP{n=Neqg0qJ zD7Uh)RK8W!uVHJBqr{30^5pBn7mETCa!g8lF4*2({OENGcUMWLMbXZNW7jwF{W!Qr zs%(d)yV3%8YoUPle$OZ|>jjBQSC205D@|tC4&~-Dy$s?Y7uk6XK zwR*GdZTntRZ5^GaU=MSlvs2WftXBO8g&CHHFGKfA94~q|g^duPe&Xqf`mM+1`yOqU z4nB81e#rLIyEnPzzJ9dbK}+jK{0>ijE_x|uzOI+o?ClYkW4mLF2A1BX-SX(Fce2l; z{7WE&bYJ5r{~dBdF=I` z2SP0x4Wb8IjTc_|>2-Hkr^NnRx(f6^<@!rE42uF1YV&tLhF?awpM<7N>n28D-qiBA z=MrtQN$L?!wL-#==CLH+JHoL=*$ZlRMl)MGeE#Bkm1g+vrM3yRWn)%xbmaR(IJs_K zCRc^1U7=2$x6F!>rNd!uUbg!cR2Fq&whhReKOrha$T?Lnf!iPjc+RETrb&G zPgrbh&iJ67qFI)?Yef3WY2F&q9f>=`5;8;B_zM~if70>cz92YMDx7zyC1?EZ#ycNh zlIfzeFgAj0$o$t8F^j2g=}O7v<B?cp9Xng(MXgS^JfePH6qtGBX<_cWljpK`Sf1Itpg+cPlV@N8&)Gni^Y9k% zWXdD^8ADB-$Jo z?KnAJP48#HJT0Hq#C6|F3=H1r@Sirz=-hqJ`&o*A=>0oGWV$=ZbqQBgOtx5T4jwsv zUE-y5rE9V1w<4(Z_AzUzjarEfzl0T zrMtc8-h=yLC%NvrXd~HE?wM!q2=c!gqjp{=Cg8-tlegpg6}LS>7hk?Ca@}QRZL(mp zAg9adn)kd(0!#-9@fD zGLpqBVBZ+?t>@LI!unh5sd2 z9FMf}T`jaNULa|5r2p<-hLir>dy00vTbR z$SJRNA7JFV-5}gFwba z`sxPReGkXDKO63BPR&~0&YEaK9cV|@)_g*{|Lb0KM#uet-qB$rJh-Q)G~AyRN7z$x z=4<7Zj9sg~?f<%Ihf!b?>M)hP3Lpgi+Uygq+|B&n)GMCU3Eb3e6j8U zEDA{YXxJxp!CJ37aJS-^UP;LrQR|s?{M>s_pL>1DEx;}Ll-xyuYwtoD1DFO2oi8{9 z_{&tv?&Yr(J@<2!&^&j+%^hUA2g!Ad(z&!Fxie#Y`Pdar&uz4bzSYx^S6#>-e?Z8! z!DiCU|HX8|ht0L(Z3A1rNpM=XNJzbSVZ|Y6b9I}E^PyMv=-nZX7yZowHo}Nh(9t1& zozbUV9j`f5!_6lL-XHxQE1h^LWxIO8U~u=y#~+WHeM0Fo2^LND=G)Z^)kg|=-^3T2 zd9WR<{QQ>uT%C+X0SPh1tEalgXpFhlFIuR{z4y4H==<33Rp6zMi$`xQ?NvP?=T;(+ ze8)|k>*Kso--Pt8$a+aCx7}SjV#^ik3TmszK?BEoh+J23gLa|%4bIe&MsBqyjUfRW z&-PoDwQuUEwOFCAx39H}jrG~~jC_~FVy<-PnbS3}fK#Rj_yQ zUK<^caa^L0_>dWq964xxyuQu%*Bkw(T_nvBw3ja43_aTD& zXY5w6oWJJ35_hp^yts)?8D{m+$>Nbgo!#LoLiZ6;SJ5}gW2DHA_FS7Ql@dnd2X0xJ zSMOa%mxhkg?Z>gJdg^Av+a?u*>U7Taw5Og=aLSEb?XG?D zFoVws_cD3#Degk#btn$0`#CsObCpcMq$+q^_DT5)S42{-#_B_+S(j4^mP^X-p4aTK zCrp;f+67>w(RfzUMZAo&GeS|zV4Y!N!oPP1G9r|Km3-pd`NHW4-_zDxZ@=te>Q+K`Sx9p}oo3d8c&qzWbYTM)h9 z;*q+0x|Wgewq;5Cp7rOSQO>h}^-BkfPj;f+1uwuPc2|v~;8q2P{0V%HtqU1>;qpec zxp!G<_wM}!iLtfZrQNOkneLerX9W z{)W6BKS7Iv9A$BfT#9KdPtM_ZjE%yluc|ll-Y)Mx^9akbiCuh_U*soxx=;48-dk46 z4=NMcE+iqArgZ~hcq@5*Zxl<*m33x-2HIcP=gGK!GoX3>JNK&<^mB$)~!|k}w1^qS;%5Of*do!^q zGuE6n*kQ$A!@3;C=5c_~eTvlW<9so{TwBaVYQ(soGng7_+(fY>&)IR&n|s*yF)uBV zsN(BSUp-$^`xxW76%Cx0=6u+|kMC$W^;&B|g2W^NK08Op3xC6)6H0(%xThsjjDWr# zbFoiB;Q4KrM#7RPo=Y_TPJUsf%MZzqNA*kNFAr^mR4zRI%&gr*gsSo!7cwDr!2fu~ zJa_>Jp>ERg#7h8J{tsb*#vx>_ETC|2^A+AJjej;N=#&KAw zo*5tB2|aP7U@e0#}mF#+PS)XKMNDjzwNd< zC?$cyF~Q)LMd&_5>Xz`nGk934+4*Mi6)DB{^a{srPm97#%KlyU(jjdQryu7lTpq_L zv&Ie%jwq)E2t3v*%_=?ps7V%M^n~QynoIZy-3+8|*vnMiD-u(l#Fr?}4(BW0wefzV z(M4*Y&3*!RGNPR>nW@#_bW-0sQ!jb?IkGsH_L?hPsApvhXGc;~&epxQg!f3$`z;fx zn-(iMpU~-IS>WHueCjHB0fsUwA90yKdE4TBgZ+1|7jM&rrlv|8({Zr4(8%|jpEeHn zZK(g*TZW1gnxvRBgTL9(x>-nFdiP#@y0yqwNv9Y}Ir`hVX4?|h&y}A8ibJ=*GgSV-&2A46ah}$3MAatK2b@@z>*(Ot}s*3DI=GJwD zmnL>xwza2_Q=F12uU|}ex>#UitF~t0sHO31j!4VoxM-=;rQ3$SBVzZny`3ZuKXxK? z;XN62Lb3FbnLmE|%{P(ml-Qw<_)D=bcT^_%&Q!!thTfYDzEG;UFn7K~GTGiUm%#h# z7Vk&RLxV(7Du?-!{QJ~jnU@TJ5ZZ@qv?$0?j-U58F-_%e6@?S@ubpi*q|PoF&ry+9*GK81k-@o&V#iiW$s&ZUS8L_v-ZsGMjT7xjdx-YIPm^<7JmzR>S zo}bda*@i*^ReF$$&X}pn>6eP?e-5*As_d_&9%fm~a1E zrX%xrN4aAq?G!yL`j4-ii1Jv9VG1Zc#k>9Ntkhei4|zyk7QtWEw~sNN(jya>ccap< z<;t~Sxp8~o_%30ZqyA+=!uz>_nJ?sd(u!M{AJ_1l9HL48^1c52&Qx~(#pit+NyzhA zK2o=OM8Z~G(9z*)gI&q5U+YiJdLuYb7&3lu%%7$*V-!1yb=vWfxzBJWjpw^Nmg=U} zJheB8jwO%blx4mPdcJhs9B83^C_w5uk&*^6v&cBfl$Sq}vOtBW66c8ul z|Ao+fiPTMho+`<0|NQg4xT;otU7h#zpQ3kP;EkSX6YIWp_gZhzyj&wi0cN1N7c3@YO&=1#hB;$g{b(|QqAy=bjW<%(%A2;~4A6&f5TAZ}>Rr`Kxb-vExH$Q>5 z>Bs%;X?mG3ew8A0UmKYV}zHN2U{b4wHm-Ga~gY4bNWhL@}~H+GeGBuU=Y%JfFeX z(FwKc*3%rgWICoacb&gg#rcVZz^_IU;ih!LYQ5qv@2unB$ITZPI{V{3w_r2b9Zx!V zrd>u^EA~KzWXrBYV533>2%+OGLyLkORiMNwJADdIfvNaK=W@Og$z@HQ2&3R}|LdGn z$1u(tjMSK!2iBF?jNlh)4pbhvWu7=PpN9q!<@8%mNv|m%r zI@|S>UHIvZrO(Hb7DVKp)#HUm#@aCkt!h5_D6b%pgVp_jQly2-U&`3F=#WQ%c#A63 z`PHfiLbn2`yDxHhroD5>*hZKg=UJ_~$S3x)_rkU;I)rEC_Qm-v4crOeHcyv5Y}@y* zH%@jIqaA%xGp%KkM1^tvHUcA6! zqUX68v$|#i2;DbG-KgQ1O`^I=RoMa)@`ZjGS@!okELEXz^RHo!I40QcR8HsYyC^r9 z&6Z`@zl&CyD+o^#f?kIe`saH&{=#=CiM7y;gIkcJYgV&_Mr+b z3UZXEV9RC<;n27_YnK(RcE3ZnW4OSmP)`KUmZheTPPrEO=V7w!B$mC-WYQNW=gYza zdUrV4)(;OzeV-%^m+2z!PgWy!WoL@~b{yk5CM-~Hi!^)P+3J)XMoNx>Z!lkdT5j@~ z3f-TuDdn>a`+POZsXoY|^7%`iZ9INwufbft4DqN6TSUAyNZpX619lC$VO;}F>^9#* zgZ9X`D{12=#niRa{oJ|cHcurEir_yb-{?;7B0w^(VU*Ll<_UQ3 z8|_0aQujQr%P*sw%tGnOJ7uj~3N}}k6_05JtcbbTJ5YMW3t(;V>{UAPVe1hW6f#C| zJ+U)+2R4yq7P{e_6Oo z?ljvv$%jua<1{q#dL}6Q!J&{r<&E_1C-aKz^=+Ly0n>Gnl0Kp9hs9162UlBoRYLtv z*l8=nXBKGP2Bhu<&V9-vqKI3{c_U7*IG4f}9ZB)kP=SJu@A$3o7*OE}8 zjO?pzEEaYx^s5NQW<%ms4C>Fv6tHDCCzP|)4)C7Jd~01&!>hx2ROTyd5JRs! zZu=4A*Sj+ky9tWMp5abhynI*|(TsYzr%vf0bm8C5p%cob>%~ruR(H=J0ry&nb2^KZ zdw@toMos|XjYr{JT57I@moWYNNS{&wGNJ6 zt8s)I{OyX??Lg|j{rIqQ<9_d~z|)dfxY?FlI=13V1irpBg}yJTH3ZvD>>tw}gx=Gu zN(~E?&6^gwVR(Xi<=(R7;XEMhKQKeGCt6wmy*JnN<}G6r?#p)AN+0 z;G!TYS7Gt^{F(bk=L1UvNgga>9?P0jp^#loeW|K^x+uYSZgG^iCg#mFat|fHEz(Y`*yqwe&asm5p&Ia`sL3Xt$`n2tE+rHGS@F&>hH#_=JN+Z2r)*mFR>9ez-mjvFQ1(%e@Igc#IQu)8A#Dmi0fHOtD98{>{AhHadhp8nX*7h(}t z+~$gQ+_B>`gumg@`>h`>3UXAsS)lf5GsAY`M<+SfZBR70FP;fFja?!9_F~lWbP^4A zdphZp9m~yu*l%0$pQ#DE;yG>!GY#ll)t4ID^!m{v`@;ZI_Z7LqXWhq4Ug-<8Z#QCZ z)>2D3T-9{_GKkU(!m4kg6jy!t6Q@n#S6{hTWleg)6;n2vO0(~BZ&%;kDoJXx?HNME z3x5-!6H0reZL761pzm`ulUKs!4>DIcO1MI!SSP;{yBKTZUdO)X@36Y{dFalh(6Ge@Ec!OP3yTiE|vzZDwBQ{gN(POLcd?;N_?MIf~Hzh}4}kA@7Lu zU#PehCuw+zJ~O8dR%51i#@CCQ;Mu7H$rX?VLR}EpnXN zP~H`5lYx0M#uA&4a+W&lBuV|(S|&fK&TWJ)^ctN|N-CG7Q%YZ^*UJ)pj~KS;9U{Uq z`Z?)i&YU{B_R#lO5+6&kb1W6lO3U7xF^nqzi4UTjQkS^;ymUXZC*^$?+W|soe}~bc zAV=-oaIfT;mCS9YY5A(?LQ!jWd5cC;rpA4jIZW+^{?*%zyz^15?-n#w?yuU>`F_h+ zcqEslk@W0pn$@O`yvk5LLU#nIdzZ#NFq3iRddWTfUznUg|FUUk+ zJH=gnEXBiXGbz1E(%%c`*u<-M7_-dak0M6526+@wP00QL_aQo=R&~CO?`CEUE;oSacf#Wq}(k~6Os9#8;7zqX| zkk11?p+!NC3Z5z38fD+0bj}@|tRXb~QhbhtVuU-fdM94IAYp=MDAa zNFyeccg`1%3tZt$6fqi6yxck5ep*AgWX)M6U{URcK1%5GT+#<6Q-tm~Qa3`BhkcV= zuELg`lf&10(j@lzIqDGMZc5e++q;p$Gp>EwC^FUIM!Ml=52cR9`(K#Q^u%c(3-o{y_=TmiD>0jJFMmP3ijBGLf zGS^4_;=|rHMaPkki`l2IEL(MguQg=gS2~h8)MgWFFe=9c1@OX7$!YG%={PjIW!74l2s9^naj6=uRMYuT)~7 z7+yPFY{8(ViJxglT^wrszM}o@=B3AJPhR5(yx|X}DSg0a*7E+YHdn@tw(-+M;t%oF zjdH%K-71|uf1D4YJBie-h+8~ZWGqm1t#TtJe~4FO*P7NATiJ#m%#(y!CHvXvLjtv5 z<#VFCRxDm28)Dmgg)`sI%TI~*=!~C?#n!Td#~8XlOd)lJmSRp`+?7lEB4UjBi8aMZ zu(f^gS2QK*!xfTMv#U>nG)PErzmKN|y5358WAZ4+n5x1!=77U;sIXJ6;*6!S6+(9! zsk1b|qs5VoWv8UAsv-MxXM*uLJACGBy`!Rq#tp z>aQ1DSd4DWsu5w*D+M8cZ_Xff83VPxam;9_c*bmK$O^J`@dQ5MPu{sK`hM+-zIH8U z`dGT>T42}eq9eZF!_J0=PZT~yR+A$%}eLaTj z{0Zf5x5)nY`gcy&o|=C#xn56Es`9{f)@Api#k6Ssdgtd^&awxE#1q-!0WauqgE%f= zBXsAGy6@gDUwq%|nRuYGey70Jqlo({uO#hl#rrs8myWfD5>akbRgv7+KYpFq^PP=X zoY13bru)lZ9*G3_>pM%c7t!gVC$*NgPBvO zn!}?%5F>O~kh*EdNhq(bT{t~|JTLLVn6T-qL-k!(0;J zZMJ?ylv9Mmw;+{RaA9!k(E41ehyXb~LU$FZ8=tfM(E4FI{-A%yZOOU>5&vv!y4uo{ z*G;|R$kfEz<=U5Af*MOIv|=+7gRRDI?Z|cM=JH`YNNmYx2`Om#bcoRXiqt(5`{-CH z$M+^B+`hO-4k6Df+ZZ#}u4|uq--{ZOHaewlANr7Cj6^5SYpwC5@1)R=SZy}(xT`&^ zE{_U*xfBe46Qj>NYe-#&I$l9b9u_mEAVCYm88!wi)sd1uBDaXduOpE~Bi0OJjjFX% z%YjU)AG|24Uo$0a)lccuSuE(7eDv8M#cQ@i=&mDm-A|sW+rLhZcQ56#pRq5A1cSh( z`N9(S>x9i?t0Gw3`T=|2BBR5iE>lGuc3$ymQF%$;dTIYs*VXcn{Kq+ha_|^K$Gd^l z6?;X7BVGJ%nL3D;&ctI}RGD31BOoKz?^~zzYSJhFjePIekLSo)-aBxHr+bN3V+EHn zO9x`9+}dLMwmzT3#(>a;#|S#1>K|YfapYC*ewScR7b+wFk8zFE7|nK-UyP?V*?*oW-5xMbX7)6viZu<`ekJ8Q)SH zFtZpb!XWGuim3=@sEq3}tn7EppOH1A9shQ{P!-;jMEd~8!svu@ZeD*KDuW$=@!;oY zT@fm$GdVZS1J|_oxZ-d~ZslHf_9Te^qODClm(+VUwtuJO=bP(cW10N?jHGM9nB%JD z@E$5!cNZ-Ra#YLuRb$+MBK81pox8O++Xsv`{7bCNa6C*N#90V-mMcG$--?<`%)@jD zsd%mD_acF7*gU;&sy#s*(=;Klm}f} z8aJD^VB58w^NZ@`1!jM7ws5za(t@4vk3;KQnHn>yTEEH&B{KSDn~=5la8{h;B4Kdj&Q%N* zPnVjGu%JkUE_}9yPAEAS+|VA!kW=5OS7vHeO(PrcJ}}p(oxg_{Boi`qx&9`10&BsVM6;GvWY9+U!9U~uv?qe>|@yhA+*2n-U&LPTITw;bRu2%BD1!BREfra z7^G~DTyA6bp!8E%YS@X;Son4C;Od9mMlYS88Qdp-W%Z9wChD9|l6bmsLU&n%$r%Wt zbq~;@AV-lF-{)sb9s1P2xs7u(MS!`*Hkl{jC1EOqn34DnZqlBsTk)7&-Ja;Q<{ zKZVi~dQYp&JWo0ZX(^JDwrovA=)!Y6I-$CZ`NbXlJCf{8EYg)8?ioI7PNE<-vyffp z75T7Pzu~F%&jiu_xJHGRAy4P(Hx>!ivr7T`Ei2~}-gpyXDo-RMHCV{Z* z_lryJYxE@j=kV=@e0eM?i?{t)1E1is6zRM@y`bzWX-l^@(f>g;;q!2U976XPQg$YD7g-hk(%wiD8fKRT<97~*1!0DI$6C`%cKQ|iL#NDdi$0n>ul5MlXGtN zm{XRSmf>s_qvw|MMIN|ZxIV?jXu|sbcKtAEkVO0nvj1Wu@39J+4^uvRizyt2 zh!+Q`J1t7vC$N-w<~(15y*h(K&r*~j8ST5m`_C9|2b$hfXf5r`o1frBv`q7t*FyH-J&o<->Yt)SS=vP?Lt@_2NpySGV6i;bN zA%@ips3{Qdk7lLYdMn@New zdzTh$-|$*0c#OG8DV3pqoH=K5AgV#0DUXQvI8ygX&su9rGU-I}#A_^f^YX6Ti)^d% znau|U&z9ZFp0Q)IaU=#O)RyPgy_02cX}r3oI!X3foI67^W}m`YK+)L;p^Kj93&xDH zb5?U~(z01Prk~nJIZ$g5X}I1rPdOo(TakHp`EO z-^6@k||+%ue$d*Zb?8dF#dpSJoybN@GjJ5k8>j zHT&&D^?^0z>(J!`Q}^V9LiTk-+$^!n)hq^8hh-L)8!wr~e%?@eqC5H8IR5m@x7bw# zdUBt=s;qoIos1?=%Q5dikB88O^Gl!;DsrOSfqXHgMrQQJp~aQH*Og}1NZVG^$LPNv zC(d4Ka*eweIP!e`O5A2iuA7AO03(^`U`6?lgR$HA=|v`6tjPPy#7JGHc@HOT4pXHn z-N%`#VY@l0cfPz`FYP$9F&u?GeVRLA@T>~u>jr~ahTi5M>1jV}%8ES7$0-#9MwQhn zDksjrLBvaf)cx`L-njgYx+X7d$I30fvV=MR%(VU2c8YgCW_Vb1$ViYB6#LOoNnX;b z8CykhrDVERMwD`M-ET4Vhv&Th1a9`f{lw);!Ms0I1_jU1`_QaV?MCq;+ZK}JbLNr_BW zY1o#1hgP*#dH+#49)6Db24>*_XDfHy2PQY_OzxXjhY_5;XI10p9`L4HEPgg2K*URd z)YZ0MiHeZO!i*7Pd`e{8C1Z1&naA~>8fEDNMzR7+=E<~}YI$ttXVI*Koe|hRFXO!o z)#}tDJ}y7t2xarO)7i&sHG5}cb3Rr3l;gP??ZPo#F_BN_r7&2PB-ElO6r)KqJFp#Y zQ6Y3sBjY7LYpFJSTA7ijYL_MKN5!FGM(|;X$S~HXGM#o;s$pWe)ireyPmfUM@sRRh zyhO$FGZ~TJz8^Q$zr-JQK-G#IKTsoeHO`tvIF`!936ateS}BFbOutFYj-W_LHacf} z+q|x`ll_WeoBPYFXI5DxBuslQNJ`BlVdF28wLMc-#F*QYltRQygVgm(`J^j=@-W&c zay5zl)Y`Cq!{!;Ol>DR{P49Hgi$GzUsP=w0@y_#o9hbUi>&S%Pbtms(sPC<+m%p!C zoPCPC&eI}wKL{oh>~SqTN5%CP-(3|_9KqZt9CUqwVOx~jbK}4yx1iT$*SP4~vuWe9 zLrFcp6d4g4K{2zN4War`hVrtb$m=m3QrBseb^m53W90mmCudSjqDE<*_(vO^?`C3l z-+qHXNJ{p0ImWe+MXTjE)&KnmoO)G}&XVQMFuY6u=-XG$~eEguvO<_s$j7UfA zxz|E{?l%#-==mZ+5%_=Dp}pHdV^gkiSNP5{(RrN>X6tvmz#YM@NQ--cp6;*@?<$_n z5bx7inNREu_fK+B5htW>nr-C`xZO9o<<5mKjL>C7#@k?UKaZGheeyF8U%O(X#U;iz zN-wD!wr__`yC2VMQvFb+60`Mk50E77p{|WLs9lN+@D?0@-yvb7wxD#ay|D+O%Y@X; z3+60L-kL{YvmZN_yG(z+7z)HQT15pQ;42yDYt<c=?M71%1rPN$&)n^UF5oFG!M%GTlJL%YxMXDLp#d^Jbi~^L~2}ipssA zk3e;6mq*cLRmC?inQ2K>+P1{(?QWTX?{cv41}k83*h zz^yP4gPjSit6k(bkhrj2P(WYeI2%Yoa8gbBfaPhg|Dv#+YTN^DR-S18jcc^@cN0W) zc@XikBX#d@>DY0H%&5OYh54J)+D?+ufBG4H=T}YxExC}GK``+{;qq!JHO47JY{A!N z*5vf_Qe9*1;e^YZ?CVKVg+cJ18G2mJfz*|sKBOeU=x)w5<>1~tAo%ua+*ANp^j>+o zabN3fP}$FO8_McKRn^~!yYC3jAJ|=+&xv?{Yg%wE+!Yt&rwCf z24;$ytA+NnqR)Mv3{5MxIxSRP+`oG3QRO{ezg^kDKth_PId=l{$6NKuL%#O4?-S#U z>xJ~*##bWZJ&V-+p>yS3{XC{wPqo?Gt7pZH9|#&m?w@MV*m+d57j))!R@>g0V%_un zYkTYqC1r7eV>70)6c=3%-M`?a82B7#fWNiTKA`7y1x4Whec{gBmCKA3sZ80YUHc_r zyuX9(OjRdjiovRuWW8rhI=bjKt~^zPb;YXH=U#v{!_tCA@5+d-Sj%B!TFRiTC_)#` z4~tGHZ2FJY{EunZ@;(tOUhNQ2OYb1N8k17n)F#Z8fwTAFOpfZ#Q(Ow}P|TE_T+bx? zI>DsYABiG(%dKZ1Wk;gF)QrE;H{$^zf-R*CajpI5$1@BHiWbhj{T?@;W*o=Eh zYV?I?Y(!eSr8l8Lk7I$qQq*WuxAj)RaJ{gQuLs2~ih@o=yl@^{bV7Y5yD6N{dVT8{ z503a8{@~aL=_ku5%q8tS18E(l={3nE;(A>X+Og9i^f^~$H1vcPXPC)5z395IEZ4HB zQUC7!Fz9*3pf>94Pv80eWqor+cFmv?o{Lq}RG*a!7)-S(Im!AQ^%C3i7T<^nUm7y` z(XmTdo~&+J?#Q#JHDJEqVck4e>K%i;@5zshmu~MtT-4coA4Nh7of!^~-gvF6MLErE zn(f`~{1?MRqJrdo)t_da>JBXNj_k)V9gbLk8CyiP)PvI|OWz?sWdveF_Xh!_uEB)e zFFBkm%-mD@Bg`(DVQP_5rJfy>)8xLO64=K@$6k#gCYQEbf^^F&eGQUQBXR)DQDWw>;ks`AH3L)dIx1IThquaa7eykvj=>myM z_weWAL-v8ft*#^d(k2!DlRUU(W94BlXgCC-`_6V8J8=+*6Gof^4c3nn0u)k>yp!zE5c>N`rS%U zE(j5?C{kB&xc1hF9qSN3Ww@SxUvJ^LRZ4@?;q$*Ja@{dUc?)x|k(+B87}ttm+`mXQ zgI^bVigf8))sy;5ZtjYwrV<_@e`kpyb>)RE8a}pHMoRLB2IZXDc_v?Q`%-WYW@)L# z;v;8jxsd7PIYk3yib?hsVTqmBO@>bj>AUXl#$zo<(@~o$p3FqVD~{AH&M+OCrPnqv$vu7H!{kQ9gC@@irw4Ua)AoV& z0;G>0zWcFXQY3TpGesL&u4F*~Io*W>#zJw;9&w`T)De41su+)@-5i9jBvMyy{Z#pv zBJy`UAuj#+nd>q+M>of~OR}QHw9$s}#eL9*|^hE5+IM(S` zxIHiO@H^sVe~i(6d!F(>R=$ka&R~%=xbQ`E?R{gE-!JZp$EC*7dU7vjaIa}p1|f9i zk-Bd+N4$D4qLRZso-}K;RuTX5=6l=Se@A_@b}Y91{22Ds*UZP$cW~*5sVu!E9$a!L za(yFu*Ga>IL^JkhEJnO9LRSH)yISlxA-gZ(!0)xbl`Vbpxh-j-NsEcTXm?0@^(zat zm;*tLfz+Dv8p7ztDh@mghI7316JHxK(Q~ z@NH$QC^M|nFm=}QqL;$_K)K$B@Qw{BOiT%#IlL9ULwQHF)JGgy(i!~pqcNSV9zMwD zn-`F}1M%cIuAP>vX(=p?FOSJATF|b}RJ_w$h+XB{YFpe5*VCzR$PUV~+fZUoi|@Zu zJXu&#f}1QQ6VNrOaIWq0G$LLlr0#a~jp>Fb&#Z(|CftBTa!N_N7SK2cKZqlZ0n>5afB_Q z48jB4N^FtMv8-D}@}HJI5btf%re;4?*9vJ>7T_do|8UF4Jv$YT3!!@vsr%+qRm^&S zJY{FXim-P6;!p-}4fATmNn@;XeW@b3>Ni|P#fi+_%Cp&av~!;^tYxN63p%=V4CcJ1 zl`52W8KV%oYDnELDo@IeP4rE@X9}Ya`vQW;CU$Vj++;TO6Ks72(dOj<+s{Az z-Y}ZsKhcidnABf#ci%7?$i3@%gPWHMdA(3a>V9hxO7XyXKk244Wm;V)BCoT=BBpEf z>BPI7Zb@HRvE@bC>%ZiO+@6w#^77laYHh}IZ@06R(~OH+xyw*YZhk_*?Y& zbyxKld)$-J6dk*M_OAvS3i7nXMNgf$X&2|8C%K%Jo?zi9HVF$%OBIvZArG@pcuA>~ z5-dH+`fscV<~jxRsX@s3^O6EW>Z!_yTnx6?l#JI0Vi8=p~ahI8>Qqw-J1 zh5k%YHp$SZc`f`>Dxac7+s3jC5_1wiVjWJ(^=n_VjGkw9Ek(jgdW0@6MN|AR(f-}DtI3RR2k-9=g z(a|0Lg;;f^{M+2aPWhxnyooQUUAV<)Pkp^Ie>^VvGMi|}tgvqH>_paXk2Loo%PZPI zjjsc|uS@SdEk1@E_h}(@4IfQ4aG2MZS>G@zWthxzoYY=Sef&r>w4!(_lbpS7`8BU; zb#?Z=j-Vo6)%s;X*t)0|S5shT4|z5D@6?z6~{jSCmW>chDF`p2mVAGDFW zWX~zAr+quk1bSrkbZ+0JO&Ph#+rH5xM3D9rSJVDpGMkT4l*@3Cf`p!6RpQ|F(vpcE z%JYWOL6$Z$#C%ttsUUQ9kh(Ur!s672BeKOUiz+rGlAoVO@pQO6xU;XdLX6jcD$yof zyh74Gs?xx?X?;BKT-WzqzGqqvbg1|jd$)5W)qlXh4MU%IbdkEXmZVy3qw$Z<_A}Uj zomm*wU0IwAeeuP$!hKxuP)+X<3m(zIo9|kg;=0fDpEHHNYBNg5BfT4PORDxJifZB& z^8SM!QkP5Q_4o?u7wQv1Oq}vnWP7Jm^77#L4+F))q;Z(*4$cqoPsmODTWo?HAbgX_U>Nen7Z zfHJuJj|sMQcX4#|0w>idupSsQ2mRwZN1y-m4nUus&7EEBEW!RE!N4H=vyZGiu6x-z zT4G!VW&dg){pYuSq;TZGkpur79f0SJ)8L#=2F@4%f4GLi?`v-1;trpYQ?vecP5bY- z-~M;U41Jkk|Lc0c1afe1Ht2u%HvS_$)Sp6h4nM+WG=Hl9%V*F(8%LMxFi=|X0Pz2o zfB)r;ISTOqiUY9!xm$U-IC@)Q%!vHg8|%UNEId4{JitvRS8(G7{;v3+H3qi5VeaGz z*S~J(%}#q3c#n3+;Q#yMVtDQx zF~-0E{|7t>EdHkx^v}b}$=k{u1LMH-?|ZNI9xl%C?^$g)kIvKoX_Nnx0&pMM|24G5 zaI`+Ur|_S&^S@Pd#N)O9R&gH%d*r~814j-VIdJ5_kpo8#96500z>xz-4jegfw zM-Ci0aOA*|14j-VIdJ5_kpo8#96500z>xz-4jegfwM-Ci0aOA*|14j-VIdJ5_ zkpo8#96500z>xz-4jegfwM-Ci0aOA*|14j-VIdJ5_kpo8#96500z>xz-4jegf zwM-KeocA);x3*mkLylDNnq=&l&ubs1pr@5meucM2FgSDNb6|auFm6bH3AU~sr zou8G9H8lPIyn3*!Ow6$4)_iT@T%P=`;!hczj{=tAz;Y-G5}Zo{mceb}{3(O;K)^EaDp!o_ zZ~-JZhXY&$uieI&hXo+P`4?ar{5p1U0VFtg0$c>|hsIce1t7tB4`96Dy*(HXU>U9t z=Kz4~f%ku7z`6e5`tbezFa+?vX^f3OW$+#Oa6LFb&L#jRXge$e@5RK}0>HNL-Slu9 z;MLR^aE?l-d-czHa4uK)etfvT(VsH#j#`Xwf6A`?DLVx|fB#cv{HF}Odk13=05weh zl;!-{@2s#PNXI3;gaoC*?)@L^Xt*Z)ZZJl;pWuFh`vLk6eTKe5U*LCvKEe2*5Ab`# zxZ(GLF~GQafY4b07l0ek55xxm?*ShG9|4_!E z0h$3V0NAhE0PTPdKo_7J&;xh}=m!h{-UB`WJ^}^-S^#Z;4nPnf1ULtP?-mjPz&Y{6 z01|-n065n>oc~k?APbNK$O9Arihv6McEDM{8363trvdZ;1_0b&yx{xu0cOE>ngh%O z766NYCBQOZ1+WVE3RnYd05$40Z|48T3WD?kaL6i@~z2UGwm0j~jX z06BnMKpY?&@Eq_0@E8yahz5iJ?gP{T+yEW`FMu2%0QvzN0G=1&d5{di0AK_#11JGh zfYShK01e;=@OlTZ4;Tl00fYe>0Zo8%06c%fd0fu}xB)x>IKM3+00%G)wmk!w1}Kna=a6kkAAL!wMxbOk2fMD?X9>5Y{4X^>&0_*_H z061?VFMtTJ0@|+vmH?B0dO#f@5^w@&9S69A_1pm-08fB3fCV4`_zKor2W$eC0Vl!w zH$b^J026=(*ahYA#O)901dHcD&Hb^n{Bw?`f}$Y(kIvQbIEBY9Jci+1!L)!$(1r^D`!_X! z3P1@U0l;%JJVz4%Z~)kV;{X%@H2t^pJ-QATl)>{n{0x`z{^Tb?egc4A4}ONr5aK^M z#h)B*lN12A1N-eM02u(?7V5&|5gvys0C;>m0t^7k03Lt?03Lg`02=`OUhw!d23!T` z19SmufYX3KLzI8YE`mC^4YV%Q;R8Uw;69}R{8J-D!P!6SaDtozzz$#ooB^-`SOClb zCIBOV0YDF+1Hj`Jeiv?l65s+r5ugB&2gm_r0Wtt-fD}Lya2_B55C@0>L;)fIVZb?n z5I_(h0N@9x0(1b{04;zz;4(l1a0#FZxB`IRMGt`X8LnptFakh-pqJMGaKE6vwE)Z4 z0p-0 z9v}~p3wQ{K1cU&1!?Gkm3gGFV&uJh}2V?_ad)PJ;@B;As&u8c*^sEqI2*?K%{8@el@?t;{ zpaf6~r~s4$;P-}pyal}Zvkbd^^`GT>kkUU4S7#Kj0mp z4*C;=1zINmq~AO*lN2ON9A>lhq!z_AA$gB%C^z7ByL7XYtu*Z>sZ7yw=iet_+K z2h0Gb0dTu$&+5VQ?4Po4Am0Y80G0rYfH?r{Z}Wf!05@RyPyQ9;aGiC)8ekOw%QgWU z09X!l^zs&1t_Q&F{{rkFmiNH&Prxn!F2fW0A;|Ut2LKoYY*P<_UO^2A{EW=e>mbYi zah-qs4A({bfo_l92E10o_0gZvZPD?=cE~!iKe54jv?kO?g5Cx!L+hZogN~&h(FU#q zJ%QsGIso*d9`IWee1_xTvj8~mVFXZvI(VIjV+A;lWd|_-`OF6LGXPcqdL6i)I)DqH z1`q+r0+av>0C@mh7mktP7zVD-2T%dqf#VrC#)4xlbUXNa2aYx1xEhYH(c6LR!?6o& z4}p3xhwaeoz~4)v062b=0KhT1I6x901%R=`dOV;7+rsl)K0ppEBjbZHTmUEnU<|Mw z{C?&%#0?-0z0(1a+0Np>iKFC$9z&{{eOZ_W9E@>nv zV(cXbZbpdw+iz5Xzi&nmfpw3AOF<_NXN?;F?QJ|v69Ha+Ua`Nf{wF~VHTfBm+br7M zuttnmkXJbE9hn#Dzi4DNu7fUO3dB$MO=WIR}~u{Qd6U?>xmp znsehmunj-&IbH!V@HT%q;S`3ZpY}r!o$7p0BLX4-Qm!r@o}d=vnt5;MiaOqHP$LGK z2nqkbik<-5xwzBeh`pAn18Rhz*k5ywfgmtAP z4_{D;q5aut+GsrJ#P2r1)4#4s(9vd$MeWT<8!k}8&ntB9 z9527SmAQo{XcIj@{P}cra~!Do?KS`JK7bF}+@w1H)9${G_1`t{sss1J`HFiy)9bDz zphkpOP>@#;1H97L8NTOtW!Qr^#Dk_Bwt>F=b@d5bj3~Fo7D-0D3?Ux(lqK zIAFd|SM>fNs1fBA6yg=dFb6fzos)U*-btXI+JYK>UI7p^m?z@jM@{@YYJN}ydoD8S zziZI*>|qVL1trJ{LJtJM{sHbtWBt|U%Jd6|xa&oFzqbP-_*dHz1U3I!t@DrCLQWXb z;2@4G7Uo+}0{!~eZDNl79@_`~Bwe8)tss@f!UUm#y$VJMpa$-_Yq5GkOQy!dSeSpT z{trBmmJ$$w$Im}|fUf!1+xcfl(QW>@#trp*G#rGB{ns(4k!Wc4VvcGL3-eD${10M- zy$bH1e9#6S^@*2@kKc(a7Xe-i@`B?8&i(O^`}8c>moWWfk0-{ImSThlJVrTCBL!+% zq!ekhZnu?w*8tc48W|z`=(a9ZUOL4IDvW33o|ZgT z&fXZ7jMrYdhRm;m8lk_oa|~R%2*7q;Hf4Oylv#NRYQSLyBOnGfFt(jY3g1&5KIebe z{O%#1cFs3kU0fWgFurWwz3w0eYQXgZx`Up_5q<6jHQ?JoHT2A2v~1Kx0S?0Jztw*4 zQ*N*wc;1;?SDVt{)U|`h-0zbzhQyzmih^OWV1LHuziU)L4KZkQC8M)4)9k-q$Q4SGh(M&F65F7Jlyyk1&e5(9s?vG=faaRPfT|Mq-E z%%F|%-!;Xc4Y&>mk+3q5={)_laO&SYr~@_dIK@$GODh;%yZLvGg}DXL0%P22oCB{V zB5B~L2(KtOFaHmE;{QtD`PcgtJtHJBiG{~7vGcD#Uds&Bra1QX#vOYWaZf|)?R&t>47lr{4Jb zm=8#+*r~B=DaOx-z`+`A&XX-$x0rC_ZPzr&flI^E`3;bh0a^d&fkTbkZtto?+CV)z z05W3P!Gq;1UpuTr$^bb9kVeU!f$%He_(e6#Cc z(;%#EZv12UW1XAt(;@3*J)fW3^_U;dJAa!F*$GHT;PgEGpJx~Uwqu|UIRwZ_ zfb>6lL}g;$3jrO{1jCo?cKhkWb3U87YmN@-1_;R@@8j2s&iehu-*w3O5@%lG_S4^= zcTrOvqW+TUq~RU9blS3e0rU+z1*gWrT3!RwLOplpu6q)%O@8DG;8540e-<|vGt-_u zo9Jz=aahS4EvcTAg6Id;~}VR}7d0ipSHSizRNPujk< zB_MJ}XOGJpQf_QD!T0zR%Q^!heaki&q)^j29q!2eu(ZWGS~Fqv^n^=%J0Mig;78s* zr{VV-mQg(zSw&XXlE)nED0v%7yv{S~vecr5AHBMPao8r-$49c4!9Wv}P)T$K?%&BB7+`hY6P~{6pE^9S|u4`}x$~+vo>lO%g4*zu)H1=T^+(de}#@ z_buz=)qIC~$fr1J(n;UFk+-%l*Td_q+>Vlinn9zlo_G9i$pLgH5Ddn>!71VAe_DE= zOW`_NH$noWRW>~bCAHBv`1mB9slKr1lW{{j_St$tTgd@>yQ$=0(1CULT(R$d;YD-I z!3F|7u;)MtRfVFJG0#=w`XBZ3(r<1;J)~8@`TMED7i-jSesFQaZh5(|mTbs9nX5y1 zC=7~(!*v)wp4OXAd#6PcFFZ)r1GF^KSx^hKT-#*Bkn;~SgvZ=NfRMMbZsg(z_r?_|H3x%UB~5xnZ}D-Ja5 zc;&f($g!{w5I8Awb`KkP|Na|4Dg^{fcj|@j03qqTc+8il4IZ}rB|v2V{3#(*#}v0; zG;`Q?rp7uNiw2XSNYFE;_nJwIn&&J9gknOV)}*W8`rji%TXPS;PQ6V!3P@`}PCz~J z(XWpEVoc&HKqLndj9j=TJgz9%0unGiZ^;u)y8P#Inn>xtXo|CI}W1w?ZFuQS9d=j4(WXLsGv&245;dk_*L=Gp*4ytVtsRUbU~#d?qA4ZVFTAf$=If7!bJsRk9xbV#YB zHf~MleNE?1eF_kg8*l~yLO#;A2Wtnk$T@$83MoQFM*JFUx1v?Aw%eQf2@v!gb)Ay( zCwxlKv*FozliP>3N&tfXAr*N{QoFs?WBc09eQGiw=mYAXR{%K{_3S>rSF}Z|iz$Xe z{R3I6zdBqwX3@d6R-`Mt28cBas( zRX>Ap|q7wR~OlSD(6b)G}t zt^IQKq-Pf8<}^D?SR(s+CVIt~JE=vB@THye-T*Z@>Z5>=+%~uE+UUtiSAGZx`Bl)w zS_$cp`|-pP2M@*p=_UF!5{ic6SZ^wgZkpx4wfD5#oH-~9H*C%_{H5_Tx7iip@O3%M znQKV9$n%4w_RY3g@#Sy6^m=a2r}#qBx2LuyUs$AZn+`TyzUQlM%o}SJZOPLp88hOI zp%V_h@DbO;5?u&LQ$SWcuy}v#Ry*ecB4@zc0BHuu>bk?Rl9lb?c~k$8#&<QY7iiV^YgDWs<({2WffMt_(J+T7JnP#Z~IOkb>4hzr^kUqvkdg0 z77*esFmCIX6?rQg=H^u33$1(R;xEa1^y>$@Opi4i$GovUxEm1Sx~TED`@0Wp*&sLP zulPdRWZ|hwy|&<5&KMTF$yuf=_#>{z=PZAB;7@l_pVB;suWRrx_1uBL_|fn8*?d0p z#uD8C2(@@^tY}^MpnnA*((c&QgYtJmcGRAVDP8)OH_4+|8qFnu90Y_ocx~(hJ1+YE z&d+jlX49A}#VLbKpS%nZ$ibqel4}bNWG`5>R9d9dP#5*jxaZ17?i>8e0q_P3PxV;H zpqH3S?CY`dHbBjCMrRpp#^@q__~`J<4|XeUdMh}fISbOU^VSPJyMRNHg}QIozx8ha zr-XHZ9_g=$EugO;7Yd`!;5t-jN_x$C>;D~^PprzG5B~}~7Xz9P;*!hD$+`-gXccx*# zfb`(@+qSoz64}^2@zjZxo(A$R^%%jdFPz(Cy=U!9TNX+gK-QMCW)by|Wj)*rahfjhPszof|G44WGme%m1+|KV&yUH> zv$^G4jh@*0MF&7gI*@gXzS34*dEn1qZ}R;paiF8~0U_S{ez*DI?ag}7zL^|zuL43n z*I;b%r7t&n;8{TAI6bwWpw_)$(CyG}UgzMqBzrDxx z3UHdCo&|wh9)9Yb7Z8JF>jJL#NXVwMZhz;T(I*ZDghm#;Gz-s8+W1H?Q56L4_xH6} zp1Zj6CdQ$mVCSVlLu_~>%U3RZq?eBy`o{S6U!NhO9vHlyN}rOPg1=Kg9{hUYutgKN z9@r%6)09G8l-K2gOZ)%rEHyHRdNNx|W|XL1d9IkVu0Q&W6+`cN3ba4xUYx0+38S0EG1*Q*N`R+&&&4di(sm zhwe`<+HnJ@N$)mOIyD3ZY}M`7zwOZ>9RMNTa#u`m9_@GEU3xvG5@+w)ujdc_ zIq%;(&JaLoKCSuZ8C%b|vezRL03wAR)qLXQ7WOzpB@nbn_vj3(`t%|`kdU76W z_}I{UpQW(?4~a&-J+)bb#K=18*!Snn{PXoS6iZ_is}&_qju5pQfI~B2-kYbLeAWJ? zBptDI_Q0$0CUHgT{p%XuwJh~W3=mpPL2d-8t@b51zB^*f?q4eHBJdyYL8Qa zo$?AS(hGfWyghru<22^TPXvyAOWO_>a{F_4!KmE5xAl`Pg@#}UIh72Bm0_QK+WO{B z>)!{2<{$9Z1vq4T3zgTljXFH~7eJ^%fY@{JCUD3Px&DQ*zjyB3=R1i5-aeC%izZg> zz4o34+Zn=hy$x>|bM`p)5F2V}DfWUx$xu*fQvGwN^no3Bg9Eu!Y_He$+M732jK*S)e9+I}QlR z`q`VB+}QuJy~i^L>{HB^9L(I^?BPG|E<1%G@CVV`8Pt{x6Qgh?{ zxFzjYl$D*mPL_D=#An~zvE%TkfUq8vdY%D$A6e-VZI*M^aG`VqedH7bm@?+&_FS?SI9=|8Mo! z_fLK1x%%`^eKgS@3&#=x+@6>}b62<1OUWV?=hJZ)>-8zmGWDsaKD})(1AF^sFYEs< z*Bvhtv)Rx`&zgJTc;9%)jr<+R&0Y`e+hfnQJ+=Q8#GdQ_RiD;JNA0C!Cu^IC3~Rh4 zHQr~kgix@^V=uSN8F278F$0dlUz)cs+&ppVj8_e5%~`P#_3(-59-cvfoCXeFe6+*h{xug}t3paV zQ9!WaH|MmDt$TKuIhy=8#wqdq9gr4){Nu3*_wHfCvo8_!W*=8s^>~evVcizBv^ZI^8ab?s);mOMZp>;{?6Fwi(ZQh_~bVwB- zZ2)P1^Wdm|<&xUmobI$pz(2DAANZ;p<={D+^{~%JL;@HbYSf%_p1EH34~|BA(t8{0ERM{13;RwIYfVq(zqfsL z)0Fp^Hy#Tk0cj4d2e1G0!#!7gI9hFK504)Z>ZkoRGyZaH?=spQV?8MID1hMD!kp5X zi*7wM^N~F|KWldhr&G{BoNYiU@fq`Ooy%QA^`<}Q4nh0tfom7I6sdV15 z)kU9O)^u@~PXNJjC|c#zN7lW4Le@Vm&->^v8@FSJkXlOmb~zyJz{&R3zqV?e_btUK zxPLI_0BH|M@5dKh`dh02#X}gUhi3^OH0tx#9A2AR)`dKLhLkz97k(WQPd7B)>e{oMms z4W=_@EbCG_Z6BTtJ$Ut#s|$y;zTz!Fa6^DBxy2qBMKGWTZ-W}GjQ)DpBcuPA^(u`y zhz26?d<6)Nk_)!_{V$*X9nBax836`pU&dP*_Ejx;ulk9mW8bCKu3Q6J?9U-~OgIO@ zMPpFY_vfe&;M6!+G5hvdoJXR#CF-%3TM0Jb?f3X?_P~mIdTJD`^}yr)k%Rl~|8(Sj zmMCH}xXb%rwFmYi>w+o~f1CLBH~GU>ww(_Sc$5_N@Bu<&E;f6~1#jQq9rnO|WZBOc zcJ|s%qE4fvsK=6OVc(uR`GmuFe3^Hm;ElHbR{=s1&HZbFt5)p1bAt}C_G-u#%G~4U zxEOlD-oDl0d7+S!^c-6H(C)S~Pd$WsNJpWCHhKV!x6uRah1O@DI|+J2o`ZTHP@n53 zVURWl!m_-{0Ti+g3>1fZQ1xI!3q8zjy>FWy>rXU)zKAZOEkroxQd13CxZ zh-lBTu|Ci38?o$3;NW~!8T^pd^6q4}J9E%xjC0c)Poj_VFPMhI|50CfR5B5YR`u&x zq+hQ*TfbiEN%}(J+E6rb;pIC|J9y^9r&nQ*gzU!B!zBa44_(}1H0YBbtKMWxho_(M z83)l)`FBUpxOdE&jwc0>r(U_b&FJI*Y+1S|jyy^H*ov==eSa=Il_qZGu$DV)Xhav5JL z8H*=^m7!_DgenAddU?W!5`JH0u%Jfqaxl~INt`McUz0w1RLeiPKzy8%3MOzt!ygI+ zMFrwBY8Qz_EQJmsZq(Ymykl9NOvaVo1)x%e@sp^_kH#Z4N`5R+RbVby;7$ABC8wh( zKUp=syuw!z3>PF)2uenR4iwD=K~bW3VdKc4gBJJ*;&!Gl8B2KG30jmUs+lyrye437 z9rzPBLqS0#ynHQ`xN^YJdXB1Qx8Avpde5*^&4B3ZY)f*km}F4urKbpsJ<4JoUOrMQbTAwKO_`0)sB7 z>H4b4LRVq0xL!(x$`ipzXd0d18lxm;H|}y3a?c9!ru7gs)(-&2jej-!h?y2{4ow6 z!ZAyP=+XLiwFHlHAlc;Ld`)z<4Sc* zgW@ia3SxC8E}3X~Fi?e=T}-hBQzP;^5vfzZzHsyKKk0VR$+Bu+JYJ`{9^j!O5v#>j zOpSI(BbalqoZ$92beMW>2l#4|$9M_R z2*774ARffcSqCzr0EmbLCNa7?N;IU{g6P*^uw0gtrEpgO-l^A@h?JG4fqc{?OA z=Xwz~3rVMJ{$4NAddKKw^>6heDI{so1)XvRs9qJMsiICk4Nx!Qf<+8neI)1=SODu) zN&0BiYeD7z4=tDt+42{lvI;39Y4e~83)oGhP z*Nd>x=IeBgU$Z1DVgq7c0U?oKcZKIa2XiF%0)Zq`UhzN#O;<`RmGB3>5ntTvIOm$m zfs!fDT)26Ay30e1X#S7xaM8poo)F0QJMtn5fr?1L*ThyNHHIk2hcX<*Axi*Xrf4-! z4-4@0twMcR2FBxlOibDreTugFW>J!+H5J>~b z80r<@XnsyBhIM_kDx+W|6j#bhgWgvv3M|= z{!K|mV~VMiVVG;=b;F+a3FI9#AhR%(LC^xCQ5~`;LK4=fusdYXs_eKmOj!(8Ttfd47npEr1v-I=$RuWBUBE(11eg&eneP9H8Py5A0asaG*YT-bA}`OlkoNraYW`dKST1!Odz066OyE$vQMd zRb|9XK>`28Xq3TR2Q2ww5-?;6O_uwZ4p>@UGG0p+%4Alx8biszHD=N2c)F51y}Tw7 zLYTKU7!J$z8ZGnu2Hew z6Ny*?W8XhnBx%%o1HmMs`wk2lN`bZ^hbm;hJ7Ci^gJ+_EDN|?&{m*55$)~D-roLK5 zK?~P$X=ohFL2D|D-fdK;NeUFwzA*1@JCPPUDWGKWl?N`{Dn1BNfx{3Eg4D`@n3l%a zb2oSL1ueo8Z)vfSbZZ7#7kUR4XlfF*(Q^XMT}Op^M@b@b8a2|T0B20o#uT^Guu+v2 z&)Ob8u(dQ|Pwoa?zM;#t@@u-72IM^N&?nkX8}PI=q(lY-ZN(Oxm&S{eOQ4kj2`#N_ zE1i|~d$AXbG3>wyJwyfq^ar@~UWl`(@oX51jrdG7$MMcO_%^6EWN*RpP$dD9!)m=lLSlsfaJ?g_7gkmV(Vp@s*DW z$utfJ(HHlX|g z+C0YvYdln!&-==H-k};Uj|%uN3)IcX^MiN5;J;aQK^mXHP5Yu#Q2}%e&S@cHDrX?b zcv*57Kulr}H;{ z95f2SXA37%fl#0>mWl*@Q9k=ZcLnHQnjmnaIvfi7W6{b`72ZQk#Q2SqD6MwG_>odJ zd9jKb_oNz&6SkzcD$iNsvqX!gCAD23Mn zal0?PwC)GGmIg1l-b4LV9#VWhzd{p5DpU^VpN`m*r;i6-ot6ygML}IdBkM%0fxJWG zOf>_YIbe@OE=TFaptm*@NLItg>rJk$nlBgcbQnK*v3V}MU+O6pAr5n_gv!MuJ35#O z*Cr4ZQp;+Ya@+@kvTAuM>CgtP9QfDLtg>#c*O>vTo?*|Km4sNsB?M>hLoWm>dWL;M zH^W4gssfcfs96{`QV{fCFcPbgY`|x&OoegL1RcWRG;chH>CHhpHW;YP29lM(WMB!D z3^~>vH@UNrM2uV&naH8d>X~PHgn`@+TmyA#9-m}Y%Ym3Fua9=|*(IK=7t#n31{qW_ zFF1%e0K}SooA1CH`EJY-F2i9Z>11nJeVzG|_8%Z}pypb5)c49A!XILc_ zr`3`IpB$TuiKz%e)J5P?;w~LsFm|ZT1(O=$Oq(4JHw&wC3W9ouae0r;fkShffp7i* zql!h3+jtUB-~w4BbW2Pdd%On$-#XyHg{d6qnDT6r-4w-UeM$m}@$XGyd)Tyc6=sta zoHmoOA%foZ<8^ZfHq8Y=+x&qA&WzIf7wdam%XXk93V@18WHlA5jS-7-L+iwctmXoh zhGDI5AY}LoOXlwF(nG>Pr$6X-8C7;@wHB=al9tZO+NylRU)FmS@qVh4HPny!JM71^ zd|pV@fdx}J&@$z9<#nK-vLeDL26n^;ulO+mvfOG(Y=)&M8bc9%1g)`BbXl3{g+N}< zWM>d?X_J`3A2i2(&27b`p;1QOA#L~B*${978AC2B9XAKBK*0PVD;jzz4ETD6b%n<~ z9Sn9`3~FUa7HWAGsGC6)FA4)qB$#D343!~-VG@YkI++>05Gd#wUgdDj*o_v^PB%*C zf}m#pps!kB^`ogsg=4f#D+4-OI;*9ZHqL>mr6EY^^OCis-w|<+n^Fnj(;o~1`q@7h zFAqG*fQ?LX@AD!HAA-}81a%nXdLhwZiNSokDFBCvFxnBG1+pQ>7TRqx)1th<)zVNR z8D=i0@IJ+wE0uhB>`7yuZUQ>AiT6FR$xHze+%I?zvPLWw-G2(@{Bn1`=gEgAZnRwY|VKwH|nQ0|KG3^Tzb&FXWJBYMNHW4Ybk2bZP z*HZYQAzV^5(u1Qx6z?fX)2|s z)Qo%?%oPCJ{J~_+hz(c^yi$M&rjsWkS=P&fZpJr|cAs+9*X=<-O`=)u9fF`E zp(Lt!E^zCD^o=Q?YMWFb;Lau-GrCLzJegv9$U3He;6)amqX<^|Qenqvkf0@2Wg3Ek zw3(8rCXmO$N4(cT2c#4%?r>04t`l&J+OP7$$4oT%^0IrR?Vw>h!S74Z zj#MNQ@ouOsICuuPR@+U~0cb=#?5j(w zU5A5t%;p#(YAbY5B8UwXI^lt{wV6;6&dU6bhg>MasxBWb=%%7@ zu{BN|h1iM;!(*|*1U3@PosKUl#9turWXPw{kzWy4i7IsdSYwBtYF7z@Ay{o~b?Rg- z>`4HcQ#GSH%|j-Ss53+S7Jk(3k|lbjWv(8}>X4~}z20|kn28b+3Es{KYn<3Jgu z600BSiIs3HfWtQV5p0b>Gi8n}y+h9!N}&ovE~|bu*QgVaEP#gGHq@uI_yJEr@$8-)noYnJLwv$tO($P)nupG`B>+J{4^eXb ztVhsmq7`sjyjvrH9cuu$PaN;T*%)vM+vFfA^|uv3PffB_a`T@}Z340>&*R?pCX|(^ zhz$yEr%4cv!mmg4a$`yzMrPLrG_3(y4Nc5DhZe|)t%Hcw%5@J-cg767 zS%I_SFq1w!Kuf~-USEpB*|erAV7gH{B3Yz6x|UU>7pi9~gtKi~gWOi8HF&nhTJJEU zi*HHYSfHM~qnE`B!?FSmT2Jcc^^Ii}<|6g1M=r1|E0C}wqAb^W+LF#dI32`vv$Y@+ zS*#y3iHh$`(QOVRFDiwl~@i(x&T$&CS+6+aqn zKHJXAcOy~#D^qhjm1m}=h6pkUssOzwc$r;I#}*x|kX{HB^^8u%0axWLGpu3YE)&SK zv$ZTLI>%8g$ntlln5{mm6!n;m1z8A z@Siy-U~pS|6; zL7QrE3%LDlNr!4utsZSxf`Okk2mvWhA;e?X=pD(n?EOE zhr(FQqXv;QPF-`)&Zi`#+ z#axX^I68gPXCmzWfJRymOGN=msfViSfEwNNhJh1NSq96)CC;1Zl5^3KAS@Dwes}07 zGk2PH>+ETtK(9>f>^hNSu2q|3X-n8j5SQWwdiyd$ygUt=`$l4N2+^GvGC`=04*?p6 zf-e$>Ces}%7#4X4NmfI930_#=h-w-&8JPLNR2~mu)YEoT61#1|q+%{0&Kx3it?m_= zz-nPt0VGfz@#@sBKbFVSRH3&bnDpfr(<~@|-@x%~y(j|#hyp}O$tdWrDe!p}4-dtOn4D?FU0D`vLwvU;%N%T5p(`R8PvNZ4NU;`~R zX;2Jz3G2226!eVXf!n4w08dKuv(gSUvCI!oCOY&N>P_AmBu~*tyyhY28a@;j*Nzmk z+wMTqToA;~AFv@Nh+KBVgc!*~IOq-@Ni ze)k}Oz@Qr>8oG9!#BF($t_CDaRV9SBxGmIF3c_2XU+qYuYKhUa&A==`5K(i>`7T3}(7!PIbcO?}D=X6H6vZTDUbj zeG8zFrnm+v2vH$yp3{%Eo4MBA^H`kRCI@ZOE})`rEzMipZsT75{uc0Lig$6`u$&py z1(4nZ(fTYq&mb63G~}|RV&$}gkmkT*)Vc3en_Fshru9}DzY=d*k4A~8xx8sn1k~VC zLP)~Zy7JOih6J$n&O$K#;1M2Wc5z}1Bs6sXjiWN2h2_eKmb>ERANfK12_XmNMF@+i zgRD%k3TD|TtpcEHX^MAbvHTKk(s>36JwrDb5Jhtx34#cINDSEcFHhARC!-7l9h$C{ zk;q)0N#Kb>^oW#Vt)mGQ9Msa3P^;h$CQi1v`ga0{HeZ3od$8gc=b*c&7AKWL{*Wv8 Y#$q62%)<8IC+B#e^UtsSKlq>j1DxhNWB>pF literal 0 HcmV?d00001 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..921dc8d --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1709479366, + "narHash": "sha256-n6F0n8UV6lnTZbYPl1A9q1BS0p4hduAv1mGAP17CVd0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b8697e57f10292a6165a20f03d2f42920dfaf973", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..c001c22 --- /dev/null +++ b/flake.nix @@ -0,0 +1,15 @@ +{ + description = "Orchestrator"; + + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + outputs = { nixpkgs, ... }: let + forAllSystems = nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed; + in { + # Devshell for bootstrapping; acessible via 'nix develop' or 'nix-shell' (legacy) + devShells = forAllSystems (systems: + let pkgs = nixpkgs.legacyPackages.${systems}; + in import ./shell.nix { inherit pkgs; } + ); + }; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..0d76cee --- /dev/null +++ b/index.html @@ -0,0 +1,28 @@ + + + + + + + + + Protontweaks + + + + + +
+ + + + diff --git a/nixpkgs.nix b/nixpkgs.nix new file mode 100644 index 0000000..e6e07cb --- /dev/null +++ b/nixpkgs.nix @@ -0,0 +1,8 @@ +# A nixpkgs instance that is grabbed from the pinned nixpkgs commit in the lock file +# Useful to avoid using channels when using legacy nix commands +let lock = (builtins.fromJSON (builtins.readFile ./flake.lock)).nodes.nixpkgs.locked; +in +import (fetchTarball { + url = "https://github.com/nixos/nixpkgs/archive/${lock.rev}.tar.gz"; + sha256 = lock.narHash; +}) diff --git a/package.json b/package.json new file mode 100644 index 0000000..795fbc0 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "protontweaks-db", + "type": "module", + "scripts": { + "ci": "bun install --frozen-lockfile", + "dev": "vite dev", + "build": "vite build" + }, + "dependencies": { + "@rain-cafe/js-utils": "^1.0.0", + "@rain-cafe/react-utils": "^2.3.0", + "@tanstack/react-query": "^5.24.8", + "clsx": "^2.1.0", + "lucide-react": "^0.344.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.2", + "sonner": "^1.4.3", + "tailwind-merge": "^2.2.1" + }, + "devDependencies": { + "@types/bun": "^1.0.8", + "@types/react": "^18.2.62", + "@types/react-dom": "^18.2.19", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.18", + "cssnano": "^6.0.5", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "vite": "^5.1.5", + "vitest": "^1.3.1" + } +} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..0a5bd48 --- /dev/null +++ b/shell.nix @@ -0,0 +1,15 @@ +# Shell for bootstrapping flake-enabled nix and home-manager +# Enter it through 'nix develop' or (legacy) 'nix-shell' + +{ pkgs ? (import ./nixpkgs.nix) { } }: { + default = pkgs.mkShell { + # Enable experimental features without having to specify the argument + NIX_CONFIG = "experimental-features = nix-command flakes"; + buildInputs = with pkgs; [ + nixpkgs-fmt + nixd + bun + nodejs_20 + ]; + }; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..5e17693 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,35 @@ +import { useState, type FC } from 'react'; +import { Outlet, useNavigate } from 'react-router-dom'; +import { AppHeader } from './components/AppHeader'; +import { SearchContext } from './context/search'; +import { Toaster } from 'sonner'; +import { AppFooter } from './components/AppFooter'; + +export const Component: FC = () => { + const navigate = useNavigate(); + const [search, setSearch] = useState(''); + + return ( + + { + navigate('/'); + setSearch(value); + }} + /> +
+ + +
+ +
+ ); +}; diff --git a/src/components/AppFooter.tsx b/src/components/AppFooter.tsx new file mode 100644 index 0000000..0a9980a --- /dev/null +++ b/src/components/AppFooter.tsx @@ -0,0 +1,47 @@ +import { type FC } from 'react'; +import { Link } from 'react-router-dom'; +import { Bug, Code2 } from 'lucide-react'; +import { Button } from './Button'; + +export const AppFooter: FC = () => { + return ( +
+
+
+ Built with ❤️ by the{' '} + + Rainbow Cafe + {' '} + Team~ +
+
+ This site uses data from Steam as well as data provided by{' '} + + SteamDB + {' '} + via{' '} + + Algolia + + . +
+
+ This site has no affiliation with Valve Software. This site uses data from All game images and logos are + property of their respective owners. +
+
+
+ + +
+
+ ); +}; diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx new file mode 100644 index 0000000..ac16ff7 --- /dev/null +++ b/src/components/AppHeader.tsx @@ -0,0 +1,77 @@ +import { useEffect, type FC, useState } from 'react'; +import { useSearch } from '../context/search'; +import { Link, useParams } from 'react-router-dom'; +import { ArrowUp, Edit } from 'lucide-react'; +import { cn } from '../utils/cn'; +import { Button } from './Button'; + +type Props = { + onChange?: (value: string) => void; +}; + +export const AppHeader: FC = ({ onChange }) => { + const search = useSearch(); + const [sticky, setSticky] = useState(false); + const { id } = useParams(); + + useEffect(() => { + const listener = () => { + setSticky(window.scrollY > 0); + }; + + window.addEventListener('scroll', listener, { passive: true }); + + return () => { + window.removeEventListener('scroll', listener); + }; + }); + + return ( + <> +
+
+ + Protontweaks + +
+ onChange?.(e.target.value)} + /> + +
+
+ + + ); +}; diff --git a/src/components/AppImage.tsx b/src/components/AppImage.tsx new file mode 100644 index 0000000..2b5fe70 --- /dev/null +++ b/src/components/AppImage.tsx @@ -0,0 +1,25 @@ +import { type FC } from 'react'; +import { Link } from 'react-router-dom'; +import { cn } from '../utils/cn'; + +type Props = { + className?: string; + id: string; + to?: string; +}; + +export const AppImage: FC = ({ className, id, to }) => { + return to ? ( + + + + ) : ( + + ); +}; diff --git a/src/components/Button.tsx b/src/components/Button.tsx new file mode 100644 index 0000000..47ccd51 --- /dev/null +++ b/src/components/Button.tsx @@ -0,0 +1,71 @@ +import { type ComponentProps, type FC, type ReactNode } from 'react'; +import { Link } from 'react-router-dom'; +import { cn } from '../utils/cn'; + +type SharedProps = { + children?: ReactNode; + className?: string; +}; + +type LinkProps = SharedProps & { + to: string; + target?: ComponentProps<'a'>['target']; +}; + +type ButtonProps = SharedProps & { + onClick?: () => void; +}; + +type Props = LinkProps | ButtonProps; + +const isLink = (props: Props): props is LinkProps => { + return Object.hasOwn(props, 'to'); +}; + +export const Button: FC = (props) => { + if (isLink(props)) { + if (props.to.startsWith('#')) { + return ( +