From b58490700bfdcb5c25d4a5e412cd8dae597d5bbc Mon Sep 17 00:00:00 2001 From: Rizky Date: Sat, 14 Oct 2023 12:32:51 +0700 Subject: [PATCH] fix --- app/web/package.json | 5 +- app/web/src/base/page/all.tsx | 2 +- app/web/src/base/page/auth/login.tsx | 2 +- app/web/src/base/page/auth/logout.tsx | 2 +- app/web/src/base/page/auth/register.tsx | 2 +- app/web/src/base/page/ed.tsx | 2 +- app/web/src/base/page/editor.tsx | 2 +- app/web/src/base/page/live.tsx | 2 +- app/web/src/base/pages.ts | 0 app/web/src/base/root.tsx | 25 +++++ app/web/src/index.tsx | 7 ++ app/web/src/render/editor/logic/global.ts | 2 +- .../editor/panel/side/ui/FileImageGallery.tsx | 2 +- .../editor/panel/side/ui/FilePicker.tsx | 2 +- .../render/editor/panel/side/ui/Gallery.tsx | 2 +- app/web/src/render/live/logic/global.ts | 2 +- app/web/src/render/live/logic/init.tsx | 2 +- app/web/src/render/site/site.tsx | 9 +- app/web/src/utils/script/init-api.ts | 4 +- app/web/tsconfig.json | 7 -- app/web/types/content.ts | 3 - bun.lockb | Bin 277433 -> 274175 bytes package.json | 1 + pkgs/core/utils/global.ts | 3 +- pkgs/core/utils/parcel.ts | 10 +- pkgs/web-utils/package.json | 1 + pkgs/web-utils/src/define-react.ts | 14 +++ pkgs/web-utils/src/define-window.ts | 93 ++++++++++++++++++ pkgs/web-utils/src/export.ts | 4 + pkgs/web-utils/src/global.ts | 4 + pkgs/web-utils/src/page.ts | 5 + pkgs/web-utils/src/use-local.ts | 1 - 32 files changed, 183 insertions(+), 39 deletions(-) create mode 100644 app/web/src/base/pages.ts create mode 100644 app/web/src/base/root.tsx delete mode 100644 app/web/types/content.ts create mode 100644 pkgs/web-utils/src/define-react.ts create mode 100644 pkgs/web-utils/src/define-window.ts create mode 100644 pkgs/web-utils/src/global.ts create mode 100644 pkgs/web-utils/src/page.ts diff --git a/app/web/package.json b/app/web/package.json index e4fc94a6..a788c239 100644 --- a/app/web/package.json +++ b/app/web/package.json @@ -16,7 +16,6 @@ "algoliasearch": "^4.20.0", "date-fns": "^2.30.0", "downshift": "^8.2.2", - "emmet-monaco-es": "^5.3.0", "esbuild-wasm": "^0.19.4", "idb-keyval": "^6.2.1", "js-base64": "^3.7.5", @@ -84,8 +83,8 @@ "@types/lodash.set": "^4.3.7", "@types/lodash.trim": "4.5.7", "@types/prettier": "3.0.0", - "@types/react": "18.2.28", - "@types/react-dom": "18.2.13", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@types/tinycolor2": "^1.4.4", "@types/uuid": "9.0.5", "@types/vscode": "^1.83.0", diff --git a/app/web/src/base/page/all.tsx b/app/web/src/base/page/all.tsx index a4dd39ab..4655d4f3 100644 --- a/app/web/src/base/page/all.tsx +++ b/app/web/src/base/page/all.tsx @@ -1,4 +1,4 @@ -import { page } from "web-init"; +import { page } from "web-utils"; export default page({ url: "*", diff --git a/app/web/src/base/page/auth/login.tsx b/app/web/src/base/page/auth/login.tsx index ebbafd04..47637ead 100644 --- a/app/web/src/base/page/auth/login.tsx +++ b/app/web/src/base/page/auth/login.tsx @@ -1,4 +1,4 @@ -import { page } from "web-init"; +import { page } from "web-utils"; import { useLocal } from "web-utils"; import { Loading } from "../../../utils/ui/loading"; import { formStyle } from "../../../utils/ui/form.style"; diff --git a/app/web/src/base/page/auth/logout.tsx b/app/web/src/base/page/auth/logout.tsx index ccca1685..c6d67631 100644 --- a/app/web/src/base/page/auth/logout.tsx +++ b/app/web/src/base/page/auth/logout.tsx @@ -1,4 +1,4 @@ -import { page } from "web-init"; +import { page } from "web-utils"; import { Loading } from "../../../utils/ui/loading"; export default page({ diff --git a/app/web/src/base/page/auth/register.tsx b/app/web/src/base/page/auth/register.tsx index a6c402e1..e1351771 100644 --- a/app/web/src/base/page/auth/register.tsx +++ b/app/web/src/base/page/auth/register.tsx @@ -1,4 +1,4 @@ -import { page } from "web-init"; +import { page } from "web-utils"; import { useLocal } from "web-utils"; import { Loading } from "../../../utils/ui/loading"; import { formStyle } from "../../../utils/ui/form.style"; diff --git a/app/web/src/base/page/ed.tsx b/app/web/src/base/page/ed.tsx index 1f68e5b2..74ed93db 100644 --- a/app/web/src/base/page/ed.tsx +++ b/app/web/src/base/page/ed.tsx @@ -1,4 +1,4 @@ -import { page } from "web-init"; +import { page } from "web-utils"; import { Loading } from "../../utils/ui/loading"; export default page({ diff --git a/app/web/src/base/page/editor.tsx b/app/web/src/base/page/editor.tsx index fe0345c3..00323375 100644 --- a/app/web/src/base/page/editor.tsx +++ b/app/web/src/base/page/editor.tsx @@ -1,4 +1,4 @@ -import { page } from "web-init"; +import { page } from "web-utils"; import { useLocal } from "web-utils"; import { Loading } from "../../utils/ui/loading"; import { Suspense, lazy, useEffect } from "react"; diff --git a/app/web/src/base/page/live.tsx b/app/web/src/base/page/live.tsx index 4da87496..f98d47d9 100644 --- a/app/web/src/base/page/live.tsx +++ b/app/web/src/base/page/live.tsx @@ -1,5 +1,5 @@ import { validate } from "uuid"; -import { page } from "web-init"; +import { page } from "web-utils"; import { Live } from "../../render/live/live"; import { defaultLoader } from "../../render/live/logic/default-loader"; diff --git a/app/web/src/base/pages.ts b/app/web/src/base/pages.ts new file mode 100644 index 00000000..e69de29b diff --git a/app/web/src/base/root.tsx b/app/web/src/base/root.tsx new file mode 100644 index 00000000..8aa6671d --- /dev/null +++ b/app/web/src/base/root.tsx @@ -0,0 +1,25 @@ +import { FC } from "react"; + +import { useState } from "react"; +import { GlobalContext } from "web-utils"; + +const w = window as unknown as { + prasiContext: any; + rootRender: any; +}; + +w.prasiContext = { + global: {}, + render() {}, +}; + +export const Root: FC<{}> = ({}) => { + const [_, render] = useState({}); + w.prasiContext.render = () => { + render({}); + }; + w.rootRender = w.prasiContext.render; + + const Provider = GlobalContext.Provider as FC<{ value: any; children: any }>; + return Hello mantapun alamuko; +}; diff --git a/app/web/src/index.tsx b/app/web/src/index.tsx index d03da4fe..5561ed89 100644 --- a/app/web/src/index.tsx +++ b/app/web/src/index.tsx @@ -1,4 +1,6 @@ +import { createRoot } from "react-dom/client"; import "./index.css"; +import { Root } from "./base/root"; const registerServiceWorker = async () => { if ("serviceWorker" in navigator) { @@ -17,3 +19,8 @@ const registerServiceWorker = async () => { }; registerServiceWorker(); + +const el = document.getElementById("root"); +if (el) { + createRoot(el).render(); +} diff --git a/app/web/src/render/editor/logic/global.ts b/app/web/src/render/editor/logic/global.ts index 048a9c86..34d80dec 100644 --- a/app/web/src/render/editor/logic/global.ts +++ b/app/web/src/render/editor/logic/global.ts @@ -1,5 +1,5 @@ import { FC, ReactElement, ReactNode } from "react"; -import { createRouter } from "web-init"; +import { createRouter } from "web-utils"; import { CompDoc } from "../../../base/global/content-editor"; import { IContent, MContent, MPage } from "../../../utils/types/general"; import { IItem, MItem } from "../../../utils/types/item"; diff --git a/app/web/src/render/editor/panel/side/ui/FileImageGallery.tsx b/app/web/src/render/editor/panel/side/ui/FileImageGallery.tsx index 70734149..6cd6e176 100644 --- a/app/web/src/render/editor/panel/side/ui/FileImageGallery.tsx +++ b/app/web/src/render/editor/panel/side/ui/FileImageGallery.tsx @@ -1,5 +1,5 @@ import { FC } from "react"; -import { fetchSendApi } from "web-init/src/web/iframe-cors"; +import { fetchSendApi } from "web-utils/src/web/iframe-cors"; import { useGlobal, useLocal } from "web-utils"; import { Gallery } from "./Gallery"; import { Loading } from "../../../../../utils/ui/loading"; diff --git a/app/web/src/render/editor/panel/side/ui/FilePicker.tsx b/app/web/src/render/editor/panel/side/ui/FilePicker.tsx index db41539c..95164901 100644 --- a/app/web/src/render/editor/panel/side/ui/FilePicker.tsx +++ b/app/web/src/render/editor/panel/side/ui/FilePicker.tsx @@ -1,5 +1,5 @@ import { FC, useTransition } from "react"; -import { fetchSendApi } from "web-init/src/web/iframe-cors"; +import { fetchSendApi } from "web-utils/src/web/iframe-cors"; import { useLocal } from "web-utils"; import { Button } from "./Button"; export const FilePicker: FC<{ diff --git a/app/web/src/render/editor/panel/side/ui/Gallery.tsx b/app/web/src/render/editor/panel/side/ui/Gallery.tsx index b9eb3a0d..c2d5085f 100644 --- a/app/web/src/render/editor/panel/side/ui/Gallery.tsx +++ b/app/web/src/render/editor/panel/side/ui/Gallery.tsx @@ -1,7 +1,7 @@ import { format } from "date-fns"; import get from "lodash.get"; import { FC, useTransition } from "react"; -import { fetchSendApi } from "web-init/src/web/iframe-cors"; +import { fetchSendApi } from "web-utils/src/web/iframe-cors"; import { useGlobal, useLocal } from "web-utils"; import { Loading } from "../../../../../utils/ui/loading"; import { EditorGlobal } from "../../../logic/global"; diff --git a/app/web/src/render/live/logic/global.ts b/app/web/src/render/live/logic/global.ts index cbf9bda1..e7109aef 100644 --- a/app/web/src/render/live/logic/global.ts +++ b/app/web/src/render/live/logic/global.ts @@ -1,5 +1,5 @@ import { FC } from "react"; -import { createRouter } from "web-init"; +import { createRouter } from "web-utils"; import { CompDoc } from "../../../base/global/content-editor"; import { IContent, MContent, MPage } from "../../../utils/types/general"; import { IItem, MItem } from "../../../utils/types/item"; diff --git a/app/web/src/render/live/logic/init.tsx b/app/web/src/render/live/logic/init.tsx index d86080a0..40ad5efb 100644 --- a/app/web/src/render/live/logic/init.tsx +++ b/app/web/src/render/live/logic/init.tsx @@ -1,5 +1,5 @@ import { validate } from "uuid"; -import { createRouter, type apiClient } from "web-init"; +import { createRouter, type apiClient } from "web-utils"; import { createAPI, createDB, diff --git a/app/web/src/render/site/site.tsx b/app/web/src/render/site/site.tsx index 02e97dc4..0bb328a3 100644 --- a/app/web/src/render/site/site.tsx +++ b/app/web/src/render/site/site.tsx @@ -1,8 +1,6 @@ import { FC, useState } from "react"; import { createRoot } from "react-dom/client"; -import { defineReact } from "web-init/src/web/define-react"; -import { defineWindow } from "web-init/src/web/define-window"; -import { GlobalContext } from "web-utils"; +import { GlobalContext, defineReact, defineWindow } from "web-utils"; import { SiteLoader } from "./site-loader"; const w = window as unknown as { @@ -22,15 +20,16 @@ const Root: FC<{ url: URL; Live: any }> = ({ url, Live }) => { }; w.rootRender = w.prasiContext.render; + const Provider = GlobalContext.Provider as FC<{ value: any; children: any }>; return ( - + - + ); }; diff --git a/app/web/src/utils/script/init-api.ts b/app/web/src/utils/script/init-api.ts index 83afa7be..c5ef4abe 100644 --- a/app/web/src/utils/script/init-api.ts +++ b/app/web/src/utils/script/init-api.ts @@ -1,7 +1,7 @@ import { createStore, get, set } from "idb-keyval"; import trim from "lodash.trim"; -import { apiClient, dbClient } from "web-init"; -import { createFrameCors } from "web-init/src/web/iframe-cors"; +import { apiClient, dbClient } from "web-utils"; +import { createFrameCors } from "web-utils/src/web/iframe-cors"; export const w = window as unknown as { prasiApi: Record; apiHeaders: any; diff --git a/app/web/tsconfig.json b/app/web/tsconfig.json index 05438c1e..f5832eec 100644 --- a/app/web/tsconfig.json +++ b/app/web/tsconfig.json @@ -20,12 +20,5 @@ "isolatedModules": true, // "noEmit": true, "jsx": "react-jsx", - "baseUrl": "./src", }, - "include": [ - "./src/**/*", - "./jsx-*.ts", - "pkgs/coditor", - "public/jsx-worker.js", - ] } \ No newline at end of file diff --git a/app/web/types/content.ts b/app/web/types/content.ts deleted file mode 100644 index 8de85480..00000000 --- a/app/web/types/content.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as PAGES from "../../../app/gen/web/page/web"; - -export const pages = PAGES; diff --git a/bun.lockb b/bun.lockb index 1efe59557909625e8cdc9f25116aa2d03c49766f..4fa6d14f01dd806818c3e7ea7787e389199bd934 100755 GIT binary patch delta 51626 zcmeFadz?+>|M$Q5Vl$hZaz2xUVTQrj!>|V-=R*-HG8kqihcSnuVn%YR6s>fT#E@c& z3<)_UDU?d3s8lLBluD&^{ykr7t<8KtpHJQQ{k`w+o&9-{J_5|c48eWK5olan?YxwG&0C^zHp;Zit! z4wr*(DD7sHb?aE%eZI5Uil?HE4aa0>rlc&fr~B*1edfi!PZ=tHjGma26NtZEL2)tu{KrS9%=0<6?cV3k%I z)|gg=m0JK-^?oYp@>y8=F<9x|f|cJMSm~dGDJM5?6#;6V_b99iJP0e{ELa6h_4Mp4 zrUU&jw6@#7qeqTSnSebyIXfk0%!I5A{8aJR>bl)x;Of}DVOpN|IIXMcWxYWZIKikl)*n_Yt zF#0ODCrS`sBNrjJk=p~KQ$|kAnJ_9P6){x9^>iXw-d<(3K42E-6!*$Kvj9PgWDeD#dLkXYna^ka-M~+M$IWFbv7}q`m ztED?*-He0H-Sj8%S4BUBOT$??qcT}XzIt(PPh_NJGFVx@@wd}OyuOR0|K*sSnld46 z%oN{A9A%e-)v~eUCOSJqk5+C$6X_i#ye%_1BV&rs*AZPUPHOE=s+F*MVj--Sr%gyr z$xO@6N}DidT-w;w?0Ec@e`M`mXhHw0s~>3Nj&U|z6ZYZaeDJX;@>> zeW1%fQ;-rI!Bz#*vnEc6r@&r=+^!14s>mt)D!{#ArO&zE)qnB$OITgAi=%|f%Ssu4 zYf2_-aKI2ZqbbSb#-(Lt`^IOD%}5?~OQto{ZTb8ge7k*_K?dSZ6U1cqVMxQP?AgZwnutw5ifSx(x6S*6M2l1Ha>L{Nfeux495 zST)soAZ9X^Om@5UV=_=r%!SLtU!tpr-l2tBcZ=A!YQP7u)#Zt70&4j?EP8D)n_(@B zMR0Ci0+R`-#)IMda9fxQOkNFG@jh4?o**M-@ETklUJuuTABGh_2Ugd=Ma9&R9aKO( zZv1FxD}6HEZJ6!x)O7aXDmbKh!a!JapaZOyG>4U8eUBqu>rI}E1!g2?j!GHl^Nmf( z=9re5J!*oRzB{Z6w}#cD`4iotUQ^uN$@XU^xsG8Lt-6SXsrlt=?%CzD-7Zg=kj>If z$@is=S8S>en(} zd{*YDtQ2bS<0LnqLsQ%d@zd>Y`VV39%gx(GKqI;g) z1FM6&!|I?GunH&-tD}FK?Z$rytAk#FmHru6ehXn$e5z-UnmBG^CaWnOTm97EiSNR; zNI*4xc!Ap!4Y8F`8CV&8PfeB4n_i1wfXib)3u}*fY?hr~woY!dg|1o8Xn(rmyQt|C(J|%|5dInqdOXJfOA11~h!`6&`16BuSWu<0l z*KfGkEw2{Lb*n*M%BWGSppg^Gdl3q&Kvrf(GKY^@i|pufSLLQGam#xKR`n;sx>`i^ z7rpYnf7JC$PG?E+%E?S4d!O&FrS3dRh1D%v@z-^8DXez=_?TPImiOUSIgS>_&PV+zTOZ<&fk%9cI4cgok9cHARDcBdvq48 zj;R2v;pb<%`DEm9gc_BVoAs|5MGov2GfW$w#WllshJ?!KvW;#A7F-JZQCOQ|N@nK7 z%$StP*FEcv1iCXqe{lk8ut`17hrGW!3LPgSb+onF-E7jcVw@8yM=xiTe%#;={lG0Q zUjwTLKZP{_SsCsC4)?e_tR9GiwQFuJfj?6%?`Z;R*|0=BfpM!HX#qtS==X()TU?m(2E5iY> zD$)T~fem5pdKTOOew7PpJ=i@)Fo`qMvY2tciZ8kq-?Q6Y?yq4hU){T)Exw!yw_lT% zk&%))qJ z?j>Oj!}f!&TSm@!M%3rK=5@C+H<4Ve%*q&-mfez*@BzC<Rs z3+zQz>TP_XN=N_3sA?_zc53w(qVjh>{br|+Qy$#dxJJif8#8MERz46lHe}sn z+3C&0!51u_uahIj#e}S~#q5IEu+^iOeI_>Szt3*cJjs8`Uei3uiY{)SX&&}Zu$#2V zjk=tMwIh+K-@r2EZW5Q||J+XF{VID+TvBi>O>Ti_&@OBd@*BHJ z%Ow91JFR7sRjIUH&@${FWuHb`YBy<>6!jDR(q7s6SCZ`~cL(h?t&-%?Dk->{KJHAM z-;Qe)@}IHOS|?cz%Gd?1!~PrX)2);I57|xPll-6AY4J%>wOIuT7c-)M!9ku<%#Pch zU^i)#6g+{_1s}^k*D@5!Gb36O$NhODGY&y!s*dHP$f4YtrC^DE5l$9iuQdO~Oh3Lv~s?DVS8v?Ipi`j+iO->2OkD8(LU- zSwB~^)04u%P<1kQGiwB01kc$W5`D zP=6=(0-;oe8fRX~{Qzq1_xXIqz;K|~2y|VjI<#9h;rGj?wX*v+t7h%F(vI#K4wi2i z*%xSOaDZnyyE!I5U76@s=YQQ(Yo_0JGxicdj2Xqy;nG}x{=yC zK0Yz{9U)B_CI+)Hy0OnU7|UG})BlTg1gkS~CG1H_A!~LM`%Le!^=T73x=%P*KiVBD z=Je=L@D?nMlHX=TgHK{5VwKjU41S8G(JG-uXVq$Ir}qt8%bVH-(8mr1>ooKEdf-yZ zE^HnOjK#XfUfVY@u!~S9g@U>Z(i4x8_M~>9U{9>RSjFr@w#!8^c6$GCP&ZE0E;b3o zgjo9w;%$i6AX-{_*6Xo$`hak-MsuI91ERAug5$7Mceaz*P+$WVOC%xD+TFrVzcy^O zjrh}S7J0Qyw6?Xh zqX&kA0WRd)hfCV$`iFu;v9$Q;v=*U2zTz}+!9#>vJ34g^1_-MA$TBWu^=)kz3<^iB zMO2+HZvDa2C|Z%u&K!)1cl*M!Cv^!0Qe@fVn;}7(hBz5lbVOD-$Hi5kZ@Ewy+7t+<|D2T z7Ds4r$Mj0HE^BM24-E$fuy@AVbJKGZVX$$x3|v_*MkOX_WA5d144njv4+@ZZ%hn) zcrnyENvl)Z-Gqiap-%~2?}QRMMnd-!8tBFny4DG`?xejyY4Zp@&l|!P2Z1 zui)mPU^gsH5x2uKvHClft~@VdxyvQ)#!&DNEX|7I&gCJNHSKnZ_V-LIrm)6`dA}S> z>7tw~-w7Tl^PTni;Gd>QRr;R>@9>2h*^qv^;6eQ&>3Xm6K;wS(ckKHJ#&w zuKGPu+toF{<_#h$GhArg! zgeVMU;H+gUx|f}v8V(NU$}Nw8Gw~noWuHk6TVMCGqtn8H`n}238G*rs)FW&U!$ZN< zSj-=l&BpXoZ#z0Y9PH4?9TvKfMSdrihMD!$E)*!hqC(-s;1`6nr!k2Jgo4eO^0F9` zYZIb8gD86SQ7pCH9j$X%)LvFhD3I9CS^n)3gIR=P(cObcJ{EIW79;T~)(|YFM3+!- z5<{e(r9$zcz*?+CJEmu1u=jw-k%xsJG*~K?{_md=9mnSR1y&cQ_j_FDCUNF%U^W(~ww{TB7YOxoLZt_?aXX>wFNSPFU7fmpONfT6 z18A?v^pJ3Tub=r+_jhO|lyY`?+ho1nQH zh`uorT0|(*(MsJE(IykhaI{l|vhA}u?V~uWrcw^W)hiT;9?9xFL@W1uG>-=DrRN*J9CD@+|Dkl*Q`gjKc4PnDFXi)>e;^K3_ja-#~}~qEvN# ziBUdZyuEfu`zQihP|gQ{;5Vb)Q@Cq&P4W5YFE=i*42u)j)b>#Xs2FnLfrKcoIOOc5 z--Shgc`0g+Rf_ReuVlu+R}^KNkUvq@M|^Bxg-&qL5TGbP7J)_ zhEfxQrN>8xUNbuj%k46q4+^og205fLO)=t~?!JA(#ns3bumQ^%hJb$}JHIoLhY;%F zgbE0?v(GXqKPS}3K0B{{@ytkqK3QDq?eRz3M-kA>rrQrE__OTvyTien*=|+bk77fy z+=->D@`7wTdS*DdAF(~jxN>kL3gkGgqfI>s$=TVXtm!#+^ehgmId=N2aKL}7&o^FG zv+lUnK7+6W!L9#gxA9d8r`9Qi+?H%7G{DiyOjiBZ-q+qg*-oDm4isQt=fwO@$ngpG zo#IYvXP*k(h2`XI9h+ho%nb+1-Jt^3&P@!Y61v$5y+UY|6Nvx(3!J0`Pz@mwVx|3LdF0@}OSL`H@JuVXoTTA*T{ z*T`TxA$C~xS8_se40lT`F+DPh{Vs+U5xPdL4t`81fkb6=wzcZrWk){{4%~QGB=Hl3 z+$r!)M6=q>&?k?;>=``9%ZYI>4Jotdkh2cx-SnlP!=G|`o&UGs|3`;}J`7so- z7T;|bEC>hR@t0FS zt@aMAA&#e(%6k**Qt8q2`2Nntxcjj#)$~CIxi^N=;c@%H@8Y3Vrfrwt=I>P zWF4G^bt#umu?AlBY-770XWVqtusRaw+;R%;#Bx0+rG~7U57`Av!q%{d>@!Qk!Ojca z8O3#$V@M{J(s2>zShK;i*pWHPeuw2w6dfd^AC8=v&dmx1hhQ~x>Y|g<-B_GTwOF{= z9KdRCpPiLxl`wYnV`1xRW2ZkB4&H9u9^$~5kPwBT%qh5eD9X3Uod@m*r4jE3qYyM{ z+(X>4MRvima4>H1#gpBD1n#~>FAoQwM!T3#@N>_@xf}mogO76t*87tnc2ipJ!2Ss+%p9rbjaN?Q}deqI* zr!EcTV9|U&o)!|)?B;IM@KDt6(p7NeZkyG1sU7`zIQa0=$PUS91rK2L$Bjy3)p#s& zg{5bMw_>#;j`2wd1=nM#*PXinQN@?JJ$A8O!R{z-*Jz~kuv8gmw+Ot5WL)h zZotuey8yA=3ZL^as;uTpu*ypJ_~LFABeA?$MR`lGRAaYTx$6`(jQ) z6oyxo#}fRH+h@Xj)J1crq%(O}UF<5VemhnNvZ7u$go1mpdOF2ue=74tWMm6(NQlDF zTycguDj!R$%I)FhcLpQTRDNJ6*y>5QVJxgcq2L%Sb-r`G4LpW5(2g0I7_727au;F} z%@~fQ!KMHjybepv$6^`1kHrwhCt79K*ahoYxog~=!l{k5YmFWK4EGBP?DS{2@lxPs z%f#n?$u2B)2n}TAeuJf+V|wyIv*}Zjky3NVVrhiAqHu38AFGWW!zZEQPe;zx+RfT| z7L8$F$iPy5&Lt-JG?tr##^nnvmF(0bP-QKh;M^VSyVfq)5RS@2P={Weq}I;0cJxN> zCarVxWv7CL|&|RTT?mj@p=#o3I)C6~Z zZN%!2#foAX6noCiteA6WvJ;lK+7^X^Gq6+@=cHlndd@D`77kpwng9K_*KSJ;E+(Wl zF$E?iL}9p7U5zif#a%$;%G?{_S#ATDV_jO&Ut+17s2kJ0;a2aM6wFWvo%SRr__sRe zqp0U2=f=U$+XXwrK^q~26Bj)8mIKe*(YwOI%eT27uBdgdP}Cr-KDb<*Y{3;M9Z@cK z?qq+u&5nK{9BjDVy*1!;ku`d|UGM@Yn=ft3 z4+ZP&bZ>cb;9eK9Qg+(uFLL`Av6sDecVh5+g(wo|ULh;I%Z}a?_D{Fh>`n^2xl6}R zIaPk)Vvc;)9Ers-5&bDb1DwQ~j=y1z!D8?e6a2gFGcQdGe!Sbgb}(fa`zu~_N7S`O zV0qK2Q>aFnJwD$QQU`o|#R2$%UZ1^acYb+{_1Yf0;N@^|^h=TL@7&IWC=9JGK7wor z1uxqhxg<|w{`beyOmyzd1n*1H}GyB5U z;g{{`{bB2}SM2ot;oxOJuJx@;6%(dTT*=t88TJihsf>*=A?EP+1caK?(rHei{)H#(N!%D&`rClYM zf51J&xS!^~!BQ79*~6iz(5r4My>_n-Mj`Yhn(H;UUUp-3vtv3X2CBYBS2}m9Z+y*; zex2EjpsKrz<`vIk|D(5xA9Ney{s%%kEG-(Qcv2{sjn&;rr&e8}zjOBGBWBC=9N@tF;r`CHTQfW5EKsr`}eU>xN3PNrjHU95nse9ctm%Vv$ zAMP3oT#MD$xyQ7ekZS7;qxJrqcEMX=tI8q!3^d@79sPDV_`@N$Vq7se@3eW#?Lz0j z7p+_0vd`eM4{@MVmhP3+dOI>JRojtRnt5C}xPorL(yVm*@ms7Gjz#ZS_1>|g~i+8yq#SgNfvO|5fB>@!Ehfw-gWnYznmr5?4@-@i7u1na*HC?g-9tWy8$4=)} zl%*GV`oFPP{$D%%Rl@&AdhWl~=s#qvIk4W-{}Zdn3PD-03#i2}0=@nd%YP4mbA2zl z0Uy^eCn1*#XY3AmHhZkEIAGgy;@^Rl!C{YC;m)flE1nhXr2D{)_K7uA$2?mc)cAiv zKs7$?MTq72B~V6R0Zpp&p8X@NmsoxmWbhKJqQ3#9`yHs~ieV`K5)wU@9mLiRGG7@2 z%BY;@P?WWNDtUTQRt8nQbk$+G)bRYoRj^yYCE<{#7iFbyhn}mrMBc>h_4Y5U7IgM> zv4U57wphU~yr}`*JpDhh;=6nCML6B*nqFQ8eLRQ%#Hw+BFTN;C8sO<-6?C0v7iG(i z`J`&D2IwYYwd;1TU>Vg=`TJlErUB=RcClJ0HhMcnH--Un-nFYt7+f)Da$*=LVe%~f&6Qx_?U z*WYmz@yk6wv4Z&?ukduS@_pR1i?XKKlb#Oe`jp`_UV=hcaT`1bv4R^te%8~)3U2c3 zqAck--c*4tUc6ZL^ROzg!_#;888C%+dV*NNT^_#xYl*)i(PP=KW9uMr((^mz@oCRb ztl$~mPPYcs#ZyaSp7EZ}sBEvTuWx&mEpFR*z3pyf!SYK?!$x4q^rG=1m#QgcUzW zqQ}zbVrz)z!>Yg{ST2w7b{YJH43Aaur?54&&w9EzR~c+0Pzv7bMf|^DRp=o3sp4VbE>{Kc}5Sge0(@AD@9kTm#|)9wd`Au&%>ImzrsrYC#(jR zP%S)G{w1-A@&${j|DC`kR)%G9P)3zt+0|i9zAIt=`5N(72kz?G-ConDD&bI%Z}fN=%s<}<&mQUVXphIh%3!Q#r@_VTvnSmva1NGUVpack zSl)NQikjx}bWgv_;~5^`?ZwZAmHs}@e!z>L4{IhZhAY8qVZC7Y1IIc9HEX>W@xQ~W zV4>&#cPy7@c~b>;z)H8%OSe-4s)AqegrY3R-JUL%{i4TvU=7qOF#mi9^!C4CmGheC zCsz75HA9r~AupmROL|A~_W09{>^o0a%ax*^f6%KaE9>_?y(rf}|H0G6D(Spuixs@! z*X&M7zt zMOB{+tEsnpo_D}{iKS2VY_ZM@_rkh*F7$MCUors^0XeV=%-f5)o+XI`$Kd;VgTa>BEVvh*)J{fpxEBky1F&s|Qsgx4&f-ki%m z>U7^dQhA9L@ppGO<)?Vfs(W_c!a{hCd^9r38c>N#pKX*C*xy$*_UCw{*a`LG}SCYTGyQ$qp z@%jMs&s|RUZm0U}pSzqz?}BP}{BxJHn|I%&=-o{^#wS~I=AXNq|J>zt?t=bvms88) z|Nbs#in95;yPJ`C?N9&hyPTWbmhiVO*73d}KLtvzntZ0^*B{?j@%^Jm-`m;ag)Iv$ zt9evj=aKi#ICT5EyJn?6J9~M(Bhg(~^?34=_i`KDo_OYu(Z_bCeOo3fI^V1f`m33P zrTo48rA>0sKiH&}@|Q7tg9v3zg;EIBN)yVFM>$iyG{Qa!Q%fUMF#9D;zRZ7_sTHs~ znWZKDrTrDnl*>>Xm%;7WWw=!~P0An~kua|eLRE8A!kn@Q9m*n9H*?D(B$PuqE1{-o zTMprrgr(&WYMav%7L`ZnQy!tNSzI2Wdj*8wCDb=PDj-~tu(kq11M{D**fDD^@k+$u-oHp(PNBdl(WuvbEgsn8T*NE6a!H}&`S zk2Sj`L`CD#uo)g{W>PbREfNk(xW&|uK}c zGI7ljCdVKwY>tp+j!S49i_o=&zgM5g7kD+@i=Sw+GQMe_)6cH!-uLi-zw5j? z7|T3eO1}Qv%;^>sG^aTQ^@&56Viw0CB(y;IUBVrvM@xiL64tgvm}-8OuqX~;SSy5F zv!)e7_m&7{S|dz1Lt7(Ukg!9-3=@n;SltR?d_2NTvsJ>7)(ExRAj~#tZ4jd35e`b2 zYpRD3wn&&7Lb%uLmyp^9AtnJ~o|%$>P%VUTOu_@ENn3<{66UokR*iKoe-Wh zX`K+FIwBmDu*OvHjIc$*)XoS`nf(${J0Zkejj+~Cxf-EbXM|%Co-s|jAncPcuM0w< zIVxfD)d(HBB5X8syCO91f^b&CCeyYX!Vw9>1|n=WrzOnkiqPj8gso=rH3$ja5Pp}i z&GhK*AMD?5@r66W-m2lX!9e{8|!qNc<@0rsQ=JZGCb1lMAv-nzsgaHV@OZdR_ zxDMfzgtgZp95X*lSadDICiUIN#y<$5`*jE@gAk6JLJ1cnRK6bJGn0Hh!s>wtdnKGO z6$T>=8HA8C7~!PZEg|Z9goZ;9PMb+X5VlA-Ea6L2e<(ugV1$`N5zd-J5~>YBh`#~h z8#Da|gnbfDNH}NWZbXoT zA^dF4Nl3T}VbE}YFY8yISuxyyy*VW%a5Kv9K6CBOD2s-nY?AV)&sZZ+x(`Q589_FF zQ#gWbE=Z`Hj8M!ZCnK!B8DX!4fT=JNVaN!CoRJ76&29-%$p{TcAq35&Q3zWk9F|bp z)E|wIIuc>#XoNE6kc4WZ2*sx$lrz&)5cWwpA)$ha8-p-;G{V9$2o=q735`?yWlguS z%-_mp!B~VNDR`V8i$_({DHUPP7=%@+2-VFw2?=8n2Bjg?H2G-=rz8Z@5o((O=}h4| zW{s$>@!tZ~Gebr7O`+%t6C4LMFv+4T%~nxEQ(-)Gl}QsdGP^~MP4x*-6Eg`iTgFky z;RzJd)YPAdkUAb==0t=Tb4Wt92?+5S2+hs(41|3WPDqF|agz`xPefQa389raE}?M- zLf1@$c(Wjr!rGYAqLAs71tplpqPFIosGaGN4JDd8EMP1BRQCCx8GStnaiLNobMcqyHDNqkHNz~Kq7xgmrZ-;uDDWX2+ zkf^U|atGAUOc(VxM@0in+?{IW?P}$nH0nBYTteeJ)XJ#{gUo`d2uCEGmoV6Ln#S9l zI}uh*Ll|n#Nl2KAFen${Mw6e5a7scT4`G-YkcY5n8p0+C96hEZbk9XdnU0Wb3ME{S zQ28!|Q6~8=gw=TndnKfp3NsLfOh?F>fiTwWmJoFpLc_Ze(#)j05w=J;Ea4VYep>$nJdaN$3@wu?Hnk_ED+slPK$0c zo#v8s&TNvdnoH6t<{X0mcGKe?=nj)Fy3_nDnra5z3r#a?M7hR)A4$94L(-J{NIKmV zO1L1Q@;rnYCV3vh>U$CPN|bEiK7^e65oVj+5~AiIG<*PIu9@@z!WIdKCERQ3 z&qqkTA7SQvgn8zWglZ2U#4kX2z)W9&uusAX2@6czg9wx7BP@In!8XSwG+uzv)kauo z7T5?!B%GIEOs9ts<~)e7>LG;1=A48C8)48wge4|_A;KvMfrk;6ngI_ZEP4oGlZ0i) zZxFgKL`X3R`KD091qqcGA*?jXix5^njIdY2DpO%G!VrUyvl!t?vs*&cB7}yIAgnQy z9zob5;jo0KO#LMYsf!V2EoP>nO5C$zr*k= z2IM0wT86Mm!Y<=qfzW+9Ldpt+-KJ2&1qqc`BJ45AD-l-bBkYy1*Hm~MVaN)EoW~Jf zF}o#1twd{wS!k4CgAwudi2r~;2&YD9Ks;x(e z-+=IqnZ5yGpM(<<&Y8H42$KsD7H&lN-W-?EcmqP$XA#bu1$tSS%(I{xpuP-4VzFlN%_-ntSve;Jcp99g>3w$ za0}U7kWhImLNSxP6=C&eguN01ro!_GL$)B~JdaS)?3NI<6`|oagrJ$U4PlFf!xBoH z`r8pwpGTOv9ifalB%#_iLh(Bg%9-gq5cWwpA)$ha+lerFJHo=92o=q735|Ckblrte z*(}(Fa74m+2~|y}7ZB#`L|F9#LUnUaLc%VDLAw!Zn*7}erz8YkM5t{Byoj*q1%yo! z>KgwZgzmc$QuZL!H-!=|NT~c0LIach62j^i5%x-GXe#VQ7_tW;XD>n{vs*&cO9%~L zMrdLty^OF$!eI$bP5oC8QuiXvd<7xK9FkD&WrX;B2+hs(eF*y`oRAP_;`SpLeuP!8BD6K^;gp2H zL4*!wz(IsXuOe)ckYxO?BXoZaA?0<1PNq=81qqekK)Bi@zk#s&Ai`b=T}_2I5r({u zkn<+OHDk2xfv+98Daw-Nf8>2D+K zlW;=902B8P!sNFQ7QTaUojER{@!JSp4GI1XxOg@IN@MDB5b6i5>j}W?kf{>Nvs_b526SCkTT+MYzM{e~NHQLf|umsb;`u2#by*Y?6>`{GTIq z{}dtRbA;)pP{IWXl}{kdFv%wnR)2=DSHetF;R}QzpCjaafiTVJ=rdJbXc_XumvAqmyKLx}$Y;Tbdi2ZVhRPDm&; zapw^xe~+;6Ji^A!$Itse_S-F*RWdL9=zZrMD-R7^0TOauYA70IObydJNr+`wCzijq? zkIn0%tjDY}kw4KCe;rS+D5E=^{3Cz8Yjtxk|CN%>eV18Lf$~GVmL@r_mk)LSrcMl8 z-N`{6Qrx7LvHDku{1L5D*UMO#M51b$G z^~!C)`^euOdFvUk_Rg4?JL^;X z0X#fjZZp|D>Gg>B*F5gsygA&!`qT;>+Razl<JYC+&}(wU%C~XN0k2G(fhi#W9xrHl;R#woZ}# zXnJ-+J!Cvh&+jky{Pf(U>cxKL8{}z=J&n!ES5;%hOV3rxPY?c9LsL)YEFxyJ-;|l zQ_FXGT1&!H2&<7Vcv@~NjL1`3yFIZrnrf|@zUXQ3gg^8O-h;+J{TPq$DNoZgx2j+W z+(B5CdfC$wJWZ8)#nallTCRRn$G6WDxiVgSBy7K@C8BkvGOFkSH2&!)o_syg+0L|BQXz3pk83G3S#DojrS ztHoD)T1WV>r#04u;+40zM*`rA>jfrH?6@CJAj90G3vJ-GEG zSPj+y?fFlEr@=E|eQ}J43YkerIFX#vQ18w=&0&VjH!60xw z7;KprcUaw8rW3ve=$8%N0B?dr;4Sbrcn2H??}GQh5x;4-(~8YKLHG-hNtxQ0w25ld zOeC)kAPIB?oxmXct_Oob4Nw#4%26BC0lH$;1NFfbpaHlNGz3?HCLkI#1^T6n7(YMy z6-z*um2#jwr~r;pfseq);1h5hdO>g0cRrL2Cxx43pRo0z-F+;^w?$9%+;0Y zDXD-5F}8tngnxx!)^8K=3mv`!px>?d4tx)O0Q%jF-Z(x3uLq03 zVz2}}29^Q+_Q*W&0MHMW%mUNFG%ytCDmVc20ewL~&;qmqtwDS)Z*4#&@D*Km7JLo9 z0pEh}z!%^HPys9j%RnBO4(ezXYn&NC29l`IxyWl;bpDK6+ECG*#rQk8J3@iuvU?G$K^$la@=3G=+yTyD>v`fwKt9j`?JnRa4+|6nMZ=d9 zR~d{VT@tvHJnE6I8Mq3}&n1D5g*x#WP#Wk|SMp!NlgUJJBhW4fB=O0EdOBMi-vfEYY89;uOnIOW3_8CQ4eR2nMLdjjWBlgzS1kUB zF=1W&bqLU5K!*Yy4zz{$0?Mx^+yit6*MM%IE9e5WO>0BY^-&i(UGUUzy0~S7ETG+0 z7rBuj8H@nKz)cLt&HJnr=cG)Nodate+yc}FHGw`uI3KHEwYe&&1S)#0>88_#v|2#N z_*kIhc>_=v)B*Lt6`(%2(qkRh`FIfR(}xay7`X~a)Q1aw=#VasgqxZ1`>ndQu@ zozofwys-2(X48JFL9VLO1zZhEfNr1-Xb)}%T|rAQ94NW;3@`@h>^TAGEUGi)8x9lJCkx?jFat~ncY!>h-k1g=1(A&tFFoR$M_9Hn2h0Yu zz)YaLq|YjvFcPVVxrzjGmL1^-2;UFpfk@%=i-Z?=@$%6%@Hg-yI1hdRXTWK25_|!2 z-{b8Q@Gt`Xu!i@A$SCI1B<|7&wc`41s(^> z!DC=4Sf-_xPhcfj0ThAgdm0pgHQ*^PydHiAtOJGMS+EhPVyf_Fpvr6As8R2Nt>8Ix z{57kAsdUh)R7Ur?o<|D-%QQU5{NF`zC)feDgKc0qI1D01A0@0Jj)4z=`a$-G;8SoM zdnG1b(3S;;;pZfdJ55>L};O;|M6>WuPpOa|O6OC(#Em6Wqts@yI^X4E1Gy?hz z)eu|>RJoc!6|M$X2Q`2`k2L`L{8b;+19gEupXqa2Goa63(IB@mZ%u%vjtYnck>1cn zKhj!tYb#K+Vk$J!x`>||5NWyMWk=G)6IO$iCJHdT#h4W4-8ZZ{xrqomOzH%i079S* zQ0vrPs(>=?3Y39bu2XPd&%!E52jBvWswG7(!GX_@@52UlC}kI!|2I|3W+L2wV43v_&*4ekarz+GTE7^sPu zM?mvIpRVo%I^Nt4CW7%`97qRgAQg-SW58%I1Vmb=imBUG*^%&#K%dq$95(=cw1_6| zW>_CD^f6B-FU7_L2CRgjLWiSbh;* zn$kwnMOrNVUo~A3{-pei5vtw2pgEdW!2-hfgLy#v#C@JUAASHdLW=>B33V0WNFl0l zWH=*3_Yhj7f+|Nh-G-^Qx&x;R%aw2gpfRhBtq;#z2rmS>wml5XZ?hO|0?&fSz(%kE z6oO~KI`KT)Li{u06IuS(#CzD8qf5rdFKa%;sR_bXAEn0Y_lJa{@Q%spfGF>AwPJz)7%GTg(^W1o#|$3_b&&f{(xv z@CtYt>;*4@7r}1u0@wv&!FI3>Jnz{%;T>QPcmuoz_JKp5{U-c6$bF5sgWv#o73}xI z(iEq}LL~ei;djB?o_-j92fPoCg0|`b_(SjkP$iB7HB1%%1n8J{8a|~<%$Ecn0Qw}X zyG6Qlq))_^Kt)gi{7ifaH~@-+V!#4h(fk5xc?S61|RtlMReQT|ep53ay|1J>lK2kHYAsw22g$GUId5JV){$${|oTnh4QWB%h}sEqDg# zGuz}t1bDsE-<18px@vR62Uc-^^|2Etj!enKyJgFay6ZY8TK?fJW8-4uTA5>?TQ$w~ zA6n1V;+r?wQ!-L~ZGX(Ztn?InL3#i1Rk_YBR;aK#dpA?5+2WA{>4Xk_Iqh;lz({Z*!Wo5IDnWc#9aCLwLjg^ z_O;8Mm==l|Yu1u^%_%rk#i3M#`$R7T%;b$D&$N2g1_u{hU>;m>EXDVH$Q zKBoS)N;o(7@){giSG7;U{LN8*ull}NFXrPrr;U2OLhBeOt<$oO=2eRI4>Tt}wwiVr z9+wc?lCFD?UMWv4=4^Z7t!lR&YKFfTGm4zb5wri38Y6t4e))YQrll{_^!bDq&cUGq z4ySXY?Sa)F`Be_Ftz%m=0nKzA{7;)DqRnR0Ck*LJ=CtTTQ~NlHPm;I{iOXHx?Spb1 z&L%KvLa{BG6TTnJ0356mCC#|wRyC_$Ni*xX)iS;{yPXDR*ut*w#SQu3Q+JkW^hXh+ ztiG(eW_I-j&qZ1Oo+#B(GR)cIRv*4VnD{C6m}MqH@edMNipclhEqnWl>tDW;jM~r@ zah#us2@;H9J$qs;xES=DOR#zU)M_oj|5*7Q5@ljEVG^ffWN$(*NnK2RmP<5wEL*@46w z?aHk!WjS+%X8Nu( z1T)}s^9)wa?@6U`IP!3(nmX|-F zhnhocbFiYoo66@t`O!yTj&SPNB9@vv^X2C7BplS@dhEUG;wpb!(RJ4|Z{Lq2i$9LB z%&X(vbrRjbvzuDiFKZScuWrJkH$`BKV} zbNtMA|B9ZC5w{5L5g z^^c^8l=ZLnU-?CJuie&PrHjNz^7q;jX_Mt%v#VJTHZ-5m_Nvb|ba#^coln2n>Eo0K z%ln^{V)9R0m51ym$hhbI`*e@QjK0dp^>1o!e)m#LZX@%@cUE+p`FLmvZDOy|#O=^>U)=#i+AlBff7FZl_g2ksWQKol z4UDX=*S@z}*Q(LPty9(DTJym49~-ivQUPt+jhmQSKhTaiJhU6G7+E!xIJ~7UZ|Z{t zPWVkse>|)%P0WPzR!eJ86Z6;)R`iv(kfIhT{=Ei~n75jkuaq*bi7BC!|Ld~cGJ0Es zo0{$Csnsn_-L0zAi#Z*8jUG8wwQ?(-*VKHAhc&;cdErN^a)7qD#l)CpKUx9HjjtSN z6Wi*qbT?_sTI-s*L%89lcfNi6=m1uQsuVdU3($SLhP7af>y(GDh579Q{Z*=kY4I~< zRBT~-{)}Fy#lx}1s#%R%m=Tx5aV^YiMAuB>5~K_5J(=k{hV?xCGDYcZi|Sm1TGi@F zP&2Z{#5Wc%s5&)X4P+a}V@M0r_ZMnA5)XFkyna9L*|fd*$Vc#K?MzW$j+b`mQw`3P znR)AWV%*8=o6*9|PbgN+Jo}5)y5T5l!~3S#uU0FoT%6h2 z6Yu`NG9Bx2Y1Z-g%z#mM^uM?9G{-wGmiq}OP^h!y&|O~# z9{uQSV+!O0f=;vxiBaDS9`H_|Vc+dP?!-8qx3aal?02hot((~gbdWy&$H8@tTbEhn zc~F(?HfFoUKs?aK-2Xeh_!FM$gb_VPmA+!`p!e}?<#aQi&VLf;{ahjCmOok_TRRVNLofhVoKddpehO~Egz3LrGS#3&AQ3tY`H7Ro1n>+uc#F==Mr^IOwY<#V5 z*&0_|Dsf?ZvmOs?ReN*bPr7nbd-I2QSNnx6i?ytEkc6sgTCZCwH-B($o|BO7oS7#&Q1JlZ7Vq4~0=?ZS*}tADqwIOoAuv29sQImD>TkDi%h z8a%lA;H8-RI+(|l_HjIP79Vuk>6s}*Z@=b}#||&1c8z7HpW0Th&ZU@lJD9Ijv+wb! zLfS^BUp+XZVxN01c?83z9z$QNLD>19|Ga0H?0WCRFIGNs$)iKq477^1Z1Vs^ukxpy z+jQiEr0vXgEexi*?>|l#=eQD?ST}Vu?~+HYZ@aneUp04mgXq31_`~SV@?UhkHP5ASfv1YQRE_B27d=M8t-G2vSAG0-_S7S`wm&z6e%C1x5uCuf1}us4*76 z1h9c2!6+JHj}@b@u?64Xp5jp?`QGPyzUT9wlRfj>nc3Ny+1cI04e4pYLW741A)pmv zA8@|OPPY7EPr(ob3Y*AoHXd(ZjyC)Q6x8R;iM%~&j24F!zJif7et2zCd~HgGLem*Y*93)dL4kl~#crPi`mo9wHnc$Zem<91i z-3F~WlYbaSL(Rm2D_)GF6jlF%T!UFFl`5#ZkNBX3<15O;7;@4m*ZwWK~ z8BDd_SY_Jkat;bEguHd(nW9ZeuM2GF7eW_w5yOg6LWJ0#9eH{F;HjZn?;|vQ6e;y! zt-V0t$|?E4w^M2leY^39mZliO8rMdVFA$E+LveTugoRzk;_np!NixC_6l+ix9yqgO z#QcZ-WJ*LR<*~jQVqX)r;hvKH^$TQ#`8XledaepjJiR_2MOGWUVJ>Yojvg}2+{AXF z@tK;6iuzk(;Mn!VUxkr*E6!eAha9Cp9E(|Vu~pI{Z_?L1g03uuG@Bq4DHd04!afhP zxC<6yl960Nnz9EI$gLfRiVjEgV!%kVD9zrQiR7yPvA29UJG5D!GyR`^rXhD}?mzZD zVHPEt6bZoa68nbJbru1lUx-2#LL3^?pw{pJv0igr6fUF?<9qeiUMps@I!(-`*`S!h zNcat|8%gS_GA*P*e#ft&4yV1S^&HOuVFHACNga3DZm^$>xDARKDA{|n&d+*KnIcm( zBIqspDorE!ugj8ub@p)#csejfMmR-~Z5wb82Eqb7Yyz%1RbF);AS1p4#T=AT`|mFv z*XrAaGG$E!C9%GRK(q(q=D_sDXD$rSk`Yy)FwF*AX;|j}^2>OcA|;)M^D0`EHv4g{ zo7tmWK@FfG#6CqDa;C~gOo($Hmd6l8xrP|5MU-IVx@|Akmlm(6f|1#wAQm&5D5?O$ zu^$kuWaw0pq}KNO%95!iND2UjReFmT8fwL=?^(-~sZrFy2z}=Q!3u)-^m|8c{Hxkr zMyv*fl_&$k3MX{dTz^WYY>T34=xZkZ&E}L>bCR|C9~uhH*kT9GcF+bRWVeRL%WN?e zj+Z4*l|rPU-NbCBbchy|u-Nu2F6HslXEFzmXo^LKR)zz?2Jf)LIOE0a(fehDWc%Z7 z5j$6?x-BX+DLYEuE`+ABl;A$0OZWy+LX4+kV+`pV!-jUTf(p}4U5tF_vS^O1f(Izf zx>J%K4>C4dc2%Z?#ZnmSn*aoxA#+`a%==xf9?FPCps*17w~inA^e%WJQ&h3E8-0~W zMeetY5>8L?Ip8iMF2+(V<9-VWHiupvH$Hmt`xtE*@luo<-ooY3mlKNqdIMU zbdBU58KAJ5)NE^e(`#n*bs5nmo|1uZbOnOV(4iYXxw@~~t(Or2V&9h2Prvjw z`yH1slJicBrwiz7mIj0peM?r}&$`%h^$#-Q0co0XCW=k*q%;Gt3_#|i?RWX+UwAY1 zhzt}`!Ta(U<@2`7pNO6!+w!9-qWc^eocr0DYxFNl(Py2bB;tGB&x~lln*okzzXR zGZ;ilx^+V+*#RZXZuU~_LA9(QrJ06oq_XaP8W797e%So5E%@1>?DLnZ7L3CnQM@zT zh-Hx^6UVx@&AFb^>L~GV!0$c!e?QIkl+v-0fixU|sGhR&YheIMM`k9J_W8-4pM4z8 z*}X4|#f4naA(3J`Apm+M3TbAZ*2qpTS1zh#`#pQ!9Y%n{f_8n9hWl7mew0j!N~9C4 z@4tXx0kGF5y!fX@(=}wo22j{4YtrMA|Mp`!$7IUML~7X?{!}A!pIiCv$Jucgr^tvu z6UhyTPbTkg#!Oc_%f2AgHXlsK2c9OmhC-U9>GNoJ7YLFZwV}5F_fOrWnoW|{@cF@- zQE!RLTB0`;Bl)&8z7P6Ayu5j8w}6yv&m!^p7$@y4gm`KwL*m_FNdEw1#h~)Jc$M^2kkb`Jj>evm7Zo_M&xNaP~MmpJzo2>9pp|0IIZ+64do$IN* zf~>@Vv652o>y@w7S;lIo6vnC*g?T6e#-8@xqgvmw)=+80$QL za)|6ukxIGftGJU&wf1;EOQj0NOE*nef4bD1OfmZIVu9SF3n*;ezqPc9|D((!MKZ-X zjXKz%uP+d$K)BoVd91T%@>3ZR1xg!G{5tg7bm+}Qb`mC@V9rgWY3QrW68pN`dA-DY z%v3kIZ$TR6Gwwf#@)dcB2GOotH_C__P*~V2_btA0xAjY&`Gibqx0qVmVa{w8lcgQ}Kw3@W?XUqBjwX$0UN4;S2o!#ctj}h7{u1hj z<3qM(4nw=wr`t|`>4kpfON2%FOh$_p{e$l5K{_gUc9okR>lT>nKIY4^g%fV}@p z;*AyAE2+*=un@1dWKRFy+?UL3AB{z7!>nEVyq^e3S7T8#8~UXW$8MPa?1SpWCzGt4 z5Yu41*9mQI2L(k~3VUNJONj z<*ZqKCuReGr^{b!Tm%KhRC0c=m3t0eY?;I#O7Sb>wM;q(?uz@F*?qy{F92CZg&%66 zu(K1M1Bg=5+RjNsCrh9l4jk3)S-)1_@#2w9aB7!DK7FBJqo)YGXP9SEF1RbKvgk07 zie?k&eqSz9k-CP`T~X~sxo|%38<$+*tom!IX+I#9YsrN@yR4 z8q^;H#$4|15A{AZGg!gQ_8KqpsJ1`Us>>%sHyHI19F1rc0pRhKiXsQV2bZhp-T-K^NkvL`=xdJ2XFcZ(e;A#u^Qwj)I$uogRgo`490hL! zAmW_;*Ex6C4fo)s!hYo{sv8L2H7d$u$Ok~O>iglQ&9>`@zum<1;ty0_tLTzD#;mnT z*htZ&D$Dcfd$C=U;xl~{nKND{o5^_~^b>hg>OjuaH+G9)s?X+wV)J7a^9RxRkDf9-T{dxy=9n5(vwRQ@co6qu8#~XT{!hqR*kTA&^4C%R( zb`HjX19sAN)*ic)#t%W{=nr89<4&?dL+L59IZ!rlmHXt~UHB;H15kuBHi<*P=7Ea# zqK5(&FC78}4xu<=US@IJ@a~8^{qv!KxD0RJOSZVF`|t*D%}{U)1uVMUj^IvUzt|lK33lzhL#kQ1-zS8X;a_B`5Zn(4-X!pkVvGSE;>M&gOG@__jmHquK} zap#bZb|ZHV%=3C8cPR>~$O~6cLyriH$1aNy)$4`tI)kTZ;{Z@tBs_dM@!GgHO&vgC zx62sYjUyC>pO7Us@&^#uuO%WXj%1aH8V0ci=#M#j+I&&Du-)v@_>@?OFldB(uZ!e}0KS(Jore%IeIj4*1xgRon zlM?9N`s-8dlY}oRux2PHr0vI1xl#pit1~aUL&INE`ou8HpKCCPk za!s>$D>sav@tY=8W-*Rz(50Mw0>RrxM3mM&Npkz4Y&H;L>DQ;676igjUgcC10@cTq zlU5M&#;1dn;v)gP3^1tulMfe8oZfvWFAcGSzo09pX+e;d4g}lXjM!5-`%$$C`?iC9 zbAXX_KTG*QD0I%zu^=u|Sq}rT0`1#NcP4I6IG6?`yF~{tjM*g^$T#OGC>Yan{JbDl z|HrPMP467s8c23m1LV*Pv^f|B0j%_P|9)`G%#b$xpM zNkY52LQwGS1)G&kRb(BCzG@)&HOptnwg)SIV>waulB1xoYx>VM|Y-* z=7b{PDyv8h9*UYODi4J}Q8n3*#;inLrsUC_apyAzf?g|aLYG?}>gS};?1nte{+Y8M z!@$4f06IRJbI%^bxfy%|HJH4ko~Fm*e~C>_Bfl}+XZRh^I6UU@KP3q&)%SFtruJ%G z(?sCy`Lb-9_LEHk4e1Fp!{a9;Owu@fCbmV+aHIHjm=zY{R|CJ<9K6fiWDD9%+WdBb zdhZM!uJ1!zAMGGgSGaeV~_S%=%J+oq|z%n{pP zA3faF?_AyGG_;vB__zmOh%a(lkuB2uG;>m^b`7@PDALu}X15tI$gE6_HVcDk9W&Y{ zo&HjF0`1mlQ`)I5rTgqIRG`gVXy>KJd3(mq>vrl6UNDb2_xrC!-%MUz{swI}a{-Y7 zW16QNEYd<@!`9<@InLGhiiU4ZA0_PfUuS#tH7MCyJaK9?|09~+_g%SaS*@8hW-Pvx z2EOwPL!)rVTaOo_%`CL?>d|$|+{K0&XydcP+GX*f8f^niSH1-s(u~lmZhEY#o*bQI|Kn=pD%d3;H$g6^3aCMCVw;i z=RviT?OVj4d}kIu^0>>m($!C!PAvd{F=#c;uU*$QLoQ89h@B7*Cp+ivdhE^6(Wk0+ z3G~t>``;G(`fa_7HXFgs84ITBM-03A6m6Cyw|qHzY2?rWN_Bt`29vD|qsDRB3IpL! zNNjr82>;Q;o(fiRovCX$*P9AbIrBn`iJXom<%e@Rg_FX$xm@AXNN!e(!j17|Np)BVl#UjGL9q4`4lq@#tg$AL@^Gf5-MddF*T0kEX}Co5S3QCD3XwK zg&fPND3od{ArX~OseDT5d_P}nU0d_}+@H_q`~CiY_kBO^KiUtkd0+46bv~?XU3<;! z?ayOnw)|A)(ZmJ`Tld^?^loSN_3!^<-}c@^%gk?AVtIP`)AvtLe)#_9)=u2oAgyRX zudTCtRda4wH+$UmNvCnk2Lky|IDtSZ>>>Oz*f+5yu>*2*M~xqz6&O;)=eN1RV5Q2R z#RLLjV#nW=OS(WHC%bB)3B8a#lJ~w)Z&G3iptBcSI!6H0c!fdp#u{J z3>%p>GHc-IaU^cen5m+CEJ^dblTO34_yRa6nIs{X0C-}G}>75xcTO)aqY z4a+xSm2Wjx8Im=Mu_;5V zE5j#XRl%>sSHO0%<&4T@xsa}FHGh%@_8*ir6n|jmsH}uLhvue{u2di|kiVmbKd3XX zDli?(xaFJbeu0betK#QiHBvpXn$-q2-4CQw`dEDG%0G&)a&}{tZZ%e`Bo|v7o9I;> z$p5n#`SJj#1AYU(0%&%p)blGYUf&Ma#v%OZyo8?&}GFKe=UmK(E~)g#T~3hYGhXKu$(bjfp1#+YvFUOhWtaU>KUAwt9AwI+VaNdrTGzT zHS9Mm6e5&x_^{kju)xsFp~JEV1_B{C7k&Py+=QXS24)3J#P89GbpI-O9ji66+S(_u z8v5~AE{yzs*vi;zt!<2r$Ipu=pdJ*(YVmzd!HW14>$M!K%W(Wqui=3S_)0h2#t+QC z^G?O|$5+EMM-K85_O|hv>}Sf_3163Ks{ng0BbF91fUA4 zb@2-xfz_h9i+h0z&dyEn)>+-Ie!7je;5AsK86(q zMSFVjdHFGbl7R0iP>cK&RwG~YX5YS#uMF$()quNlhYjUI3)Jc54@^8(4SAJxaoD;x z|8>26{(-f7uo{OM93NC)Zq|@7StIiTfrhvE1&z@a)u4nzEJ>I1L|ek z9hyrsGbeLk*5v^8q!?Cf?3aFi!v1Vt3FFvj*o8EtTPPqNI{>Q&?%~ST2t7{^b+L`) ziq_S-1Ybj5fm+q`=ed-sU}s~sGDc$asu8$>fLfe{t${6vy%PHa85RE#Rt4_Bs(|OP zm9aChx_5E3^5XkrHFc|Lm^xx;fNai?f!+o>ImhpqEtSX$ym7AE4`$NQ4sPz>HTmMU}hCF&^8#rvp=uz1@xzV%TAa`k*Kpcx&H)kOBiR>gL}YN8roRq(jVZ{*m6W@E6dEu4V=H3c|~cJ{}r-GfIB$lbbAE>3zQb7c z`&Fz4_|}>JG%mq<3)J$Rkk-~GfbCf2YijwRbG4twnYMJ>2TK{i9czX3ObEdK?krZ zXeCzZp2X_fe;8X5J8qiWs`Qn4#f>+E1WDm(o;9}j4ul8m0&WZOQLpI^-N?w800OsZn9?mrx`147>o*%K{K%iEB)_?(A zLH&n*X(JR?gtpKt3s@U)*U^R6)}B`|tq zHpK@5w=MM7TYIdA#U(xU=a0pzU++HSw=*+${Lle+XODW&mX|e-y?7wI&H(n*oUGj3 z%(1!6Rq#+-K=kM|dT6%ps)7B_`VEMlnBJh38nB#U12c062LgBHvL%r2_!9q08EXf4 z@KS%kK7cFz5*t5iWb+m*xIo~0n_v$SYVk&EGnV-oTzuWm+F&(8)36$$tmXa!m}LFj z%yBwi1jY@?(M>yd5WFJkPOR`3$Xi±B-0Gz0={mAP5&f-)ug-#|(&vCdeH-SJg^ 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 w@U!dFl-ay { "--dist-dir", dir(`app/static`), ]; - - await removeAsync(dir("app/static")); - g.log.info(`Building web with parcel`); if (g.mode !== "dev") { + await removeAsync(dir("app/static")); + await removeAsync(dir("app/web/.parcel-cache")); + const parcel = spawn({ - cmd: args, + cmd: args, cwd: dir("app/web"), stdio: ["ignore", "inherit", "inherit"], }); @@ -32,6 +32,8 @@ export const parcelBuild = async () => { stdio: ["ignore", "pipe", "pipe"], }); + g.parcel = parcel; + let output = true; (async () => { if (parcel.stdout) { diff --git a/pkgs/web-utils/package.json b/pkgs/web-utils/package.json index b221f58e..d960a4ce 100644 --- a/pkgs/web-utils/package.json +++ b/pkgs/web-utils/package.json @@ -3,6 +3,7 @@ "main": "src/export.ts", "dependencies": { "@paralleldrive/cuid2": "2.2.0", + "goober": "^2.1.13", "react": "18.2.0", "react-dom": "18.2.0" }, diff --git a/pkgs/web-utils/src/define-react.ts b/pkgs/web-utils/src/define-react.ts new file mode 100644 index 00000000..9fa6039f --- /dev/null +++ b/pkgs/web-utils/src/define-react.ts @@ -0,0 +1,14 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import JSXDevRuntime from "react/jsx-dev-runtime"; +import JSXRuntime from "react/jsx-runtime"; + +export const defineReact = () => { + const w = typeof window === "object" ? window : (globalThis as any); + + w.React = React; + w.ReactDOM = ReactDOM; + w.JSXRuntime = JSXRuntime; + w.JSXDevRuntime = JSXDevRuntime; + w.Fragment = React.Fragment; +}; diff --git a/pkgs/web-utils/src/define-window.ts b/pkgs/web-utils/src/define-window.ts new file mode 100644 index 00000000..0fb4e654 --- /dev/null +++ b/pkgs/web-utils/src/define-window.ts @@ -0,0 +1,93 @@ +import { css, extractCss } from "goober"; +import { waitUntil } from "web-utils"; + +export const defineWindow = async (awaitServerUrl = true) => { + let w = typeof window === "object" ? window : (globalThis as any); + + if (awaitServerUrl) await waitUntil(() => w.__SRV_URL__); + + const location = window["location"]; + + const host = + 0 === location.protocol.indexOf("http") ? location.hostname : "localhost", + scheme = + "https:" != location.protocol || /localhost|127.0.0.1|0.0.0.0/.test(host) + ? "http" + : "https"; + + if (w.__SRV_URL__) { + w.serverurl = w.__SRV_URL__; + const serverURL = new URL(w.serverurl); + if ( + serverURL.hostname === "localhost" || + serverURL.hostname === "127.0.0.1" + ) { + serverURL.hostname = location.hostname; + serverURL.pathname = serverURL.pathname === "/" ? "" : serverURL.pathname; + w.serverurl = serverURL.toString(); + if (w.serverurl.endsWith("/")) { + w.serverurl = w.serverurl.substring(0, w.serverurl.length - 1); + } + } + } + + const port = location.port; + w.baseurl = scheme + "://" + host + (port ? ":" + port : "") + "/"; + w.basepath = "/"; + w.css = css; + w.extractCss = extractCss; + w.pathname = location.pathname; + + w.cx = (...classNames: any[]) => { + const result: string[] = []; + + classNames + .filter((e) => { + if (e) { + if (typeof e === "string" && e.trim()) return true; + else return true; + } + return false; + }) + .forEach((e) => { + if (Array.isArray(e)) { + for (const f of e) { + if (typeof f === "string" && f.trim()) { + result.push(f.trim()); + } + } + } else result.push(e.trim()); + }); + return result.join(" "); + }; + + w.navigate = (href: string) => { + let _href = href; + + if (typeof w.navigateOverride === "function") { + _href = w.navigateOverride(href); + if (!_href) return null; + } + + history.pushState({}, "", _href); + if (w.rootRes) w.rootRes.pathname = href; + w.pathname = href; + + if (w.rootRender) { + w.rootRender(); + } + }; + + if (typeof window === "object") { + window.addEventListener("popstate", () => { + if (w.preventPopRender) { + w.preventPopRender = false; + return; + } + if (w.rootRender) { + w.pathname = location.pathname; + w.rootRender(); + } + }); + } +}; diff --git a/pkgs/web-utils/src/export.ts b/pkgs/web-utils/src/export.ts index 0ad88aba..6525a0f1 100644 --- a/pkgs/web-utils/src/export.ts +++ b/pkgs/web-utils/src/export.ts @@ -3,4 +3,8 @@ export * from "./wait-until"; export * from "./lazify"; export * from "./use-global"; import * as _React from "react"; +export * from "./page"; +export * from "./global"; +export * from "./define-react"; +export * from "./define-window"; export const React = _React; diff --git a/pkgs/web-utils/src/global.ts b/pkgs/web-utils/src/global.ts new file mode 100644 index 00000000..9797c034 --- /dev/null +++ b/pkgs/web-utils/src/global.ts @@ -0,0 +1,4 @@ +declare global { + const navigate: (path: string) => void; +} +export {}; diff --git a/pkgs/web-utils/src/page.ts b/pkgs/web-utils/src/page.ts new file mode 100644 index 00000000..9a003752 --- /dev/null +++ b/pkgs/web-utils/src/page.ts @@ -0,0 +1,5 @@ +import { FC, ReactElement } from "react"; + +export const page = (arg: { url: string; component: FC }) => { + return arg; +}; diff --git a/pkgs/web-utils/src/use-local.ts b/pkgs/web-utils/src/use-local.ts index 70230034..7442859c 100644 --- a/pkgs/web-utils/src/use-local.ts +++ b/pkgs/web-utils/src/use-local.ts @@ -1,6 +1,5 @@ import { useEffect, useRef, useState } from "react"; -import "../../web-init/src/types"; export const useLocal = ( data: T,