From 70efe7766b19a9c44124c36100ca133ec7905e50 Mon Sep 17 00:00:00 2001 From: Anna Bansaghi Date: Fri, 20 Aug 2021 13:07:11 +0200 Subject: [PATCH 1/8] Add async fetch and refactor a lot --- .../cameoparison-svelte-actors/.gitignore | 5 + examples/cameoparison-svelte-actors/README.md | 20 + .../cameoparison-actor-model.png | Bin 0 -> 40419 bytes .../cameoparison-svelte-actors/index.html | 17 + .../cameoparison-svelte-actors/package.json | 25 + .../cameoparison-svelte-actors/pnpm-lock.yaml | 566 ++++++++++++++++++ .../public/favicon.ico | Bin 0 -> 1150 bytes .../public/global.css | 60 ++ .../public/icons/compare-512.png | Bin 0 -> 9046 bytes .../public/icons/compare.svg | 5 + .../public/icons/right.svg | 5 + .../public/icons/wrong.svg | 5 + .../src/app/App.svelte | 50 ++ .../src/app/machine.js | 38 ++ .../src/constants.js | 1 + .../src/error/Error.svelte | 16 + .../src/error/machine.js | 16 + .../src/feedback/Feedback.svelte | 50 ++ .../src/feedback/machine.js | 20 + .../src/game/Card.svelte | 101 ++++ .../src/game/Game.svelte | 184 ++++++ .../src/game/machine.js | 145 +++++ .../src/game/select.js | 56 ++ .../cameoparison-svelte-actors/src/logger.js | 15 + .../cameoparison-svelte-actors/src/main.ts | 7 + .../cameoparison-svelte-actors/src/utils.js | 20 + .../src/vite-env.d.ts | 2 + .../src/welcome/Welcome.svelte | 122 ++++ .../src/welcome/machine.js | 83 +++ .../svelte.config.js | 7 + .../cameoparison-svelte-actors/tsconfig.json | 18 + .../cameoparison-svelte-actors/vite.config.js | 7 + 32 files changed, 1666 insertions(+) create mode 100644 examples/cameoparison-svelte-actors/.gitignore create mode 100644 examples/cameoparison-svelte-actors/README.md create mode 100644 examples/cameoparison-svelte-actors/cameoparison-actor-model.png create mode 100644 examples/cameoparison-svelte-actors/index.html create mode 100644 examples/cameoparison-svelte-actors/package.json create mode 100644 examples/cameoparison-svelte-actors/pnpm-lock.yaml create mode 100644 examples/cameoparison-svelte-actors/public/favicon.ico create mode 100644 examples/cameoparison-svelte-actors/public/global.css create mode 100644 examples/cameoparison-svelte-actors/public/icons/compare-512.png create mode 100644 examples/cameoparison-svelte-actors/public/icons/compare.svg create mode 100644 examples/cameoparison-svelte-actors/public/icons/right.svg create mode 100644 examples/cameoparison-svelte-actors/public/icons/wrong.svg create mode 100644 examples/cameoparison-svelte-actors/src/app/App.svelte create mode 100644 examples/cameoparison-svelte-actors/src/app/machine.js create mode 100644 examples/cameoparison-svelte-actors/src/constants.js create mode 100644 examples/cameoparison-svelte-actors/src/error/Error.svelte create mode 100644 examples/cameoparison-svelte-actors/src/error/machine.js create mode 100644 examples/cameoparison-svelte-actors/src/feedback/Feedback.svelte create mode 100644 examples/cameoparison-svelte-actors/src/feedback/machine.js create mode 100644 examples/cameoparison-svelte-actors/src/game/Card.svelte create mode 100644 examples/cameoparison-svelte-actors/src/game/Game.svelte create mode 100644 examples/cameoparison-svelte-actors/src/game/machine.js create mode 100644 examples/cameoparison-svelte-actors/src/game/select.js create mode 100644 examples/cameoparison-svelte-actors/src/logger.js create mode 100644 examples/cameoparison-svelte-actors/src/main.ts create mode 100644 examples/cameoparison-svelte-actors/src/utils.js create mode 100644 examples/cameoparison-svelte-actors/src/vite-env.d.ts create mode 100644 examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte create mode 100644 examples/cameoparison-svelte-actors/src/welcome/machine.js create mode 100644 examples/cameoparison-svelte-actors/svelte.config.js create mode 100644 examples/cameoparison-svelte-actors/tsconfig.json create mode 100644 examples/cameoparison-svelte-actors/vite.config.js diff --git a/examples/cameoparison-svelte-actors/.gitignore b/examples/cameoparison-svelte-actors/.gitignore new file mode 100644 index 0000000000..cdc9c917f3 --- /dev/null +++ b/examples/cameoparison-svelte-actors/.gitignore @@ -0,0 +1,5 @@ +/node_modules/ +/dist/ +/.vscode/ +.DS_Store +.pnpm-debug.log diff --git a/examples/cameoparison-svelte-actors/README.md b/examples/cameoparison-svelte-actors/README.md new file mode 100644 index 0000000000..e7007e86b7 --- /dev/null +++ b/examples/cameoparison-svelte-actors/README.md @@ -0,0 +1,20 @@ +# CameoParison example - Actors + +[Open in CodeSandbox](https://codesandbox.io/embed/github/statelyai/xstate/tree/main/examples/cameoparison-svelte-actors) + +This is an XState port of [Rich-Harris/cameoparison-starter](https://github.com/Rich-Harris/cameoparison-starter). +You can check out the [course on Frontend Masters](https://frontendmasters.com/courses/svelte/building-an-application-frame/). + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Run this example locally + +1. `pnpm install` +2. `pnpm run dev` +3. Open http://localhost:3000 + +## Actor-model + +![](cameoparison-actor-model.png) diff --git a/examples/cameoparison-svelte-actors/cameoparison-actor-model.png b/examples/cameoparison-svelte-actors/cameoparison-actor-model.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8e9093d03f36b0bb7b34106539c867cc1f5e95 GIT binary patch literal 40419 zcmY&=bySpFxHk-g3_WyrBi$h(-Dv>QC5R#&(k&_7-3ZcMBHbV$Akrlzp>%$G&bRJe z>;7>(YatWw-p_uXUv0y+G!(Hh$T5(Rkg%1NU-78_45o5r3-PZuHZxQvjD{TXW_ z-S@X|`I5>Qi*)2rl-bkx1mI-xdk@~r_X9`8BND%}ea3&@930&|x!_%_n={^TJO6p~ zq2wrIfZ>BMpNEB+|$BV1`5~OvFuD?QCb$<&K?VsbDig!Eby-Mb;#A z;t-yB9rC}w{y7!9b>?MZEp-V~Eb6?-JRVD&p^Hp)w)lG;q>Ep!1})`l<00u2?Rn;WlVq8S{){6 zN;;}0b2vVJQQ-hy#=RSz zr8y84vsESpAiaxrPIgg9^9|LTAWLaf^;O$W^|X*UT5!)OI#SfEK(t&cu5ZpmOjRdmBG2E zeuFA0oom?Q#N~H?Yd@YTS}fwcIk;w8ByrUKPt7x#^VMt;hyE1N;}@fe>@Q9NEca)> z9QNQ!xwJTKIZ53f2fb>t&tkj$*wlm0Z(GprvVK~_SvC~Q@pX=mn~IixwP`?K1qqj-&A)EJ@kJ5Z+)M^yHx=fR zjQ(){ZevFXY3fK(EK1$;bQ^ZO)F+;`6ujoa8KTa`Eg9Nw>gfWG*yI8{!ZjIVCA!@y_+%jST+8y`_L%+g>NoqvX2JQ3H7#w&h^&9i<&gbH2(kSH zYIWg#4Ke9sNVA{U>5duMG;3A5pj~T*ee00m+j*YZJnsw7imfo}4}(6(-_YC!Y0npn zR7pn8lR>e^8bAwUbtAtX9x^~nsruhA;;1T53Cpud_yEy<{!&6esCR&LV9%h=VCTG*I{kAP7Aa4c>z{=m@%5l)e~Y>7 z#C|R-JnbZ4R&#J)bPW5|_%5UEpmt=j+N@_$TahYhN_2NyhW0Hucwz4b8jNL4ul{aT zJ}-Y^zdKb_sa>FO*z!A@->ss0#OGq^H5vimkYY5sRoW&#INI?+V7Z(eW{tdqkpz32 zOSQWS6h8@ta9q(qdQ-x4day$GsrxwaATqQkuuBy>mU)RB4*^%S6$a^+3I2&E7S9r9 zh^OnH#*0Fh+T7jmZZ3q`$Jum?oAH@cVC>-i@jv=k5jsKU%JO7mkTNHlO=|8}J*mar z-VWl0+g~Lr3);<&roU>x-Yc)PUuyksRH}&%Iubvqd0yFK%)n42{h71mhpLPUDWsWt;Cj3o%E=s!b+IEc-C zem-({x$)`n{^qDj%tHAbZnMnhTzAgqOx_EQAQr4$RvP1{IEP^TC-{7)Pg{djp#)vcgiCJ6 zDQ0`3yzBn#*pA%VAfl93vB6U;uckgKD12#Ju2ZCv+$H#KL4b*#X>~V>)r!Mf1{v{& z>x!V4`CbK#&pP0g*B3Y^F6RsicB{Rv;Ho%}OrLi&^e+UZOyrPhT zX*8wo>e(#WEIxf3vlPMaV5Q5D^6Tt*Oo!O18&C+ZX~d0o`JqZeftMDWgK;mG8I^G$ zNsnJP>Pd_my9~u6N?ih!dR=0kI&mNh8qVp@gDEeu*vc;N7ZrNE7vB|W ziZ09>#OPwB!EY15Dnm7JAa=7Aj#eYd4HbK$&fAQ?i(5y&!dIoAeK8RHr}gCaxJO12 zbeXqc`eb5Hx`cm)i)=*kQwk2uQ2ZXx`el-U`Tea{f6yarr=yOGY;n*tW$K+cpTj&r zDb@;$yh$Xaa~R=lY9=x9{_aaIU=y3Kzte~ZRY_vs0>=jT0vsW9Lb_OM7^7t5D-6*w z>NFnC*Q2Sthv&cEyQdhrrMWu97g7g+Zq^dX-8t{NH=}%-UbccWMr#Td2JLN+z>*(4 z*Gvu^j-|t;HqJI-(8dG%Szz_H)BP%W#2k97<6`?9Iio7maL7H_ou3b0g=E%&(%{^E zIZtZc7|#;NWT2tzG7GP;i*L7{$o^B1X3H+qwSt&@UVZ{?YVcG^pVs}!ydZI~8cVfS zBf)XFcsoDJQz*n-N)a8>Zn3!r_cduf8d!?)r>Qo=$IMdsV=B zTTS@Q3~R$Ttl3%HMt%C#j?RC2bgx?iyS%%+N>S=uRx}cc{SrmYm=qUhJF_a7tzlgY zu3Jej7qao}V?pgz`+;gYbAdvT$w?`FPQM>k_ux1mGpBIq^TGekGG;w~S(*8&)4L_e z+3;-r1AVZ+B8KSc3yU3OrKOj)x0fd|=Mjoju8CgzUz&7;@s>obp~u!;pC64O&JX3k zvsP(XFeNgP}n!qt(K$Dou+UZ?Y)_;u&praO<)2r$T9}h zUUrl;Z7jEmWRt}JPLp{b#>;BcZ_=as3AZ#5tKmf6rn9QA_iuu^p29_Y1FKbc1r^yg zPZuWY4Y8T{Um7}wi0>9Aa40L`KY`jn_`pHGn78=UqRQPN;DI?A6(Wrfnv4cy@V-T! zXW|wywDHsgY^Qo%kCvCD9NsW%Gw|3>F}j25ZYx&L_>B2%rgS&R3^W_jx8l@YXZTXS zU?hI|&AY`Pze;z!@ky%Hyf32V--MKjyWyr+f=i_XQ=Y2HYCgA?HFHxEoB$?vT{1%8y~@x;Rq zuP1b(|Ndj%k-_1lkEHFW^JaWFJCGThLa4sNoUi=K3(V^;y3ger-~HPDaJILl5JPFp zVL4~)^+iAC#+p{~riFG@);SjRomZqX_}0+EDE?nQY@0lOERgE+x(Uf&*62Rgv6h3e zbceIA-Zumbm=`zy3J*{$m3p|pd5?gvh!*F^S?;nsRon%3>&*krpWlIjW9TfItCe5x zKb+O!42RlgDG6)D9B|7d(p<9?`bR4S}df7r>J)yf0o z%xmuC_TR*--|WGBtoP9*tCeksPVy0ijsW1h4N!Yk-1!OQsQxs!Xy@g%Y)49zMo^ne zVbF#?(0fNq55+SX0dzk01}iXDUA=-7KUP!nsyFMyUYYgQ_HfdO;jHuT@rG2VHn%@f zITW7j;Vcy|dAf5LCDx`oz*8068^Wv2Vy^!Eb_e6Xpk)tnia~LbDUm^H2BHHCV;`>f zx%Vvve6C$ymS|8Z-g<#z`VWQcjlpL5X1OchCi2%>4&jHfAc10v)*l4*<5tyq{ka^# zvS;9%C--}7Sj33-FL@nx%-YBR{Ez4n0Z4Rk#uUNBZDf>3x0p+mqE5}-A((AH%3rnx z;fM`tN4}~w6xD5IHDSbmy?q4msxxRmt^gMZ_ECd1uPyRGqgCFW%#+nBuJFVND5RrJ zah=MYjjj!n){1YfzBVObV2jk_6&!F83gk;5b=(?G8dE9u-Ur=WK+z zK&9RHdY1*!g`Ho50y!|vIIsg<-D>Ea-o0g(Dp>2-kc!u|(lF_oX3)!;oVHX}#>Hf! zht>l0E*uA_E^=D(y}w?rW2)|TV@Gc-R_OB!JFH4ue2K6$$#EKHt9(6??PV)daF_Z1 z+Yk@0;Xg_>W3NAg+OHp(^#}|UGSFg*?#Awi*3kMVT~4WTi@tHZV+A~?j(mN4EaR2L z$vwH^O!>=+#It6{4K?Hfn^%o*cNIQSzZ>ah4;2U!TZ+Q}^ZWMWSf_K~2>DAvkxb`t z(Wj}k+pN&|2!Ke{90sxz38#;*kNw~~znZGN08r-?W#=E^{}KD=XWhV{B&)MnY_0>F z8NG4TFJgJGvmY;iJy0p--x+>({J4E@`2v?*U~qkhCCA%IAZ3SNhV~h#j<7dvK~3{D z76Yxn?Ayl7jEp?iLcYD~^0ii@Y{_RX=bu;Zdv{%_n!=^flFB6mAt6k=;dA}d)@dU}0yQ+<9nKK0de!je zIlQnQS?DVf5{I3 zlNTxKv!W7}Ofp?w&_EiUM49vZvdNFs4AP-|`m?_32gBn|Io^MjEh^|o(mDRzDc9$W zj8n#YV!ySVki4nDD|vFfY;V{K|p?bK5t`$d~zI=H`< zSG!dBxwG%UX6*=<^NQa?$B#EAPD4z-IhETiP@O>VQWeuVb&ID+A@aARR!`o}SL<<| zoxL6!FSf)Gszd>w`)}X8>HUiRmMKrtw-faOY)z)iY!%J5Nz-qLX433MlAfk((2Ge$ zy#shqnDx?bt=5|_j`|6__uCooi$`jwoTIZAT0Fq4g z$Lcy07v5!rZM8%6($GvI|NqQt9son^)b&cW@;a72L3mGMHUEO%>P*D`ta`!XT7rZ_ zk7x6v&6SMl1EMqR!muEx1pQX(G;4qjKC)gm%eHB<|?4{IEOM*-rITuiOx?`eikU=&H+p+U{aIJ^1n1eCLYgbrZmnK zs}*#?FBUqJj96hp^Uc;{>03@)!$m>5lhj&c!dBpkORzpHiL}8g^lG}3fF!ZN+kKxX z?tXZHQ?!ro--S>_*h(_ZXL*-eKfkQX_HVOMqKowfuN$Z?F{^%S?$1y}6QYoSwG1!; zIZb`9)PMMx)1-4Tj!4S;(&0gkqd#ruhMK|j+G7#%GVHuZN<aTJ(nG z-e*NQfw?7yN_@eOOTV^vzJ(F=X}K_eKO(2@m=bgf5wYGgHcdQM-Qp-Kqv?LFcmt?S z(va^l%d<3~9w`3_c5$bJ^FVLQV^JOz7H5z{ZQL}Uv=}tJv0tdSElUeNd;>G|yE{9~ za$l|?j+~(ajqfY`_$x1SNc##)|3k*_sxS%Hx-?#k&~osQ`v8LP|Eznx$Be%&{`I&U zv!CC0!M230T+DwWVA<_{UVzQg?;yw;j|K7{RzP%~jc8#tQPudcuBjr`=&I||f*2=E z60XtOEX%*v#p37zrgXF+lofXvzuy)-=@hnKoHyf4PFDC2MCR z1mDakeZz85rHiFT?9PDX8={9#(nTsslvJU#IBbT^)eg!$5Jvl_NC=G6(5J>TOD=hb zfNKvD8uu6l^)>{8yy=<;i!IZwSVWu#0@_XJcg^n0o+SuI!CSlpx_aJ#ED|ih1H34P z}}>|+AbwV2T=?(c41L6*KWE$>l#ZpKM-Dkcy?e8GwR zStVZJ*%yMuwg35fIr$f6$1Q*_#4Ar+P9ET-fV}L_lqCeEZVj>I)SI*em=?u+<9*Li^lKP(OFaWld|7llv5A3 zaP!H=fVd<qHv>~F1P;#UZ_M+%22<7eFZ@^O|v;Gy1*HcJuR??u8l& z3rt#ReOOIvW`?op&5z-Z%k{|4euD%8h%bVdzZcKHI-m*Qs3-b*?>s?0mnVxBNk_0E zXXD}k7=Ihsj3Hmej#@?`sK}rx-gIQEW{xCUJE?rsR58UI&<#100bop{Tm6k1h#QvNkIZeCKerYdV`2C^e!>w~9OM$@5C2cEO+`{_Bve$%| zu>8K+B>;p*U~VskVpA;oBcrH2MN@%X-lAccs0-;Lc#mlzDnwJ_EU_=*s?Mm*?GUg5 zo~`elK3?wMP)QDqHjLbtwz7TB^;1|hsfDdaNjJKZEn|>oIl~2`j+ zG;w|RtI@SUAv)sB$;TKLjF6zT-noC^B9@PGjp7UK<~3&nt>?-f0K*4;fmz<+YoIX; zUAO`oK8>3y!r6{S<2|_-36xozv&9ow!*J7*TgGFf)_QHb;Seg^^j4uPykld!fh&5Y z*VPS;ceJr%uS0b*z~pNI+Rt>NV+^I}D8ASI)$gUjIEFE?<(ya_^`GN_@2Z7=qLx_L z8cE?keHC2Z0$$-(x|S=`Q9~kgd%x&B(I6t3jV>mmj2|s6^i?lBJGp;_8?yY^GJq2r z?~jz$uGcb_E?DQmGs|TqtY^yToR?aFw*X!5mjo&?hi&*tH+zTIg_~YKDkibZbctru zxVo`wPbl`%=1>A>d-YefcU4DaC&AKMfOFssYuILc;pO7EZI7l|qb78Ps3wuzivG^5 zODUx%Zmv!a7q=k7=g$&x%xBxF9?TSVK5+O4T5&6&jH0^2esA?C=lLj}cvMpbf(rS) zJ&|(+$V%*d=v+xi*H^d_jV6GF)PK5Y{kv%+#Q@GOj?zx={ir?3qp%hjqo^d=x?7w< zN%qry#iyxHYg%8#KbKTHLa(Peek74CA(5#{zpg+2kAsuz!EPcOOpu8c3?d z6#aaXr<1Zvxle<1X3Nm0h!;14$*MDfhBOM!SD5DoO6@td#D@d*na@UTje=2K@;-ZI zC9QziFuo;<^Y{(KcFSl&oJ7XtYGn@r9$vTgLl0tF6*|vyFpwK7pS_lF7V&oork*{m z9Z!0kqF6r5BSWhP-WtvBtBl|;0HV{MtDOr(1asIJFEi4ZeQUJ&PQT`%6&aa9X^urm z@~>s@b2+6?N)RojvGIppCeSfOUY2Unfl(|5rk(CwgWXGAe_uQtbO5QF(q9|SlNfvC znG_d$!T?x~eHM}_nRik6N7LrL+!XQfQMz4ajUE>2`4}jpewPSWra&;IttZzg}g%Y_C0_?+rN_F58iiYb6+XTC^!E>cZa6wJH#o)T5cz045{QfS2hhl)GYbHrvhNN?FOJHy zXS`xnLdX}bxKg*1c+UOteSz|6_$UK9%)iL`hF7lEy1ogr&LYSe{+#JBJu>Dp;2jHwhLH1#{49*~yQrpc~|DS~PF}1t6#fsGgE(`$v|X zE*9N<%tBb-(ELgic^{Z5^yr~D!ALGS)sbdQ2?5+BjoB$K0DX!Yx$%8=EtEu>Dbr<% zM2VMIk0*G+d!kiJ5Kf~SEG+;V&6fD3vTk~oPX;6VgHH!{0pBaAGYC2DL3qX6BAF*# zh1G(b!jx*RLVsG~q?Z6$Kcsk<1*()-AP{kkcKZ4D@|BJs?YXdIdKQ8*2QwTGKdwsU zV}3rZomfs!2NkC_qN1>BK-{>(}u2pdB5vYHIr=tp3%hO?lb z5f!F}GnV89QMNch;5Md3@*GThX>6;%YiU+uhn`BJXN!e!KMz(q&`(Eco4eSH$B9V< zlQFsagx)RaIm5!?$K(NE$j)br&QFabz&3V|guL9(DP$Hq404IpXX0;962@1t( z{+#!<*PuB089fv~9BG2OzPP!%CK(sFlXA-%7MRErh*|_TEEIyE^vUcM>(d(IV}>&b z!K0;AQ)CSqzzB^GMB-!_T9CTlDTqeJ5#k4*FAj7M-<3T7QSK>H$Shm>vh4mxzG6%~ z!c?$TV`eWD%hfcaV+ zrMw9|1}TQgc28$TCM4Gr@WVQL1AMwwG*C--)tJcXD3wx)ye=srm?T0ZXU|_66>Xm& zFUYF@XaSureV?4<94H5d(d2^ANVt+HSP!<9z*V(XgvcLz-P0Okbu!97k@{SXxm*qg z#STCmelyPZi_PE9cBcnyjKIK4LYxcyJO4#-3yY6lhb;r&YjzPbidCkR-@Si@%rqh7 zLEaRAp-TBkVtX(=D}l#g&H3*wI0NhmwGwp?x%G8_Kb+OXa7N2CUcY4J`se>-0XRXw z4D3SCK;>{ImBeZXETch28QP!VGg&B3ke0wc2XegmFy47{*k(->*(@cUQCg-DjkHGk zm(IplMwpLEtRPf_<`jm^X8Flqt;CEK_bHjKqS_QCvQe@mrIgS#^9kTjU*}v`7rn>x*Sq3YOM` z=Q8{RzVq7?OY-M4pPxVGP@NOg{pjyU=#=gvrm|+-?_*~y-8=ONhjM4xV*~pF{B9~A z7f@;zE$o2IB>=S{QwfRy2vuKP5vK$csuJ|JAeNv-CE7E13`qPYlY<{SRGC zrsg9&N8tG@1oH#b`i~L}QF_EWLO&yu^MgGAN4yo-k!jDd=)NLsd_TB9j@wkBG8Zu9 ziC=btwg!!cA5(%AnV`cS_mAs`J6!wTo(#;QqFEW{N(ZcR$nXM_8>r7KiF~ z04Iw-toQ}Qezwi(gHy@<;QPP8^x;Y7R7p=4diR-BUnvKbQ~U#Tr^XvdME}Wjz|WWf zp5jDnrj<$JlLViGsUsDjpAiT67Fk19wRpBJq`F&xCBPK2(V~PXHx1_E41C=8Ibzx%|#JVTSCsTtar~|Wl|ovrX17y{|;~6LTHh|wV(Y_ zX(a9+netiftQfrD0~)@EAGz#tz76o48q}Y?bA)`Goy=4853(PKq52|#(fShzoWiH6 zF#mbPcf+nK^uC^udJt%u0|&9zN6Op)AZ&Mp17cONu>MxI3^PP}1~zHY0@%ml#fqOW zJ>G{ful??1B8oHM!vyIJO8%<9@echB@O%PdA{vyC(|#S?>7t4ot~w zqVh%&Yf{$$_@EHvRL_34BCS9fbLDky4T56+IdL)bfL|)o?N4q+QibuSw620PN=5<4 zrZ&eTm(7iO{QR?}{*2zx`bsqFQ=bU=4+1Yto|X`w@+W+ zJL>s=!m#pDf?3iatK`#~mpM7eU94Fv?b?pgZ|O9>=DNQ_L%8z#_kTAD^zRf=~t6ZXXtJ zPp38A5v&bwRx_1{j{T)`AusgpD>N#XSSEX5_l~2Lei0lcCDR0gJ+ubU z!IM>SHIIm+W5D)|mRem4It+7EEkHllZEit0TKhmR(Qk_V!3{(r!hiRcK;J)?@259z zc#~vA@~%QOWMt+`h(CM~io75U09Ry8^IxFbumM? zR(?tkgz<3!M%v&dOGY4$u+`y)(EezO*Pb+rl#ao`R*x{8|F)!}Y0VWvi5e9?7|a-M zce?Xk0a9!F4I=EkJ$g4De989}fykdtkoNgr{b30A@V#wR7-PACwV(7;#MH_UQvtyH z)}_e-R@k)jD(>gK3SG%+Sr}5GTsZ!AF)%#B76HDrk21Ky7@Mq#01+s~rq>hH`;58; z*6Jw?sLr#T;IWiAAb>rTX88 z^pw+}{&J$k1P~wwLRyqM;QDOmj{^#WVO{!U7@K_KGxBT`YEUPp5kFp{#1FugYVqZLGCW`#sq_V~62jFuiUfzjD)@;l2t zyQOR`gIdI4by-|Dauj!%G#+VC5+N|ckm3HsBz9N8fo)KUtT3EURC1dCq_v09w~82= zg&phlD(1w6)Ibm_TT0>!1LA)Ru#$e2C38=K;p^Q+_64Y>q`tmaTO|9Qw;($rzQC33 zwqSb*f*_hxZ{ocvJUj6r&8F(G3UsnWcT^R!zqF~HV(y3D(j-D*AC?~(E|53Q0eXUXr^dRnV?E;W zDBphviyG=7Y|5GAGNo(}v=rjU;~bb?h+IYTD|^Qo;b~iyb%bkA(5~2=z-Gk$q9Ro= zSUP+>jeo$%;TviU_b7-WS@EwDMnXbK{YQs^+V~S)cuEeEB1E>}eS$&4mAR^K=YiPZ zD5N9IM82Z9Q*9PZkOZuJNaI7#-x&Dh4swFu*On$It{@CpO z^~WsDUnk8cb+OsmfUgV*MXK=C8vzQS(~9rS7b~;5N+Yi$_Q98HS+cij-bCSkh>kqD z?0x!O@tkQ8*y{QniDFrf{bbw83g{N72{S;=;C2UChQ)@M`~|>1Jham1u7!e+gJnTh zEaeBc;$}a^dzXnP|Dr5Fi3+pTa4c+aNr{I7HO(fOxYgmb4XU0Nn4(YM#geRaBOTK{n4J4438*)VbAN zWEoZGS|~--tt>V@K9a{|=xHZ8vklCq6J5^Vf%MS!iIc}h?rH}>V^M(wOiMs$yGzz* zb}%3p!vNb~fW(&kDc4)O8^J7m$ZRCX%ZNxC5Cw{eD)#!-O{+Mrb%$(sGfSb~L&Qb_ z1NH)mz2r2bLZvvp;`|9_WCY@U8hRaXy^*OSAF#{YOs)Y7h9So{(0gAvto$R0#Ak9x zEm8|>0Z?qAfzcaJgP|!zhqX$6Jm(UQ-5_%h)VYf1WRz2hlz;X$LL>M#j_5XMsb$HK z5p0SU;#1gKnDgl0Vp4R$Htzpt&YF%HS%l5mhs z)+-fe~BKq-&XuLkdeSvKgV6erG+rJ|U%}-6t z)|>Udvd+rli1t>jNqC*7LKMFJb@=BONAo7M1t%|r?8yvXUJU6hr$(hEM}8*T`wt*n zbpUm_3g)W0@lDF~${G^F}U39;3KY{|42JT3t-SY|+! z;}@k3W57+D_toFxQp7Zb1<29*4{+yadd}Sf0n7U7MtVOFEnU=N%EvBxB~ik;yhL6O z2P;*bNaM%`vHIiN%VU%2nMW@#m{JVQ%_I`tK^|C*ZR1Zu z;iCX)R!hU)naQ|Kf3GyRP=Kr(L@H@QV$>MppI&NM3;E?2ibmsqWk!yYEXI38B~|&< z86QkwA9(J&eUJiGTftbVI-68@h76Ohd4@wpm3nMKs`Ov z+rSDS%lR`tk8k&2(GHifCF+<%|Dv2P*VQAZvBI_qh#*-91&ct$ilb&p#_{BIa$I43 zgWViC-jg8`!d(KAl>ferP5_dz1iLm+F%zFHN}gVvM$7aY6o#>ojaWiss3pV*GkTN> zTgQN@Z$KI5TLkYxL?7Ugr}F-P9}lK{RMkbTbKQUOxQ^ZvD`1$wT24i=W)vK98zQ#E zyik4byx1CI;PZb_^-l*ur*f@48ISYLhb1b;iZ!wP*KD}VX!z@6|1}kV6Fh(9s3&9` zcHQq|new8_0>d37rK^M2L)4>a48C`tNw*Mf=}X<6Ca}F<4&aH?CQ&!W{@@Rt2RW@P z*Q@M_$6FXJAZbz@%-wdtcL4-3kIt@KY*?g50<(HlTv)TH73Q0tr1eHK-XYT0bVxUA zmnR#XooeRnFSyr)5;-CWWdk#51{1ZqJ#MvHy<;|c6S?YpOnlCg^!s9kt#0YwDwf8_ zYm<_g;Rkh+ZeimJzqLHu`=Po&?#ZS*=ujiWJJhd}i!4Gq9 zSO4n|jM&Jmg1oR|%^Z7)CAOc1&j=pLrQ-6EMgSc4<*EYs6#b)@CeQ$G5zlh6Y)dT6ik5PTOpD)YVlpwx>G!pl|sPAv_wUv@DUcN zDT~VgA6|CQ((_zKjQu1&H9feaxGXl-FA{ZDe5#G2Hfl6vUxy&sN@xkn3qBt-2cHez zUWnq;g!e884iDV>57>$-{i>}p%n6r>T<-^A4P)p(CNu@4BjlQN06|;mWJ95!iC=j= z28iG*UaHW$bOsmL7Pk!A6GAFa3Ey4wFsEXEA})t{xMKi8dB0JN8QLe|Bjs(%P4c}$ z_Dv87Hz06=8&36lC|7oi ztas56j-%ng5fP%khVb{Y)ba`!Ae(M2rT6`5LLr-_c`mD&P)2GEqZ^b~DNhyCs6>Pf z|8;223&hO=B)sETE&7EYvUx+|&^ZApEr`eEeYc69_y;hoym-`+q~a|Z4ki}StgN`< zPV!O9Z)$$?Kze2E!QMzm%?%xo%eAnez-aE@Lnw1qCQ>6po6iQ(wH>WY?30+8px!}9 zoNttIia5flkr;pIXaxV2i7SdU6-0z&mgDqBV|noCnVt&4;vGWN2w)r=uikh3@Q>^L z)CG8Q^pAZ|s{+D8ytHgvmySPRh$vq!=UbrljhPqzqTEVkwbX;#5@l2dqTvM=N%~wj zgDW3DRcd)2DaS*A(=zUg{2uY!9sZlQ>{74h2|Z)y^tk(~Il;2iyE7 za)H5Qzc*8sd?}ZPr$5ym$;O5eDJ>*(F7m~zCL1Id-co(JWk=T?%v2D`tAD?;oG#l- zulyvomydJBCmAg|N|v;PH8%&`O*z^wMMn>)rjPx6K`PkBIEl~DFQ}d(8ZTqkg;745 zDLTzV7l4gV5Je`n9tRJ>B4U>GA}#R{VGNf=$}F2Gu*rdPugf70eRmkr9gFgyvOKkm9xI}j2FfRI=l*~(v=(Yss`I0{D5*PUi2%nfC zeNWcHr-3{xkB!!_z6Jri4GNB!atZChSe?m7kvLTGGxS}ypPX113;;z-NnZUg_wEC4 z2B1}qOm|PO(y--JUoYZiAbluD5nv)OG}1A`U(szaGsVGFgj(&DbUq<@ufb8CmA@G4 zh9S0k3MBvp*V@7fSkh(s``Ay2|1%8IX^g-J90IrD#O;_>AySo&psMhkh?r|{iSb@~ z6%;zJFflqcA~_|+T%?Zx!6cAGzNd}B`7jm5;%4H^{7BK`t~})BAt9S}ox#L~F0u%_ zXY1V1Rd`7OW|Tk#uV=L|b#j>p4+SF$FkoRya*zL!clw7z>$-cFMZvWtH)}q4d~?NhO7N zN@%HOr~@h_&QiIN@Gk(hTYtAkUh`s!$S~c@A&sQUg@9DnjdNgn5@=}p^bY-GubUAm z2{9q%_(loE_7AqX0Z;E6@c?0uUT>cYlHQ6~Wqfwy_GaFU*j<((F38Xc z8@1O#4dRXpvFd*uloGmQr4~MoxNq?&mQfJa<)tplmX(js$@|!{bU}$Yzl!k-5nyn+ zpv!L$#kP&C+!X#q5AeZbef~KSgq~LxTV3~|8WDK3a*-)`eVIz(%5?usr3H`~X26)= zL);UR8&|jR@<$pn>b)*gmE2CXctWZz3wAEn2AbP*u+-Ls2s9W0229{19-V^C# zQ?UmOv+0!t?C%E}Qg<%XK0Jj?D&{(az$|etQcZDF&kzC^eHv6}GM`X^7+oiEVhM$c z9>@f-bG@uI?A)=&pOu(w4Uw*g#XbqP8jXAao=4O*#Srf7ZE^o(yp)cEG;!YIwT62X^bHs?YoOCYZWszh-V#}m59 z2uH1T>fU>B|LL6Ai9iH>7X{2&=8hdtQ7_DiF1MM~TG!fA1_#aSGmVCRMn4}u4UBx1yE6{Gra#`?vM zsis8_6V@#rCi);T;7&a5DD6ltCHxyf^tgf=XPafcW{5TR{7s%-=#0AVXCiAlWhlFd znDc*oKm!R*zRVLwG7}1y!t?k$#6o3+aAhI#NE8?`6M?Q<3*ZYmg%Uj+o~VQ@h< zfge}R(WD0@fe!;!-m%6o*)6Bz?)=vh2&XOq4mf51&L9>J6NB_JpUA`)Fr>eFIAT5s z17V()8(@G*WW9Zck=AI^OYK=E%Y#?tfX_%Q0c1apk&@h~9tr7ma38D&!;Wbw9En<;?-% zqebC~IEJw3xFi_>vA!AsTL*EGWf5FxNc<99h_G_@E8E7gsh@}(dZKwEX)FVp(elTn zcLTn8W^*V*n*|ryD=pv<{tfQHDVJCkof*vY*RF#gx%R{?S&|I1YMMO>Bh>R7CCU~v zF_3$wE5<6#645JP~4f<`j4X< z*UXtjxuft;ITm>i^+{*dG(BO`FcvDH&YI~t8C0BrRB{9UD$q<0UrW?{bp(&c+6^LS z8A;dRzQ6#sHOOYatBAr#yF3P)|ISEVsawXN@vW`n1OmcT8nsz}*3xb?jI_H3@W%!B z$+5pU$kqI*1NKDAvcLK%ilv7O9qawvkw zD@-orQ1!8hhMSgk1mz3E@<~hf)rL788}8hHnu#ARFq+Wp;@I6Aq|O-@^mBVAQJ>Li z_pOImmc_as%$t=6>2&Op%W?1-KNUUSpF1+axQbWhas-MizkIk3Gehe3BuL0Rfs}=i z)2FDw41Y`h#RW?pgb#XmGC)I|5YrpkQfc!&9}xn>F(-gpMHMvzWqf45Qnw_g&z^Q- z&_SS8Z?2rG=4V zyN9y`+27Y$uE|ttg9Zqqwu%d7b^L7DQhNeb3JgN>)be=0`%+zR26ISoet}bHNh0k%l*Y8VGzNhyE>pJ4<*YhglB|<)n zRW}7udIZb)KI!-|R~HS!w1l`s3apkRW6v$3m$}l&;%V!R%#P73bj{U6-f{?$&=In@ zGO5Yux2@=%VXtB+yH3W5ljFHf<__+a&AT@L98yt4KLRoGMIA&wbGbpT4ToDOT`(TA zE5NGDAK4fyZJpQL9j(ZtyR`#8NQgZDk98!NrHfmp5?$dtDv9B03fq-Eb$b8?5r<7E z4mA!pqiP6c%`@eQe8VBkM`VPg5xn`{+QF=f(0y#xqy)54!QKisw2!bvD^_DdhQq)S zuC~#|(M&Gwc6f^E9lfPhk3>X>O1fBB%d+wDhnz zbDpR5j0$@6LfE8BZ+5Lu0mOOdX2+v@u#Hg>OtDPS|ANw3kb78pLm&IdINr@uQ9gar zRL-sD!G#<)>ckTe1l;H-=`(Z8$*=wh%!rUzsfAqe z<<-VDe4?JYa(oy};DC(T#oR0FTI-&5Ok6)=ckpwrO|CkCA-0uc52f{CzhzK@)=0Vr*$a~uU z(Suw$vvkG0D?+{#1H!8SMsqxrXT7y7b>vnmY9vKUfh3Oj6)&zO6oW6{1IdZQEYf&b zZ?>5UwLsUUM2%r?2J)gs8RgkpRJQ2?B=ABaR40ettat2a6NF> zoh)e1#IIu?NUbg;RI9q$Y?d0T&3q1Z>(`^t%&Udy(e*O1YTC6sVNA~%sq#`C6<$y;l5R!ljIk3(w53{da@Z!?7RHc`WCZiZ&+uVfZ1hGDMZQF0QVj2I?QI)Yz**FRAK(^l;_F{eQ@zyaxAeVBCp z5w+cX6Et_rlqJbpI{BcLVpFilr}zYOA%2 zn;XMV%&!!1Q2aBs>6J-tRNHAE5vb}YRP28wagG1e^OO0b79-S;c0*d~dYEyB>5)&JDGr?(vP zeKchvHZlnHllDj91X(r4XQY2f!!Ie9bx-kTo!aq}WUSW`B^~1#f;>%_$d4G!JE+;! zHQe;_VI{3mlw*38mUaYhFX|Ybsa%-WPVGpc}`jm ziZ;TI9h6PQ;|fg<6^-3&1GGxtH*x5= z4uMGsR1a+H$*r(p&3MiPCRSMveL{+*2(4nqb{QaP5*$sB273r&5R8x?F$||(aG+Q8 ze$!S6J}50?o>6?{2}Jh(h{6ub!iW$`%4O9ZqC^oHh`j>0F{9d$SC%&w4y^qm+|?r0 zGtPz*_q_SWEU|Yryh&3U)Jy7PVq!A)=17K$mnR%DbIc^j8u`65w*L23(;iqg51Zq9 z?jW=--<83QokW>vnV;)X#jHB`K7b65DV;12HJP=jl=V&GV^Jx+FO-y85u?K0s80uR zQKPl)(ZA!{zip;-uz2m_RiHIBs$xGNAYM2EQF|V9BWT=4K7{}w{N2iQw?9>NC3Ihu)G!ZTR3}8Xy^F`DhEl3SZUnT$xc=($VEggR*K`|nn zGea+ZHh}oI8amcC8Y;~7l?#VM*onG*(**0K+3?HzP@}gZts(_6J@M_$3IBCUKz2m^ z*NE}DLmA^07|nO{4a+LOacYdi?HwxKSLfnGnMQrWWqZEjzJ@YoP!bOQ2!~zq=$-06 z|J56)?k1@k&r$PkHo{JVI$VX$86_gSY-vk?V9h<|cYmvpCrqnkY$%@ZaVHXjssrv$ z%sx~Yi@GMGQH;1aMvPKCgU)4rPgNGyzrfHL)i8ie9UdzR@IrUU%Gx?}W_TL~iQuv@ zmavLsjX(MTuSPEeiS}SrSVqQQ&F)-M47govW@KCX)oQ;2oimK~XOxF{k-pwu`#>r; zmvf@mXH+5n^_5Knd7Fef@sd&^K2s<5btnq$%}C(*p`44+I($|2X*4BQDNM?J{jfL= z$b%mrA>$0OQgd`$dVK*ACPg#}p4qF;Kzc?=Red%tt6&uh^M=ho$KqH5=@(k;5s~Cu zk^AYJJn?PSZf53;Ka<^YBQRbls7RP$25X@R-_>%bw4@mO+P*h`$tW}`j)@vwq`{X) za!d04K-o>Q$AE2)NkJpt@Ckl{%(h$)TPP#aBEH$5G78-Jvex8uJB=Q1WO_NKvh>J9 zpon%!!E(F)A5CW&5LMTFQ}E@@CgI);)I>24$iX{EcQLApgiy1P>ZBn3ev z6pa`5Ksdd-v(rXdi7#;aUj?@bd zp<58rWlwud!H-lm`l>-%MEN71lGtd1jU7IyE<>f}EP)#N0869S`w`^NpjjXj6AQm#rS# z=qBWJWd3*p8ZvT3Z2EP@gSJtl3K_W9kpylAl?EL}E%lbfzW9l%H1B+)Qa=P0^H;vu zm|$|{!&+I?+w#70wNCbktz#+8!9fnG{UpW0UHN^4`iztLHql!ug3*9?f83pXipj$X z{627HB`V|{Bh}%1UPc?v|NDt(&^Lx!{56@5Y<3g^W}o{fp7RY+&DT)klUd}z_8lwF zP&eaU9i&X2ZskERL2{XAz^qI*u3xKYBh;Ni#*glmVdNc%7*gE8)nAqCR=)=u2w?lC z$Zku)qr5udVT&YkhHH$lJxVHO*ra+TAG*AWa$MG#AdaDuCDN7OSfjNv8)5K>juB%t zSE}0?&aU}nZhTk7-O8vrK?(W&Bw{P-5e7FNY>DJGqf|E5uEq+x$1KEc0HOBbqofC_ zmUpv0qJpE)GJmwpASW1D=n@8s6I+SNvaBXFQ*s=_Q@kner#Xtuk@O?K%1kIj`JW^a zy&Fz{xGTx%lO!_+sU^~Ij(O1u$0JZBq~?s#d1=5m!^}hjJN9NNcdSo9V}|ch>L;e? zqQF6qB7@b|dug7@*%M*c^S)F9AM9pXkx0*@WU!H@*?V% zDF1*T+qrI#Wg=-gIHE4k4nQH7&^^o^r?vPD#SGa2GgKVvI{@vpfy zCT7qdQNjj_q2SDEb|cR5+|fEKjtE5v|KTk63X2a_xrsy0Q9Rry(}d$N^7Aj63iY1F z5vqxd|6#E+fsE^zJ^e!3Ic^Zp2pIUF#fo~^ykVjXS}ckl%`4i^5QW<ogFtueUFCQ z$-f$__ljqKcO5DXW?X1bwPQjieno6fzFipMX3JcvF_-n_5ypR}Xlf(Va+ox`#bFYq zg6yAv3b;RtAB!1iOTmqeSy6S$e?ck}|RI){PpaP4&5AULCx4L7#5 zj%?yOb8sRYWB=P>0}`sD#Ws;1+$0m5Mjv&fCPd~-sPrzVlCI2XXsS$}2@ zQrx;_D`sz>TA|uFbVnMeQI4k-#VjPX(q-znz+Rik*BhOk0Qoh~6Ge2cT2HiRf{u^y ze{wgveOF*Ki9QX8_iD>!vtp5ssRSXMfu$q=6w|0Y+OqJ*Iq!=cV0RwvY=sKpQcc9( zz-oL?P6AZ#_;53;6~O8v;*%+O^HuUlYtQF*F1yt_2xPk%f8i~RulI&r$Jxp+34Um^+x4C2lsD41*RH!7UCs4Sxk3#|l<-*& zWq8uM+pE_&HQZT-!_<62zu|^I!4v}>i|~0v#qTG7EsiqZ$W%wM?Aqg zmikeySeH0pihx86b2{JUR3Ws-&YNN}H zaV8gFmw+U5vO*8lqY}zwgcPtJX;wPj_{M;1NWu)uWaF*70{Ig5LYt=})Wc)Lni&Rr z8UhCf7z`eei3}vn0#AG+S%KOiFoRFY$lJd_TrHGI9x33qShTL!1#}p{;pe7rE>h<1 zXwS&0-p70TK7-ugvXcnG0t4bwfnd7J2?(Xq5o6Da?zbxI7L7h2meF=3r!+&xk1LgF zu5B-t=$-&E*U?Lt9?$~~7)`O-3!RHwb{bnV+&j+NNLjnSXI zpcXjlHN0j7aa54f{qI=C>ytEA$!%dklZ>)5(6j8AZ59gR`)Q}xKT7nCL8!$9G0`yY;1Nwn-v|B=emH7*^Il-s*=KF_u;+i?nR1(BB(;78l#ycB z*fLclh7h4a*^`{g@Rvie)DFr=w^MZZ<3Hah_ahd~=yQR?&1N_6$t1lY0?uWWRwcB{ za6r`aAR0zLp7q4{bU6T2XRGFZL(;X?IKdfo;(Q&i`AYqlM8O22)Ja-l6EOA~7E31p z*w_a(M*-%0HU&+;0hp+9Vhk98sael~@QmCB)$kHYL<9G}0A;i3t}Cdz03?ntPanAe zN%fzci2IZ?%pV4(A_jFnRsq0=GoZ+%^=`6Sy zrYk!o=_c+#{odFLbX#;3Vhrd{pjNFr5vl}c7M2pW!5;ed25goM8Ya2oK4;wbpJ0(4 zgVw3F&!eOPdRNemXt&Mv89FNhD21rj(N_w8;$-3{5@zYB!-1T%OVi~($k~)InU)^< zf%@}rvL=t8S`f3%3ut#}mWDwAK56gWk5?c%Dn>&mF;ZG#dIqO4(#xm69aYUoDj-kd zb*RR#Ci}#sb;aV|(3>hZoj*Zh^Z+xJ9rYmDp!T+ad0(j2_oTxspe^=m`Uc5*A--Kz zIswmM45j*crzZw75f85AM-$_dwM?88>@kM z3nv7nt;4`DoK@#QValQeaABHLtxXfJ_5O{H`;m)lzkE1 zhok0;3*g4N>$P0~O;@KgMC<{C`40E~cuQ))yDQL2P5T+D5G|z;`0zW@n`iXEy@8{ln_MzI@6}hE zq2L>jJ=(BK3*?V5A&tqDWUggIFnX(inN z9|#NB&a}1hD*t4xXipvG4z%uNN7~=tp&H@JNW~roQsRX^aFx&Xmp<>l!Al*BAP!Tx zrq8KzW$rx;7J|CQZBQvi*hHt`-K!PP*T_UsxVLFRthpb9SLkK|XLSq1KK68QsvNJ? z`Qf+iJL$Ak=pEHm9-%lsrm{PGSlGof@o0+AFMv(1u9(N+42X4IfqHaDzk`~EcMOY! z`B0e$a1`D!Pb$TfZoG+g&=WByJ3V;;%);j)pkQu){ z{(r(jX|(iHVB4^>0%D>RK4w>N1p5(u0yX%FyNa!Bsdw47bcW>~n_AIg%&Z_Pwjoev z-O`c4rP_=F@|JM%b@YQ86Vq20){6SQpf|JvzKzx9UScRCVEmO|ZvyC87wvNrWvYh) zgaXlNYl?Mk7m`WbY$`In-=nMbY751FRo4G&D$7!@BhoNduS+D@1nTKnz@TdQi<2uR z;}}J8tXp0-D2uAb7sq;sx5Mn)sUJ7he(x3TZnL>mNa*N?+;Ksjk*l@)T*gW4=fQ_w zILB^uZgm5NL%Ylvzy+4@5~z!t@$9^tYAd4n&OJ%%ed+)BffF(*rUy7SZ06Yy@UoV* znPqrZtwuq2rqVwmaT!PjEw)m@&R{Cj?>%Z@$o2OpXikO+jjjcyQF}G!G3x*}=G}tU zFl_Y9`JWwMytg%mAofLw1h<2X?K`4vl6Tsr^VGQ4z-3VPvic|2CVB0XzIdxTLTY{{ zqVZH2f&pRsBxnVp2Z5Hy;`nVS>64o9GgrcM=^7F`?{)N((}Ln3ED?rcs~nPSLSbfM z;&dyYU0-7<0XJZSVb*(aW_8I0u8>t)tjxB=)XLev{lSV%xRWNevcuFu($=4BAvpzs?AcL01n!@*#QqP7BtAhI<2e64eY?9@= zV33bqL=UEDY4ASvixmoH$D*$^C*ye>GkRN49DBJz&$>KRohVCk6TBI+5x~!QttGg> zz|*q5^#U$)oTE0#t)U#k4`Dp3I54bfQ||Ct1trjm%q+sq@nzp>8qWYb6eCwb7Sq+n zwX7m+A8v?wD2SX7t5X!t(KV;zQ*}Xgx1mfOC)0%%H`!pz#}c zll;{@JhzNV?#@%Kg>p?sfwUP-fcsl~+NRR`QGQD6y#7B|03|w?(xb%JSHB;Q>ki5P zjwppkEfa5yhwg)|_fdBcCh{ElY^<=Eku-3(tiy^htXDiJ**CdfW++gwS#NM=(}I9MYkw+q zo)w&=EC?y3s2H*{iMo`i&KWj_=fQJ$SIB)UE`z$phfd2@Oez4+TJuOyncQX|R&pKg zNP(?i!=Ql5(AXGQAC2Btx9GLab_*|~@YXm(;fN&XEI+Kc0td2QWn>E`VF6Udaz*xt z<%3v&f@eEW!uxRD6+JO-ZsrGrjBG54g2;=EUYt_m#LaHt+EcvHIb?>!pjFO1IUDkt z+@^G-umbtO``ZILQIy);#b@Euk~n%}L>?U%+i#~$$u`u%M&EkTV&__-;fOj$*H49F z_Zdobk|;KNhTJI5G;coR?@YBwsY>tym!{21U`Zc*={6$qAdI#@TpOjXB7idmT3d5e z)t?o^q>_j<$a7ewk_RA_+gr!f{)b~3#f(aOh{VIe-tbWF#RjG;h!r_hRwNyAXI?rC zOQlo660S~12}74!2e4H4mUp8x&NIbPwUSD}vi5+!mzd`}AjIWe2g$est4QoyRdqEB zhV1Mp_F+$lG$B&P%gYwXwsNR03zzH27wbna1HA@r zwH;C5uQmWHQ}}(y4}SppUrrQ;#;4{kUCsk(*DGyn1`Of*U02TOoX@!bf_7L7(AWEk zd1u9yQn}OK#hDTkZ}JHB-K!nmpc=(WALH8yQTs%e6eR^P16-R8J|{LWG@F4&KC_u{ zvXlO4pJ-`4S>`;6{s^|;oppWV4)0n&(1jvhB<3)mC0yze^$dO9FJR1#r=>RtxJyx< zIDN_l?u5qO2S0%X=%>Who`B++Z>ZMn!HXwz|E!S1QR4d!-cIkHg0z9>JFQxJ1Pna~ zSF34~Hupo@E=Q3^u^alI!4_@iC|NV$Vu!#}^SFT;bOEs#tV)+3m63jjR<5wU>7t0* z>2k&ttUw0@G7$}K7PUKDmXOM&^)+%*|BQvuG7OT14D z$(4@F;hJc4-9H*>B*STtdx%fX>6aS-dD{khlkHGvRz@{x6L|+HU{qwefM!_5tNmhTKtOt z8<7866*OTG;CA0f$$|J0IGI-=uGE$_pg@9)IKy+LDcjx$A|?&R^5TN(yV&TqI!&P0 z{sPkLfD{qeS-~aiUd2L zT`FhrJ;8l9s}%BYA^HL2!JR8gWWFF5G6JrWK1``VU6odCkRilX;UWI7^=eXR0p2}p;O`3Ga5$&7+eJ@52e=ucNRcv&Byg_- zMU5bgg$Hm7C#pQa_P*MuK)zsPC3)SFsPwhadLxpU(dg>zH>r0Ac-(2?zx(UnK!gRBRG(JgjA@ zR2sJnQzbv?H0EVU?5aAAMI+W=Vf~cDDqxw!6 z5aMInZYbrxBXcJ~rvofn>vhV9FTiXu)7S1f)s*8=&v^|K{9rq=1E+&g6~AkHi8h z=Z3!jpypt0gfvGoP3Yl>VAI=n$p0S|h<3FAvZ?LSp)c+O#m&CP7*EGxu$#6@aFkRr z=J)2cSHA##_gnnqvqdv*rr!EAnJ2tGR|M)iq(8prp9683UeZDJ7r>sPms&F#%Q9;X z(Nlap6jJMQ^_IDFqhO-=gyMCCvi7klFzjd_>a2i7eaJKJE`cx)RA;!A4U7(jGSj4{ zQq@cgkC-Gg#z3T2ot4sf5i%lt*)58!&LuYp0!u<9S_gJ0Qh4-UI}8;eF$8H)K?9YX z%N{@usDQuH{tCCAX2O_+-D*u7BSmU!DsOGo_g7Wg9!NCI70~)3fnw-0(727`(@Ct* z$f0I%gCMHn8(CTR`%%8&Wu}iYAa%_z5ZumfX&M3%n7JI#W= zC-1B=K4fjs@ATl!_;T}8krt3IGZ&MpmFIB zgEHVBXR|mm1RR`~8<4+iOZ_kj9Nbrz)LsAm8O)GU+-`VA#9%5r@xicAvjko^b#Sm$QR#40TvO=fKeT~~O3 zQr2r>;{1SZki44T!HN(7&&okw5F|PT8~T_rh-MsSe_XB3zzIWp0Kj1dVyAZup7uV_ z$PYxr<%2OD#(^;WyfT$D`648rs*bRm-YVx9)?YCKkcou0mY0Csk$qqk&678^T#Gcp{(v(CJJ)oWe_Z89;x%@e;ah|SH zVt_Ls{6X6FQco5MD%OTQR>6Tr^AfMPmYbX$2e2V&CuBWNu&sE9c`wK=b^m5w#BD=v zq0U+*hVuKI2vEHR6GUwv@WCJ?(XJ{@BxIeS!ePDzzQd&*bvY14LmT-DsBQl`$#n2F zmk;zl>IuRy2K)L7V8zksQZ?+e5do8RglB6%#zDbKMym7JpePK)_Hdk$dai2+kzVdv+fDSP$DF#dP_>%WWKH-V$* zzhMAc2lqnXDj~7V)3XI$-fb&3ivx@a4q|!}RY}9kFG(UQ{b*63?->NVnEK&DqZI(3 z5WStG5uku0LjUD4;IJ;VfVzP(T_G1Xw~hX}+^QjAMCiLQbbfn$ zfSMyPEUf|fH}YmcZ3cOYn=AhTM%tj5(Xug57;VpkuBtyX{$fffB|6VF z{}-?4US;WzSHWpE36$jH0QZgT=yBM}WjqAY`4TdL2=QBlS!=}p1kVUqd7Y;V<>T*< zG5G<0hd4sYPl;|HvisG&>t{2$@7xz@s_QuP%N?vr(YB>d;GowJ5clX#52Iawz-m|v zqV{T#=P1at62q3{*MSz6SHfXTYbb#(Z`Irbh(hUMu6hpv_?nzeqemK-wlQ?Gm?@0* z59zllLYWzD|Hp++(lD(46g-R!TMwHc7L zue5@lNL-ZP>T#`MU{BGcA~n!~IQZ|?HQTpG2)q1cykvlm>2>A-+`p$)26I`jwY9); zrjJDX&8#~D9OAUg-fp^7KmSfMN|o`9@d6)z2^Y^8u>Fcbz<1!>>{y$cA;#H?FCb=l zBl9GAbsxm?M@HYffbU8+t5SI!a3#QMZNCe+az!y2{KljJdNuS9?DEE-l*|<(%4zVF z>^GpGrBK#IqUtIWXw$A5VO7+lmGy- z;q?OWwxTn^#bwbrCJJOD+JJWbKJPzGXeJ2Y0Beu29R*ke1G$aPDPZMvJTeD6q~NmC zdDW;H)4t5@rnj7Vr}w9mwZ_Czoob_{-5B7w`~{pJzq*wi6oM4d`WPBI_tOa{s?F~wLp-;Ro8xe`zFx`tYQd_A^5Ei zNB~v<)7}^W1nUH1tHG^hkRre>c>#q%)L5CL*6GGJ0S#+@2ag#MOV7-XI6ysvnI;_6 zjb@(@--0OsMRO|+_Q_Wuy%GpmCv5o77XeJ8Z6Fron@q&sai=%$i5pSTI@)lRz!)_V zDy9Ph)V){9n8>_>3FqU@(RiYD80`HzPCxky%zQZ`K>h+Q>%!a2OUUHKW$bEjU^su;gF)B= zO%?%UGXa#!+4E|xkzDDYAA+iZSwMS8d>z;UUg#tjY2@*cRF?vmnw)2x#HJ+No7e=Z z#e)014;gI@ECCFR1=doC{l;pDelcGf!?E`q0ynXEDj>i80woT-l6D$e5C&hQupF5r zhGv7(FI34Liqr;7Yp#R%w|Bj~K=@qc76wAnM9CiWJ!q~Agz+xg)@Fbw#q|KCx^3V><7F@-4*s|V1+U`B+N+ewH z$X4R3ZU7G;;~|)zFWGwTlYY88Hx9wFZw=^tIM^&xUMhTqr|^af3Fgz+0(n?i_ICS| z7e4$nQC~DzGg6`Rn_{6rP=N#w4&l=*9s2PR&8^@TFE)GRG1LA`5e8*~eN&aeI5kWJ zmSXO+(5V!_v8Cz&Ow+gfpZ2^0z{Pd_f#7oS8Z{dlcOyAZq=MhR|pe0oeEI>DT4K`Fb@JM2>pEHBs3R%V_8JH3ZW3j8u*cq*!eotlmMKfihCyyfn z7n211RfyiN|K=Jj5W<#?`6|P9h#xk+thwO=_x?tFFx>eUU^3bu{=gdP{GLo0nw4P3 zi$_dJKKF=^4ejnvgZiQ$5ArjM%TnE7?hdf*gyNLN#(<*h=sYm!t&I`c*}kMtXSt`l zUc^kT3P{2EWK0y$DKr>!-LA%-r(Z$+_YoHubTh36rW>X39)oSZ6b(hvWNiYgBo>g$G39Fq+~uzV#C<%)jw2|pb(w*$8lVV*nahBoQ>5JtdwURll?H3IhOyfk)FgCSCH>BxH-kz^gqYX_ zLl|x0YFT#Rxhe==04uzn-&lm(X+^vwsfBQ)Pm;rq!Le>uj#zKDLJK+%mYSS*0mzouh!<etC&o3?RG!t?6zNrIN9^q?I!A>N+ak{1uov({L6ezIesIE*Boe z6+ER`qh5q=a!8GN}!w_sTRIVATbOqEXK?y~L+|D79*h}kwOv1U|;%y-4om=bPDQiU-BBH$5mbZwEhl9kvno09hOKbeU~V- zBs&_jlRI+~WE(uA&X`4oBB>J|z1!z(eDor6=k_OF+ zqFIgtN?C+DH^G#?DS1w?JLuIXpfX~cR zwliK!;+c`(PI7LeXvXOP@K0CZ>K@3Fe+UQ2G-7lzo?<$|PGqjC9^Rnpsz2zcL%1~~ z5QSFaaqKbRis0v=k#V_MWhozGj;M|}6xWj;S*GWdm_9xUrHMh}Z@^GXBwjam2PP$h`nz14;0QAKm*G#|$H(LkabZVPPObLA z=GgP2TiW+*&z?|HX!y;>Re-IM5-hVFu+K)iasK{1_W<6S#q=%E5N{;VNLnPyx1@06 z&+>IWjM7EDDo~*`#~h3)l2^++5rcJvur)LF;>KjkvLI^#;&ibkO^4`BW-tBeezBsizOpW8fTXaNGCWqK9Pq@9YIm3pQF=~t&e>znU=2WlS&ihCtbz_1-RsADc{2ac4YcAzFw zGhd%MdwV|lX*)keF_=g13g4QBa+Ke9qeKX}br(IDZWRJAl@Lc*_%sb`GjX8umQjWt&cOcxDMMdmKw<_z zt;0UtzVO<$FG;+{t$%H+U@lQ2k|Nj3ssh&I;-L|#%g~@)6ijG5n(@|)4*6(3MG`ds zRUc9-FeqoC5*dTSLPh?sxYRFsaKDQYGEta}h6eVbC^^F_UBXjE-wen{k?Qh}f)EXL z)|V7g_3L)IoseFwqQYezAECw3VTF!af;Ng$kV>Ohf@6|nlgKkMN~5RaF-r%Bre+r; zHUyHu@vLW_#J}{ABgW5GiwT5cc@ndEFgwFuHSo+w05L z3`4$dppOT-1R?vcTK7NCG+liDm}`?|KXX2|bKysdQhX4b@y-`O;IAdM=l!xo3_HJq zO;U3103QdgzyRY?8aq-hu?kAI$;?Clh@pS)ERpWYRLOLS&dA9W0$**!mV;`&^2;ZjX&yI*%T!t@H9VZU~x8)H@g079F)Iq;FROVp+KbKo~s?tM{- z?{6K$RmV%H`E2JtAufD36m3Wpc&GLN;Ot54f_{%}Wp#T!yr?lxKQ$ZMfPd`Ejxece zMLYF3-2$S&Y5)>fqQHK?u$b$Y@pbtssnz;J>~N!Q@@fx-iCNXz!iq)}#&^q7!g2n+ z9aH=-nrID-qly*yzTnIg5wYapkQzL%9n|W@#rs3}`doJG@j#`MV7HTCY`V`%g4=V0 zyO}(9LxxlA7gP;0n(?dbL+~re@>YIwpbqZ}bY+iq4eYU?!VXsdeH1^LD89zRg!SVG z0rreFC||2(eR!;5HZ1jf>GmS;R*8bA`}(R(^7^Mo?&7!w$G=6&jK*6_>KFGB9y*ON z^eW}oz+jmy|9}DOnrJ{{2^kMofX@>JQotgZ|KK7K9jSY>DnIh2irzV>iM% z!N`XJn114~xAo{GSyY3`QwEwR22un}-eQv$BHw@CiztneK69~~{^)U0v!x&qBw&9e z$rodO2FIMpeHWWxkj_jznemzjb%M2AE1T~U=MqrFXAXm}xlK!qxc8mVEh}iyYhc0k zNbB2!@Tqj7`n+zLxWf%nAE4I0lQmjpc*^N4n_h z#KtN^$!*3jeHelTRYqeFf*~!zpS-LAx0Lw^q=`ANR%FMYH6og%gQQXsQ0hXBoV{VN zQeLo>sdn5HD6NDQbZ%B|j3v#pmnTtovXkMpvU5J|6UTHp^0_qk9Rr+hVNB1Z6e=y_ zsM{~$WQpPSNniPPKt>~UeQ56~<7$q~zvf@%8+B<~vSD{f(Z2>R0j1J^y^#mm`cE{8 zU~szjADVp_*rsUNYa>G7GBOc0QsxepL$MdlMDK3`8D!Ls=5Q#ARDX0&NIpP$0M+tCpWICF-~ZiEm7NMznNjRy98;Fmqoei ziafSuS?A2yMKiqKe5lyPpvC4M#+zT{CgxvloLM_hI;Vr}7yWI5S4+Wk%7KX&P7=xv z6vhQDUB+-kaF?k*MVF%0hx6*Us{WJ9!_g7nZf$JJgqkgSD|S0Wkk7*W@rO#LvBmpp z{A(t}91J*bB(i@1iJS_}gDSHA*-yPgTr!4EjZbk{3ha~n9`{QRbvJ=l^zA~CT;8l8 zuah*V>XMeYTsVpId20wPNR&Rmx`76xjRGQ~}`TSi;`dD?# zMs)EsNBmTGyw10zJAFIh=CiLbJ0ou@`?@7Qiw)i;JcsXL&ht>vR+E+5XJY);OUMc? z_L`pvHjHsZB~$jHoXN}k{ou0I{TwNRSoZKQ&+FAJXlKGR-ko%8B$aB!nA6I@x{B4Y zwF;&Q6oMD^@Z?-)Jzl&JP}4V~Tq#YOL!iGC>frq!xC7R`txo%H15Yf;Y-5 zY7E2J%Nq|f8ZkfUD)lD5m+KC#1>lHlvREb|ltCQIeDqBER$7XT-85_CPQY8a!^bD@ zW|J`6q6DAD$`y;S?A>OiXc0R~xDzKf^C+g%vxjT|!A^PVyQYd%Vys~H6P}nNb7>ud zW)7TiBl2VB*m2uF#R|KKj=sp1d$bytejknx;0w)s!tmwvJHFfW%@meMRJRLJ>Di|hpWpXg^jVtz% zMoG&u9{&08`f+ACsAXNnhEJ$IKs+JR)1dz(2nV{8na?-Lo{BX29z*#-#QDeU(&8 z0kNyiaU(XZ}I&@CVeCCp{mrAH{Leb@j;oAtRr3YbbM2V z{C>r1PgLb1i~!$^eM7Q2QGNwg>j|+uwTh@3J1$bkMO8wOl!j#nrg7ACo}V?@<9hQ# zL}jINo7fztKSu}aeAC|D!{69{6B)?DtUBwyS#pNi7=f18zH4GIZ1E9j`~3X~Ib5Id zZovo@o3f)^l#%ssqSs*15rZ&L#5g3A*C7 zIB>ELZ>aNyFG16TirvT92wvh|BKy0hpI{Vci4!M$h0{vKw|Yb=N40n}RBpxa(-u3B zAxX@Y4?&k8id@Ij*i`uFR+clldurmD88cG|l%n1i6Y`GVnlA}@6Ak4n!WWJRr{~Ga z5*5Xg#@3!T(q`350!{3@Ps+6{KXTrFtnl5TYQ90B7LrS$4%v{%r~a)O?+|&d)NZh^ zcm86;l-(CC-V)dNDRwiV?!Q6G-e{g*m#{TqWffP*_E=3Wm%&M2@_W8izB2r{G8)v| z6^`;qC@fYz7u0n5ZC$@|HyZW}=OLSamLE_AK7Fj%*Tx@z`7aucfP)ZSP1J7K-xKt6 zUsn*`*CB)}EW71Lh>T~*2!nn5-7rIJpni`LlK9*!IcqAhJxW0~x1{-lgBCshW$7LBFQSpx9)lv6g&&$@C@Za z{+cx6kI*N~5`@W~C$~>uIGyuu60eJE?fnCdtdH|RpS=e_;wpnvArKxzjsS zrO-j=F@;)@7rKzjgGQZa*Gf4ZtB6E(v7oZ)zZ|LsM2UeP?Jy0lwRQwMHk=B48W|4C-g2|DI<-gd2Sj zy5}nVVp8bYOMq-*(QfSO$g;tjBSep5EtcXl7BH44T)wQ*OtzI1OWPjsqScXvL(N(b z3GHmT?q=EE#4plS1AcIq9Dsh#yk92p@sVY8b-a5VGq+T4fv&OVoK>}MC3C}O@cQ6Z z2tz(ciVPV{6qESQ94Y#*7eN2Z@<3nzdm)Hz*esY$d8Sg?HvvsvnYaTAR!0RQzeUsc zB)I_vlMN~B6IDs@Lq8;f6f4Q^E&*jS=5w1fn&=M!(Q)mr zl!c^@S`pw^NWyTglasKuLI2q1Y*hVK-A!^l^*lw;r0^H6*7uOXfN2wRjt+h9ip&Xo zYd;({VJdfI%UFBHt=qIbrCKlg+WFAKx;WwG@|uRHU!PkR-yq8QxXZr}OWwH6I0wUm zUJ}!Pnr?x=yd#8x-uQct*&Cbyb>OYqx0JACovAC_c|PlE#&knduH>H`GmcB+IoyFH zLQhiXP-D<0FTirIzVaSyjL*4tkYdz{xy0FSmy6B*$IdW$6@5=9+wY_N5Q4EYaFXjf zD=olHX)K7)(C#@Y$pMelfA4QqIy0wa@>URwdI{vCr_cL~iV7(HxO&q7yUMH>WWYBG{zESrVkYlT(k z+aRS9>t1out`Jmd@NVjAa9q$#e@-`YS90)`1eK;z)N1}VvIc+zt-%~z`O@-!(O;Fb z9h8yO&!PjfE$szxg7-jFn);FXjte0=K5Gk2H5e?BcAw~f7ZvGa(C@c=1fI&|;P&9G z2(&7NoA_r$5 zjxw`pk>RJ8U!2mff2zM$ZjAu{K@VC+Z9##wawY1}pq1x91MqW*@jEpm0zLIBgp}L^ zcWUZX>i&}fyn`G)^aueEHh@0v_!0_a^Rm&mr~0{c zQnWeSxo9L``8R#mQYo3hFs}S(gP-_89Zgfm_R%y~{X~+HZk6C$uoc#)vUc+8L(%AH zaftLnoC$z%>^jXD%iLXH}JOiS4P$ z5MFmc<=1vGh)D`CuDz51-hAc&jK*CF>Qi3d}0dp)~Zsr{XR+S6#09KJF@|CwNM}@ZVjksg9KVWL5gqB3#$u z1Pr)Pz4C;j4dV@6puCNB)x*;ARIOp0A&%Opoi}hSX~W%C_bv}!A1J;BT{aI-Z|j6V zwXZ?XJ;LAlzh~huY^JJQoMaOW5KEr1sVLn_Gvvu9t-Z|FpGbjxJ$~U8*YrNT@ zvVng^A6Mvzbi$V18m!q-(9f-`et1Om$p_e@Si7$^bns>4TP~#+23ckvM6PAHM3fo{jTTrtoA2{? zAKEu}G5Ehwo!8O>-&&XWe4+a$RZ!k$1)QkGb6;jWkH5Y?EuymqS_+>g0Cgd6YmSYv z|6S>w25~M^$SN{RiQN4phe)^)$V=JO_H2;&0#Z z$QS?V(aF^b$^2n7^YISrx8!gq@#$=icy^D(^dxOvXAo#S`IB3MnV8aj{oAE^b!iuL z;-?56pMD~vJ^d3cyUk6Nqn!(@GPYE*j3qC zuM~;}SnOY0O5r5q4TKtW>Y}A*kZ#+nM(J|#JbT5x9V62HXWo##-Ue5V7 zo0QgxYVlcv5B_$8Jds|Qh}c!{?$fF7WeTt=k6EY|H?wxdZ`ErYimYZSae)R7h4uqs z?#j%+OOt^d+gnmN1!ycQeFghJZ%1b*(sm>m*Tc7Wy@F-=o{bG-z@8=D_~*rvAZ2~2 zEVlEO>-I>;s^RA(=xV~k0z|#R>Z)DHJ6qQobMVS?6iZUdk^|@rE(r-pigW>jtN*2;DmjmB z2-(pywK*4P2t!hvGLuJ~`_LBBZI}CDlLNU#A3@YK=kYPJfnrZS#+vWf`zqhGD+Ifb zXa>UV#K`K6d>z<(U3wzj$m^eo{w((3W}h!|r}$4GsKljJ?t&%H-Qf%>VNM%;jiu*X3*?jtQJFGCeyT}D` za=w~TyZQz_)w+YyiM%5)*nq`6Bvhq7mF81As;2?tEsgm;Y$Y}(qXW2r6PPY6w}s1Z zir^R#IFoHW@4OY1DS`}GM9}1(ok{A9Wy{9Ssls`w=h=Tgk}v0xeMz@~ujUaaG>`JD zejQDUKX+qUVLhF+)mta~mTAJhXp16O_k;DDW7=4wz|1zB%2(SK_eUiD+zM*U_w*uU zH&s{@-y00!3{9!{d?Tnkz&<3S+L5|FWq?T(JO;bx3W z8bXP2f@grje3D-%WsUUvfD|Tu1;;Rs5GZL23O~p+Q*BYGGKy(k{xb1-Mwn04icW(U z@r}*)6#QhQZ9Za-c4J1?gpW@(qQyiuA{n(_VyTfPTVs!p{yV-ykmY`AUFegBK;}~9 z&H@QjD$QRiTw;ZmC3lNSOQ9brm3j3m^;d0(JHE~dLYq%atv6Q_YCoN4XlH1RRptv& zEf?EneF%)yjXJOgTcZlewpnMkQpc;~&k;9Mx*nlZgQYbhm!#obRgnYgAzp`{(9Xkl zrL-0sjDH=>R`;)15d2XLd>Z)@Jah#&5}Qh^o|e@{KYU%Y@E=I>+Di zs4|CRX#sOS%p=ldj*Doe=~tHJs`a5*s&D3%V{Smylr@1Oh`bqK%AqtI*1LL}VXTg* zQ8Hf-*>BH0_sV!b5heWb_PO@S$tH>ST#HB|>ckan-_ZqYYV| zB2$g|h|y#BMo@M6!O%kUvB~=depbt-TosL`1(3ks7Jsv-{3s+N8uy0B2V_D|Bphv= z@Q7q5NAFXvM13Ox<g^Xop~RHc zu?{~s{BNNit52+Kc(zHWo>Rb7yWw9u*wo+GQ~p3v?R_X9@OYgoEgg8jV&47z!i>&u zS?;^B^GnDU?PbOjL3Bgc^lldrB`Q(%vtVfKw5QMJ~^clC|Xug!6s|1)Nf|at5nBGpUB&0@Y$zD=+g^Lgq^_#+KHjoME9t zzh@<`6}z~2P!#vlpml<9c5-q#)X@(!S-#RaSk%7Lr;TW+dgRW~$JMY_QMznRk<2nP zt=J4A^ZPfkKl=p|9(i@PiaczYmou&3&EzbkJuM9Xr3r7KMqMu1p-G5p?c(b$faK#~d8NpE6tz-Gu6!P)DF3p<#kcYIyw zI&Kf%?wQ_^z=)HULUy=HL)k_{(ZoJ@xNpX6jhW-`03h9bx*&OseD=eYdj%ze@?Bm+>k z&1_ojo6_+q5w)uGREqbhtUJ1#IVPg@Ggy{)8$((PDux;-j^s;DR7fl2-V@6ACPv7V z2j4zhRUitjd4+BwJt-UbA;vTsexD4{5EJ+aS2~7<|1?XlCw6dCMVox<0Ya(9>b3UE zH;#Uf4@4zR=dp0gI{$(-)IVpXTN~)UU+83tPgx$ueniJv$V2}C!j9cfF`h+E@CDwRwIR-d30rB0ApW^p%%kr}h;bfYxn)J$#V)Kvao zNmm{Z<^F{;Mt5vkqO2i|ow1BWGKF+QX=YMVOvtWei%`ahE(v2D>s-m2B}*uZqO3!* zWQ%Ow#*z}U)$h!&`ETBNx6i!a_xnBPdCv13zsC+-lylPJXGtxc0TE$D(S*KGS&G3e z(%2<2gwggVK7v&SNxg{vCoe6Y6q}uLwebmjxzT;y8bcAOyo^jM5k6!UYyc>Q5S#Ov zjcUAicseCaOi)X;PU2!L2Up~!>D5`Yl+Pt^uUl#JS6CwzHy-%^*FV71?~sysJZ#ih zxFnb3IAVaw@4ct(c}nNwP1=Pp>q2Ctgzy(zn|tK4v-KycYcdDv&eHKWEAVUDh5J$W z8&*u(O*h(tq$cd>Vm%A$h~kKLw|!3-i@nOpP4Tu_r!Eaiu^lEyn=dQuU;HWPni3br zbm}wqtHm2C!kz9zD4!Bw*kVHiJjMb~-$1tPc-y*Jn&UL4+~Mg+e8qq5RkcmBd-pvE zT%dNFqgb_l!%&r)=@U2K`$#3_>QCuO2`e>~?<4as^CND|nkR3yX2$3|f`eC9yC0Q8 zqAxw_`Y_i0=xBn0;k*vWpYxY63EKKTFDZ77^;#*+(Kzu#>R5YJu>vB(=>-0uZS08T zcIXK^?@Q%F)-no3rx|Q)ft!l^ACcNj1xo(A<+ZJ&+AD=Ev_nAzyidt~?3fMlVA)Vc zizo9zm~O;(YHKobfSb*5GTHFOLS-j4b8thpEBY{Z-tEYTOxJRe>U^oj#tK&Lbvnr5WgcOmPo(XK_GCXIz7H}3r_2SM1|#+ z%C6)Novi(}T^_pVF^u3=jb~ZU6#WjXE(lN*@i8bo7Z~^KX`hr_Ce+L=2s7j&2P;A$ zqhf$ddZy52Ng-4cc^8{EpeG%yC~^UsS*kj=i8u#%M9w;!SWYb zmM-qkOM|>foA>qGI4S#XIfs4=d3Ew7sBCpNkA2HtiKAzr6ous45<5+P`1k%cqdN^1 zhfJI9zpOI~!ZCtr8B|QyKZJ2JCJ-_(rrP5_>Q!sG6VL-#vpZVzmD$yzIzV-+IQOER zayI)5PUwk!+dL;tXY2?OED{W%sPr6lYyBQXxO5W`xXs_zBVo8t|_%b#V? zOx2+h-!sutm$T|zduNk{-mM@1EkNvifJVm3d&tOZTz8CozW8)h(0Ec^U{(qc`f7(I z3gkjxl|Bqk7{GYQI(XsJPPI<6B=~Ol7yF9$2P5-zLB)Mgscs4IZstyy=5c8ZClb7^ zCl{c{R?m;gkI;#my@bk7qV+qHN^1r?vf(c(8<2vxqYts>Ai|-PW{w7xrzfz!3(*mS zF+qC@To}5ep2IFiTf;NYxw(+cuqNe_$5ca*cZtq5fM{{(%Bj_K<5V?$d=Cp8@%zX^ ziie?;H@m|rfC30Odn;GYCr7%HqfolI;wO=Qapcdaw8DPjxj&~1)7wqH%vAI(a2;U% zmUpOweW?8lxUFdF>by{)aU-9+ww@T|1$C@ys>%Pg>T-vl;aY&r?26UMUHj< zI}O%lxC5Dj5AZks&oTg;G(R_O_M?jUsn7bX0XAU~mU>Bnc)nnOjh(=V(IEcSq9;uZint~2nI=Yt4*Jyt;%_+BRvm!APbO1QlZ;P1Bu zD3`X(U!bq?PwpoA;{02{G8bbDmc=8%R@^r^jIXif>BuL7x319 zaEQS!VwJPXiCQ(Urt?1zSP{04~P=ZCFry^^`ISe8%iU6r7b;Co-Yxa8qBc4M(-2%Y#FM$`N8 zsJHJCWGX-Zn9>Juv1DZ!8y!KLB-2(=pP#iI7cSf$w77>u{ zwJJ-*h6c?LX^bL*H3tzSorOQU-bJK9!_M()g<_`@SJhd)R8tv-97)7UYKI@h!AXbj zvb}{UV?&U5i0$1_^{n`{IvI}O_&uOh_{K!{PbbirZp~eO(akaXMj#!dP6YPpAS@IN z-@I6li^D2MYdV`?&Tr58=4@RW;SS07S&EuJygU`7k$=#L$&DFs?8@yKg2^v;d39!! z)MiMovEge31ST=^@o8<&jpCBBj{HoY4(G-eIp-2lWKKP9U$dA6A+7Qrla3?F$u2_& z0CZx_M`ndIR7u2u&&B%dDQEeW;%?Fa~jxMktb%$dld5Q_6l1raEk{+!d~b zxxDO2{sL=(EozFR>(cgqkFI$^di<+Ha*aA595dmsBV1@#Q;3w2oGf;z{9?|0Gi*F0;&bMc*V^mQUW6e_ zh9R`=WPFO&ls9hzHUELs1rE1yc))JcMZ`65QI#V!G`u3U_+NaIWw1rQQuV zczdmCl+8$VkS0*R2xT!Dtnv9x>d?rcv>{lhu$ZLB|t%Uq^M-LR78 zNBKpD?PwrqgY|$|%kNerkZHCC_$4)$W3+*nGrZg<1}w}LcX3fd&n&+H31}sY%$eP* zA~lv*&6vZ?FkTeZJ?BQDHmMlU?|d#O_#y|7uP4tsj@hUVZef3OEjs_phA)fNP^7GR zRB4)v6T(tr&GhHy--I0+^L{O)2{{E4F>X2uNTY>V!HY?R(ST-CCd&d_uZS^whq+68z5-r&+L6ERI;`Y=Xpv4kg?k3#b%lyt47O5*jFZjr8FlX1G;QAG znXZ?4b1IQ-L?=R*-t>JpU-c&~g2TtT)sni6es2#0rJU%K{nx?v4Io6jJoS614_4v5 z&M&KwSFoMyjVnzP zn%*u5OYz|?5iI(?k^%dL5!V*Ru6(!So8ARb*&2FxdIw%*7;{K5G7d9yLX}{l1z%tr zsZN%kC#bI6yTM+%*9-Z|Zq&<7>af-iWiV26w>2jtrOKqnO@5 o&$@oTEPwV!emUvT-0$DJl+`?=HRGRO-vyt)O;4MY9VdnV4_h|k + + + + + + CameoParison - XState + Svelte - Actors + + + + + + +
+ + + diff --git a/examples/cameoparison-svelte-actors/package.json b/examples/cameoparison-svelte-actors/package.json new file mode 100644 index 0000000000..b89813328f --- /dev/null +++ b/examples/cameoparison-svelte-actors/package.json @@ -0,0 +1,25 @@ +{ + "name": "xstate-cameoparison-svelte-actors", + "description": "The CameoParison app implemented with Svelte (with the store contract) and XState version 4.", + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "serve": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.17", + "@tsconfig/svelte": "^2.0.1", + "svelte": "^3.42.1", + "svelte-check": "^2.2.4", + "svelte-preprocess": "^4.7.4", + "tslib": "^2.3.1", + "typescript": "^4.3.5", + "vite": "^2.5.0" + }, + "dependencies": { + "xstate": "^4.23.1" + } +} diff --git a/examples/cameoparison-svelte-actors/pnpm-lock.yaml b/examples/cameoparison-svelte-actors/pnpm-lock.yaml new file mode 100644 index 0000000000..991a1f7bac --- /dev/null +++ b/examples/cameoparison-svelte-actors/pnpm-lock.yaml @@ -0,0 +1,566 @@ +lockfileVersion: 5.3 + +specifiers: + '@sveltejs/vite-plugin-svelte': ^1.0.0-next.17 + '@tsconfig/svelte': ^2.0.1 + svelte: ^3.42.1 + svelte-check: ^2.2.4 + svelte-preprocess: ^4.7.4 + tslib: ^2.3.1 + typescript: ^4.3.5 + vite: ^2.5.0 + xstate: ^4.23.1 + +dependencies: + xstate: 4.23.1 + +devDependencies: + '@sveltejs/vite-plugin-svelte': 1.0.0-next.17_svelte@3.42.1+vite@2.5.0 + '@tsconfig/svelte': 2.0.1 + svelte: 3.42.1 + svelte-check: 2.2.4_svelte@3.42.1 + svelte-preprocess: 4.7.4_svelte@3.42.1+typescript@4.3.5 + tslib: 2.3.1 + typescript: 4.3.5 + vite: 2.5.0 + +packages: + + /@rollup/pluginutils/4.1.1: + resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.0 + dev: true + + /@sveltejs/vite-plugin-svelte/1.0.0-next.17_svelte@3.42.1+vite@2.5.0: + resolution: {integrity: sha512-Xh/YYqBMDJnDheutnGHk/I5TO6w9gZ2GMgvG+qQm/gpIRkaTLts6Mw5xDe6cac/nH/aVPPVPibhq2pf26d44fA==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + diff-match-patch: ^1.0.5 + svelte: ^3.34.0 + vite: ^2.3.7 + peerDependenciesMeta: + diff-match-patch: + optional: true + dependencies: + '@rollup/pluginutils': 4.1.1 + debug: 4.3.2 + kleur: 4.1.4 + magic-string: 0.25.7 + require-relative: 0.8.7 + svelte: 3.42.1 + svelte-hmr: 0.14.7_svelte@3.42.1 + vite: 2.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@tsconfig/svelte/2.0.1: + resolution: {integrity: sha512-aqkICXbM1oX5FfgZd2qSSAGdyo/NRxjWCamxoyi3T8iVQnzGge19HhDYzZ6NrVOW7bhcWNSq9XexWFtMzbB24A==} + dev: true + + /@types/node/16.6.2: + resolution: {integrity: sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==} + dev: true + + /@types/pug/2.0.5: + resolution: {integrity: sha512-LOnASQoeNZMkzexRuyqcBBDZ6rS+rQxUMkmj5A0PkhhiSZivLIuz6Hxyr1mkGoEZEkk66faROmpMi4fFkrKsBA==} + dev: true + + /@types/sass/1.16.1: + resolution: {integrity: sha512-iZUcRrGuz/Tbg3loODpW7vrQJkUtpY2fFSf4ELqqkApcS2TkZ1msk7ie8iZPB86lDOP8QOTTmuvWjc5S0R9OjQ==} + dependencies: + '@types/node': 16.6.2 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.0 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar/3.5.2: + resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.2 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.1 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette/1.3.0: + resolution: {integrity: sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + dev: true + + /debug/4.3.2: + resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /esbuild/0.12.21: + resolution: {integrity: sha512-7hyXbU3g94aREufI/5nls7Xcc+RGQeZWZApm6hoBaFvt2BPtpT4TjFMQ9Tb1jU8XyBGz00ShmiyflCogphMHFQ==} + hasBin: true + requiresBuild: true + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.1 + dev: true + + /glob/7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.6.0: + resolution: {integrity: sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.1: + resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /kleur/4.1.4: + resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + engines: {node: '>=6'} + dev: true + + /magic-string/0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.5: + resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + dev: true + + /mri/1.1.6: + resolution: {integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==} + engines: {node: '>=4'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid/3.1.25: + resolution: {integrity: sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + dependencies: + wrappy: 1.0.2 + dev: true + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picomatch/2.3.0: + resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} + engines: {node: '>=8.6'} + dev: true + + /postcss/8.3.6: + resolution: {integrity: sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + colorette: 1.3.0 + nanoid: 3.1.25 + source-map-js: 0.6.2 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.0 + dev: true + + /require-relative/0.8.7: + resolution: {integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.20.0: + resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} + dependencies: + is-core-module: 2.6.0 + path-parse: 1.0.7 + dev: true + + /rollup/2.56.2: + resolution: {integrity: sha512-s8H00ZsRi29M2/lGdm1u8DJpJ9ML8SUOpVVBd33XNeEeL3NVaTiUcSBHzBdF3eAyR0l7VSpsuoVUGrRHq7aPwQ==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /sade/1.7.4: + resolution: {integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==} + engines: {node: '>= 6'} + dependencies: + mri: 1.1.6 + dev: true + + /source-map-js/0.6.2: + resolution: {integrity: sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + dev: true + + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /svelte-check/2.2.4_svelte@3.42.1: + resolution: {integrity: sha512-eGEuZ3UEanOhlpQhICLjKejDxcZ9uYJlGnBGKAPW7uugolaBE6HpEBIiKFZN/TMRFFHQUURgGvsVn8/HJUBfeQ==} + hasBin: true + peerDependencies: + svelte: ^3.24.0 + dependencies: + chalk: 4.1.2 + chokidar: 3.5.2 + glob: 7.1.7 + import-fresh: 3.3.0 + minimist: 1.2.5 + sade: 1.7.4 + source-map: 0.7.3 + svelte: 3.42.1 + svelte-preprocess: 4.7.4_svelte@3.42.1+typescript@4.3.5 + typescript: 4.3.5 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - node-sass + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.14.7_svelte@3.42.1: + resolution: {integrity: sha512-pDrzgcWSoMaK6AJkBWkmgIsecW0GChxYZSZieIYfCP0v2oPyx2CYU/zm7TBIcjLVUPP714WxmViE9Thht4etog==} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.42.1 + dev: true + + /svelte-preprocess/4.7.4_svelte@3.42.1+typescript@4.3.5: + resolution: {integrity: sha512-mDAmaltQl6e5zU2VEtoWEf7eLTfuOTGr9zt+BpA3AGHo8MIhKiNSPE9OLTCTOMgj0vj/uL9QBbaNmpG4G1CgIA==} + engines: {node: '>= 9.11.2'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 + node-sass: '*' + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.54.7 + sugarss: ^2.0.0 + svelte: ^3.23.0 + typescript: ^3.9.5 || ^4.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + node-sass: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.5 + '@types/sass': 1.16.1 + detect-indent: 6.1.0 + strip-indent: 3.0.0 + svelte: 3.42.1 + typescript: 4.3.5 + dev: true + + /svelte/3.42.1: + resolution: {integrity: sha512-XtExLd2JAU3T7M2g/DkO3UNj/3n1WdTXrfL63OZ5nZq7nAqd9wQw+lR4Pv/wkVbrWbAIPfLDX47UjFdmnY+YtQ==} + engines: {node: '>= 8'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib/2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: true + + /typescript/4.3.5: + resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /vite/2.5.0: + resolution: {integrity: sha512-Dn4B+g54PJsMG5WCc4QeFy1ygMXRdTtFrUPegqfk4+vzVQcbF/DqqmI/1bxezArzbujBJg/67QeT5wz8edfJVQ==} + engines: {node: '>=12.2.0'} + hasBin: true + dependencies: + esbuild: 0.12.21 + postcss: 8.3.6 + resolve: 1.20.0 + rollup: 2.56.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + dev: true + + /xstate/4.23.1: + resolution: {integrity: sha512-8ZoCe8d6wDSPfkep+GBgi+fKAdMyXcaizoNf5FKceEhlso4+9n1TeK6oviaDsXZ3Z5O8xKkJOxXPNuD4cA9LCw==} + dev: false diff --git a/examples/cameoparison-svelte-actors/public/favicon.ico b/examples/cameoparison-svelte-actors/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d75d248ef0b15096a95054643a4d97f5d9b60846 GIT binary patch literal 1150 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 Sg9YbhAUkWPT@QBn#QqEU%nA1Z literal 0 HcmV?d00001 diff --git a/examples/cameoparison-svelte-actors/public/icons/compare.svg b/examples/cameoparison-svelte-actors/public/icons/compare.svg new file mode 100644 index 0000000000..088b5d54db --- /dev/null +++ b/examples/cameoparison-svelte-actors/public/icons/compare.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/examples/cameoparison-svelte-actors/public/icons/right.svg b/examples/cameoparison-svelte-actors/public/icons/right.svg new file mode 100644 index 0000000000..44a2ed48d4 --- /dev/null +++ b/examples/cameoparison-svelte-actors/public/icons/right.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/examples/cameoparison-svelte-actors/public/icons/wrong.svg b/examples/cameoparison-svelte-actors/public/icons/wrong.svg new file mode 100644 index 0000000000..9c572f4eca --- /dev/null +++ b/examples/cameoparison-svelte-actors/public/icons/wrong.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/examples/cameoparison-svelte-actors/src/app/App.svelte b/examples/cameoparison-svelte-actors/src/app/App.svelte new file mode 100644 index 0000000000..eeafa7e89b --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/app/App.svelte @@ -0,0 +1,50 @@ + + +
+ {#if $service.matches('welcome')} + + {:else if $service.matches('game')} + + {/if} +
+ + diff --git a/examples/cameoparison-svelte-actors/src/app/machine.js b/examples/cameoparison-svelte-actors/src/app/machine.js new file mode 100644 index 0000000000..b5eaf7ed07 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/app/machine.js @@ -0,0 +1,38 @@ +import { actions, assign, createMachine, spawn } from 'xstate'; +const { stop } = actions; + +import { welcomeMachine } from '../welcome/machine.js'; +import { gameMachine } from '../game/machine.js'; + +export const machine = createMachine({ + id: 'appMachine', + context: { + welcomeActor: undefined, + gameActor: undefined + }, + + entry: assign({ + welcomeActor: (context, event) => spawn(welcomeMachine, 'welcomeActor') + }), + + initial: 'welcome', + states: { + welcome: { + on: { + PLAY: { + target: 'game', + actions: assign({ + gameActor: (context, event) => + spawn(gameMachine(event.data), 'gameActor') + }) + } + } + }, + game: { + on: { + GREET: 'welcome' + }, + exit: stop('gameActor') + } + } +}); diff --git a/examples/cameoparison-svelte-actors/src/constants.js b/examples/cameoparison-svelte-actors/src/constants.js new file mode 100644 index 0000000000..d6d98e0534 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/constants.js @@ -0,0 +1 @@ +export const ROUNDS_PER_GAME = 10; diff --git a/examples/cameoparison-svelte-actors/src/error/Error.svelte b/examples/cameoparison-svelte-actors/src/error/Error.svelte new file mode 100644 index 0000000000..5b8cb6a77d --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/error/Error.svelte @@ -0,0 +1,16 @@ + + +

Server or network error

+ + + diff --git a/examples/cameoparison-svelte-actors/src/error/machine.js b/examples/cameoparison-svelte-actors/src/error/machine.js new file mode 100644 index 0000000000..331cd2039e --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/error/machine.js @@ -0,0 +1,16 @@ +import { createMachine, sendParent } from 'xstate'; + +export const errorMachine = createMachine({ + id: 'errorActor', + + initial: 'idle', + states: { + idle: { + on: { + RETRY: { + actions: sendParent('RETRY') + } + } + } + } +}); diff --git a/examples/cameoparison-svelte-actors/src/feedback/Feedback.svelte b/examples/cameoparison-svelte-actors/src/feedback/Feedback.svelte new file mode 100644 index 0000000000..61bacfbe21 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/feedback/Feedback.svelte @@ -0,0 +1,50 @@ + + +
+ {score}/{results.length} +

{pickMessage(score / results.length)}

+ +
+ + diff --git a/examples/cameoparison-svelte-actors/src/feedback/machine.js b/examples/cameoparison-svelte-actors/src/feedback/machine.js new file mode 100644 index 0000000000..056a47aaaa --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/feedback/machine.js @@ -0,0 +1,20 @@ +import { createMachine, sendParent } from 'xstate'; + +export const feedbackMachine = (results) => + createMachine({ + id: 'feedbackActor', + context: { + results: results + }, + + initial: 'idle', + states: { + idle: { + on: { + RESTART: { + actions: sendParent('RESTART') + } + } + } + } + }); diff --git a/examples/cameoparison-svelte-actors/src/game/Card.svelte b/examples/cameoparison-svelte-actors/src/game/Card.svelte new file mode 100644 index 0000000000..2e00fb8bc3 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/game/Card.svelte @@ -0,0 +1,101 @@ + + +
+ +
+ + diff --git a/examples/cameoparison-svelte-actors/src/game/Game.svelte b/examples/cameoparison-svelte-actors/src/game/Game.svelte new file mode 100644 index 0000000000..1f47fa1874 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/game/Game.svelte @@ -0,0 +1,184 @@ + + +{#if !$actor.matches('feedback')} +
+

+ Tap on the more monetisable celebrity's face, or tap 'same price' if + society values them equally. +

+
+{/if} + +
+ {#if $actor.matches('question') || $actor.matches('answer') || $actor.matches('next')} +
+
+ = b.price} + on:select={() => send({ type: 'ATTEMPT', a, b, sign: 1 })} + /> +
+ +
+ +
+ +
+ = a.price} + on:select={() => send({ type: 'ATTEMPT', a, b, sign: -1 })} + /> +
+
+ + {#if $actor.matches('answer')} + {currentResult} answer + {/if} + {:else if $actor.matches('feedback')} + + {:else if $actor.matches('failure')} +
+ +
+ {/if} +
+ +
+ {#each results as result} + + {#if result} + {result} answer + {/if} + + {/each} +
+ + diff --git a/examples/cameoparison-svelte-actors/src/game/machine.js b/examples/cameoparison-svelte-actors/src/game/machine.js new file mode 100644 index 0000000000..3102ab0664 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/game/machine.js @@ -0,0 +1,145 @@ +import { actions, assign, createMachine, sendParent, spawn } from 'xstate'; +const { stop } = actions; + +import { feedbackMachine } from '../feedback/machine.js'; +import { errorMachine } from '../error/machine.js'; + +import { ROUNDS_PER_GAME } from '../constants.js'; +import { select } from './select.js'; +import { loadImage } from '../utils.js'; + +const loadRounds = async (selection) => + selection.map((round) => + Promise.all([loadCelebDetails(round.a), loadCelebDetails(round.b)]) + ); + +const loadCelebDetails = async (celeb) => { + const res = await fetch( + `https://cameo-explorer.netlify.app/celebs/${celeb.id}.json` + ); + const details = await res.json(); + await loadImage(details.image); + return details; +}; + +export const gameMachine = ({ celebs, lookup, category }) => + createMachine({ + id: 'gameActor', + context: { + celebs: celebs, + lookup: lookup, + category: category, + rounds: [], + currentRound: [], + currentRoundIndex: 0, + results: Array(ROUNDS_PER_GAME), + currentResult: undefined, + feedbackActor: undefined, + errorActor: undefined + }, + + initial: 'idle', + states: { + idle: { + on: { + LOAD_ROUNDS: 'loadingRounds' + } + }, + loadingRounds: { + invoke: { + src: (context, event) => + loadRounds( + select( + context.celebs, + context.lookup, + context.category.slug, + ROUNDS_PER_GAME + ) + ), + onDone: { + target: 'loadingCelebDetails', + actions: assign({ rounds: (context, event) => event.data }) + } + } + }, + loadingCelebDetails: { + invoke: { + src: (context, event) => + context.rounds[context.currentRoundIndex].then((round) => round), + onDone: { + target: 'question', + actions: assign({ currentRound: (context, event) => event.data }) + }, + onError: { + target: 'failure', + actions: assign({ + errorActor: (context, event) => spawn(errorMachine, 'errorActor') + }) + } + } + }, + question: { + on: { + ATTEMPT: { + target: 'answer', + actions: assign({ + currentResult: (context, event) => + Math.sign(event.a.price - event.b.price) === event.sign + ? 'right' + : 'wrong' + }) + } + } + }, + answer: { + after: { + 1500: { + target: 'next', + actions: assign({ + results: (context, event) => [ + ...context.results.slice(0, context.currentRoundIndex), + context.currentResult, + ...context.results.slice(context.currentRoundIndex + 1) + ] + }) + } + } + }, + next: { + after: { + 500: [ + { + cond: (context, event) => + context.currentRoundIndex < ROUNDS_PER_GAME - 1, + target: 'loadingCelebDetails', + actions: assign({ + currentRoundIndex: (context, event) => + context.currentRoundIndex + 1 + }) + }, + { + target: 'feedback', + actions: assign({ + feedbackActor: (context, event) => + spawn(feedbackMachine(context.results), 'feedbackActor') + }) + } + ] + } + }, + feedback: { + on: { + RESTART: { + actions: sendParent('GREET') + } + }, + exit: stop('feedbackActor') + }, + failure: { + on: { + RETRY: 'loadingRounds' + }, + exit: stop('errorActor') + } + } + }); diff --git a/examples/cameoparison-svelte-actors/src/game/select.js b/examples/cameoparison-svelte-actors/src/game/select.js new file mode 100644 index 0000000000..b4adc181b3 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/game/select.js @@ -0,0 +1,56 @@ +import { pickRandom } from '../utils.js'; + +function remove(array, index) { + // if a 'similar' account was picked, there's no + // guarantee that it's in the filtered array + if (index === -1) { + return; + } + + // this is much faster than splicing the array + array[index] = array[array.length - 1]; + array.pop(); +} + +export function select(celebs, lookup, category, ROUNDS_PER_GAME) { + const filtered = celebs.filter((c) => { + return c.categories.includes(category); + }); + + const seen = new Set(); + const selection = []; + + let i = ROUNDS_PER_GAME; + while (i--) { + const n = Math.random(); + const ai = Math.floor(n * filtered.length); + const a = filtered[ai]; + + // remove a from the array so this person can't be picked again + remove(filtered, ai); + + let b; + + // if this celeb has 'similar' celebs, decide whether to pick one + const similar = a.similar.filter((id) => !seen.has(id)); + if (similar.length > 0 && Math.random() < 0.75) { + const id = pickRandom(similar); + b = lookup.get(id); + } + + // otherwise pick someone at random + else { + b = pickRandom(filtered); + } + + selection.push({ a, b }); + + seen.add(a.id); + seen.add(b.id); + + // remove b from the array so this person can't be picked again + remove(filtered, filtered.indexOf(b)); + } + + return selection; +} diff --git a/examples/cameoparison-svelte-actors/src/logger.js b/examples/cameoparison-svelte-actors/src/logger.js new file mode 100644 index 0000000000..011fde8605 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/logger.js @@ -0,0 +1,15 @@ +const dftPreorderRecursive = (service, level = 0) => { + if ( + service?.onTransition && + typeof service.onTransition === 'function' && + service?.children + ) { + level++; + service.onTransition((state) => { + console.log('-'.repeat(level), service.id, state); + service.children.forEach((child) => dftPreorderRecursive(child, level)); + }); + } +}; + +export const log = dftPreorderRecursive; diff --git a/examples/cameoparison-svelte-actors/src/main.ts b/examples/cameoparison-svelte-actors/src/main.ts new file mode 100644 index 0000000000..8619ebbf35 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/main.ts @@ -0,0 +1,7 @@ +import App from './app/App.svelte'; + +const app = new App({ + target: document.getElementById('app') +}); + +export default app; diff --git a/examples/cameoparison-svelte-actors/src/utils.js b/examples/cameoparison-svelte-actors/src/utils.js new file mode 100644 index 0000000000..534974ab26 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/utils.js @@ -0,0 +1,20 @@ +export function pickRandom(array) { + const index = Math.floor(array.length * Math.random()); + return array[index]; +} + +export function sleep(ms) { + return new Promise((fulfil) => { + console.log('sleep'); + setTimeout(fulfil, ms); + }); +} + +export function loadImage(src) { + return new Promise((fulfil, reject) => { + const img = new Image(); + img.onload = () => fulfil(); + img.onerror = reject; + img.src = src; + }); +} diff --git a/examples/cameoparison-svelte-actors/src/vite-env.d.ts b/examples/cameoparison-svelte-actors/src/vite-env.d.ts new file mode 100644 index 0000000000..4078e7476a --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte b/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte new file mode 100644 index 0000000000..61ae7f0c21 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte @@ -0,0 +1,122 @@ + + +{#if !$actor.matches('failure')} +
+

CameoPrison

+

+ On cameo.com, you can buy personalised + video clips from everyone from Lindsay Lohan to Ice T. +

+

But who commands the highest price?

+
+ +

Pick a category to play a game:

+ +
+ {#each categories as category} + + {/each} +
+{:else if $actor.matches('failure')} +
+ +
+{/if} + + diff --git a/examples/cameoparison-svelte-actors/src/welcome/machine.js b/examples/cameoparison-svelte-actors/src/welcome/machine.js new file mode 100644 index 0000000000..6fb8f03163 --- /dev/null +++ b/examples/cameoparison-svelte-actors/src/welcome/machine.js @@ -0,0 +1,83 @@ +import { actions, assign, createMachine, sendParent, spawn } from 'xstate'; +const { stop } = actions; + +import { errorMachine } from '../error/machine.js'; + +const loadCelebs = async () => { + const res = await fetch('https://cameo-explorer.netlify.app/celebs.json'); + const data = await res.json(); + + const lookup = new Map(); + data.forEach((c) => { + lookup.set(c.id, c); + }); + + const subset = new Set(); + data.forEach((celeb) => { + if (celeb.reviews >= 50) { + subset.add(celeb); + celeb.similar.forEach((id) => { + subset.add(lookup.get(id)); + }); + } + }); + + return { + celebs: Array.from(subset), + lookup + }; +}; + +export const welcomeMachine = createMachine({ + id: 'welcomeActor', + context: { + celebs: [], + lookup: undefined, + errorActor: undefined + }, + + initial: 'idle', + states: { + idle: { + on: { + LOAD_CELEBS: 'loadingCelebs', + SELECT_CATEGORY: { + cond: (context, event) => + context.celebs.length > 0 && context?.lookup, + actions: sendParent((context, event) => ({ + type: 'PLAY', + data: { + celebs: context.celebs, + lookup: context.lookup, + category: event.category + } + })) + } + } + }, + loadingCelebs: { + invoke: { + src: (context, event) => loadCelebs(), + onDone: { + target: 'idle', + actions: assign({ + celebs: (context, event) => event.data.celebs, + lookup: (context, event) => event.data.lookup + }) + }, + onError: { + target: 'failure', + actions: assign({ + errorActor: (context, event) => spawn(errorMachine, 'errorActor') + }) + } + } + }, + failure: { + on: { + RETRY: 'loadingCelebs' + }, + exit: stop('errorActor') + } + } +}); diff --git a/examples/cameoparison-svelte-actors/svelte.config.js b/examples/cameoparison-svelte-actors/svelte.config.js new file mode 100644 index 0000000000..55dde4734f --- /dev/null +++ b/examples/cameoparison-svelte-actors/svelte.config.js @@ -0,0 +1,7 @@ +import sveltePreprocess from 'svelte-preprocess'; + +export default { + // Consult https://github.com/sveltejs/svelte-preprocess + // for more information about preprocessors + preprocess: sveltePreprocess() +}; diff --git a/examples/cameoparison-svelte-actors/tsconfig.json b/examples/cameoparison-svelte-actors/tsconfig.json new file mode 100644 index 0000000000..fea5d34ace --- /dev/null +++ b/examples/cameoparison-svelte-actors/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "resolveJsonModule": true, + "baseUrl": ".", + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": false + }, + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/examples/cameoparison-svelte-actors/vite.config.js b/examples/cameoparison-svelte-actors/vite.config.js new file mode 100644 index 0000000000..0937cdb961 --- /dev/null +++ b/examples/cameoparison-svelte-actors/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [svelte()] +}); From 0c4685e7f9bbce681bca87743c5a42d15db3b97a Mon Sep 17 00:00:00 2001 From: Anna Bansaghi Date: Fri, 20 Aug 2021 13:52:05 +0200 Subject: [PATCH 2/8] Format SVGs --- examples/cameoparison-svelte-actors/public/icons/compare.svg | 4 ++-- examples/cameoparison-svelte-actors/public/icons/right.svg | 4 ++-- examples/cameoparison-svelte-actors/public/icons/wrong.svg | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/cameoparison-svelte-actors/public/icons/compare.svg b/examples/cameoparison-svelte-actors/public/icons/compare.svg index 088b5d54db..6cb2289933 100644 --- a/examples/cameoparison-svelte-actors/public/icons/compare.svg +++ b/examples/cameoparison-svelte-actors/public/icons/compare.svg @@ -1,5 +1,5 @@ - + - \ No newline at end of file + diff --git a/examples/cameoparison-svelte-actors/public/icons/right.svg b/examples/cameoparison-svelte-actors/public/icons/right.svg index 44a2ed48d4..03cd4b44b6 100644 --- a/examples/cameoparison-svelte-actors/public/icons/right.svg +++ b/examples/cameoparison-svelte-actors/public/icons/right.svg @@ -1,5 +1,5 @@ - + - \ No newline at end of file + diff --git a/examples/cameoparison-svelte-actors/public/icons/wrong.svg b/examples/cameoparison-svelte-actors/public/icons/wrong.svg index 9c572f4eca..e40f2487e3 100644 --- a/examples/cameoparison-svelte-actors/public/icons/wrong.svg +++ b/examples/cameoparison-svelte-actors/public/icons/wrong.svg @@ -1,5 +1,5 @@ - + - \ No newline at end of file + From b4a7ea9d8bd52a65f27987d3b262430038834b65 Mon Sep 17 00:00:00 2001 From: Anna Bansaghi Date: Fri, 20 Aug 2021 14:12:15 +0200 Subject: [PATCH 3/8] Simplify machine --- docs/.vuepress/config.js | 4 +- docs/.vuepress/theme/index.js | 2 +- docs/sandboxes/todomvc/index.js | 10 ++-- docs/sandboxes/todomvc/useHashChange.js | 6 +-- .../src/error/machine.js | 11 ++--- .../src/feedback/machine.js | 11 ++--- .../src/welcome/Welcome.svelte | 48 +++++++++---------- packages/core/test/fixtures/tictactoe.js | 30 +++++++----- 8 files changed, 57 insertions(+), 65 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index b6262824f1..b00d819d22 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -124,7 +124,5 @@ module.exports = { } ] }, - plugins: [ - 'vuepress-plugin-export' - ] + plugins: ['vuepress-plugin-export'] }; diff --git a/docs/.vuepress/theme/index.js b/docs/.vuepress/theme/index.js index c77d3dedff..50435c1220 100644 --- a/docs/.vuepress/theme/index.js +++ b/docs/.vuepress/theme/index.js @@ -10,7 +10,7 @@ module.exports = (_, ctx) => ({ const isAlgoliaSearch = themeConfig.algolia || Object.keys((siteConfig.locales && themeConfig.locales) || {}).some( - base => themeConfig.locales[base].algolia + (base) => themeConfig.locales[base].algolia ); return { diff --git a/docs/sandboxes/todomvc/index.js b/docs/sandboxes/todomvc/index.js index 96649ecd7f..1a0546dd93 100755 --- a/docs/sandboxes/todomvc/index.js +++ b/docs/sandboxes/todomvc/index.js @@ -1,7 +1,7 @@ -import React from "react"; -import ReactDOM from "react-dom"; -import "todomvc-app-css/index.css"; +import React from 'react'; +import ReactDOM from 'react-dom'; +import 'todomvc-app-css/index.css'; -import { Todos } from "./Todos"; +import { Todos } from './Todos'; -ReactDOM.render(, document.querySelector("#app")); +ReactDOM.render(, document.querySelector('#app')); diff --git a/docs/sandboxes/todomvc/useHashChange.js b/docs/sandboxes/todomvc/useHashChange.js index 2bdca3f4c7..177ff7744d 100755 --- a/docs/sandboxes/todomvc/useHashChange.js +++ b/docs/sandboxes/todomvc/useHashChange.js @@ -1,9 +1,9 @@ -import { useEffect } from "react"; +import { useEffect } from 'react'; export function useHashChange(onHashChange) { useEffect(() => { - window.addEventListener("hashchange", onHashChange); + window.addEventListener('hashchange', onHashChange); - return () => window.removeEventListener("hashchange", onHashChange); + return () => window.removeEventListener('hashchange', onHashChange); }, []); } diff --git a/examples/cameoparison-svelte-actors/src/error/machine.js b/examples/cameoparison-svelte-actors/src/error/machine.js index 331cd2039e..50997fd309 100644 --- a/examples/cameoparison-svelte-actors/src/error/machine.js +++ b/examples/cameoparison-svelte-actors/src/error/machine.js @@ -3,14 +3,9 @@ import { createMachine, sendParent } from 'xstate'; export const errorMachine = createMachine({ id: 'errorActor', - initial: 'idle', - states: { - idle: { - on: { - RETRY: { - actions: sendParent('RETRY') - } - } + on: { + RETRY: { + actions: sendParent('RETRY') } } }); diff --git a/examples/cameoparison-svelte-actors/src/feedback/machine.js b/examples/cameoparison-svelte-actors/src/feedback/machine.js index 056a47aaaa..5957376c61 100644 --- a/examples/cameoparison-svelte-actors/src/feedback/machine.js +++ b/examples/cameoparison-svelte-actors/src/feedback/machine.js @@ -7,14 +7,9 @@ export const feedbackMachine = (results) => results: results }, - initial: 'idle', - states: { - idle: { - on: { - RESTART: { - actions: sendParent('RESTART') - } - } + on: { + RESTART: { + actions: sendParent('RESTART') } } }); diff --git a/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte b/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte index 61ae7f0c21..46e0acbaf7 100644 --- a/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte +++ b/examples/cameoparison-svelte-actors/src/welcome/Welcome.svelte @@ -17,35 +17,35 @@ ]; -{#if !$actor.matches('failure')} -
-

CameoPrison

-

- On cameo.com, you can buy personalised - video clips from everyone from Lindsay Lohan to Ice T. -

-

But who commands the highest price?

-
- -

Pick a category to play a game:

- -
- {#each categories as category} - - {/each} -
-{:else if $actor.matches('failure')} +{#if $actor.matches('failure')}
{/if} +
+

CameoPrison

+

+ On cameo.com, you can buy personalised video + clips from everyone from Lindsay Lohan to Ice T. +

+

But who commands the highest price?

+
+ +

Pick a category to play a game:

+ +
+ {#each categories as category} + + {/each} +
+