From 34a69d0318f7999aa8b8779e0bf1f90760def94c Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 11 Dec 2018 18:06:10 -0500 Subject: [PATCH 01/34] Add janet logo,mMove some lib files to example. --- Makefile | 19 +------------------ README.md | 2 ++ assets/janet-big.png | Bin 0 -> 44575 bytes {lib => examples}/colors.janet | 0 {lib => examples}/lazyseqs.janet | 4 ++-- natives/json/json.c | 2 +- 6 files changed, 6 insertions(+), 21 deletions(-) create mode 100644 assets/janet-big.png rename {lib => examples}/colors.janet (100%) rename {lib => examples}/lazyseqs.janet (98%) diff --git a/Makefile b/Makefile index e30789b7..154295b0 100644 --- a/Makefile +++ b/Makefile @@ -149,18 +149,6 @@ valtest: $(JANET_TARGET) $(TEST_PROGRAMS) for f in build/*.out; do $(VALGRIND_COMMAND) "$$f" || exit; done for f in test/*.janet; do $(VALGRIND_COMMAND) ./$(JANET_TARGET) "$$f" || exit; done -################### -##### Natives ##### -################### - -natives: $(JANET_TARGET) - $(MAKE) -C natives/json - $(MAKE) -j 8 -C natives/sqlite3 - -clean-natives: - $(MAKE) -C natives/json clean - $(MAKE) -C natives/sqlite3 clean - ######################## ##### Distribution ##### ######################## @@ -189,16 +177,11 @@ install: $(JANET_TARGET) mandb $(LDCONFIG) -install-libs: natives - mkdir -p $(JANET_PATH) - cp -r lib $(JANET_PATH) - cp natives/*/*.so $(JANET_PATH) - uninstall: -rm $(BINDIR)/../$(JANET_TARGET) -rm $(LIBDIR)/../$(JANET_LIBRARY) -rm -rf $(INCLUDEDIR) $(LDCONFIG) -.PHONY: clean install repl debug valgrind test valtest emscripten dist install uninstall \ +.PHONY: clean install repl debug valgrind test valtest emscripten dist uninstall \ $(TEST_PROGRAM_PHONIES) $(TEST_PROGRAM_VALPHONIES) diff --git a/README.md b/README.md index 5fd5ebd9..6a597930 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![Build Status](https://travis-ci.org/bakpakin/janet.svg?branch=master)](https://travis-ci.org/bakpakin/janet) [![Appveyor Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/bakpakin/janet) +![Janet Logo](https://raw.githubusercontent.com/bakpakin/janet/master/assets/janet-big.png) + Janet is a functional and imperative programming language and bytecode interpreter. It is a modern lisp, but lists are replaced by other data structures with better utility and performance (arrays, tables, structs, tuples). diff --git a/assets/janet-big.png b/assets/janet-big.png new file mode 100644 index 0000000000000000000000000000000000000000..5e162acb4f618c54cecc34f664d528400ddb79cc GIT binary patch literal 44575 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 Qz61W0 Date: Tue, 11 Dec 2018 18:12:31 -0500 Subject: [PATCH 02/34] Add image credit. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6a597930..610767df 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,12 @@ [![Build Status](https://travis-ci.org/bakpakin/janet.svg?branch=master)](https://travis-ci.org/bakpakin/janet) [![Appveyor Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/bakpakin/janet) +bat +

![Janet Logo](https://raw.githubusercontent.com/bakpakin/janet/master/assets/janet-big.png) +Logo by [honix](https://github.com/honix) +

Janet is a functional and imperative programming language and bytecode interpreter. It is a modern lisp, but lists are replaced From 49dd75b0e50f02be5127169fc715c885cd46f570 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 11 Dec 2018 18:13:42 -0500 Subject: [PATCH 03/34] Fix image credit. --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 610767df..234c931a 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,11 @@ [![Build Status](https://travis-ci.org/bakpakin/janet.svg?branch=master)](https://travis-ci.org/bakpakin/janet) [![Appveyor Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/bakpakin/janet) -bat

![Janet Logo](https://raw.githubusercontent.com/bakpakin/janet/master/assets/janet-big.png) -Logo by [honix](https://github.com/honix)

+Logo by [honix](https://github.com/honix) Janet is a functional and imperative programming language and bytecode interpreter. It is a modern lisp, but lists are replaced From cd16888bebf3a3cb736df393e80f47809b8121d4 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 11 Dec 2018 18:14:46 -0500 Subject: [PATCH 04/34] . --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 234c931a..1c9c4a81 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Appveyor Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/bakpakin/janet)

-![Janet Logo](https://raw.githubusercontent.com/bakpakin/janet/master/assets/janet-big.png) + Janet logo

Logo by [honix](https://github.com/honix) From db0313b37924504a7cf0715eb30fc0d801385555 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 11 Dec 2018 18:16:10 -0500 Subject: [PATCH 05/34] . --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c9c4a81..1f7814ca 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@

Janet logo + Logo by honix

-Logo by [honix](https://github.com/honix) Janet is a functional and imperative programming language and bytecode interpreter. It is a modern lisp, but lists are replaced From e4503df8b61f50e036d2ae2566ae9ba48bc52a26 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 11 Dec 2018 18:16:40 -0500 Subject: [PATCH 06/34] .. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f7814ca..fb9f3188 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

Janet logo - Logo by honix +

Logo by honix

Janet is a functional and imperative programming language and bytecode interpreter. It is a From f0e125b304358d1e4a7f3de6f53cbb2213aa5162 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Tue, 11 Dec 2018 18:25:08 -0500 Subject: [PATCH 07/34] Crop logo to 512x512 --- assets/janet-big.png | Bin 44575 -> 58316 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/janet-big.png b/assets/janet-big.png index 5e162acb4f618c54cecc34f664d528400ddb79cc..aa91616e693a23753e614b539c0e1b346bd9fa57 100644 GIT binary patch literal 58316 zcmb??gLh<4)NRK$CdR~=*tTuk$;7tpWRi((YvQD1O>En?lb88@>-_`oeXCcmzIFTD zx~I<~7Is^qkLwe0rtX$z0D${SRi@=1Joea-PbZ8{@Wibayx7A#M9=4UT{EfrF}g)c zO;06iebOMn1>pPH#OM2^%V%GlZCy*UHBBe_WZax`To6CY=kxV5j<;v`=MzeI&Buky z<1OKLdTjmkTcmyOuF#&-=SB9pJ0G8q4;S^tN8^=8A%4DRFTq)g(}J!`>rFV#w+@0X zKezW+ACmV2*RJk`=Sntj`j=)u`CsEpY2SXdxkoQPcOEN8V`wz=TwcEu?8K?(lljUo ze0pE5P4b8G+gLp{bl&d1w!Qn(WYTZ4CwDIwT%HntK5um5znn+**2sUX^Y3Afe?AP^ zJzQ+8U-0I%qmd+SY3nL6xoXjI$g0pl7XS9Cr#qc5L2Kr`3EOF3~7D7oEC0*%bWP`tGv< z8za9F;5G;xK%eG+bM|}K>At-^47pG}3Ef(q>@?C{852E0Vnhiy~2&&%%b^)1ts5K%owMR4&dkp`9NO-ZpB zVvG%EYo^l(YxCMIrJB-6QL!OnN&!)xc%Ayo)%ciD<)uTFG}yDT*xb z(Xx^(-$Am)>UHPaAI%%CulW204>2c~1(+Y?j(+$}S25||Q#M{tYD%vitN7_qz$r8t zNsJgFzUyItpmI^0b%iA7e=qs{Oh6Th7ojx_JAoL9g(5@I@7*`K^d7mUKRCXBM?di6 zqjQ)u_oKGRIIsDdxy+fvt)`|t7VI^+Ew)&%`BS^h~S0S$^CAnpg)oUBOBZneM(IghGXT*hmyQmL(?qjvuxp#4)8UL z=A0{2cLx%4y#YsYC#JK1qJ&1wTCaMFVourm=rJDl9&^EQ$AY&~P(!{IIrR2rOUv%E zmOAX`%Id3~Y-xOoD$?l3u0agz0X=OryW0ohu0srkl7q3Qdpk5s<# zC+PtMk$8Jm90b8%Uh%v8o0O&txsvFt!=FQ{;c;{8){{kvYv`8@YVPXbq+TN)gxxV@ z%7#^{-86)Y3()2=>%Q#~S8dCS(d^MPULnZenlnr4Oj93kzO@^twwD@qFG?{s{Z>Z$ zP^uef_-0rlD1awjxzz)*x)ccR8lBN{*8aKvGFDngnbs{Q{W!UIK9#b@)HEJKp9L&# zX#XK}Iyr8W+unq54zk7m2#|(U+?kLdE$3WMv;Ir0+$)BszFv?i*v8hI2F0#-?~z*i zyeiZr0~77x*dFEsioe{h>L~<_C!J5R{iPAdB$!r!Lpktv%sZ#|c27sn6!Swg`bnzy z9uE;X4C`4)Z579yDD%^vy@3F*YYTcz2<4zE)G>^h>v}0GiS5QfQOb?{+oMtCVLEFd zK^v#Nju)3`SILqb^bbY6rkY^6vz_Hnx8+7-_D~+`V7%OIO(U>gms^^sP>@?4Qtz9Q zq+mW$c?HJk=?7v5;cDA>HSml$ve_Lum94I%a%ICoNa8v;8{YY594atCd>dyR@@pA3 z9rCfAQ`sL)Wrm-{!L^ZKv>IpX65iB#XcrqjWWziBHhQ`-ivr$@vDZaPMS`Ewp6dniGE;JL+Al%;9IPE-0A$xRK% z;76BgP;P;Nn|diuIAqng*?tc+o{})`W>ei4$Y6waFO-3+903h?A#zv}71B+BCMC_7 z94ur53fC6Xhoq6R<{vZfpG>5o=0#}huz5n03LppRxwGaLtL)AhLKSHmRwZO8?DWjolZpd%AJY{R4XZUntmK;O4)-{ zcQly*q(O|u-TI-lGNRTk&o7c}Vi9QdKh|^SL2(qI4DNq;$;b#vj*)?xKSrKCb*>>} z)eqD$D4e|wJzT(tCXoko5B-{=xSHfVk79_rw4GAKb@bV->7H1iml2^XLd9fNG>jRq zR=4el_mnf6RSOOCA98^L^mI8jghXdc&0>cnYQ$4g;!qn){mSIn${kSx!W`rl`Oy91 zcdNR_1ZBM$_c28dXzU=65b(=&2H)riVL^g{ZAq9M2?MDA8CA9VBfojD(eaH7(n-N6 zS;{URWq#_hU_eE}8XX0L5sftb-1as_4;=UN?{k$U)x_HY9hEy(7~Dpitz1u zgLL`gGBK?5bVak{>JDs{y~Ps;GQk2uaa#XEx-{1OM7fkXlLKu4 zv6-PKRuT_mR(G8-G~!*dCBou*Vf3=yJV^-3#-5%ZR6=uypkuiaYs&)^!;xpO8o@vaN%4{? zN`JeBoi8>b?g6{XdPxAi)KZ-CFhmiVQhdK!h#yqBt@Uk2*Mx>MRH-pKR={`N?U7iS zW5^U{Q(#@_H!8kcHfy$(SwUIhoQNH*x1@rI81Nj!{Y{R{6#uU z_j>^h#tWHCTB-d7nQyw$G?7BW*OSQ&ojl%QLNbuhQ@T!XqKXMCBJ4n%Ps|gaMwO_vhnkxwm9l11qwp<< z=!wP#*(z`H0M$iJonvqVY$f;`pi>&-`feJYZDkXxBi4C)_rOI!FAWy%4)FIu&1p#! z8fcXq@K&Zw-a%%Ih3^jsw#>VQY9#?gAd5YhSn3y}Q}bSOMA}VK)3MO&-@pcASaWAl zOQGnQCy%oLxInbAucpgf#o+|_jTk*77RIPEZjiXW4=#8Z=%HE_v=o|2N1%lUis63d z?Ewi{sy*D017=3yiX2I;mOArPv_PSq%L9>GBgx8`>{$-=n)MqJcYb(X5GaTeD&hmF zf5&>aIbcM>T7iy81vR5!oiMvQ_vD@}gEAo^o8zCM-gp`IoQg!V=?PRuKZBRAQC`3Z z+)#j&5MQrT9V5xE#}D6lJr~@t2EB&0NjHSa-Y9UEn=*;EBnK0-QqdSP>MPKBkAZo! zX)8)<(Ei1samlzlL=pk3q0igfol+CqoCqDp#l@Cz%VkRza=^Z_}PPi1kP7n z0Azj(^@~Ph^{j(9_!sMpI8Z}i2S+8*i4^Jy!Kz>BPlb#FsOr0N+t+fP0nvr)fHLj8 zl!SvLDCZxZ_|rW&u%W_2=17d4=-SuU~kbeG>wqpY}3hVN9p_=JSMPT4zh2sTpj9I z!XnH;lZZo``J-yDwTF_{8MH2>txXADgh1OjP8iUL*ZF}!N-+j!#q9grnw6<)SPgp+ zG(m6x#Zwqp&|BgMEY_86OVxg12@`rk5%$!9vdpNcLD?W({U(0Rc>WC;_SCw)jvNN0 z|7RiM56hBz?zsnX<0>j2$!)>TNN6iOzF|hwJt-Kp`(V~qPFQHi{(3TEMpf)KStuXG z8TJDZH?VJ%)u50ajsx3QA=>8ne8aP39mHG+&IuqS;=CBwqaz5Js%im-D_WIs%|UPc zs+(NotHGp#@;_}QxuE=FY-ce|C1H}6qebV=6hy*h7eug?v%qedBfj4NqAS8d|6*OQ z7xlI?U{Swv+TR?a>aVWJ4|;K(DR_PY9CGa;pQd)n(Y^J8UzbR?QYvx0O?+4?Qp9r~ zdNjkC0?3Ezqk2PXVWazhh`iZShdZ3%S;(f9ttl>P7xUWNiG>oaX?Z|V7p49m{E3pnT?BjUU;H zv7w+z^F2pcSd;{H4apREENHC4@aRy|u5I`f_d#`aN zz*gml@j06lW>Cu*oW!Mz7XPLZ6}pZSH}fO=nem^I5r!wSdQaX#dp3l1qa1>hmcFJL zDPE#WfUH5TMdSqvtkXhpR`TI+VdJTk%eWBLmVZMEKFUwdTaLL8np#>5To8NAQT|I} zr}+3}#Xj#0<_r0)q5l1LBK}}lLhCu1_8o3@}kf2xuBy&z+A4Zi`>g# zos;lx@iW~*XhDHm-59=+05^Uq6J0`^#733prD{c=y z2G;j~tG;^u6T7w%{=uO9*z7i`wj)}T7t9t}RRFg|Q`!oE+mpt}*2yG3|LKo5T|xV& zUf7#jtFQuBMpM`bOFj62SWvgtA3l|%i_9met^-5NGgjD1PI2^C{JEA5bYy1JbS8QmIk z!Lw0|q4^bvAUr)3A;Eah6NZml$m6?J~PQlS1MC~?z8-fOfvM0XH%}H z%wcXz;WY?fl%H8zVc={zAt*A?bjsX=dFEv>#?z&qQw)7ZWY|ZUSA^Pcf6WZ|H1v88 zP>JBpD!fTS$Ko$(F&6sf6s9q@1&+3sC3rDqC_*GBaMEeV4AGGZ(!nXxx!{Y2V^spl zB9g&YRv>J*=%W21^S31j3E>g6kgdSaE@ci!8FP#1jbz|Kd3vIN!#jKdY&<58L})2d z_$=3;rrh8bbIiv81gx?wa8pWnqFA7GOf4fTtB3|328m~>aEUR31-&q0;rA3c#;U<7 z(ZQq*P}De|V_>Sfx~-HwsG>bVD*}^jQv~BsVK6TYe;N51fm~91sZ~B(FldNqEySa4 zCCVPSX>-FJ>vc%;aGVYl*$ncrME0WHl^*cLf2%S0?KJ{?lP<3Eb%qm7Fz1Sn^kJnh zn7<(aVcY_W3A8kHLc?1n4yn)C6e*!1^|EIItYgYPow4%eWku0kKB}e79TCDChNB2t zx~xtDIVyTwCfO1*q#)8}d|eL-ilFELb2T13Nj|79KSbk`tiL*zM$af|I~?)?68Ib6 z61hxKMs863Zqdm&m3j+?t>-75^0J^$(|C!3$|Px*~)kKUX_OnHWB)2JupTz$cfFs6?r5gTZMBYh~DQg>K}sNC`RmiUSxa zIYlNB+E6N0KqSM9f2fm`f1vqTC3RXnUN4SkPi|`8`_;$R13Q4Fs>L!`$A zCJ=s1G$S#L;tUDcZ2z0B4=_QDcRGemz_Vb2I!PmDM}C{?$b((Nl>#s0aH6-cru8cC zh^EX&)bQK!M9H6ttfs;u!0^RZO1EtRgWSApyT2lkt{UMS}a;Zz~p! z^AgqBb8_S#=S4i$!XtVFm;cxyhGlwUx*`d?__f40hDu%Yq_-}pDRYhfq*F$P)@>AN z3!YDsNhaShqu3jgm5xnYV-oML>mmA4)*w)cE_oXW|LEP|nCci#F9Vfue$R@(#(LkL}V1S*8iBhsjXy`uRJZ?FLjh80VR?BqJUO=B0<6xZuERu zp{l4(Ar4&@@ux?U=s9|&9iL9g+PD-&{v-~`865Prude$~T*7WYHtV_}iUV{!_+O0s zG}HC`Sn66ij@#!hy))PqMgk4ZbA9gEM(Za>0^5KB zRK;jlr7=*@i73tS*kE#cprqb7fH?UVP&X2Hn_ z-^GdsVLq0LWmqtmMg|@{KvN`V(WNJV4&-hY3+rWK)ydwN1iV8=Z@JTns3O^)2^FdK z>L}&BT}W5F;twAc3WkP0MNkSX1(QnfwPzO(bp7tVeJ} z+h-Mcvg{IPPV6PovR?+yG9kd8zoOrO=u2+ya!?3H&@@-&(N7P0k7+~7S49O@#&|(v zz%kDZIbX+O1wktb69L_{l+cEi@+(iY(V#vU9$P6+d^3t6e~BGlG9*Yq*yks`H7fIW zPi?u=DUrXuCrn2(EM*$6{Jd0J-Pe0dBmgo zWH6;e+|Io;bq{@^w~0UUFX%&pujnosaM%a!LN|J0uSMFjr&vp1B&%B5l#m+Clt}YK zX7`Hk%t+}0VtS^H##Ifh9STOj81lI*HO|Q`>)dGiaU&3Pi2ty$&$vX+&Cl|MpQG~8 zlyd2j@cg>*J+zOlCq2K$LXFcgDpRG@hM&utcX2M=-5OkvujEpR-!z5#gE#@I1-SSX zBEhZaDq%jLI@G!}&edtA28<&gEcS1gTVgoYqkAR27q<~xg6xgu=#s1&Aw9AP9BTp{ zOJx4B6G&eloGDelwC-&;W6h*Hho5~Kze55Z4Y3>>IeF2AaL$vvs`PfuBlbdfmjKyS$gWWa%n9_XB^a%a!;TSx~?k52LCM z)*A&jB~qyKr!W~OX|B3_Aw82-sZT(s7;Nm)b@^rgH|$!Va3Q;Pf2d=ShyskGqMX&Y z%<&KfGo0Y3qpY{-IP?*zGn)xex$qtWEajtc;9`A{|Ef%Sfldf++HzHX!|_K#a&Tp? zEmJm6g3u9&i}@=z308M4j)ju`bIEAmg~?)aM5*zf=`|3++Q7@%ih52i+``h8^IK+U zy6yt#M5GSlbJlL++WFoEbo+ON8bp@t7aZ3xUzseUQqlIqG1pPZmlQq758fHXBbm9! z4bjF!wNtCfB3+h=DKlGS5NVs-0pVd%n~r^%IChAZdQU$^mI-`If?p7i0D_ShOl9-t zf}0}v=~@YrLcWPw#}F%7sJm~;z3BKO>Z5A96`CU8bwAm7>iAjERZyGPT0niBxEszfcSIlv?PkjHb8^SKm|nAhZckL} zvaOJwY?L8tP8b3l8ME*j{B7iAu)>5vtkGJXI2Unhw>(|0b>+Kuxi@tgZgTt-yA(U84pTH^c&p06nPP1ARVpr;-5heUbPd^% z6}gH)uVEg;4i4NhPV&?e_G$o`5F%pCx&MI;^iG-ehveONy%W@|D(AXQPxy(dVHlEP0uDg!d+(pYOY zUKXc}1PqO%bIwli-r#sFcU0SsuXX)8(5hC%5wj=4V;4=o;WOyaN zhVe2Ovn{w(#pXUmKo`1G4lEnw3HL7703vHrxe`T z)w)S!Z*YZ6d#Fc1UU3UPgO16%qAZ&w_lGwgB`!MgLNDbK{v7}8Q*uW7-%OC!(@hlt zFad}zq{8b?uJoAw6Ynh#SO5x3pq>erOTMfx310ZhOh2~SqnBqeOwCSiDE8oGWvN4~ z+eyVUf2Mv(F`|WTWGEb3zVL^umyklm!bhy(xB&kd8`i&O@k&(8uzg?vyR znj^IRBA}8}H8H$O(qMw$JLP_yP1fV2{P9M7t7Q+LiKyrctSAAWCG}odD1+Coxd{Jp zmym2D7Q^0D?JX|g4ilSudl|Kmc9XO1pp{01Z-tARK$bW^g)+h?sFu7>#LM&7SjZB5 zz^8zQBL`>xPyd3k{_sF->6JY!vadpwDuw&KECbk|Hl<);q_1SvaT>^XEwH7CO+JyNtqI zh|J({4o#HBzK14&(8cz9pwz)R#qwfJhmB&<1Q3`om*N-u9c1?6Vxjy$6tub7yw zXB+oK77kG`TkS)PWG;W=E%Zo?p=N8p&^7yuad zSCD@Fg?sbHYOo`PRDGu!?w)flqZo?{$SJ>=TR~3iA~#m#zeEw(92?MvNG^eAa>l(r zO$M~y;_mZh{whS32Xk57nf>GH@mI=AJ7TR2UMI1xRKbMbVH39ChuMP_m1%CQBpi;X z8c#crgsb+OV?+C$T-i`#j87hsvSgH_1R6{(GMG!$TvBYfiU)&?6q!Up5I~6cM@!hU z%mT8XV?=l5@hgR5JKvrfQ1(<7^_z!Xi#q$63P zsW9(KyZKmH;+NYiIzk-$`D86_==v+Q%EN!aEG&{G%z)WBnVT{UJ^&FGzM(fMNxT>9 z&FTukwMLA(rB4VMlT%x7$GIUhi}%yi6|Tj0TqIP)-~i`aW638FWZ9iv=X$u@^I4fP z&Sxc4%_t0b8RQP#$5b@ZG4`26V|od~Pu#^B!_7I@6za=PVTR6Og^cKi5986+yrblF zHg(fPo&rzu$r=>Y4g6V;_! zJ5aVpP|wTh`3Np9OiytADX76<9-UNss!OZF2D+Tl#GeKCEXc-%>Cr@oD+r9GHt^|iIe?t3})BpVlpp3 z&k@b$KP6%Py;auy%pxIpaw2`epMnJ{i z>&EZY1J3%1=||h$JUFSKzs@j4aNS^;XyZc1heG)ml8PZQvNQGvCnptd20AsC{YD*( zA~j*efO9MA2jrRvqTP|o< zwaA&N<5tA)Cv%djMacH#g!sBt0L)NphX z&2p;Dza{wNOnJ!knzs59q;b`;BRDQKB&6U)S?0Q8N+gb_ID4t&o6owFl>x@U(gT$d zkLoT4zWAC~_~k$jn_skEf^S_;C|$+Svr0C7EU_inqm|ciF&~jss2uG=Fy7JxHV;$8 zEa5qyRxNhb78HS~SXjIa1$l{k+-FhO)9}BoHHYZjEO{gm9K7v@Mu?B2x<_69CgS*v zrxpf%-giU{ey}m1BHj2cNk5-HN<)Nuyjq_oiTnl2NNi}WCyVRfnm zoe;aTLUbA{XJmgn-Z2~J+0l>9mK12(Q6xW_aC4t+Bg1il|HWESyv#xb%gn{QzY}gZ z1wF4wBpOW>QdLJiiV4#?*c1KOK>9LFOUpOmqd>gOwbVEb`j&B!-R`$KNq1EJ!X;vadZ0v8mcpZ*M%L0tT&xVw{L9E9}R8 zx{8f~6krZh?;W#9n>(wW(DUp-V!?)#T7-+$A+CM8&++R4zrvgDQvfXRuH4WU0XD?g zh{QzYTab8M6u41P#tA75Tbvn7Bza{VWYV2ZYW9&JU8zexn9C^I#o{r@o8O&E#31w( zV`=^_GAjllX-ygMCv6qv`@PP*I#=lQb>$X)@5rw4DK`gsx8`ghGSHc6^f|1>XO7*P z0aT5eG)D18S{IgA*r6Fxo6!^?KR8A`8_z~oPW9@M8(vxlS-jE=g1K-NoSkggESM@< zW=z3=kFZ1rU6&G#9P@He{>OW+V7bFuy!rlWzO6x{W7xcj%ORy>XWo~wsiuaUo7Jnl$&si15ge9d)Yz`5WWUX7;Cm832|`YJ|k zQtvGSM=imhd^O(k26OJVcmhjldd(56G7m6I_R^w?9OwqIJ91|eF45V&8p_D^xg^ha zwNLAh!?%K=<~_@Rie5;Ia0vBSLtvZg+w>I-C%m{d`S_`zK=9^)uFZobO+(#N$x9|3EI67!nTVv`LjXJnn1k&pu?uhJo=xS@wQl zRU4bH+$3!UMwNp)oB#-I31&fC0t0_8l9515vDDYEZDN+&v5};+bISgn3UvuMw^_vB znp7##(HDaUmUOKqPQ#_ZB1tvf@gcx;@B9mx@lB5nGs`1rEb+?y5(>yGmDvZzl250R z66s&=h9PE$HK7CHS%+sRB}Pv;lk=VQt$#eC27_4Yqo(mudL6QkaMvc#BQ#k6r;%I zecp>q7YGb22qh+5L>2PJ5u;l6=<1`AoK9&|uLT&@t6j5dadGhoG9IW$frQ7>r;M*w)x>6x0!AZaUaFjdw9!oHZRQL z)DlfD_xm;G-PAfoyk}7zO2Zg0vZY}w5JY6yvBPT?tJpIf7+yF~bW=@(Lq9}G+@J`z zDup&9|Y_-8&yhhik6>a^Vtu0)sb7Xf6lpno6Z*@SZXoIy`kQ4cbJ7*1B5r$+u(KW8snd3 zjZBtig~Q)ZNzNNAxlgR0Cx+muG$_3qEh;!wWa^DGP99h=A`!YKleIlmZgj$hG4%;3v1qAWoCIIDLT3j4*$fKwTo6TL^~`q|V|*ryP^9%Mjx3ey zZY!?B`%ZC9m40R$+DvKHcGM9uyrqDQNsJ5(H|?j|DSZAl7q$uzl7h@`+;`~;g_&(C zBWwRoO^QWJleJ$*)Iw&2R&-rx+6jM%cYCDCXZ65LxCd@155p3bfbTLKq0^2%Wg_o}w+BLsW=X^`J|dPu;lG{d{hZUp^D5 zMmqOOtT?t(_7=My<^1I~7U-1;jkPWTn-boCnADWk&>%6cJQ$Upeb^`)%yz(dt3=>ScG)X=H@E+TzdnTfn9b1`-~8 z7*|MgOV)y(?5cp=88p~R#s;`F$ab+6db*TBamFm$b8C3SipZR6~KS3d{BXZR_GXj zf8XVo0u=tWL?QhDwJ50p|FsnVzc2k?>*)W*{r~O3{9hl=fJM@|l=t%bIHAl8i6JI( zA9g%&oJ7V#9G`x5YkQLgoX~sC&>&FmH=E5I`xQgK-#n&Zs^m1b10dJc{s#!^p+Def zvb`VZ@Mir$B=cK+W`^X1&z#|j%U4Ih&+0w`ISaRuf-!^&-r7MpYaUNL4AVRYnOPPW zZ1kd+rELGsvNsaWXBT-X*E^RwFh+wS@nB$j2c^boK$C|x^K$LaqKEe*<* zVqoc$^SgdCnE-utNS`IptR_4l6@1%HDBZdAAGHP`A4s?Vz<8_?s;T?_s2v2Ow+@!Z z-5$mK8T`-fFVbOp5P`DC^<|;$%&1$f3ft!s(%A&7vqh8$DE{N`%?{mXY%SIszuaFx z*-j=u=N3}CtzI#ARWw?M)AWD0Fjc&k!SiK>WsmN?h0%>0IKg+91n6zT*8Egs%>5Ud zHdAfTYQm6H@vT-Iwig6M3umEW5aJS^z}OK#b}kC-`!@J1oSV)~;%j>_XbzO#9IFqMo@gxM@U|mbdyK7R6m-mv9dtC7Cje-d1|H%R^C6v-tpW)Ls@|pCH zGcO0M+8G3G@7fWljE?#W_B)1O`;13&Jr9M!PTBGj8iskC%z(u|eXFbYSXBS;5OjTI zkBvysfbIyD`Lnu{G-O5(?qaU*Fj!wpLuIt}9PDhaLrE_<45Qu*%vfz4^8Xh+>Olp_ z4=3a#Suzh$LOmwU z*s_1jDS{>l58wXWWE`HD#Xe&t_4Shi%fyVI;V$}fEEj?7&PAse_za5;fp;~i_QbDS zyIe9P_zxndn=zCpNB%dLY^f(9IgU=j!M_CiNq>Ec_#zHO;CZk@N{nukxVKogSjVsO z=r~AnhXnpzCVn*!@?`b-W^xOKXYVNx{ZZF-Vq0CHA_xD*3hNgU>1M#!A#(`6ozuRh zI^Op2PlC4Fg|9|}e#xI%+XKr$IA{PAPc9`jcvO%Ck-bT`M3AwMeM70er&`YE7#M)j z?|Z93SIc~5`!(ot!aL805Zl3!vOCHL2;nhQ6h4?nL-s1M1KB+d7UYW+N;RRMyHG_1+GO_F z_F6%Aw)_h<_)qAs5*dlfo`=EFiPdum_hf=keq*LgdH-;+%FYhE_Jx=KN9uS5c-NoSY1-jz=q ztiBZx4!w2(yI0qO;4Tm4Z5cvdNlgt%#vwM2toWpPXCmB?(+MS&)14+wx<@aQ=wpA(AuuJ2!-8M46Ht-^KV(tNu8aOi7a*~ZG6Dxv&i2>KYZ zJw&pDO$k*3LUrK9=(Y`OTn0bO(YA5Sv~dhTvel`}HNqG{g<2MyB!{p*gq1Doigz|1k*s z3#FCy`d50WIN}J=RQ3R2w|C|wNkJyqW!nDRC<6RnHFXXQPRMZrwm9rEY+%<{Ykqy3 z&=X}a-yp%$k$mKY(XbGq8~yu;KOb29wVVB$Bv_#MaZ?=E9qq0zZNe@q7g)dCpJR;^ z*|u{Nb}R4LbP6P_{uwqgpfF2_A5^FJ8!P$JcsEJE#Fr31WGVSGE{qtX=40{@L7)~Q zu<8c7N%)k>LKAXadjIu7b*c_h=j5P_EjyymEi||LFT=)|kbR%0#dN>!SH8VpCmFgw ze%#c*twVOyVbJ|7zh>-grH#JtITC#4T7W9(WZ(l7@G>mWe-fMqISa`X0K(8#)C3ki zJ!m)KD`JB%h6F0il7Em=q4~0XZ-5vzY}FP4rh(`xe|5foHQ{sBnRnwmB!$$`-4NOq zS%fy#jr-yzxJmb{_2g?`({g~}1>G2qrQt_i$&bL6iKu((tb33qp1*?totl8V#kvJY zvjvvbmi?77=?4N*Iv@Kc2)IBp*{k9O>c3Z$rUS#5o3Kzh{Bu)rcmCNgaN@??Hau{# zyo9k_-xe~7^uUYqqs@y-hR{seZatlF-%MhvOJD&-MT3&N7 z{WBK&n6ftWKn2S1zlxXUix3g)>yKHmnK^U8w&wu~gF}+q(;B0@M;9y~-T<=4tx8rFf4Bz^X07;Dm0UieFuO zAE35Fx`7Yf0*?(l8|s))x~E%z7ke~o!dxg$J(na#g9(vR)gM-mg7s^HQrS;DzjClV z#qBce5aXte(7KXYiHu&O3@k^VhDjMbO3mExy1%%(pSUu< zfO(yKxN{(QwBRLea^v4H&nDN^w7xC&K9b+CmZ;Nm=qA$Jk9cjjM2Wyqnbxtx=o3)Z zm;+zAx2@B={)G^@M+wjmXg#J4k3IXY_=$4v1TW7JjuhLePb5$=aI0efSphW;pm^??_JC z5dU{%@f(7VTm=%1SS~i52cgaj2ok zv|4uhW~w!)BD%%4GlGz5u5~ufg1Fg6J4L>Vk-uo{F+Hm7((*@~G=N2yz#5g*&w#_N zp407YLTU9*h<;1|MNZ2t-q?{Exv=|`fnq8#z64H3^%@nbY{-@?{Ht`o5b~e8>ad-b zPjP%43PyTB9Hg~YO9IreuPG~%<t{Ht#Js>Lk zT34MEPUu&KdGaeK7Rc)L^*0(67p$v?Kd4q7Zv2qV-UuHz(!+%`UiD0tOFk2C>Zw@o zN|J~DK#KbMc6pQi&t$H`pJY1s*c^{P+Azt&cL?EovbJaRHg|$o*`&Z2zlsne=1rX7 z$MY~Ho772vB-fr1wRVqz!R?J4;Q3}?_D_sw9z?J=I>sBlp~4>eCe$7gorj3CJV^cu zbH9;7M`U?nQf8m}-$5fMJYgVmq-Q%U!0q8r?i>@&8d2{dU4Y+bPOVJ?LI3wwQym+4bq8 z1Gk&jIA;v^r4lPgMD0UflY@yf+>|&yMZ9$+kv=k@L*cGngdw>KP7NPw@m*jLohHSD z7)1Y!{%2$DqQ8E1kUIM**OyXA9SB2hjlCCjJ`_Se4OMe8z2~&TeLObYG-Zyb7(1F1 zI;W=mRwpu-YrBLKLVC*XvWWRy!pu3MC;O~V zG7&#+KFPrso8&ivVtem7+v+*-d~akpZ~kzgw$CTj(_0xbI4`{uT`Mu2yH^iggC=WU zR_X#^9vdpg`cl3@Fu}?U3GCHPGm;Ex7{th9ORrr%a?l5posjAYc|o$~J+B{7DV2-3 z(V~O(SI2s3v>K5VTg|vzMhH+}rEul#SLHu+F{9^Y2wi>tyT_&N((-BCd@E1?n;R;& zW5ZA9v6$w$%C}0Y&@N>0SXIg6tk>Fyu8R&uH$t-|-PmUjeokfA=j}$UPpxi$S+smj zXbR%YI(qM2hTI-1y%Mpwf!$rCp7w6~Bq$7N5vQw9Pebwgr^OfiL@f7gS9`Uugdg`i zXn2?2-Vt;6dSw~(GeCN~>qFgb_S|9cFh*#Vo}7?38;BoZswc^uY^bY+d*mQreaDP$ zohkFC9+@<*l%juYj|7$3myEuS1( zi_}nxZ>E9l4%Wh1YDnM*%9oD)?TriDKKGKQxo^+M-dOTn@*AYs8l3DQ?1DY+&+P6q z6`-`c0=t-jFNkRI?xUh2tZ=T+p8Z`6w}o!3KhC^Ye^BVfpI-f**XIv-tA5v2C_(>SG0Q%NKK^kx&# zTDw?l8*lAh_-SCMC}{I*pJ1ydn-^KOK6OGPR=s^W)4n^Rv6NG;H%!_j>yTUx?8qMZ z`fEaC_M>u$F$V+*3=G1u#|Dd6?l^s37RiwY0^!GxN_2Muly*zY7)ErZG_)(r9wW{#98qqgEW=a^!}b~I!atNy z>KB+0lUJTX$l|+Z=sY5KKUF6cRH$>7f0`g#Qw@aXSU}Q_TVPcIsg>aT9m}-z*L*uvUV6g24MiZuim${e2Oh=uo=D<4LZwUZT1tKa)3r~W+Os& zG{$FJh4wbA?5nKmc>Vt~Z7XK^Cb{Uwdzo%4;1LDSyLk zk-9E)oFYuRou$KrbbiU352Boj+Jv+F&cT>1S#dOVq(=aBF!8}#E!B7iP0`ww->|sCV29p_cmfj&m6$73uk9B|Am#p zkargnpIWa;_pQ)X_R{RtK24t8A`1WI)mU{mUa#e{>~dYZ3(nLD4gIk_vBY8jk@$?! z-Ti18{&x>M|11yc7y^w2KrGECMD<4{T|I;m=aUKj8I@A}Gu~B6%)bd#0YU)Z@%<~$ z+n*e3odU0rxP1ez&#j3)EQ(`>sMt##UEev;UUrqNR3AoCx-AJ36;#jLQ_f73396=R zell?`5&lx^bKQ36Ehlo{cp!7%=Rf|gZNLNf>8nr-gDD&aN3izYG%ym@ziqpRvcra( zG;%Eq?{fTx-pw0&=!ZV^5|F;T#%wbMKh{Y3yRoXXEa`~jjdJ_-3< zQ-YaGsc9->9Wn%DI_#;1Sy za@^68BYxKCffa%B-qUbGvi-}!<&cc%h3wg{yL_csOcVA+?5*-}IbhA@Z^QGx|JDVz zatwek_ZL4#_&7g2tuq5kM*CPUz^?SlUBwyy^#}gSr+#qJw8r1yzP3^XgrWkVYWZZZG{CUR z#{CcRe}8Zh-sJRU0!|b3bHRE`670*a(Ne_Z|wko zNEg@wJM!g$#oU+N2Hdqt8lx%J(Gb8q@#hG9y4U*imk#aVBR{!fM&oZFC4c2`Fj}7R zcNnm$LdHLyk!pmU6R=}k61BoXZ`xx$3%zx`hmZf@A{rwz*9e9@<<-}ZCd=!FW*~`&cGdWsh-<%K^!J3N zBvCu@Df5ZP0Zle%m1lC$|HuDG{>@4nn6Um9!RZ#)3puA??9m@s zdTu$j_5<){6z5gYp>uyb7M^VPkt)B+)QW!hMe#DO3G9~j!Ni)@kO{P1@z z#l7ayXmJ%+DgYE)`Ajd|6Snr;V|U%fTmE2umUyXI_o-a@V^BlxxwE9xISDgtACtOj z9k!#?+>OzY5!QAyo`y^`3_tpyE^-mPx*1L=GVJ)-KKM&S*G>h%JoDEWe9B_UU&rV^ zKKS#iaON@biGT479EeCl-*7^E?<=)UISsaEV>AUkaw9x;vo5kl4B&m8 z&{Tvd%a~dfpaNh4c;gYDDR#BsjxQJYG-u3sN;3HOgkd7B z$6u)r{1p-a%LuZ)8}=ei{R9N^av=1 z9}K~t!n$@U04mJWarjcdwdWqS=YC#w?|+nb11TYq&aRz#e@v43c8)_|Oyd2DQjfSR zcz1l!8+X&^;ou9p*hTP`HdtOnnWhO`r(OUR0F~zN_gZuP2je5W|CevTVV0H>U+e%J zyWIbUzde{x!>`mo2KG(}oJzFdF-s>kA+Siih7A636>)5KB*i6u$^;LNS%_XID-r61SYdqpYj23a8iU><&5{_G=Qs#~oXUezo;0<4lT z;qNsRpaQ^duH7fyr{=<+oZxLY+vDyl#-*Q70iYVg-6 z0bJJs{vxc{lQHXgS}FjPIr;BlxO2kVbKiLDM`<0mClHm)TF<;sXokL`l)O_1X!Y73 z4mcv2_ZR;PnUpSi5wyGDsv<)H|8@{|>8t=10Oiu3h7VZ`nPZzyNE@^^|MNAEh<>1}giCG0exqPe#Ml9^E zo!K-Br8x`$03ZNKL_t*V{>?iuY>x3oGjn?Za;7E#DoRPl-<B3bT+E1HXY%|9K`byERQA|LDqEBpD5(S5x3 zuFq8LeI&CmoSc0ZqbN%8ObwlRo%RcW8L!VjdU11Knb`E zxUO^VX{A&7Tp#RT#Cex007~Ga78Chj`ovE;Wn1MZewik8N2ZVUtAVL*;u)QzP_+VJ z%5e#~r4%q=^MIfk5B<&mpL7XSiejS|US7nkfLIPbesJ-wmkNL)`E)Prv!EDTCJu7V z?>;bZ?<DvVl z-Jl1f1kMY=`XZ7xABw_HM;6~YsQ|FZ!%_ITg%f1i;0wI%_X|7SYalLLAXYPbL zcP7aPesOihv;M6xlz{%c2=M4pu4??QDYNHI>Fv-LLo+xRh#ZqS8I2zC&=l}E=lRX- zc>;iCd8`(U=eXw81A-Emiva=KE~REPgKqO9!|i)m?WAh)xBG3 zJ}kC8l7yZ)nmj2L+Wn^{wb$~%p+EC1#I^Lt|I~w0B5!I1ZxL>Q|5#*$f>Z!lz{;rK z6Sn`6%l=$_9lXYpnp{>3G)++=900& zmXCc#D!mp9EJ4+Ed0G}Mj8XX?%(wQ zmB1Cva8DQpE%w{^azA{ys{;8RRfu7l>SUaW@rQrI|NimUY}j)*tCelp~E-B#(xk_>&XA3 zc`5wYK5)79AeF!a5%_u$xA1>m3ZGe~9)LwhdiVe%w|#@rJHJOZI?CxK{vNMW9<5&4 zfrr!bh@^E#u1rtRE%_RWX-dDdrWmJAKeYN5$Q8W^1X#iNH+f)r!!)~co3GuOHkrBn z@$T}$st_>N3yooI?N4KFZDyY+~rQ zUnCo~Z&swkkQ>U10BmZ4B@OD%RgS~}+I=(s+(arndZL;aU^k{YSv3Q2bj$QzG*k9Y z^q#RqHWUCvIW;b*mWq?H99E5{)evK`90nq#X_ptACuOK}l1xfj4Q^VGSC zlo?P@tu!U)5eeHd}yHEr&IhEJ4+g7-i7WQ z7o&Cd68M{?Qa-ppDis8F$EfRi6JWyLh=_oK@H(nx_Sa0L?7ik^3IQDccXo&KA)nEM z@bn#e@XDZ=K|zTed}E+~*J9BLfMn0}?D@nwBzvB(&I6Kn0j~>bSYR>ZbwbN5JC&^? zuzg(4l?#`_SzY2z-Zdd%fsBR)W+jI-St`WzJq|d#YwqD$V>Zrda64uedEvui&nB>K zJpYe-H4IP=NBQ6wzxC&Tb5I39U6AVE#om8Eci!Xur5b>>A*m5oXTaj5(>J?8dU{xd zfMH0>+6z~}c}rzixno=s+cN4AID)hZdnYE{`Gz4i|G_y*?4xOWJuKcC1b!wry{BP+ zL9je>6GX@KK$gK(E!Lkql7Vm4sR&p!0>Dfs+5fp$kQuKXe~w{DqmZ?YI?!h^;xJ~; zMlbNf7(6~W*}J~YCt-n?E|H6S$G8j^N@~~`fJ6rN9A^AaZJ#~y^2Oc1&3P6xdH60gJ}0?EBnhBoDq&lkeT+GAD+=FE;skT@HB35?C3q z_B%`ydhML@Z5%pg_zqfMDzxWz*F?#|x$*d#}6&}gM+@}UI($(vb z-Im7*ekV99B(Yo$SQC2T+BOV%}t!S9KR z5E#hEx*diHj|R8wSba`;O*KZKGC3Ge!+3J~W<3EnoYW@$6-p5l`y%$f-_Q)lq%Se| zYjdU?r}euYl`ufZ8ofA5#A(1~P4MGkYtO%F40b1Bowq(df87dzo!|Q)sXdRCwu8uu z%WpI(G1HM`>E%>@m#F=a3ql@=$+mj!5e5!Jb~L>)d9O-+V<1%l1u;4oqe%$~9Mb|D zn`Un=<#$OFstrx@yL+Q@UiHT(C*&30Lt)aT#|a)ozPcT9PS2M($mB${#Io}K;#sDR zVR)U=-ETu<>A5qzCm?I1``_)5&B1i^TTC=O5Qg<3Q@jAL`e(g3%HU-oxM38c7LIY& zgzpc*|65)s_Y~8tze)AG?)nvxZ(WVcu>R2!S?Gztffx+NE4=7HqZisd(C(L5q_<3W z{$Qf=?^~&!-R|yiaiX-{C$r@PMUIot<)`Eg#O3@NPtQCO*D%0sh}J`G03jscuN;K4`0PP9Y;1%zjdM5mnT=!? zZtI@=?-fJ4Z~C&soC!DWwK(a~kPwc4(`oRzNA#j7lb?;iZ!J2Dm$;$#cohIu$@cqi zX3rO1&58zVh0j9?NrXBWvwzliF*JKb2rLOm^Pf@}NlK=(QvW2fQqNw@DeEw#)$Qh{ z(s#q@EDR<^3=AbC98oR9h&)bM-XLXtZ8kN~dSW=AbY~+Qnx?Pn=!?PqMGT)gp-sk% z^YxvuWW8P#WiXP3_wBddLG#A-#g!4N0GJ03Y<-B|zyDlb+L4;`;_r*en9Y$Ybe(&h zQu4PVAdP^Exsi<~4=s06>X%4bV!_2;!67%CWU=|pT$rYK1;&yvnv(M`lA52H1a60f z)7pF@o?E^4&d?Z2z`ecpZVWD_qCX;G?`Md+4ONRC|y60})TkiY6 z^I(1ekBzJjP9KKJ0l(i{oNzLLOIAVfxR=5w@6(H+OkPO9Ck|SBt^?S89IUSK=4^G7 z1o(@8yqsX9hmIxF|2${Hv!k$mthNkeIx9&?yCT1dZ)_L6pH}AFT91w}mR39Pp!I__w9C{h8~c55T?O`xL#;Kh7~TjCl;F;qHUd zH@%j3#p5Y>atQvgA08iqiS+Cupv$ip^3Cg{(jK`$M(=d23z(4DH#*1ONRwmIfq|Zn_KW&Yt=z zlgs4frhR)iJkSTjGt>^Z`6T05sehV1u+&eX^U&UM~V0_?w_qvRL6j3T_>*?ay2D0^pBd`6n`|1e>R6>9}(o z9v-l_hPT@2i-~vRo`ciJ{X6}&>4sH`r^N>=8_LUmPiEnn5%DrTIecgjfO;mIcl+;} zsLV}v$t*Jm4n|9#)@Yjfe5R-V2$_^#1my}fC!8Lz{`~LNxEG+N1wik%$JqJcZL}V? z(=`zn`IEy7TiQ3To{$9mxlabd^c9X`>t|NnI4DUC=j23=kC=Dzy>ZTA`EczIE>ctsO_3g0=(yYp9Irn zQ{$n=|A`@SkuOF@lki}_xP*^y6Ayr4z={Ugo0ECyHF=^=Z75?%qZy|myIsfOUmYTV z4zEwo=KpW%*Fuw-TpbC;fLkX2?TeHj(>G1nAC^b6M-m2C2JKB4TqsOLFP)d;-1qc%Tl&6WYiMu+&) z#Y=FL<&~=^cRWuH!OjUiiC^4(_~E!Vxp}Aa9ptJlB;w3>k8@A+a2fN{e?F6wCLpP- z+?3-PX|_|#!XTZKiGN9(cPI`+#!{~dNpJmHoKD>zgQtdPPoymuj}z7fMUc+KGo!F= zwEVwy?o#MnvktzoOK*BMaN`*KV#L~W&kw;}o74j^uRMF_^_aOVtEO}{+diho|A-r1 z90qz|RX~Km@__8-=3Qy#Z-^epWG{Jd{@;!&upq8{>sp@^8mH_KQ(37Z8BNw+Vw~F{ zgMNCWFlJ+TIA=p zzZ?2?!jcUr<#B!pt{=75migW=98AM9ckO-7niT-g-+dz>V{t(eX||5)i96GcZ(l@e z#gA>3?t%mH%I(}d&iwQ^*QAlJMVIl^!8dI_sS6)XN^={thCaixfYhM(#qH0DNoOU4 z{XkUmZrXj~6sAOvEyIINPBt+8eksGzAOru=b z)%)@fze~P4jQU$U1L-^$bc;)UINt}qR!+GVuL!aOk;-~9h7$64W<)|eEna!F=D!B# zVV4xo%B+Hc{9`^V84N=@cQ&}^_M&XJv4m_QCHXzRt#`o1@6nr`4V)FQCIA4gA5j4? ze~SLVE|QUPj_Hsa@WTUj-oV6=32IJ5T#AK6xI)rfVb}5E4ut8Au*sxLYcwUb$;GsR zbr@pg{dr>_aMh==p9`;3cGaDJF?OS=+7O?9XFenl6N6D{vgV{9DByNNQ(i~~U1BI3 zT=|y2uIY#5OebVhxyf9Oct*T4<7pUA&d(fz8F&6cYuD8CWBC!rHen*kgsZpS1(`Is z+$iO7S^(Tb5~`Vt2O`juhUGQ3>@_I>26jIyF}8qo_p8McB?E~&dz_N!R!D+#7lnDA=(CI6FoNPVga)_(D%_km#(PZ^|1e}HpnF_l_2xR8@4X3j( zls!}wOlL@)4)7S0#w~5iH`SVl;dbQR{w{0R-L^6N-$Q>4R>vn`=fkk&9KArxB;b%R zz+)D}05^=n2Rc;%RGegFf=<6=X>Y6YxW5CrDfpeT%ken#8Sc)7kB|CXG78yY%vt07)9GH33kQjes)AILjK~u|aEDn)8X@C5B*S5H>c!<`${RUeX|) z+5&D70o7nQ3!aAVi1j#W)|A-y{)l*A4n(SJCVVvrfelTy(S6aGFXvk|$8afSW;*>c zoXc6n1>IJmb0d+3(KM0>sMx}(4U?Xzxp*)F`)aHiV@+Q6W;RXEoZXE$pEvzhuNeF- z&0_4k{1RVxJF0(&?03qhVSl9fWT~7fb<{mkNoYC{k&wb-7XxmG7}gDq)sqQ78$q{- zmM;J7WoybLKBrV5wfl-czRUcTJ0}KWz^+FjswGjj+#elqqQya5CUDbOZGFC)yxjfS z=z`Y!yA3h=YeI74T+$#0zZMhX{H{r3-W`!$L@5-+z=6CN=#GeMIlG9(fX69)7uGe( z{Q7FfKs;9)8)b)TXl!Tt8>S)G``Shcp_O$1aLzs%up9>CNc?2m{d%x$;;bTO1Jv4Z zpqdl_jVm@0S%3hc*CpBC8=K`O(BP`g7`Wkd;cxDwdDT&@+;Gf`|DQFXJMO0GxbyG^ zTT1@@Ia8YF^u{Diur~}NiTO`Bs}{UYSP>NOP@u}QZk&enuHO(6?}a9L943&OMEsY# zEK38Gd7ncGNl4?_d-R~$#Hj)BT0G$QMr!M`)npQ2(}q*#eV5$fo1YryitI!KO*F3D zM5t>ufsPe;TRSoGw=mPpv3191NG0L`q|<30d*mU`I`8ESKJt58>f2%&dGy6aG&Oo; zN90dGhc;9(0Rn-e*>WgISRQUOpgLR~9pXl^GqR@qsMh9Q&mn!UBR5%LCG zXxnr$Eo+a(-?n6y&*-3Q{3e8Z-WlD>ky}vbS^W8~&MPr(QU# z@h`A+_4*@s63GNxx9=k54pi*DCi5NJc1=h*Vqa|W%%3j^fwhei9`IE8mFO@eH(+C< zB)kUeupflmA)dYsjj*N>T0E7#L9VLMr8SrU%$(){*en37+JQgRP#!?dwgO&t;yFBj z&rKD(5v&Q-mWw*Hd_619xQsyivZ7zRbj|d=!!xNAdq+%G_>1cpSPJQ!>@G)=vi>2r zJnFsikb!tWLQUdkA5JV>Cp*jMTK?E%^6ut|biS*dS$k{mcS67;T?ze8=2h*l48l{R z_OF`=0N}ZM;Iu2$dfPyY6IOYwmHF*X!phTOdE`lgD3LgS%O{w7_ot%nW7+tln4 zgE|tL>6VjeTeXSd{oCzTdY;MBxN4_k%W14Q>lHZNBU0PmJkP4O(0FJ(CE_fYPa>?U&*NCQ~}9ue@<((0%~`FcgQTeNRh2fIth14FbRqzqMHBf7^r# zfQobMC0BFrcRy+CF09>G{h!<6a2a7^;ELz~Q^wsX{tyO0r`rE1x5k6|X@$XMK>Dksp9n z7=-0ya)ySx&|=#meL8AI9Igz)6GQe#PX-gPzA*>eAB2-GQ|oO5TYS*qfS85z_3m(O ze5RTf0LNeQMq33yv#s3-`zW#?BW)0%nz;{xX-fZy=^OEZ|O;a}%JOUeEil0SHP95O<{hW!y!9jYEQF)FWB=a9Ha5TVT0Ft#iv5k%TaL5* z+|i`W52(hz|Ai#NeRVppsL3NGs%t{x@la};Wx>jL9tYyUj)x(e(M7h2lZxLPXO zoVR_n{EM(kU8;t|$+`=##uJ#I)>0c!IIXDXC$g|RT;1L53Ka4NdSf!MXxD`7l4`yA zkk<*z8ens?#FKTjZ|$+F0%3rGLSDfOf6)cDku4Sz#iKd+Ypl9IOI_S5j=tb;S$X`~ zW&Mt7P5xVT_T>bZteLmJxBl3ZaXO2Og=BK#35e8K%srWvWU0Mj*f|dUHBxdnKmaV=axy2p;w>e=zS?5K-lld|owG1)JdZy0B_*mT7)VIG-K^n+ zyI2MeY#WAGq@-|3 zg9rqd3W9lOWzb%)j0udUQ~=n`W)%R{%df8bPr}W`kHsCY0$0t_6VAmGSor>thGB5R zOYG^gIGm6jb2?X_Hvq|LlXZED zdhJ+pVcoe-kB`oy&#Io?$i`!6>0D~tj(PWl^s`?KWK9VxjU?b;R6hH*QP?>lUW5L) zoNw_=b>|d#oD!E_7LX*u&CTK|SQ&&)zce5Uxuq$QM+Jf{tg*S@*Kh(z#bDo4y0|vs zHej8_Jb-7a*aKR30^sTVVt21Qo7-Oh)uLXTLw0csMdz_+K8#}n*b3)J!?zf&8IGB`O&3xaioGuSt$DUnv>$!5{(JWoPf!=*_lJ&>{03ZNK zL_t(LZTp>LDTroaxgQ#|mpvc`KAD}p5s||XoyZaxztJNyGfU@AfUH;_?Nma!pS;|5E<&<8NZx zxD8EbVQ&Q5{m|hp-9RlSa%TCR3LR4>>lwz(o`oE>-OHiYSrdZi#<4ANWF!GgcRs8O zyFdb9YaCwNQhlGH?m__1CJy~~#_i?j@4K1aRVQ1&SW@#}7TC7s)T&+6)~;o&JMQF) z{O+MR>p?w(*txKzVZBIS#QoR1kcqmd?$(Zkr z)z8RYMJboHHYNiOClFP)=W$(FoA4OWWzmPeRRuuhnQf7yp$>lf54SSWyu#A&N}H0b zHXpTHZJSQ6`nC1?1DtaHB^CV}qe;n<4{NoOqOd$*-wcP*Wd2^Z>#w@7HhTfAu)9i= z0P9Ks%;jboYhS|;|M`AKIyYGQec|+!k(w34a5!n(aAHlY@A_j;Vab~H75y8ToKy z{$AFU1i=@DfO-TJ^#T+x016dSd!NunwTUh__$*ce?5V;{Ox^SWIGBcn#hCF@H_*Nc zharhJUIz>&W`B)|%!prZLX%C3+#71a*W6K)>wV_SuVCQ7UgDAPy#38|PK3Z{5;_|o z=t5Ddk{6pJnexcyOD+p#m{Y&bT5_3hl5mG4tI=?h_1509theK>dh6^?(o z9wZwufTbR5#(hr}js>opTj<^*)K#Yo2(^Ky0V5To!w-I!82Gv3%{?(l1MN15fW}pu zYj(Z8{s8B`>J9wym*2~5nd6((nj@lEF>Q8kmD(g`td z?Co|^1za<4Op+Pd{6y0b&CEP>D~EL9Y|}gdTj_LJ6aeZ0s2s(ptIk3WTiXig-3~y| zEv~kn=-gw02V!!OclpXQJfS6PYWu`rxrWm(cm)sN@w)~2`-u#6XQa=3yHDb!ied-Z zeAmTPR*ZcrCp+&{m9;uH5FzYCCN_eIlJS&;ED!G-IidofA_Bk)(Hw-c5OS&jSa=Tr zK>NxU1pr9R?V6Cp%I2D3Kb#Qdy&_op1hhcM%9>yI%_pD5a9@?9h|I20Dtc zqR%Jbv??n4sviMh(F0%r?S)U>wsP8^xB0;DmPSCSS-jhkj7)P|87#hGhs)Q1H`G!W zYk$VYuV#E?kink)3;I6Nru1zXjLSf$7O%{(S9CXD*vS`+d@}F0ulJV64K8`4a&m3F zSkk=vF*xxOJvr>~02EOby*E`|0-$cH0IUjt7N^W|e$fLk(}m-N^&wc|pM8g)%+I+m zwn8A#v9fL^;5eNwUiR9z($v;jH9Nb}q#T#s6S4!!X;Y!PC!G^fK9YpqDC`Tv3uE%w z6BaMgPy)g!5d@2A-hsyfD+18!lj(rk4`5+D0M(WUP(K2|;=*=JRclLUufaDAxnR~e z%^qLQnUX-*6Sdy7CeXQ}t}X(vzkv&1e+>i7fQR;DvEHM&XoJ5!N!9oEWgt zq=bCBBho&4+nAJz?hniH9!*I?oQ@_w(j%}p3M2RYS{K7c4}jIJ+}-z{;7@*>OAxj+h+Rpa()Oa5+%sNsy(dWY{MQ z-)AJ3L#aFy_xy_N_%N$JbrVL7v?H%tFMtciEo}VM15g1D6fr&Ska&&T3(Jox`tLQk zV0BO`213)ge@vh+E-vTkT#yC^zNYrNy%^e-uHfZYy#uemq3Yjj&XiqbZ&Y@dyC%ei zJdtmjqLgmnQ(1`Q-Sz!(8L_=54BN+G+o-ti_eb(B`=khJHU9HU^ocv!_b-=XrW3jt zjVC4UIMw|>k&>jOu6$|Q zi@GD!gu~^o>kFc_YZ))U>K)wv%O8-8M{DMNC-dcCBY9Vy*C}BipA-B}EYFXqXTzQ? zbhyik!OocZE_J!dhBz5D-`-3(%-Y}qd&zkw0^dvO^?M8K(xv>6^l*)G#>8r zIPOBY=lUAk7sW-<(z%q2-|$ZEy5UDe z#z$-NGZX|t0mA@~6MPO42VSRSSi2pi_k&nyvZfgAtU1m1`ObD}6S7$~?Dfj{T|dXW z_Bh(F`lv2O2^7=Z=RgWpR7umax)1=vnKBO4(dUB452^Cw)drJww_SdTafUOJGZ4?n zc-tin&=zQ1G#5s5dncE^`8w|U%}*HaJy82QU{e}EO_$5#G{8MY5V-UIb{QfLocXVn z5DF$><{-6hVKcf2k}1qHxx7OJHNOa*{H z1TVQ7?*5_e@5}9kR_Ek6&s;vcIc+R1Ke9g%;^M2X<-Xtjk^?)p)$QlZnvl)FoYB<0 z2yihe2xig*h9Qq!zQ24fZ|!qt-W@;X--=R}h)kzA_@!%D`;CV&oH}W%C;?DJHeE3u z>q=7>Nq|-t)MH4=#t~fnp7~j9L%ah`ZC#7*0&%%LoPXt;IOg=1)=dMXa<=QaeD-@H zD;}cg439`!dKX0Vo}@%ZUQ-xGlgp{`SL`FP<8j7r{k|?lB|QKt02amrFyld5cM81p zP4o7CJ&Py=aOiH=jJGajE`?;46yg$(}m)0nBaE<}X{fO-HH$OACzL3-O) zp?S&t?1ue|yXJPqhNF1pTi;7-*D}3xC`y%)89vD9&EM69C`JGjVM)~kuuvX=**8d$5o&GM1yPhLA>Fr^$iuhjLRdAV1_UgI z0W<_)Gou!Ts--y1k`3^w`{3GdL+9Gc7(R~*fT?sWU(Ktoc|XUVajrHZQIu-&0{rej zbrFidY8XI00CuZYi&@Y?tBD$h11@?Oe0>Le=zrm~E2LL|Z2~|;07tBe%gxE>UBX3I zy@TfVE?p2sSzw}%-A?Mj4qXU~1T9+A@hXa})Vu&FrZbtR*v+NG38%jX{`n^O{s8=+ z>*0cH=NuzEtG2+va5(j9nSmv%)^YhY@8^t*uBeGw0*X?%m?opQXfmK>`(n|WrmCoH zx8}P&6cbNzmE&FZ1>wxs$pc`#AGX~G&p!aq{~7i?Zfz#1L&wd{DUuuxHlKVZYmYvG zXCAtj=l=QtxvVB6Daw2^{->YO^^VWWW=OHcm?l*K*hevH%GM9t)HS^zc$#7#Vn?KJ~!X~kW3mp?!vqvn85MeJ#^jq4ZTuIB-qr# znHRr?V@`W1TOYcYJPGWca@%8b_f6s0W6FMz`ei%z?s$o8N3FPkcZQdq^qe$-kCT2^O0w3 znj#7^`Du(9Q@&5jirDY-gZnpH>mf*A5==y2QwPonr8( z8vS}?G${hWVL*o;`eO1~8xFexWlixE#4`}jLM$WySFMEqe3J@*ImB$eik7OSnCoSs zHxr&@Sg(==*{vD0b}ps0b1BE3bsp(tg5G^Q>Dj%VgL`%mofy+avf<|Ebxs=k7Y)AK ziPP=H%;m_Y5{qIjl36k8eiyWOVI(0QfWvVb5OB-m#ob{RVmXMVAd;1TR|}CxZ_^XK zitWpy6adA<^%uHe%pV=rtE3vv8Ly93n~r7Gregt!g~u7}+0Q`FeujGYGu(fWTt>?a zk1$vc@Hn0Ly)OJdF9DyQK%jwOD1_VFfYal}geE66~wP>rwLp zz*~#}Sl|QXiwx;iQiU{xnpnN%I96{t4uD)H!*G8OLw!Ar5A`!PG{E@K0LetG?$^R$ zIPm+u1Ofqq!4Sd5CK{VsXliZ8*HHRwhCt_X{(tt~J3OxYyz~8>GQ9wU-a)W8Q4*<2 z^JZU#~*U2U~yK%Zxv>T^6j^h%`b{t#9BGoAoUFu=p#{mn7c4jbr&i8rnkOT)fc1d;Y_`}I)sv!nY{~iFb^aE6uQ)Y4jQOnz_q>kb71@QO+^bGG+e|x;R-CkTC4^Foix6gmI7e#jAB3ibxNvWZsJ%lGlo5l+ey^a9*Wb-Rk zqR5gUn7=#d1l0qPoO!)+R~Dq+_zs4qUJdQoD1rdgP_jT%c>tta<8rxhyIlnQ0XjN5%&*}+baizi%hr~d zq3bC5+zt1jBM2g*BqKWGmWmSqL6Yg(eJe93o@mr*XH+};5uEX{waRaQK;4qDJ+4h;`5J6gnaJD?xN{_u@6M(hsi$(8? z9ResJ>LCOm=sLm3q`g9F1hIIWsmUoOrzV-2y2$kOv?XI-@P?qOOioTRIXMa6{x-5K zvt#>q_8-{KzJ2>>2?ne85(E*+?L*5XD|=Z4y7u12)bX!1$6U)_BLHBY(vwPI<;%su zD}&c>5`p zf{DpVrl+eDj!{*W(`U|b`pg-=@P&V7XlRHdM-FrAEw|uwIxD~UJ%Nf7003Wm5B{zJ zlJl1ue(q&dvy{)dd{A*o5OA7R0+oPQhHU{eQE)Oh%y5ceECN>5Ku z#qL4!_|0sxD!iMX{dX}Q{sMXvv~!N3lOhxKCs^jLjt_C0A22_^-EA@&Z92P zBZs=|&87$fV21!o$#4sJnbjfyE#Yxu@i-F`6J)bloDK)UV35APemowxy>d!mOlM|i zIdl39r_Y>ba&ij2j--Bbxg5ujzsT|9FS2vz4(`3@UiR+Yb2VeXTo6PF$>pthG9ZA% zeB7VOzL^#XyrpR_lhBJ7Lp0VwrG zhP9YlstPtijLz}TfA+t4?X}m|JcYKkwKFi#&(Po?d-m+6tIKB9R*=uoB-pWpQmMmyy-{*&) zs<3^1`KR8(_;knjf>#dwSYywbv4}cX^ z+5?chFj}(T6^qAt=9y=C=9y<19vb4#yYA%BO*i2vu|ix`Hpg6!Q>RZedUBLgr%x{% z&f06&dp)!S{dnDOd~PQgI)<);VPNPwhM~iiFU%yxbT&sOnL?pTWC{+~ZksL0% z_a13@g}@t=0l^FnB=VJwfcPBdeJtFt%;qvCN$IoL^C>?yW)pyABnmiO+8%&1cmOOd zz)JVlPL-$6{N&UWlT%at^FM!)TW-FYyYIe>-rnB2Gy0>WW4!Uk8=O9KrYu4{MbD@9 z5F>*FY#ZohsJ9Eh$Az(~TulWfiDFUx!{d(%;#(`hDaT<|9kYhoj7gBg{pj z%!i|7v#VWO`Fx&leB&FOIPp5~eb0Ls9v>|Mo~)!JaM#d%CVW@xx*?%GAs}Q?qkS&CC-^Todk@pI_iJfA~inz58z7_O{2iASNUr zI^AfwDmLj6py%LSj6eHD3|*rUk<~!a!Er+>Plvnm1YpnyuZ7o^uZ`wlZwRI{@`iIi ze{syV{6%;G><~be2mqL2fI`HBwq#h^IxF@Lu87Kf@r(b$k;8|1;DP&TX=$msu{v|+ zEGI`tt9~CHp%(UTA7bzJA$mJIsKs0+L4eLsE1jWMjvUx+ZqA7$muBWUKReI43l~YH z(>(Y5^Nfy-@xJ%HmmS-SOD~pO-s%zn!08LpzHL8?<8L&y7ohzHFMvljy#UDyk^or% zKtaF0ggzfkt!veeZp5O;rz6%lHcd^mewhcl$7VM~3KVYpKh*-Wu@Jy2sDK zJ=-xJxRbePnsc)YoH~7mKlzhC<>7}O;?YMRDR|69m!~$?^3I!yU!EYJPSA)*D60v; z6)!-t!d`$8|Jno~rI@(@LBEIYkNg&MfAYz-_nOI*w&lMvt_6euY!5)GJpct5^h5={ zi>-%_R_&eWy2dN7yvpFfAV-hhT{B~K@#4jbpY#vx+{R6NcF@)mXsAs`5CnQcK6=}O zJaXSr5;>idqbK?2Fa8S;+_p>@ z6_8Y+b&Yh5kgKu;0KrTK99vproo1o;+%Yh8dVliw$zC`?W{oC5`HN?40surUj+>*# zLX8bU0D23^d7H1`0y9LBormw{#czIP#rOB_-OCSr--l4b7fB@&EJUJQxHQYz$xF;G zgiG3+C7Dd}#v5;N>#es|eVlY%C!a5mfsrMNz1xSldGAiP5A-64%_mTz#1=u+r+tvfFlD!jk-Jn~++jsVEA%zNJbF36|R zl{_A|i=n=5hWfgB;Er2JrZb$GxX2r4#+jNaO&7a2Pmb0E0T4wIr_)J3U%E}bBhLMdG-P)PLDGm zUMl(?CMPFrW}MpF+nJr+TCKOkA#-ro2)FLr#XwIdHdZ1Zokw!Hm*e`@A;`6LJZT-? zOKf_aOl+~C#>X(sL_7Z)ue;R+i&^Wca;3naAEGz(V^VZ8VKH#-7(Dc00D=#^pWwIu zmiRNDw><#YK{Ft1(XMQB)z-Z?jJW(Zi_B`i(xvAPH;3MSjWrJpEGuVOXk-)g`#5^* zL4NduPx8_Cy`97RcjGFe#y^=%)=bU)p542P{@GA4z@v8`;b(sEy}aY0qqgy1-^7qz zoGI9QBuceK00abj4&DU~s5ie}-M=K5p@2$az`wRPVllVu0l5C4^^^Y-(c`y00M{X+ zSto3@<^gCJ0$??>azU+po^$69{t`~7d4nyjX8D;Q73O^D>+0Z%hwkR*KKy>3eE2AR zUDlJ^48uUnXKG@c4j(yOP>Gr#2<#l{=R;3C!cTtxyEuCIARf018=H)|rl7_PJ2{K8 zv*w<|9c-s`DN4da3hwoz{NKqdo3&^xAoHYu8&{+w`zL;m@go# zY;X`X%2omZi0!=`dfU6No@&61w-)74aLC-UZx8`nX) zT~5@<3`!zGwadJ^ySg}XZ@%+dVYo7(Hi_TrQBD=i}H8zTFDg&;$#+RD}RT6`~)!z%}0bPT0FRu80 z$NPT)DcEj%0Im>#0+!e|+XGN00#E?6ny*5l^U%-!K7p1N(iu~2P4@b??AjdY?%-XI z-p9v(@I5?u=dG(GY_InoU>M}1^W?&_RVM-Oc;X4VySmo=zqZyOkKTQRkN@C%c{39eNq4&_JLuVWd&3P+VuM`RP=!y51HRSNFP1kCOq^XA1`vHM zw12=92hx&J^eQVz))N63u{{9Q^#DNS69ECFKs$GS>{Bc(EMD2wklntL{BEDu!~M4% z;^RN`Uf%oI0}SSa(%s*%?t(6bGHS7UXa+erW4Cxg3!lCeI=YSLjC%VB_X$5ws5 z{hdFB95P9~)?i7R1rq>^2TEChVY>>TJQ%5Q4*)>ugZ~+M`t&tY;A=%KVcC@^2<+dv zjr}{fF}oPy*lVMlo4mxq-6JbLr)5)Q7pHM`^dSh<+3-6%JNdC6`%(Vw8(-(<9sNxq z*i$VpfSQWp2zFR>14w{claJD~|4zokm(ew~A%-TmoIED2<8*0t!Q~1buKWEExuN-F zI1im?Rto?LP7f`Q{vhGM|1?@`5l7ch(=IWq2g;!uJkvCc2Vkem`omnV;{MV8W510i zn%UN}$B$U1*k*4>8}EGdUVi3>-iK?AE^%5mNj^M7HNyd+P>3fVd&D;WWrmW9VOSk! z!Km5iaCrQ*?>y8v+>DKr0b8Aw&Bz$^uD;$<7KqKm!o=$J`#m28K`1!cw9#CT zO#sTwU@gAjsVa(#<-H-McRhIZ->#M}%DK#Cd3`^knn|L>m#R8ux|*{sbh!1xWO+QP=$U$61h#b`_HX;C`P}yWapJR13K={h?yrCQrz&Wr7&;FxL9Ri4J5Ve?8 zzO4p}ml}!y?6a6ye<@#Cp^Y1{FmRYeXwV!0ryJQ@y(TqEYymBos@nC9265-sI@DCu z;;FQ@2>^mX&w;yYu~?xfq&6u_u5>cspnv7RGphNuRvrLA%LDI6OGKJ>T}>8nnA~53 zLZxye4aOl4JZ+%|iekWw0)tg@$rysb_`xSR@WP)XD;b=jZnSI)L)R*QFBs&)m+|zD zR3#t4C}T3Bp&LY#Ns{Rdxm=!XE>C`qvN)&1fz#o@<#6C~%6Qyvd|vm}^2!_%VVnd} z@Kc|JMa`ygYU(EX6NV*$s%pa<>Y}B8C$UTC>YteDW-h>b34dN0oTAyDw-Ole!in%| zFTlVW9smIU?T-~5 z)JryesY<7C1tqbBGq`yyUiJi0Gcihb1S=r{NN015Uz}m$(kz$e7KudTs9N!)N^=KD zds|8QI!Fe)NVN2mZS5z}8sheV%Kg$Jw+oB);YKqI)Km<|24ie!8it|Q#ai#)dmG95 zOKACQ-S1mTW#f$hR+rf%s1oowpv48T+zkX^;#E*`;8^LBa1QK2Zf#yg&O!*lO*R22 zzXza@fxD;5_Z#cj!Q9YobWgp6YPLp5gdWghF$yQB(p+8dTWNLUazI%$ z<$4npDqrsP!O81#gO_s4-3!mWuqFX;^lWQNGOKr1bkkC0WYCo zU{g6@E6_4)697RFafNzTey>EQ5kV;KzGvna`P;92i$tn+RLC-!ET=C_ar%NOj~euO z**QGGu5ANsALzy5sQz+O6R~v(fSOI!*J2l-=fGWzKljC|3R{%|DP`k~|5jJ!2tdeb zh5}N{*V7D$<{)%-?L0O+~yR8PL#F^j!VL(_Mj9+6MO!nL1V91VG)G00bPSlAKy0p3~=rv)4rOKD7kObf+5ByC51GujSN;4K;`3~Rs-A}MI`eIQ(uj@LqixFlQBfR|P zX&erjz1xSl`{w=h6e6;tY8V(-8x~zT{X6`tUD<-{L`jBmwsvog02J62QPnj5_AB42 zdE>v>M88vHNbf)Ktg708NAIjIzVO`t%PVN)l=^W>yY} z#ZM!_QJC?2;k8jB(Rk6%VM2EX_{=j@Ti9+9Lp` zvha9I6>d`3nfTIQaN_qqNiG&H>!r?3USi_XERP;N!X1b9ZEl>ds}&azko=+btQdx& zlfOa&iru_r>q;k@u52q zJakRIZXf+Ih2#10*==F>NZVYk!>;JiG{MTny3jD)o;AeiDoHs;nIK<-ct#IJ2aCr(0 zgQHTMPqk;586V@)*^^A2ew}n;^NFb&24mxsjEzsy+tJ27M{Z)@j^QmOTZys*XImeV zYxQnaE$xX?!xQQv*t?zh%y``rfXz@z0?^|zOAyuNGeIN|T@y9|0MmPH75DgU0#H%h zpcCzL&U~U7WLy!x0k`)2a&Ejg{w-QY&yweEJh}}h@=%(8}!P_ zGxT+JaCrZ&bu9a`!Em^cTpPHdjcfE*NkmMIfFcc)?DmtlKmfwgwFfoW-o?j$?N8S| z@q<}y;B-2XWSPE>5dZnERy5rp>It%BNSsgRc{7$nO{d_cf46qy^V4wlRoHX*IxFM@ zQ3PG*1*4S%_ddWa_dkBs1GF$b!Q`pem^$@3lcTRPd*L+N1`^P-ixK|eYu~0l)WSWt z9^j@uI||Da5Ck0lRvayzYkFzaOcGsH8fNWx?>RzpehOW!KgniQhpe`-Dxg~er)0Y0 z%WfP*=<>kKva>9j1*XSL@+&)NW}LPOKy4F%LI(2Qat)9ul3ARwwogkE!R-f$oxR4e zf8xLY6@$BPUiI1M7ZQBmGv`nZaOdK9Wr3EZON3@d=|1y3{xy{AuE#f?e~CRKgZMn| zwT|QfIF?0!*5x+WiN@%vf|^Yrdx}%Slifb7B-E~z{MXhqz)$@5|4pc?Z;jV4;%jNa z~R@4UBO6qwfMBpUp6N>NUpSc#-objx%}cHIy~7*~3dQzW8s?^Y6!B=RI$| zpTXX)O>a$dxNx@hB0AU4bhX+fs9qquy>x6p#Qd38>hk{6>c#{BARt4yLTy9(yw?c8 zQXW$gaP~9|9<&L71^C3;O#p0I0&t%noC4%6!~##3IS;_q-b4O|mbk%bfo9KXLZlIi@c!pkJ3CkxZp&32YqV5JU+_Yv<-9 zPR*lbk`1^1LnHfHx_Abq4xcThK-(sH00HN9ZFNbBG&Q}xv&e|Ze9b4N;U&$=hF=&5U`mOJ0~pVm~# ze|k2~+4! z_Cp7eC28|!Lh>5MUB70qJp~9dY2hg{XP%{VX`IeOySVqzF0#2i-N^@h+QzFZ|h>ne=n`m}7(;VvL)`c_h^|qD%1v@nmY{X;KgnWCsrK z=CzT!y7~yBCL&0#{^BO0H%LCVfT67&yUpeED^9{A`ww&X;~!Z6UFLFxXJ={Y=s$t0Q^ouWr>_vpY|M7f>n+4@f1LYX`U@mY!P_%z3jbVBGGr%$BqMq@_gk&yu2(Y& zoN69HE<)K(5O4%L$S7Q2=oDP}1q9TeC@BQgt-Bd<6lS+|ErEoZ%INffXZa0!F zGm%yhMG;juSkeWSG#F3jc_EVFx%m`Rzw$|lE?OI}1GnE`{8h-CyJgTJ(e7G%iRsw{ z%GB%RCSOI*SkJ=0v7dnGbmMI4LUI=tXjBs6y4TO&cx<41-)&4D`&!-IdRpC>008(M zl_LN>J{Vn26^Z6C#ekX^Rx1ER;H|aYAhdx!00qQeMr%X@J+%8~($nMUnu+-}^%J3jmAO@IG_6y(^$KTX!##)tQJ(;9zfl`)Y#ffZ7~>l1*? zI)-HlXQ()NV28g2EfZf;lqTr+@v|R(KPS&#zzFuzJF>^RvCHRC@_ABm^Thk5i7>zL zve~c)Ul6(nR{p?S-UomGnazLk;rpTEhWvwMoGT8(xAeBGe3QC{GIx&r)T^lT<0~{5 z3WX>;akO+Id;JvJQrXaT)MS)KhqtW3csHl4x|(0tRj;IDX31GmlC}b_ zP!E~8$*V#`*Tdy-aCrZ2kYw~!1kqPqyWPk7TKUu~7f}rZQVGaq!F63;#*qhM@+=(x z#`?cxU^_hd!#BJb9irD<&Tk)R1;ap#TqHj;hB7mXp4(c-JyCYy2(}@6gGHBJs>uk3 zuG0+Y+It(x#p$~8c4RFO08uc#1er=yI||U{g{cI@6|>#CWAX$XdP~z0fH%_Cb1&}o z*Z%X!jXYTQ`mGTF&44#Ea7PVfY|3sgowweHl3pYkjgpGRaJt<%TrNaW`|jD4vqo>&Oiv!xjAjsHZo$mj+%<%2oz_W z1=)$abAasp#r03fno8>Be-JdJ%+BM zB$k?H!*=;wXzkxg^wQb7x#zrQ?n%-n{Lb&F5CH)CJSG8PxixU-#W$Oh0K8U!xaU!u z08|%`1mG_%<^a8xt_=ck1yP5W-b@t3Fvw*xWJ282g|8{aYTYg}NS#ur?!K3ei zf8C%D;?c*z?So_tmk77B^2La5k7YH#%~bo8WqII2UDH?Z#p%J--bXGxy>62vEjml` zg}=dj);Pu0{z2=`cA{JRu z68H<*XHm~@EdfnHK=k@>_}exXWhwwlBD|(|rIFFG`xfG}7tpo(5eLd@;M*(@K!$}1 z-A|9ljA`pE6M)O-X-1sLSY5mDaG>^|M{MN5dZN|(1HPK6t$U9;yeMmA+JEn08}b#` z@8Wd{a}Rtke9sT8?j|D1@X$Nqk@qdfr{OK)9A07NW+?kZmh1Sn{KhZKP!-fIc9)Yp ze%#&L5I0a9QzMs1{QDo1n|uWdG-|C5iQm3$80pHpOvPb#67(C4gzSKwhv2pcVgGHb zjlTgz<{*4+EIurabDL1S@fRc+N1zRN-*(*X10^&5hOVI`o9Fa@1rC>&wvhvMb=3K#Qc zGoe~RX8tUW-u)|F(?dQdKd_^N&z@U=Yzh`;ptILJvEKg#-1Y#Rc^zV5Q|Er?A#i(O zb_y_XiSU!c=t>soaN!8HTP`89V%(L)k{PGo3OjYUaCdJbADv%Uuij9yWM2OY*;C)a zHFPtMp4~{TeU{?mZ|!U0S8nd-|9)*bNi36si{sGRVR}_I`yJ_|>GscG%OZVDoaJZ4 zvBDo#5RhCxWPdBN$45D~b|n!u^Aws8Z6gO*nmn~izoJ&5SQsV&@XFSD2$TYS9tdY) zDF@6qp9kQz0vcvkrOT{M0M;Iemn;t4Ynj?20M76Qv|JKt+Z`)Nz^4xM@lrU&8%t?O zL``|lwr+5H!5e^E?lnKC>!w?J=E7BRnqLx6(7!?yNWdBDMlK+>tXoi6)AJehTn5p# zwNzL^lyJ56;_!#a$L7~XGsignrQsY|8?K9?4WJiJ{HctRv!ewqC?B;s2l<4^}-uV5LZFFJYi~z z$j+vjLxm84w*~9tnHrt|ye$a7Hfw!=-%%sX&7BS-sX6rMC5*FKq`|`o%PxA4Eb^B} zxAW2OUf`8T$`k^cnE+Wf6Vn9IG*sCvS4z?(!QhkPC{GG2`vf=wAtaZ#AQ@jZW6iyv zPeyPTDGapA8{l-~?i@l_a;V8AlvEtnNfI>jX_UEhD04SdI>;_0mk->2M5hPA={36} z0wdiTzqruBsIp8FbQO{@^J^1yk>eMnQQjt6==&fDNG=buCt#LbN|jlHN<6%!vcpC| zXxn}w6JvGZ1yC#wmA8UBc#F%tURs4{PNRKc5_)$v#oWmoFlMn_yhW;y3V@~{07w1M zE}Jg?%`lcV>pa~;_3zskyB1S6Qi~*>{Va~&eK@xrLGriL>2~n<5A5Ri#%B4`vkRm( z-OTV;SD(%g2vI&Mjd565sar33{5V=W5oD)z1vyngSFIJo>ggnUi?U%HzhENZaN!K~ z;Arha%cjw?DYR?~!^%CWIW#o~sR%b7uyz8UL*ScoH=otE^M=uiv56bLpEMtmCi#Fk zi3@E*@*=ssNNyjZ%d=)zzH&lW^C+q2J^k0C7r<(%nMbPZef4-?JYnVmv|m2gGz8$y zjJ4h}Q2XLPO+^3z-V%h*MXW8lH`8!i4O9bo6E`U0X)3w#}3vaVX0055HC;@N;TFHgYS*WL$$fvGlbNhgIEq}4e zi9iq~oGl&5{#LFeniUfNR}1X0rlz9Hz39v9RuM!A$?ZpSuOu^up_`&bx@MMvX`1N@ zH*`}B$I#7E!yDY=-MYbhj0g}}vD*rQU^dzjoCsnENDf5Vfhai_kKjQ}(=)J$^SstMZ*P(Kv`n-YKu@8UgP zn9D$B>J*+Pm@m&4px*s>oo#b+vn={|wpt?q0M93@O8~ryjrF}mhZE7^gc96iq0+K? z5duHDl0(mDEXfSpC=m<;B|2}vhdTBGSoPbuE1U?}?}OLF5TBXEqid!-cB3vM;8+1? zo_Ds^*Yh=vSM&oR>z{ooZ9U_&EFOS#q(Y-F6;!8h7{PY)r68 zfPx7@E38FM^HDkYAd&Nme0-(-*{deH-XHB>Pp$KbE9C6wG;f-jdwFQq$&I9KbuC&+M+*&qHSnj?Gcj# zPxMk1oETkhNK7?mTVTa7Md8X}S8M`M@nS63001BWNklxIN@Vl zsDPGyaqj=pB_^t=n4P6w(n+I}k1yKqVGC&O--#&IhAx`0+~B96HC?4VMz7v@N|W;n zoGhUEk4*sT3?FKtEQpB$ow}8IP@Lzz=1jzIBiM-(Bpu&w-h!ZDg{k)mG^WZ zIS}Q-uc2m2TbgKV0+fhMX)0i{6#jCsRjY?%R0ms8fFe?2K;*g`~8o0 z);aNQ*2VtO4(p#imV$VNNUkA@sLt|bl*mP#{=q;i@rhkmbLcs{QO%Z5|IzuP)fsK9 zgs-g!M^Wpevwhj1r9_JN=CU zlmF`7fQrq$-ha5gfQb>WTryzZQ=Y66K@gGLg$JzEba@Q5mQL8ofLoa-OLN$wKcz)W zUv>n#2iQ~mITrR&#FF8*c+DZwxQ;i0Hjyzg*5;H_;wPa7Ne0)0e;vf0F8lnw?ePQxSMXkS1RDK z&iYF40T3N-1hMerg`p{E+45%V+a-a8jfY+KS6;Y-Z56KuaEe=t|JxpbExb42%LQyf z?`nmR)EIMJw3j>lPyxw+--<)B%z0~y(~mAWOZq#DQU8N0nfm43S=4mGE@iWbd~^ZB z(CrsdX81b#Dtf)HEmr=jdKJ?_bE&!>>sQidj+a$@tg~_ExlI6opX@T-I+o_T0Z&)L z3sB-b0J%s4pjDz&&(P5_b~50mV_}#5RgM6(^;GOy9vOmLJpHTHq_4OXp;Mp>Vy-HaLQ0(a+Dwn0N z<M>ynx zhYN7+d@)+yvsl(!x=Mgz%l}N*e5G8@Mp?@Z>;Ci~v%CFO8t!0uQ@v#YdP=1FovWsv zR-JkP7F0M^Kz{R2cQxJ|w+X;?`1u0dJJSlhR>tJ`w7+zjCX%Z-0-&Vg6;005Qc-Ld z_Zs7njAE#H`$bfo0F<}SYoD)lZG5vf0Vo(>j#(E^3P|vYp2nNwHUYQ}kGH_h1;pe2 zZmE3cD(mmSD1o@QrVut<-tD(E@e&AsyQucO$f|Ej14X!`ZzNEo73l#ooL}O_afE)1f0=xj{b7l!iS&X45llN>r1}PSK`oH1mMMeSJ?zha@~#X=au96Y&x2*8{I z|6V`|_gjK+hp%zxw@m=nn$H6KYyr6d7xVCZ8FT@%zAX{}ckwe; zz8`nS8$uV0KQc&LN&u{4gC0Xi&!n4n?&-NSS|({P!kWO=7j?f6f@O*!$7-QE)a|c} zk(^Zu6L5Qb3*6;v?Aa~b3w(Wiq8t9pbYYY0fl}&33nE!xJKn@x;ml5UB5c7mr>3gg zp-)Z6k-Yws)rYdH;WhIZM=Fn9YbPYo{(66Ys2@;YlEzcPjlGBCkbR)aH z_67i3(!mhQZ2VJd4Y>aSJi)pc%R&xm!tx=o(P0yS4e+TR_}w{}x46juAqq$R;3#2= zZzj-P6am<`E-JOI)Rc&p=ML4`3!0% zjhfG3=*5Lm1W{u9J@3HjZ?QK4y*L6OEhqeW%eccvvNiIKytPjNCJPMHzOxl>_ci|X zwh6!{_+$@!;*zz`&MEMf7<_LDCB&1#UfO3)6utquia)_=`3$;}tMbuHN6V$ROl0Z} zN__E#*PxM0M9C%1uWUR*J{d#Frpoy0H7<`GW9as`HvRfnis*Ikl+1)bR~dW8=d~Kh z{;wksz+Z>02Xh4Am;0Jye%l0K6a0KP{Es>7{h~h~h5G{#D$(Lk1q=5>2?&T=ApliO z09UpPW<8-)EbgPoxzODfz z+0m5iUP&hks>JAUL#L~lBI9JdL8Mf_qfd~DL9;R60D48PJ>n$tk4rMEx=u(j-YEmJ!JG-@V^v(5>CuH=bM zjIuOwlGvp)=t})`_KQrNqGezw?qFNft@-%e<_kXPgkEp?UH(_Fl!J6FHQ#f%z!$2? z@r!EkPX!b+IfdrP{I>}}5%_2a{NVz;Y>|DBW#NSs++BhYb~<2vRtkc&wG*?Uqh)L7 zh@odw(9%(N^TjZ964U1ipM90+g_CIY+RoQ7xIFp-!*@Miw5nu1Ld$1KM=o!8>hJNC zuf%UHo8Q-T&@sQj zd{u&IdY(kgY;uVQ!Oae_hI( z$!S}~!l{=CbPhCyK#-D25t$ra^?kQwy8As<*fnR4s31 z+{2Nq8T+qEbnmFSTl!YQ48dB(EnYLkYZCw)n_|QTKidWWkF^A0at8e2BK%VC))E2} zt%I8q06}sfY_TzimZ`l?e0nwwH6}`zS(<11rKgEbjBaYVH3Kq=8IR1Wrs3Br)p(%*!{GARah4`e zAqmj7Z1}}0=C>skxRk2#_tvwsrf%oY7EKah74Hj`xPOaH0Gb28(GMSSeKiomU2 zXem;kC)v`EF3O0yx&Z;$qI{LEqi1W+1At**s0xCkx+%J`i)Wa6<_qMKOKYC;6Ne$wz1D_Cm;6UBeHi*Je6h2OXhn zC~HJjX0_p|bz zysH-k)isrg?|h!KU;XR~&!g=1zK~n>~LbV~Am(k&m3*28n(GA<2G&O7wz!va72H?Ka zE0V4^#Pcb*FAYbE^qwX{Lj;!A*CZC@tq}kv9cA3 zAyaSqqDA|(q`~JR@R3c*P7EbW=JZRXN1rEq>KK``uVRERvHRn{j3}*6B-m<#oR&+I zi!Idbd)Bqe?u@DVi=6rDpQGh-M02o^H8bk#8PS~Ctfo`~HoB@Zb^PlL-SL*1Bmuc( zl=$ofsmmAesBuD0aMhU0*T4+V%xCMs<-dvm+*xc&s9Dx}|hmc&b6BlE^HWX`>ekzef#3}3!PXa8#PjjgKpr7n({ zGIBM0gst4}n2B8G>{tJSd^X2)YT4D_0MM67Kzj*WD`@#FQ^%fW@b*XXR9Ujwz#to4 zBr$i9?7}3je4Kz2IvpU?U_-;K2A6A9;HOSJ0RIrRe)s}tli~O5)4xpsN{J_1%^uQ! zw`865|IY>ZE$?NFSDz;N!k0+C{4~0S&Tumq&aFuR&~-4DbzlqKh!!rAUAS1=FS&xT z#_@0d4Y^F3iA42F_)3j%4%$jw*RCl!CXaoMp1rrzI#gM?U|rWphi6I7T_n3Wh1bXu zbV9dWyStmB!$JmP`MOCVSq)DR1`kyA7EWhPp|wKr>4B|@ve^W{#+vxkVfeQMEN;T) z`zBuE;7gxl*PCBqdUmYf>s&g2ikt6!WbKVOSGZ(uE<8>A{HrB8q#LNJdi6_D6f{*s zQ5958z4~`ql5sd3$g+&n;l$x`;PrTs<@KkdC{=E%`nrcXb8)`mj6axRj9A{(voGoC zTT_`m`CXC=m+0Pq2M&+FEcb6+t{07v}nZFaRHJw{4Y80Lp-X1pjY8d}NIdqOIXc4jq4rn~wc&I*Ty+ z*CR4FO*Wmx?OnaWDv5|?0-)v6q%MxFd-6AQ165l#=9-GCsA!tD!oX{qY0x!g`A<#T z+GLbvJRT1%!4`roK|G#oF%r2<24yX@?KnjK_=^oYSHn3|7^oaRmBjo-l8e){^zER1 z`$3$(;FgI+HXb1x50i;pMvu+nG8Fs{XqP~!13jXQYL@oJl{$>`uZMm2RrkQP2nz*- zPCO#~$uKr-0#H8uNC$jw3BDc&QCHdj@;`F>cm9B(v(F%uXyqG*!SwhUb{ssshEY$E zUz)?&+O^8ZYha)xV`d4|%z0w76DW##D!*#fuQT{Y6^hwaRV9%~kVqt88oWL)BO@dD z+q#jwm6PiV^liuIa*#_a4LMJ9nwi(&FVpHbbe-s>vqUeQ#pQ3s*V%`!trv&akHh0% z)0?B^vnZJqN;XM8lOmspqQvHra&f$}fk%dr2!gvl-m$8i27f7MzVC*^zWb|o>F*@q z*#ZSif29|8Hd(7*n*dY+f6$fWBVYJ44uA7^XBCo03v!$efY2E$UmK3bNdq0l&Xss{UDpOMt%|v2Bx0 z0LqL%{Ln4Toq4@7CyjiL`ROUT2REPDqSJ%Z=>fWM>l*&Q*SWPUkCa4!E@E##LwIp#FTEgOEdSq%P-IP#9FT=w%(GxNU?{AR!D0kB~c zfU=@z*Uc3p0APjztPp_fA&3%^H-JO{XGmRv4} zqADo4Tu}*rf*{~c0R=$f7A}EDIosrWawwmv}9~QQ%rS%$4sMnAzi3{?rXKIZrjr z>na8)n)z=8g&br{%$18r>v8+h|3c;g6__=O-$ZP^o0o?oHPjTX_PhnI@OlRus zC`TTAyd(=+kexVWC#_yTt$k~!%Idm?lFOnmCkJYZf}v|ye}|##h?0cta3F~0pOReP z1-Cm6-PzCt0AMi({dLmW*T6K$iVhij%c%~w-&XMkKv4~Tch2+{Sw%>KKew~~H-+5| zutezCwwHYmzo&Aix5y&l*-Mq1D58YRg>`vSN; z-nuvb0R8(8y`VeEDLrI!(cAkf{{-|){F&e>ya!^(mX;hz6c(M$eC*mVCFg8$e7?+e+(WfOo3 zqkH$w?7r`bid}DF?8KIP0NB_VJ8!+G;h!;@x8vM4Ea2e7&^}PH%RQ5XuNBzkZ>P&V z{oAk!Ky|zTANj8pyH+|GXa3Tp{nE>b{#^%4Zyuwi9$`+$q z08iN^e>MTAs=+vL2Ro0xtzy@^FlvVZ%DO-#iGgi98vZ#Wxx$jHY&01>LAdkX6}ePO zhfmKzuE6>D8+~x6&mJn908|+d|JbirEEizn)CqLW&f+R3_TBYR!#|^8n0@JO*jRg0 z`v|zpFB)NBHu;$=P=))+R$J}QCIB^p-hD^d_t3j4a;~_OH@34o-CIB^rM}Fcr*OlrmHO{<#%zoiz z#*TxxHvBW{288qWSlhS(N1lM5@>|$%Cg5LUh5d|QgwJochsY)XHHP-#J>2xR4^`w^ z)8|i!*JJO!aNxnRUgBaNes8|;B-Eep zhWFd`{x$)qRkZePpLMX_Ic8FBF5w>HIdhI6(qfQ@B*@Yl=w>z6e6 z&Hul>^Ny3NF8BZY)af(ZTe6#;5K^Rrp@piTqJYSyi6TYO-_?r>UMv)qi`Nc%MGz6i zf}#d#(i0$r7DxgK>2){B_A)y=?UdgiXHy_c$nMT;nSI``*LlrsX6Kyj_nhzd`8?n6 z^L?J3(9_T7?W73&aJ<|e5db5c`B&bAFC5GJbuy_WTi#wF4W36T$4??wR8;VPr{o0? z0GM+s9DHKlPM>t(mL1S)_3wMt2K-U>`-=b=4FrqJIR3N$JtWt9`}G&4!Sg*P9((GT z_&X&pz!*nS;QX8Oc6!@|pEP<2fBJ(@fqzW#M1UXyU{rAIrPonBKL1g)ZH?P$Zjj7? z`DD_pLkR@@V`3JdMN00CU5>vPrhhO$&lYfJ3oP&F^Q8dyOoU@3*^dZ-(Z(rPe}71> zvtr4@L4DtG9OCV9I<~hGuWuvM7{}TX$8Jtww+mlOlX@a3)*6HW-(qDc~{fZ@dy-vf1)wJ%Y zr?mROBV=61KEohj82C(+h~G~n5Fio^5-W)kt%za70;mz6 zcZ5tR@a=L39eF$}mOM)~tzGq3RMEGmLqS@)RHUW59Vuz)8d|y(q(eYT7z70Ap_>7z zA%>O|7(z-Klpco8VR+;By+7cs_1<0QhkMpNci(;Y+52<$seN2&&Q^DE__@m;yuN4F z58ivu1sVQXaX+^;($~IKE@jN4>f1~v z>mUQ;l)=zD!7+XW?pZ8Nggh%n7uZBljgR_?8ADNVX_T%ZNsVMI!wXrxI@`%2zM$P} zq2nd(#E1&@duA$4Sv-#b{Iey2dW9+C%jS#wpwp*E2R^N0Pp}?@$9T5Jm)y6AAm^ku zH{km69{0DimW%6?VE+7q3J!sLLjAcog2*2)mEtw*s13jAzA;y6gph~{wiWqX3~qTU zbj2Bz9zlUBB;}+UtNi{XU`G_^=-71yD>9;;P;iv#AV$J**sO^t9H(cb^m;e5>8w#= z`&^o4lk;T#GvqfCd0?*ij1&KOuuIGB{}r0MGvY#0UBry(RH2cAAh z`}dq-azj`?6k}2iT$86=p*c_q5Xe2UtwP^mi#Wo`^sAb8l$TzHmv@GmH=Y)2p7P!p zFL0}M@Nq(%5>#Ak3#OKwpqqTIN(#iCryvwZu(Q733crm z^1XD$uHd)tJWy7e-3VMkbQaE~Hua_ePJVYqj`%k_fez4iSoSIk>!+1}7I(v={v(9z zpO=P0CgyaA1uA3#=L%rDx%BeRQdy6ymV5IHm4YDGX4mHc*7oq2doRLI@@eVb`Es}% z^1EI5eH;o=t*tfQ$H7qO)~eNJEml`$Y6lund0$K%os?ROX8D`yh!HR*1|Sp|3h|^6 z?sz-e=-Vw?!7H#GTcLk_rKjq>m zKZ)Pv#9+d(%LqhbBbcr@vBof;I3&2X)}e*NPkr=oqLj z(pfvYc09W_b#cZ$_w;no*QYwKsj;s~&Ro~lqZZ&TfU6E|KRr05IJ@=hiVl`X4Fqk| zPVn?yy)`WS!%f)J_6=-1Tv*0^)`W$h!GH_cB2(q;XC@%U!eUrdf2Cxg4~k;U!wx%4 zkwMig%MkQRRILYzy)%D>m0;tc;3(~GKKB=a%JRT$ys>&p2Rb~>G+b2=ynf_qgyobt z=zMrkESH>LR2E||ttFj3W{M62%n2FL0OlseNCDG=ejRhZs5X#u79I(1myPvB=S{*# zdXN5Jf{sS{N$@cH$yC4laLi&H{Ck*+W_cRFSy56}vrcRr_SenFv_Y+>+!P9y?pAWfHV6$P>?Le|kul5;FK7{t29S>J^O>Tq2 z&*~8-q?Y*8=`N#5o<1UjkyWgB1Uo&UvykMFdQ$>nr@g51J#ntR4`KT7^XSArrDi$fOMFkA0p= zqdL;A2#APSy%tPK4D}mmCv=szQBC3;s*HHR0d9K)x#rF2$+6gBm0H8Y*|@tl@jLcBOvxh%ttNDPYnm zO(e6>^K_Ym#TS$%eG#BX=JwvaJ^NpLK1&_qwrNHEBeOj zvacBM{+;vUr&VZ=9q!Ur8MoIZUQ45aM-dTLftAnUd~dCQe2%@N>o{D_=UYH~n+e zDKC)T;sfK=yVQJkkD!v^RVM2?a7A}W>Ke?pwd4s_6!!PSPpVg^Vvg(5t>;5D%IgPJ zo!XMKen?G$)sKb>I6O-g4{lnx2L8PHb+l8XylB|<@e|pSmTFsFySXyf$TKakE_JgY z`e4QtXge>tSpE`Wry3rl?cr7~xZRtRRKYoF7TaaEoPbO-db;qPr>gMpM2QvuBGJB~ zl12|{$bP-UZeb31Q82_nD`N@@wWJu>Rol3*kNJxPI`3NTD{=be%ZURG>C+UW z4!+t=3ZPz;w>qCGd&95%$d06Hgw}?gz1&O=n?|vSq}GwEurE-S`}f*#dLq@UKeP~l z-mN$Ug7^Y#V{UH^+F?S+k`+OQG#0C9^Jo_8|JVQnyoH8wfTV&30!m+ao`hH9axcoH zr2CN+zX2*|S+AtF2-emsbX`X} zXtCM;d|kB&6eZ=g8s3%K2EQlvoqiOGwDPi;s>-Ts{&27=MqdoAHB_B+wR2Mb*xMNg z`5CPo=D0gmQvARKFUqI<^V#!4dfb+dypWNTS)_gk5~1Wn-{hCoHNQ=aRolR2f5&0p zmxhczGA2<#d&lPyGtWE73elsr%v%1JWRHBBeQ$AY2X|hDoYw&4 z&T_T#x}+tm8_J6J{$9iR+!VgQDjUoGEWelad2eg|m=1=i#_HgWP&B&c;rn_yL2BNO zoGOTNa=l02%RWYUz0V|-54FE|N8KZvX^~*GtjAuRrROT_uRn(?KW#M-7wikWT(F@# z{{_@hunm;qIJ?~O08uEvfk2P>=4<}V1MlaVLCM_izj^-ptZe;bhnZ{uv3f!d92|n(tL)l5o zgImqdnhoX|b8&g{3RWG?Rs}*nRneQEZL6(`A%)u>%{C)8S6wIV%kg%~l%WfFh>JCJ zvujmxz79KkT)2u96`2CXocH|6&HG3Zc|^^qEXu?{D^-R0d2q5VPZ?a<9jN0d`;lWR z*kEmr{cWHrc@+RS3Q)X!D|#b(6CaOAN+C5&j{CKiQIJD}SO`hHVCLd5v>$-~xpeo^ zdH9U*SeC~52+9p??9!FonZhdqr^<(kfYSbcT3wc2dvCHpVm{m1|8*foJ@Qc*5fQD( z_L2Zaz#+KW;zAlh@0^;fq8ORK-Y1yyPpvAj-)^^u)21aK4=t*m zhgp`>TW)>ap|Do5*d^56qrHw%LJn%)lxQaQ`CaPl#|l42{?<-&H(&=0>atBR*3nML zZmxpIgdl|*8SHLWB#Q}am4L?LQm&ntoPqtakhJ!tEG3R}Y@*7e&Eunh%o7YCCcFUN z-ZIPHL<&4|`n*=anKPb4miH`Cve(J7;Vab2|Es&ZoIQu4VA)DY{#+j!T^`ns0HhLm zal$MTCG&&$%M5XYT8=Nj-zze^fOkjR*~~{Uv=nxL3I<+^QY2V!pFZ@s;RDTdk%%Ox z2#24W48 z*j*Pzt~N_d^t6{#BB}*Wf1D+~3v2JS=GCg|7E3$oJ3fKMVv(!JnSbl(zO$0a&I6@~ zh9DC@cPU;=svpR`@v0$_lMz2eFTCbl=nUj$6n86@Lp+hY%H8S6>*$hL|6+v;V6?D# zVm$MGOb|prAl?V4&%4jdz&@iAuwITcey8IXTO(z{P${~WN4&xkri2%+%hu>_4hMIl zD9oS`xi#ddg8NTe)(Iq|yaM=U>fEV~JyBw5B}^Qkvsrp)l>c4WnPIL5bINQ};;aPXJ!pby(%=4NJ6ZGC9ES`*By!EUYeEoqn!^DeuL+jklsw=Cs zl-b9zBkSyGYb0++MYz_O2BF(o=bRzD0d9`XuG~L)C)q);DiqN&GNchvqMh>@9amdl zcOrpRhe{%xw3OjQEcHUoHT3E?nm2XOI6pNG;M1M5c|8S58Sqkc1Ac?zB zNkM2mTg+DTZQhW)D0h2mJn1DyHF&h?BG0reQJHWjL$I-dITg~Xe+vNLLR$XL=eNdRzOaYVk0r0;~=}+n~>vf2uc%Vfvc_RA8Wg7bz?eB@gr^?0RmN8_v{c4b(dQ-41-GZ*3DgAFCTz=s)WkgPBrnc5 zDCG{8S|dT@kLuhFWInk#>bgB-dN?y&C^>tG>leOAN=;)tBTLqKNu%61;{%^}RjHkn zh<=fFNM4lwD94`_y;P!eZQV)2oQw)T{@z5^#UZiA*e7=hiku{D^Y*tr_eo8jCD2f z$@q;aFGtTwoU5a{m`DHj2EeaV8e!Ay#QnJxwP$|_{w!{?O5oo8(P^-qRSkHSx40&M z6d@?U^9h^~BW(KpAH~Rm4x6V*_kS2>`2xRqr#gC#1b~xOhQA#{>z`#q*UbQRhmi98 z+xZq7X2e+H)K$P^)87epy4syzIhqFR^KltY@{!u{-EbEh2sM%dL$I|tw4X8${r7w{ zOC)A$guxjTH{{+e+Tdq%D6RXRpX!`XqxDzB`C_?M7Xj_=ML-|zD}@cssX?nBBI^~h zzljk6CNr6Pk>&$E0hG%Em^wWfzTv!&o&B!G@FZqF^I63ffmb!m5+HU*w@$~OIOb;7 z5aA}xPYSN>X@ottTj5*?{?RJy+;6f(nkkzA(If3N#h)`$&whw;I@oO&i~OuHGwST` z!qax1O?RdS`zr904-nB#{+{aHf*OB${i9^^R5+s2No3n5*Na_a5A^r=g_xu1?TVJ} zr=LI9Zg^?~!E6|=q7x4JJtt8keN*I-J>F`5q8Fyio=44U%49SJpW>Z7SB9I#JSmWF z-^AgA-KIj=cd;T1nD{UO7OaD(%U{N))m(UvGT*d(AJEvtgyYAGvME>}4jS@NJDOLl zOI-T+++Z?hKpmg$$^n=!8d2mL3oh>P7 zl!X4Z*v(qn%g%hfPD_4=KumknOZ4_<1bD-qqYx#>r?BA9h)EC;|Gru$X%)ffn(Rh# zL~*MPuciA~U&@OXYr8uJ~8+OW>oB-n1#k_Wi>C;p#ynPuyzV!xA$CAs;*LpE2FUR9`^P)tFD*k33@Byj z2em(tl{+O>W^;WM%uF$B8yqXG+OwuicCqmN(*N6%Ht1U4p7m~Ko*Jhz-b{|B>BHl_ z9}6v1TXi))3{?%%u5apu@hvZoP;>EO0*1)@s_=!BDl3fWsGsa!*dV`v+5Uo(siCv^4gTH{@hEyy|0UG+R?FRMdN$4 z3G$-23+PPiagw^@iMORHq3bQqcEX;Kojh7?m)^Bwb2caI?wG}uSsfw z-$4=A<8vA5MO{Tj$)l?tJwWv64s*s64z9mcy1bnEMp{br+w^x^*7)YabxoJ^DeSew z{x^O8R4;fx{TzV>@%%GpAzr)<#uc`OMhAO_pvB(dQZHd{_)b~s?fDUnAz)HVbXs+U zXkx9_TB|&L?uow1-zxhiQ>EAR7VH-p&9#Dbj)C;+1QB;9k;TY+dHa;7NP=>n*Tp1F zjRYmIN0`)Pi}Tu)*+rRoS;Zfkyy~z6bzl?gRpHhDC}QiSOdtI0`5h1=c%mSZn$3x( zLmJ9+S2ZYtjs@W9;8jiHAs(4Jw)R$EGN^3RklMhIa9MH2$MXg#p|-2UfGVjb25q~C ziB*j~n9XuH`1KTUBN1g#d!fd2SBeW4q!(l~v9%{^I^m>b_c*IQXoXY7OERvsTZr8=@V=0eYq|uC zL1n!4J4b@%4y}6UhZX7W_M7gJ+HW^8Lxv9PzZZaZ;Ql6&ypK?Kc#EraIZwHCWo3br zbU8z1X#u@_jv77bTjJWv64+~@>`}^DMu$e19*WhxN*oRb%+l-3`Pe;<^tiK5GFNin zH(%v$-j5EPJ7Eobbbr)jsFqKWy6yu8oyR{#QBa2w_0!^6k)znZD&mc@y=F_Gd@(>w zn@W;KNtQlQa6f22X12yriFi$P4x4FfG)15YzkM2JI@d9{;tmOvCs zg6%7ew~IcJHrULSGB$p`UW-`yE^X+KsNo^sac2PIM7KGnW5awJ+tZnR9CV(;ig6zS zrI#$HkGKbKm+%80c;UuAU}F7v`dQA?N;U-3cVHu-SUCJp{fZNkdoCNqyIHenzOcN1 z9$%Qh*9ipF7B~^azs<+*%}Azf?CvhxU)Ag_$~`inh0V*slK=KjkWa%xZdgHqt~YN& zjsIy9j*f2+Ah#~R@1Z8ugUDg|D<=~9$EnZ$VTls?N=%}&KhGmF-|ke)FX=#07osXb z1sqo12$7)n59{gkjqyv%mQ7Ac6{ijTTttlC7 zf>hu+Y|g#jUhr9YcXc;QWS9lr^Y|D6j9KB?w3NgBU#`utm?THh$W7R*x0ARW^_q8q z8IM4Ay}+Y9w*QoRW!Jj$u4jtHB<(DI7B;D$VZKM8p?Mm=J9^UBgDok$6L1;vuL+Ne zSVw$?;(LcMh?m*CClD{`$R*6gIjpgvd43J!zEzh;W*kOJVV9>l2mgmZyUZIBw>=uX z_Nbob1Zd90@1TSq%)~Y{uYCnFwbRyTq%vB*eFv|f*3&+S!1#pZQA%|jxcupUjfWxg zU%X)lAfC&#qTD`xE#isf^Pss;iY`K5}D5|P$*bKT$efMy%Q zA#k`@il!<#rd^9*BZ?3d{*vUIVQ_bM3vR(R_~1^^+@1HFA8>!b z`LNfl*{fG|b?MVpwZp$ENMWE7qr$+zV1T4QE5pFR#sZHZGA!`s7rGE5@bkt|SxN$? zYLXNR{DC(UmlubDsf|HNwU_Wyg{4BM3$!@yKFfIf?VbJIP|LU4Ph zz8Zp5>iN|8a?CQD+$82tgZ=g+Y;Qn&d%GtrN)X|jw{KwwY;Y@D+K0ilTi9AnY#Ez>)kT@EPX+2>hQ6{y*&?ti}B* zpz}6p;x$G1lECwViW~Zd$-QSNxt8j_PDmB7aHfd`|U#4Dj?s4j{w;>>dX`MsIrK^fk0$ zNAO%=_57_>#_+2iVwAGK23PP4Yov{eSpC{59f^C6@B@MNW2*P0H!-~UA0)s7RCWHuWO!IfYwQ z$8x=lh3@!4+s`Kn#I`lnsc>Fu_BRr24?jcpZ|S?{oEmLkv*MK5$W_QOO8hvdH(Rvx zhkV|hnAeflXlOL$%0EZ+Qoag{ZkhVgB~gv8t`foYZH9RE_+VEfj@spc!xaVxz7!Rp zHj^S7vy|KJ^s#YI=a468)3mO?x+WZJX*1_L623ULB;e|w39`F#ck&N(igyOZE^<9& zJT`Vq;*Df~ugP@4F&+b9F07t zfZYOFX<)bExzi!5>zp}YSAqnRS{;BsM8@H-QOX7cu0YH!b%9p}8o=mWzckcpT@Kr1 zgtOWlMCKfvr6fZ@LEE;zn@ow(@=2Wv>>7&Eu6I`Cc@z41b9JphS=!gC7sF+gyA2x^ zI@83KZyM*%m&tQ8~`~qf5<)VS|0>$ga!Kp{KN+QJ?toWZoR)Qw@rZryssGHCJ8H8|GOIzZVNb#94sMU$TFW=7qj z`?;9(uJYR-C_2l7!;bR6m!uizMVx`C-kvYaWXii(B9P86%J<@L38iPbpE(0z>Mjhl78bP zo_8>_sJui`r@3e-kmFXre4BUsy}HfRO>V;m<@Dfqi(p-n7AoQCQeZv=Wp+xm_5i~Nfo=S6US`3rbPOLJ8^V`rQ#5u|sa{uZ3N-J_yHC5SuEcE6zew0-yLGq&O_V zZfTBJY#z7mh?||fvuRa1pN3TtHiCNtkE+jYTzY6dg50}pF4Y)26|(kALeVVE zV`f-J*3<$2Rx;IUZnJ^*9i0Iazjd!1i1qk~3$|@na z3k)e>FSrGdU)D5aXW!MAt8d5`E@V*G>7IMJ&Tc+o;{vW7hN%4UK*vmP-p<;7;+??7 z>OD`zc}eS$PXgwL#cP3wQ0U2#pp%1WKq@vs9X?iq$U$*4I(tK|u$>NRXWlOI*Aox; z=G)Y~y3e?&>)+n21Y|=mKoNP4hl&F6$cYM-&mRM;sEC6d8<;mR?hgeT?V!z&4kM~g zwm`}uAk5;h(#9MfQhjA@yoyBkfO|XaQxNfG&FtxrV70oare5ZIx6Qy3paqGbZ+)?z zC#xQbzhdT=XVkybDmBP}tg%`k>ejv)BWIpJvucqI;eoAt;~v<+=IHOFCSDk_bYX@i zN59IiF?UM8hLG3F`@E3bE{78$0EZEKzRx_ zO#<1_{NF+BpV`(^SUl;Y$sE$6hf2QOvi~8^+OEFNeoq#;WEInzKqQX-29d|m>lYIGS`UH|IhGJKl#qquH{}>m>1}@ zVbU_RFqCyWR@LV~J+zvBnpNwolW@QQS|4${3fQP!s5Fv~`0$}L_h&vs%uv$IOk^7d zwJ&dUbjMWI0dgM!u+ZY?lj1O148(8yC+9D7+b$`BpXF6^(Wkn!Ey(+iG?|f&%4cOCm+^|aDStqTMv}1d5^k$2$7V>{mT}pD~e?D zPBPlG56-1e_0Hzh^|T^R!fsQjH_kk41JKFPPS2-1$5W)MSdRm(sKp*7aYBa}o3gnw zkp*|_-_%u9lwr32mTf`N+V1KwwMiF74884{x+iUXZ;7Z=x?0;mrhmDq+Sh}bonfc_yWd<{f_J?JB@j2mQKc8rr95hwvHi^@$gPVBy(YNN$*3&%A)ciX9;rtKTz;DQDnh`#-`DDMV{mCtNpCqtS)7UxM->kPk(6~1!VJ|X+}QWzyy4<> zK#Unsf(S?QJI%e)`9jk z=UZKT)rO#8nZtDF@70+vxSvGR>s*Ut;{i(al0aQJ*4k)j8sXaAHsK|o4ch1kz^ozu zinfn2T0l)K1A8zd4&74JcYoY4?VfSS-8&$%J`&ZTmWV9_Qp%s-2xD#QzigAo%0HZ> zme(v@>f7Rw6`yh^{|I)edgF+|-LM-uv%-H9!2hRRBYwt2OVPxOH+ubVtd%^n@&`aN zSVG?71qAOX=Y0|0A#q?n=-TZWD&#_J($K3$ZfN*fu6^&qr9EMiGSVf zEy1qQ&P+X>9Iv_?*Cp5&L)y2eKg#I9T4o;szmc5GyNh8`YcDB4D34>*kq?5R^D=!padA> zKoD)GL42Ly>dcz(QXKzmIR8vA|LJJv@u<$>5adpu(}NQ#eCV6wQ24j48tz(K&=F)J zPx@Ry<5IahlyiY)d1l)+{8}bYLUqU7o3|rP3uvh=;g#*FkSEY;L)yeFvCp9>&SZ+# zOhM+kNczzS!>Fgl*4fadsaVsq1lO^HYhvdboR)a@F{<8EmA#(cQ7L@_0w@1I^Cm;m zT{FWKyqQv=C%tHl;A>dV^ZO0hOuZb3yve3oiqLcCFr#luK#30|K5k&L$mBSaa z_yj3vx?!hCsPkrQeAktWnW?MiijoMOyvZz!!f~&$YLu}g-i~_=+Kcl=ra6LO7wu&Z zW2+PH>)^!7a^XqF%EvT{x@91`?}t#r1L7lSdZ}7BC!Pg|{W{`wGyOqhi~_#Jedp1& zzWv#bgyQfgsW;I$lrd1#R85htRnV~vZK&SI#Vvu=)aL>7`8cC`SMWGxWo`DACxK;1 zot3ekkbCp~!EmokpAKdnkIS>MVpd zH3U`3#1Hhcn1A!s;F8TKaZSUkpAEUR7=mBo6u>?xjCNLhrcZM)|5;0}>y zsg(_`7d9&|!?nCiHv!PDd61gLi!)vOD{F=P9v!_b{{4*2%=GDOkO+A z`ZD{!3s#BQmk-ROjMj8!DAZ-_(>V%=8Jgk*E}O}ley+uP8u}NUPhg? z@L44z2yf|p*cm#s(tH-WW>c}OwmTNY90fhGfj$<{gn-mV3fo=u*gnS52!y-G&s~AV zf~dn+Cn}-qR_kr+pWi-+$fxOhIljwza6TB^LV)+qUS!({*K6;LKwacVO2fTpztiBAu#1JlUz}(0FG@sJ-4-7reEj&jhbDSw<7ou|o0i z2mY8|m_(~r4mS3)QuJ9**Rx=OsD#l`(;G;6@r)gn%()74NTaD5@8XLk|4cJcr=IQu zUn7c(X}6}?w>12AXh+Ua(Q`ky#=u)3H8N5`{qf5SZayfL@Bz^plowB))2IBTJZrMH z>A(N}C*yp)4t*B*gs;MOb1)SEu-zV@nJOPaT^T#H47Ks*18tdy< zT`SHynw|7s)Fhir&SjXSsTfuOG-WqX$9X+oSx~-ZB-vk=sZytNt)5wYvNEz-AbTU{-w&rx78)_R#HhPVD>SCmcVchkj5Lp!10>FkC>fEM?R zUu4zA;2U$5L7N^8LY0bS3Fwbq9jRSTIC6_X~a9x&vd;Na1s^WX&2f|r;1O>(wSvrk#%zM=@8t~`DvCb{VS%&D7w`hiKo3HVm7s;-SWW8 zMSh&R%h`>lNrI8^*Cy1!k;O?RIlk+Jn|d4WuAKF*SfH3@H5sM}K-jOZUPG_xXsf=e zckMKlbZPvfPx^HHGhVYz>fS|6U<-Jmq>xe8)?(xeS?@d&Vaygq7u7G#g$2FhZ>_4@ z@xUFD?;~x_QJhMQ1~a+njmDOSh?^(k)LZbQQ)vNI^>l);+KSxtTy~<{Co`%$4K8Pz zT#<2t^p>8EQW3Pz-16b&NI5nOa16Jb^F~bM#@mrYBD=fcY-#gL4Jx_UO(4ph>9g|v zhbk;2%&mXXcQg5kDkq*#RGV8}qEjh=9moU`SG-i)-qps>BE@Txy&GeV3u1+;1i+}U zgx|rDF$sn5+d3DO7a{K+xrSJCaKQ%Iw^nB zI*QTAcRb{@R=J$Ep2I|E?#nnjy0xrX@X)G#BWr9Gmq1OEVJ|KDDLR*2C4|0An>X<} zxe0C=-8kLp>PEMpxzW_Z*0%ELvFNj?Ht}rs|CiH!xZuv~D9m~8 zub!;$-YDE~va#2&B(5rcd@0jqddO+v2aDMVuc3TN*P3#k-(zKaNJ;?9Iksyx!688x zj=7f6=NGs=)@EI-`mAkLz;&)@$oyP$$M{cersX93c(YW6VatC0HsM0vy-nkxHtovY z{O41@#9M5#k zV&z8GvMOZl>TUEGK=0{k`b?)6SlOoBE%cRCxQ3OXh`y~SNaeV85-(f)Q;d^gU6k9f zK&#-(`}}KCu0%b!+wl`j3K`aQcq%hf;9f;yU8p8&+Wb1n?e+Nt&mEN}8S#-`XZ!!5BnQ6VF<6|$s zA>{2^OAmLUKz%zoF6WjD{gQd>xYV8FC<%kZM!1AO5NKvihOz&BVZ(=`Z44>b!`5-Z zL%w!yWwV)%s_azDf|#+JD>};phiFG^*e8%?VJ(SAPC|kmkUdvhRAu?{?uk!Ii-2Dk z0bs@cUY%zpy$B5yO_>pAH>@QYpKT7b^-hXzb1P3LpNku<23SrUf(RZF z74x;o=d?D`h8iU%KG_M=nc?y}KYVl8Q3UL^Xqcs`2r+O-4`iUYjcRU)2)Fv4@0LLO z6WH_BTJQHzRgRw)h=$C>=0Gj329UZ|e8r>U=6i3CHgSBHqKV1FCMRs7FoOxO?ZiMk z1}uu1k0qb^^O#)I$p>|O>=}Q5o7d;ds28>MFN+l9UF1v0Bwra!ECm;$ZftwGN|L>( zrrqV-lD(*9$1UpBaxf&q-b@gUWPgse-#5#EU8-VgG(%A*`X4$s-SFDX7nKR!o>-PJ zGLW_U6^MlgR;83P*%5NiXI#(_#bKCLtY!ox0fSRRyFkE~vegNVCNqslWoTi+8b)i^ zyNZu;8y0SLJY0?U_%X@xFAK>G=`X2Pkitr(Ze2H=7vj97;2)tv!Ba&m&p=XcxZ93| z)77ZBaVYxR$!GMov95w%nH{_0x?nyo?I3;q46a4;@=bdElMb9*PR6!+;V3!0_>c20 z#(zGj|Dj1rUkIGc96H`ewl4AM9}LH_Ap|KiNb_Ag&R|5Vu{2H^n>NrbFBuYJlfOi z?7~;(ilF6;MA?i<@4LcXn)=WQ>67gD+*MgmyaQnR)muEmrTvjX-@{DVX%W1aKU+!B zRTO~%B`4pb;WBOpd(X=nXM2AWv~xT)oRk*eZwm+#_N)+_vw4>V3jX5oh4ByZ8800p>C?~`G@db zQhO;Ly1vbAL$b(x&q}=DU;iL3QL~i35WQ0BYI|om9Fc$II*x1PVV~G?$~BNw-8AY? zTc!1gp7ZIlQ&?SP`d&X1c!-ibGeyAO=B!CZSyOvA#nMu4j4KyQEZrqlCXbUpCNPnO z_4M}e@N&MYI&yUAZil-S6Gu3I4fX^x!aJ&xPrrKbT{gRn&nOVimlVWM4CwXP8()-<(o=Wz|R&Y*P_ULBiN~)V zxd~E~aRdN~!djUBU_?so`2J{MAH%jAtmx?45Qu{D>lBeE;wU$?A++)!_%atCb?QMI zJq!RvhpbN_qjuMvopz45@Hlh;g}(i#n$tH@tfcC?kcOK8Cq7rz*AS+V{2^r*kkGV3 zwd#}_ue#f$&!)_o2;!w_GG;rvRY09xQQct6P>Ua+3nW`n15vq98^sxc)k%6jRW>$d ztv2nwh;6=Ybnf)J=-Pg5E}temP7S6`Yeo^9HGxK=&RwV~WAN1iMhTS{p?%CevK44>XZVib@m z?k?P*NeHV7IuBQq8A=7#s87e zSzGk*CkUuA$a$n5ejCZO&J3!|K#>s@pC|qm5V^VoPL0a;h!%{DpE`*rfuhw-=-jqQ zrcfgU!~QX4^t|OzH^%<$=g(sJ>OJX`fTEqA&mvKvuR1$*I(bvnXsEB()3Y#gvGDEU z)3?S~Hl*~zyWE3p#ri9lg@voqB?nJms@7{{CL8p){kQL<`L zJ_jSm11tm8+0{-~Cl+OQ{Trt-yYZ>er+PygijEVAncebNhp1pVfG{@T%q^KZ| ziqLCX1+*SE)tevapuss$8BE+^Vm&?hOp7@+cBMKf1{*<`HRPAOy+8K+qXQ?M7Ro<# zmbBw=X>%Fr+0ILL?fsnWWDw>#M^)1ilsp5%#M6{mQ(E~>RbND&b-hsAd)$944n`c^ z`jah$_8AV8U%fFW;;WQZUtF2lwYTaEQX?iemmE=wH>vc3cGA$F(F+hVtk%megD)wU z#^-~OtZgugOr(;&BOu|x0w%G$wpkVu?bXGbQyur4QRvE{+**fEl6TDPtu_Z$>hjTz zxBIYG7fp|Xu&E2eO8>zD={z!g22uM-(c_Gno^g%u&O5eVKnF4_?|NKl?~@#3IuLmS zOn$PHC!6xH%9mxJu-T1{>da-v`Hl1*%I@e@ecv}5E9Cy}8+uhxT&ar4bGfU8ZEaeS zH44h(RNvSh#WZvPPB{Eq)F4vX>F2CP4GhsN99bG1*%p=(21cSTUdpjuc|$G|qw^=( zGwe7!{;M95mDcBJi}JD_-6dQ|IuTG~c}j0Ps-SZy~CO{YM%$dyTD=OjywF5Gi6_#*xdDvlwhq z+i%+pL)+Pw#KW!-W;=^XTcywVS7OHwtvP4rAfAuEX)Ab}ELFFWFsF#kw@&a4Al!@# zKLGK(t8P|V7F-(P;U-)P*njB8vXhz`A-f1M%$n7VUxQ3_PPBGN=SkS_jNzz`J}ztB zu$;mpc?62NFxMdwv!9n5~m^c8Z$TTVdMT3_!SY#E%c{8kqAx_y^5!PfS-!9U!FRrxB04^bP-?odpt?BXL!H!l8C0$i1_C_uJzKU= z8<7BJBK?N&CSLJZv_TocWr!!)aZgLaQd53?!wySDIoU$GkG%uwS~@#@dry5z$&`%Q zs9^P<6$k(IVjf)9$m>Q&F-ThTwOtRu`Y3nR7b?0paN71l-fqpt*%&4Ai19aC3eE;i z+nqLV4l6(EWD>3?>tZfbf|KU@LzZ=*$$0zb*4m~IW968;8K``ACh>vPo_?5&G5z$S zi3mL3tE_J{tEX7ZEWW3Sn)U}FcKvXzlLw%2jhn-{<;*V%aRbhVG-0Sf0blA`!#iH7@SkJjjd{Tj@zjaO1JZPx#~Fs zAMe?OQG1F5$FODOg-L8B42{gdM7Mr(dFYW%WvgXnF5}uEVQaYfP3Mo?nVQ)n(&!Ng zNw>18(9^5ZLZLc2P>&aD2QOs8Q%har1A+!L+E<>Y8(BAz?`Zg{hi)=?eMEPb;B)%& zlOv{_`Bo^jrLAQIkUwgS9l=4&FY|!L-!yUdiB647_(1z{NYEZ`B9S&r;UNd=X13Bw zQ`_GU$0O78+vuVT38rX9NLC+~? z$5%~=o$7#2i7FZgCt#;r%X%h~Dn2l@Bj4y;&6;+8vEgb$1sFN0wbcnf$oEAJx!}^} zK8&SFzfS?^dt1dXw6CW4YM9)vJbbdSlfS|pY)FPu9f!$E0Lt#fn0Kx_HmzM6=0PD` zDmoaP8%|kY3Ggu1;wn_v!($@0{0M>x^owiX$OauN{bq9>O$xXE^t87zaro8olC|OO zTK+SBS36#P^QYjLQf9JGuUD5VZJHJe1n!ct3j@DJrDG0)_9>^vH)x5`2{s=E)w{5b z0{m?}s*o@d2Bj&pPXZzf(!|=dq~~4DyfZk=l5CHQoQi!*Rpp6Xt5f`?lj z5E7z(GbsI4_wb99kpEE#vDU0b2uHz|1CwbE+OsSUD2fdFxjhEbFK@`!lllQj7`{kwbt3&B=k*t#ZCzxfA)6a#+!rhaAw46l%rMi$EAYGXh@aBE zT~EezManT(Ve+W+pHeO@>z*!g$(qGDnZ{=?-n%Ph$@m1N7Pt}k|NFIY{@y(R;SCY$;36AIG9 zk6)$!?3Z&kBGtg4EE)v{;4^A^}_}H5j0l zd}fq8Rgm%@6rA?&y^3o{Kb%k82#vIszklXi0aYW5F5##N{K}0Nt8}7f1ET+oorOLL zlSx857tn6Qn|oIr-3qG4N~lKIMW^bNi#MkE>aO_xDl+DT#cUqb7EadsGo@W&IQybuy=ss32_A0aPfTw zB4b<~Wb(|u==R+&vMgHem2Uotb79to3`|{xN-0705~q?pT8rY5`+8>=Ctc1zMyibA zU#0*|qA%m_l#$!e5SkHx?6!ff zn_qpJwZgKS2x@}pF)e;9PT2;D1stRt&qZags#Y2TwMK~QWu~QS7rBCn#O4Y+gh?YK z+`M0UNFz|F9v&PCNEVnk@V*Ktw+O=l%<2sSz029L2HdyzTeXu77phvy?up+{Tbe$G z^p=-jd?wJi`Wi^AIT&9k=E~I8QlSQ(Z#Z)bm3h1IW};9#ib1%T>ZTzN?C#*fblz1M zuH;ccq3}(2KFO=r52cdkVe&IYrZzetH;k^~1v!5zjJ1&K_9$e;rrHk^LL|Q)Rq^JJ zzDj9*7R%#kV6rx6Cxt?kh=i9B)IV{RWoTPG&PO|0s#ahY^;Kj$$=p}neZ*N@f^t}t zae{K(I)z^-hd~Nf%Y|x*105oI21x{b)RUITJDSV2b>-X1ylR|+!;*Cs6YKo@SLi$9&k>ol-4S}DQj`W7)kP^oMP^+<}{FoOWD|!A^o3SYB6jf_L&aBgNN4Ys^v=Q zYRbjZ>(!QL*wC;*)G*>-7%MmR;dS#h+?i|48bBwp*LJJG!b-zrZu;OAHL#VjwRU@z zT0B)V!1BP=J8eXyKhNyT8@N^Jwf4mJwY%Hch8H0PhcQdU!NrW5X1_xCoNBPU(Lc0!OYZKT%G}m>+2IwPVv-bXdOA+8@F!DAp`F7c3%YuHS4}HBE(x0JloG zHZHGgscI7qcBjo(f4Dj0O&#^ycfuohu-Chy@U*vL+aX?%84lOjMcdwAAg)}rahPgT ztMe+w3~BI_QrxFWIxb`wt7P&yf%(UKZQDz`G{N(kO4S-w2vE);98frxLk;!nM^q|q z)KQk(;|k;S7!TvQVdM=n zp1&)nUf&;ceG72J4z%v65rRJ2zkvUjrLAYM%kV^7NU`%nKK{(MqE+khX{&*gg>Wj% z(E6fPByP0o+bS9p&{{l9*K~B%Z`7)#V zFeVW|l%-@dHmx2Fsxe8i!KE2^of5JEr#ieE_z#>jai&~Q)&vE16w@m$Ef(lt3eCK9 zN}?A(<%{SAro2f2wdi8Bu=U}$^UakRBQ%l5@8j`RX^fl2pM6JMaRlVXYu_4?roIwm z@v1l(7(uyq@%`EB;d$2z+P(c^)fzlFJ$F#lZ?NHjf~5WXVgC3laSsa!BiSKkoswyK z`&#n)O&N}r^l~c#O8Mmf#Y_`?-U6I8kAAjthM;ufve}t-~ML9>pb@@0HnxBjb z=oZA=xWi@zXEfs%e#?wOeu8Zg5;Q(Zy)t-*w1{Dw;u{v|5YF~EyQ!}A0QQ_rz@}Sa zeyc0ysFf-mzIaenz(CX4dB}qoQ9w5;F#RMr?Kw`+mR59Mk+C}l|L~SBXz7P}!D1C* zQrmb$h^w6T<9tvx!kDq{iNd)_P;*gxlpn#o-ZCwPz1QxLAbX(mkuI+1Vm?Z3251m;uM5_@7R&1&wCal?Lu3!^Cs z?b&{SZu-y4(_+EGX`MgR2Qh$}iNT0ySKznU2J(+N@5UlfoD*36B#(Y{vtTT4;X6Ss zly~x1r0?aNf)Estc$@QiKlftctuO1&ol;8DJTT2IsXf+waZ!==7$JC`!C>JZ0cCn7 z*tyAD6sJA&p09h$)36a2a#oI{ElZ8{{_aV`fG9fe(;#!9)rPl~ZG@MM9U>jYFCf?fWcu>U7UOU=FeW^pRLe z;$tPnMia1Y_!T6PP<36Tc5_yMv)!tkqCHpDLAN**4pMLmTeeW2(IZKbHC)|A>xpBN zql50J4^VnWD>&P+sPmTpicO9(*5QgZ#y1@BzEe$7A1wd94-Ns)X$=iMqOEJl;2?JV ztX$g+4FtM^`J-r2T_8#A6hktXxpgX4)}h#?I0aj7X_bzsX(RhP@9~nZ1vMG+en}jM z&0!A*cF#)NxJ;X)Ius5t=X`l`bPGydJYLd&Qlj@s!cr_3`&Jf;H(~KMqUZ>uP7A&K zxj|KG8@CceLO%iwzbO0}!S;11b}HVK=t25e^c{12W#5!9C)SG$-8SzwO;l+N50sSk zTz^xFc>)76rBYCGRqX&%slQ-v00lwj!s4bt#{Lwh^w|k~Jf=8oIcs%CvnfSP^y+5E z!>Oz0qnVSWmpQHT!^bynH6dq~Q<;b3kVv6cHWwq845wSQ+18upd5>Z?gQJC@jT9Ff!%+|&x7$cquXtWfr;Y& ztL?!^Rm{I|l2T^t73PK5Kj-acjYPOtsmxy9X#z!x(sRWKyN!Z}W5JMLaEkdEf)Lp< z6vrJ@d79c6ZNWczQ5GF=^<4<3R*bLy@Mnx90xOXz7NG^ly)X-ESXN)QzkwYp(P`3x z`P9}?8563$BVhjqI#7YQq6JJ0!fj9s@ZQSLFD{$YZBU>7y)0yXg^H&7NAtBle?F^xL@z|9+<1cp$IlyWko6YZ5gbKA@FxZb1<)C!nPR z%A^%dviMcgA<~uu|LrP$d#Xs25h!$3w=KPy{mi}{^fc#xCkM~3iq3xQFJ!~^lB`HX znGt;|ibs>S_eY)%-9mqcx(epK5O52$x7{!F^MF*^s?Cn>naec0dW$;GQ(});-a7xm z_QKC^cXsYy4@_Yhk`SnVpH7%OpD-!T>u!w;aIZwxj4T3(X1?FmA3Vc0IC=%XfF8rm}d`Sxq&#}s3rau`D2=)2c< zl}#DKeZRc|+S*|tw%!^~PGeXv-8Lp@dnEiRZQvmTLonk19aB!jN?_}ICE2O3C%0<% zd1eM){doFiL!2$uT;e2ywwaVvw2iHNs9~y?d(L6g;}5(XR_$-k7qat z$EpbNE#jkNh-Iu03d}`5qAE{^kmg1I z7y>7ad?iGibTK(3C%+amKzpcInf|yrV07!eaH`&iN}6*_=``N#iNXP}N;Gt9Y8;Nq zH^xaJ#D-zXbgv87JI@o2Vvk2#$>BCV^stDj+X3Agh^1LB+?Vj|T*)_2;)qsOgcccd zq+)<(3g+d{wA=#AeUSA4Zw`-lL=yXIk>B2EA;2Wq=KBp>gyM6xEnRg6x=3Q3$b_6r zv{NME9a-yi^hONQIqCcyAySbZS!%BqbUrc8$wS-W{KLQK{Q?G}HxGi&?WaFL2hlAE z-5NGPrcwm*o{xC-6udEkm4W7WQ$8w9{RbOAde=MQ}=E>k-HCnXX$%gVTl2=1-A zqU*#FvWR*iYx9Ch2KJ|x0y0NPg4m+b$O%YYZIkZL>T15dyd%Ib|2G#BK@sGE)II6P zX-bGc!QbD2xu5~&vNIS-kP*U-^r3J?>5L9pOW%Cr@^ggKm?L= z>*>ls{G>HA#nsaGKja^dUs=c+Dz>BA1`%iVoXTvH&^7NL)w>fsfFEg)T>NP2Ni%l)Vi9$H#*;)o`?A-_i=F*u zq0B6sT`!X`;m8dA!VB{-+D@vL;4RW(-`NG1${HK577JO#mKcqV7vq{ z@UHeQ%ht9(hnA5Y4P-hL@}?p(i8BE;Pn9`7KB(8bG z0&ZQGCs)76egPu?8~WG$gG=@JxybY`)Oe8QJzWSG!CE$SF)}~d&zL)Q zR^iTU3(oS8ld0|Uz1#J+gQuVX&M|xV1?%{rZBh4M`L0ip+uXVSAI?Rxbtlewo9sU` z8hR+Pri~=-ZXRdpTitN}rGQT^!9eLZZFHNC(hI=)unV0!vr{X)$OFoSRlK{_Ckged z0UF#T!@`JwvXjbf(%hu};0##h<90?UC_jId+IJ)HV0n??_23sC`_RPbHWuwx;<$hHhcKJfhqoqklGC0thV57;zF zMSG)@ekAo@TZ_Mz2D=imr6D{(&HUm`<7|Hj3W2-2HZF)aWq<~H72iQq>JGt`zfq}b z_~cc^beao*rWu8J)pDn)6OeDPQ-wxe^IbFe#i8A6p zek*O0x?#AD@=POc@r?tOlWV>VG9K4kmnHcIm8rUIn8Ii^CNyxC{=hMX?UD!@WWWKd zE|>6ti@Nvr6(Z^i-rCDG4^hVEsv$0$aS6I{N~`P;a?2fie@(ol0o&l73P+?D;ySNW zd49)*UVT^`{Rg>bOst)gb|%~K9OtoSaM7)eRGyKuCkC2-Y-BB6N?}WjVKHU1MV%i# z@&8mRNF%7V4}Q_!f;%!5b4;+A2v1Mzn$Ul11=QpUr|h38|0RywCa`l|%h7*_u3f$p z6v{B^>OQ}63S|=~eghJZyC6_7BXEV~x0J(TK6)dPHObnH{{rLi4LRP<2hM4Qs@<2& zqJOOe7VwRwZ@+nR>gE%cyX_%-6hQVMX)aqNqD&KBmYndba28r0S8%E_c>Zk~@y`M8 zOE5&TL_Bzn@&|a-N$}FIeS!@t@-nnIQbrHJhi`TrSsCj(ZRQX+60XQiW2t?}*49KN^ zifH3D;AyJ(YSO^%+V2#bRm5p6=6wNmo9WjgUR_%K(wOK4Ml`4hFYrx#eXM-}64^iy z(#bI+QiLn(wk2ggF!1qZZwS|o91a|*IWqqQ*`w#<^mkzo@)NkPcXfJ#ffS)kL~0z) zACXXPvZkv-jYwUE7NMmYCQVPWW zQN+#3`9)F1p|!1Kb1FO)gkk-|PbI4u1q(#wxrXd(vK><}oYzNk@bWhSI%LmPQ?m{@ z+~trWP77qK^f`-nx;#z`e%iQhn1|4Kx^W$gh?vK?A1FvbcYu|uBe&f!L^H7rDWW@R zbYAQ;1&|qKoQQ;C{LyTsr(VT3$7GeAv{$HL_C6`KJwcL{5vWBk&m`HGP*HQgX4f>@Yy$eze@J-B| znIbklN0Y=qoBd0}4$hv#h--1#FLR{tWK{#GU#>7^Lh?oA8%c<>n!n@!l%*mRP7K|f z`gLR=$rej&ZsU?jFoHtCa>|=9=fgd+UsN=1IzMUqGwL}G$^xEqGKGUaHUIi<*3Z^& ziP+)C)qVrar<6o>z$zL_mebBnm_V1iy-EyU;)ymwHuT|cC0L;%@m+j>l4RCbpcAqv z*_6z|`bukcJ*;|xQzn$_5Lt+1lRpv?ch~Ni%4aK&%Rr|rZyPA+jP93P)#yXCxphpU z&8o9;wISd%z~>GDh%_Ylk8a0t$(ukDsZyCLJoUgLC`|~eSBxvee`)WGsTR`dS+czu<=4vFisOT$4pjtIE_Ze~djMQzhVY zWvigvq7MRRjQ_h0`IP1zcajR8_HMV()7-51sR~bpb5h`pbTvoYQDo-`)1!aXyYy0j z6`@mIB#KeKHf@gAiL{B-HLY|?vdYd{TA%{m%^A-He9kesa>QGp*mo**1>lg)@)j(r z8gD9fl>bgczDVBBMYvS3yI1Oa5C?f-%B54YbhBy;;VB{bJZpm96pEFc*17Rf+tPAx z&<_Q;#`2EESqniBVHYx1U5 z+tfeA2i+g-H#ibey(0XQrWtN3OsV5-hR}m@gkxVYj3wl*iPFInJ-AL0as;t5Y&YKN7Gd>#2G8wQmhm$?pB~kad#+I ztXOe(U)&vvI}~>*?zXs7+}#&i%9=KNyyy7WWWpNCp)&`xLZH?c!pRM!;g7cV>X^nAurpY(Ve z!wc(!5$Y*=lz1xUhqO3VvJAt;?)1`B7P@>N%kv6(rGvTS*@5kdOK0o3sJ4%m_)IUl z6}aThK%m4o!|)Z2Qj=Y*qTg1&@+LMP_Q2{SO%Hlg9uxa-qxG>8>hEs~7GgGvt{T(B zV-#9#2^6ckx(6`Emz5OvgFOQQgLm|onkA|U60k=@?U5L#{N)pMqciG<&V2&cUsRDk zt^UhzN|Lxe*kLnY;LB?rdE>Gji!_}|lx9&M> z=f`zFV`N;{B)Xt~ZLtK=*tC0mo@ub--iNbKahY%M-&9Fh=OW-fQS-2Jj%ZD9ILMSXd!EY7n?4Kzgh}S!AktQAzhz;Bg^TE9qo12X0h_hO&vMJwD8b{DJ#urV1mDT zJ36%TMTLEjjsjS1f&t~rtr4nVo`c_(TFj!3KpnuO-Qc4)79y^-ZTgAx=Itzfv@y`fBPM{n^k`@P^?v;Wjzb@cp>G=68v*EpgS7sC~8`+@)9vq>~3*uof4fND;&|K z!T(vcQ22336XLN8Lgr&h>qC-Jv}ldNZ=;Dj(m3VheKlm!j72r{vuc-$QlU9wiOCYJ z7JDkI;oY5a?y4G^C5oi~jiMb@5Ac6v$* zNfVd3C!I?gezsI@k&xEub&4A*zhx0imCxYD;eU>Z_-09S8+-5p;X>F@_p)iOk*imz zk`vm3)cS{AnU|W&fi4Iw8>X_BWzR%R8}4#X<| zKdIh}4q%JY9f&d?pC2_3_|f#REmii@*9*Xiwhw~x;tDTLU;{oYv+THQN_7G=ITs@U z^#h&YF9wBzhI_f05ZuoYE2!N#F4GmP_uIF&1A#unqvL%an59WD*@&nM*yqc}?dOSa zqdh2M|K=t2@qhDzC+>E@X@tQ2o0rW6R*a^Z#l#Ff#xmrOJ<)Yl0l)Ut9c6554(#aG zK8NGDQ%pg@r6>+n3r_rE{NiSBZ^Iv(Xc#wNqOH{kbr7;(xa3N!3yxXNu0BqJpRDJY zvZyEyuxGs$f{;)|EdxlW!0$BZ&5sG{agdZ&(521vQu)~<5kPxw=F9_Xvb-2FFb_}f0E7GbWOlF>D`yCRRbU(C0D+U?FZ79fnCM0Hl3QHwJ38x6A-7ej5q z)ycP(9z*=}5S{vNZTu3T6%akMb?RWTon#TEsmC?sN*}J@=N%Fk=fYU1V`+cSkL$#2EC-IuX=dw zDSDN^(Bb$)8tJ@^>O!dbq`gb&;Trwg2aC6kfy{MlqSvDwb87~MBT8ulyVRCwd|PpQt~;9w`7TlMusEgf2ywmKd6f5=_&(YhMSG^ND!2PTPf*vau*r(V zQ(k)Pc7d&n_N_=@_t&W47Qg-Y3WHr5SY&(Q0!jN8bbZ8yJSw!|V%t=mD@MWYV79QvB(ORP=A5blb z=JON^K;}QHIC@U#xa!xTUss>I#*%NOOMs~Y>IK`d-TBGLE4-TdV z`V6MOTci%0EnxIhepp%MW1b={uALXQ|M?r1S$bKXt{CZf;^FVH!5>S~C_XX5jW5+& znf2yJ33yp!*S&e0q}fohzjZLHkVIHruZb?pnby6!3qLi}d2p<8&AB~wzZR;z8C(f{f6sS0E^L^J{ zjo{0ApIWkDUCdG?*p)DL4cv;~x8LB$wIR47aLz;3^x0*37W7fN-YYJiGc#kvt3DZ4 zcj_HymbWE+W|R+D=!bqi8Yj*KaX9sud>uJ5=L44nA8QhESiRui=3YL>=)70uAk*B{ z!MU$|#9d2`l7)sUEAQIy%PtOE-KFJxyZ^}fHUS7neYR6yy-oe>x?XLofv%#D-N?EQd7J0E8U(Ez<)ORbli zUZJBYdIE8FAw`4g!Q?VWM@CDTGMsb9*Z-|Ji0_|=|G@a9uevLswI%aMT^|w5c--Nx zcU4T^{*K1-gU5V@csp|M=y4*+3EUcjE_To;tnhH2$DXz9yJVpo_V-(Czsmxg=fWF0;5;u!9zJJh=QYJjJ2Mc8 zesj+~DWnh#XMiT22*%9`Bj8rC?(y=Sg2x9B*yU1HStwRx(4{{ z49k`$+X*sD#co?VhTJ@H~jg|c2)|MQ?fd;9!071^eItxSJ)Cst-i5RojLLUu8MJ; zs@dN^bj5fvyOgqU;u%(Nk0-x3VQ~LF%rn*|5S2M}1+B8lAB~PYn}JtB0bY+wfHf0y zeejRFzQNeLrH#6Kcc#mU$T<#0Gh8ST;B$0K7D7jsHr2*g1!yV_>P)A<5_!zeRg|`k znG&1T=H8ad0JFE&?ELQ~*$;0H#GiFy0(>`ac4O}(`hFJ8RI89w5HEPHUv5|wl7$Xz zLl!^9^Nu=|Q5KEWX?)>$+6MPQcbQHKyDJmsf33{a-6yy652aL#cBVzO+Vt*O8BFA2 z67hz-Mg<(PToH6xRs1~LC>Kt{sy{0(vu~4bGzi&;gKM}biiZV)NP?YiC0(BYIqlzH z{HRb~A8xSt31VNVbzk_lJe*HvMlqJgt*#=APi3w)Bj$8TZt&m*QX6*5h@ce{by1PZ z5iz8ThB(jS%o}+Z!wHh!K0VEun9KxUl$Ci5-=Pob_$JaRVh~rcE9x05IRe=5e{+J= z;`DQQUc}6o#}>yObhn3zq1cZ07L$-RvcDpD-MNiBPy9ho$Yv%>;cMGRV==mGgqAls zBa^ZMxX)Jv+rbche5rQZvg1XyEN;DroN3|SOUuWhcJie@X}dD6Nui#;9u4L;x>uqv zuSgggi^<)J6ZT>j_g-pqzJP{ZAKD~9N!-eDSAUjcg)CNfu=ZaomJ#uA)!xj9I(T61 zgKrc4M#43k0ZWVqA;Z7q8&V(cR>9ef0}4ORRoc(j3@zBV+)WmuL#YT41O+?6GJ~3e zG>m2jr_C4Kmi@bBco`T>amj7&y@3hP(TpecHlV#H@SQ1?q7XcCR9iPK_sn3GyJR;< zQg*1L%d+^e66QzYD-1fYx(s{uFlqXQ3fA6v?1{k6LU}x3KW}FF!uE7ubf;!Z$Tq>c zY=i46mU)9$({g7@TK$U#m+r^5%LZ$cj_gKO^mkQKa0#5fM#ZAl@{Su~BD>yCy#FO+ z)6yFUh!OMw$U<^^$WBm!B66k;4}X6Voo?Rm{2e*?bhECtmh)r8?1}Ys$y&U)Hbp=r z>Z>E=!^x?lrBM$UYhC7SX;uZ*s^Ub0uIcEnUlL>$^9~d`#x7)rFkKg>+Q)baZf?x2 zwodVO8hW#3G3C(XXeik=QF^F2gbJ4k0PJp0JD450@s8|&e~I|8-5b;hPvDzbkt~3V ziK0VzJ$*#MH}!4L-<7G(VdT7*PuxAshLMpR!^tPk=Dy1@L8O-* z*+mb6)$M=)Itjm?+;0B~JP0@PM(pH`Fz}zYuqwka?r;m@`SbJxS;M%F;UBLe+iR0F zRN>8Kwb*-!fi2{@pe-}+MD%g^uL*v#N6l;(T3@b$+Bb)2pvrT(*2!hy)46l7>;l~K z_Bjaux$)W3$Zr#p^0W2(eg6v5$X|K|_6Q9eiIT$>?_TNX z|5?;`_jhu-kST(He`n+(FWdGUbUnjBN`bUz)ba*hS<#U%*j6FevlZSFfQFvE_}YWm zv-juMNND=hAlRoC@Kca`YE9rS-?1!Wm%`%b9Y^?;_)hlcg0&KZq}@3av7=s)C+c{e z?{0*VIPVlKGP5Yu|+5LBE?5^bi#H3K`p8;W<36iXCL(6l) z&3Ra>y?{GWot)JIz>y6rL%t-sP?Z(6J>G6T;AJ`ZUFY{*pFOWQ$6|<(kxe~~D~S;@ zyM#^&uIWeUH{6D>;BL)T?{RgsR$wyi!wFc?0l6YTC&4Al6}bl1kI4I&%dFL)u6$^; z3g}wZwXH{+{PfRJI7=UU!!5iS&K9ABDH|#TlOP(dILt*fLndABB5v~?xc@9lv{@zz z3c&*h4*6R*8g~Dcty_ogDn96>eOaK7X4->kfZ$U~hj93;5i)p|ifOdgC2qKs6#NT_ zFmM-ot;f#wA6uHR`0l7)$X^P}w5Dhc5i95|uVM}Kf~mymI5cA)!-p~iZCS1URlJDb z_*HAu8x5hX-aQiFb*SsGJbLM}dTsITwBd|191$^hJDVU9-Id!PT_S!!faZqut9D6S zo;FgQ1tOW*d%KaGFN#@oQQge<81E7oucVA%#9L#ENc&RpFsn=Xd9|{7;xa}(R(Inq zbfC2TWLT_GpJU<#Ny{T0XA8->rD0WO8Fi)>m<@aW7p?m#pyc+AbHoqX7yj&-vxM12 z*;D`NOcHh+F%#ynY-Jk6F9OGrqK90WTk7oEjkmt(M1E zj@COETY?d;zfchosfm+=Y1-v{jQ9<@iIQ#HDbO!tGJes(*J*OK9J1J0O!@f&|Fcb+ zw^GY6G_T$P*TcA&g;q+clO(+E?ht7%fK!V1sq7r)Q;Z1{K>F&#{|+6BoewnR`|p|C zMmoNwN73DSw16Qeojts(C}|}c4Laq_(KFHRu{4^Phexe6V~>;=RI=v zbB3>Gos^9X#cKdeknoxWkt{PC#cXyLFoSy}&~J@^#|f`d5QxqhJ}5PwRi?Cj2K3AZRq2=q*Uk zi8=giHN+td!cC)i1?-bT9-ycS)s5}+<(OEm`Iwbw={1h|2Zk8f+aVp~Z9&Xp00b9? z4qDy&??M^3Hz)Y|Kj`p^70l0g=j-&2AOE0jMB$}8%UGRU{iD*+%#K+ay&`<0GkQs& zQDr_y8TyElm059U2&E#z=bU|fzcmUHBOO3)~8Jh9$g_f;g8=f`RZ4WQcczyB4` zT(7iZ({0ijZl`*NYID7|i*RE8DOy+jBR_Rbsw+tStkXL(Xns#+HIBD%cCQA0yFANi ze`G9NgQt4&3j{gB{24UhONGP#G`L=}lZ?ZHMM!R3i`16e7-woyuQ)=VgV4~Q=(hGQ zyvTR7#eLqyfCzW6;N#Y?zki!i#__%88}+M}7OWkzrHZrqOU7e z?*ze=UmsdimO@fj{#FbjWpyEJX^d9A{nQES4rY&kvjjozrSVtPX8W)FrX^m7P8`@< z`b?J#xKcfl6_liS7VRu}7P+5KRC1gC1?f}LT(mYY%Mp^DZWJSjGso zcSEHp#L4q+Dbgoof^CVdx!>kFIBma4`s>fr$s(kjtd_>&Ch;@>f@MrnEFMbtorI`H z=p9}X|AW4+(L+L`9F4fXTW*FjoX0*Mfwal02Hz5{?_tgi15I-`K}%bS4#kk6Qv znbc6%LjM1{AD?%Z3P1$JvNrYwT0FtJKJve}d$2Bqyl?HKuJAv2f1}`c711SNT;RfJ zE$T}pVyY3{nH*DR{rDVa$H$Yy{GD;bRl|Ic)xbpVm2(hIwXbkC>9rM7W6%>ZHlhm< ztFO9V!UQoh&I-FM3e1+@SHO`!0t9@k_Mu;eHM#4?T_&BC{VZ|DVy#^6p~C&-SXSwj zs7NA31{_VW8kp7Z2uZ{oBI==ZGmF?xb|JH1TPZF`@oRVuO&yrCEo0EU=6-I>zGa$)dlk9%>E7nTm=Wuh*At zDqn=mMfCd6nk9Foz4z~#^Ct-#5Ifv;d|282?*~mxX!sKRT5W0&R-BK#k;mM;5sg}CNl>Pn34zz|#@wgiIVdP9G`frxv6ZpAsZD*X zd91ryV?fQvPX#X{g#@$i{j4LoIP51lf8O;o^)dHIIKhoN!0d|AGeVK`YvNuEl%Vcin%!VUt~wrOPx?X#$}QyPufpPLFH`LCyzY@ z)SMLK5=Zr7m2!C{! zY?W~Kg{nNo4pOeMzM9QA`mQnDTC+;>TuNn8Z@GRL$>N^$HZ_>dhK;YE)>M^Mzs5pHPV%L$=kK-bjK0#$5 zdUf+c@O1Y~3B<`UP_iKkpHCX(?09M>l)W)j>8|{#Xm;T*>~rT&lq4@Z+nZ&RI>$6C z4+8ywn3}e7%!E*4#>YXd@GPFHK~|glT`QePk!Mk8>&o%``u3lS_bZs&GC+4#h-pi= z#NpWl$&g$`40eQ(q~HWG29Qr?g^0cJR)s(nCfNV^56uH(LT(3}w72T1N)mTK#LZ2j zt-s=U(bcsFyfd3m`!rK5u(;ckpzTfCq;qh6Bt^OEf=2e|iDO_o)zvtyV+po8VH7px zqfU|H;9Z39jpMpl8spP!IWzcXFD+;x-T4S%jjR%dzJlvo#vO3Ah@qwD6XzttK`ARz zE~jx#31_97R|E-JsF@rQ`EM@S%wei={n`FdoLdbfeE(=dd^TMe`1>ZwSbcuN!BNqt zM)Zv28jEkisizF}C>B+7Y7J-dea8Gkcd4#Urh2b%H;4w%?CM;U*0Y_=kxgPUum(UL zWYTcYW+3VSUGAw=FlVRD0o8#6qw^z`IY3}P6NXqH88*CCNq@|HwukNy zfKQ&oP)emSNk)@7fy&d^?K?e>bx(zKA{F(#+yuXnzHD5GWb22`P&HNg(`bASeA(kx zeMI|LeS!k2&<^-!Y4B+(vV5C?8( zr}YDVvPOSo7RC%)3SAAEC@@Zub9QvfqqA0L{};+!e9EE)9Mc&D8r z2?Sz4B9EeGJ zN*&fA8l;0V`zof%)AsQX?X<+pi3fL=C0wfwmfMv8usg}Ds(DK%|HI%7Nxc5zRGaB z>m5BRmlh%=?_Mjd^ORt#6D)7H6~&ISH@5)>M^Hekn~v7)PNST%J4sjE=IgvxW)Z2l z>D=xzkg1sUgdtbSsC{;Pim_nQXJYAOnZ6OiN(>w_m+HZRTvN zvu1Yj221L<4pZkZgRC+p-6=DvI(7XI&C7pL`8m8er_1f$1Q=9w2Yq0>6F#cYk$6m5B;ce*S(00G=DYTJ=lUwuTs-IY`wnp zM-x{wmaJ&LofVFw>Naz`{%yr~I_im0aXdc;8rdt>XpV}r1_z)RX=^FyuD%;=|Lu$4 zb+TT1>z~J5FIoA7ytc$T4eQAu<}e?T7>)YQqP{BPf}cZ2h}R~w=#k@Azr8=qgMH_< zaiy^~;wu10@0sFNIn(?jOV1$MA{`CkKE3TQa&_e>his zlcH2Uzcc=ovr6}~d`7rIqRtO3C=-W4WkP|(T4$sW#IpdJO8=$}iOCvLvh9?!Nnh_! zy2$%vqt$$Ue4uoCmILJxmElWPZZ;pg10YE)s@Myf;{|^6%C}NFr?I1JN5O1apgT#D zz?`S;j?z?c#))7nsTB$rzJ0jiY{UR-6W$s$*vVUy8L)jF9KiP7)?4Xv*}?oAL@slQ zvBx2B$SPW()_xVG678@}eA8#3!+|Arrz>7_@{q=gi)6U4SL=;+cL+M=0{jO3CPlbf z9r~4+{F_Pu>7p&4dLoa^J_189_AjP-9|fcmIZLnQW|csvUh%ib9|dxOhg#@I6^+<5 zRZOkjF!Vbf)wExc(n{}J><0bCrSp=8@y3xH=oQt{Gn-Ma?_JK&CE ziJIGRSi6qiSElo(3R|)wX;R>w~h%L>d=_9;5?xp!=sg4$=r-)xdyjI%w4rpqnVP&gX<&5KO!r!Fb4!v zbMI`{JRe2#w0}jV^RH)%aGn>_adqW=(|bCJfpyk!CU#Xwng56=6?HbS%7)tNAeMl` zHmc3p&IKd^AFwFZE8L%3<*)HBHC=LKE}9pR#p_p~J$12kr;>SD0bPLTmkHf~c~g@x#tv$tI{FdZx9@?lX>{r% zM|GOxP=YfQHU$7|iGy=>*g?k*JS|y?JUdZ^7KVP{?>G?Ex7RXx#?;*3o7vL zDTD6i5$suDM|bW>q2D@I*&a?Ew7v;#v}*M%)dkY}QCOu-7wl~WTtxofo8K)p!%@jfeyKalQ$K4( z1ZgXf8nS={{q{J|_XrpGkT$L-+a72BEGD|2USI8%s8B4WD1Qi$n)G9B$7S8hGbd&h z;iSdhX@v~V-@*XRML(Ou(@An?rT%0#C5)a)=`0Ew{Ib5UJ0)dQ2AIe^pTirSb=}@! z?3D#%sZQ!((DHHpP9vE6d@KJDkF%}IQ%xu6uHLZDbgrVDhQU6Wmov)PV<^-W_Ekdo?pJnTd&k%so@jh=e*c;GOLGhnWXC@;1r{SiP|;rJiU zxs*lev$sY-;qrn-WZQ!rWCO!|k-KBPMOE1Z=jCR>Z3_kWXIPY7(w~{`*~~DkCQ_@@ za>HuU{GBzP*z9|~A8+~;u0oi_G1mjNFTp)uVw>E1XRohzii-ic#b>~qJIJ&QC=6m5 zG@fDJ#~L>rkBGJr#!5tt8?}N5QTlc<2LA*Gs*VvctTZ#2X3UlT+J%W=01or&PflTm z#N2KpaK*QUKIy*P&EAZYjjbC;aS`(`EgTqIo!_H~-km6X9aD5svUygnaR2|=1Zf2o za@m^DSWyIBb>DbUR9E2Othae*P~7#@)a;K)hs&8nbN`+^7qW}&B{bQR+)ZsM*nT|tdS zFcoov7usK+FYz(znY{?=BR{h~x?CKw>A}eu=F;uDPmnEEzSV&&*KV`Zvn3%fKq)76 zQtVT{DzadK#h=w9+V;i|3(z7*{(P*V$|sSsd`ox&YI0s_cB*~QCt|Ha#Q^t3wR4{Z z=mY=P93Vx0)}utYul9~0bc4@!j|5G-)+KX0myRb;I`3k5cuQ(hm^H=eY4EeICMEZo zl6NRCr!C=v3Ph>ix zh8{}#Gqkro>{Vq53ZmJn_{;D@?_eg-`!)+{P4!fzO>8XKvN0wBO-m*FI~t-Ss2`4E z$kj!S9~qU8Lo6@}T5vD_&0M&B6TWOnwm;s|7UwUeOecs+ zpp7rCl!Yt}L15%%NNSMj>~dC*joITS5*e`|Hge6jHzu3;Y0{FlTQh#4rpxWx7%K3%S>H6+EU!Uz^5-t!2esQ6ws7Y7 z@n6D=vs7`I1?9@0oV3DnK`*}pvbJO~PDm&Up%J958jF7E&}B#Hw}A=HF4hd{VxQRL zVTR0h;74JstU)WTzh#>|dBg&USS9BZxkX|nmBAQ@97WAxnq{Npv|#|aUhKHvxN=;- zb(xohb%NC9Xt1}l9Y1g1)W(i=!|V9!WYbK+wO3MpUGr9;B-88W9_>pQRyBPcRX=`v z*Nv)n%Hb9o%0niOy;M24#wDqDG&pUxQ1gG>PVFXIpDA1U zdr6-gDxjId?y*0r-K@odGt1tJzU#)QP}Tv|T4M_pz4+6UF_@$-z`jjK_3ENxgPX~J z9>|nx*ko#aC!4ya?R#)``rWZ9${AMBg;uZ+?&58X9!ymazR=~hwkgy9B0rIfrrTyL z+}RD539O{#kX;*mmE94#xbj^8ONH`~X>$9B9YIlu#wPAZpj}{MymL3T@TKurQSj~Qnl@FU3h(&On-ebci;1DD@d=4ZqkJ4*_0Y@hV6|2ziK-q+3teaQMa zZ|D#}_4_*?qm8ly|MM+E=%x)#+6iwRm&)C8GmA7j-^b6`+krBpDi1r^w5(pik541! z5G+M&``@&j&WA>W`i_z($d_^N$Q3yM-Ve9(s;C* zIbkT+&L3Z8!#dQ8YchFs6MGpM!?fh9?BLwun=Jb+*bxqk&i0Mh5C7a1+4Zia<)_*b3&r7;;i_E9Q!|xctHK!5o6p4qm#p`2p<# z`YeuK3kU4Nvd(H)e%h&BAM(G(;%STukiDv9p3LbG7cTv{Z}<5S=d3*aU`O|8?ao%= z&$1-)tD)O>=SV{)PpEX0COc@>lx;dwBJ@!@TDZ&|wpWC4H56lm;9t)%G;Uq-S95Z} zt<6Q|vU+bHKovt07aR*8uS@eGO?tD5!Z}6dD1D#NZBHG4g#{-ZSnGHY8*tg&x%dKZ zr?Ek1eQD%A3ompXa{@QesvG*&hnDdppfX&!^^4&@iw@#fs1;k)EVhd9s|@>+*ham! zS(*$JxN&7aXXcK~?Qt{kJaG`F`CWT$(_xQI#*8#0H2?bN(9~=@<{EBE(P6by?sQ#- z)vTXa`k9?+Z>S(E^dU>!B9X8MX3Z(5zTbO}UMxvufXzW_RtB=4Pd}Ff>RcLQ&a`3s#S%>ku| z#q*<_Rz5U1clRqZq!3f%tM_zkFXc;89T;lO2$?1Q3*kR8oNJWJen?TgeI%~z&@VUF ztF%^EvVX%fi|Ynt(4U0y%YJk^_&69NZvgM>3Co|8@E!Qsrjr&(o=%_U`$SBx#7M6>`jnw_g&yWFGJWdY^@lbX+@ zoeNqGsbo=4A2$YsLIVAl0za7G*_Yk-#q$ai?;9SRlA?_dt?>~e4An^mV_)&RsLue_ zjI$*`f}h%+D`(JxPr4AHm#Fv++HJidoU7v#&?@wq+X;zHQoqEx2UW2Etp^av!{h^X zDUq0&4wP=HKYbRa*xwrctU#KX(AGeQ_S<}RH+bw_rNLlomlRD2Khv`ZnpKc<+K}4< z3+g$)e0pO8H){d$=S4ik)ckjmjCpjqzRfT)0AyztLiSIfjWT*B0?UU!Fp_0K`Qn+# z5*Yq?CtulRMjQ2uPMldAf6yx;C@t9W4<>8ska982=_)!=WV2kuVZxXZF>9yLg)6)X zAQpkXfeehV+!AG9{W7-jPJa3?5Wi$tKxzIVED3H*~HLHxkz zq}rFZ+eOtI9%{@e1S~|P$OdT|opSKZpf)E;Ya*-$VbcdfY=@f_K2tO+xEnnQ-0`8z zqmMq}I6(U1XSnRILc?YVU~jeM8!V%#`9ES(ROsR%tC7e2olpbbSiJICFg@oV-e-E9m4!I< z0}c2(sT}Sd{I3$7XSGd$I2jk(!1yrS(0yZcU8YRTd!!wS3fTJg6h3Ic>O;B_+~GL#0*GfbZ^dK++rmV zjG`y4_>M}-f!7{zOady_cydgjty20XLD_7Upss>Nh!}k@;A9~3YW`2bGf;~rA6zV$ zHf2oWFrKw_RwiniV{mwnRFF#1s-P-JK$w7GNT@nl_hg<&MfSqHFuqRU^v)WfqnDiD#c7Bg%A`UpN%(O2I2zGB6VG)8+VNTl6}v$ z&0_V_J+;jRvy%0s_g1pGN)0_ z=ksn?*9a4|um+!AoIS9&IojFEAG?6}1`iL#XVV|U>9j&} zx&Wn1Rg&7-1P$1U7b+`_N7u)01vK;}cWYD954$BZ&I(gf_31gLfvG3>ptaNeM}Y{= z*O_N`u2{$ZuF9+33Rl3q^eWNS+<58c?o`m(Bm6%G@Obh=oJBkdzr?(aV zij;*qRE@G*RvnUKN{Nt}$dOR0hz#D?CC0%WELpWkR@j`$kIYt1T}fuS^>XSNeFiyD zA~FM7wC|0F&#Ls_l@?Z6o_4|&)Otu)_!Uiz^Z@m zox4z0x-bOEW1yB7oRE*@|4Lf<_R4DlG#i%BzZX&Y=|UaGZwcT8>iaB00Cli>JP;MD z!hxi#!5UP9G){k34Dm5Vyb;xmn=Jwlx|wW5D~EwILc_4GUO+a6L@BmUl2mT!=^4TU! z=2w?i;5_OtKlHK=Zm7?a-F{#S3q+1_xU5eJ00y(LS4U_GXoY&*|MWcMMrV^$TFm*N zf(zj_Z**-m2j&ljJRA91l+h>hh4??u)HTRN;B;)wEp{9^`(amnPTFemb2x`(8+&J z&>^SOT6@ipyD%m6$B5X;o*j+F0>OePl+2MLZ*PL@t4#&<|BuS&Dh?3u5}}`ImDYdU zc0Kcq^ z%=JFvg^8$v1Y(M3l@2^VkigIQ;}T9dw|n^u1!;n^8hQsIrmi>rN1O}gi%n_)9A8$$ zyX&X-yXib~M;UXX0lKJPKsr#%d7qFcvOQL-LrTR$iUG^Q$i!b6%*O4xnUd5P6E>`LVWtE;gK??1BXltvhW{9WQv8CW~T1Wr^5 z|L-arqlVSlm-ye}JR!1S-78Kzt4A_temFQTJnXBl=liO8{^IRa%MqxV_-~tz#)Nyfb_Gj?F7AkkBYs!tA zAw(rNj$GqW*pig$R09ixjR#76Y8|$|S zs%!~HtcliT?ha8=QbT0y&OQpn)=2Oiv?r$2!0E2aOh#Bu;700Mr96tISmaj$?_~A; z{|C1&5O0@d7K(gl;|`)4vh6I)=Gtvz7>0D#aXyl(*9Yp0FEQ3|xg)ric2{$O)KkYN z^5WA#E?%hEmWFO-qWreKqT8W^qn-T?;%e63t+qN|)`jxb|68 z-O%CzLz4P-)+PSOs?CaMUV+=iS@1i)u?ZYw7b;hwpj_j^MG32fx*>3sMUFgL;lPgR3lTa1M<6^Bq~I>%=EY>k&yFj7)5B2}C@H}dhoCnl@6 zKCq)A^h?1~_ZF3FbcFdk0kK@iN|`m@IhIIw=5($KJhPynxue9#Vy&$FS|3RJ{I~be zn!S#ULC7+T0+dxbCG6G5VgO$T?OT{dJvq%}Rd^h&dH109;?Wn945Rp&S1h%tQjP|C zjJZ^V2GjSctZT9VyLT-GQ%|L$9gB0v=rn_@bo1<(B3) zug|JQ3$r9;F!288$$xlJBG?|2OuhS|~XXV!V z@7HPGoCIWRC|v~+xp6C4lnf?*u1$$Wg0)Ri&Oc);BkZ;*d(A3bqJJHRsV3l%_X<3Y zc@G<2KNCO2)3Jou0$!Tahu>6Cl`}GqOJ^AN?_Hu6Y&FH*QUxhscB9CtFj7_eHv|^x z87*OkD^YUw(vBrY#TZjZ$dzeaTX$R;NI4P7~masTMwM z6%TvFfWf0F+-rRh1zEnWA&OMm^3c9{VFI?8RIPXq{)D#YWID!>Y+$Lg@O z^&TBsk7yvyn7}3Ek54D<9LY_Y^@_SQ?6T=;Z%F!D(r@3%G} zbw(dD0id4nKi>LOR4tr_#+pzFsy@n5X1x=pjK5A6rYOA~QW2Doip<_flp91%1Gl`X zUMjX!Q~qn6wODzrs{zR-<7Vu-e8M0q&B$2ACKOU~(^u#h>G9#3D26+;OjI^jVchk- z=>G*>SO-@QJh#E<&n~=J$#M|MA({+;-w3HlPtT;0z(dy7jkI@0$_<`UaX15p^*}0) z99HvbMAIgwt(tW{YME-4p0+DC>iU-H`Ne!xds>SIj*X+(YcyP1w&{7Xk1_)_x}szL zW>l%-Z{s69Cm<0%J#bY{Hw$nty@DpTur>K%=U|M%Z(|9VqQ3t=jG8rB`8WH7X1M~5 z!>|d#%Bw2J5Q6fx5XZT5XtIFzyGZ2fku-)McZB^hjQHu-FtgrN!dXK+2YjX z34g%%>Q(A0ukKhMM~nf6eTi%LoWGXti|f!_l+E9UKbC2}c@%{6M|B}#EA$MN+G;DG z2qo7>uZcYM72v0`)>cneMTkw|$?dk_ zw%YkGcGi*164E42I-+7AAhP{Zh-)-Eg>>d;y2nFEc>6LoR!MRy3ND8svml&yXM*RM zV3+NJ=lqkgp0MHrcbTA@v^ukIaKHPcg(nPy2-l!)cSiHnQ6k~zo#{B~b{c_@ap?C= zH^GwE8v*$K)pxcJyHbCKV-M>#B!EVlnS>X{uV-E+=673&JS6|u-gW=O`9$j^1c~0G zi<*1|QCA5<^ss`6-q-4NS)C}+OY}|2@3Yb4hMh`|#{L;D{7S*2Zy0{wk2361PWo>>#Xq4=&?U5@$qM6{7LPe$?7~>j# zufq!co*BmU$?O-^H?)T}N(GK0XSwzcrrk+oGBFJ5*XmH0|N!~4-1_k-#e zW4alr%wAwNPRM#_&06aBYnyjxE%em3p{tno$xgbrlQS=gVb}O#yF1iTi(q@+vM!ks zk1NrGvx3pv1A6T{!QiguP;KrL$(?UcF0a!|U`@gIO%hM<)e{;E#8|bO(c$`QGPT3( z(;BvRbJa-g@9m_88E%HM1sd+IzL?RXoZ(?-MI>TK=YECd=L+aE#9s6eA z;b3p)%^pzY>YlH8tg3P#ZK-`=g)0@e@&Z8yb}i^nlOwz_z{Vp%5&$S=LMZbL>C4Ex;IR+DT5%e16DA#{Ifp%w0LU4UtOyXaagqPF9gFa-x1w)OyVWKn!Jyz zkXkIjngKqul1B(WG)l{#NsMQbGl4L0gSwp zNg-n48wZ$B=086fyAQc48A}m1OE9*q2;tGwx6>}kKYet8j3hU7T>o4nU_Y2Pk)$j( zVQH|PojRZO>zbnR*Z@!tS^!SXARIcY*5r;t%zzfL>;-r|F>kh%{&L0RqQxukDR;rJ za%J`gBMM0=DOa!b<-`1A@q zdzDrOy3Y<#xDytqBJmTb+{snl)Nn-~M=n~e7Amo4twm+O9arUy$1qE=VbT|}V%`C^ z#M>W#h6h02HV#)Rl%J|D_Hy}!|1<~!C-JL!syQDGo-jaWlUUuj5eI%^ffN+rU0BHc7m z747Y$rFUogsj8rp>~aMWx&x7WpEboM#jYM|^N=_LctQx^kteW0WtZEWIw%F=hVcxX z)O$-gIboM%P?DGIWM>q$XKmtDz4PZZ3~D#{>Q*%)mE&A{j}(-u!TU~kk3S)IDniV= zhn80BHwNrw5n4WFSsKt!_u>v18k-#_MD>_6lFHILvVi~>MHm_!Ak^|WYjJD!)yx$H z?~hqjhMeCrg2@a@V6Ju>!fAgDA1FKA-Y3&$>fEo+fqw@D%LYGHeu62>2|*-Wwj}IX zpNAZs%_MJow()_Xo_)Cs!+(RZW_CX111h>tsBsVl$frFFl3f73Hyi)FM7(Ix%d2DJ zO^IK`u-2L5`yf`GMI}zU0~o&Ym*4RVW`H4RrU4K9$}eZ=HUL#F2ktMkE*Rz3451u% zeaP7*>3VW^qlF#9$tieO%)4Olr7C)X2fWTX3O?`Mob>~~M)r9X7i&IqwlQpEqhhhN z*upOLe%=88KmIxR(D8z3XLy#KspruXJj1Lkcf)+jp@mo8pf>#6{ zmBotjXxhYtAh%2f1oIn+KnJ_R&zN1^rp|@03vn`>NiCCI?%yQ^**5s_e$txs-jsq` z6Xc;eHp;9>>BSC&mY)7`B%Q{4ScQ=7`#%pykf=y+6&F_-kaqvxWKS(=vpUt8y zTf*AVXCmg=eULX`cIxf{h{XT>PL)?JvOsphvaKHk;=blse1qgT72M&&0&_h_^A{I* zU9S*>ByNL6C8OT6^p=-lBAoMGVp<8A;#hgwxNARVLPVdZa-G&voINX#Gcy7MCN+}% zg2<_i@CQmV`{p^~9&Wi6JO+roV)Gg`&xj0CB|7^4gmn(ZdyE(+ zTwM!QryDm-EgZBaG_7ABXy4vc`{&Ek+1r!P)h$kZo!D;wTMdsHFcxlcI&EH6ea+h) z$<6d1(^aC~Q@cWuP zjK^fZr@M73ni8Q`du%hQ_pV~;w|sQR?rxo!IMeTGF1Mc4dk3@KbRV*p=Q(Tc;3}-F zO3wBm*DKWrhcK7;G=!cA_{}f`O#FCaQU+WVL$+jx%z6yoG7z_+h zpdvRUcgQ|L3?(Jl=>NN_zne5LsRP9LJ%j51?Dpd#e2gi>CGA=ZZRLy|Ti`0F&~cBm6TZu?;;j|5Txq z<>q3BfWKJdigmED4a092DhD)>tj;F7rW6mnEns&4KE`CNR>E`0MU-Q+t*4H!S zaQ&c}(-Kw*%-5*-)GYq>!{=R5Jiu_QUOcv%-v!Z}Jr)TcSO6A(X4LFKDqKtnI=-`Y z(H4K9e6|qfWJPE;*~fE}TOOO`R#al%5w`CQClamnk+E6H%+tYgAohZpY6EY#-;=Do z9e8AW9?K3CPw&`n*hNoVB~c*HnGEO@1|JdFMXn)DLz)O3u`p6XEjQ+0eJto@vt}xnIrg ztO)s-Xy$BGrssDitUwiYFGrDF^Ifc)rkJFRaQz33!B0M4mtT}CO$(~-*!1s)cpEgy z4>AJv-}Tuwg@6`69MBd@#SSZPC%6}zB>3L+UMN$bon3rp=J4rW#)0r&e7S8y@cG3* zH_|j15#9@}d;HT;y*f@?kikO!q+v+N=AW#5-5X_rkw)F=JCp{Hl=;?lY9rH3ZKc4i z)~`X@H%It=asl;4P=*{FLgBeN4lyxC7q^y~3gfAdkGpo`I`O9mwQraK6s@wa`l(~W zV)P1dsNX=LO?nWh*!tL>F1|t*1*7y@b%9d>9K%M{vOf+OPW^4k*#-m$BYK?uvu?GV z+fHDgVBo(+bk#|0L`Yj&T}OmMrHF{_Z_oVEiDjg|K2PZucGGn-LV>45lI;& zf~#Oxy4G!GB>pu-n!wh|j%Hq?TB05nQ{S;Vm!AxhGX)5{Ai5{ZjoYTz=|@g~nlBSf zw&*litFY9dLsEzSz}hHgtf11b(Ec%WWYN!mNH z(E&29bbfWVZ=7?l%Q1J&bY1~va%0$c5NQrBnL*V7JtNYyUwgJ(^M@aKO7z;a>2Y~^ zw^SJLkH!;;=#(w(yJ^iY|16BswASU(@a==~?isVBRrH#C%#E%RSpPH@zKidr=zzfj zEo(2BEx!(mEA0@SZorAuc?J~a*%4|rW|vd5uU>lvE&NBMn<-RtBt9!I?6}{x>Xh$r z<~CK<6k1aiDN|8cvxax{AW6x^3-P*VIoa7?^geUFoDd*;6XT_nEJ^fLtu9c9H7>5F z|7X^3V!}$_Y}ZP&a^(M`BqsF+irkO-<7&JYaqvTA|B=Rs>Wk`TnZphbIUr7-w{tr* zfJj$t4gMhB%reXPfL{j@Y6LH_&77Kyp9ORu@)0^BpsT&ry|FSl!g1Q{SrRQaB6wx- zc;~ynI$ws-_AaEYMM56gz|uIVdK*J){i*3$+JDDPRD~0%$l7xBW$OY(v!{1Lt;!h4 zrM{K3u~UNC*OOGqGpDj#9M=)DyruUf5OjIt#`!oxdp`E%hw-UVBdPbJEI+njbVJRe zhCKTGZ0kEHbBx|HsGeNu8LQ#QsihUr!)@_&^ca&4u&ro!5eylyWE- zP4|fzEaHZD;mrJCuJnz4Wd8=Y-kwsjmo`&hlR#KT1zrBgnPm;#Xj0=1H^4F0ew6LL zvpGS*_{0>r2M(G(;p304aj*3GZFkXl;Ij-jX(I1EzUfD#vVfH0Gg-Fe6~y%$VUd}h=b$-B z7}v1JNOQNQXBt|r@uz2GAw`<2N*a>GgOPq2R-ni~-}E$LMd$HNFt2Cl=U4P|fkcGI zQyjS#@jRzC`X5U0p_67}{uE0GoVt4CtRXt=6pMF&X#t8sO!s-L){a4+q)(5~E9|>q znj{@>Ez-5}7{8AwY{+eC4RtOs8JoK=YOWA?XX+KeXopTan||!svH3wR`=7=e*oBg0HmTtCfNBhDV(T?pp|9nGIUE;ZOGcrD_C6Y=Ec1SD+cB zLX*+vYNI|XqrO=a2yzX$^3$AurJTBgx4qg4UPd~;#&rp;gWWrgw3O>Ne*F19xwdmd zsz(Zh)qC=uXqnZ*pM2(w0A~x={6QOK&r+GA74~{Vjy!PBlBG=HWz+?+wkHT$y~|Mn z_Q=jfeBZ6jCe?uq$W!1gT((qyfCJ;GB~<+|FJ2^fIcG{aem0a-H^GQO#H_>B4PmY} z9An)XjM}W4Z4+(DFWu|5*V5xFQH0KSW^(j2G}BBT(*ZP^yoyu&!Yy@hjX|6EE=tb` z2V}%lJGS-1aDeG;`j(g~=4E*g>JCz#lzD~xkPsb7gFP0p3Y`4%G^=pX9$J86dzP>C zA1V*rfxj3|XCl*;o_ilY8l-e{l=LU#^lb>#^(KI>g%mr`cM!5IL#${B*Ey)*4(a20T1EpJ_I*MzO zuw+~ATw?eVrtFnH8su*pZ#Q2EL^Y8O#-z73?Q@=+c!8lta(FF2$$D&X7EYjJIX>;ZPQwj z_=!cySaivCfujXjpdakd5dBxUY?T~mO6YC)HL_dOA)n<=O8`JtT~+k#OJkQcP?UTqzs8+WvxU-OnVZ(URQ+n+Om&Z z)0C+tUy=9%1G@e)8}}O8^4d$?BrtoRwFfGdS?61}O~0~^!4}a%L))J#9ubo1!2=OP zGs8^sr#HfRn33mJm(N{{a!xHZX>F>d3KxuBW(NHm>VlX7vvV|BaWmWMys+ZEhW=L& zMQI8qud3zawUQ}3|DL}_=V+zXxp=SqW7F%J<{KVV9#>^)b-pheEv$FIFC#vYwUlCXvU$Ae%1%@pLv*a~ zvVBk?U`l4Y`h{kfk)AN-5EryhZ804&g}i1=G`Coj7rb8?{LaGY5awwzVD3FK%5-nH zI8v|<$ZTmfVWm%8kD8Wo8QZF0mBbCZM(uFo?5U)P7Xb>&aUr>LyJHh@7DJhxN%BMl z9zFz3^I~4qH(A#+6pg)%-K?PQZVZCSByop34*+7qd;0LXh}P>6Oiinn>f_~kq^-=f z^s&7>u8ZSGB63ZmDt-K{;%?wWfRP#N=RG{2(iz($J50G@HL4oy1E zLlO+MTu7Jt=BRf}F;qpnF3vJ_diboHK_2f+ixo!l*ZdZzPXC4p*YMJrC_vmeTJ&34 zeA0w`>$Jv&I{(>kXlKv*c>)yi>;c^OYDl>U<;`Bc*2Gti;ar>^XEtx1q!nEhIy=1W zo;LQ$pV+fm#kF>obEY@?Ur=YT+CGH^&e_$2M85{>oi71lG8@TV-Z0!K?60NaAnTTy zY18xtlM)V{w78_6P7b$umEeZpqOAny#vyYulx%#H^f=}t4clUo`K#Ar7m+VSnkoOv zEgkF3VsE88Gc1QY{|!dw6G}L#WRWIhn!9uGwEbyrg=*HpkpG#zW&PhZ0~A3Ov-5TBU3c9AJUmU7|g5-Rlro0Omiv$YBTxtQS2|Yu18v1 z#Ac1RIV5Cy4qey^WRuy`IosdHk{3q!oglVdieM+e$zAD!I(|`;HmUgLUm}8}!TT>! z=bNXnqOk;^Ky@`$4_!+rB__J|vpi5sFfh9R*oK)rv!oa0&t2XrUYR8owST4y8*%(V zJ`y1xWlPt@J$2ASKL4T&wg2(8pYy220uwnO3*eWp}SA97B70uR=TZpLxad zAv*`6=SK6r^P$8S?9GlXeMZZ2?iiMy(}~n!rfxSM$kN78FtS3~$VhQo@yqXj2O39= zmq94XOuUtDemm&VbSw~0gkBBBwd@?WQ54;c%0$yQvHz$zQP-5nOV{Dekhr9FFJ=vM z1|Epu_1JdHZB}a>F482WLfSyLzMIbhP>+Eq_p0dm5=eps))$ZaNrj%5P>*ee_DL=$ zprdyUGj4e=9lx&Upxe@|L>?K-t2oCQ-kBCCmQu{GuFGCQ^LL^DS#hi1A45;5TeWcJ zrVGzGWgwIpFyjUwMBTE1mjYT>gsOjN6Ge)jhH&(;~iUG-0blQ`vYzd%@6* z6O)QZVArMiqTYxMvY3R8w5niw>7ZN4Ub#PeH{WF8cmDFXQXzA973Vw777f71Zb<%j z_4Dfk?O9%alPeqBjC;aZki(ZMVELQ9RTdZyj&<;L-edb{lnhsj(vN{A)c+?0YM`14 zCy03WX~x;u+(bVfL!6g;H^~JFkS@0mf2!ITm0Ac$O{HPgb8{ zNI@h~03iN5zRiMUMkLJ?c1W_Evg2D$yQ629L9SuOlh&r{a?7gbEe@5jhe#n70EP*SAMx= z6$?&dbC4v2>R^)sENPha#f~zSBL6XD>6IrZ55UVZCAXRCsYlI!m|Uv^YXC8D6qP#1 z$00TliI@OuoWkKH## zfMh<@ld#*!?cxwVRfO7LH!(b=MD2 zvDp1HiObfYFp1+POzGwbAgO2lI$z@0S`E*Q-OsSJbj*`8X0-}5kiUmwnBBCe(geY?l2cd_XB`23SU zx7UzYcUL-qx+u6c(?2D4>8^p&Q@^*h(@IC|&wdH)6UdTO{_A44cfYsvZukiH2q*&i#|}(Tf&d@N2MQ@a z?=86s3b`YEjpES8Rg6guQwXe>RA?;h0cb7OWl? z3cnFiH_NEwkWVjiD!T zwj;J95iRjPNtdf^WAB2kmp9+KqAjL`W6L=}-dO>7iiF~7Cqk#LXJBPvcje=v00~M_ zVvJ0s$Z*SZI|l$(Pe1vh1QFwO>i9Yo*_j|bERJ;WfzD>`*j@M*Jer!i9x+GB$`O#a z!wpFDck_}7B8kqz{;HCtWKuaFFUvt@jM#B@l?KYP2gRtyJ5L`~__4ylp270msQIEv zu)y6WlXWL5+?vt^6Q zGJNz~mUyGw^Z!CBdpHal88(Dyus>TzKbqio`Sl51i*HWexjLK~)8=Ej$AE-Coo@=Z zPwqXctqa#{8-!6Wn^dgKICjy4qhxSj2j_8NiKq0&ETpH;U74&(v8xX)zdxMy`LVF|&BY`pvC67st5m+=C3W^Mi=CR5D{9*3Es*aW^B^pjOBc zQU5jDL2|R@;nOJdXo@MG97EsGmg7WmQn;G$gy zZl+)p1C@N+r+cF`pa{+7Uhi1sjBW4weN|=*Bv$sQCvDvrpOuP2fwwhtMZJo1y(?FC znN{J6QOVZp_iu$Q%w20!6@b;pytdr2s8&6;qOQ~DYblbHrrlzkzQuoFM6)T(A1{J( zTwhp~#pzmXKw(6bJmj*^hCFwCC(%_19v9JcHuT;rux zUwiG*A=a^Tp8ZQ!%z_l;Va|>283-Wmck2jW8++-W^x8e5lSv2`+ukOVQZbhr`V`;F z`zO@SYcgx*Ny;@bS1Cc5DCj9N&+=dC!iY{E?ojlsXzFW1=!*#+*zi?fM@Wcpe=t9rt3K z+bZs+Va7`)*aQe9`e?KgeR9z1GPvkp$thtUz)gl(@Aw?i_^@}~c6U1Mx#64E(j>Xq z=c23cv3g)dr01velg1N ztWPf~a9e6-`7lc>A1D1PWvj-1kvHuNEAafYrzYzcrNdLcq{|h!~@2tWQe{tTzk;Iei Qz61W0 Date: Wed, 12 Dec 2018 15:10:11 -0500 Subject: [PATCH 08/34] Updated logo. --- assets/janet-big.png | Bin 58316 -> 63561 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/janet-big.png b/assets/janet-big.png index aa91616e693a23753e614b539c0e1b346bd9fa57..fdd5d5873b33d0a6e309283a687d2d93fb2e48d7 100644 GIT binary patch literal 63561 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 Date: Thu, 13 Dec 2018 20:23:31 +0300 Subject: [PATCH 09/34] Smaller image in README --- README.md | 7 +++---- assets/janet-w200.png | Bin 0 -> 34426 bytes 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 assets/janet-w200.png diff --git a/README.md b/README.md index fb9f3188..c466dac6 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,7 @@ [![Build Status](https://travis-ci.org/bakpakin/janet.svg?branch=master)](https://travis-ci.org/bakpakin/janet) [![Appveyor Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/bakpakin/janet) -

- Janet logo -

Logo by honix

-

+Janet logo Janet is a functional and imperative programming language and bytecode interpreter. It is a modern lisp, but lists are replaced @@ -18,6 +15,8 @@ to run script files. This client program is separate from the core runtime, so janet could be embedded into other programs. Try janet in your browser at [https://janet-lang.org](https://janet-lang.org). +# + Implemented in mostly standard C99, janet runs on Windows, Linux and macOS. The few features that are not standard C (dynamic library loading, compiler specific optimizations), are fairly straight forward. Janet can be easily ported to new platforms. diff --git a/assets/janet-w200.png b/assets/janet-w200.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9b99235d585c903b69c9dc8db9b52b13f49424 GIT binary patch literal 34426 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 Wu_-G{d~(VF0000 Date: Thu, 13 Dec 2018 20:57:55 +0300 Subject: [PATCH 10/34] Bold! --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c466dac6..95b389dc 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Janet logo -Janet is a functional and imperative programming language and bytecode interpreter. It is a +**Janet** is a functional and imperative programming language and bytecode interpreter. It is a modern lisp, but lists are replaced by other data structures with better utility and performance (arrays, tables, structs, tuples). The language also bridging bridging to native code written in C, meta-programming with macros, and bytecode assembly. From 090068c7845007925b4e769021283806da09ab20 Mon Sep 17 00:00:00 2001 From: Fyodor Shchukin Date: Thu, 13 Dec 2018 20:58:57 +0300 Subject: [PATCH 11/34] Drop header --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 95b389dc..739f1d7f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# janet - [![Build Status](https://travis-ci.org/bakpakin/janet.svg?branch=master)](https://travis-ci.org/bakpakin/janet) [![Appveyor Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true)](https://ci.appveyor.com/project/bakpakin/janet) From e8c0dcd14ef2f312684f2559cdca1031fb57d5f2 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Thu, 13 Dec 2018 18:46:53 -0500 Subject: [PATCH 12/34] Make source mapping use byte offset instead of line and col for better debugging support in repl. Add debug module for better debugging support. --- src/core/asm.c | 8 +- src/core/bytecode.c | 4 +- src/core/compile.c | 18 +-- src/core/core.janet | 26 ++-- src/core/corelib.c | 1 + src/core/debug.c | 289 ++++++++++++++++++++++++++++++++++++++ src/core/fiber.c | 114 +-------------- src/core/marsh.c | 8 +- src/core/parse.c | 29 ++-- src/core/run.c | 4 +- src/core/tuple.c | 4 +- src/core/util.c | 36 +++++ src/core/util.h | 1 + src/core/vm.c | 28 ++-- src/include/janet/janet.h | 13 +- src/mainclient/init.janet | 4 +- 16 files changed, 400 insertions(+), 187 deletions(-) create mode 100644 src/core/debug.c diff --git a/src/core/asm.c b/src/core/asm.c index 050aae26..3633360f 100644 --- a/src/core/asm.c +++ b/src/core/asm.c @@ -710,8 +710,8 @@ static JanetAssembleResult janet_asm1(JanetAssembler *parent, Janet source, int if (!janet_checktype(tup[1], JANET_INTEGER)) { janet_asm_error(&a, "expected integer"); } - mapping.line = janet_unwrap_integer(tup[0]); - mapping.column = janet_unwrap_integer(tup[1]); + mapping.start = janet_unwrap_integer(tup[0]); + mapping.end = janet_unwrap_integer(tup[1]); def->sourcemap[i] = mapping; } } @@ -876,8 +876,8 @@ Janet janet_disasm(JanetFuncDef *def) { for (i = 0; i < def->bytecode_length; i++) { Janet *t = janet_tuple_begin(2); JanetSourceMapping mapping = def->sourcemap[i]; - t[0] = janet_wrap_integer(mapping.line); - t[1] = janet_wrap_integer(mapping.column); + t[0] = janet_wrap_integer(mapping.start); + t[1] = janet_wrap_integer(mapping.end); sourcemap->data[i] = janet_wrap_tuple(janet_tuple_end(t)); } sourcemap->count = def->bytecode_length; diff --git a/src/core/bytecode.c b/src/core/bytecode.c index 83106baf..0112e605 100644 --- a/src/core/bytecode.c +++ b/src/core/bytecode.c @@ -125,10 +125,10 @@ int32_t janet_verify(JanetFuncDef *def) { for (i = 0; i < def->bytecode_length; i++) { uint32_t instr = def->bytecode[i]; /* Check for invalid instructions */ - if ((instr & 0xFF) >= JOP_INSTRUCTION_COUNT) { + if ((instr & 0x7F) >= JOP_INSTRUCTION_COUNT) { return 3; } - enum JanetInstructionType type = janet_instructions[instr & 0xFF]; + enum JanetInstructionType type = janet_instructions[instr & 0x7F]; switch (type) { case JINT_0: continue; diff --git a/src/core/compile.c b/src/core/compile.c index e67da663..1458347c 100644 --- a/src/core/compile.c +++ b/src/core/compile.c @@ -462,9 +462,9 @@ static int macroexpand1( if (janet_tuple_length(form) == 0) return 0; /* Source map - only set when we get a tuple */ - if (janet_tuple_sm_line(form) > 0) { - c->current_mapping.line = janet_tuple_sm_line(form); - c->current_mapping.column = janet_tuple_sm_col(form); + if (janet_tuple_sm_start(form) >= 0) { + c->current_mapping.start = janet_tuple_sm_start(form); + c->current_mapping.end = janet_tuple_sm_end(form); } if (!janet_checktype(form[0], JANET_SYMBOL)) return 0; @@ -648,15 +648,15 @@ static void janetc_init(JanetCompiler *c, JanetTable *env, const uint8_t *where) c->recursion_guard = JANET_RECURSION_GUARD; c->env = env; c->source = where; - c->current_mapping.line = 0; - c->current_mapping.column = 0; + c->current_mapping.start = -1; + c->current_mapping.end = -1; /* Init result */ c->result.error = NULL; c->result.status = JANET_COMPILE_OK; c->result.funcdef = NULL; c->result.macrofiber = NULL; - c->result.error_mapping.line = 0; - c->result.error_mapping.column = 0; + c->result.error_mapping.start = -1; + c->result.error_mapping.end = -1; } /* Deinitialize a compiler struct */ @@ -717,8 +717,8 @@ static int cfun(JanetArgs args) { } else { t = janet_table(4); janet_table_put(t, janet_csymbolv(":error"), janet_wrap_string(res.error)); - janet_table_put(t, janet_csymbolv(":line"), janet_wrap_integer(res.error_mapping.line)); - janet_table_put(t, janet_csymbolv(":column"), janet_wrap_integer(res.error_mapping.column)); + janet_table_put(t, janet_csymbolv(":start"), janet_wrap_integer(res.error_mapping.start)); + janet_table_put(t, janet_csymbolv(":end"), janet_wrap_integer(res.error_mapping.end)); if (res.macrofiber) { janet_table_put(t, janet_csymbolv(":fiber"), janet_wrap_fiber(res.macrofiber)); } diff --git a/src/core/core.janet b/src/core/core.janet index b2b3a1a0..72ca03f0 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -1252,11 +1252,11 @@ value, one key will be ignored." (res) (do (:= good false) - (def {:error err :line errl :column errc :fiber errf} res) + (def {:error err :start start :end end :fiber errf} res) (onstatus :compile - (if (< 0 errl) - (string err "\n in a form at line " errl ", column " errc) + (if (<= 0 start) + (string err "\n at (" start ":" end ")") err) errf where)))) @@ -1309,7 +1309,7 @@ value, one key will be ignored." "\n") (when f (loop - [nf :in (reverse (fiber/lineage f)) + [nf :in (reverse (debug/lineage f)) :before (file/write stderr " (fiber)\n") {:function func :tail tail @@ -1317,8 +1317,8 @@ value, one key will be ignored." :c c :name name :source source - :line source-line - :column source-col} :in (fiber/stack nf)] + :source-start start + :source-end end} :in (debug/stack nf)] (file/write stderr " in") (when c (file/write stderr " cfunction")) (if name @@ -1327,14 +1327,15 @@ value, one key will be ignored." (if source (do (file/write stderr " [" source "]") - (if source-line + (if start (file/write stderr - " on line " - (string source-line) - ", column " - (string source-col))))) - (if (and (not source-line) pc) + " at (" + (string start) + ":" + (string end) + ")")))) + (if (and (not start) pc) (file/write stderr " (pc=" (string pc) ")")) (when tail (file/write stderr " (tailcall)")) (file/write stderr "\n")))) @@ -1507,6 +1508,7 @@ value, one key will be ignored." (def newenv (make-env)) (default chunks (fn [buf _] (file/read stdin :line buf))) (default onsignal (fn [sig x f source] + (put newenv '_fiber @{:value f}) (case sig :dead (do (put newenv '_ @{:value x}) diff --git a/src/core/corelib.c b/src/core/corelib.c index 0190e698..d1282c40 100644 --- a/src/core/corelib.c +++ b/src/core/corelib.c @@ -801,6 +801,7 @@ JanetTable *janet_core_env(void) { janet_lib_os(args); janet_lib_parse(args); janet_lib_compile(args); + janet_lib_debug(args); janet_lib_string(args); janet_lib_marsh(args); #ifdef JANET_ASSEMBLER diff --git a/src/core/debug.c b/src/core/debug.c new file mode 100644 index 00000000..7e9c679f --- /dev/null +++ b/src/core/debug.c @@ -0,0 +1,289 @@ +/* +* Copyright (c) 2018 Calvin Rose +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +*/ + +#include +#include "gc.h" +#include "state.h" + +/* Implements functionality to build a debugger from within janet. + * The repl should also be able to serve as pretty featured debugger + * out of the box. */ + +/* Add a break point to a function */ +int janet_debug_break(JanetFuncDef *def, int32_t pc) { + if (pc >= def->bytecode_length || pc < 0) + return 1; + def->bytecode[pc] |= 0x80; + return 0; +} + +/* Remove a break point from a function */ +int janet_debug_unbreak(JanetFuncDef *def, int32_t pc) { + if (pc >= def->bytecode_length || pc < 0) + return 1; + def->bytecode[pc] &= ~((uint32_t)0x80); + return 0; +} + +/* + * Find a location for a breakpoint given a source file an + * location. + */ +int janet_debug_find( + JanetFuncDef **def_out, int32_t *pc_out, + const uint8_t *source, int32_t offset) { + /* Scan the heap for right func def */ + JanetGCMemoryHeader *current = janet_vm_blocks; + /* Keep track of the best source mapping we have seen so far */ + int32_t besti = -1; + int32_t best_range = INT32_MAX; + JanetFuncDef *best_def = NULL; + while (NULL != current) { + if ((current->flags & JANET_MEM_TYPEBITS) == JANET_MEMORY_FUNCDEF) { + JanetFuncDef *def = (JanetFuncDef *)(current + 1); + if (def->sourcemap && + def->source && + !janet_string_compare(source, def->source)) { + /* Correct source file, check mappings. The chosen + * pc index is the first match with the smallest range. */ + int32_t i; + for (i = 0; i < def->bytecode_length; i++) { + int32_t start = def->sourcemap[i].start; + int32_t end = def->sourcemap[i].end; + if (end - start < best_range && + start <= offset && + end >= offset) { + best_range = end - start; + besti = i; + best_def = def; + } + } + } + } + current = current->next; + } + if (best_def) { + *def_out = best_def; + *pc_out = besti; + return 0; + } else { + return 1; + } +} + +/* + * CFuns + */ + +/* Helper to find funcdef and bytecode offset to insert or remove breakpoints. + * Takes a source file name and byte offset. */ +static int helper_find(JanetArgs args, JanetFuncDef **def, int32_t *bytecode_offset) { + const uint8_t *source; + int32_t source_offset; + JANET_FIXARITY(args, 2); + JANET_ARG_STRING(source, args, 0); + JANET_ARG_INTEGER(source_offset, args, 1); + if (janet_debug_find( + def, bytecode_offset, source, source_offset)) { + JANET_THROW(args, "could not find breakpoint"); + } + JANET_RETURN_NIL(args); +} + +/* Helper to find funcdef and bytecode offset to insert or remove breakpoints. + * Takes a function and byte offset*/ +static int helper_find_fun(JanetArgs args, JanetFuncDef **def, int32_t *bytecode_offset) { + JanetFunction *func; + int32_t offset = 0; + JANET_MINARITY(args, 1); + JANET_MAXARITY(args, 2); + JANET_ARG_FUNCTION(func, args, 0); + if (args.n == 2) { + JANET_ARG_INTEGER(offset, args, 1); + } + *def = func->def; + *bytecode_offset = offset; + JANET_RETURN_NIL(args); +} + +static int cfun_break(JanetArgs args) { + JanetFuncDef *def; + int32_t offset; + int status = helper_find(args, &def, &offset); + if (status == 0) janet_debug_break(def, offset); + return status; +} + +static int cfun_unbreak(JanetArgs args) { + JanetFuncDef *def; + int32_t offset; + int status = helper_find(args, &def, &offset); + if (status == 0) janet_debug_unbreak(def, offset); + return status; +} + +static int cfun_fbreak(JanetArgs args) { + JanetFuncDef *def; + int32_t offset; + int status = helper_find_fun(args, &def, &offset); + if (status == 0) { + if (janet_debug_break(def, offset)) { + JANET_THROW(args, "could not find breakpoint"); + } + } + return status; +} + +static int cfun_unfbreak(JanetArgs args) { + JanetFuncDef *def; + int32_t offset; + int status = helper_find_fun(args, &def, &offset); + if (status == 0) { + if (janet_debug_unbreak(def, offset)) { + JANET_THROW(args, "could not find breakpoint"); + } + } + return status; +} + +static int cfun_lineage(JanetArgs args) { + JanetFiber *fiber; + JanetArray *array; + JANET_FIXARITY(args, 1); + JANET_ARG_FIBER(fiber, args, 0); + array = janet_array(0); + while (fiber) { + janet_array_push(array, janet_wrap_fiber(fiber)); + fiber = fiber->child; + } + JANET_RETURN_ARRAY(args, array); +} + +/* Extract info from one stack frame */ +static Janet doframe(JanetStackFrame *frame) { + int32_t off; + JanetTable *t = janet_table(3); + JanetFuncDef *def = NULL; + if (frame->func) { + janet_table_put(t, janet_csymbolv(":function"), janet_wrap_function(frame->func)); + def = frame->func->def; + if (def->name) { + janet_table_put(t, janet_csymbolv(":name"), janet_wrap_string(def->name)); + } + } else { + JanetCFunction cfun = (JanetCFunction)(frame->pc); + if (cfun) { + Janet name = janet_table_get(janet_vm_registry, janet_wrap_cfunction(cfun)); + if (!janet_checktype(name, JANET_NIL)) { + janet_table_put(t, janet_csymbolv(":name"), name); + } + } + janet_table_put(t, janet_csymbolv(":c"), janet_wrap_true()); + } + if (frame->flags & JANET_STACKFRAME_TAILCALL) { + janet_table_put(t, janet_csymbolv(":tail"), janet_wrap_true()); + } + if (frame->func && frame->pc) { + off = (int32_t) (frame->pc - def->bytecode); + janet_table_put(t, janet_csymbolv(":pc"), janet_wrap_integer(off)); + if (def->sourcemap) { + JanetSourceMapping mapping = def->sourcemap[off]; + janet_table_put(t, janet_csymbolv(":source-start"), janet_wrap_integer(mapping.start)); + janet_table_put(t, janet_csymbolv(":source-end"), janet_wrap_integer(mapping.end)); + } + if (def->source) { + janet_table_put(t, janet_csymbolv(":source"), janet_wrap_string(def->source)); + } + } + return janet_wrap_table(t); +} + +static int cfun_stack(JanetArgs args) { + JanetFiber *fiber; + JanetArray *array; + JANET_FIXARITY(args, 1); + JANET_ARG_FIBER(fiber, args, 0); + array = janet_array(0); + { + int32_t i = fiber->frame; + JanetStackFrame *frame; + while (i > 0) { + frame = (JanetStackFrame *)(fiber->data + i - JANET_FRAME_SIZE); + janet_array_push(array, doframe(frame)); + i = frame->prevframe; + } + } + JANET_RETURN_ARRAY(args, array); +} + +static const JanetReg cfuns[] = { + {"debug/break", cfun_break, + "(debug/break source byte-offset)\n\n" + "Sets a breakpoint with source a key at a given byte offset. An offset " + "of 0 is the first byte in a file. Will throw an error if the breakpoint location " + "cannot be found. For example\n\n" + "\t(debug/break \"core.janet\" 1000)\n\n" + "wil set a breakpoint at the 1000th byte of the file core.janet."}, + {"debug/unbreak", cfun_unbreak, + "(debug/unbreak source byte-offset)\n\n" + "Remove a breakpoint with a source key at a given byte offset. An offset " + "of 0 is the first byte in a file. Will throw an error if the breakpoint " + "cannot be found."}, + {"debug/fbreak", cfun_fbreak, + "(debug/fbreak fun [,pc=0])\n\n" + "Set a breakpoint in a given function. pc is an optional offset, which " + "is in bytecode instructions. fun is a function value. Will throw an error " + "if the offset is too large or negative."}, + {"debug/funbreak", cfun_unfbreak, + "(debug/fbreak fun [,pc=0])\n\n" + "Unset a breakpoint set with debug/fbreak."}, + {"debug/stack", cfun_stack, + "(debug/stack fib)\n\n" + "Gets information about the stack as an array of tables. Each table " + "in the array contains information about a stack frame. The top most, current " + "stack frame is the first table in the array, and the bottom most stack frame " + "is the last value. Each stack frame contains some of the following attributes:\n\n" + "\t:c - true if the stack frame is a c function invocation\n" + "\t:column - the current source column of the stack frame\n" + "\t:function - the function that the stack frame represents\n" + "\t:line - the current source line of the stack frame\n" + "\t:name - the human friendly name of the function\n" + "\t:pc - integer indicating the location of the program counter\n" + "\t:source - string with filename or other identifier for the source code\n" + "\t:tail - boolean indicating a tail call" + }, + {"debug/lineage", cfun_lineage, + "(debug/lineage fib)\n\n" + "Returns an array of all child fibers from a root fiber. This function " + "is useful when a fiber signals or errors to an ancestor fiber. Using this function, " + "the fiber handling the error can see which fiber raised the signal. This function should " + "be used mostly for debugging purposes." + }, + {NULL, NULL, NULL} +}; + +/* Module entry point */ +int janet_lib_debug(JanetArgs args) { + JanetTable *env = janet_env(args); + janet_cfuns(env, NULL, cfuns); + return 0; +} diff --git a/src/core/fiber.c b/src/core/fiber.c index 7f806c0c..31f9b6e3 100644 --- a/src/core/fiber.c +++ b/src/core/fiber.c @@ -349,88 +349,11 @@ static int cfun_new(JanetArgs args) { static int cfun_status(JanetArgs args) { JanetFiber *fiber; - const char *status = ""; JANET_FIXARITY(args, 1); JANET_ARG_FIBER(fiber, args, 0); uint32_t s = (fiber->flags & JANET_FIBER_STATUS_MASK) >> JANET_FIBER_STATUS_OFFSET; - switch (s) { - case JANET_STATUS_DEAD: status = ":dead"; break; - case JANET_STATUS_ERROR: status = ":error"; break; - case JANET_STATUS_DEBUG: status = ":debug"; break; - case JANET_STATUS_PENDING: status = ":pending"; break; - case JANET_STATUS_USER0: status = ":user0"; break; - case JANET_STATUS_USER1: status = ":user1"; break; - case JANET_STATUS_USER2: status = ":user2"; break; - case JANET_STATUS_USER3: status = ":user3"; break; - case JANET_STATUS_USER4: status = ":user4"; break; - case JANET_STATUS_USER5: status = ":user5"; break; - case JANET_STATUS_USER6: status = ":user6"; break; - case JANET_STATUS_USER7: status = ":user7"; break; - case JANET_STATUS_USER8: status = ":user8"; break; - case JANET_STATUS_USER9: status = ":user9"; break; - case JANET_STATUS_NEW: status = ":new"; break; - default: - case JANET_STATUS_ALIVE: status = ":alive"; break; - } - JANET_RETURN_CSYMBOL(args, status); -} - -/* Extract info from one stack frame */ -static Janet doframe(JanetStackFrame *frame) { - int32_t off; - JanetTable *t = janet_table(3); - JanetFuncDef *def = NULL; - if (frame->func) { - janet_table_put(t, janet_csymbolv(":function"), janet_wrap_function(frame->func)); - def = frame->func->def; - if (def->name) { - janet_table_put(t, janet_csymbolv(":name"), janet_wrap_string(def->name)); - } - } else { - JanetCFunction cfun = (JanetCFunction)(frame->pc); - if (cfun) { - Janet name = janet_table_get(janet_vm_registry, janet_wrap_cfunction(cfun)); - if (!janet_checktype(name, JANET_NIL)) { - janet_table_put(t, janet_csymbolv(":name"), name); - } - } - janet_table_put(t, janet_csymbolv(":c"), janet_wrap_true()); - } - if (frame->flags & JANET_STACKFRAME_TAILCALL) { - janet_table_put(t, janet_csymbolv(":tail"), janet_wrap_true()); - } - if (frame->func && frame->pc) { - off = (int32_t) (frame->pc - def->bytecode); - janet_table_put(t, janet_csymbolv(":pc"), janet_wrap_integer(off)); - if (def->sourcemap) { - JanetSourceMapping mapping = def->sourcemap[off]; - janet_table_put(t, janet_csymbolv(":line"), janet_wrap_integer(mapping.line)); - janet_table_put(t, janet_csymbolv(":column"), janet_wrap_integer(mapping.column)); - } - if (def->source) { - janet_table_put(t, janet_csymbolv(":source"), janet_wrap_string(def->source)); - } - } - return janet_wrap_table(t); -} - -static int cfun_stack(JanetArgs args) { - JanetFiber *fiber; - JanetArray *array; - JANET_FIXARITY(args, 1); - JANET_ARG_FIBER(fiber, args, 0); - array = janet_array(0); - { - int32_t i = fiber->frame; - JanetStackFrame *frame; - while (i > 0) { - frame = (JanetStackFrame *)(fiber->data + i - JANET_FRAME_SIZE); - janet_array_push(array, doframe(frame)); - i = frame->prevframe; - } - } - JANET_RETURN_ARRAY(args, array); + JANET_RETURN_CSYMBOL(args, janet_status_names[s]); } static int cfun_current(JanetArgs args) { @@ -438,19 +361,6 @@ static int cfun_current(JanetArgs args) { JANET_RETURN_FIBER(args, janet_vm_fiber); } -static int cfun_lineage(JanetArgs args) { - JanetFiber *fiber; - JanetArray *array; - JANET_FIXARITY(args, 1); - JANET_ARG_FIBER(fiber, args, 0); - array = janet_array(0); - while (fiber) { - janet_array_push(array, janet_wrap_fiber(fiber)); - fiber = fiber->child; - } - JANET_RETURN_ARRAY(args, array); -} - static int cfun_maxstack(JanetArgs args) { JanetFiber *fiber; JANET_FIXARITY(args, 1); @@ -500,32 +410,10 @@ static const JanetReg cfuns[] = { "\t:alive - the fiber is currently running and cannot be resumed\n" "\t:new - the fiber has just been created and not yet run" }, - {"fiber/stack", cfun_stack, - "(fiber/stack fib)\n\n" - "Gets information about the stack as an array of tables. Each table " - "in the array contains information about a stack frame. The top most, current " - "stack frame is the first table in the array, and the bottom most stack frame " - "is the last value. Each stack frame contains some of the following attributes:\n\n" - "\t:c - true if the stack frame is a c function invokation\n" - "\t:column - the current source column of the stack frame\n" - "\t:function - the function that the stack frame represents\n" - "\t:line - the current source line of the stack frame\n" - "\t:name - the human friendly name of the function\n" - "\t:pc - integer indicating the location of the program counter\n" - "\t:source - string with filename or other identifier for the source code\n" - "\t:tail - boolean indicating a tail call" - }, {"fiber/current", cfun_current, "(fiber/current)\n\n" "Returns the currently running fiber." }, - {"fiber/lineage", cfun_lineage, - "(fiber/lineage fib)\n\n" - "Returns an array of all child fibers from a root fiber. This function " - "is useful when a fiber signals or errors to an ancestor fiber. Using this function, " - "the fiber handling the error can see which fiber raised the signal. This function should " - "be used mostly for debugging purposes." - }, {"fiber/maxstack", cfun_maxstack, "(fiber/maxstack fib)\n\n" "Gets the maximum stack size in janet values allowed for a fiber. While memory for " diff --git a/src/core/marsh.c b/src/core/marsh.c index 4b794e92..53c9103a 100644 --- a/src/core/marsh.c +++ b/src/core/marsh.c @@ -234,8 +234,8 @@ static void marshal_one_def(MarshalState *st, JanetFuncDef *def, int flags) { if (def->flags & JANET_FUNCDEF_FLAG_HASSOURCEMAP) { for (int32_t i = 0; i < def->bytecode_length; i++) { JanetSourceMapping map = def->sourcemap[i]; - pushint(st, map.line); - pushint(st, map.column); + pushint(st, map.start); + pushint(st, map.end); } } } @@ -740,8 +740,8 @@ static const uint8_t *unmarshal_one_def( JANET_OUT_OF_MEMORY; } for (int32_t i = 0; i < bytecode_length; i++) { - def->sourcemap[i].line = readint(st, &data); - def->sourcemap[i].column = readint(st, &data); + def->sourcemap[i].start = readint(st, &data); + def->sourcemap[i].end = readint(st, &data); } } else { def->sourcemap = NULL; diff --git a/src/core/parse.c b/src/core/parse.c index a4845c06..a1cf7d1f 100644 --- a/src/core/parse.c +++ b/src/core/parse.c @@ -102,8 +102,7 @@ struct JanetParseState { int32_t counter; int32_t argn; int flags; - size_t start_line; - size_t start_col; + size_t start; Consumer consumer; }; @@ -147,8 +146,7 @@ static void pushstate(JanetParser *p, Consumer consumer, int flags) { s.argn = 0; s.flags = flags; s.consumer = consumer; - s.start_line = p->line; - s.start_col = p->col; + s.start = p->offset; _pushstate(p, s); } @@ -159,8 +157,8 @@ static void popstate(JanetParser *p, Janet val) { if (newtop->flags & PFLAG_CONTAINER) { /* Source mapping info */ if (janet_checktype(val, JANET_TUPLE)) { - janet_tuple_sm_line(janet_unwrap_tuple(val)) = (int32_t) top.start_line; - janet_tuple_sm_col(janet_unwrap_tuple(val)) = (int32_t) top.start_col; + janet_tuple_sm_start(janet_unwrap_tuple(val)) = (int32_t) top.start; + janet_tuple_sm_end(janet_unwrap_tuple(val)) = (int32_t) p->offset; } newtop->argn++; push_arg(p, val); @@ -176,8 +174,8 @@ static void popstate(JanetParser *p, Janet val) { t[0] = janet_csymbolv(which); t[1] = val; /* Quote source mapping info */ - janet_tuple_sm_line(t) = (int32_t) newtop->start_line; - janet_tuple_sm_col(t) = (int32_t) newtop->start_col; + janet_tuple_sm_start(t) = (int32_t) newtop->start; + janet_tuple_sm_end(t) = (int32_t) p->offset; val = janet_wrap_tuple(janet_tuple_end(t)); } else { return; @@ -522,16 +520,11 @@ static int root(JanetParser *p, JanetParseState *state, uint8_t c) { int janet_parser_consume(JanetParser *parser, uint8_t c) { int consumed = 0; if (parser->error) return 0; - if (c == '\n') { - parser->line++; - parser->col = 0; - } else if (c != '\r') { - parser->col++; - } while (!consumed && !parser->error) { JanetParseState *state = parser->states + parser->statecount - 1; consumed = state->consumer(parser, state, c); } + parser->offset++; parser->lookback = c; return 1; } @@ -584,9 +577,8 @@ void janet_parser_init(JanetParser *parser) { parser->statecount = 0; parser->statecap = 0; parser->error = NULL; - parser->line = 1; - parser->col = 0; parser->lookback = -1; + parser->offset = 0; pushstate(parser, root, PFLAG_CONTAINER); } @@ -742,10 +734,7 @@ static int cfun_where(JanetArgs args) { JANET_FIXARITY(args, 1); JANET_CHECKABSTRACT(args, 0, &janet_parse_parsertype); p = (JanetParser *) janet_unwrap_abstract(args.v[0]); - Janet *tup = janet_tuple_begin(2); - tup[0] = janet_wrap_integer((int32_t)p->line); - tup[1] = janet_wrap_integer((int32_t)p->col); - JANET_RETURN_TUPLE(args, janet_tuple_end(tup)); + JANET_RETURN_INTEGER(args, p->offset); } static int cfun_state(JanetArgs args) { diff --git a/src/core/run.c b/src/core/run.c index 1d5be862..6a44ab65 100644 --- a/src/core/run.c +++ b/src/core/run.c @@ -67,7 +67,7 @@ void janet_stacktrace(JanetFiber *fiber, const char *errtype, Janet err) { int32_t off = (int32_t) (frame->pc - def->bytecode); if (def->sourcemap) { JanetSourceMapping mapping = def->sourcemap[off]; - fprintf(stderr, " on line %d, column %d", mapping.line, mapping.column); + fprintf(stderr, " at (%d:%d)", mapping.start, mapping.end); } else { fprintf(stderr, " pc=%d", off); } @@ -75,6 +75,8 @@ void janet_stacktrace(JanetFiber *fiber, const char *errtype, Janet err) { fprintf(stderr, "\n"); } } + + janet_v_free(fibers); } /* Run a string */ diff --git a/src/core/tuple.c b/src/core/tuple.c index c8f3dd65..b64a9b52 100644 --- a/src/core/tuple.c +++ b/src/core/tuple.c @@ -32,8 +32,8 @@ Janet *janet_tuple_begin(int32_t length) { char *data = janet_gcalloc(JANET_MEMORY_TUPLE, 4 * sizeof(int32_t) + length * sizeof(Janet)); Janet *tuple = (Janet *)(data + (4 * sizeof(int32_t))); janet_tuple_length(tuple) = length; - janet_tuple_sm_line(tuple) = 0; - janet_tuple_sm_col(tuple) = 0; + janet_tuple_sm_start(tuple) = -1; + janet_tuple_sm_end(tuple) = -1; return tuple; } diff --git a/src/core/util.c b/src/core/util.c index 27450911..200e381f 100644 --- a/src/core/util.c +++ b/src/core/util.c @@ -53,6 +53,42 @@ const char *const janet_type_names[16] = { ":abstract" }; +const char *const janet_signal_names[14] = { + ":ok", + ":error", + ":debug", + ":yield", + ":user0", + ":user1", + ":user2", + ":user3", + ":user4", + ":user5", + ":user6", + ":user7", + ":user8", + ":user9" +}; + +const char *const janet_status_names[16] = { + ":dead", + ":error", + ":debug", + ":pending", + ":user0", + ":user1", + ":user2", + ":user3", + ":user4", + ":user5", + ":user6", + ":user7", + ":user8", + ":user9", + ":new", + ":alive" +}; + /* Calculate hash for string */ int32_t janet_string_calchash(const uint8_t *str, int32_t len) { diff --git a/src/core/util.h b/src/core/util.h index 4b1cecfb..1bc7cc4d 100644 --- a/src/core/util.h +++ b/src/core/util.h @@ -57,5 +57,6 @@ int janet_lib_parse(JanetArgs args); int janet_lib_asm(JanetArgs args); #endif int janet_lib_compile(JanetArgs args); +int janet_lib_debug(JanetArgs args); #endif diff --git a/src/core/vm.c b/src/core/vm.c index 09a1b6f3..1e1d2453 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -54,6 +54,8 @@ JanetSignal janet_continue(JanetFiber *fiber, Janet in, Janet *out) { /* Expected types on type error */ uint16_t expected_types; + uint8_t first_opcode; + /* Signal to return when done */ JanetSignal signal = JANET_SIGNAL_OK; @@ -92,16 +94,24 @@ JanetSignal janet_continue(JanetFiber *fiber, Janet in, Janet *out) { * instruction. */ retreg = in; goto vm_resume_child; - } else if (startstatus != JANET_STATUS_NEW) { + } else if (startstatus != JANET_STATUS_NEW && + ((*pc & 0xFF) == JOP_SIGNAL)) { /* Only should be hit if child is waiting on a SIGNAL instruction */ /* If waiting for response to signal, use input and increment pc */ stack[oparg(1, 0xFF)] = in; pc++; } + /* The first opcode to execute. If the first opcode has + * the breakpoint bit set and we were in the debug state, skip + * that first breakpoint. */ + first_opcode = (startstatus == JANET_STATUS_DEBUG) + ? (*pc & 0x7F) + : (*pc & 0xFF); + /* Use computed gotos for GCC and clang, otherwise use switch */ -#ifdef __GNUC__ -#define VM_START() {vm_next(); +#ifdef ____GNUC__ +#define VM_START() { goto *op_lookup[first_opcode]; #define VM_END() } #define VM_OP(op) label_##op : #define VM_DEFAULT() label_unknown_op: @@ -193,11 +203,11 @@ static void *op_lookup[255] = { &&label_unknown_op }; #else -#define VM_START() for(;;){switch(*pc & 0xFF){ +#define VM_START() uint8_t opcode = first_opcode; for (;;) {switch(opcode) { #define VM_END() }} #define VM_OP(op) case op : #define VM_DEFAULT() default: -#define vm_next() continue +#define vm_next() opcode = *pc & 0xFF; continue #endif #define vm_checkgc_next() janet_maybe_collect(); vm_next() @@ -279,6 +289,7 @@ static void *op_lookup[255] = { VM_START(); VM_DEFAULT(); + signal = JANET_SIGNAL_DEBUG; retreg = janet_wrap_nil(); goto vm_exit; @@ -535,7 +546,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_GREATER_THAN_INTEGER) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_integer(stack[oparg(2, 0xFF)]) > @@ -543,7 +553,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_GREATER_THAN_IMMEDIATE) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_integer(stack[oparg(2, 0xFF)]) > ((*(int32_t *)pc) >> 24) @@ -551,7 +560,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_GREATER_THAN_REAL) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_real(stack[oparg(2, 0xFF)]) > @@ -559,7 +567,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_GREATER_THAN_EQUAL_REAL) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_real(stack[oparg(2, 0xFF)]) >= @@ -575,7 +582,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_EQUALS_INTEGER) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_integer(stack[oparg(2, 0xFF)]) == @@ -584,7 +590,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_EQUALS_REAL) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_real(stack[oparg(2, 0xFF)]) == @@ -593,7 +598,6 @@ static void *op_lookup[255] = { pc++; vm_next(); - /* Candidate */ VM_OP(JOP_EQUALS_IMMEDIATE) stack[oparg(1, 0xFF)] = janet_wrap_boolean( janet_unwrap_integer(stack[oparg(2, 0xFF)]) == ((*(int32_t *)pc) >> 24) diff --git a/src/include/janet/janet.h b/src/include/janet/janet.h index ec5bcf1d..2543441b 100644 --- a/src/include/janet/janet.h +++ b/src/include/janet/janet.h @@ -204,6 +204,8 @@ extern "C" { /* Names of all of the types */ extern const char *const janet_type_names[16]; +extern const char *const janet_signal_names[14]; +extern const char *const janet_status_names[16]; /* Fiber signals */ typedef enum { @@ -667,8 +669,8 @@ struct JanetKV { /* Source mapping structure for a bytecode instruction */ struct JanetSourceMapping { - int32_t line; - int32_t column; + int32_t start; + int32_t end; }; /* A function definition. Contains information needed to instantiate closures. */ @@ -731,8 +733,7 @@ struct JanetParser { size_t statecap; size_t bufcount; size_t bufcap; - size_t line; - size_t col; + size_t offset; int lookback; }; @@ -967,8 +968,8 @@ JANET_API int janet_buffer_push_u64(JanetBuffer *buffer, uint64_t x); #define janet_tuple_raw(t) ((int32_t *)(t) - 4) #define janet_tuple_length(t) (janet_tuple_raw(t)[0]) #define janet_tuple_hash(t) ((janet_tuple_raw(t)[1])) -#define janet_tuple_sm_line(t) ((janet_tuple_raw(t)[2])) -#define janet_tuple_sm_col(t) ((janet_tuple_raw(t)[3])) +#define janet_tuple_sm_start(t) ((janet_tuple_raw(t)[2])) +#define janet_tuple_sm_end(t) ((janet_tuple_raw(t)[3])) JANET_API Janet *janet_tuple_begin(int32_t length); JANET_API const Janet *janet_tuple_end(Janet *tuple); JANET_API const Janet *janet_tuple_n(const Janet *values, int32_t n); diff --git a/src/mainclient/init.janet b/src/mainclient/init.janet index d82d10fd..5ac289eb 100644 --- a/src/mainclient/init.janet +++ b/src/mainclient/init.janet @@ -55,6 +55,6 @@ (do (print (string "Janet " janet/version "-" janet/build " Copyright (C) 2017-2018 Calvin Rose")) (repl (fn [buf p] - (def [line] (parser/where p)) - (def prompt (string "janet:" line ":" (parser/state p) "> ")) + (def offset (parser/where p)) + (def prompt (string "janet:" offset ":" (parser/state p) "> ")) (getline prompt buf))))))) From 56e5c19aa94fbd7da8a52eb87c93c7745e68747a Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Thu, 13 Dec 2018 19:23:07 -0500 Subject: [PATCH 13/34] Add debug/arg-stack, and add slots debug/stack. These features should help implementing a debugger. --- src/core/debug.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/core/debug.c b/src/core/debug.c index 7e9c679f..f4b7edb7 100644 --- a/src/core/debug.c +++ b/src/core/debug.c @@ -203,6 +203,8 @@ static Janet doframe(JanetStackFrame *frame) { janet_table_put(t, janet_csymbolv(":tail"), janet_wrap_true()); } if (frame->func && frame->pc) { + Janet *stack = (Janet *)frame + JANET_FRAME_SIZE; + JanetArray *slots; off = (int32_t) (frame->pc - def->bytecode); janet_table_put(t, janet_csymbolv(":pc"), janet_wrap_integer(off)); if (def->sourcemap) { @@ -213,6 +215,11 @@ static Janet doframe(JanetStackFrame *frame) { if (def->source) { janet_table_put(t, janet_csymbolv(":source"), janet_wrap_string(def->source)); } + /* Add stack arguments */ + slots = janet_array(def->slotcount); + memcpy(slots->data, stack, sizeof(Janet) * def->slotcount); + slots->count = def->slotcount; + janet_table_put(t, janet_csymbolv(":slots"), janet_wrap_array(slots)); } return janet_wrap_table(t); } @@ -235,6 +242,17 @@ static int cfun_stack(JanetArgs args) { JANET_RETURN_ARRAY(args, array); } +static int cfun_argstack(JanetArgs args) { + JanetFiber *fiber; + JanetArray *array; + JANET_FIXARITY(args, 1); + JANET_ARG_FIBER(fiber, args, 0); + array = janet_array(fiber->stacktop - fiber->stackstart); + memcpy(array->data, fiber->data + fiber->stackstart, array->capacity * sizeof(Janet)); + array->count = array->capacity; + JANET_RETURN_ARRAY(args, array); +} + static const JanetReg cfuns[] = { {"debug/break", cfun_break, "(debug/break source byte-offset)\n\n" @@ -256,6 +274,11 @@ static const JanetReg cfuns[] = { {"debug/funbreak", cfun_unfbreak, "(debug/fbreak fun [,pc=0])\n\n" "Unset a breakpoint set with debug/fbreak."}, + {"debug/arg-stack", cfun_argstack, + "(debug/arg-stack fiber)\n\n" + "Gets all values currently on the fiber's argument stack. Normally, " + "this should be empty unless the fiber signals while pushing arguments " + "to make a function call. Returns a new array."}, {"debug/stack", cfun_stack, "(debug/stack fib)\n\n" "Gets information about the stack as an array of tables. Each table " @@ -269,6 +292,7 @@ static const JanetReg cfuns[] = { "\t:name - the human friendly name of the function\n" "\t:pc - integer indicating the location of the program counter\n" "\t:source - string with filename or other identifier for the source code\n" + "\t:slots - array of all values in each slot\n" "\t:tail - boolean indicating a tail call" }, {"debug/lineage", cfun_lineage, From df13a8b9671127880d93b78ad85771d9d8284f57 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Thu, 13 Dec 2018 21:16:04 -0500 Subject: [PATCH 14/34] Fix typo. --- src/core/debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/debug.c b/src/core/debug.c index f4b7edb7..5e387024 100644 --- a/src/core/debug.c +++ b/src/core/debug.c @@ -271,8 +271,8 @@ static const JanetReg cfuns[] = { "Set a breakpoint in a given function. pc is an optional offset, which " "is in bytecode instructions. fun is a function value. Will throw an error " "if the offset is too large or negative."}, - {"debug/funbreak", cfun_unfbreak, - "(debug/fbreak fun [,pc=0])\n\n" + {"debug/unfbreak", cfun_unfbreak, + "(debug/unfbreak fun [,pc=0])\n\n" "Unset a breakpoint set with debug/fbreak."}, {"debug/arg-stack", cfun_argstack, "(debug/arg-stack fiber)\n\n" From b2146a4c1da3caad7e6e8ffa2e7cc90f017a60d0 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Thu, 13 Dec 2018 21:36:19 -0500 Subject: [PATCH 15/34] Update web client. --- src/webclient/webinit.janet | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webclient/webinit.janet b/src/webclient/webinit.janet index 09ecb2b4..5ef92263 100644 --- a/src/webclient/webinit.janet +++ b/src/webclient/webinit.janet @@ -3,8 +3,8 @@ (fiber/new (fn webrepl [] (repl (fn get-line [buf p] - (def [line] (parser/where p)) - (def prompt (string "janet:" line ":" (parser/state p) "> ")) + (def offset (parser/where p)) + (def prompt (string "janet:" offset ":" (parser/state p) "> ")) (repl-yield prompt buf) (yield) buf)))) From fb6dd2c83f0a216882a61eb93cd8ffb8d8e89b60 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 13:52:07 -0500 Subject: [PATCH 16/34] Add debug functions to janet.h Update version to 0.2.0 for next release. Fix whitespace in build_win.bat --- build_win.bat | 8 ++++---- src/include/janet/janet.h | 9 ++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/build_win.bat b/build_win.bat index b67a393e..97fca9d6 100644 --- a/build_win.bat +++ b/build_win.bat @@ -43,13 +43,13 @@ mkdir build\mainclient @rem Build the sources for %%f in (src\core\*.c) do ( - @%JANET_COMPILE% /Fobuild\core\%%~nf.obj %%f + @%JANET_COMPILE% /Fobuild\core\%%~nf.obj %%f @if errorlevel 1 goto :BUILDFAIL ) @rem Build the main client for %%f in (src\mainclient\*.c) do ( - @%JANET_COMPILE% /Fobuild\mainclient\%%~nf.obj %%f + @%JANET_COMPILE% /Fobuild\mainclient\%%~nf.obj %%f @if errorlevel 1 goto :BUILDFAIL ) @@ -85,8 +85,8 @@ exit /b 0 @rem Run tests :TEST for %%f in (test/suite*.janet) do ( - janet.exe test\%%f - @if errorlevel 1 goto :TESTFAIL + janet.exe test\%%f + @if errorlevel 1 goto :TESTFAIL ) exit /b 0 diff --git a/src/include/janet/janet.h b/src/include/janet/janet.h index 2543441b..f3a6cddd 100644 --- a/src/include/janet/janet.h +++ b/src/include/janet/janet.h @@ -29,7 +29,7 @@ extern "C" { /***** START SECTION CONFIG *****/ -#define JANET_VERSION "0.1.0" +#define JANET_VERSION "0.2.0" #ifndef JANET_BUILD #define JANET_BUILD "local" @@ -938,6 +938,13 @@ JANET_API Janet janet_scan_number(const uint8_t *src, int32_t len); JANET_API int32_t janet_scan_integer(const uint8_t *str, int32_t len, int *err); JANET_API double janet_scan_real(const uint8_t *str, int32_t len, int *err); +/* Debugging */ +JANET_API int janet_debug_break(JanetFuncDef *def, int32_t pc); +JANET_API int janet_debug_unbreak(JanetFuncDef *def, int32_t pc); +JANET_API int janet_debug_find( + JanetFuncDef **def_out, int32_t *pc_out, + const uint8_t *source, int32_t offset); + /* Array functions */ JANET_API JanetArray *janet_array(int32_t capacity); JANET_API JanetArray *janet_array_n(const Janet *elements, int32_t n); From 79184ab05da8acaa6f6eb11660466102e326cb18 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 15:32:08 -0500 Subject: [PATCH 17/34] Move documentation from wiki into repo. --- README.md | 6 +- doc/Home.md | 6 + doc/Introduction.md | 743 +++++++++++++++++++++ doc/SQLite.md | 31 + doc/The-Janet-Abstract-Machine-Bytecode.md | 238 +++++++ 5 files changed, 1021 insertions(+), 3 deletions(-) create mode 100644 doc/Home.md create mode 100644 doc/Introduction.md create mode 100644 doc/SQLite.md create mode 100644 doc/The-Janet-Abstract-Machine-Bytecode.md diff --git a/README.md b/README.md index 739f1d7f..c20c6166 100644 --- a/README.md +++ b/README.md @@ -50,9 +50,9 @@ Janet makes a good system scripting language, or a language to embed in other pr ## Documentation -API documentation and design documents can be found in the -[wiki](https://github.com/bakpakin/janet/wiki). There is an introduction -section in the wiki that contains a good overview of the language. +Documentation can be found in the doc directory of +the repository. There is an introduction +section contains a good overview of the language. For individual bindings, use the `(doc symbol-name)` macro to get API documentation for the core library. For example, diff --git a/doc/Home.md b/doc/Home.md new file mode 100644 index 00000000..73d44a68 --- /dev/null +++ b/doc/Home.md @@ -0,0 +1,6 @@ +Janet is a dynamic, lightweight programming language with strong functional +capabilities as well as support for imperative programming. It to be used +for short lived scripts as well as for building real programs. It can also +be extended with native code (C modules) for better performance and interfacing with +existing software. Janet takes ideas from Lua, Scheme, Racket, Clojure, Smalltalk, Erlang, Arc, and +a whole bunch of other dynamic languages. diff --git a/doc/Introduction.md b/doc/Introduction.md new file mode 100644 index 00000000..6daf6684 --- /dev/null +++ b/doc/Introduction.md @@ -0,0 +1,743 @@ +# Hello, world! + +Following tradition, a simple Janet program will print "Hello, world!". + +``` +(print "Hello, world!") +``` + +Put the following code in a file named `hello.janet`, and run `./janet hello.janet`. +The words "Hello, world!" should be printed to the console, and then the program +should immediately exit. You now have a working janet program! + +Alternatively, run the program `./janet` without any arguments to enter a REPL, +or read eval print loop. This is a mode where Janet functions like a calculator, +reading some input from the user, evaluating it, and printing out the result, all +in an infinite loop. This is a useful mode for exploring or prototyping in Janet. + +This hello world program is about the simplest program one can write, and consists of only +a few pieces of syntax. This first element is the `print` symbol. This is a function +that simply prints its arguments to the console. The second argument is the +string literal "Hello, world!", which is the one and only argument to the +print function. Lastly, the print symbol and the string literal are wrapped +in parentheses, forming a tuple. In Janet, parentheses and brackets are interchangeable, +brackets are used mostly when the resulting tuple is not a function call. The tuple +above indicates that the function `print` is to be called with one argument, `"Hello, world"`. + +Like all lisps, all operations in Janet are in prefix notation; the name of the +operator is the first value in the tuple, and the arguments passed to it are +in the rest of the tuple. + +# A bit more - Arithmetic + +Any programming language will have some way to do arithmetic. Janet is no exception, +and supports the basic arithmetic operators + +``` +# Prints 13 +# (1 + (2*2) + (10/5) + 3 + 4 + (5 - 6)) +(print (+ 1 (* 2 2) (/ 10 5) 3 4 (- 5 6))) +``` + +Just like the print function, all arithmetic operators are entered in +prefix notation. Janet also supports the remainder operator, or `%`, which returns +the remainder of division. For example, `(% 10 3)` is 1, and `(% 10.5 3)` is +1.5. The lines that begin with `#` are comments. + +Janet actually has two "flavors" of numbers; integers and real numbers. Integers are any +integer value between -2,147,483,648 and 2,147,483,647 (32 bit signed integer). +Reals are real numbers, and are represented by IEEE-754 double precision floating point +numbers. That means that they can represent any number an integer can represent, as well +fractions to very high precision. + +Although real numbers can represent any value an integer can, try to distinguish between +real numbers and integers in your program. If you are using a number to index into a structure, +you probably want integers. Otherwise, you may want to use reals (this is only a rule of thumb). + +Arithmetic operator will convert integers to real numbers if needed, but real numbers +will not be converted to integers, as not all real numbers can be safely converted to integers. + +## Numeric literals + +Numeric literals can be written in many ways. Numbers can be written in base 10, with +underscores used to separate digits into groups. A decimal point can be used for floating +point numbers. Numbers can also be written in other bases by prefixing the number with the desired +base and the character 'r'. For example, 16 can be written as `16`, `1_6`, `16r10`, `4r100`, or `0x10`. The +`0x` prefix can be used for hexadecimal as it is so common. The radix must be themselves written in base 10, and +can be any integer from 2 to 36. For any radix above 10, use the letters as digits (not case sensitive). + +Numbers can also be in scientific notation such as `3e10`. A custom radix can be used as well +as for scientific notation numbers, (the exponent will share the radix). For numbers in scientific +notation with a radix besides 10, use the `&` symbol to indicate the exponent rather then `e`. + +## Arithmetic Functions + +Besides the 5 main arithmetic functions, janet also supports a number of math functions +taken from the C library ``, as well as bitwise operators that behave like they +do in C or Java. Functions like `math/sin`, `math/cos`, `math/log`, and `math/exp` will +behave as expected to a C programmer. They all take either 1 or 2 numeric arguments and +return a real number (never an integer!) + +# Strings, Keywords and Symbols + +Janet supports several varieties of types that can be used as labels for things in +your program. The most useful type for this purpose is the keyword type. A keyword +begins with a semicolon, and then contains 0 or more alphanumeric or a few other common +characters. For example, `:hello`, `:my-name`, `:=`, and `:ABC123_-*&^%$` are all keywords. +Keywords are actually just special cases of symbols, which are similar but don't start with +a semicolon. The difference between symbols and keywords is that keywords evaluate to themselves, while +symbols evaluate to whatever they are bound to. To have a symbol evaluate to itself, it must be +quoted. + +```lisp +# Evaluates to :monday +:monday + +# Will throw a compile error as monday is not defined +monday + +# Quote it - evaluates to the symbol monday +'monday + +# Or first define monday +(def monday "It is monday") + +# Now the evaluation should work - monday evaluates to "It is monday" +monday +``` + +The most common thing to do with a keyword is to check it for equality or use it as a key into +a table or struct. Note that symbols, keywords and strings are all immutable. Besides making your +code easier to reason about, it allows for many optimizations involving these types. + +```lisp +# Evaluates to true +(= :hello :hello) + +# Evaluates to false, everything in janet is case sensitive +(= :hello :HeLlO) + +# Look up into a table - evaluates to 25 +(get { + :name "John" + :age 25 + :occupation "plumber" +} :age) +``` + +Strings can be used similarly to keywords, but there primary usage is for defining either text +or arbitrary sequences of bytes. Strings (and symbols) in janet are what is sometimes known as +"8-bit clean"; they can hold any number of bytes, and are completely unaware of things like character +encodings. This is completely compatible with ASCII and UTF-8, two of the most common character +encodings. By being encoding agnostic, janet strings can be very simple, fast, and useful for +for other uses besides holding text. + +Literal text can be entered inside quotes, as we have seen above. + +``` +"Hello, this is a string." + +# We can also add escape characters for newlines, double quotes, backslash, tabs, etc. +"Hello\nThis is on line two\n\tThis is indented\n" + +# For long strings where you don't want to type a lot of escape characters, +# you can use 1 or more backticks (`\``) to delimit a string. +# To close this string, simply repeat the opening sequence of backticks +`` +This is a string. +Line 2 + Indented +"We can just type quotes here", and backslashes \ no problem. +`` +``` + +# Functions + +Janet is a functional language - that means that one of the basic building blocks of your +program will be defining functions (the other is using data structures). Because janet +is a Lisp, functions are values just like numbers or strings - they can be passed around and +created as needed. + +Functions can be defined with the `defn` macro, like so: + +```lisp +(defn triangle-area + "Calculates the area of a triangle." + [base height] + (print "calculating area of a triangle...") + (* base height 0.5)) +``` + +A function defined with `defn` consists of a name, a number of optional flags for def, and +finally a function body. The example above is named triangle-area and takes two parameters named base and height. The body of the function will print a message and then evaluate to the area of the triangle. + +Once a function like the above one is defined, the programmer can use the `triangle-area` +function just like any other, say `print` or `+`. + +```lisp +# Prints "calculating area of a triangle..." and then "25" +(print (triangle-area 5 10)) +``` + +Note that when nesting function calls in other function calls like above (a call to triangle-area is +nested inside a call to print), the inner function calls are evaluated first. Also, arguments to +a function call are evaluated in order, from first argument to last argument). + +Because functions are first-class values like numbers or strings, they can be passed +as arguments to other functions as well. + +``` +(print triangle-area) +``` + +This prints the location in memory of the function triangle area. + +Functions don't need to have names. The `fn` keyword can be used to introduce function +literals without binding them to a symbol. + +``` +# Evaluates to 40 +((fn [x y] (+ x x y)) 10 20) +# Also evaluates to 40 +((fn [x y &] (+ x x y)) 10 20) + +# Will throw an error about the wrong arity +((fn [x] x) 1 2) +# Will not throw an error about the wrong arity +((fn [x &] x) 1 2) +``` + +The first expression creates an anonymous function that adds twice +the first argument to the second, and then calls that function with arguments 10 and 20. +This will return (10 + 10 + 20) = 40. + +There is a common macro `defn` that can be used for creating functions and immediately binding +them to a name. `defn` works as expected at both the top level and inside another form. There is also +the corresponding + +Note that putting an ampersand at the end of the argument list inhibits strict arity checking. +This means that such a function will accept fewer or more arguments than specified. + +```lisp +(defn myfun [x y] + (+ x x y)) + +# You can think of defn as a shorthand for def and fn together +(def myfun-same (fn [x y] + (+ x x Y))) + +(myfun 3 4) # -> 10 +``` + +Janet has many macros provided for you (and you can write your own). +Macros are just functions that take your source code +and transform it into some other source code, usually automating some repetitive pattern for you. + +# Defs and Vars + +Values can be bound to symbols for later use using the keyword `def`. Using undefined +symbols will raise an error. + +``` +(def a 100) +(def b (+ 1 a)) +(def c (+ b b)) +(def d (- c 100)) +``` + +Bindings created with def have lexical scoping. Also, bindings created with def are immutable; they +cannot be changed after definition. For mutable bindings, like variables in other programming +languages, use the `var` keyword. The assignment special form `:=` can then be used to update +a var. + +``` +(var myvar 1) +(print myvar) +(:= myvar 10) +(print myvar) +``` + +In the global scope, you can use the `:private` option on a def or var to prevent it from +being exported to code that imports your current module. You can also add documentation to +a function by passing a string the def or var command. + +```lisp +(def mydef :private "This will have priavte scope. My doc here." 123) +(var myvar "docstring here" 321) +``` + +## Scopes + +Defs and vars (collectively known as bindings) live inside what is called a scope. A scope is +simply where the bindings are valid. If a binding is referenced outside of its scope, the compiler +will throw an error. Scopes are useful for organizing your bindings and my extension your programs. +There are two main ways to create a scope in Janet. + +The first is to use the `do` special form. `do` executes a series of statements in a scope +and evaluates to the last statement. Bindings create inside the form do not escape outside +of its scope. + +```lisp +(def a :outera) + +(do + (def a 1) + (def b 2) + (def c 3) + (+ a b c)) # -> 6 + +a # -> :outera +b # -> compile error: "unknown symbol \"b\"" +c # -> compile error: "unknown symbol \"c\"" +``` + +Any attempt to reference the bindings from the do form after it has finished +executing will fail. Also notice who defining `a` inside the do form did not +overwrite the original definition of `a` for the global scope. + +The second way to create a scope is to create a closure. +The `fn` special form also introduces a scope just like +the `do` special form. + +There is another built in macro, `let`, that does multiple defs at once, and then introduces a scope. +`let` is a wrapper around a combination of defs and dos, and is the most "functional" way of +creating bindings. + +```lisp +(let [a 1 + b 2 + c 3] + (+ a b c)) # -> 6 +``` + +The above is equivalent to the example using `do` and `def`. +This is the preferable form in most cases, +but using do with multiple defs is fine as well. + +# Data Structures + +Once you have a handle on functions and the primitive value types, you may be wondering how +to work with collections of things. Janet has a small number of core data structure types +that are very versatile. Tables, Structs, Arrays, Tuples, Strings, and Buffers, are the 6 main +built in data structure types. These data structures can be arranged in a useful table describing +there relationship to each other. + +| | Mutable | Immutable | +| ---------- | ------- | --------------- | +| Indexed | Array | Tuple | +| Dictionary | Table | Struct | +| Byteseq | Buffer | String (Symbol) | + +Indexed types are linear lists of elements than can be accessed in constant time with an integer index. +Indexed types are backed by a single chunk of memory for fast access, and are indexed from 0 as in C. +Dictionary types associate keys with values. The difference between dictionaries and indexed types +is that dictionaries are not limited to integer keys. They are backed by a hashtable and also offer +constant time lookup (and insertion for the mutable case). +Finally, the 'byteseq' abstraction is any type that contains a sequence of bytes. A byteseq associates +integer keys (the indices) with integer values between 0 and 255 (the byte values). In this way, +they behave much like Arrays and Tuples. However, one cannot put non integer values into a byteseq. + +```lisp +(def mytuple (tuple 1 2 3)) + +(def myarray @(1 2 3)) +(def myarray (array 1 2 3)) + +(def mystruct { + :key "value" + :key2 "another" + 1 2 + 4 3}) + +(def another-struct + (struct :a 1 :b 2)) + +(def my-table @{ + :a :b + :c :d + :A :qwerty}) +(def another-table + (table 1 2 3 4)) + +(def my-buffer @"thisismutable") +(def my-buffer2 @``` + This is also mutable ":)" + ```) +``` + +To read the values in a data structure, use the get function. The first parameter is the data structure +itself, and the second parameter is the key. + +```lisp +(get @{:a 1} :a) # -> 1 +(get {:a 1} :a) # -> 1 +(get @[:a :b :c] 2) # -> :c +(get (tuple "a" "b" "c") 1) # -> "b" +(get @"hello, world" 1) # -> 101 +(get "hello, world" 0) # -> 104 +``` + +### Destructuring + +In many cases, however, you do not need the `get` function at all. Janet supports destructuring, which +means both the `def` and `var` special forms can extract values from inside structures themselves. + +```lisp +# Before, we might do +(def my-array @[:mary :had :a :little :lamb]) +(def lamb (get my-array 4)) +(print lamb) # Prints :lamb + +# Now, with destructuring, +(def [_ _ _ _ lamb] my-array) +(print lamb) # Again, prints :lamb + +# Destructuring works with tables as well +(def person @{:name "Bob Dylan" :age 77} +(def + {:name person-name + :age person-age} person) +``` +To update a mutable data structure, use the `put` function. It takes 3 arguments, the data structure, +the key, and the value, and returns the data structure. The allowed types keys and values +depend on what data structure is passed in. + +```lisp +(put @[] 100 :a) +(put @{} :key "value") +(put @"" 100 92) +``` + +Note that for Arrays and Buffers, putting an index that is outside the length of the data structure +will extend the data structure and fill it with nils in the case of the Array, +or 0s in the case of the Buffer. + +The last generic function for all data structures is the `length` function. This returns the number of +values in a data structure (the number of keys in a dictionary type). + +# Flow Control + +Janet has only two built in primitives to change flow while inside a function. The first is the +`if` special form, which behaves as expected in most functional languages. It takes two or three parameters: +a condition, an expression to evaluate to if the condition is true (not nil or false), +and an optional condition to evaluate to when the condition is nil or false. If the optional parameter +is omitted, the if form evaluates to nil. + +```lisp +(if (> 4 3) + "4 is greater than 3" + "4 is not greater then three") # Evaluates to the first statement + +(if true + (print "Hey")) # Will print + +(if false + (print "Oy!")) # Will not print +``` + +The second primitive control flow construct is the while loop. The while behaves much the same +as in many other programming languages, including C, Java, and Python. The while loop takes +two or more parameters: the first is a condition (like in the `if` statement), that is checked before +every iteration of the loop. If it is nil or false, the while loop ends and evaluates to nil. Otherwise, +the rest of the parameters will be evaluated sequentially and then the program will return to the beginning +of the loop. + +``` +# Loop from 100 down to 1 and print each time +(var i 100) +(while (pos? i) + (print "the number is " i) + (-- i)) + +# Print ... until a random number in range [0, 1) is >= 0.9 +# (math/random evaluates to a value between 0 and 1) +(while (> 0.9 (math/random)) + (print "...")) +``` + +Besides these special forms, Janet has many macros for both conditional testing and looping +that are much better for the majority of cases. For conditional testing, the `cond`, `switch`, and +`when` macros can be used to great effect. `cond` can be used for making an if-else chain, where using +just raw if forms would result in many parentheses. `case` For looping, the `loop`, `seq`, and `generate` +implement janet's form of list comprehension, as in Python or Clojure. + +# The Core Library + +Janet has a built in core library of over 300 functions and macros at the time of writing. +While some of these functions may be refactored into separate modules, it is useful to get to know +the core to avoid rewriting provided functions. + +For any given function, use the `doc` macro to view the documentation for it in the repl. + +```lisp +(doc defn) -> Prints the documentation for "defn" +``` +To see a list of all global functions in the repl, type the command + +```lisp +(table/getproto *env*) +# Or +(all-symbols) +``` +Which will print out every built-in global binding +(it will not show your global bindings). To print all +of your global bindings, just use \*env\*, which is a var +that is bound to the current environment. + +The convention of surrounding a symbol in stars is taken from lisp +and Clojure, and indicates a global dynamic variable rather than a normal +definition. To get the static environment at the time of compilation, use the +`_env` symbol. + +# Prototypes + +To support basic generic programming, Janet tables support a prototype +table. A prototype table contains default values for a table if certain keys +are not found in the original table. This allows many similar tables to share +contents without duplicating memory. + +```lisp +# One of many Object Oriented schemes that can +# be implented in janet. +(def proto1 @{:type :custom1 + :behave (fn [self x] (print "behaving " x))}) +(def proto2 @{:type :custom2 + :behave (fn [self x] (print "behaving 2 " x))}) + +(def thing1 (table/setproto @{} proto1)) +(def thing2 (table/setproto @{} proto2)) + +(print thing1:type) # prints :custom1 +(print thing2:type) # prints :custom2 + +(thing1:behave thing1 :a) # prints "behaving :a" +(thing2:behave thing2 :b) # prints "behaving 2 :b" +``` + +Looking up in a table with a prototype can be summed up with the following algorithm. + +1. `(get my-table my-key)` is called. +2. my-table is checked for the key if my-key. If there is a value for the key, it is returned. +3. if there is a prototype table for my-table, set `my-table = my-table's prototype` and got to 2. +4. Return nil as the key was not found. + +Janet will check up to about a 1000 prototypes recursively by default before giving up and returning nil. This +is to prevent an infinite loop. This value can be changed by adjusting the `JANET_RECURSION_GUARD` value +in janet.h. + +Note that Janet prototypes are not as expressive as metatables in Lua and many other languages. +This is by design, as adding Lua or Python like capabilities would not be technically difficult. +Users should prefer plain data and functions that operate on them rather than mutable objects +with methods. + +# Fibers + +Janet has support for single-core asynchronous programming via coroutines, or fibers. +Fibers allow a process to stop and resume execution later, essentially enabling +multiple returns from a function. This allows many patterns such a schedules, generators, +iterators, live debugging, and robust error handling. Janet's error handling is actually built on +top of fibers (when an error is thrown, the parent fiber will handle the error). + +A temporary return from a fiber is called a yield, and can be invoked with the `yield` function. +To resume a fiber that has been yielded, use the `resume` function. When resume is called on a fiber, +it will only return when that fiber either returns, yields, throws an error, or otherwise emits +a signal. + +Different from traditional coroutines, Janet's fibers implement a signaling mechanism, which +is used to differentiate different kinds of returns. When a fiber yields or throws an error, +control is returned to the calling fiber. The parent fiber must then check what kind of state the +fiber is in to differentiate errors from return values from user defined signals. + +To create a fiber, user the `fiber/new` function. The fiber constructor take one or two arguments. +the first, necessary argument is the function that the fiber will execute. This function must accept +an arity of zero. The next optional argument is a collection of flags checking what kinds of +signals to trap and return via `resume`. This is useful so +the programmer does not need to handle all different kinds of signals from a fiber. Any un-trapped signals +are simply propagated to the next fiber. + +```lisp +(def f (fiber/new (fn [] + (yield 1) + (yield 2) + (yield 3) + (yield 4) + 5))) + +# Get the status of the fiber (:alive, :dead, :debug, :new, :pending, or :user0-:user9) +(print (fiber/status f)) # -> :new + +(print (resume f)) # -> prints 1 +(print (resume f)) # -> prints 2 +(print (resume f)) # -> prints 3 +(print (resume f)) # -> prints 4 +(print (fiber/status f)) # -> print :pending +(print (resume f)) # -> prints 5 +(print (fiber/status f)) # -> print :dead +(print (resume f)) # -> throws an error because the fiber is dead +``` + +## Using Fibers to Capture Errors + +Besides being used as coroutines, fibers can be used to implement error handling (exceptions). + +```lisp +(defn my-function-that-errors [x] + (print "start function with " x) + (error "oops!") + (print "never gets here")) + +# Use the :e flag to only trap errors. +(def f (fiber/new my-function-that-errors :e)) +(def result (resume f)) +(if (= (fiber/status f) :error) + (print "result contains the error") + (print "result contains the good result")) +``` + +# Macros + +Janet supports macros like most lisps. A macro is like a function, but transforms +the code itself rather than data. They let you extend the syntax of the language itself. + +You have seen some macros already. The `let`, `loop`, and `defn` forms are macros. When the compiler +sees a macro, it evaluates the macro and then compiles the result. We say the macro has been +*expanded* after the compiler evaluates it. A simple version of the `defn` macro can +be thought of as transforming code of the form + +```lisp +(defn1 myfun [x] body) +``` +into +```lisp +(def myfun (fn myfun [x] body)) +``` + +We could write such a macro like so: + +```lisp +(defmacro defn1 [name args body] + (tuple 'def name (tuple 'fn name args body))) +``` + +There are a couple of issues with this macro, but it will work for simple functions +quite well. + +The first issue is that our defn2 macro can't define functions with multiple expressions +in the body. We can make the macro variadic, just like a function. Here is a second version +of this macro. + +```lisp +(defmacro defn2 [name args & body] + (tuple 'def name (apply tuple 'fn name args body))) +``` + +Great! Now we can define functions with multiple elements in the body. We can still improve this +macro even more though. First, we can add a docstring to it. If someone is using the function later, +they can use `(doc defn3)` to get a description of the function. Next, we can rewrite the macro +using janet's builtin quasiquoting facilities. + +```lisp +(defmacro defn3 + "Defines a new function." + [name args & body] + `(def ,name (fn ,name ,args ,;body))) +``` + +This is functionally identical to our previous version `defn2`, but written in such +a way that the macro output is more clear. The leading backtick is shorthand for the +`(quasiquote x)` special form, which is like `(quote x)` except we can unquote +expressions inside it. The comma in front of `name` and `args` is an unquote, which +allows us to put a value in the quasiquote. Without the unquote, the symbol \'name\' +would be put in the returned tuple. Without the unquote, every function we defined +would be called \'name\'!. + +Similar to name, we must also unquote body. However, a normal unquote doesn't work. +See what happens if we use a normal unquote for body as well. + +```lisp +(def name 'myfunction) +(def args '[x y z]) +(defn body '[(print x) (print y) (print z)]) + +`(def ,name (fn ,name ,args ,body)) +# -> (def myfunction (fn myfunction (x y z) ((print x) (print y) (print z)))) +``` + +There is an extra set of parentheses around the body of our function! We don't +want to put the body *inside* the form `(fn args ...)`, we want to *splice* it +into the form. Luckily, janet has the `(splice x)` special form for this purpose, +and a shorthand for it, the ; character. +When combined with the unquote special, we get the desired output. + +```lisp +`(def ,name (fn ,name ,args ,;body)) +# -> (def myfunction (fn myfunction (x y z) (print x) (print y) (print z))) +``` + +## Hygiene + +Sometime when we write macros, we must generate symbols for local bindings. Consider +the following macro + +```lisp +(defmacro max1 + "Get the max of two values." + [x y] + `(if (> ,x ,y) ,x ,y)) +``` + +This almost works, but will evaluate both x and y twice. This is because both show up +in the macro twice. For example, `(max1 (do (print 1) 1) (do (print 2) 2))` will +print both 1 and 2 twice, which is surprising to a user of this macro. + +We can do better: + +```lisp +(defmacro max2 + "Get the max of two values." + [x y] + `(let [x ,x + y ,y] + (if (> x y) x y))) +``` + +Now we have no double evaluation problem! But we now have an even more subtle problem. +What happens in the following code? + +```lisp +(def x 10) +(max2 8 (+ x 4)) +``` + +We want the max to be 14, but this will actually evaluate to 12! This can be understood +if we expand the macro. You can expand macro once in janet using the '(macex1 x)` function. +(To expand macros until there are no macros left to expand, us `(macex x)`. Be careful, + janet has many macros, so the full expansion may be almost unreadable). + +```lisp +(macex1 '(max2 8 (+ x 4))) +# -> (let (x 8 y (+ x 4)) (if (> x y) x y)) +``` + +After expansion, y wrongly refers to the x inside the macro (which is bound to 8) rather than the x defined +to be 10. The problem is the reuse of the symbol x inside the macro, which overshadowed the original +meaning of the macro. + +Janet provides a general solution to this problem in terms of the `(gensym)` function, which returns +a symbol which is guarenteed to be unique and not collide with any symbols defined previously. We can define +our macro once more for a fully correct macro. + +```lisp +(defmacro max3 + "Get the max of two values." + [x y] + (def $x (gensym)) + (def $y (gensym)) + `(let [,$x ,x + ,$y ,y] + (if (> ,$x ,$y) ,$x ,$y))) +``` + +As you can see, macros are very powerful but also are prone to subtle bugs. You must remember that +at their core, macros are just functions that output code, and the code that they return must +work in many contexts! diff --git a/doc/SQLite.md b/doc/SQLite.md new file mode 100644 index 00000000..00b68359 --- /dev/null +++ b/doc/SQLite.md @@ -0,0 +1,31 @@ +# SQLite bindings + +There are some sqlite3 bindings in the directory natives/sqlite3 bundled with +the janet source code. They serve mostly as a +proof of concept external c library. To use, first compile the module with Make. + +```sh +make natives +``` + +Next, enter the repl and create a database and a table. + +``` +janet:1:> (import natives/sqlite3 :as sql) +nil +janet:2:> (def db (sql/open "test.db")) + +janet:3:> (sql/eval db `CREATE TABLE customers(id INTEGER PRIMARY KEY, name TEXT);`) +@[] +janet:4:> (sql/eval db `INSERT INTO customers VALUES(:id, :name);` {:name "John" :id 12345}) +@[] +janet:5:> (sql/eval db `SELECT * FROM customers;`) +@[{"id" 12345 "name" "John"}] +``` + +Finally, close the database connection when done with it. + +``` +janet:6:> (sql/close db) +nil +``` diff --git a/doc/The-Janet-Abstract-Machine-Bytecode.md b/doc/The-Janet-Abstract-Machine-Bytecode.md new file mode 100644 index 00000000..e97f9568 --- /dev/null +++ b/doc/The-Janet-Abstract-Machine-Bytecode.md @@ -0,0 +1,238 @@ +The Janet language is implemented on top of an abstract machine (AM). The compiler +converts Janet data structures to this bytecode, which can then be efficiently executed +from inside a C program. To understand the janet bytecode, it is useful to understand +the abstractions used inside the Janet AM, as well as the C types used to implement these +features. + +## The Stack = The Fiber + +A Janet Fiber is the type used to represent multiple concurrent processes +in janet. It is basically a wrapper around the idea of a stack. The stack is +divided into a number of stack frames (`JanetStackFrame *` in C), each of which +contains information such as the function that created the stack frame, +the program counter for the stack frame, a pointer to the previous frame, +and the size of the frame. Each stack frame also is paired with a number +registers. + +``` +X: Slot + +X +X - Stack Top, for next function call. +----- +Frame next +----- +X +X +X +X +X +X +X - Stack 0 +----- +Frame 0 +----- +X +X +X - Stack -1 +----- +Frame -1 +----- +X +X +X +X +X - Stack -2 +----- +Frame -2 +----- +... +... +... +----- +Bottom of stack +``` + +Fibers also have an incomplete stack frame for the next function call on top +of their stacks. Making a function call involves pushing arguments to this +temporary stack, and then invoking either the CALL or TCALL instructions. +Arguments for the next function call are pushed via the PUSH, PUSH2, PUSH3, and +PUSHA instructions. The stack of a fiber will grow as large as needed, although by +default janet will limit the maximum size of a fiber's stack. +The maximum stack size can be modified on a per fiber basis. + +The slots in the stack are exposed as virtual registers to instructions. They +can hold any Janet value. + +## Closures + +All functions in janet are closures; they combine some bytecode instructions +with 0 or more environments. In the C source, a closure (hereby the same as +a function) is represented by the type `JanetFunction *`. The bytecode instruction +part of the function is represented by `JanetFuncDef *`, and a function environment +is represented with `JanetFuncEnv *`. + +The function definition part of a function (the 'bytecode' part, `JanetFuncDef *`), +we also store various metadata about the function which is useful for debugging, +as well as constants referenced by the function. + +## C Functions + +Janet uses C functions to bridge to native code. A C function +(`JanetCFunction *` in C) is a C function pointer that can be called like +a normal janet closure. From the perspective of the bytecode instruction set, there is no difference +in invoking a C function and invoking a normal janet function. + +## Bytecode Format + +Janet bytecode presents an interface to a virtual machine with a large number +of identical registers that can hold any Janet value (`Janet *` in C). Most instructions +have a destination register, and 1 or 2 source register. Registers are simply +named with positive integers. + +Each instruction is a 32 bit integer, meaning that the instruction set is a constant +width RISC instruction set like MIPS. The opcode of each instruction is the least significant +byte of the instruction. The highest bit of +this leading byte is reserved for debugging purpose, so there are 128 possible opcodes encodable +with this scheme. Not all of these possible opcode are defined, and will trap the interpreter +and emit a debug signal. Note that this mean an unknown opcode is still valid bytecode, it will +just put the interpreter into a debug state when executed. + +``` +X - Payload bits +O - Opcode bits + + 4 3 2 1 ++----+----+----+----+ +| XX | XX | XX | OO | ++----+----+----+----+ +``` + +8 bits for the opcode leaves 24 bits for the payload, which may or may not be utilized. +There are a few instruction variants that divide these payload bits. + +* 0 arg - Used for noops, returning nil, or other instructions that take no + arguments. The payload is essentially ignored. +* 1 arg - All payload bits correspond to a single value, usually a signed or unsigned integer. + Used for instructions of 1 argument, like returning a value, yielding a value to the parent fiber, + or doing a (relative) jump. +* 2 arg - Payload is split into byte 2 and bytes 3 and 4. + The first argument is the 8 bit value from byte 2, and the second argument is the 16 bit value + from bytes 3 and 4 (`instruction >> 16`). Used for instructions of two arguments, like move, normal + function calls, conditionals, etc. +* 3 arg - Bytes 2, 3, and 4 each correspond to an 8 bit argument. + Used for arithmetic operations, emitting a signal, etc. + +These instruction variants can be further refined based on the semantics of the arguments. +Some instructions may treat an argument as a slot index, while other instructions +will treat the argument as a signed integer literal, and index for a constant, an index +for an environment, or an unsigned integer. + +## Instruction Reference + +A listing of all opcode values can be found in src/include/janet/janetopcodes.h. The janet assembly +short names can be found src/assembler/asm.c. In this document, we will refer to the instructions +by their short names as presented to the assembler rather than their numerical values. + +Each instruction is also listed with a signature, which are the arguments the instruction +expects. There are a handful of instruction signatures, which combine the arity and type +of the instruction. The assembler does not +do any typechecking per closure, but does prevent jumping to invalid instructions and +failure to return or error. + +### Notation + +* The $ prefix indicates that a instruction parameter is acting as a virtual register (slot). + If a parameter does not have the $ suffix in the description, it is acting as some kind + of literal (usually an unsigned integer for indexes, and a signed integer for literal integers). + +* Some operators in the description have the suffix 'i' or 'r'. These indicate + that these operators correspond to integers or real numbers only, respectively. All + bitwise operators and bit shifts only work with integers. + +* The `>>>` indicates unsigned right shift, as in Java. Because all integers in janet are + signed, we differentiate the two kinds of right bit shift. + +* The 'im' suffix in the instruction name is short for immediate. The 'i' suffix is short for integer, + and the 'r' suffix is short for real. + +### Reference Table + +| Instruction | Signature | Description | +| ----------- | --------------------------- | --------------------------------- | +| `add` | `(add dest lhs rhs)` | $dest = $lhs + $rhs | +| `addi` | `(addi dest lhs rhs)` | $dest = $lhs +i $rhs | +| `addim` | `(addim dest lhs im)` | $dest = $lhs +i im | +| `addr` | `(addr dest lhs rhs)` | $dest = $lhs +r $rhs | +| `band` | `(band dest lhs rhs)` | $dest = $lhs & $rhs | +| `bnot` | `(bnot dest operand)` | $dest = ~$operand | +| `bor` | `(bor dest lhs rhs)` | $dest = $lhs | $rhs | +| `bxor` | `(bxor dest lhs rhs)` | $dest = $lhs ^ $rhs | +| `call` | `(call dest callee)` | $dest = call($callee, args) | +| `clo` | `(clo dest index)` | $dest = closure(defs[$index]) | +| `cmp` | `(cmp dest lhs rhs)` | $dest = janet\_compare($lhs, $rhs) | +| `div` | `(div dest lhs rhs)` | $dest = $lhs / $rhs | +| `divi` | `(divi dest lhs rhs)` | $dest = $lhs /i $rhs | +| `divim` | `(divim dest lhs im)` | $dest = $lhs /i im | +| `divr` | `(divr dest lhs rhs)` | $dest = $lhs /r $rhs | +| `eq` | `(eq dest lhs rhs)` | $dest = $lhs == $rhs | +| `eqi` | `(eqi dest lhs rhs)` | $dest = $lhs ==i $rhs | +| `eqim` | `(eqim dest lhs im)` | $dest = $lhs ==i im | +| `eqr` | `(eqr dest lhs rhs)` | $dest = $lhs ==r $rhs | +| `err` | `(err message)` | Throw error $message. | +| `get` | `(get dest ds key)` | $dest = $ds[$key] | +| `geti` | `(geti dest ds index)` | $dest = $ds[index] | +| `gt` | `(gt dest lhs rhs)` | $dest = $lhs > $rhs | +| `gti` | `(gti dest lhs rhs)` | $dest = $lhs \>i $rhs | +| `gtim` | `(gtim dest lhs im)` | $dest = $lhs \>i im | +| `gtr` | `(gtr dest lhs rhs)` | $dest = $lhs \>r $rhs | +| `gter` | `(gter dest lhs rhs)` | $dest = $lhs >=r $rhs | +| `jmp` | `(jmp label)` | pc = label, pc += offset | +| `jmpif` | `(jmpif cond label)` | if $cond pc = label else pc++ | +| `jmpno` | `(jmpno cond label)` | if $cond pc++ else pc = label | +| `ldc` | `(ldc dest index)` | $dest = constants[index] | +| `ldf` | `(ldf dest)` | $dest = false | +| `ldi` | `(ldi dest integer)` | $dest = integer | +| `ldn` | `(ldn dest)` | $dest = nil | +| `lds` | `(lds dest)` | $dest = current closure (self) | +| `ldt` | `(ldt dest)` | $dest = true | +| `ldu` | `(ldu dest env index)` | $dest = envs[env][index] | +| `len` | `(len dest ds)` | $dest = length(ds) | +| `lt` | `(lt dest lhs rhs)` | $dest = $lhs < $rhs | +| `lti` | `(lti dest lhs rhs)` | $dest = $lhs \> $rhs | +| `srim` | `(srim dest lhs shamt)` | $dest = $lhs >> shamt | +| `sru` | `(sru dest lhs rhs)` | $dest = $lhs >>> $rhs | +| `sruim` | `(sruim dest lhs shamt)` | $dest = $lhs >>> shamt | +| `sub` | `(sub dest lhs rhs)` | $dest = $lhs - $rhs | +| `tcall` | `(tcall callee)` | Return call($callee, args) | +| `tchck` | `(tcheck slot types)` | Assert $slot does matches types | + From 7484a396ac2cfcf8d4dec966c3cc81533fa34e28 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 15:34:38 -0500 Subject: [PATCH 18/34] md formatting issue. --- doc/Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Introduction.md b/doc/Introduction.md index 6daf6684..6df82905 100644 --- a/doc/Introduction.md +++ b/doc/Introduction.md @@ -710,7 +710,7 @@ What happens in the following code? ``` We want the max to be 14, but this will actually evaluate to 12! This can be understood -if we expand the macro. You can expand macro once in janet using the '(macex1 x)` function. +if we expand the macro. You can expand macro once in janet using the `(macex1 x)` function. (To expand macros until there are no macros left to expand, us `(macex x)`. Be careful, janet has many macros, so the full expansion may be almost unreadable). From 24b9ae7820e0b478f56ac07a5d7bdd876187d929 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 15:42:27 -0500 Subject: [PATCH 19/34] Add doc files to distribution archives. --- Makefile | 2 +- build_win.bat | 3 ++- doc/Introduction.md | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 154295b0..9eeffa93 100644 --- a/Makefile +++ b/Makefile @@ -156,7 +156,7 @@ valtest: $(JANET_TARGET) $(TEST_PROGRAMS) dist: build/janet-dist.tar.gz build/janet-%.tar.gz: $(JANET_TARGET) src/include/janet/janet.h \ - janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) README.md + janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) README.md $(wildcard doc/*) tar -czvf $@ $^ ################# diff --git a/build_win.bat b/build_win.bat index 97fca9d6..d12c2631 100644 --- a/build_win.bat +++ b/build_win.bat @@ -70,7 +70,7 @@ exit /b 1 @rem Show help :HELP @echo. -@echo Usage: build_windows [subcommand=clean,help,test] +@echo Usage: build_windows [subcommand=clean,help,test,dist] @echo. @echo Script to build janet on windows. Must be run from the Visual Studio @echo command prompt. @@ -99,6 +99,7 @@ copy README.md dist\README.md copy janet.lib dist\janet.lib copy janet.exp dist\janet.exp copy src\include\janet\janet.h dist\janet.h +xcopy /s doc dist\doc exit /b 0 :TESTFAIL diff --git a/doc/Introduction.md b/doc/Introduction.md index 6df82905..809cd19f 100644 --- a/doc/Introduction.md +++ b/doc/Introduction.md @@ -676,7 +676,8 @@ When combined with the unquote special, we get the desired output. ## Hygiene -Sometime when we write macros, we must generate symbols for local bindings. Consider +Sometime when we write macros, we must generate symbols for local bindings. Ignoring that +it could be written as a function, consider the following macro ```lisp @@ -711,7 +712,7 @@ What happens in the following code? We want the max to be 14, but this will actually evaluate to 12! This can be understood if we expand the macro. You can expand macro once in janet using the `(macex1 x)` function. -(To expand macros until there are no macros left to expand, us `(macex x)`. Be careful, +(To expand macros until there are no macros left to expand, use `(macex x)`. Be careful, janet has many macros, so the full expansion may be almost unreadable). ```lisp @@ -721,7 +722,7 @@ if we expand the macro. You can expand macro once in janet using the `(macex1 x) After expansion, y wrongly refers to the x inside the macro (which is bound to 8) rather than the x defined to be 10. The problem is the reuse of the symbol x inside the macro, which overshadowed the original -meaning of the macro. +binding. Janet provides a general solution to this problem in terms of the `(gensym)` function, which returns a symbol which is guarenteed to be unique and not collide with any symbols defined previously. We can define From a412eecd3654cf72f98c1ad5458a3624a20e93a6 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 20:14:34 -0500 Subject: [PATCH 20/34] Add parser documentation. --- doc/Parser.md | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 doc/Parser.md diff --git a/doc/Parser.md b/doc/Parser.md new file mode 100644 index 00000000..5e2fffed --- /dev/null +++ b/doc/Parser.md @@ -0,0 +1,245 @@ +# The Parser + +A Janet program begins life as a text file, just a sequence of byte like +any other on your system. Janet source files should be UTF-8 or ASCII +encoded. Before Janet can compile or run your program, it must transform +your source code into a data structure. Janet is a lisp, which means it is +homoiconic - code is data, so all of the facilities in the language for +manipulating arrays, tuples, strings, and tables can be used for manipulating +your source code as well. + +But before janet code is represented as a data structure, it must be read, or parsed, +by the janet parser. Called the reader in many other lisps, the parser is a machine +that takes in plain text and outputs data structures which can be used by both +the compiler and macros. In janet, it is a parser rather than a reader because +there is no code execution at read time. This is safer and simpler, and also +lets janet syntax serve as a robust data interchange format. While a parser +is not extensible, in janet the philosophy is to extend the language via macros +rather than reader macros. + +## Nil, True and False + +Nil, true and false are all literals than can be entered as such +in the parser. + +``` +nil +true +false +``` + +## Symbols + +Janet symbols are represented a sequence of alphanumeric characters +not starting with a digit. They can also contain the characters +\!, @, $, \%, \^, \&, \*, -, \_, +, =, \|, \~, :, \<, \>, ., \?, \\, /, as +well as any Unicode codepoint not in the ascii range. + +By convention, most symbols should be all lower case and use dashes to connect words +(sometimes called kebab case). + +Symbols that come from another module often contain a forward slash that separates +the name of the module from the name of the definition in the module + +``` +symbol +kebab-case-symbol +snake_case_symbol +my-module/my-fuction +***** +!%$^*__--__._+++===~-crazy-symbol +*global-var* +你好 +``` + +## Keywords + +Janet keywords are really just symbols that begin with the character :. However, they +are used differently and treated by the compiler as a constant rather than a name for +something. Keywords are used mostly for keys in tables and structs, or pieces of syntax +in macros. + +``` +:keyword +:range +:0x0x0x0 +:a-keyword +:: +: +``` + +## Numbers + +Janet numbers are represented by either 32 bit integers or +IEEE-754 floating point numbers. The syntax is similar to that of many other languages +as well. Numbers can be written in base 10, with +underscores used to separate digits into groups. A decimal point can be used for floating +point numbers. Numbers can also be written in other bases by prefixing the number with the desired +base and the character 'r'. For example, 16 can be written as `16`, `1_6`, `16r10`, `4r100`, or `0x10`. The +`0x` prefix can be used for hexadecimal as it is so common. The radix must be themselves written in base 10, and +can be any integer from 2 to 36. For any radix above 10, use the letters as digits (not case sensitive). + +``` +0 +12 +-65912 +4.98 +1.3e18 +1.3E18 +18r123C +11raaa&a +1_000_000 +0xbeef +``` + +## Strings + +Strings in janet are surrounded by double quotes. Strings are 8bit clean, meaning +meaning they can contain any arbitrary sequence of bytes, including embedded +0s. To insert a double quote into a string itself, escape +the double quote with a backslash. For unprintable characters, you can either use +one of a few common escapes, use the `\xHH` escape to escape a single byte in +hexidecimal. The supported escapes are: + + - \\xHH Escape a single arbitrary byte in hexidecimal. + - \\n Newline (ASCII 10) + - \\t Tab character (ASCII 9) + - \\r Carriage Return (ASCII 13) + - \\0 Null (ASCII 0) + - \\z Null (ASCII 0) + - \\f Form Feed (ASCII 12) + - \\e Escape (ASCII 27) + - \\" Double Quote (ASCII 34) + - \\\\ Backslash (ASCII 92) + +Strings can also contain literal newline characters that will be ignore. +This lets one define a multiline string that does not contain newline characters. + +An alternative way of representing strings in janet is the long string, or the backquote +delimited string. A string can also be define to start with a certain number of +backquotes, and will end the same number of backquotes. Long strings +do not contain escape sequences; all bytes will be parsed literally until +ending delimiter is found. This is useful +for definining multiline strings with literal newline characters, unprintable +characters, or strings that would otherwise require many escape sequences. + +``` +"This is a string." +"This\nis\na\nstring." +"This +is +a +string." +`` +This +is +a +string +`` +``` + +## Buffers + +Buffers are similar strings except they are mutable data structures. Strings in janet +cannot be mutated after created, where a buffer can be changed after creation. +The syntax for a buffer is the same as that for a string or long string, but +the buffer must be prefixed with the '@' character. + +``` +@"" +@"Buffer." +@``Another buffer`` +``` + +## Tuples + +Tuples are a sequence of white space separated values surrounded by either parentheses +or brackets. The parser considers any of the characters ASCII 32, \\0, \\f, \\n, \\r or \\t +to be whitespace. + +``` +(do 1 2 3) +[do 1 2 3] +``` + +## Arrays + +Arrays are the same as tuples, but have a leading @ to indicate mutability. + +``` +@(:one :two :three) +@[:one :two :three] +``` + +## Structs + +Structs are represented by a sequence of whitespace delimited key value pairs +surrounded by curly braces. The sequence is defined as key1, value1, key2, value2, etc. +There must be an even number of items between curly braces or the parser will +signal a parse error. Any value can be a key or value. Using nil as a key or +value, however, will drop that pair from the parsed struct. + +``` +{} +{:key1 "value1" :key2 :value2 :key3 3} +{(1 2 3) (4 5 6)} +{@[] @[]} +{1 2 3 4 5 6} +``` +## Tables + +Table have the same syntax as structs, except they have the @ prefix to indicate +that they are mutable. + +``` +@{} +@{:key1 "value1" :key2 :value2 :key3 3} +@{(1 2 3) (4 5 6)} +@{@[] @[]} +@{1 2 3 4 5 6} +``` + +## Comments + +Comments begin with a \# character and continue until the end of the line. +There are no multiline comments. For ricm multiline comments, use a +string literal. + +## Shorthands + +Often called reader macros in other lisps, Janet provides several shorthand +notations for some forms. + +### 'x + +Shorthand for `(quote x)` + +### ;x + +Shorthand for `(splice x)` + +### \`x + +Shorthand for `(quasiquote x)` + +### ,x + +Shorthand for `(unquote x)` + +These shorthand notations can be combined in any order, allowing +forms like `''x` (`(quote (quote x))`), or `,;x` (`(unquote (splice x))`). + +## API + +The parser contains the following functions which exposes +the parser state machine as a janet abstract object. + +- `parser/byte` +- `parser/consume` +- `parser/error` +- `parser/flush` +- `parser/new` +- `parser/produce` +- `parser/state` +- `parser/status` +- `parser/where` From 8a5ede21f76968076e33efa7a0c0ecd516aa7c52 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 23:19:28 -0500 Subject: [PATCH 21/34] Fix some documentation and add beginning of a document generating script. --- doc/Parser.md | 2 +- doc/gendoc.janet | 62 ++++++++++++++++++++++++++++++++++++++++++++ src/core/core.janet | 63 ++++++++++++++++++++++++++++++--------------- 3 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 doc/gendoc.janet diff --git a/doc/Parser.md b/doc/Parser.md index 5e2fffed..9dccff65 100644 --- a/doc/Parser.md +++ b/doc/Parser.md @@ -218,7 +218,7 @@ Shorthand for `(quote x)` Shorthand for `(splice x)` -### \`x +### ~x Shorthand for `(quasiquote x)` diff --git a/doc/gendoc.janet b/doc/gendoc.janet new file mode 100644 index 00000000..6e221f0c --- /dev/null +++ b/doc/gendoc.janet @@ -0,0 +1,62 @@ +# Generate documentation + +(def- prelude + ``` + + + + + Janet Language Documentation + + + ```) + +(def- postlude + ``` + + ```) + +(def- escapes + {10 "
" + 09 "    " + 38 "&" + 60 "<" + 62 ">" + 34 """ + 39 "'" + 47 "/"}) + +(defn- trim-lead + "Trim leading newlines" + [str] + (var i 0) + (while (= 10 str.i) (++ i)) + (string/slice str i)) + +(defn- html-escape + "Escape special characters for HTML encoding." + [str] + (def buf @"") + (loop [byte :in str] + (if-let [rep escapes.byte] + (buffer/push-string buf rep) + (buffer/push-byte buf byte))) + buf) + +(defn- gen-one + "Generate documentation for a binding. Returns an + html fragment." + [key docstring] + (if-let [index (string/find "\n" docstring)] + (let [first-line (html-escape (string/slice docstring 0 index)) + rest (html-escape (trim-lead (string/slice docstring (inc index))))] + (string "

" first-line "

\n" + "

" rest "

\n")) + (string "

" (html-escape key) "

\n" + "

" (html-escape docstring) "

\n"))) + +(def parts (seq [[k {:doc d :private p}] :in (sort (pairs (table/getproto _env))) + :when (and d (not p))] + (gen-one k d))) + +(print prelude ;parts postlude) diff --git a/src/core/core.janet b/src/core/core.janet index 72ca03f0..1e607c22 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -84,25 +84,24 @@ (defn neg? "Check if x is less than 0." [x] (< x 0)) (defn one? "Check if x is equal to 1." [x] (== x 1)) (defn integer? "Check if x is an integer." [x] (= (type x) :integer)) -(defn real? [x] "Check if x is a real number." (= (type x) :real)) +(defn real? "Check if x is a real number." [x] (= (type x) :real)) (defn number? "Check if x is a number." [x] (def t (type x)) (if (= t :integer) true (= t :real))) (defn fiber? "Check if x is a fiber." [x] (= (type x) :fiber)) (defn string? "Check if x is a string." [x] (= (type x) :string)) (defn symbol? "Check if x is a symbol." [x] (= (type x) :symbol)) -(defn keyword? "Check if x is a keyword style symbol." - [x] +(defn keyword? "Check if x is a keyword style symbol." [x] (if (not= (type x) :symbol) nil (= 58 x.0))) (defn buffer? "Check if x is a buffer." [x] (= (type x) :buffer)) -(defn function? "Check if x is a function (not a cfunction)." - [x] (= (type x) :function)) +(defn function? "Check if x is a function (not a cfunction)." [x] + (= (type x) :function)) (defn cfunction? "Check if x a cfunction." [x] (= (type x) :cfunction)) -(defn table? [x] "Check if x a table." (= (type x) :table )) -(defn struct? [x] "Check if x a struct." (= (type x) :struct)) -(defn array? [x] "Check if x is an array." (= (type x) :array)) -(defn tuple? [x] "Check if x is a tuple." (= (type x) :tuple)) -(defn boolean? [x] "Check if x is a boolean." (= (type x) :boolean)) +(defn table? "Check if x a table." [x] (= (type x) :table )) +(defn struct? "Check if x a struct." [x] (= (type x) :struct)) +(defn array? "Check if x is an array." [x] (= (type x) :array)) +(defn tuple? "Check if x is a tuple." [x] (= (type x) :tuple)) +(defn boolean? "Check if x is a boolean." [x] (= (type x) :boolean)) (defn bytes? "Check if x is a string, symbol, or buffer." [x] (def t (type x)) (if (= t :string) true (if (= t :symbol) true (= t :buffer)))) @@ -434,12 +433,14 @@ (tuple fiber/new (tuple 'fn '[&] ;body))) (defn sum + "Returns the sum of xs. If xs is empty, returns 0." [xs] (var accum 0) (loop [x :in xs] (+= accum x)) accum) (defn product + "Returns the product of xs. If xs is empty, returns 1." [xs] (var accum 1) (loop [x :in xs] (*= accum x)) @@ -519,10 +520,23 @@ (if (order v ret) (:= ret v))) ret)) -(defn max [& args] (extreme > args)) -(defn min [& args] (extreme < args)) -(defn max-order [& args] (extreme order> args)) -(defn min-order [& args] (extreme order< args)) +(defn max + "Returns the numeric maximum of the arguments." + [& args] (extreme > args)) + +(defn min + "Returns the numeric minimum of the arguments." + [& args] (extreme < args)) + +(defn max-order + "Returns the maximum of the arguments according to a total + order over all values." + [& args] (extreme order> args)) + +(defn min-order + "Returns the minimum of the arguments according to a total + order over all values." + [& args] (extreme order< args)) (defn first "Get the first element from an indexed data structure." @@ -541,7 +555,7 @@ ### (def sort - "Sort an array in-place. Uses quicksort and is not a stable sort." + "(sort xs [, by])\n\nSort an array in-place. Uses quicksort and is not a stable sort." (do (defn partition @@ -567,7 +581,7 @@ (sort-help a (+ piv 1) hi by)) a) - (fn [a by &] + (fn sort [a by &] (sort-help a 0 (- (length a) 1) (or by order<))))) (defn sorted @@ -1167,19 +1181,24 @@ value, one key will be ignored." x)) ret) -(defn all [pred xs] +(defn all + [pred xs] + "Returns true if all xs are truthy, otherwise the first false or nil value." (var ret true) (loop [x :in xs :while ret] (:= ret (pred x))) ret) -(defn some [pred xs] +(defn some + [pred xs] + "Returns false if all xs are false or nil, otherwise returns the first true value." (var ret nil) (loop [x :in xs :while (not ret)] (if-let [y (pred x)] (:= ret y))) ret) -(defn deep-not= [x y] +(defn deep-not= "Like not=, but mutable types (arrays, tables, buffers) are considered equal if they have identical structure. Much slower than not=." + [x y] (def tx (type x)) (or (not= tx (type y)) @@ -1191,9 +1210,10 @@ value, one key will be ignored." :buffer (not= (string x) (string y)) (not= x y)))) -(defn deep= [x y] +(defn deep= "Like =, but mutable types (arrays, tables, buffers) are considered equal if they have identical structure. Much slower than =." + [x y] (not (deep-not= x y))) (defn macex @@ -1411,7 +1431,8 @@ value, one key will be ignored." path)) (def require - "Require a module with the given name. Will search all of the paths in + "(require module)\n\n + Require a module with the given name. Will search all of the paths in module/paths, then the path as a raw file path. Returns the new environment returned from compiling and running the file." (do From e286e8214445a9979fa09fbd0af2eddda6035b3e Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sat, 15 Dec 2018 23:22:51 -0500 Subject: [PATCH 22/34] Add docstring for make-env --- src/core/core.janet | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/core.janet b/src/core/core.janet index 1e607c22..b2dad05b 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -1236,6 +1236,9 @@ value, one key will be ignored." ### (defn make-env + "Create a new environment table. The new environment + will inherit bindings from the parent environment, but new + bindings will not pollute the parent environment." [parent &] (def parent (if parent parent _env)) (def newenv (table/setproto @{} parent)) From 8333c22e8a7db014875a850944b11afee2dbc4ed Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 13:17:30 -0500 Subject: [PATCH 23/34] Update gendoc and fix issue with run-context. --- doc/gendoc.janet | 5 +++-- src/core/core.janet | 28 +++++++++++++++------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/doc/gendoc.janet b/doc/gendoc.janet index 6e221f0c..ecfb2b05 100644 --- a/doc/gendoc.janet +++ b/doc/gendoc.janet @@ -55,8 +55,9 @@ (string "

" (html-escape key) "

\n" "

" (html-escape docstring) "

\n"))) -(def parts (seq [[k {:doc d :private p}] :in (sort (pairs (table/getproto _env))) +# Generate parts and print them to stdout +(def parts (seq [[k {:doc d :private p}] + :in (sort (pairs (table/getproto _env))) :when (and d (not p))] (gen-one k d))) - (print prelude ;parts postlude) diff --git a/src/core/core.janet b/src/core/core.janet index b2dad05b..2da8391b 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -520,7 +520,7 @@ (if (order v ret) (:= ret v))) ret)) -(defn max +(defn max "Returns the numeric maximum of the arguments." [& args] (extreme > args)) @@ -528,7 +528,7 @@ "Returns the numeric minimum of the arguments." [& args] (extreme < args)) -(defn max-order +(defn max-order "Returns the maximum of the arguments according to a total order over all values." [& args] (extreme order> args)) @@ -1181,7 +1181,7 @@ value, one key will be ignored." x)) ret) -(defn all +(defn all [pred xs] "Returns true if all xs are truthy, otherwise the first false or nil value." (var ret true) @@ -1297,20 +1297,19 @@ value, one key will be ignored." (buffer/clear buf) (chunks buf p) (var pindex 0) + (var pstatus nil) (def len (length buf)) (if (= len 0) (:= going false)) (while (> len pindex) (+= pindex (parser/consume p buf pindex)) - (case (parser/status p) - :full (eval1 (parser/produce p)) - :error (do - (def (line col) (parser/where p)) - (onstatus :parse - (string (parser/error p) - " on line " line - ", column " col) - nil - where))))) + (while (= (:= pstatus (parser/status p)) :full) + (eval1 (parser/produce p))) + (when (= pstatus :error) + (onstatus :parse + (string (parser/error p) + " around byte " (parser/where p)) + nil + where)))) (:= *env* oldenv) @@ -1495,6 +1494,9 @@ value, one key will be ignored." newenv))))) (defn import* + "Import a module into a given environment table. This is the + functional form of (import ...) that expects and explicit environment + table." [env path & args] (def targs (table ;args)) (def {:as as From 696866ae516e29b88ab1d2f1555258dc6196bef6 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 17:59:16 -0500 Subject: [PATCH 24/34] Add textmate syntax highlighting file. --- examples/3sum.janet | 2 +- grammar/janet.tmLanguage | 330 +++++++++++++++++++++++++++++++++++++++ grammar/tmcorelib.janet | 30 ++++ 3 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 grammar/janet.tmLanguage create mode 100644 grammar/tmcorelib.janet diff --git a/examples/3sum.janet b/examples/3sum.janet index 21bac9bd..9b3c1d6a 100644 --- a/examples/3sum.janet +++ b/examples/3sum.janet @@ -11,4 +11,4 @@ (def k (get tab (- 0 s@i s@j))) (when (and k (not= k i) (not= k j) (not= i j)) (put solutions {i true j true k true} true)))) - (map keys (keys solution))) + (map keys (keys solution))) \ No newline at end of file diff --git a/grammar/janet.tmLanguage b/grammar/janet.tmLanguage new file mode 100644 index 00000000..77fb9efe --- /dev/null +++ b/grammar/janet.tmLanguage @@ -0,0 +1,330 @@ + + + + + fileTypes + + janet + + foldingStartMarker + \{ + foldingStopMarker + \} + foldingStartMarker + \[ + foldingStopMarker + \] + foldingStartMarker + \( + foldingStopMarker + \) + keyEquivalent + ^~L + name + Janet + patterns + + + include + #all + + + repository + + all + + patterns + + + include + #comment + + + include + #parens + + + include + #brackets + + + include + #braces + + + include + #readermac + + + include + #literal + + + include + #corelib + + + include + #r-number + + + include + #dec-number + + + include + #hex-number + + + include + #keysym + + + include + #symbol + + + include + #string + + + include + #longstring + + + + comment + + captures + + 1 + + name + punctuation.definition.comment.janet + + + match + (#).*$ + name + comment.line.janet + + braces + + begin + (@?{) + captures + + 1 + + name + punctuation.definition.braces.begin.janet + + + end + (}) + captures + + 1 + + name + punctuation.definition.braces.end.janet + + + patterns + + + include + #all + + + + brackets + + begin + (@?\[) + captures + + 1 + + name + punctuation.definition.brackets.begin.janet + + + end + (\]) + captures + + 1 + + name + punctuation.definition.brackets.end.janet + + + patterns + + + include + #all + + + + parens + + begin + (@?\() + captures + + 1 + + name + punctuation.definition.parens.begin.janet + + + end + (\)) + captures + + 1 + + name + punctuation.definition.parens.end.janet + + + patterns + + + include + #all + + + + readermac + + match + [\'\~\;\,] + name + punctuation.other.janet + + + literal + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>])(true|false|nil)(?![\.:\w_\-=!@\$%^&?|\\/<>]) + name + constant.language.janet + + corelib + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>])(def|do|fn|if|quasiquote|quote|splice|unquote|while|%|%=|&|&=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|/|/=|<|<<|<<=|<=|=|==|>|>=|>>|>>=|>>>|>>>=|\^|\^=|_env|abstract\?|all|all\-symbols|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|bnot|boolean\?|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll|\||\|=)(?![\.:\w_\-=!@\$%^&?|\\/<>]) + name + keyword.control.janet + + keysym + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>]):[\.:\w_\-=!@\$%^&?|\\/<>]* + name + constant.keyword.janet + + symbol + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>])[\.a-zA-Z_\-=!@\$%^&?|\\/<>][\.:\w_\-=!@\$%^&?|\\/<>]* + name + variable.other.janet + + hex-number + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>])[-+]?0x([_\da-fA-F]+|[_\da-fA-F]+\.[_\da-fA-F]*|\.[_\da-fA-F]+)(&[+-]?[\da-fA-F]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>]) + name + constant.numeric.hex.janet + + dec-number + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>])[-+]?([_\d]+|[_\d]+\.[_\d]*|\.[_\d]+)([eE&][+-]?[\d]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>]) + name + constant.numeric.decimal.janet + + r-number + + match + (?<![\.:\w_\-=!@\$%^&?|\\/<>])[-+]?\d\d?r([_\w]+|[_\w]+\.[_\w]*|\.[_\w]+)(&[+-]?[\w]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>]) + name + constant.numeric.decimal.janet + + string + + begin + (@?") + beginCaptures + + 0 + + name + punctuation.definition.string.begin.janet + + + end + (") + endCaptures + + 0 + + name + punctuation.definition.string.end.janet + + + name + string.quoted.double.janet + patterns + + + match + (\\[ne0zft"\\']|\\x[0-9a-fA-F][0-9a-fA-f]) + name + constant.character.escape.janet + + + + longstring + + begin + @?(`+) + beginCaptures + + 0 + + name + punctuation.definition.string.begin.janet + + + end + \1 + endCaptures + + 0 + + name + punctuation.definition.string.end.janet + + + name + string.quoted.triple.janet + + nomatch + + match + \S+ + name + invalid.illegal.janet + + + scopeName + source.janet + uuid + 3743190f-20c4-44d0-8640-6611a983296b + + diff --git a/grammar/tmcorelib.janet b/grammar/tmcorelib.janet new file mode 100644 index 00000000..3255d602 --- /dev/null +++ b/grammar/tmcorelib.janet @@ -0,0 +1,30 @@ +# Helper to generate core library mappings for janet + +(def allsyms (all-symbols)) + +(def- escapes + {(get "|" 0) `\|` + (get "-" 0) `\-` + (get "+" 0) `\+` + (get "*" 0) `\*` + (get "^" 0) `\^` + (get "$" 0) `\$` + (get "?" 0) `\?` + 38 "&" + 60 "<" + 62 ">" + 34 """ + 39 "'" + 47 "/"}) + +(defn- escape + "Escape special characters for HTML encoding." + [str] + (def buf @"") + (loop [byte :in str] + (if-let [rep escapes.byte] + (buffer/push-string buf rep) + (buffer/push-byte buf byte))) + buf) + +(print (string/join (map escape allsyms)) "|")) From 22e49bc0fc467e6fc847c6d8fc6c75984513c398 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 18:00:18 -0500 Subject: [PATCH 25/34] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c20c6166..a20559bc 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ The few features that are not standard C (dynamic library loading, compiler spec are fairly straight forward. Janet can be easily ported to new platforms. For syntax highlighting, there is some preliminary vim syntax highlighting in [janet.vim](https://github.com/bakpakin/janet.vim). -Generic lisp syntax highlighting should, however, provide good results. +Generic lisp syntax highlighting should, however, provide good results. There is also a janet.tmLanguage file +that should provide good syntax highlighting for many editors. ## Use Cases From f7a25ecae3d327417794470004e76b22421c2b81 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 21:30:58 -0500 Subject: [PATCH 26/34] Update grammar --- grammar/janet.tmLanguage | 33 +++++++++++++++++++-------------- grammar/tmcorelib.janet | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/grammar/janet.tmLanguage b/grammar/janet.tmLanguage index 77fb9efe..f9f036a1 100644 --- a/grammar/janet.tmLanguage +++ b/grammar/janet.tmLanguage @@ -55,6 +55,14 @@ include #readermac + + include + #string + + + include + #longstring + include #literal @@ -83,14 +91,6 @@ include #symbol - - include - #string - - - include - #longstring - comment @@ -261,7 +261,7 @@ (@?") beginCaptures - 0 + 1 name punctuation.definition.string.begin.janet @@ -271,7 +271,7 @@ (") endCaptures - 0 + 1 name punctuation.definition.string.end.janet @@ -292,20 +292,25 @@ longstring begin - @?(`+) + (@?)(`+) beginCaptures - 0 + 1 + + name + punctuation.definition.string.begin.janet + + 2 name punctuation.definition.string.begin.janet end - \1 + \2 endCaptures - 0 + 1 name punctuation.definition.string.end.janet diff --git a/grammar/tmcorelib.janet b/grammar/tmcorelib.janet index 3255d602..b1e9d5dd 100644 --- a/grammar/tmcorelib.janet +++ b/grammar/tmcorelib.janet @@ -18,7 +18,7 @@ 47 "/"}) (defn- escape - "Escape special characters for HTML encoding." + "Escape special characters for HTML and regex encoding." [str] (def buf @"") (loop [byte :in str] From 03dbd79165098a4b74470cc767431534701f6b0e Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 21:57:32 -0500 Subject: [PATCH 27/34] Rename the := special form to set so it does not look like a keyword. --- doc/Introduction.md | 6 +- examples/lazyseqs.janet | 4 +- examples/life.janet | 4 +- examples/primes.janet | 2 +- grammar/janet.tmLanguage | 16 ++--- src/core/core.janet | 138 +++++++++++++++++++------------------- src/core/specials.c | 3 +- src/mainclient/init.janet | 12 ++-- test/helper.janet | 2 +- test/suite0.janet | 22 +++--- test/suite1.janet | 4 +- 11 files changed, 106 insertions(+), 107 deletions(-) diff --git a/doc/Introduction.md b/doc/Introduction.md index 809cd19f..c4eb87f4 100644 --- a/doc/Introduction.md +++ b/doc/Introduction.md @@ -83,7 +83,7 @@ return a real number (never an integer!) Janet supports several varieties of types that can be used as labels for things in your program. The most useful type for this purpose is the keyword type. A keyword begins with a semicolon, and then contains 0 or more alphanumeric or a few other common -characters. For example, `:hello`, `:my-name`, `:=`, and `:ABC123_-*&^%$` are all keywords. +characters. For example, `:hello`, `:my-name`, `::`, and `:ABC123_-*&^%$` are all keywords. Keywords are actually just special cases of symbols, which are similar but don't start with a semicolon. The difference between symbols and keywords is that keywords evaluate to themselves, while symbols evaluate to whatever they are bound to. To have a symbol evaluate to itself, it must be @@ -247,13 +247,13 @@ symbols will raise an error. Bindings created with def have lexical scoping. Also, bindings created with def are immutable; they cannot be changed after definition. For mutable bindings, like variables in other programming -languages, use the `var` keyword. The assignment special form `:=` can then be used to update +languages, use the `var` keyword. The assignment special form `set` can then be used to update a var. ``` (var myvar 1) (print myvar) -(:= myvar 10) +(set myvar 10) (print myvar) ``` diff --git a/examples/lazyseqs.janet b/examples/lazyseqs.janet index 3ed21a7a..e024e44b 100644 --- a/examples/lazyseqs.janet +++ b/examples/lazyseqs.janet @@ -18,8 +18,8 @@ (if ,loaded ,state (do - (:= ,loaded true) - (:= ,state (do ;forms))))))) + (set ,loaded true) + (set ,state (do ;forms))))))) # Use tuples instead of structs to save memory (def- HEAD 0) diff --git a/examples/life.janet b/examples/life.janet index 846acd22..64b82988 100644 --- a/examples/life.janet +++ b/examples/life.janet @@ -24,7 +24,7 @@ "Draw cells in the game of life from (x1, y1) to (x2, y2)" [state x1 y1 x2 y2] (def cellset @{}) - (each cell state (:= cellset@cell true)) + (each cell state (set cellset@cell true)) (loop [x :range [x1 (+ 1 x2)] :after (print) y :range [y1 (+ 1 y2)]] @@ -40,4 +40,4 @@ (for i 0 20 (print "generation " i) (draw *state* -7 -7 7 7) - (:= *state* (tick *state*))) + (set *state* (tick *state*))) diff --git a/examples/primes.janet b/examples/primes.janet index 6cf80693..38cc91fe 100644 --- a/examples/primes.janet +++ b/examples/primes.janet @@ -9,6 +9,6 @@ (def len (length list)) (for j 0 len (def trial (get list j)) - (if (zero? (% i trial)) (:= isprime? false))) + (if (zero? (% i trial)) (set isprime? false))) (if isprime? (array/push list i))) list) diff --git a/grammar/janet.tmLanguage b/grammar/janet.tmLanguage index f9f036a1..ef8cf7f7 100644 --- a/grammar/janet.tmLanguage +++ b/grammar/janet.tmLanguage @@ -205,53 +205,53 @@ name punctuation.other.janet - + literal match - (?<![\.:\w_\-=!@\$%^&?|\\/<>])(true|false|nil)(?![\.:\w_\-=!@\$%^&?|\\/<>]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])(true|false|nil)(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name constant.language.janet corelib match - (?<![\.:\w_\-=!@\$%^&?|\\/<>])(def|do|fn|if|quasiquote|quote|splice|unquote|while|%|%=|&|&=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|/|/=|<|<<|<<=|<=|=|==|>|>=|>>|>>=|>>>|>>>=|\^|\^=|_env|abstract\?|all|all\-symbols|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|bnot|boolean\?|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll|\||\|=)(?![\.:\w_\-=!@\$%^&?|\\/<>]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])(def|do|fn|if|quasiquote|quote|set|splice|unquote|var|while|%|%=|&|&=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|/|/=|<|<<|<<=|<=|=|==|>|>=|>>|>>=|>>>|>>>=|\^|\^=|_env|abstract\?|all|all\-symbols|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|bnot|boolean\?|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll|\||\|=)(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name keyword.control.janet keysym match - (?<![\.:\w_\-=!@\$%^&?|\\/<>]):[\.:\w_\-=!@\$%^&?|\\/<>]* + (?<![\.:\w_\-=!@\$%^&?|\\/<>*]):[\.:\w_\-=!@\$%^&?|\\/<>*]* name constant.keyword.janet symbol match - (?<![\.:\w_\-=!@\$%^&?|\\/<>])[\.a-zA-Z_\-=!@\$%^&?|\\/<>][\.:\w_\-=!@\$%^&?|\\/<>]* + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])[\.a-zA-Z_\-=!@\$%^&?|\\/<>*][\.:\w_\-=!@\$%^&?|\\/<>*]* name variable.other.janet hex-number match - (?<![\.:\w_\-=!@\$%^&?|\\/<>])[-+]?0x([_\da-fA-F]+|[_\da-fA-F]+\.[_\da-fA-F]*|\.[_\da-fA-F]+)(&[+-]?[\da-fA-F]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])[-+]?0x([_\da-fA-F]+|[_\da-fA-F]+\.[_\da-fA-F]*|\.[_\da-fA-F]+)(&[+-]?[\da-fA-F]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name constant.numeric.hex.janet dec-number match - (?<![\.:\w_\-=!@\$%^&?|\\/<>])[-+]?([_\d]+|[_\d]+\.[_\d]*|\.[_\d]+)([eE&][+-]?[\d]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])[-+]?([_\d]+|[_\d]+\.[_\d]*|\.[_\d]+)([eE&][+-]?[\d]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name constant.numeric.decimal.janet r-number match - (?<![\.:\w_\-=!@\$%^&?|\\/<>])[-+]?\d\d?r([_\w]+|[_\w]+\.[_\w]*|\.[_\w]+)(&[+-]?[\w]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])[-+]?\d\d?r([_\w]+|[_\w]+\.[_\w]*|\.[_\w]+)(&[+-]?[\w]+)?(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name constant.numeric.decimal.janet diff --git a/src/core/core.janet b/src/core/core.janet index 2da8391b..fe70455d 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -25,7 +25,7 @@ i (do (if (= t :string) - (:= docstr ith) + (set docstr ith) (array/push modifiers ith)) (if (< i len) (recur (+ i 1))))))) (def start (fstart 0)) @@ -37,7 +37,7 @@ (while (< index arglen) (buffer/push-string buf " ") (string/pretty args.index 4 buf) - (:= index (+ index 1))) + (set index (+ index 1))) (array/push modifiers (string buf ")\n\n" docstr)) # Build return value ~(def ,name ,;modifiers (fn ,name ,;(tuple/slice more start))))) @@ -149,19 +149,19 @@ # C style macros and functions for imperative sugar (defn inc "Returns x + 1." [x] (+ x 1)) (defn dec "Returns x - 1." [x] (- x 1)) -(defmacro ++ "Increments the var x by 1." [x] ~(:= ,x (,+ ,x ,1))) -(defmacro -- "Decrements the var x by 1." [x] ~(:= ,x (,- ,x ,1))) -(defmacro += "Increments the var x by n." [x n] ~(:= ,x (,+ ,x ,n))) -(defmacro -= "Decrements the vat x by n." [x n] ~(:= ,x (,- ,x ,n))) -(defmacro *= "Shorthand for (:= x (* x n))." [x n] ~(:= ,x (,* ,x ,n))) -(defmacro /= "Shorthand for (:= x (/ x n))." [x n] ~(:= ,x (,/ ,x ,n))) -(defmacro %= "Shorthand for (:= x (% x n))." [x n] ~(:= ,x (,% ,x ,n))) -(defmacro &= "Shorthand for (:= x (& x n))." [x n] ~(:= ,x (,& ,x ,n))) -(defmacro |= "Shorthand for (:= x (| x n))." [x n] ~(:= ,x (,| ,x ,n))) -(defmacro ^= "Shorthand for (:= x (^ x n))." [x n] ~(:= ,x (,^ ,x ,n))) -(defmacro >>= "Shorthand for (:= x (>> x n))." [x n] ~(:= ,x (,>> ,x ,n))) -(defmacro <<= "Shorthand for (:= x (<< x n))." [x n] ~(:= ,x (,<< ,x ,n))) -(defmacro >>>= "Shorthand for (:= x (>>> x n))." [x n] ~(:= ,x (,>>> ,x ,n))) +(defmacro ++ "Increments the var x by 1." [x] ~(set ,x (,+ ,x ,1))) +(defmacro -- "Decrements the var x by 1." [x] ~(set ,x (,- ,x ,1))) +(defmacro += "Increments the var x by n." [x n] ~(set ,x (,+ ,x ,n))) +(defmacro -= "Decrements the vat x by n." [x n] ~(set ,x (,- ,x ,n))) +(defmacro *= "Shorthand for (set x (* x n))." [x n] ~(set ,x (,* ,x ,n))) +(defmacro /= "Shorthand for (set x (/ x n))." [x n] ~(set ,x (,/ ,x ,n))) +(defmacro %= "Shorthand for (set x (% x n))." [x n] ~(set ,x (,% ,x ,n))) +(defmacro &= "Shorthand for (set x (& x n))." [x n] ~(set ,x (,& ,x ,n))) +(defmacro |= "Shorthand for (set x (| x n))." [x n] ~(set ,x (,| ,x ,n))) +(defmacro ^= "Shorthand for (set x (^ x n))." [x n] ~(set ,x (,^ ,x ,n))) +(defmacro >>= "Shorthand for (set x (>> x n))." [x n] ~(set ,x (,>> ,x ,n))) +(defmacro <<= "Shorthand for (set x (<< x n))." [x n] ~(set ,x (,<< ,x ,n))) +(defmacro >>>= "Shorthand for (set x (>>> x n))." [x n] ~(set ,x (,>>> ,x ,n))) (defmacro default "Define a default value for an optional argument. @@ -248,7 +248,7 @@ (var i len) (while (> i 0) (-- i) - (:= ret (if (= ret true) + (set ret (if (= ret true) forms.i (tuple 'if forms.i ret)))) ret) @@ -263,7 +263,7 @@ (while (> i 0) (-- i) (def fi forms.i) - (:= ret (if (idempotent? fi) + (set ret (if (idempotent? fi) (tuple 'if fi fi ret) (do (def $fi (gensym)) @@ -331,13 +331,13 @@ (tuple 'var $iter 0) (tuple 'while (tuple/slice spreds) - (tuple := $iter (tuple + 1 $iter)) + (tuple 'set $iter (tuple + 1 $iter)) sub))) (error (string "unexpected loop predicate: " bindings))) (case verb :iterate (do (def $iter (gensym)) - (def preds @['and (tuple ':= $iter object)]) + (def preds @['and (tuple 'set $iter object)]) (def subloop (doone (+ i 3) preds)) (tuple 'do (tuple 'var $iter nil) @@ -357,7 +357,7 @@ (tuple 'while (tuple/slice preds) (tuple 'def bindings $iter) subloop - (tuple ':= $iter (tuple + $iter inc))))) + (tuple 'set $iter (tuple + $iter inc))))) :keys (do (def $dict (gensym)) (def $iter (gensym)) @@ -369,7 +369,7 @@ (tuple 'while (tuple/slice preds) (tuple 'def bindings $iter) subloop - (tuple ':= $iter (tuple next $dict $iter))))) + (tuple 'set $iter (tuple next $dict $iter))))) :in (do (def $len (gensym)) (def $i (gensym)) @@ -383,7 +383,7 @@ (tuple 'while (tuple/slice preds 0) (tuple 'def bindings (tuple get $indexed $i)) subloop - (tuple ':= $i (tuple + 1 $i))))) + (tuple 'set $i (tuple + 1 $i))))) :generate (do (def $fiber (gensym)) (def $yieldval (gensym)) @@ -400,7 +400,7 @@ (tuple 'while (tuple/slice preds 0) (tuple 'def bindings $yieldval) subloop - (tuple := $yieldval (tuple resume $fiber))))) + (tuple 'set $yieldval (tuple resume $fiber))))) (error (string "unexpected loop verb: " verb))))))) (doone 0 nil)) @@ -517,7 +517,7 @@ (var ret args.0) (loop [i :range [0 len]] (def v args.i) - (if (order v ret) (:= ret v))) + (if (order v ret) (set ret v))) ret)) (defn max @@ -566,11 +566,11 @@ (def aj a.j) (when (by aj pivot) (def ai a.i) - (:= a.i aj) - (:= a.j ai) + (set a.i aj) + (set a.j ai) (++ i))) - (:= a.hi a.i) - (:= a.i pivot) + (set a.hi a.i) + (set a.i pivot) i) (defn sort-help @@ -595,7 +595,7 @@ [f init ind] (var res init) (loop [x :in ind] - (:= res (f res x))) + (set res (f res x))) res) (defn map @@ -607,18 +607,18 @@ (var limit (length inds.0)) (loop [i :range [0 ninds]] (def l (length inds.i)) - (if (< l limit) (:= limit l))) + (if (< l limit) (set limit l))) (def [i1 i2 i3 i4] inds) (def res (array/new limit)) (case ninds - 1 (loop [i :range [0 limit]] (:= res.i (f i1.i))) - 2 (loop [i :range [0 limit]] (:= res.i (f i1.i i2.i))) - 3 (loop [i :range [0 limit]] (:= res.i (f i1.i i2.i i3.i))) - 4 (loop [i :range [0 limit]] (:= res.i (f i1.i i2.i i3.i i4.i))) + 1 (loop [i :range [0 limit]] (set res.i (f i1.i))) + 2 (loop [i :range [0 limit]] (set res.i (f i1.i i2.i))) + 3 (loop [i :range [0 limit]] (set res.i (f i1.i i2.i i3.i))) + 4 (loop [i :range [0 limit]] (set res.i (f i1.i i2.i i3.i i4.i))) (loop [i :range [0 limit]] (def args (array/new ninds)) - (loop [j :range [0 ninds]] (:= args.j inds.j.i)) - (:= res.i (f ;args)))) + (loop [j :range [0 ninds]] (set args.j inds.j.i)) + (set res.i (f ;args)))) res) (defn mapcat @@ -691,7 +691,7 @@ (var going true) (while (if (< i len) going) (def item ind.i) - (if (pred item) (:= going false) (++ i))) + (if (pred item) (set going false) (++ i))) (if going nil i)) (defn find @@ -784,7 +784,7 @@ [ind] (var res true) (loop [x :in ind :while res] - (if x nil (:= res x))) + (if x nil (set res x))) res) (defn reverse @@ -825,7 +825,7 @@ value, one key will be ignored." The key then, is associated to the function's return value" [coll a-key a-function & args] (def old-value coll.a-key) - (:= coll.a-key (a-function old-value ;args))) + (set coll.a-key (a-function old-value ;args))) (defn merge-into "Merges multiple tables/structs into a table. If a key appears in more than one @@ -834,7 +834,7 @@ value, one key will be ignored." [tab & colls] (loop [c :in colls key :keys c] - (:= tab.key c.key)) + (set tab.key c.key)) tab) (defn merge @@ -845,7 +845,7 @@ value, one key will be ignored." (def container @{}) (loop [c :in colls key :keys c] - (:= container.key c.key)) + (set container.key c.key)) container) (defn keys @@ -855,7 +855,7 @@ value, one key will be ignored." (var k (next x nil)) (while (not= nil k) (array/push arr k) - (:= k (next x k))) + (set k (next x k))) arr) (defn values @@ -865,7 +865,7 @@ value, one key will be ignored." (var k (next x nil)) (while (not= nil k) (array/push arr x.k) - (:= k (next x k))) + (set k (next x k))) arr) (defn pairs @@ -875,7 +875,7 @@ value, one key will be ignored." (var k (next x nil)) (while (not= nil k) (array/push arr (tuple k x.k)) - (:= k (next x k))) + (set k (next x k))) arr) (defn frequencies @@ -885,7 +885,7 @@ value, one key will be ignored." (loop [x :in ind] (def n freqs.x) - (:= freqs.x (if n (+ 1 n) 1))) + (set freqs.x (if n (+ 1 n) 1))) freqs) (defn interleave @@ -906,7 +906,7 @@ value, one key will be ignored." [xs] (def ret @[]) (def seen @{}) - (loop [x :in xs] (if seen.x nil (do (:= seen.x true) (array/push ret x)))) + (loop [x :in xs] (if seen.x nil (do (set seen.x true) (array/push ret x)))) ret) (defn flatten-into @@ -939,7 +939,7 @@ value, one key will be ignored." [sep ind] (def len (length ind)) (def ret (array/new (- (* 2 len) 1))) - (if (> len 0) (:= ret.0 ind.0)) + (if (> len 0) (set ret.0 ind.0)) (var i 1) (while (< i len) (array/push ret sep ind.i) @@ -991,7 +991,7 @@ value, one key will be ignored." $dict expr ~(if (dictionary? ,$dict) ,((fn aux [] - (:= key (next pattern key)) + (set key (next pattern key)) (if (= key nil) (onmatch) (match-1 (get pattern key) (tuple get $dict key) aux seen)))) @@ -1049,7 +1049,7 @@ value, one key will be ignored." (def oldcur current) (def spacer (if (<= maxcol (+ current (length word) 1)) - (do (:= current 0) "\n ") + (do (set current 0) "\n ") (do (++ current) " "))) (+= current (length word)) (if (> oldcur 0) @@ -1066,7 +1066,7 @@ value, one key will be ignored." (if (> (length word) 0) (pushword)) (when (= b 10) (buffer/push-string buf "\n ") - (:= current 0))))) + (set current 0))))) # Last word (pushword) @@ -1103,7 +1103,7 @@ value, one key will be ignored." (var key (next t nil)) (while (not= nil key) (put newt (macex1 key) (on-value t.key)) - (:= key (next t key))) + (set key (next t key))) newt) (defn expand-bindings [x] @@ -1151,7 +1151,7 @@ value, one key will be ignored." (tuple t.0 (qq t.1))) (def specs - {':= expanddef + {'set expanddef 'def expanddef 'do expandall 'fn expandfn @@ -1185,14 +1185,14 @@ value, one key will be ignored." [pred xs] "Returns true if all xs are truthy, otherwise the first false or nil value." (var ret true) - (loop [x :in xs :while ret] (:= ret (pred x))) + (loop [x :in xs :while ret] (set ret (pred x))) ret) (defn some [pred xs] "Returns false if all xs are false or nil, otherwise returns the first true value." (var ret nil) - (loop [x :in xs :while (not ret)] (if-let [y (pred x)] (:= ret y))) + (loop [x :in xs :while (not ret)] (if-let [y (pred x)] (set ret y))) ret) (defn deep-not= @@ -1225,8 +1225,8 @@ value, one key will be ignored." (while (deep-not= current previous) (if (> (++ counter) 200) (error "macro expansion too nested")) - (:= previous current) - (:= current (macex1 current))) + (set previous current) + (set current (macex1 current))) current) ### @@ -1274,7 +1274,7 @@ value, one key will be ignored." (if (= (type res) :function) (res) (do - (:= good false) + (set good false) (def {:error err :start start :end end :fiber errf} res) (onstatus :compile @@ -1289,7 +1289,7 @@ value, one key will be ignored." (if going (onstatus (fiber/status f) res f where)))) (def oldenv *env*) - (:= *env* env) + (set *env* env) # Run loop (def buf @"") @@ -1299,10 +1299,10 @@ value, one key will be ignored." (var pindex 0) (var pstatus nil) (def len (length buf)) - (if (= len 0) (:= going false)) + (if (= len 0) (set going false)) (while (> len pindex) (+= pindex (parser/consume p buf pindex)) - (while (= (:= pstatus (parser/status p)) :full) + (while (= (set pstatus (parser/status p)) :full) (eval1 (parser/produce p))) (when (= pstatus :error) (onstatus :parse @@ -1311,7 +1311,7 @@ value, one key will be ignored." nil where)))) - (:= *env* oldenv) + (set *env* oldenv) env) @@ -1369,7 +1369,7 @@ value, one key will be ignored." (var state (string str)) (defn chunks [buf _] (def ret state) - (:= state nil) + (set state nil) (when ret (buffer/push-string buf str) (buffer/push-string buf "\n"))) @@ -1377,7 +1377,7 @@ value, one key will be ignored." (run-context *env* chunks (fn [sig x f source] (if (= sig :dead) - (:= returnval x) + (set returnval x) (status-pp sig x f source))) "eval") returnval) @@ -1470,8 +1470,8 @@ value, one key will be ignored." check (do (def newenv (make-env)) - (:= cache.path newenv) - (:= loading.path true) + (set cache.path newenv) + (set loading.path true) (def f (find-mod path)) (if f (do @@ -1490,7 +1490,7 @@ value, one key will be ignored." (if (not n) (error (string "could not open file for module " path))) ((native n) newenv))) - (:= loading.path false) + (set loading.path false) newenv))))) (defn import* @@ -1510,7 +1510,7 @@ value, one key will be ignored." (when (not v:private) (def newv (table/setproto @{:private true} v)) (put env (symbol prefix k) newv)) - (:= k (next newenv k)))) + (set k (next newenv k)))) (defmacro import "Import a module. First requires the module, and then merges its @@ -1547,9 +1547,9 @@ value, one key will be ignored." [env &] (default env *env*) (def envs @[]) - (do (var e env) (while e (array/push envs e) (:= e (table/getproto e)))) + (do (var e env) (while e (array/push envs e) (set e (table/getproto e)))) (def symbol-set @{}) (loop [envi :in envs k :keys envi] - (:= symbol-set.k true)) + (set symbol-set.k true)) (sort (keys symbol-set))) diff --git a/src/core/specials.c b/src/core/specials.c index ab7b56ad..3b32484d 100644 --- a/src/core/specials.c +++ b/src/core/specials.c @@ -648,16 +648,15 @@ error2: /* Keep in lexicographic order */ static const JanetSpecial janetc_specials[] = { - {":=", janetc_varset}, {"def", janetc_def}, {"do", janetc_do}, {"fn", janetc_fn}, {"if", janetc_if}, {"quasiquote", janetc_quasiquote}, {"quote", janetc_quote}, + {"set", janetc_varset}, {"splice", janetc_splice}, {"unquote", janetc_unquote}, - {"unquote", janetc_unquote}, {"var", janetc_var}, {"while", janetc_while} }; diff --git a/src/mainclient/init.janet b/src/mainclient/init.janet index 5ac289eb..25ee876c 100644 --- a/src/mainclient/init.janet +++ b/src/mainclient/init.janet @@ -24,12 +24,12 @@ (os/exit 0) 1) "v" (fn [&] (print janet/version "-" janet/build) (os/exit 0) 1) - "s" (fn [&] (:= *raw-stdin* true) (:= *should-repl* true) 1) - "r" (fn [&] (:= *should-repl* true) 1) - "p" (fn [&] (:= *exit-on-error* false) 1) - "-" (fn [&] (:= *handleopts* false) 1) + "s" (fn [&] (set *raw-stdin* true) (set *should-repl* true) 1) + "r" (fn [&] (set *should-repl* true) 1) + "p" (fn [&] (set *exit-on-error* false) 1) + "-" (fn [&] (set *handleopts* false) 1) "e" (fn [i &] - (:= *no-file* false) + (set *no-file* false) (eval (get process/args (+ i 1))) 2)}) @@ -45,7 +45,7 @@ (if (and *handleopts* (= "-" (string/slice arg 0 1))) (+= i (dohandler (string/slice arg 1 2) i)) (do - (:= *no-file* false) + (set *no-file* false) (import* _env arg :prefix "" :exit *exit-on-error*) (++ i)))) diff --git a/test/helper.janet b/test/helper.janet index f0478341..2f02847e 100644 --- a/test/helper.janet +++ b/test/helper.janet @@ -13,7 +13,7 @@ x) (defn start-suite [x] - (:= suite-num x) + (set suite-num x) (print "\nRunning test suite " x " tests...\n")) (defn end-suite [] diff --git a/test/suite0.janet b/test/suite0.janet index 957629f5..ef9e3480 100644 --- a/test/suite0.janet +++ b/test/suite0.janet @@ -80,7 +80,7 @@ # Mcarthy's 91 function (var f91 nil) -(:= f91 (fn [n] (if (> n 100) (- n 10) (f91 (f91 (+ n 11)))))) +(set f91 (fn [n] (if (> n 100) (- n 10) (f91 (f91 (+ n 11)))))) (assert (= 91 (f91 10)) "f91(10) = 91") (assert (= 91 (f91 11)) "f91(11) = 91") (assert (= 91 (f91 20)) "f91(20) = 91") @@ -92,7 +92,7 @@ (assert (= 94 (f91 104)) "f91(104) = 94") # Fibonacci -(def fib (do (var fib nil) (:= fib (fn [n] (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))))) +(def fib (do (var fib nil) (set fib (fn [n] (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))))) (def fib2 (fn fib2 [n] (if (< n 2) n (+ (fib2 (- n 1)) (fib2 (- n 2)))))) (assert (= (fib 0) (fib2 0) 0) "fib(0)") @@ -127,15 +127,15 @@ (var accum 1) (var count 0) (while (< count 16) - (:= accum (<< accum 1)) - (:= count (+ 1 count))) + (set accum (<< accum 1)) + (set count (+ 1 count))) (assert (= accum 65536) "loop in closure"))) (var accum 1) (var count 0) (while (< count 16) - (:= accum (<< accum 1)) - (:= count (+ 1 count))) + (set accum (<< accum 1)) + (set count (+ 1 count))) (assert (= accum 65536) "loop globally") (assert (= (struct 1 2 3 4 5 6 7 8) (struct 7 8 5 6 3 4 1 2)) "struct order does not matter 1") @@ -228,18 +228,18 @@ (def xi (get xs i)) (def yj (get ys j)) (if (< xi yj) - (do (array/push ret xi) (:= i (+ i 1))) - (do (array/push ret yj) (:= j (+ j 1))))) + (do (array/push ret xi) (set i (+ i 1))) + (do (array/push ret yj) (set j (+ j 1))))) # Push rest of xs (while (< i xlen) (def xi (get xs i)) (array/push ret xi) - (:= i (+ i 1))) + (set i (+ i 1))) # Push rest of ys (while (< j ylen) (def yj (get ys j)) (array/push ret yj) - (:= j (+ j 1))) + (set j (+ j 1))) ret) (assert (apply <= (merge @[1 3 5] @[2 4 6])) "merge sort merge 1") @@ -255,7 +255,7 @@ (var count 0) (while (< count 128) (put syms (gensym) true) - (:= count (+ 1 count))) + (set count (+ 1 count))) (assert (= (length syms) 128) "many symbols"))) # Let diff --git a/test/suite1.janet b/test/suite1.janet index 43228445..39f6d207 100644 --- a/test/suite1.janet +++ b/test/suite1.janet @@ -33,7 +33,7 @@ (defn myfun [x] (var a 10) - (:= a (do + (set a (do (def y x) (if x 8 9)))) @@ -44,7 +44,7 @@ (var good true) (loop [i :range [0 n]] (if (not (f)) - (:= good false))) + (set good false))) (assert good e)) (assert-many (fn [] (>= 1 (math/random) 0)) 200 "(random) between 0 and 1") From 99e14a9b70cff651e4859f624517c3fcaa0ef690 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 22:13:48 -0500 Subject: [PATCH 28/34] Rename bitwise operators. --- grammar/janet.tmLanguage | 2 +- src/core/core.janet | 8 +------- src/core/corelib.c | 24 ++++++++++++------------ test/suite0.janet | 16 ++++++++-------- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/grammar/janet.tmLanguage b/grammar/janet.tmLanguage index ef8cf7f7..f7552a5c 100644 --- a/grammar/janet.tmLanguage +++ b/grammar/janet.tmLanguage @@ -216,7 +216,7 @@ corelib match - (?<![\.:\w_\-=!@\$%^&?|\\/<>*])(def|do|fn|if|quasiquote|quote|set|splice|unquote|var|while|%|%=|&|&=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|/|/=|<|<<|<<=|<=|=|==|>|>=|>>|>>=|>>>|>>>=|\^|\^=|_env|abstract\?|all|all\-symbols|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|bnot|boolean\?|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll|\||\|=)(?![\.:\w_\-=!@\$%^&?|\\/<>*]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])(def|do|fn|if|quasiquote|quote|set|splice|unquote|var|while|%|%=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|<|<=|=|==|>|>=|>>>|>>>=|\^|\^=|_env|abstract\?|all|all\-symbols|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|bnot|boolean\?|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll|\||\|=)(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name keyword.control.janet diff --git a/src/core/core.janet b/src/core/core.janet index fe70455d..141a2c84 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -146,7 +146,7 @@ ,$result (tuple 'do (tuple 'def ,binding ,$form) ,$result)))) -# C style macros and functions for imperative sugar +# C style macros and functions for imperative sugar. No bitwise though. (defn inc "Returns x + 1." [x] (+ x 1)) (defn dec "Returns x - 1." [x] (- x 1)) (defmacro ++ "Increments the var x by 1." [x] ~(set ,x (,+ ,x ,1))) @@ -156,12 +156,6 @@ (defmacro *= "Shorthand for (set x (* x n))." [x n] ~(set ,x (,* ,x ,n))) (defmacro /= "Shorthand for (set x (/ x n))." [x n] ~(set ,x (,/ ,x ,n))) (defmacro %= "Shorthand for (set x (% x n))." [x n] ~(set ,x (,% ,x ,n))) -(defmacro &= "Shorthand for (set x (& x n))." [x n] ~(set ,x (,& ,x ,n))) -(defmacro |= "Shorthand for (set x (| x n))." [x n] ~(set ,x (,| ,x ,n))) -(defmacro ^= "Shorthand for (set x (^ x n))." [x n] ~(set ,x (,^ ,x ,n))) -(defmacro >>= "Shorthand for (set x (>> x n))." [x n] ~(set ,x (,>> ,x ,n))) -(defmacro <<= "Shorthand for (set x (<< x n))." [x n] ~(set ,x (,<< ,x ,n))) -(defmacro >>>= "Shorthand for (set x (>>> x n))." [x n] ~(set ,x (,>>> ,x ,n))) (defmacro default "Define a default value for an optional argument. diff --git a/src/core/corelib.c b/src/core/corelib.c index d1282c40..6756860a 100644 --- a/src/core/corelib.c +++ b/src/core/corelib.c @@ -711,25 +711,25 @@ JanetTable *janet_core_env(void) { "Returns the quotient of xs. If xs is empty, returns 1. If xs has one value x, returns " "the reciprocal of x. Otherwise return the first value of xs repeatedly divided by the remaining " "values. Division by two integers uses truncating division."); - templatize_varop(env, JANET_FUN_BAND, "&", -1, -1, JOP_BAND, - "(& & xs)\n\n" + templatize_varop(env, JANET_FUN_BAND, "band", -1, -1, JOP_BAND, + "(band & xs)\n\n" "Returns the bitwise and of all values in xs. Each x in xs must be an integer."); - templatize_varop(env, JANET_FUN_BOR, "|", 0, 0, JOP_BOR, - "(| & xs)\n\n" + templatize_varop(env, JANET_FUN_BOR, "bor", 0, 0, JOP_BOR, + "(bor & xs)\n\n" "Returns the bitwise or of all values in xs. Each x in xs must be an integer."); - templatize_varop(env, JANET_FUN_BXOR, "^", 0, 0, JOP_BXOR, - "(^ & xs)\n\n" + templatize_varop(env, JANET_FUN_BXOR, "bxor", 0, 0, JOP_BXOR, + "(bxor & xs)\n\n" "Returns the bitwise xor of all values in xs. Each in xs must be an integer."); - templatize_varop(env, JANET_FUN_LSHIFT, "<<", 1, 1, JOP_SHIFT_LEFT, - "(<< x & shifts)\n\n" + templatize_varop(env, JANET_FUN_LSHIFT, "blshift", 1, 1, JOP_SHIFT_LEFT, + "(blshift x & shifts)\n\n" "Returns the value of x bit shifted left by the sum of all values in shifts. x " "and each element in shift must be an integer."); - templatize_varop(env, JANET_FUN_RSHIFT, ">>", 1, 1, JOP_SHIFT_RIGHT, - "(>> x & shifts)\n\n" + templatize_varop(env, JANET_FUN_RSHIFT, "brshift", 1, 1, JOP_SHIFT_RIGHT, + "(brshift x & shifts)\n\n" "Returns the value of x bit shifted right by the sum of all values in shifts. x " "and each element in shift must be an integer."); - templatize_varop(env, JANET_FUN_RSHIFTU, ">>>", 1, 1, JOP_SHIFT_RIGHT_UNSIGNED, - "(>> x & shifts)\n\n" + templatize_varop(env, JANET_FUN_RSHIFTU, "brushift", 1, 1, JOP_SHIFT_RIGHT_UNSIGNED, + "(brushift x & shifts)\n\n" "Returns the value of x bit shifted right by the sum of all values in shifts. x " "and each element in shift must be an integer. The sign of x is not preserved, so " "for positive shifts the return value will always be positive."); diff --git a/test/suite0.janet b/test/suite0.janet index ef9e3480..ad2dac83 100644 --- a/test/suite0.janet +++ b/test/suite0.janet @@ -24,8 +24,8 @@ (assert (= 10 (+ 1 2 3 4)) "addition") (assert (= -8 (- 1 2 3 4)) "subtraction") (assert (= 24 (* 1 2 3 4)) "multiplication") -(assert (= 4 (<< 1 2)) "left shift") -(assert (= 1 (>> 4 2)) "right shift") +(assert (= 4 (blshift 1 2)) "left shift") +(assert (= 1 (brshift 4 2)) "right shift") (assert (< 1 2 3 4 5 6) "less than integers") (assert (< 1.0 2.0 3.0 4.0 5.0 6.0) "less than reals") (assert (> 6 5 4 3 2 1) "greater than integers") @@ -60,10 +60,10 @@ (assert (not false) "false literal") (assert true "true literal") (assert (not nil) "nil literal") -(assert (= 7 (| 3 4)) "bit or") -(assert (= 0 (& 3 4)) "bit and") -(assert (= 0xFF (^ 0x0F 0xF0)) "bit xor") -(assert (= 0xF0 (^ 0xFF 0x0F)) "bit xor 2") +(assert (= 7 (bor 3 4)) "bit or") +(assert (= 0 (band 3 4)) "bit and") +(assert (= 0xFF (bxor 0x0F 0xF0)) "bit xor") +(assert (= 0xF0 (bxor 0xFF 0x0F)) "bit xor 2") # Set global variables to prevent some possible compiler optimizations that defeat point of the test (var zero 0) @@ -127,14 +127,14 @@ (var accum 1) (var count 0) (while (< count 16) - (set accum (<< accum 1)) + (set accum (blshift accum 1)) (set count (+ 1 count))) (assert (= accum 65536) "loop in closure"))) (var accum 1) (var count 0) (while (< count 16) - (set accum (<< accum 1)) + (set accum (blshift accum 1)) (set count (+ 1 count))) (assert (= accum 65536) "loop globally") From 05a957c524f80f75801cf168a59871f6150695fb Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 16 Dec 2018 22:21:48 -0500 Subject: [PATCH 29/34] Finish removing old bitwise notations. --- doc/Introduction.md | 4 +++- grammar/janet.tmLanguage | 2 +- grammar/tmcorelib.janet | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/Introduction.md b/doc/Introduction.md index c4eb87f4..eeced18a 100644 --- a/doc/Introduction.md +++ b/doc/Introduction.md @@ -76,7 +76,9 @@ Besides the 5 main arithmetic functions, janet also supports a number of math fu taken from the C library ``, as well as bitwise operators that behave like they do in C or Java. Functions like `math/sin`, `math/cos`, `math/log`, and `math/exp` will behave as expected to a C programmer. They all take either 1 or 2 numeric arguments and -return a real number (never an integer!) +return a real number (never an integer!) Bitwise functions are all prefixed with b. +Thet are `bnot`, `bor`, `bxor`, `band`, `blshift`, `brshift`, and `brushift`. Bitwise +functions only work on integers. # Strings, Keywords and Symbols diff --git a/grammar/janet.tmLanguage b/grammar/janet.tmLanguage index f7552a5c..79faa465 100644 --- a/grammar/janet.tmLanguage +++ b/grammar/janet.tmLanguage @@ -216,7 +216,7 @@ corelib match - (?<![\.:\w_\-=!@\$%^&?|\\/<>*])(def|do|fn|if|quasiquote|quote|set|splice|unquote|var|while|%|%=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|<|<=|=|==|>|>=|>>>|>>>=|\^|\^=|_env|abstract\?|all|all\-symbols|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|bnot|boolean\?|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll|\||\|=)(?![\.:\w_\-=!@\$%^&?|\\/<>*]) + (?<![\.:\w_\-=!@\$%^&?|\\/<>*])(def|do|fn|if|quasiquote|quote|set|splice|unquote|var|while|%|%=|\*|\*=|\*doc\-width\*|\*env\*|\+|\+\+|\+=|\-|\-\-|\-=|\->|\->>|/|/=|<|<=|=|==|>|>=|_env|abstract\?|all|all\-symbols|allsyms|and|apply|array|array/concat|array/ensure|array/insert|array/new|array/peek|array/pop|array/push|array/slice|array\?|asm|band|blshift|bnot|boolean\?|bor|brshift|brushift|buffer|buffer/clear|buffer/new|buffer/popn|buffer/push\-byte|buffer/push\-integer|buffer/push\-string|buffer/slice|buffer\?|bxor|bytes\?|callable\?|case|cfunction\?|comment|comp|compile|complement|cond|coro|count|debug|debug/arg\-stack|debug/break|debug/fbreak|debug/lineage|debug/stack|debug/unbreak|debug/unfbreak|dec|deep\-not=|deep=|def\-|default|defglobal|defmacro|defmacro\-|defn|defn\-|describe|dictionary\?|disasm|distinct|doc|doc\*|doc\-format|drop\-until|drop\-while|each|empty\?|env\-lookup|error|eval|eval\-string|even\?|every\?|extreme|false\?|fiber/current|fiber/maxstack|fiber/new|fiber/setmaxstack|fiber/status|fiber\?|file/close|file/flush|file/open|file/popen|file/read|file/seek|file/write|filter|find|find\-index|first|flatten|flatten\-into|for|frequencies|function\?|gccollect|gcinterval|gcsetinterval|generate|gensym|get|getline|hash|idempotent\?|identity|if\-let|if\-not|import|import\*|inc|indexed\?|int|integer\?|interleave|interpose|invert|janet/build|janet/version|juxt|juxt\*|keep|keys|keyword\?|kvs|last|length|let|loop|macex|macex1|make\-env|map|mapcat|marshal|match|match\-1|math/acos|math/asin|math/atan|math/ceil|math/cos|math/e|math/exp|math/floor|math/inf|math/log|math/log10|math/pi|math/pow|math/random|math/seedrandom|math/sin|math/sqrt|math/tan|max|max\-order|merge|merge\-into|min|min\-order|module/find|module/native\-paths|module/paths|native|neg\?|next|nil\?|not|not=|not==|number\?|odd\?|one\?|or|order<|order<=|order>|order>=|os/clock|os/cwd|os/execute|os/exit|os/getenv|os/setenv|os/shell|os/sleep|os/time|os/which|pairs|parser/byte|parser/consume|parser/error|parser/flush|parser/new|parser/produce|parser/state|parser/status|parser/where|partial|pos\?|print|process/args|product|put|range|real|real\?|reduce|repl|require|resume|reverse|run\-context|scan\-integer|scan\-number|scan\-real|sentinel|seq|some|sort|sorted|status\-pp|stderr|stdin|stdout|string|string/ascii\-lower|string/ascii\-upper|string/bytes|string/check\-set|string/find|string/find\-all|string/from\-bytes|string/join|string/number|string/pretty|string/repeat|string/replace|string/replace\-all|string/reverse|string/slice|string/split|string\?|struct|struct\?|sum|symbol|symbol\?|table|table/getproto|table/new|table/rawget|table/setproto|table/to\-struct|table\?|take\-until|take\-while|true\?|tuple|tuple/append|tuple/prepend|tuple/slice|tuple\?|type|unless|unmarshal|update|values|varglobal|when|when\-let|with\-idemp|yield|zero\?|zipcoll)(?![\.:\w_\-=!@\$%^&?|\\/<>*]) name keyword.control.janet diff --git a/grammar/tmcorelib.janet b/grammar/tmcorelib.janet index b1e9d5dd..69f05291 100644 --- a/grammar/tmcorelib.janet +++ b/grammar/tmcorelib.janet @@ -27,4 +27,4 @@ (buffer/push-byte buf byte))) buf) -(print (string/join (map escape allsyms)) "|")) +(print (string/join (map escape allsyms) "|")) From 131ee291903df424ad602b50d1b5328bf5880301 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 17 Dec 2018 01:41:11 -0500 Subject: [PATCH 30/34] Add docs target to generate documentation. --- Makefile | 12 ++++++++- doc/gendoc.janet | 62 +++++++++++++++++++++++++-------------------- src/core/core.janet | 16 +++++++++--- src/core/io.c | 2 +- src/core/parse.c | 2 +- 5 files changed, 61 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 9eeffa93..021cd4d6 100644 --- a/Makefile +++ b/Makefile @@ -159,6 +159,15 @@ build/janet-%.tar.gz: $(JANET_TARGET) src/include/janet/janet.h \ janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) README.md $(wildcard doc/*) tar -czvf $@ $^ +######################### +##### Documentation ##### +######################### + +docs: build/doc.html + +build/doc.html: $(JANET_TARGET) doc/gendoc.janet + $(JANET_TARGET) doc/gendoc.janet > build/doc.html + ################# ##### Other ##### ################# @@ -183,5 +192,6 @@ uninstall: -rm -rf $(INCLUDEDIR) $(LDCONFIG) -.PHONY: clean install repl debug valgrind test valtest emscripten dist uninstall \ +.PHONY: clean install repl debug valgrind test \ + valtest emscripten dist uninstall docs \ $(TEST_PROGRAM_PHONIES) $(TEST_PROGRAM_VALPHONIES) diff --git a/doc/gendoc.janet b/doc/gendoc.janet index ecfb2b05..9f4ace92 100644 --- a/doc/gendoc.janet +++ b/doc/gendoc.janet @@ -1,20 +1,25 @@ # Generate documentation (def- prelude - ``` - - - - - Janet Language Documentation - - - ```) +``` + + + + +Janet Language Documentation + + + +```) (def- postlude - ``` - - ```) +``` + +```) (def- escapes {10 "
" @@ -43,21 +48,24 @@ (buffer/push-byte buf byte))) buf) -(defn- gen-one - "Generate documentation for a binding. Returns an - html fragment." - [key docstring] - (if-let [index (string/find "\n" docstring)] - (let [first-line (html-escape (string/slice docstring 0 index)) - rest (html-escape (trim-lead (string/slice docstring (inc index))))] - (string "

" first-line "

\n" - "

" rest "

\n")) - (string "

" (html-escape key) "

\n" - "

" (html-escape docstring) "

\n"))) +(defn- emit-item + "Generate documentation for one entry." + [key env-entry] + (let [{:macro macro + :value val + :ref ref + :doc docstring} env-entry + binding-type (cond + macro :macro + ref (string :var " (" (type ref.0) ")") + (type val))] + (string "

" (html-escape key) "

" + "" binding-type "" + "

" (trim-lead (html-escape docstring)) "

"))) # Generate parts and print them to stdout -(def parts (seq [[k {:doc d :private p}] +(def parts (seq [[k entry] :in (sort (pairs (table/getproto _env))) - :when (and d (not p))] - (gen-one k d))) -(print prelude ;parts postlude) + :when (and entry:doc (not entry:private))] + (emit-item k entry))) +(print prelude ;(interpose "
" parts) postlude) diff --git a/src/core/core.janet b/src/core/core.janet index 141a2c84..b5770d2e 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -1074,8 +1074,18 @@ value, one key will be ignored." (if (not x) (print "symbol " sym " not found.") (do + (def bind-type + (string " " + (cond + x:ref (string :var " (" (type (get x:ref 0)) ")") + x:macro :macro + (type x:value)) + "\n")) (def d x:doc) - (print "\n\n" (if d (doc-format d) "no documentation found.") "\n\n")))) + (print "\n\n" + (if d bind-type "") + (if d (doc-format d) "no documentation found.") + "\n\n")))) (defmacro doc "Shows documentation for the given symbol." @@ -1176,15 +1186,15 @@ value, one key will be ignored." ret) (defn all - [pred xs] "Returns true if all xs are truthy, otherwise the first false or nil value." + [pred xs] (var ret true) (loop [x :in xs :while ret] (set ret (pred x))) ret) (defn some - [pred xs] "Returns false if all xs are false or nil, otherwise returns the first true value." + [pred xs] (var ret nil) (loop [x :in xs :while (not ret)] (if-let [y (pred x)] (set ret y))) ret) diff --git a/src/core/io.c b/src/core/io.c index 7fc4edca..7d23e1ba 100644 --- a/src/core/io.c +++ b/src/core/io.c @@ -47,7 +47,7 @@ struct IOFile { static int janet_io_gc(void *p, size_t len); JanetAbstractType janet_io_filetype = { - ":core.file", + ":core/file", janet_io_gc, NULL }; diff --git a/src/core/parse.c b/src/core/parse.c index a1cf7d1f..79f20711 100644 --- a/src/core/parse.c +++ b/src/core/parse.c @@ -609,7 +609,7 @@ static int parsergc(void *p, size_t size) { } static JanetAbstractType janet_parse_parsertype = { - ":core.parser", + ":core/parser", parsergc, parsermark }; From 003472354d38debab8b7fcec84b57ace22e2d0a7 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 17 Dec 2018 01:57:09 -0500 Subject: [PATCH 31/34] Update documentation. --- README.md | 7 ++++++- doc/gendoc.janet | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a20559bc..96d79fd1 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,12 @@ Documentation can be found in the doc directory of the repository. There is an introduction section contains a good overview of the language. -For individual bindings, use the `(doc symbol-name)` macro to get API +API documentation for all bindings can also be generated +with `make docs`, which will create `build/doc.html`, which +can be viewed with any web browser. This +includes all forms in the core library except special forms. + +For individual bindings from within the REPL, use the `(doc symbol-name)` macro to get API documentation for the core library. For example, ``` (doc doc) diff --git a/doc/gendoc.janet b/doc/gendoc.janet index 9f4ace92..b7be39c1 100644 --- a/doc/gendoc.janet +++ b/doc/gendoc.janet @@ -48,6 +48,16 @@ p { (buffer/push-byte buf byte))) buf) +(defn- make-title + "Generate title" + [] + (string "

Janet Core API

" + "

Version " janet/version "-" janet/build "

" + "

Generated " + (string/number (os/time) :f 0 20) + " seconds after epoch

" + "
")) + (defn- emit-item "Generate documentation for one entry." [key env-entry] @@ -68,4 +78,8 @@ p { :in (sort (pairs (table/getproto _env))) :when (and entry:doc (not entry:private))] (emit-item k entry))) -(print prelude ;(interpose "
" parts) postlude) +(print + prelude + (make-title) + ;(interpose "
" parts) + postlude) From 77ea11c603fc8d96eeb06cf014206c4ef74fe58b Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 17 Dec 2018 12:06:50 -0500 Subject: [PATCH 32/34] Update documentation to include source location of bindings. --- doc/gendoc.janet | 24 ++++++++++++++++++------ src/core/compile.c | 2 +- src/core/core.janet | 23 +++++++++++------------ src/core/corelib.c | 4 ++-- src/core/parse.c | 2 +- src/core/specials.c | 13 +++++++++++++ 6 files changed, 46 insertions(+), 22 deletions(-) diff --git a/doc/gendoc.janet b/doc/gendoc.janet index b7be39c1..1d1c273e 100644 --- a/doc/gendoc.janet +++ b/doc/gendoc.janet @@ -9,9 +9,16 @@ Janet Language Documentation ```) @@ -64,14 +71,19 @@ p { (let [{:macro macro :value val :ref ref + :source-map sm :doc docstring} env-entry binding-type (cond macro :macro ref (string :var " (" (type ref.0) ")") - (type val))] - (string "

" (html-escape key) "

" - "" binding-type "" - "

" (trim-lead (html-escape docstring)) "

"))) + (type val)) + source-ref (if-let [[path start end] sm] + (string "" path " (" start ":" end ")") + "")] + (string "

" (html-escape key) "

\n" + "" binding-type "\n" + "

" (trim-lead (html-escape docstring)) "

\n" + source-ref))) # Generate parts and print them to stdout (def parts (seq [[k entry] @@ -81,5 +93,5 @@ p { (print prelude (make-title) - ;(interpose "
" parts) + ;(interpose "
\n" parts) postlude) diff --git a/src/core/compile.c b/src/core/compile.c index 1458347c..fd711356 100644 --- a/src/core/compile.c +++ b/src/core/compile.c @@ -575,13 +575,13 @@ JanetSlot janetc_value(JanetFopts opts, Janet x) { if (c->result.status == JANET_COMPILE_ERROR) return janetc_cslot(janet_wrap_nil()); - c->current_mapping = last_mapping; if (opts.flags & JANET_FOPTS_TAIL) ret = janetc_return(opts.compiler, ret); if (opts.flags & JANET_FOPTS_HINT) { janetc_copy(opts.compiler, opts.hint, ret); ret = opts.hint; } + c->current_mapping = last_mapping; opts.compiler->recursion_guard++; return ret; } diff --git a/src/core/core.janet b/src/core/core.janet index b5770d2e..7c4e5057 100644 --- a/src/core/core.janet +++ b/src/core/core.janet @@ -131,9 +131,9 @@ (defmacro with-idemp "Return janet code body that has been prepended - with a binding of form to atom. If form is a non- - idempotent form (a function call, etc.), make sure the resulting - code will only call evaluate once, even if body contains multiple + with a binding of form to atom. If form is a non-idempotent + form (a function call, etc.), make sure the resulting + code will only evaluate once, even if body contains multiple copies of binding. In body, use binding instead of form." [binding form & body] (def $result (gensym)) @@ -152,7 +152,7 @@ (defmacro ++ "Increments the var x by 1." [x] ~(set ,x (,+ ,x ,1))) (defmacro -- "Decrements the var x by 1." [x] ~(set ,x (,- ,x ,1))) (defmacro += "Increments the var x by n." [x n] ~(set ,x (,+ ,x ,n))) -(defmacro -= "Decrements the vat x by n." [x n] ~(set ,x (,- ,x ,n))) +(defmacro -= "Decrements the var x by n." [x n] ~(set ,x (,- ,x ,n))) (defmacro *= "Shorthand for (set x (* x n))." [x n] ~(set ,x (,* ,x ,n))) (defmacro /= "Shorthand for (set x (/ x n))." [x n] ~(set ,x (,/ ,x ,n))) (defmacro %= "Shorthand for (set x (% x n))." [x n] ~(set ,x (,% ,x ,n))) @@ -441,9 +441,9 @@ accum) (defmacro if-let - "Takes the first one or two forms in a vector and if both are true binds - all the forms with let and evaluates the first expression else - evaluates the second" + "Make mutliple bindings, anf if all are truthy, + evaluate the tru form. If any are false or nil, evaluate + the fal form. Bindings have the same syntax as the let macro." [bindings tru fal &] (def len (length bindings)) (if (zero? len) (error "expected at least 1 binding")) @@ -472,8 +472,7 @@ (aux 0)) (defmacro when-let - "Takes the first one or two forms in vector and if true binds - all the forms with let and evaluates the body" + "Same as (if-let bindings (do ;body))." [bindings & body] ~(if-let ,bindings (do ,;body))) @@ -803,8 +802,8 @@ value, one key will be ignored." ret) (defn zipcoll - "Creates an table or tuple from two arrays/tuples. If a third argument of - :struct is given result is struct else is table. Returns a new table." + "Creates an table or tuple from two arrays/tuples. + Returns a new table." [keys vals] (def res @{}) (def lk (length keys)) @@ -1075,7 +1074,7 @@ value, one key will be ignored." (print "symbol " sym " not found.") (do (def bind-type - (string " " + (string " " (cond x:ref (string :var " (" (type (get x:ref 0)) ")") x:macro :macro diff --git a/src/core/corelib.c b/src/core/corelib.c index 6756860a..36a392fa 100644 --- a/src/core/corelib.c +++ b/src/core/corelib.c @@ -324,7 +324,7 @@ static const JanetReg cfuns[] = { "(buffer & xs)\n\n" "Creates a new buffer by concatenating values together. Values are " "converted to bytes via describe if they are not byte sequences. Returns " - "the new symbol." + "the new buffer." }, {"abstract?", janet_core_is_abstract, "(abstract? x)\n\n" @@ -384,7 +384,7 @@ static const JanetReg cfuns[] = { {"gcsetinterval", janet_core_gcsetinterval, "(gcsetinterval interval)\n\n" "Set an integer number of bytes to allocate before running garbage collection. " - "Low values interval will be slower but use less memory. " + "Low valuesi for interval will be slower but use less memory. " "High values will be faster but use more memory." }, {"gcinterval", janet_core_gcinterval, diff --git a/src/core/parse.c b/src/core/parse.c index 79f20711..3f76191d 100644 --- a/src/core/parse.c +++ b/src/core/parse.c @@ -520,11 +520,11 @@ static int root(JanetParser *p, JanetParseState *state, uint8_t c) { int janet_parser_consume(JanetParser *parser, uint8_t c) { int consumed = 0; if (parser->error) return 0; + parser->offset++; while (!consumed && !parser->error) { JanetParseState *state = parser->states + parser->statecount - 1; consumed = state->consumer(parser, state, c); } - parser->offset++; parser->lookback = c; return 1; } diff --git a/src/core/specials.c b/src/core/specials.c index 3b32484d..de118889 100644 --- a/src/core/specials.c +++ b/src/core/specials.c @@ -172,6 +172,15 @@ static int destructure(JanetCompiler *c, } } +/* Create a source map for definitions. */ +static const Janet *janetc_make_sourcemap(JanetCompiler *c) { + Janet *tup = janet_tuple_begin(3); + tup[0] = janet_wrap_string(c->source); + tup[1] = janet_wrap_integer(c->current_mapping.start); + tup[2] = janet_wrap_integer(c->current_mapping.end); + return janet_tuple_end(tup); +} + static JanetSlot janetc_varset(JanetFopts opts, int32_t argn, const Janet *argv) { /*JanetFopts subopts = janetc_fopts_default(opts.compiler);*/ /*JanetSlot ret, dest;*/ @@ -252,6 +261,8 @@ static int varleaf( JanetArray *ref = janet_array(1); janet_array_push(ref, janet_wrap_nil()); janet_table_put(reftab, janet_csymbolv(":ref"), janet_wrap_array(ref)); + janet_table_put(reftab, janet_csymbolv(":source-map"), + janet_wrap_tuple(janetc_make_sourcemap(c))); janet_table_put(c->env, janet_wrap_symbol(sym), janet_wrap_table(reftab)); refslot = janetc_cslot(janet_wrap_array(ref)); janetc_emit_ssu(c, JOP_PUT_INDEX, refslot, s, 0, 0); @@ -278,6 +289,8 @@ static int defleaf( JanetTable *attr) { if (c->scope->flags & JANET_SCOPE_TOP) { JanetTable *tab = janet_table(2); + janet_table_put(tab, janet_csymbolv(":source-map"), + janet_wrap_tuple(janetc_make_sourcemap(c))); tab->proto = attr; JanetSlot valsym = janetc_cslot(janet_csymbolv(":value")); JanetSlot tabslot = janetc_cslot(janet_wrap_table(tab)); From cc5b4eac0ad0def59b8055b8ccc907f3529a1e6e Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 17 Dec 2018 21:28:45 -0500 Subject: [PATCH 33/34] Update documentation, fix life example. --- examples/life.janet | 4 ++-- src/core/corelib.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/life.janet b/examples/life.janet index 64b82988..3402a969 100644 --- a/examples/life.janet +++ b/examples/life.janet @@ -16,7 +16,7 @@ (def cell-set (frequencies state)) (def neighbor-set (frequencies (mapcat neighbors state))) (seq [coord :keys neighbor-set - :let [count neighbor-set@coord] + :let [count neighbor-set.coord] :when (or (= count 3) (and (get cell-set coord) (= count 2)))] coord)) @@ -24,7 +24,7 @@ "Draw cells in the game of life from (x1, y1) to (x2, y2)" [state x1 y1 x2 y2] (def cellset @{}) - (each cell state (set cellset@cell true)) + (each cell state (set cellset.cell true)) (loop [x :range [x1 (+ 1 x2)] :after (print) y :range [y1 (+ 1 y2)]] diff --git a/src/core/corelib.c b/src/core/corelib.c index 36a392fa..72e80c12 100644 --- a/src/core/corelib.c +++ b/src/core/corelib.c @@ -406,9 +406,9 @@ static const JanetReg cfuns[] = { "\t:string\n" "\t:buffer\n" "\t:symbol\n" - "\t:abstract\n" "\t:function\n" - "\t:cfunction" + "\t:cfunction\n\n" + "or another symbol for an abstract type." }, {"next", janet_core_next, "(next dict key)\n\n" From ac9935c95f1981c24c740b74118c19c23fcab971 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 17 Dec 2018 22:48:37 -0500 Subject: [PATCH 34/34] Add documentation to generated distribution archive. --- Makefile | 3 ++- build_win.bat | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 021cd4d6..29a45d83 100644 --- a/Makefile +++ b/Makefile @@ -156,7 +156,8 @@ valtest: $(JANET_TARGET) $(TEST_PROGRAMS) dist: build/janet-dist.tar.gz build/janet-%.tar.gz: $(JANET_TARGET) src/include/janet/janet.h \ - janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) README.md $(wildcard doc/*) + janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) \ + build/doc.html README.md $(wildcard doc/*) tar -czvf $@ $^ ######################### diff --git a/build_win.bat b/build_win.bat index d12c2631..a5f6483f 100644 --- a/build_win.bat +++ b/build_win.bat @@ -93,6 +93,7 @@ exit /b 0 @rem Build a dist directory :DIST mkdir dist +janet.exe doc\gendoc.janet > dist\doc.html copy janet.exe dist\janet.exe copy LICENSE dist\LICENSE copy README.md dist\README.md