From 9636b5d8dadfb65c9bcbf3731208d338f18d9ee9 Mon Sep 17 00:00:00 2001 From: apio Date: Wed, 20 Sep 2023 21:07:37 +0200 Subject: [PATCH] Update README.md --- README.md | 17 ++++++++--------- docs/screenshots/screenshot-0.6.0.png | Bin 0 -> 16063 bytes 2 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 docs/screenshots/screenshot-0.6.0.png diff --git a/README.md b/README.md index 89230671..f8d65f8d 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,19 @@ A simple POSIX-based operating system for personal computers, written in C++. [! ## Features - x86_64-compatible lightweight [kernel](kernel/). -- Preemptive multitasking, with a round-robin [scheduler](kernel/src/thread/). -- [Virtual file system](kernel/src/fs/) with a simple [tmpfs](kernel/src/fs/tmpfs/) and read-only [ext2](kernel/src/fs/ext2/) support. +- Simple round-robin [scheduler](kernel/src/thread/). +- Read-only [ext2](kernel/src/fs/ext2/) filesystem. - Can [load ELF programs](kernel/src/binfmt/ELF.cpp), [shebang scripts](kernel/src/binfmt/Script.cpp) or [arbitrary binary formats](kernel/src/binfmt/BinaryFormat.h) (registered through kernel modules, which are not supported yet =D). -- Boots from an [ext2](apps/preinit.cpp) root filesystem (a bit slow for now). -- [System call](kernel/src/sys/) interface and [C Library](libc/), aiming to be almost POSIX-compatible. +- [C Library](libc/), aiming for POSIX compatibility, with many features such as local domain sockets, signals, and shared memory. - Support for [several third-party programs](ports/), including the [GNU binutils](ports/binutils/PACKAGE) suite of utilities. -- POSIX [signal](libc/src/signal.cpp) support. - Designed to be [portable](kernel/src/arch), no need to be restricted to x86_64. -- Everything is [UTF-8](libluna/include/luna/Utf8.h). -- [UNIX local domain sockets](kernel/src/net/UnixSocket.cpp), allowing for local IPC. -- [POSIX shared memory](libc/include/sys/mman.h) support. +- Everything is designed around [UTF-8](libluna/include/luna/Utf8.h). - Environment-agnostic [utility library](libluna/), which can be used in both kernel and userspace. -- Return-oriented [error propagation](libluna/include/luna/Result.h), inspired by Rust and SerenityOS. No exceptions here :). - An extensive set of [standard Unix utilities](apps/), from [ls](apps/ls.cpp) to [uname](apps/uname.cpp) to [base64](apps/base64.cpp). Written in modern C++ and very small amounts of code, using Luna's practical [OS library](libos/). +- A simple and efficient [windowing system](wind/), providing a lightweight GUI environment (still in development, not many GUI apps exist). + +## Screenshot +![Screenshot as of 0.6.0](docs/screenshots/screenshot-0.6.0.png) ## Setup diff --git a/docs/screenshots/screenshot-0.6.0.png b/docs/screenshots/screenshot-0.6.0.png new file mode 100644 index 0000000000000000000000000000000000000000..545a0d0464203e04e6fb4eafd1d50e752c90b381 GIT binary patch literal 16063 zcmdUW2~?Bky6%r!(F)S4-3}1rbi-&kRmx+k=~|^fx(%96NI66h3IN+o`}~ z(1Bw|7q78i?0W1p__t>5V(X2z);6{_){C9@E_U4R>XutP`vn9ohIVb+;&wJ|K;YE$ z!%i~dEEHMhUFTcZa3rs|<0|s!m(lkwyp1&e`4>szzQ9GH@~cA!cPcm5-60#-9ey)( zZpqo)c>spbb7J%a|Ae;H2c5xfVtAWK}4naK3Wb2x05-@!U?88vwDXN zAt>tE6bks@v^}2;q0S{#ijF~zn3NmUX#!53pAO~(`sU_;deA0?#}2?J#OuLr&<(y; z!B#Wtu8P9*cm|Ne7GdN_T@@S4Ci@JOL%AGjI9nYkUcXKzm+<_%&EU!4;~uxq$eb>| zN3u1;S1hwdPZnK3Lk;aHVdUEOL`pl)#9Bt6|Qv;uZj320?OD~ zfMx6EeR7J>Y4Z`CVSH^ZTGdqtE1U+s=v~WVh}EvxO}55ku16>V%XNo*Fzu6|hQ@Pa zXzWyn04A))!#MH!Lwg#gLO-pY^XVcviq{|^Xo%D~1qwNsyl2OofT`vVr)}B(tJbPF70ECUUMl2pL12Q8Jo))Crcf)T=kY$x76!4j zV~V+{$lJy5Pj86SL@))qGw40F8fz+4$8=Su=I!J2aMcW&_-;B7`Ed;k(b&5;_{8qo~>&mY>g5 za4g{uSF5QD7xKu}&f2u^b&l$Rr@2WA&>H7`Z#!X053hPLx;QfEPL|lo(kYK}@(E?N zD{87sazc4&gD0MnpP504tb3{-z}5q29>V$_YuCdM-u$AIghd2Dv)2`8R$9Za(W&5$ zUiYC)9qm2k;WD(M(m^cCVZOM3o=~n$Of)@iYYY=%@S6UWW*Ss#-NyzMf9I%Agf>U+ zoM0?AscZlf9VO1T&4ImQb<~;RSU>AK3m%|bc@*0>Y`NT21s1R~cBoogf5+)5{U{e6 zp&H%KMIWnH(atNDy;l?)>c$j>DZ0o~ZB|GtaxopH+x(id_xh7c)0LoUxZnQ{K%zqG zbH1mT&h^#J!5klEA4PBL2#20M;n=HlLuW%box4#w-1_wz4R?|xFAxbh&5fwB*pYyS z_)7r_NjbI*1buriSQ5Pn|Ab1uyVF8B8A2aveQ^8@l{j_th)ep8h7lbV2e;D;N-{}= zb)^aQDaMkbF0o%XcG&avESa!fGy{VC@^u^7jH_cK8KMuQTMScV`5@dZ=U5Jgs=ao< zlQ&-@so<*qColOYe!s8tR!15@hxfEPYH7r8vym!Y0*hpmCM{}wZkzSgT&BO;xzopx zl7X&r5IjPahiW0{@%jUZekUIsd}rj4x|KzGtBeF|0eyjDjWhAGa4bKCA0Ry8in=y{ zsW=m(0yuLx3|_(R3S2qFo^T_=HcDjOcS*TDvCD}1PqErNNQac;N^C%-j z(4`0BO#KpfF#EH`c>IA4Se+}GSd7q|`&FOK$@w5-JF~~`T1>mkBY|J{$7CUqJqbGP zle4g&vSH!ovYg)^syB${54Ao-(@8iaReqPOFo1&It%yd4ZkHG@{CZuh(MEzyREn2$ z)0)HgZj_~*RJdsw-81A6M9(_=3GJJk9#hqH^-Y>tMd1;;)z7u_Rhqm0<#7ZV$9N=t zlQhB-cCkSHEvA1n);^TH`&5PJJ5jBuJ`f|e+E4CR)fYfep6? zd&8TK{c?Q&P|G9G(7bXDrXTJ8Ggq?_b6i$1q^-6@A0vqlKv8F}7{dI_XW4UaS?v&C zVqv}U*vnn$6F;-eY7mK=R%4~5-TR0e6zL4wl;$>FrZe@fOfkjloLVlaVgvJ7yQ16a zhBuQ81+}_IXbhrm?sF6$FJg7t&aJ@|9LQM+&08`y+2^F7Hc~8eoSA78N1EcW5?IsI zg-H!)n+2VbXVnd-75ukTvSqCc{L$_~yR|sPUIT{+aF26~bDJGWvaXXFtIaf>f!Q(d zO&;1U{FEQc+NGZ(AVX~do9j)W<-HOfJ=$O{baH0`y5UB0!l8lfHAb+bIIZlJb_b$9 zR*YX?VJE=wRdK&~3(3%M-kLFN$o@A^3s2nN+1{F0@%FmtnTchBFIh^okcsT?*@tRz zR9Zd4cv|^9(?_hAc_uivOk%j0nyHH{76eg-g+nFFHA~wA3}Bh3`i^WtS2F^UvkUE`2v|?RPo?-ssmnYWocPVsf9^C_`>s$EP;w%*B(R z9WQzpK((U;pOy914qWIckD$K`c;HykaB-v$N2sOw-b;Ika*v5G!I@zQGFmBqU{h)G zaLNFUaST(BXq~3Z>aVq%YrFHh_{(~916*mfp*3)o=k~Y6)SiB-H|xhpxhFZkDRsI? zW+eL^ONft7(ysZjT`>cS(&dJPpr16iJ5ol6UH8Pf-HfmdA8p{P{0Ltg+ z^@=U{JT|VyW4CsEjovj0$~bUbCc4K>6#Uk6dV`xb*FS~Y_0+JuHEa^(;FRCqg;tpI zlZ3r9%bg0m=4Y!Zd0u#Ib{E=TNr)jf0Pn~fPnquMWOb|T?YDjE>5zlnt7wYUxwCo3 z!MRUEw+RdK=mjr_sB2eaO}erExdYk4PqgIUcrh-avQMtSr~fcyO3B#NYW8-mBJsS< zlpu5jSZu#`nw-hn{@T~^F?IG4Q{Z4!d;~Q1kM5-qptw)=TWEPH=wDCnnlTeQPU`Ry zsfhbNP|pNlf$?SjwtVuFqy8tJJ#q-99FBa{wkT_07K9Xh-7 z_+~r%rR9TUHr~beRJLSgUWDH)Xf)-Zzx8m+48zCtjl*e>2{S#U<}6^I{nQD7c< z^C(GvA?T>M!zPf!AwVG@T3b3cZUD($;Q5vxWSeVDps0r)^ED>1(N~ARt~_p;P+Z_0 z%lxvATWf>8X!AjsbLr@f=Tzd7iyDF>>eu{pvrkP-v)M;FtB}ktP#W?)6p)v`ctTFAry+RY`V3$Z>TVI zc78vZ?L@@pXd54qvSlywcpwHiUzaSr>OviC`@Ly+ zH%W&PW4%}uAr$3uWh#t`Nl1|f=f3Nj|D0dCLpZlQ04p)I&a1&IdBe@2E*&U&dh-aU zjqJ1L=MUGlH(lX2W#QZ`9qFL$Zu8K1Lzra%*{xilN!ar2;?!Sj?_l3IHh3{LT%opk zBw@sLk;U_K{>n5Lm<5bU2*23A(g3n@k9-K9LLQD2>PmePAs=IgZIYjE&C`y<5c{HQogXDC)^Xs2iZrC`Z1;t>qM$6$)Su zMeQy#?WaV>JQ4jcIgc~hF#+pc=9{g;d~tWTBSZ&Y1YcM=_d#f!oo#M6p&fHOVx3pb zy)J*x;e}(F-EV7Y`I@))w42OR&HWD=`MNp*j6{;Fn?JoffLm8WvZyWSYc!ox)hedls;Yc{{E3g-eF$8S0$67li4Rfv5%e&tv0Kw zJFeMUuuc2zHX)ZG5g$|Igc+Ay$Z>xMZ5S<`($mi_)?~|Q^@(=N0a6NhRSD^4h^xur zY~ftX1lBfXBnF|#zB|Bn%T_D7a?G4;D$f$$n;ah?7KxIq3sumWY#T~b8e4Vj8ujr};%`xe?{QuTb`=kH;*~zN# z4GSNU3;a{i2g0+v2K7MhVgn!XgK#bguwE@wYznt8Y`%W*7AN*hPyG%mlRU*$tr&w_ zH6Nq1C76T0O$|dRh1RpNv?PVHOH0ci68Nskp~Q8qq-&C790j3vuqt~N%mRAAqYsJd zZq~9B=W15*>Ev&3uFd8x7`2~MzD*rsU-6F~`G{+rggvTh?T>IFz_ero=$rj56S0@~ z1$4tjZh0YH&&+sb4`*ia6*YtX$ij?brMEh@Uz#E-^mNZb4oTp~rRA zxtW@V;ok1G$nHY0Hcmfcb~=%=4JdgAegW#rps+(YQ_+OUbIKmP9nz0{E9LTlkzV*J z8g}lrEkB$0u4}`A@XM-J>Aa;bF|zz%;hsP&o=50w=m#d1r}vY0GYYST=r*G5lNZj# z?AUz&*N2Q^X(2H={`F0N$C`&3m}Joa__h@Q4(H;lcDwl0x-$i#Vl$!H{Q&XM-N-og zaZAY^ra>YxdMQz9!`*dG*cRc!K{M|8$M{lh6S9)15&3&hQEKFQLr*6`kHfYvQ`9mV zXb7G}-bMKh&G9h!c-{0UEuLEERa;;#J6qn;aI1{sPa)IGfF|O#!oC?E{jla(NJ*Ag zfs+x=So^k?W9cW=xH18winiZuR4eC0QMThuTD(qip-iUA#nv819l%Svn2KS{lcOgi zrdY76g#nHAoGh~cdk_pdARg8CQwDs>vaSx=FfVdeyjb5OKS>`aRhe&y?i4BVP?0WM z+r{6zQlTb^mqIsg=+Zag9c}|C-PuGPJ5`+viwu68;M2!v;QT-^vckUm7isy6iYxo; z^~3>RS2_7~G0Ts7sJ&3m^@<939kVkH6s zqwN*@`hs6ZPUO4pthrZ_yxBJwOjFLmq)$c{Zzd|=c#kMT;zxjmStR(1(vM+0 z^c}gV@Z`l#YO--`{_K-m$b4M)Y0cXOL^W-+-3t0}mKeFpt3yl17H{@U{qUT!{LCHS zAGrg;X*tYoT3oo%Y}e=Z-FD@-{Uh*H8DDp&?0n(7H+ZLlZtRNg%B?j@k!H*@g@4`y+_zeUqSV?f{`O5Z?#$11gbcFwKZ9AKzxdU# z^6PH!Q<3{?3JUkta}EJ;`tj}%b@Pd&{>|&JO%rL ze{JkFv7@7qx=63(z0K5#jI=b=w=X*1J1aJdO2*X*5usX1lMTJqOF}=duxAJvBbV=#xWoSHc$nSt=7VFEkgxFD#RFoVxr|y?86Huct1Dq){nkpc zU7F+~k_GDLyHqN){NortdghLw#<7^u4X~J+6d*0}W?wqAV3d2jZzwp>Jf=nz;AhgE zu&Yl}uZ<)uvwLGfk!p(X(C2K17 z`u*f`41^I`UJ7{!Q45_m1}?y>8kGWm&koQvQ8cZobzw{fn~n6a8nu!|oM8(o8gC#h zLXUS>rNcBDt(>>Z0eCHM;NTKm%5Zs)?@s)jB>a{hrwI$XINijz)2zR-D+QkDnvdzww4;vX~>obOC@1iMO`h=s1i9DMoCHN=~{-m!e; z&-p{B(#^6qNr`45h9xA3lQ+Og_G|;_*fjW)>vllL3Bps)9tpahywg0bDm$L=aY5EE zA8ZU$Y%c1u!#bc{!KBI!$pjh2iu0W(qj+53UQ=*-{%yi z1Xdf@F;FP46t+h_9%?9nM-gzSc&S4xaC+;Gk0ko$7cRba50D_Qp6FZF&CI-t(d()^LMX#B6Vdpc zWC&3<&A$AS8PnOG3VqTHb`2-VXdm+t&l|POQqtNIQeK@z$k(#v!>(^`U`IySGJ+vA zx~(_%*cU(3uP6#>fiCNHEJ>OA4!5!pCM@j{XKGe65@*(zpO9*u( zin#6u;%-3h-;wBd^qCcBekAOyi=}znj zr*7~j_6;8{3f2_P%&x+oN{K|5&Cpd{m1Ukd?poh`uXf2Vv`mTVrU&_qI83_ZI4LsH zz-K!};J#+mcUOASkFln@@>)Z9l|ehwVp_6+p9!$qzZ}FoTU+}sQtHgA7-g7dc39Qo z^~D8CeksnDi0clSRwW~_RCO-VlG0~u&Orcse-%tAqtlaF6)l|L8FI20D9WzRji6C zACCJfZy{ixeF^?PC5|KQ`i9lytYHY7LC(Rsfk=A2I$YCY&x$~T?=Qz6DEd^g=l9CM zOChU3rsfgPWg>6|^Aj$O{7`OQ6h?)QF8;F>9DPdC%O%L4m6(2EzymY|f}XeoZ?2Z) zR6m?~EQ{j*IP7h#zk)?FZ%-N5l#mB0eR02VfporYWOVH2C`+wngVQrd`UDRO`4 zL$uzodEBVhLRN)x>TNK=2~#K;rWZi3l1_|Y{US$9FaaQflO(fw#LbWZ~KP;Q~tfPy~DYE5#bTn?jm=q&WIRn(EszSd75)cm`zHHpM|?zg93E_)nk z5tv3Kd_@)ouXR^L$T8N#heb5)OwWiM-yF|Bn_7kegzcy)*mxVn8 zD~$+AroDMV63_k3-2Ps=Y{KdPOd_)b?|CyI$ZUqb7GR`1$Xj|pmN0m06WX#*LQTB^ zQX>`=T2lF_hNl9u=r`_v4Fk&mV;Jx_XxvwPyd*0j1!!qYWiMvoZ1>3~q_PQY-rG!A z^o0LsD+OhRqMG3i&u?7qEvqzJ#2wzKFgFeqwyh4W3q15WO4Tn?v0hv81g)*b&A?+O z>1^=Uf6!+?#{I)hpRPh6^f&^+Gjnk$ap+J{RdBv^maIUq`pvdQ`wNe%y$qR*_4@=F z?*e)f1irPL!lN&@)Lcs7k8sY-r<2JBP=*sQREMsOTPY*#Kx_YRhwk72FsB zfjTaf&bx7^4PLjIJGM7eEc;>YlDn+-%yW|Nloj_pv;<&Lpx(EFSQEsRxwbaN_KKew z6FxlS%)_y~8xuAM>fPURP-`4_aoAt6fj;myh{W=AVT0GxJI6JJUBH{zH7F)+>ctFJ zVfuq9kH$WdML=8gTC-Aq4%&5)vRkV9c9npQH{PykvIPJ2M2pnY#-A1&(hn&A6B@~3u2vb zG*)J}irRrB{^!8Za6B;Fz>r_M$`}#x)tJ zba?a<#nin?!?@hUVOF66a7xI|J0H2gVk$H!cR&Uty}mYAW%YHd#qdv2u7vWm5+4Aa z=B&(;lwsU1J9q=y06LAkVj@EuCs-s_S+)?hy)MgMcC8sVU4KM@5Be3PDNyGu_oa%| z1+#8PY!T>riisiufPEAClj{01ci=Q;`_#R_AL~8q_HDH56uk^v+B_cbRq@S5RBlzI zSOw(i>qp4okDn4$G?4{ysX!=viOiLglgkq&eWoQm2{qS^U?pm60y^ zq%<}@PBa}bxNBqxo3Hq|%IVfuYA({H)!J>-&OzRRyQFbRUU!p!Ss6mN3~#JpDBj$m zdf_Sl^D!NU`p|TyOb@B{vL?dh(F_@*mn$}m!aWfVdZP@2Dx12xs@UQCmu?2)HAJr0 z*MLkE^Z>u+N_{`}Le(~)IXG+teB;-KQaCIEPKteTq-CX99G9r}AB6QzFO(Fns9r`b z4w`&m&72q~Y^pcwZ+@sakQkEa{V@P+TPb<$eeB(@W?sy1ngQRoizkGpJfzfxC}ay3 zM)xdew{NY?Hl3GRrxCrwDKQ;rg?14UychVou_}&CIv$0^L|-tg?&i+PaLVg0O5?E^ zAotXb)apRibp&`eT^CtbM?!C^7Dc|~oL+vZw5=W!bnVXWzRQCQ4Q3-7Oqt#h3}2A% zvh;xWBbjPH->X*`pqe){VS+XiM00`HwNs(iR|9KbKB?Up{VdD3W-d zy?m3xmpqy3*Ed9{lceU1XUi!?)f9g)L7xbJb!(2B+fzGa)^qG=IzH#5ad+z@Kz;K( zKKn1pUy30d<{EVaht&2j4yk_PUeHtVXr1;|&()=Y8%P0doEQW}t(FI}PByWw>xPjO zK9{Xbr3Q)KpSB)d0D8WA!eM0#kyZsDsy9;8P*8r~=1;m+5TZgy4{X7F(r zhRC4vBu+b^ZEIS16pip953Ik_E2Z|4W6s6TGSgK}->XHnDKkY>FCZ+N%dm6KvbAzi z1?+@1U0`lKs$+CxBUdXEqy2cu`H%3I&;Vkqz*JM1%CI%BO)RP2C;C*bwXR~s0x9-Q zbKLo)ZodM{b$T^Qe`A%BQmDN94nKmg+0!cwqR&;dBPi{MZ|YxTq}Te4VMjY912xsF z04w-zsd1WELQUg;17r*L>@_*C-Z}kT5JLn7F`!>jGbHI~if`Vhl9^icA}On~Lz;a= z1UiFZR05V4_a)G7io-iEmcg0g4)4cBoYS|>ZLMy z{;24!KUy7mKK(zG;Qkxn)#Eivt{ZiNi$iBe#cNcp>>yCio3R+I%H9{_Qw~xOce}H8 z=b_yDByk_Or70|a`%pNJ7g1}Z_apvX^ZV}~NI@k6bQl!GfVbz@Vq~LZZTEd+vdCuT z2xMOS&U6pae-k~Qiv|8NPUDR8O|@PUemWj2b=+>&8eztK8)r-uvw9YG!l2eO z&|W=IDmEJ1 z7|L920FCOe&!9a&cxfuMyb54&UAU17-|~-*n;tnhP+OI=a)x^9QmY@^mu}ADkJx%m5ogP(^xB8hpv5-;KYAK$K|oKEI!zo< zzwnM&pn)-%_ruua2IJ?+>7c|TFZJ11E@(O!`Mcc)qc8E}c`9o#^0}35zpBSu@nckT zx2UJavz^r>bM2>IXWB!jd8M3m_J*gb(PQE;$e1K+IRIAmnUAe(9UzrwE%W z@gD&I<(=DuI6Y@*D19PR_K(EzuV>-Ew{HIb{B0BFPBnajB0m8Jc6X#!)(XbOnSTQQ zfc>$2knJ9{bJzc89USjd6lU}0&5;^)T`J1h8&t=m0D!m9o)e3d=bqSO?MKsZ$A=o1 z{BVJxWf%XNB~Ez=NGZD0%=@v5m_>+4 zONsaNw7vU%7O6_{acWQ2y#>2tM<3o>0d;yz(?P4kj0VgnNjwkN_XY1eh(58c!Y1Nn zY|u4ORHHJ8iUdHKyU{p0Won0SY?sQBw}$w1t@}zhg$_?6BoQi^{xPO`xPAz30^{$YKXm z&Ypc}yJj(6(+-mJs*EZ`6m|aBWv*-6smOx;u$yUp>__nWxgSOS`%Yow8Cs!Q1vy~< z+4^|)HE9A64wD?UdQ1HOC(8ftTK&`Tr%%>ns8a)IDC4{5h-qE#-@oso;7aB4ltwkV zx10n)JM}gpw*veCv7w3zO3nmab>P+q3l(P$ZCicj5SD4pS9rUt?w6lR5P-%72mH4vb>A8_a#a`LT8`Ax0*F)Z?7m*x6**~_7;u;Z6Abxae zy~R6FrM)(yO!qFM(By$NtIzIIKj2c^DdtHV>?=RYJ6f&KsFxgz5^dIwmv8Pwi)x&- z`3B#_cABhO6Z-sCW0y_nmV?ZlmOG{Ltm4oWKhl~@lBqv0%!*`*LgLw(W$~eh+V7>7 zkr?&(`)T67v3X@%nlMUNYPdy8X+ck1-3Za2Y!8j@`eb<8{CBWD)^K)G7#IpmxB@i)Ypd`GK07~!LwPTwp_O&O=e~v zCYDI!25UCmE>SG*DTNpCup?u8O1KT!-4aPb7D!n-r|8@Moeqa}D`lOu1h7Bt&Ggt( zoRr4tYTpvs8*w(S%YsH%F6gFztxesl)}m>#T0@6TdQX$PtbfokffpKgRp_Dq^n~=- zt=9PtlYH5a^-`Wdf_Iaak=O?F?o}b4ygrxE<$2B0j`7Y-Nvp+}WOD?pq)=Kr+KqBQ zoxwN#o}oS=9l3)8^;;VWRh-7bD&_CZs;ZjT0+`XQ=wNLuVGG}ae90T$=cp|OY)M)- z+HwF}5;V#Ax9|DQ!?IQ^J!ld%{U1G|s7|91!zkWAb5QZW>k^h4m*B%SP zn1P=+5ebmwq1r!U+DO@>&y`+b%si@6@9nuUE8hRn@OlZ&rL!uFJlBHx+woSDBCmgc_#Th$=T={koELEoId47LC*STBmtY3jz{4+B%O zZ9e@q$c9h>u~_emm=tTJ6A|4&q$Hn)b%AFQo)0z3oh%VKcq!rL%7_4M8fUOQUj2QE zF(c6OTa_ptW|+=qR8jIvD6m1sQqX3<6(1i=>0%sCZ2BScl-9hvncDsX=@hj0T>^uO zjnCRbjth}vr9;>kx7je{oZ4x^&uz@CxTq5#&|F8 zS&dpZ`7~wmD$C9k(<&#`~@8DrSjBG;UmunI%yICU)$LWf}#_gFNmfKRJZgo z_qGzC>1_Y9EIQy3G<`w|xg0zZ|9w&Dz`cLn2H7UnMihKbB4^)_Z0lxM_ z3OnG-il}u0L^h$>1kq({_1ecJ|L_fe?7I^vgrFArv)V(^#DX1};1)d(e0n}E4`1@9 z^Cqf*@3v2Dnw+>kt|th!JW5m9A_qqf6^#d>rAMz;4Z;J+VN%!sabNY$qh~Znr#TQ^ zz*ci8!QIK=i_g|vfG-t3M$64m2A)NVL7|?KfeyG<+jnKO$w1d4VZT18hN1!LYF8 zevFQ-%R#^^4=x4Qnu|9r1a#o&irES`2+eE2F2^XZFd+rjzFLWx8GB(bgN2(yc#i<5 zlf&RKlR+!rb4)?Ly@saBVVmjn(ikyJ@!qk+8TK2)^85^teV5tmKBW!-^&rY4j42of zg#>x4N5LFD%WKn*@Z5q``XdLSl&t0neV-0{Il|@@8mALrL)~lkdp+KYuc7MUn41my zci7DOPluXW-6{MzjI>q{zlIlkr|SFqx7Iv{=WIoT=gJ$pD0jCVo~xHjd#ioKQ%8H| z@l)iw85(eLv{#xa0DE&AvYHm7!)80Q0UaVEJe)FGMFI9lF#8jD$TLSE)Y0Lb&-}he z3hw#0MMBB?RIs}kJOJGQTXx{+isOW_A$ZaH)QTZ|=OdsDv(CXflK42pPZI>um2g#k zef=kZYlBcj@SALcL{_A>7Q`lLo4;nCm&42FeRc2f9HSEuw93^ltPS}BD7X-`Yx}-! J`CAWP_+N~-###UX literal 0 HcmV?d00001