From 8c14c3d093a49a304ba11d7703047f4ccbb4f3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 31 May 2025 11:45:00 -0500 Subject: [PATCH] feat: prep builder --- .github/workflows/assets.yml | 152 ------------------ .github/workflows/averages.yml | 38 ----- .github/workflows/discover-ids.yml | 32 ---- .github/workflows/rating-asia.yml | 30 ---- .github/workflows/rating-eu.yml | 30 ---- .github/workflows/rating-na.yml | 30 ---- .github/workflows/website.yml | 15 +- bun.lockb | Bin 305719 -> 306119 bytes package.json | 4 +- packages/core/src/blitzkit/asset.ts | 17 +- packages/website-ue/astro.config.mjs | 6 +- packages/website-ue/package.json | 5 +- .../src/components/Checks/index.tsx | 12 +- .../website-ue/src/components/Footer.astro | 51 +----- .../website-ue/src/components/LinkI18n.tsx | 8 +- .../website-ue/src/components/Navbar.astro | 7 +- .../website-ue/src/components/ToolCard.astro | 14 +- .../website-ue/src/core/blitzkit/branches.ts | 11 +- packages/website-ue/src/pages/404.astro | 3 +- .../src/pages/[...locale]/avatars/_index.tsx | 2 +- 20 files changed, 45 insertions(+), 422 deletions(-) delete mode 100644 .github/workflows/assets.yml delete mode 100644 .github/workflows/averages.yml delete mode 100644 .github/workflows/discover-ids.yml delete mode 100644 .github/workflows/rating-asia.yml delete mode 100644 .github/workflows/rating-eu.yml delete mode 100644 .github/workflows/rating-na.yml diff --git a/.github/workflows/assets.yml b/.github/workflows/assets.yml deleted file mode 100644 index f970f0729..000000000 --- a/.github/workflows/assets.yml +++ /dev/null @@ -1,152 +0,0 @@ -name: Build Assets - -on: - push: - branches: main - - workflow_dispatch: - inputs: - cdn_branch: - type: string - required: false - default: main - description: What CDN branch to write to - zip_url: - type: string - required: false - description: ZIP URL to download instead of Steam client - zip_root: - type: string - required: false - description: Root dir of ZIP which houses the executable and Data dir - - schedule: - - cron: '0 2 * * *' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.inputs.cdn_branch }} - cancel-in-progress: true - -env: - DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }} - GH_TOKEN: ${{ secrets.ASSET_BOT }} - DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - VIDEOS_SHEET: ${{ secrets.VIDEOS_SHEET }} - GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} - WOTB_GLOSSARY: ${{ secrets.WOTB_GLOSSARY }} - WOTB_DLC_CDN: ${{ secrets.WOTB_DLC_CDN }} - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - PUBLIC_ASSET_BRANCH: ${{ github.event.inputs.cdn_branch || secrets.PUBLIC_ASSET_BRANCH }} - WOTB_GLOSSARY_DOMAIN: ${{ secrets.WOTB_GLOSSARY_DOMAIN }} - WOTB_GLOSSARY_PATH: ${{ secrets.WOTB_GLOSSARY_PATH }} - PUBLIC_PROMOTE_OPENTEST: ${{ secrets.PUBLIC_PROMOTE_OPENTEST }} - ALLOW_ROBOTS: true - PUBLIC_GOOGLE_TAG_MANAGER_ID: ${{ secrets.PUBLIC_GOOGLE_TAG_MANAGER_ID }} - PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ${{ secrets.PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID }} - PUBLIC_PATREON_CLIENT_ID: ${{ secrets.PUBLIC_PATREON_CLIENT_ID }} - PUBLIC_PATREON_REDIRECT_URI: ${{ secrets.PUBLIC_PATREON_REDIRECT_URI }} - PATREON_CLIENT_SECRET: ${{ secrets.PATREON_CLIENT_SECRET }} - PUBLIC_NITROPAY_ID: ${{ secrets.PUBLIC_NITROPAY_ID }} - PUBLIC_DEBUG_MISSING_I18N: false - PUBLIC_DISCORD_SERVER_ID: ${{ secrets.PUBLIC_DISCORD_SERVER_ID }} - PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }} - PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }} - -jobs: - download_client: - name: Download client - runs-on: ubuntu-latest - - steps: - - name: (ZIP) Maximize build space - if: github.event.inputs.zip_url != '' - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - - - uses: actions/checkout@v4 - with: - submodules: recursive - token: ${{ secrets.GH_TOKEN }} - - - name: (Steam) Setup bun - uses: oven-sh/setup-bun@v1 - if: github.event.inputs.zip_url == '' - - - name: (Steam) Install dependencies - if: github.event.inputs.zip_url == '' - run: bun install - - - name: (Steam) Setup DepotDownloader - if: github.event.inputs.zip_url == '' - run: bun run setup:depotdownloader - - - name: (Steam) Download client - if: github.event.inputs.zip_url == '' - run: | - chmod +x ./temp/depotDownloader/DepotDownloader - ./temp/depotDownloader/DepotDownloader -q -os windows -app 444200 -username ${{ secrets.DEPOT_DOWNLOADER_USERNAME }} -password "${{ secrets.DEPOT_DOWNLOADER_PASSWORD }}" - - - name: (Steam) Apply patches - if: github.event.inputs.zip_url == '' - run: bun setup:patches --depot - - - name: (ZIP) Download client - if: github.event.inputs.zip_url != '' - env: - ZIP_URL: ${{ github.event.inputs.zip_url }} - ZIP_ROOT: ${{ github.event.inputs.zip_root }} - run: | - wget -q -O client.zip $ZIP_URL - unzip -q client.zip -d client - rm client.zip - mkdir -p depots/444202/0 - mv client/$ZIP_ROOT/* depots/444202/0 - - - name: Archive depots - uses: actions/upload-artifact@v4 - with: - name: depots - path: depots - - build_assets: - name: Build assets - runs-on: ubuntu-latest - needs: download_client - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - token: ${{ secrets.GH_TOKEN }} - - - name: Setup bun - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Lint - run: bun run lint:website - - - name: Download depots - uses: actions/download-artifact@v4 - with: - name: depots - path: depots - - - name: AppArmor hack - run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns - - - name: Start server and build assets - run: | - bun dev:website --verbosepa & - SERVER_PID=$! - - bun run build:assets --all-targets --depot --production - - kill $SERVER_PID || true diff --git a/.github/workflows/averages.yml b/.github/workflows/averages.yml deleted file mode 100644 index b17fa7423..000000000 --- a/.github/workflows/averages.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Averages - -on: - workflow_dispatch: - schedule: - - cron: '0 8 * * *' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }} - PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }} - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Build averages - env: - PUBLIC_ASSET_BRANCH: main - DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }} - GH_TOKEN: ${{ secrets.GH_TOKEN }} - DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - VIDEOS_SHEET: ${{ secrets.VIDEOS_SHEET }} - GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} - run: bun run build:averages --production diff --git a/.github/workflows/discover-ids.yml b/.github/workflows/discover-ids.yml deleted file mode 100644 index e70e2e39f..000000000 --- a/.github/workflows/discover-ids.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Discover IDs - -on: - workflow_dispatch: - schedule: - - cron: '0 0 * * 1' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - GH_TOKEN: ${{ secrets.GH_TOKEN }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - PUBLIC_ASSET_BRANCH: ${{ secrets.PUBLIC_ASSET_BRANCH }} - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Discover IDs - run: bun build:ids --production diff --git a/.github/workflows/rating-asia.yml b/.github/workflows/rating-asia.yml deleted file mode 100644 index cc81278ab..000000000 --- a/.github/workflows/rating-asia.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Rating Asia - -on: - workflow_dispatch: - schedule: - - cron: '0 17 * * *' - -jobs: - host: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Generate leaderboard - env: - PUBLIC_ASSET_BRANCH: main - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }} - GH_TOKEN: ${{ secrets.GH_TOKEN }} - DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }} - PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }} - run: bun build:ratingleaderboard --region=asia diff --git a/.github/workflows/rating-eu.yml b/.github/workflows/rating-eu.yml deleted file mode 100644 index 6f583e7c6..000000000 --- a/.github/workflows/rating-eu.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Rating Europe - -on: - workflow_dispatch: - schedule: - - cron: '0 23 * * *' - -jobs: - host: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Generate leaderboard - env: - PUBLIC_ASSET_BRANCH: main - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }} - GH_TOKEN: ${{ secrets.GH_TOKEN }} - DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }} - PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }} - run: bun build:ratingleaderboard --region=eu diff --git a/.github/workflows/rating-na.yml b/.github/workflows/rating-na.yml deleted file mode 100644 index 0b070d938..000000000 --- a/.github/workflows/rating-na.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Rating North America - -on: - workflow_dispatch: - schedule: - - cron: '0 5 * * *' - -jobs: - host: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Generate leaderboard - env: - PUBLIC_ASSET_BRANCH: main - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }} - GH_TOKEN: ${{ secrets.GH_TOKEN }} - DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} - DATABASE_URL: ${{ secrets.DATABASE_URL }} - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }} - PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }} - run: bun build:ratingleaderboard --region=com diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index baea38776..22c7f66e3 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -17,20 +17,9 @@ concurrency: cancel-in-progress: ${{ github.ref == 'refs/heads/main' }} env: - PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} - PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }} - PUBLIC_ASSET_BRANCH: ${{ secrets.PUBLIC_ASSET_BRANCH }} - PUBLIC_PROMOTE_OPENTEST: ${{ secrets.PUBLIC_PROMOTE_OPENTEST }} - ALLOW_ROBOTS: 'true' - WOTB_GLOSSARY: ${{ secrets.WOTB_GLOSSARY }} + AUTO_PROXY_ORIGIN: ${{ secrets.AUTO_PROXY_ORIGIN }} PUBLIC_GOOGLE_TAG_MANAGER_ID: ${{ secrets.PUBLIC_GOOGLE_TAG_MANAGER_ID }} - PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID: ${{ secrets.PUBLIC_GOOGLE_ANALYTICS_PROPERTY_ID }} - GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} - WOTB_GLOSSARY_DOMAIN: ${{ secrets.WOTB_GLOSSARY_DOMAIN }} - WOTB_GLOSSARY_PATH: ${{ secrets.WOTB_GLOSSARY_PATH }} - PUBLIC_DISCORD_SERVER_ID: ${{ secrets.PUBLIC_DISCORD_SERVER_ID }} - PUBLIC_ASSET_FAST_USER: ${{ secrets.PUBLIC_ASSET_FAST_USER }} - PUBLIC_ASSET_FAST_REPO: ${{ secrets.PUBLIC_ASSET_FAST_REPO }} + PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }} jobs: build: diff --git a/bun.lockb b/bun.lockb index 88ec7b0d0ecd9129fa2c58944fb7b1da28e3e412..9c52bc2178be2df8ec37802de77a47b8ff424049 100644 GIT binary patch delta 54939 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 delta 55424 zcmeFadz_8c|M$Q59-F-}&W9P}7-1a7*~}O-8#y0BDpce&n4Aq|)HEY0DwVES6iFo{ z#|}(V>4XrHqEe}psgHEdRPuYiu7eqU)cyVa?)!KD)qZ%*YrS9Vy-x47u63<_&FpRG z`xUmlTjBnM_`Q8c_x-ipC(|D79DX1*y-n`km~HpHI;isD5obQ#d?aUdk5y}m`Skj1 z!N6L94~{OF(a=9}!HTN!%>q7O*yqb#8Rc+&*RF?qS@bNp3|wPDezTmH@T`Qf2CfV* zhReg7OFGWeGRJ3(ppjhk80d$P&sQ5Bja>~sfPD#k1-9yW7P~s!9=i&>2)ia+-?eAB zb_K^jC-*wHKm@LVV{Nz=Tnbi)ek$SfRfRLtC)}7m)#uB{E`>dE()dZ3zDe}9H1->? zMpdoiRS0X0M}9s&*}`Zuf)LjW(21`EC4AejMe>iP06W=@T#Hp-xD zLKSf3e}%3-egLcO({zl{=gzz-W7XM_29)E=onj|^xo^5WHGNF_3?eZcThUZ$jpVZi4)<>8M4|(%2B)S^BcN0o z@A#L2rEi9{cq%t?BJex58vX)X5&Mx*Mdy(Cii8SmY3z(_Qxl($!R0Q5wY(d^wc(Np zP6tL|x4^y@4#RoPoQlW78tHP^z7-}Yx&2{9C<)e7%xdY>I}FZ|LuXfL3d^yI%LTNe z^)@Pf#Pl&lqzM(2#_rh0X}B95&~0cgsawRIve7gk4niO!V%fUPwX1FQZglYBmc zn>#0o_^ShB5!BFS@TG8FSR?+O3W#!UNw zMRIF*a{Q{miokj}23|*|BCx%<+MU;r3{`j^j%x4*E@92-%t@ns zdTr|BR6Gd1LJ_?ewieO%U7bZ1!PeBYwl)>7l@r2Jcg|6(Y8yQ&W2$PKI%)j)>63lF zKyN3GU-ok1winjY+yHAH7QtF6Ghi;C+$-UFa4T5zRS~WYpYG}C2VwcGhgrEfx%ZIZ zI?bH`Ya%Xpxj8JyO0XvE=N?Y}QCRj%a2&h|*6=1z%A7VbGt>9o0LT6kE{Q&I_{2#W zL?}IT#Pp2uqkNxV?S$t5Tu~SGizF1_r`(K1uAK{4L7xCC?t@@WWLH@6Z3(Mfb+`%~ za_#T0a#q%du=HK9%0COs|1ntQ@0Cr*a%Yf`V>&FyesE>DJ*)!tVdYnFZ6B-(8Z&ia zc>3r`nlay`(dqVndf8BC1&vD2oTj;KXKf1As`KVBXW49Zc~tu7>16swPMwsQc~hou zgY|u=R>^WB9j|l6t!m-={t8ydaMc{|9yc|8Y}RD%GTybZn6y^Xyvk0;Cr_O;Ve+(0 z-=@({=*NvupRNvk#oE$RpWJlH^z`ZJzSqY%9p3`mQ`dBS#)OP%z8r1_rSSU*fANH= z6EY^GGe;AKkI5K0Jad{ix49Wk!(DE0B2gFC8VbQ$6Pe_z;saEq4*oRG(Y+3>L04p# zx%s0fO`JA-WV%m0j*c9k;FNpK=DNDL$JsI7kD$=!Pjp7G6(fYqVlBPUH&N8_-yn!Q1m!q$db5OhMAb+glao$h=k@k*Yi*0tNd|T`fKP~T>G)bY50o| z&U1R%6r0}Wc4%To2F2~GwIy5zX_{eEZ zGcxbQ)-Zp*-Qj##k(@kf+T`IQ$N5H0Wl~#>@~ypB9q;VReUOAI`~*jh?6AvwT+X`R zY4}xa#kuehJ$SzBVs_Wi!_A#fx zL>j72##9>C-SnBqoxAMs=o;AxSQVdp!tvYY+S^vT3)i*pdD6+B0>|M$6xPz(xXPJ; z0$3CGC|oXw!~h($E!;%~Dlow16j%}Y*^R_|a4qZ?Vcq^$!|GVQwa&=z#;$>V6kGar z*j3;Tum<)skyd@5z|voXqm{9Wgm|vCqFjS`YlBmK8mvHZ-A$g9KFv3Iqti|AUDh4e z_vLEkc<-G?W;D&1$W8EX-z5Fz4U6|i3pMZ8~|vjxA2OYg&2b8-z#YIm@@Am0!MA&flF+yyJs+tniKz-YLO5 z4S1&n@A%>!TfAe5cO3DK9rkg9&bz0Iob$&C=O9#g&hgGG-f_e`FnQ-A@BHJPW4zX|!)S8R}kxcbrZ9S_-I}6Vj)SNpI=%9Y9wFJYX0ze$oiv z>_bjRUP0HrZ#3ttDcrTDrcckz7@g${z3XfpyJ2;_@?mG78(sg*;k&`Bk(;d&d z@n62#=|Fq90tKVqcQ(^g?>U$L`!0J21n)3c_l64(adDKdL-}&BI{x(sjy?ZF=Z(S5 zaD~=nOd_EkzV(sQKzioL;p2yoO5cvH+u9mfQ?d+}ALrr9Rde=Gop!V%N1Y958g^N1 z3)Wse8&+KI{?u7DKf<~vOmq2>udQk66NXRrWe%S~ON4yt7@LQE>CEK~ z?m@FX<+K(iedUb&!IMrTa$xnP7u--M2`{#PHwRu&yg_+`{cDiiLFN86s280xI^Ybr zqA&MSdQu;u5j|FPlB|rXW1cxub#W+ExyOmCqaUdE`7@Jie;0UWY~6CD{Yh3Wm@3*5>~rb zX~B26ta@9itx|$DxsorpvRg&`U1bM$l(gElP79nXY0Ye%7Hq+)y;8b=j#bb)5=9nv`8OaHfnkGcheV zfb~1XcHc;9xScA`8ou1F?0QmH*xh-_%1erbf51+&2kO5i$x2R+_;0qdk|Tjb<*gTz z)BKlM1xUlJ3!k-)wx)^Dk4;hJ2VEgh%i#Bc_dI#|rw(IPRt3u}a9(TPS} zVaZr@7tfJcgY0swi|{Til`C$kyCq|NzV28-+qwely7Sh0tVFC*R>yaeLKunwy{EsI zaw&JfVm+-+3SlTK%I?V$*Rlf_+$YOAo0Jmv$2oxs$jjftD(D#TkF%0HMS_j1Yq+VM zQo^H2sYUwTCNaDWs~=WLl?a}~N|jfz5vMTQKbTIczpXt_D%q|>yG>6@g{@hMiQ#v# zoNlYe5W8V-^5{0!9IR{X))a|PuoR_$J;jN&S=hFv=-!Q`o|LfjKE&#S6>W!Nb{%Ii zI1xOE)t0ge{<`*7NO8Olq=3F&EE}|xIn-q+`n#-j)b;jsp<1o z1f%P*R;<+4DdFo#C6nh2XCamb$22gU<5((ZTfr8W>N?dl%pv6jWXD}e#V`gaYW_GY zuSX=D%RZ$Ygtft_54#pK)-Ev|*T7qSjLhH1%Ig^kFG6#h#Q!JPqIAo|@U`r|s*Cm6 zFEO|RE7|VA2c*=2u-(l@@y`0g>*J&lhO??Pg6&wkcuUxh35|+Q)?BRX&R70DRwpaF zZ+k1RPb7R}W1p`hd8O=f`>~v9)r7pu1vrts^U(}-YU=Y1E2;z^Lm6vrZ;=wNp5P46 zUb5k_Sa;!RZ?EAWu-akS!wVm3=JdzT3pH!*ES|zvW}~RTg~}%=H(a3fXyNSn=Y7J< zQM5pvT9_|`Vgf^r7@HkQ_TF|G4(q^-}_1Ir2dBUo2rIag9eF6hf`Pu+TkV|B)gvSzJH z3Sp=x&Whce;SFpf3V_e*$ldG@ENu&1l!*`?3KtQ<&@Y)$|+Ie8c*v>igP9H zE+ggS=96;jYj&;YcM~b62iwkTQP+7T`jT==EF|Uh;1g0#yA6hTewn1)zL2u(3!EEb z{WdWzoN>L+mte=npO)x1R@Nj=&DUEmOybnccH7ckY8)l}-K^xv5&vyg*5pX|U2>Ah zVM%h9D?Qw~3<)onVFxT0yn@Y*?{-<%_Ax2pU8I_$7q>VWhRgTyvz;mVKT1M_5^zk?>M9x8`PvfpQf3B6q&&^gIKTlf){A_I{=SITQr#St!;}~9xrHI>O37*1Av1hR1 zRHs?qloI=iSX$1^3)Ul8nisZzqVX;k*D`Cse_2u}^L*tjorzewWjS|-$7I=Ot@lVN zoPK+n>vIrL<<2I5HC9V3=jOE!OUuJKKvtjbY;Dfbe1vQ9K8nM}BUlP`33V}e7K`_s zt=org^!d2o>P<73&^=gML#(zjiQ%_g%f5~ILss6LNcggwoCfVKhqJNN89bQV4Q`%u z@65+)Po9124_-Qh=B?D^l<+O2uC{euJ?~(tMW;-;ET;@BnyKyWTFz>pi>0lEjez0o zJ)h^N6k`49;8G#y2}wz#jeWSn3NsCPaI& zxLSE@QQ;P+SI+Hx7?!RRyap%fw^*7RpS?SMgrzPrZ`q0d+E&)x5%!@xe!gK9@H1#7 z-xKk7x3c(oo0WG@B)sKTr*jppSvMz!3$WTz-mzNcIBUh;-TWC=!Td-dFUM+kZ(88z z9BbyiIvC{L8wr1t>kPhvH7k?1yR*CjYC>mYsYd$%6WBh>df~n_f3#I_U&KGqO1?i5 ze)Kk0v^{{1xru=fZ?j&wKP?w$>>UMuf`Nch7!-u3B!ipLICBslX9&V=^EiqA+T=)HY7_D*kE z&EgI)0INN%FlFol_gPsFMuI7GsmIEGFeNyP6z^~zObHyGYt4KxEm(OT^JZra@KWIg zq%_a0Yl8BPbkFj~TUm=D;pgshc4}w8jIs(AMS@q{&AVAEdr?YwIVla)-iX2{vCi-6 zJbo%L5&s=l@?vg&_c&AToF045=Y2V)%38B>68#Ta1$exTruApN=Xm#UBs>>U z%iYS$At&G77K*9FThe1gZA@>omkrL=x9=6;CIXV?Gc_WJ$U}2 z<6`~UILpyq%RDB?TOJ9ITkLEYY@nSI!|!2T;q+=uqQ9M$^=KqKZHY5xXTMyJ<*XiU z4PRqjXE(~W5t{apv$Hy*Xx=p(LU4jdcCh5bG-ahe(LO|i`=O?vb^aFCP|pfBTx#Es zX0#8H7`w$7O8mE%+j}-9^@5RzC;^f6FciukOQy3f}%YLX) z`B86R>PBCz!upmKT04`9VQ{8f83}fyQs+)_*9s>NRC-ThAb*85^T{-SLo4seNI3m5 zXWE_CS7B*KcC3nzdwo%xL$C_-_F?rq?^)vsXDTRndr}DFd?3TmVf8%k7`L)WCBZ3J z_V9vxNTpe+8`_7Sbljbeuf}rPoYgI<7{-;>_7&|ztGsKFYb3l4OADL9aeuG3+S_>5 z=doDboyJ)J8?hYES&t@$zs0)J>sYYU8da{xM~g@m#`X&=XLh&{g3X^|3E5uvkkaC_ z=PC3tmWFIrd=RjoXoZv4IxTZ8tV;{iv= zU07|g>|0OxPprOJ&Pk!qGtOo1oWSQ=$#oDN^lh|1U^sHHPgyG2wZqn>?T)a8t0f zTR7cZht=P%dDf)Fz@N`sGqXWLn)z6M*JYt_jcj@8_* zRwtPSSc!Hyolkzoaw0>Xzp<5-7YR?y^DfqoY5bA{B_E|VWw^T7$h*Jb{ADNcdnnO= zkCpdAB>Wnhy6#-J=dk2YOa~6o+V1#a{GM{m!SBo==@5 z#al=GT5e}8KXdlQbAEo?VOQ}oQMXfno=7<6(sdq?a*r}A)^-w{%OG!Do z1*FE<+ORkDEJ3+%kh}9O>PAy!Nzhk+x&MHaXGi>;CH_v&b*!mr3Yvk}nIB&#K z0J*^0aa4ZCn#p64vWJ|87zFpBK3J;Ec~~(YO9Qlb{lM-+)(Z#H_~k;ufk^Q3cX8Ai zID9*)F18cz0D_0Hc$RFA=6a96q0<^2& z^N#a7rX~6pSXqZ6{%TepKY9Ofh`7A({JMr%4(Io7N1QfTAiP)TiRCO1KiksnR>8ZG z;MZt_th4W?1Unt|`9>)fuJD1gR5@YttEf^Rx_WReDbDqHggx_CjwUL@s!}NqRp*TEI>jQv6yR?KCMC`|%WiGb``2NO00O#Mj#XSxRs%sm_iMDV|cPhW`*MJ2i>a zFe~*$`(h-nv8DJ^T7@b)pVUxW`-T(~ht}d-1x}URNot}};h#xe#z?r*`Q3E7Rd6EW zf9jd!FMIiW#QN;NJn&zpCAhC64G5R|e~WN^Jmo6=n5e6A*K1v;Cfh^%6^e9;iHrC0`VH0Z4xl zsCTacyrTG!VjLom8f^8WBdMz!}zei?25m2{lyyL_pV)(17^P8U$wmY^OKt`_FMD6u9~AlXMp&3 zso)Qwmss{$8N9^BfFDu*#bD(JT`mqQza*^uXqU^u#j&fv{PVH2>}bUL-LRAJ1<9xh ztAb15(r^OIKVLIfZ{^ypCGrw0*@hqG;jXaC>yMeF_j0*6ta-oO<$iEE>|uU)^$$Z( zk4M6)V2sP-T%P3SPlfsC%XE2~3|?X-r}IN2y%|=0x58Q{cfjhvTv#u$^!sy2XyglF zQBj`Wr641*`nquwG*MJ{t2r?Q5YnB#bDJ}LYXeBBc-tU*VPxzPdS!> zHR4LJUScJyxOP#Ne^pl(`%QK+e^ql&F@L$73gk6*^TbLvb#1ZACcxSQJG=V-L3S3@ z|G^6BrqfYHv76iBi?MDU!vfxdb{&WP-{zeEgAG<=L^Iv`#EL++YhR4DF+nBe zt%W;Xf3fVjt}RybF8#1hovvk?l<=1ujN!W%Nv`)P>o2UeZK12Li(Fm;YiTcs`R7}q zAAe<&UBX{$u&RB+&Au3`+Es48SoTw{eKA&jYsvSUQ&eyL=etlHd9UY(qO}EOWv&bPLxn%Ws^>+V{MLl;8<;0T{&HGwzE|9G7qD3uqN%694|&MZ2C*Ag^>(jn zf%myZ#nKPB_QhEK2i^RCV)?z})_2(Thn;Ief*js+GyaJ+iyydtMOhs^=GOBuESFDR z{!9k1|K^m!3|0K4>-bNsj(&xo-}EWz9**+eV&aNq|DkO7tjmA8`C{qkU`c*Dt$r8d zhxDKfmt_~nmS4!t54&8_)k{a|4~BV>uv7J6y~F|Q)Q?ql6Z188)uOB$L`!sKwQ)Jg z^()GXN_%v5BhAeh>qc^!YZqm;*BM>hCCX>4QvTTCD%=B6{=MBo7h`p5fSdnMtje!+ z{ltFj)KAWNX|ODEuW@sWvh-_Ry(p`9L)>yhVGVhN>nB$JD7XQ9H>|9C`JwvmgXM2U zv6K~)#cswDdGRXB%6|l1{5UL^C;6cUR=f6E*Iozf9JC$QcJQW~zZ=#|tc`0wtnvq= zxRjJQm^q5YnM;K>c|hS{WGlczruQnHNrD){_n6(BgGl6<|!K1DWn># za@BK4XgAR}Ip~Dg99Dr8*C7=yi`^U6ORSwL-OV2ZtKx|+Plx&E(>FrsC05^Vfz`2W zSRJ?v)lTb(=fprybf_3D04VL2pxFq}mtdV~LtAk&|I&w&qe+5{6)nN^!A*_Kl zhxzAg!w=<0T)VSGy<=8FJ?r9fSD3neJzZOWRIZoUZ}ye(SG8XMH6|y5bT5(yztD9N zt1qkM3a@r`vBtO_R@67Tx>&(^2A2P`t}d3}^RUXj2y4tcVgC8{23fbtct@7Ys^E}o zi)FtHYb-}xy(p`J4_sX={|{ZeC`i-7k{QuC9 zrmm7(@BfN({#OqFJNXKEWw#?@g**n6PitZOG5<=)p_MKCGpl2*UH`VOzgT*rYZqnd`gF1uZ+kai ztoG7mYyBx9$B647)_Uyh+G6E*aao_s)=R94y1RN0R~Jj~Vt(>sN$x?259;uyht+`x-24Y&y&f#y%5gBRAXWp5U0bXQ9(HYUz%;GouVn{rIi}nn zb+g54|1sAVtN2RS7OS87@V{O~S@k^S>SFbOlgnFOy$I*n4ZT2yBD@<`!+TuEqO6ME zL03l(!)oX~*FFj>FdxGz|0%2ve&O0*y7}M0dKGe{P*A~BZh_OV8u-pF@V9Ku`ZMm| zrVf1hgp`&9Gar9z zO`aIIZ}R_(bN(*le?$NGsiy8i|3201#TwGV=3);m6(Q;WKGn3(ZvQ^j{J;HFbIX#- z{@Vj)dW^r985`q|Hv35V!zMP?KhVU)B4o!Rlrp;|?2^#58bY+ms)jJ58mVIv%9{8% zgobel^WzZ8o1+N+3Z_MMsG^xCs$`CfDx2gQI49M>d07pdtD1ZXCnfZ$i4bd+)I?ZZ z6XC3cIMbsRLibt->uMp?Fa;9MNElKZp_W-w8)0>Agy=d5b zdSmf8YyCv+B(DYJ-rY7rBgc+A2 z9Fx$@#Meh?SRY}2eS{X~sDvXDQX3$&GV>ZB%x!>hNX`CBod62&W`mWs+MVB(*|V z)(T;u$(L|aLZ8+MgUyoG2#Z@IoRx5`>CpzEdmDsxZ4ic-0tsg%3~7sSy;;*1VRc)C z=tP9!W^f|HphSf25=NSE5<(~mVL}o@y2+EURYHwqgfS)~8DVTP!afNZCbk_yOgn_^ zb_nClZV9_2G)+O6VEC**@kl{9CSj6^Z;#NhJ;MC<2vf{a2}dNPrXpmTd8r6E(qCO5bid+CG3*Wv@61VlhqYrMpuMm67Dnc-4GgfLzv$UVSza+;fRFP z?g*Bd*BxPQcZ5?C7MkQ92uVE4$*ECdo9^9*OHxmE!lg_ZV9_2G`$XCpUJuo zVa9a`$0Y1G@k1ziz|0aIG)G16m=;5!LuQ`nU2|M?*d$+1(WL7sy6k$2zHjmo{6|d3 zVbD>tMD&6AUi6{qF&yXa!*O0W9Oq-E0KxyU=|2Mc#HrC=K_fq#Vx}NuPeCYUc1zeLq3KkFXp=P+Va8Na z$0U?B@tFt>GZE%zB9u2rB^;5EIt`(snKun#?lgo`5-OYI=?F>F5tdCysA}>hoRrY# zMub?i0)8~sCSo0W#U)?$NrmXvnN#dvjJjIeGoLbfT8a7MzAB?#=4 zOAuBsL5O|`VU`*E5W=8`5VlL0ZNd*DgdRqi@G!z0lP6)Tgc?f`?lc)o5ymb>*e7A0 ziCu;evkW178N%IWw}f31nm&Rs-()?4Fyj$~V-oH&@yih!E=QQZ9ASYuD&dHP)JG94 zGw)G^xsM{8lCaPuuRuszfv{`^f-(6LPD<$W7{U^>BU6W)Xn+JrD+ z6T%xNPr_CSH8vycG#Q%_#%@N~Ct?$C0h{|Z$&sO;X~6S521S=!n!T5C&~S z*e>C76MhjP^diE97ZFaFJPBJR)Yy*jmC4wSFm^k_J_-3I_9cXvmk_dFLion)mat1g z)0YuWnXH!)X1t7WOu}gs{|Z9GR}kjEg7CdLD&dHP)Ex*vnt3}A=I%f^CE;h2{3=4y zs|d?pMfla^OE@W^&ua(;X31*^i(f-HE8%z3<8_4YuOqB`9pS7gkZ?xAkT?9j0_XhZ zsW<#ro7HciM8AoP-wb{emqBkLY?lya!aET{I}s-AL?gt{jD4npW1gbD8;Tx#+p zY?V;s5JCf!aR_1TA%uMr;!W(k2r=&>WWS5h*zA_DOG4Ab2u)4aVT2in5spb{X5!yN zX!st&{Pz%An4=PoNJxDjp_Q5UKEmAh5l%^HW0H?>n`~I}Vn?#qH@G+>f87}H#@=5-Zv7bOa%@k2Dvl}wIKB22kKc%aEOxCC9mz#s4z9#-S)X&Tk^*2XFSC|%` zK?BS@$jtprqx_7bSDEC`(XTcOL<3E}Xprgn1vJeLD3-yqER2H}{5Nhbb32o3*(F#kUY zQ_N8bMXv3bd&roLejSg%f3ap$>d8oDWT74geAUmn*s@EBnP54KI(2occ zengmK@+54PP~#_rJ59z<2xEUj*e7A0iTxQN=4XWLpAqghyCv+B(DWCC`6lZZgc-je z9FuULiT@R$;jakue??eej!HNpA@vM`W#*khn0p4{l!S#Qxd0)l0AX1Hf-(6LPD<$W z8^RK^)pcWR6NWA|W*j;Tbb83Sn*(!YK*QndD*! zNyQMB6+_r!@+F*<&?ktHXO;vJ76%c|O4w$46i4V@9ARB?gzct4!WjueN+7&!)|5b4 zT>>FGgs{U54j~K*A#9iMnhA#yLScjnVT3nKo`kIuYLrCSX);P8j4g?ggs`rgk2JvmPXiTvPvV&D2;GT!hRDUjnFU}VSY5iL332X5ecbf5DuAnWf10; zK{zGhut_e9kW?07Sy_blO}>Pa68e-wIBJ%ZLs(o6;jDxYO^@;j-OD4aE01u@6i7Hz zKH%K*R`sh8@SATp1}gC#UB%2R6$8^u?bN^w+xj#u5b~GUvaeF0L?F0{k9|bz+r0KD zud??)K#m-rk--1zWB-k4oh{p|223e#dBY=tX4WeS4ee?+)}@*WTNZQ-bn~n7N2S*A z{_C@wuXO%90R63~_urtsv}MPofv=*18%Oa+tX9WnRqcBARtbchZfv0&tNiBv9)V(P zb^hLgZ?;hHEq=L$`G3~z|LkDYmg7wWKl+2AnfzI|N_=kT2krlFY0HkPfghvH-Zp`; z;Ts;XKRA&)ZA)s~K-uEa@f++9YUJ9i5f4zk(cXXWlDCmRqL&92 zVNBGcEp|w13?JwGPYU{_hh7S;_dh_iF`Ie>?hgF?xk>98xGPxeOFnp^;4~{5&ePGo zPTPMApL-=-UR4{rYIAyHV5ptiLh5$E!v5mFKmU(KfNQ4u`S9k)huy!uY51`@{y`uq z=g)J_OOqPUtm?O2`V_lfvNh3yej}=v_i1MReMU`N@!6kjRyqA?&mHa`Zs^m^()0)4 zwOmdA|CKcTVz!#2<@lPrqW*Hcoa@-a)%01UZ%FIa($(}Qy5GB6D_7HJl*Y=5S8G?( zXMYlGg+F3-HGLeXzpJ&iHGX-g4@_O*iixhHK4s;7hAGL_^r!Fo8+pBw(bQLcZml|L zz1q8eie3#@OLa9x?@708nycx9ThYB0A6^kxtVH^LHwqnGO@FSP;A$ORO`qcOKIGWR z)vB6<9|bDr#E`WENiTf_ToKo&&z^R*F0Q7}Q{L}tU0p2>Z70yHo2ykPZGZk4?(S+e zNDp(%_HZ?=hHb^2Ux)g7x?(NF7u|vPLQ|RAV7sgJakV;VFS%M@x9lZoFS}YlSF4M* z!`1q`W$U56>S_b@*>iOJdrMwJ)T~|QI@TvWMT?ZzK)1pMq^G*tAXjUMrVl6Ur7s*& z1ml4|^{eP!11q}`I1CiE>s-Ia`gQOJG^~*iaUGkG)~6lxy54ncO8OJDOJIePfA)HP z7fqua;cCrD??=-pN4Z*a(hbxrUZc^JYytGK<23bjj4QSzJ;QBytgG=U6yFInbt(gm zf4)Kb95JtACr!&w0$q9klJ!a8`nLL5UpLSl^Z@$c#kW8o8CeUS2Kv~^|4=kSu5LSHz`U{|qp)p7Yqrn)Uu{Sj>jt9n+?@qD@=m~m*K4#7F zK&?Jkk-QoV1cSjf;977U7z(Zj!@zJb5{v>`4_Z5QfOZdkK1DmmW>fw%F3ehVrW(+O zp$$SG(9x!_3akc=DN++$0&0OuAPN)%K~Nl&2GQVMmh4Wj8R+Ao+IzKc=u^6XP`Cbo zPS3c7fgCEwBf?4z!ou z4fK6HTfs2W!vp4qF9OwaIEUHa>7noa&~>DbJh7+QTbQ;iZBg2iv;}F)c^$k7b^?7| zsUNr;^aY)%Lwl`mG%bK`blT>1)9MIxuhG3lH!R(t+UYw2bi+si?SXC-oxo*4cR$^9 zI)EKai?%UsTl(zt2jEli8F&yZ1ZVMU2*-mqU?3O-t_D3pFQ5;vYqy#Q?gHzzsLN8Y z94HUMpd=^;jM_j}-Z;7*VYZUs4D7Pt+}26Mn>eDxW*rQjI&5_|5AON%{>$@@D1$)66 zdb!I;JE5eUxz;vuY^Q8l-?k zeT&pVGPeT*bZ4Fq&jtDjqCS488*@JR8XO0@0UrXo>Fxu%(dy%kZ-JX>UJ_*#xQ9R3l;z05J1ZdLv=cBy6 zVQOR4BGz^3`RaNMf*m+%ap|is^d(QXfSEwo<}{$wsm?z-;g$wrKtz2d0R1vA=LcfT zhg`8FtTS^Nlb;``+dqk<=C?o4H&yioZPEI`y+JR~2D>%TH(h-RcZa(H4gN)Jt)bRH zJ1x&jz7EtKu8mmRhPI4qpbvH|yc^bP(YJDG^<0Ln7^FhpX8s20*TJh`2Y3Z&yJ-)S zflf;0&55rAwJKjivNos*sso*MV~qcsK-C<5;$Ek09lv!fuMDby7$7&ft5|KIYU+Y| zK<_0Qfu=ymi6(AZfl^?+VCZphD?j z6i_Fx2SdRSpaH0(9l!`M91L?Y67B$0UY*pIqE1Z$6G6^+eoSyN4W0rNVpW<6rWQ$e zaJ3uZ=|Fy-kC(owh~9y;%4dNY!0TiO(lY^_%CSeKk*fkZq=Rgro=cP60ptRW+yb+~ zZ9vhx6$}INkGN??LHWZ#E|>*|fd$}xkPB4TJk>ClgbK_7cLEhu2vzYNK%u@J3UgP!+&Kh5^>5J?41eN-R*+Rwk! zy&&FA83lP5@OLjSq0PqX{$jeMWrJNU0qLsE^fL5tU_bK7~oyqYe^Tqx>ar+NCirF0HeTW zunBnOHjo|yE(7vi4>S=QH7hEphSWo^0nfp!RC&+3`KsUug3VwP*a+4FHU1P(2c85g!4p7d z7D!fzJQt_@48uVB_^U@xFil!*3lJ|i|tjHV!YD|&RKn?&#^A?Gd>Rt8T9oUz1il7YsuCi#KA0?e8l2 zfjm{9&Z&}b!Cx1n7h*MV3aEqs0jg7rQ&G|aRXg6Ga=hLZ?Wqc?Q{I9s>Z8k4m!K}a z@8Q$H%m2>RJzG9S(_RF;D~Ar}*bS*cHRdfGuaGx2%J&x0U#I5pA|`(gLUrk-b@12v z4(R$AqyLBK<($7Z6}F-kYK#4U zGYuMuHwZ7}=fg~%7iIaWUR|nhY5o-kEuxE!+*?Gd@M4SepF*p$x@*ek!cE8NjJ*zW z+%D$gq#o)xP=ed9p4UbLJ+lqDb}6_t&@(1I*VWUphrvTYPszqnei8ft&?7fJJs*QM z8Vmpxu&;po13g{u3+L!9Wgil~K`+n-yEV8MhnAo_nx52lgI`3yg>)OztwA()EBI!# zM(}8OCTK`{B0K?%2SY$Dv^da!GF7mz1J~*?xsK;LaVH=&1@%B(@H(1K-D?3(N)lHln8OcsIs9pb3>W2Mb9*2rM%z5EYlBH+UNE5~RgI7ubtn8(0Hg01pE# z!8~{s*b3yg32Xt+fTzIIU@dqaJO@^Tr9fp?g5}^5unar_9@lm87>P&03ZQ9`)003I zssrkjI-mxnsUy$2wmP83y@qeo7_n7mGw?dOf%H1C9w@jQUAv|BMLBtn>b>VIO_hrk z4Rzub@G{szCtinN1Fy;kU8wj?xGKDp{F!hT2$C)V-XiYD!thx3E^AYKI>OKb7E~YnXtmCZ?mu!D+%eF(NZ>buL z$_$t%N<@u{tASe>kEg=b%Qi}=x&IRX(AEhp5))dssBh|qqFTi^a~*DuN%<|~&MQab z&>}gZMM85kFBH|rKheA#ipmOqh*v|ZS!p_kqguu38;{Fk4u1LD;L?vzH4ONNwoGWA zz!sWi?!%$FzU-EbHn(KoJ-Kf^daSMO(1Kch1wr$1I4UNt6z?<3;qi6xCfjfL_={C| zv{19`^rn1C+DO2mBo5tIPF#PaR`C)zv`J`{(30Pln(IqOjp47VcZ#kt%}Pbh;?I9K zm5OTRzs;N|71f77k3C%}DwaQ2?Nb_BV-`FR6&u)I+@w{GYH6M=9aSxGptw0uI;wZz zqvED!H2hU@Gd?;hCUCB}`8YKy#yk=obsOJ0U#AR}RxnqI;*7r?wKX=6m!aL(rc_z1 zi19CkdYMRBIz5O*S%FR`oocsaNQpbk(`mZgI-w2QS6}&MnqyUymDvsQGS@mGXq zm``LaGW#k-#a4fo!qw@*;mu?3f9c`;v|@gunxNbAfsjck&k%nIncNCdF$`;XdCJu{ zH$!plStcC1bAP+LW8GU1Ety`}=oMxI4sAx`Pz{IEgN`jM)APBig$}vo#E?@xuHfzy zt;)Vvn6ucNrD)qVI8?@A@{?&>Z@c-M<%JF}kyDABUN`xB_W$vta)mjYOPbyl2#VX= zfZO}HzaO6y052SFaNJP2fg54^60x?ESevD3^@ZSyCyMP}waH$5$y$8d$kD1hIOwSZ zJ$_n#!p>=~oHxpwM=CNoRhi#Xc>FSP(QTDVK3NwJW=Cs(n>kpKl~~7YW9^yom7=Qo z8<`1<2=O|zLd((4Y2_`>d1i(3mYQvlw>WW~QW^8L%I2QR%+>-no_$Qm#ZeVa$*NJc`OLxbs&w-@Go=UQSaEBs^7xNR zTiQiZJr&8D5rER80>+_|&s$9`-*Q?RHxSVokQB2h3ffKRj%b2LqT*b?) zQOR?rf9t3!wOGlo#5qISUUx_H9=G2uG)-3hZ?3%9Iai@XfYb?XZoubZuW&<7g|n7Yf|Pk zG14|TJ9f<8w;EhujWDswbRoMXY*#M^X5&LFnVx1rA{`u7)44EK-1^Za-EJ+W>22ji zc$%rxhK}4}_CE|QHs7nePn$`IfmdsqyV^vxY;$ET=Zd^$oWEYnmbVR~v^HoaeLOje z%+B1khZk>J*{rZ$w=WINluM|vwb@afMbyi5Y>qYBl&t|xHXpWyoQ=?wNu;~(M2|BI zlM-(vm+kM4WQeM8{g7qcun%$a11vKYjXFPQs0@Jdw&?yVn_V#rRif^ zdd~#ES>OCwlZ(LNmVwV2n3lDoT6(L8kL1)QcD=b(X>x~@@AKlN3!Yy~d3SZXTe#!r z^~kl#m^cditC=>n8MrIvg>SP+>nRn+bJj z#0{Q9abGlYuITEQ%xtmo_XRU?cPH(_sj+9ikKdiBE#`O&y6ptnymSe3;^w%uH!#t4 zX{(#*SQo!*&9$OYX49q6LUW(2O{PyP$elK)s(-k~T|alu-Kt#CZY?&hWP)=eY+8NJ z(8c$?(yeeTu3rZ8hs2il*`UJ_X{em%H7y-}4UB7OxT+8Wrn*#QIZG@Ni?AR#x z@;wg~Hd%$`$}X8ZyxqBOsqcThuQ10MWn5F&q5ju*RNqp&c&S2%&ZbVo{|dt}GYK(n z7NvB1e`3n0PSH6BR~MGLASD0OSa`9%Fbo&Y!~ZzX*nxH9bYZEBiG1BjRJFK{?1mfy za=T2uveuJ>Qf>?QxeV-=yNq2bX@)l@C^4r0QZ_pGF35)fH#BA$xju8v*&>#ES^dB{ zy$lVkijNzz>F{9ZOlI$eK9kdgD%~r?y%yZf?aL;G7m{b+d;z>(2~IdjZ1ipD*O1G`@C zV{e?P`_R-*+LqmG-(CJim+n7J&;QWRnJV`haF!OI<+3lP3ntF-yXfWVt~d7%aX~3> zRb4dC-LM`r<=M9aJ5o%O7Ev+PkEA&3x@7Uu>-y&Z@k(I;eo8UJ@Q4ewcVbv3_tv2s zJ{kIAp@%)~vF;);2`!m9w~_zOiF==Fv>d_=R_5Xr{rTTbxY2MH zqRDL))jFZ#;f>TalLBtHE)OdkH_Cf$v?h`Kq(o`>&!$?g{O}lag~6 z2%N5ACU)nZ=iU^YRsR3+?2wbp`oHk(;MLpFyx)c^>w;FCQ$cK-`#U)2`S()$Rqr{X ze-b@Ta*h`($>BG?xg{Rn*Yfc@Cu9}oTyShLue4>7E^?gMYT^@l|K_%8pM_enD;Mdf z-*)*+$IP%K>Z@XIPGUTcyIGIargkT1wqw58T&C~jzSkDUb}K#AI;h;K%FcuVcP5bI zUU6@`*gbn(7|@cYFYhVi zYVrV4Z;(!${c7Nk^UCoOrQH=tpx|x$HQSHvZ#ckg{sx@zMr?ii1Rq=-I&byig&90eW z|GCuUO8(wvOZ%u4K1I9Z5#G&|P9+$#%!f*MNR3+RRT8J)c5C~-YS@3y{dWKGUn+4q z)xPDH+Cy7!GUd}a%)QjZxeB&bs#0OdeM@dD=5L+Qnl~yu(&%A^rA5WG`56yRrMdkd z`u5unj~@K9(4$gMXH$5u<+gM4e;DX5%xP}cr4hHwaZu4`E-f~s`N=sI3mqny<2dj} z`**1Ndi?6*cV_64TU#%Ei$96*I&rY4X&#{yr}3zV$B^Aqx^(WD{Z64r#a_JcCMU7M zx}=uBALv?`)5>H=XyZzA@Uf_hC7eOcFq@<;GJBxv8z`%NzsAhI{u8$x&Mhpvx7VT$ zY-(TPpxb%b&knX|^2eS(3LOHbRfninZN41f%xdPm?tebJvfeGM486-EeBY6yH-L=~ zKR)%~xXstuIW3jrGY@wlI2EpP_LW^F`kAgLC%mfn)-BuUQ9ymOABQ&WU5A+8ers{X zTW!+|9r}@@_4r6!^A`@~kG!TZC*9QO$oOWM7AvAE6}M}<*Yub4m>CCEf7Y$^!`Y*| zwpjGRj>4k5t}>5yB-9_`p(hP%yJifT8fmb!(Bpe@bY?oZqFjyF8|L>d%n6xOR32CT zYNzP7PA59i)ucdigYZ-Tn~bYk;>Xu+V9vauPcV~kXp`$!)Utf` z)yH4BVnm_CB674FTPgpkd&B&P<`(8WWfm-ts+3}n`9;@j*DtxXZh7J=tI+EJIobh3 z<!xN;bHqUw+J!KX3uHNMJYR zt(qy@nXYExP=N}o?^w98=Yy4AlS3<>I5hX&O^)8@Ot^El?~9(#E+VIO0`HXgwT>A= z(S%Jns4s_Ze`N6LZ`yySqAe3z;_@yzRmf>P<*}5b>nm-lS*Let9(F9kbn_-7(ET8 z7dsHs3#1|+2s4>1`Y4~c@17zQ#OB;;)1sxB>>!Lt6=urlFd!_7bxeDCXy>0>zTglp zjx+ee8Z77%5SZ5G-Jj_{_C=919~KrnBcl>3>4Uh^86dF9zW>hkkcT4!p389q;U2a3 z1$P|J2A_Tz=L?P|(W-1bY)x4VmPO6|u#)`47pqDvy<(5nkWF9UZKS?^ahFPtJ8;RQ zh3xJKZNx?UWw=~xuH0`G8KwzDmvRp4(j|tF3IxW}%gL(DX)Su)076GG$(9t_4}^x2 z9WL6Nv&87{2M-G<`XH|t-Fy!$K^Kso>Ze$?TplUbyU;np zNGF$m`R%V^vzD*{IJr3C5D`J!{V+SHfxs9`_%&_IQ9A{vD%cHV!Bpz8A2tpBsC$2| zD60oxyt`>-e_RgH&i;U<)3g3C#d|c8!FbHyst$|IClkk>L3;tvE{GCLSeLc%I+<}L z9(};nJA#XqRLl^PfnWh9_Log;WBp?OO3p+F=&#X!QVoJ$w;rf;!VzxFK#cQmQ8afT z4g#0Zh|OW^Jv*O0%g&lCoQMZ3zA%b12P(cQdny>C*ffk>D74}3uH_A`UNwOLC(--< zN^?Q55e4}x4i%Xf&FIh=#kvmDbb0?zf9N3Rhm9DTYfTFVDMvg`FA?O=D#3dkjt#Np zql1zlbpr^KZL@&iUvB%cp>F2fJ&e9vLQ?~}AM>8@KT-?f< z0DB4aE89@(#k2iMfj!^pA#;+ER|3j%n^ z*@XGuUQN?Rz=$m9_y{B`rc(EjicMn+k7G^4P?eFhA6X3BVQx9h{H z!}jSh>Qhz-D7{awW@4ltel92($LHo;Xk6&8R$-^Yce5jC^(f%YpdQnK7Y97HrS4{Z zdqoqg){qFWINmNQ2A;<;Ah7L9vG>{J(xR6yMThXKMppr0r-i{GcT`KKJpVU?@MYHM z+2`aG1hq4#9`n&v3mOxIOIMnMi`G9;oM4uuctoGybM|lgW>YBx2p-ENLc4mM19N+- zU{^XJqyb`$9vcjbZ~gK94XyOd<|a}ZdQ=xA(w13pdv_$}sM+3^p8TVkc9l z3xC6NC0V2zqXe})2ZVM&sG11Y;KQE+A{PMGO7BCP3ODSkK9xl2vym{hAFEj6S%(LtohX!$tByQS{o z>+I_wLe0oLSZRynfohuKYN`WqiFs9h8cqXdfo-Ahx(PzQW#d9Tl^Pj{3&33I)ZA!r?f9gM3R(q>Q1jhFjqRhs~@ZwQTYHRu|D)*f)b>yp*fdJ zRY6D|MC)2~jzH2xsNCrkariPf8}Dg5!QnT(qDpq8@G1|H_hMsv4UL(*IQCoG^N1UP z72L(66#8%yY_u)~PO6nGI7L^=`%JMc7f4-tKUDE5zZEQS#jC~mBI$W3TyuMBHyN() z?_0%cy4%mLVAGn*x$v8*wk@wX_CWkq7?HCrMIn5fPLG6J(Z1X!oW~zm zu6T8ulX+Ax$G6ofDe1Ruc7O_|LW3*Mnq*ZPN#!{d9lTM`%Ee!qvY@3ixZ0YxK|xCH zDx0Se>wjyIm6eu{)W-Hzs_@C}mwSEPF<>S3;X0ozwUs8%RlMIQkaFG2O%qiyT8;m| zmt=2`)zg#1tZ7Or&N4e|L+NVEVL1cUdlrAPgICm6&tWCEiNk#nR#M$$8up%*wO$Tw zIu$R~E8PmZ7=vD`m$P)X(oagCE5t@VND{cK^p&0e<_F9iXJS2425acc2eIC+u-;__v-6= zY3efU9V)uWKX)qMR>^SkVrPePU6Zr^U+P+AYpqG|<^J`5q42_RtIE2fI=_X;r56x< zs&#umIe%ifH5i51h}6PuS8_JG6I88z<)5IS@^C9C>9nD?d!JZhw(n5GzMdVXXmx~Q zrGCDjM#uAj#=>}5A}l^0d)c*giQR=0duTf?Q^ZBjwdg;=&u?oQ-_km>2og$E?N=$i z%vNUc?b?iU~MwcS^Q&mT=?;Z_kU-RN{P;Ehx@W};UCu^=^jQ6*D9{EYPboF zUaRy&=p|#Va!^+lH-DWnLF064xs$y3;pt8+G|H-QF&|Yhpi|6a zY1$T#^g_?ZY(wmVzz~=Lq;iR;4w9#(n@P}3J8HiH#E=Wo(`1#L;(@y03mUz?9F5kj zM;ut<8fsZXJtwqEv{1{g4b-3Nn5&fj|MROhWXVD062Y2Er|9q|6k(mp5kcjRJ|+Ej zM}2~$CIZ$xG}e$FY(h%Fp1LOE5=_gIv7fc0gUQNc?dwGY5l2OsR8$R!f&o|cKmAFQ zg0Oh?c`o*m7)$8%&6_8a_qrVK%#)@aSYUV?jZA@odJh%|KP84g+1mZrTs;EM%G#)r zTunzGw&OvmAt*Wb+z^yw(m<_8MEdzh#>EtnVi>W;=@Wu1y3E#N7);%AE-b0t7I0xO zVa^faX$%k$^O?i&>YcRl>-3oCSOqg>@j{_(Q7)ZsTOv8%yZ&mD7C+OlM;ZcFT`NA2`Is6NM+j;6Kx{uE0~w)UUxvqjM($R z`i?TlVLQfZr~pGyQ~QcQbL@Rf8}|x7z`ee-*1fOi?hI!#XU*XEmc{_Qha%-N)wOv`65=^?U%f)uQcux zfQW<|bNaIYVZ}7x<9!fmbcV^)IIC- zhap9RbU&Ywf>X?-OS_;+=f4#~j;Z_p=DyprcXE0ioH`>I`klzebanW6 zROA|;KC&l>Uu>3;j_hbOlTPhbteUZZuU!?^ZNA29kj0YkQ9RuSt2_I9aFr(Sh7Bm! zM4^n`YM-g&wygb3kHIN666<~i>J=aJo*J2Oc~_rnHr3^tc@2V%EI**p`%#J@2-B7< z{J(>aBTemb;=0JX%sb{E)%8?N5ypspoI8g9Js`}RjJp0Wr+!R;B9A8IS=uzyo&Byc?r0oMw+Mj7I#bfIF_o$j0IVM&)7%#ZaYAi^!OoZTEcb(n90J0tVmZXa-ye-OIhx@KJDspKv5 z)T#tLVH?ujGzJLj<3G^ceFzbM^#djDQ(W3rQ|1N!s&=bE5$3af$gW5!R4-mpFd}A* ziBo-6cBhcd9Qsx+J0 z@E?WtZnVlNZMyVWC?v_MFWm9%A9BcqDg7c5M)w}~mln$cSRDteTLI;#p&}Re++uua zncKznfOKH{VmG7BGzCrZ(;1-9*v_q5OlKhiJNh<5u@ovS$18^OChp2>cXR@(C^~KR zX255_RekslJFUfVmdfv{Q?ccanNBO6{t6wGMDeiFXaEYUr7ZoA;Vz(eUGTN5nl zOt#|XuowtTe^p4~YH*Fs-Eq0eX9aCFs%?PS^TS`uJp9X&rmu&0br61#vzhqLT~UXg zf55?~`=s8B(VaBoK7h0aiFcb>cXXH=P{F_#0K#l5s_aB#=d@^RwQ44wu;Wzqhr4xD zazJrxxfO^_foNE4So~1t#e9Rddi#~O&Ttpgyf2_VrLgGcAnG=EWzv(m+3YnCjDaB- zwsi&>LiuPa+>KQo_GCN_IHdD6;)yhos6+62snqwN;)R#B)*eKWY(2Vk5V&0JZE&XM z-bc@o0kV2pohsssMF9P~=nR$jrpK0LU^=7IR^vCI9_6GuR3!B#?Y5z-Ij~nb_zL}M z4f`23NI7ioO@yS%y-kH@6=>micHl5=@T)e3xYXcSyHJB8Sb^W99ry{S&yFa4&AyTE zK_?ucua79+)a0n*+_Th6=;D%2?iWP~&MnV=ai;%(9pB@gCDw0;FPf+c?p=5b_v~1a7CJmGdtq4dt9r-p%>E UnQ@>EweMzZlGDD6ankhv0FUjJDgXcg diff --git a/package.json b/package.json index edc98de5a..f1d9e44b5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "blitzkit", "private": true, - "version": "1.27.11", + "version": "1.28.0-beta.1", "description": "🎉 Tools for everything World of Tanks Blitz", "type": "module", "types": "./types.d.ts", @@ -13,7 +13,7 @@ "build:assets": "cd packages/scripts && bun run build:assets", "build:averages": "bun --filter=@blitzkit/scripts run build:averages", "build:bot": "cd packages/scripts && bun run build:bot", - "build:website": "bun build:prisma --no-hints && cd packages/website && bun run build", + "build:website": "bun build:prisma --no-hints && cd packages/website-ue && bun run build", "build:prisma": "prisma generate", "build:sitemap": "bun scripts/sitemap.ts", "build:docs": "vitepress build docs", diff --git a/packages/core/src/blitzkit/asset.ts b/packages/core/src/blitzkit/asset.ts index ef3b57f08..cd4f9db8d 100644 --- a/packages/core/src/blitzkit/asset.ts +++ b/packages/core/src/blitzkit/asset.ts @@ -1,12 +1,13 @@ import { assertSecret } from './assertSecret'; -const repo = assertSecret(import.meta.env.PUBLIC_ASSET_REPO); -const branch = assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH); -const fastUser = assertSecret(import.meta.env.PUBLIC_ASSET_FAST_USER); -const fastRepo = assertSecret(import.meta.env.PUBLIC_ASSET_FAST_REPO); - export function asset(path: string) { - return branch === 'main' - ? `https://${fastUser}.github.io/${fastRepo}/${path}` - : `https://raw.githubusercontent.com/${repo}/${branch}/${path}`; + return assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH) === 'main' + ? `https://${assertSecret( + import.meta.env.PUBLIC_ASSET_FAST_USER, + )}.github.io/${assertSecret( + import.meta.env.PUBLIC_ASSET_FAST_REPO, + )}/${path}` + : `https://raw.githubusercontent.com/${assertSecret( + import.meta.env.PUBLIC_ASSET_REPO, + )}/${assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH)}/${path}`; } diff --git a/packages/website-ue/astro.config.mjs b/packages/website-ue/astro.config.mjs index 75acc1237..7dc8ffc02 100644 --- a/packages/website-ue/astro.config.mjs +++ b/packages/website-ue/astro.config.mjs @@ -1,10 +1,14 @@ // @ts-check +import sitemap from '@astrojs/sitemap'; import { defineConfig } from 'astro/config'; import react from '@astrojs/react'; export default defineConfig({ - integrations: [react()], + integrations: [react(), sitemap()], devToolbar: { enabled: false }, + outDir: '../../dist/website', + + prefetch: true, site: 'https://blitzkit.app', }); diff --git a/packages/website-ue/package.json b/packages/website-ue/package.json index 34316915e..3206f19b6 100644 --- a/packages/website-ue/package.json +++ b/packages/website-ue/package.json @@ -5,7 +5,8 @@ "dev": "astro dev", "build": "astro build", "preview": "astro preview", - "astro": "astro" + "astro": "astro", + "lint": "astro check" }, "dependencies": { "@astrojs/partytown": "^2.1.4", @@ -23,6 +24,7 @@ "@types/lodash-es": "^4.17.12", "@types/react": "^19.1.5", "@types/react-dom": "^19.1.5", + "@types/semver": "^7.7.0", "@types/three": "^0.160.0", "astro": "^5.8.0", "immer": "^10.1.1", @@ -31,6 +33,7 @@ "minimatch": "^10.0.1", "react": "^19.1.0", "react-dom": "^19.1.0", + "semver": "^7.7.2", "three": "^0.169.0", "zustand": "^4.5.5" } diff --git a/packages/website-ue/src/components/Checks/index.tsx b/packages/website-ue/src/components/Checks/index.tsx index 292590133..44de0b60c 100644 --- a/packages/website-ue/src/components/Checks/index.tsx +++ b/packages/website-ue/src/components/Checks/index.tsx @@ -39,7 +39,7 @@ export function Checks({ localeData }: LocaleAcceptorProps) { * Wargaming: 14 (refresh: 7) */ function Content() { - const localeData = useLocale(); + const { locale } = useLocale(); const logins = App.use((state) => state.logins); const mutateApp = App.useMutation(); const appStore = App.useStore(); @@ -128,17 +128,11 @@ function Content() { This website utilizes cookies to perform analytics and personalize your experience. You can learn more through{' '} - + our privacy policy . By using BlitzKit, you also agree to our{' '} - + terms of service . diff --git a/packages/website-ue/src/components/Footer.astro b/packages/website-ue/src/components/Footer.astro index 190f461db..ece24e837 100644 --- a/packages/website-ue/src/components/Footer.astro +++ b/packages/website-ue/src/components/Footer.astro @@ -1,5 +1,4 @@ --- -import { assertSecret, fetchGameDefinitions } from '@blitzkit/core'; import { Box, Code, Flex, Heading, Link, Text } from '@radix-ui/themes'; import packageJson from '../../../../package.json'; import { getStrings } from '../core/i18n/getStrings'; @@ -10,8 +9,6 @@ interface Props { locale: string; } -const gameDefinitions = await fetchGameDefinitions(); -const PUBLIC_ASSET_BRANCH = assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH); const { locale } = Astro.props; const localeData = { locale }; const strings = await getStrings(locale); @@ -83,7 +80,7 @@ const strings = await getStrings(locale); sm: 'start', }} > - + {strings.website.footer.about.credits} {strings.website.footer.about.github} - + {strings.website.footer.about.patches} @@ -120,14 +117,10 @@ const strings = await getStrings(locale); > {strings.website.footer.legal.title} - + {strings.website.footer.legal.privacy} - + {strings.website.footer.legal.terms} @@ -138,30 +131,12 @@ const strings = await getStrings(locale); BlitzKit - { - PUBLIC_ASSET_BRANCH !== 'preview' && ( - - WoTB - - ) - } - CDN {packageJson.version} - { - PUBLIC_ASSET_BRANCH !== 'preview' && ( - - {gameDefinitions.version} - - ) - } - - {PUBLIC_ASSET_BRANCH} - @@ -170,23 +145,5 @@ const strings = await getStrings(locale); {packageJson.version} - - { - PUBLIC_ASSET_BRANCH !== 'preview' && ( - <> - - WoTB - - - {gameDefinitions.version} - - - ) - } - - CDN - - {PUBLIC_ASSET_BRANCH} - diff --git a/packages/website-ue/src/components/LinkI18n.tsx b/packages/website-ue/src/components/LinkI18n.tsx index 3683be164..4736d0158 100644 --- a/packages/website-ue/src/components/LinkI18n.tsx +++ b/packages/website-ue/src/components/LinkI18n.tsx @@ -1,14 +1,12 @@ import locales from '@blitzkit/i18n/locales.json' with { type: 'json' }; import { Link, type LinkProps } from '@radix-ui/themes'; -import type { LocaleAcceptorProps } from '../hooks/useLocale'; export function LinkI18n({ - localeData, + locale, href, ...props -}: LinkProps & LocaleAcceptorProps) { - const prefix = - localeData.locale === locales.default ? '' : `/${localeData.locale}`; +}: LinkProps & { locale: string }) { + const prefix = locale === locales.default ? '' : `/${locale}`; return ( diff --git a/packages/website-ue/src/components/Navbar.astro b/packages/website-ue/src/components/Navbar.astro index e5f25a1b6..49cf8898b 100644 --- a/packages/website-ue/src/components/Navbar.astro +++ b/packages/website-ue/src/components/Navbar.astro @@ -18,7 +18,6 @@ export interface Props { } const { integrated, locale } = Astro.props; -const localeData = { locale }; const toolsFiltered = tools.filter((tool) => tool.enabled); const branchName = resolveBranchName(); const isBranchNamed = branchName !== undefined; @@ -107,7 +106,7 @@ const strings = await getStrings(locale); - { - disabled ? ( - <> - Unavailable on{' '} - {assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH)} - - ) : ( - toolStrings.description - ) - } + {toolStrings.description} diff --git a/packages/website-ue/src/core/blitzkit/branches.ts b/packages/website-ue/src/core/blitzkit/branches.ts index d78a374c1..a4301c6fe 100644 --- a/packages/website-ue/src/core/blitzkit/branches.ts +++ b/packages/website-ue/src/core/blitzkit/branches.ts @@ -1,9 +1,10 @@ -import { assertSecret } from 'packages/core/src'; +import { prerelease } from 'semver'; +import packageJSON from '../../../../../package.json'; export function resolveBranchName() { - if (assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH) === 'main') { - return undefined; - } + const components = prerelease(packageJSON.version); - return import.meta.env.PUBLIC_ASSET_BRANCH; + if (components === null) return undefined; + + return components[0]; } diff --git a/packages/website-ue/src/pages/404.astro b/packages/website-ue/src/pages/404.astro index 757b4af59..23f99ae65 100644 --- a/packages/website-ue/src/pages/404.astro +++ b/packages/website-ue/src/pages/404.astro @@ -7,7 +7,6 @@ import { PageWrapper } from '../components/PageWrapper'; import BaseLayout from '../layouts/BaseLayout.astro'; const locale = locales.default; -const localeData = { locale }; --- @@ -16,7 +15,7 @@ const localeData = { locale }; Where would you like to go? - + diff --git a/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx b/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx index 215850e89..ca133b2e9 100644 --- a/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx +++ b/packages/website-ue/src/pages/[...locale]/avatars/_index.tsx @@ -31,7 +31,7 @@ export function Page({ localeData }: LocaleAcceptorProps) { } function Content() { - const { gameStrings, strings } = useLocale(); + const { gameStrings } = useLocale(); const groups = useMemo(() => { const avatars = allAvatars .map((id) => {