From 159ff183f9b83b0aac5ed3e538a58d25d0d8fe3f Mon Sep 17 00:00:00 2001 From: augurier <14434658+augurier@user.noreply.gitee.com> Date: Sat, 4 Jan 2025 11:45:13 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=83=A8=E5=88=86=E5=AE=9E=E9=AA=8C?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 +++++++++++++++++++++++--- pics/basic.png | Bin 0 -> 24300 bytes pics/parallel.png | Bin 0 -> 25730 bytes pics/reover.png | Bin 0 -> 20444 bytes 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 pics/basic.png create mode 100644 pics/parallel.png create mode 100644 pics/reover.png diff --git a/README.md b/README.md index a2a0b7f..b37a2f2 100644 --- a/README.md +++ b/README.md @@ -584,7 +584,7 @@ InsertOneField:只插一条特定数据的测试(让key<=0, 和批量写入 DeleteOneField:只删一条特定数据的测试,功能与单条插入相似,主要用来测试delete。 GetOneField:只读一条特定数据的测试,与上面两条对应。 -对于所有涉及随机性的函数,传参一个随机种子。只要随机种子一致,随机生成的内容就一致,相应的读需要和相应的写、删保持一致。此外测试的数据量也是可以修改的。 +对于所有涉及随机性的函数,传参一个随机种子。只要随机种子一致,随机生成的内容就一致,相应的读需要和相应的写、删保持一致。此外测试的数据量也是可以修改的。需要注意的是,之前项目使用的srand线程不安全,使用std::mt19937可以保证多线程时随机序列也一致。 InsertFieldData:批量写入,按照上面提到的测试规则生成kv,并调用putfields。检查返回状态是否ok。同时对于生成的字段,如果是address为shanghai或age为20,统计入相应的set。 @@ -612,7 +612,8 @@ TestLab1流程: 批量写 -> 必须读到 -> findkeysbycity -> 批量删 -> TestLab2流程:批量写 -> 创索引address,age -> 索引查询address,age -> 删索引address -> 索引查询address(haveindex=false) -> 索引查询age -> 批量删 -> 索引查询age(索引还在能查,但返回的key数量为0) -> write -> 必须读到 -> 索引查询age。 -至此,上面的流程基本覆盖了我们数据库的每个基础功能。 +至此,上面的流程基本覆盖了我们数据库的每个基础功能。 +  #### 3.1.2 并发测试 相关代码在`parallel_test.cc`中 @@ -631,7 +632,8 @@ TestPutDelete:创索引 -> 并发:两线程写0、1种子数据,两线程 TestWrite(在之前基础上并发所有,并加入write):创索引address、批量写种子2 -> 并发:线程0创索引age,其他线程忙等至开始创建,线程1批量写种子0,线程2write种子1, 线程3删索引age -> 检测:种子012所有数据都应被读到,一致性, age索引被删除。 这里的测试也可以加入delete,或不删索引age检测age的一致性,具体见注释。 -至此,上面的流程基本覆盖了我们数据库的每个基础功能之间的并发。 +至此,上面的流程基本覆盖了我们数据库的每个基础功能之间的并发。 + #### 3.1.2 恢复测试 相关代码在`recover_test.cc`中 @@ -641,13 +643,31 @@ TestNormalRecover:创索引、批量写、此时之前测试都检测过能被 TestParalRecover**该测试比较特别,需要运行两次**:创索引 -> 并发:线程0批量写,线程1write,线程2delete,线程3 在单条插入后,deletedb。线程3导致了其他线程错误,测试会终止(模拟数据库崩溃),这会导致各线程在各种奇怪的时间点崩溃。此时注释掉上半部分代码,运行下半部分:单条写入能被读到,并检测一致性。 这里我们运行了几十次,前半部分的崩溃报错有多种,但后半部分的运行都是成功的。同时也追踪了恢复的运行过程,确实有数据从metadb中被正确解析。 + ### 3.2 性能测试 测试、分析、优化 ## 4. 问题与解决 +1. 我们对并发的写入请求进行了合并,但在测试中发现了一个问题:之前提到,putfield和delete都需要先读一次原来的数据,但他们读不到合并在一起的请求中,之前的那个数据。这就导致了不一致(e.g. 将对于同一个key的putfield和delete请求合并,处理putfield时本次处理要写kv和index,处理delete时先读,发现数据库原来的数据中字段没有索引,于是删kv但没有删index)。我们的解决方式是,对于并发的写入只处理第一个相同的key。这同样提高了处理请求的效率。 ## 5. 潜在优化点 1. 使用一些高性能并发设计模式,如reactor来优化多线程写入时由于锁竞争导致的性能问题 2. 采用一些高性能的库,如dpdk等 +3. `GetHandleInterval`中选择一段request时,设置一个上限(综合考量max_batchsize和索引写入开销),和子数据库的批量写对齐。 +4. 创删索引时会先产生中间结果,再向indexdb批量写。设置一个单次写的上限,分批次写入中间结果。 +5. 涵盖复杂的数据库故障问题,比如硬件故障、恢复文件丢失等。 + + ## 6. 分工 + 功能 | 完成日期 | 分工 +:------|:---------|:------ +value序列化、lab1功能实现|11.19|李度 +fieldDb接口框架|11.25|陈胤遒 +lab1整体+测试|11.30|李度、陈胤遒、高宇菲 +fieldDb功能实现(没有并发和恢复)|12.10|李度、陈胤遒 +并发框架|12.15|陈胤遒 +lab2测试、并发完成|12.20|李度 +恢复|12.25|李度、陈胤遒 +整体系统整合+测试|12.28|李度、陈胤遒、高宇菲 +性能测试|1.1|李度、陈胤遒、高宇菲 \ No newline at end of file diff --git a/pics/basic.png b/pics/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..c07bbedb78d429f35c231a52730a783b5f78f111 GIT binary patch literal 24300 zcmeFZcT|(z*DVSbP>QH1NEcB-6i~WAh=__v@6th9=)IRH2uKY`?@fA>-id;MfDn4< zNG~Bozz_mSI1l>1=lh*|$2jA=_ntp*#sHp>w)Wm@@3rP!b0thwS&o*9nTm{zj8^{T zGj%euv(vye=>i4tyQ{
xh z^QIE+xLn(S!#_S}-}vgUT7n~}H^qgii0d3$7JwaOX(6XkC1OwpDJow@o1#h>OOam50f%;IqA&= zW(CyooM>CPF1itumhQ_w)w5(<+PvIYC7tK2 gSE$3C)o0J$}~X zXrr;tW2l|&OG=!Fwr=~iq*)1HToMGxpsu|EBR9omBCFy?**$nDq@@Rn#KNVKbZw~0 zoFiMZW5WIYv}ee6UGrT``hL|4e)MzOsvuB6*;Yx!utgU)5Yh(mlw{aH;e8F|YWC1D zAmxSe1_fqavAva=LdnCp_z!+BX6fy1&ds*h<)Ru{y-MEH-`$`{BlS3NgGe2MuFirp z2hpyEJeM_g_*woz8Y)(r)Aw|6+CO=ovE>r;nJ5H;r9`yO&e`py-Zhf?OaSj}^&*}A zh;6mB($c<}DF1HIbA0yPkF-+G$a$6BptrI64IQM2e&xKIOLsYa!-&5o)C}mP^nGAW z8LTIU$dhIRuv;bk2&JbNY1TFD7(J`DmHz{S%{3D@67!=xgHhj z^pu#;J)N7=<8$e5g{;RyYNdW1$!SC-LF+yiFOvSC!SySr04e>CzJR^zVRCnrxd-a) zbMAhM-Qlq32f{n@QPObUPtOh&k=uu~)(;nO5$<}#Lw0D=p!%w!J)A!SQCR}5*^D{T zu5ClJKYof&i1FNx;eazlZfN=`4Snd4CCq=_a9efv2G@U=kCuxCGK6sODlK}5W7GuC z1h5Zk0Q (oy0osG* L`GznxDgF4o&r07o*c6VqCw;c1>-LT_^@}kE zBOzdi%s|z37j#L6Bq<@!$97XLN#q7Q33J%pbq|e`CN@Lxgsv}fycFJiSQH;qQ17Gp zY92H_j^H3Q1*tU;7XMOvw6wRjB|x@)^)!n}t3W(Gd&l~diyU`^@wkpKl5)I*mZ&^? zXaS;q%!!^{Yvb$qEcU{V=bS@#TlO1-Y48iXsa`uOXh2?xaJ;^7B#V!C+jVc#<^f;x z0|5vMO1g!GA+yGF8s0d%U!{6ZYYJbn&&xI-($9lGVwvJGP5Jv`wkNyQZ{E^Nt6cjr zxWxX&T)zu9Nd)XyJ9(}(;rR1N?Fk91lSi_lKhwG-DV*3u)LW;+ 8dDa4T$I88cs)K`=6A{?SZ_NbomP&a6R?5XiBb*-1yR8IsIlxTe$3-fQkIO zskR7F8@ t7}Y7b1yC@d-~aok)#5^wk=w=-P#$vq=gb?!?!XkRg73=yRoUSYIyvb4ORfSGP{~ zt;+Rr1o^GZMwOOj^R!R!`%s9WE|lCPX^W%Q*lu{Pzd9wrPr)!z#yego;mT@)jszh) z<40h#<>L@B?K8}E_=T>Jr}G}=`W55ukRO)%QL?a+BeZ#VKtK(zaC~sc8`E$i^20ng zXmiZ3e%2KJY-3(#=;1Fs^*CIFR!ch13&6PqJ;B=ApZ3&>O-DVrmTEar4=@fuOj061 z*nf$uC<%O_6n)ZhX$x-diKHty!Z!F2l`eq#Q#6lnKd#_ZIx0q<)0H_LM#u{FalAl- z--6dOIWYTUE`*v%1?kKeeolxGPbGi9!SB6SX_uzosOSwQZKn@$wR%h~(Gqj}AGMOl z4o@1@7<%`I;l8Zu!!s095Ejb8Auc0tc{$BK-1dDCi3*F7s+e3h^|&ld<41ambu^U4 zYTgJCP(Hk^=%s0Swa^7y>7#nDhP`}W% {lh1!pS}>G|B<^K?!NKNRl{s zo|PJ=qg|NI2NtVUmF4{So2DQUbpiHT?}w)Et%NjzxM9^k^)=TNz 0m8t=_BYbQ>IcuPc~`fLvDwvi|EtAm%ZTk$k8vdq z!AaVc@ab>MsY1UcZI9~^S>`7KzQxND?BiWBtppcwe|2fw=yT{JYO)r9Em56bLkXSi z8F`+pTLy|6Ljz=k<#*H+Xmj|+R4;Rv$L=iClcZTR1eSY3%0ko=1!;L)PhBMJhb0sJ z;)Y3%@54pfO*bx;`k-vnpZjSxMHTZAe2Duo*bRY%KeIbEjc+N=Hq2Xw#{o0ih3))y z>I&nDtVm5mh0UmO*>9&Ne(TRQ>cWU|5I>ILy5gulnr;=F+5Y1O0CEgIdO)LVVO+au zHS3agahlLxWwHFEj%IWvZb#FG=K}q=!)S3^pQ>&PZP|MYiwMW~U%GpiWQpJDoh?M% z+;` ypnN2R4-=owRot6+%O1T<0_`mLEAD%T_QYae4Ls-|zCG738*q;tCW{>jAF z=&PSaok!#h#@aN|p0~H|-iplWiei}R1^JaCYz${qO%SF^A*(NDxIm$=AsfX$w0Z7X zN=rtR1uvcM?c !%nI!yd@Sf&xpWC#-LxojydG){2 zG4!@i;#O*c)wuHRB_v=pV9YieR#iJ5Fgv7z$j9XIkj$NRv9N_vmM~msE$R0 ER?h4s@zW6j`nrZC`p6+o|n`rDSU{&|` zS?r7M;tckBBRfPEpTkL;=dYWsW1<5+GNMnEx8NqnNID`4;}GOgi})z#_S{m#WfEsu zOB}rYa&UE1*vQiTSSbT++SoYw>i8y86$8L;qq2rkjAYw1r!h~z3?XO8jF-B+`pTbk z|M*9^+FZZo^Qi0dldAn&eDcgxr)mZ7?*@uk2(SE&;Oml?o|Mwwq0d@K4(Z|^S63H{ zXP$^TiTS87Jfy^Iil2mp9W-Z7g#(7K@2A-pg@X(tRv9~=)NCTb#OyaKggLFD=&`j! zOc9CO!-+W5M%s~p2u;-#2()`L_tHU1&`3$>M>)TNd>HIu?@~H9XgcDNFY(M_tv}YsDUInOTnM2 z8k* c%>LW?OwF8-Z+r$@9w8L6uoK-?|3-$!2QCs z;`n~UB|u4Ww+Cv41#7z#uj4rKT#4nfLzY=>;5W!GUdK~bnK5&Z^;$Dqh}2q$td%Rq zk-3-Zzp>-S^4e|yAf^)#@ToFy37sNuGIQB~bPA_;s{iFOPVY?p%Ul50Z|(j|bnv%h z0C4!zCy|}PG~0i8g(plvVgJv6$;cSb{y*wjIDOTBtGR)U>`Nx(Qo%JvdmE9l%Cm3V zLsr! FaH=;11 ze*HbV^5jpGgHshPgtspC8PHeI|4E9kRqk4Sc{tbxn4+?G+5SMILq=%JpFW2<^zngf zkahA=M~o8Xmdj@aap RT e zW^{5#tz|q{`_mjt44Z$-)W)#UyL~yNX*#&s&asJZ4aiW&|9q-!s+wVVrP+C($>{Qp zX|Y|N3#%NEsSR!fTYL+N?fJW2qjPsR^_Wwd*xZ?7E%DmO9QiL`$^cD%8zeI8$l!!x zbk!sN!gS Dc_uMK@*Cnv@IjywqsHy1!OL*we5IROuKOkg?tEE_v z; ;7w1g0jUA;;t5vtk91&vzMtVZVVeHT zvm1uO(c>7??sl 9X$Xn#^^C0WI8zN =F3$th-zW7f8O!}90*D`|_t%la3b;TMkYrx 01?4~lUF)eUlQu3_4wrDi}4==JN`EmlQ8+yq*h`K zQgsHm>=;hM7CPIh{i80xZ)23j_II^=ca1Y=qO_rpZ2k7wIR^+Ar_f3Z61kPm-M%%T z7O%5l9mn+6!ad1VafyI_e >;d4)U1 z#8?j?1Qt&Tfq1BO2ot9Qt2BdRi10>Tocn)vD-_hjw~nya2!Xn>q`jZUUL;MgXTjit zch~(xPIU&3-w@q~Id;!%6h9*{s+DZe1Aw@&SM;CiGKRc^L+s8wz@~#5bI@^^niC2@ zW)RF7$v#!U9Q*tyVd@Z{r?5^?VAe_q^6&xIewVN3hUe5{dKPE~P>4N=?>>X4^oCSV zhu_R93T87;#jfnFvScUmiR3aD{rRN+gv Wh)UHyQu8T?>qho4#H`#o1p~y{f3NGXDeqnhF{;H8fP$4V1A_*)PZL2 zT}|}591|+MCs6xxWawi9H~wSwl0ZeIQ5)@7yoP4izFgAU0icMt9%r^W4j`0{w2;ci zKOedSrx+O9>_)3ze!O)r>f`*Ys1RI1`KC8N>e*2&CshPU>-(atxz)1J*5m%gmVWf> z4;@KjcU$s~9ESKR>(SXD9qh5~`nqu$;704m#`QTEn8-T(RUOJR)oFnDkV`!(NK`;0 zo-hwoxwlrUzpw89!ton*Kis@UZzyadX6q6WvKuT>*>DrnUo-$!o0C_4SRZg!7&B~H zoq1A3*t>#E!cD>KNw#(1PZN6>0;r4ZrX5WDoS-g}AxLyE>nd+1xLLRXTpZ-fbejB@ zjx>_4eG5X`=#tu}P;09V$6UrtJ<3w&B&S~}v?*46itg|Dk}tGKvI tujh70= zae}W ~-df+F8r{v zedgj?7sDx>xqLWC7OfAn&@Ph#yZKtgr;e6H3dmmtf?w<}ftI%~&|M231%$1k`{-C^ zd7wBf4z2ejZH!C>Jc6JNhbqQ*D@%^Ba${Q(!j?6`J)I&6+OVFx(I@<;GK4$;Rcu!Y z_m01U!GHV5&CSei?8-~zH<#;6cTNP=*D9^T;akH2JW%2=k(9LQ57h*nXenkW5QL6} z?TVAGoThm7Ek|~=#1-j6pck_(p*N4$fX5a391-ITr}ljif!Y;#tya}jvthV_MLK>- z4Dv`3xJ}CMWMM8~<}Fwx#M&
l?;tnowe*a7`BAWurazHl`}xqC zvBX^#-U8r2LgVvFw-318oj8I#%A=uL qdrlS) k_5@(2dL!UJGfR%z1I?kgj=3 z9E4hxebpN;MQDpi8s?()oYPY=DC-EW{>Es3eOtly;o|Xa-&>aorh}zbny@UNSF;D; zUvj%;hka|`hslTzs}2LnT0LrCPA3+vvSp$?v?P;f`R^=pSX(YkCHpX~+ZxHXeBWIF z^qXq|QzP$V>0O+zZ`pOf3`;&@H=NtEIcBYWK4br{d-hc>e8X3&pSmY>4V(86Nb<@1 z@}vZ^LgAjfg5&ND0V>w1PB}l)$aOk6FtMIFV_h6Fv7U=%)x@rA`fzf<19grG!#bsi zhU>z?Qx?I^O`9RFn8cyg=p({#LIcs3MQdQg^$w1Bz0~)gLvSgp#czn=KzHzQ8nPyy z^}a07cWXBK9+YddHu_BD-DJT9
Vh~~sse4Hb49ahnb zcI4)~^{H34ge02Rt?mNlt?A8f!}P#;Gf=Rhp-V5^QUgHE2kA C6>5 zrn@B?M5Rl(>%#B-W9cROB(|vN-Jf%cwZZVNvr`Xdww95K?4bH1RtsQMlq|Jk(*Z>; z#NlI762OCy07ceq2(^6`f%~b`A94#lw%+c=dGW4rt$p==dJ4yz8_RG%xu;p(9lZQ@hI*Ez@?Xsn8atI00D^aPB2ELP;=C8CV;7>J z<3>`M-wKR;tLVz!DH!cNZ=KdK2+fY#x9VAk@z0?#R6@)(_Ux}Cst4Z(dci{$tD`F? z+Pa-xo1_QjLz;Y6J{d_q{@5RJKs?j|VC5C&b)Yp&*T8ogRBZ^O{Pt~Y9nc8|b52z8 zBF9P&e{Jy;U29c2-ncD2e=FkXAf|g{#eh62UgnjT8*2-x#otE2s?UM7p%}9lc1KIb zuz^tJ-d#DMzy(82-8_>1XoR^4n;kJ F- ==(APb2yYjbQ>Rl+ZO$3_95Q0|th$&vyflg>;VEubdnzCfg{%w89{5n> zW~GL$M@vJN2~&7{UjLVa^+7$B#xb-d5>$mN`!LI1?++#=Y#2f{VJ|+uS2LT6=8l?i z8gh8v!)b(3k7a+Y!EB`l(XY_)32}{H* yH9t3OJdGZaAAL2iW*C$zw(bxl}vZIz+M{uLwo z;inYv9puh%@fPyiD0x&N`+51wI0MmN2F$PTFiToAEc`xl-{ye`$rbuDEBU9&)80M6 z_n2Gx1)Q@Fj_@FD2-XtYuK3dBY!ldLR`D?!xJa=vVA+xiphW9h#CHqC(Di!%09fs4 zJ_9v(?=CR5=vuV($S=D30G9BfFIJtA)aPo-ve`m}_6i+#*?;C;qJ1s!M$_u>_;a%u zXQ95yhF#a5FGnqEEWm`<2wLKIa$oB;AnJvOWe+&ItIkHpp9S!U@R$_<-6x}$$vOI3 z!csQKZ_3FgXREuHKKrw7r|JeW6W@=$HKL?#3$n|*GcjkF%bAEDPiwV*IS9L0aTz1= ze3__BppUcYTi9Z? d#Iz;gruoSRzE4Ry1MofHEl&tJj9RYc7XQ}Y#0pPKpZ-B)D{sOm$fRN?y z)t8$<;rH(?2nbGpuV{cb{CoA^e*5y7sk=4)}BhtLy>AAsg%Cd8~GUJ96@Nq+IXaVgwxdvq}cml`E+Z^>P z)sAfyM*JNIb8{T6FOn9#U-8$7)$3=$B+k0Dz3upwK8Q%_V8YX #uAgZL=ThN;CLiNyBaRpwtZ^&|c#Q z+S|>#x4?DfJVJ84KOk-A$V+#P(O5&E#qETp@*-%+aWo%ilzktK*hPEcnVR<;B6f(q zX>J(QTE9ZifOklehWA0Lf#}6)|K vZ!Kr;CvgZ!OU8^& o{somBb)c!*ZN@aHiI?MxqX!>P))C||77m{ zlQI3oUJmKZSr)=B%57C1E9mXkZ_Czj8v<8K5(=qXSiq+a&CK^3R0Py(W~He;p^@E7 zuitZj^x?R3?8BM7e|)R&$ !K{RDaU!MOGdbs7l?aF#aXFi>(L4|QRiNACNqd~HRSnJ1_K=i z0zbht4^4l@N^bBZsnl%mw)*kJXTjxesQ;ubzR%|vaNJ+caXL(XiF0Vy;6RVtn~#+j z3Rx9GqHvq@NsLg1K66?Q#*RZa@MATBIJpMGEYO$biV;YhX>vI9w;#)wb}T8JFj2LC z4QRICw%u|n_Wi`uFN}Z)YQ)DXTHj0%Y9uC1{P7(|wm^?d8ZwgJ9Gsd9xcQlW+#s_w ziDr&vp?_e iAo$Ob6Mv+XT^w(@%U`(g{D)M5-{ zWsmE7c*I!VV~SC6a|Faj->sTvOpcpjN+Tf4dt>Up1=Eav1y1UdiQp%h%8atntr>H= z9$~D3ghGN)9Z?JU*BX{UkLaf|#}hjHp%CiM?tIfFf&JsSnh;n-XUTfM|1Xi|J$0Lr zD%R%J{N;K}!P &vqPZU?@|L06jVQ%|OU zI{yhO?fyG_v -00{}H_g$QM@B7|A@P5qabMra(?7Pm{`<%Vj z;+n Y)|Big{x?ScKC^eKb^(clgdZd9uYlY= Vzc~(Nwn^K2WIg)W-;SS`1F{4t{o-)A zP@eKE6=i!gr~C>JM3&$&J<($k*EH%9*$@{MhzglIJ>>U1N2kifO6g+x?W+%&M=1ZW zvXvtS`mkveu8Lt*(!S?0|C!v8z|@dJ4R}H?cWyHD(p+LkD?BO3Q76K%GYi_yeF!Qb z{WK0Aa#A4(L%@4CqW>VxX~Av5?VrQVs5q^<=7G;M6RXAK4Ct?h;}^I4Zg7K+7J4W# z<74kRYxpan5eD{={~3=YGnQKLC-&|0lFsf!u-2!2u2J+ h{IUpTbdrUo*BgNrHwqIg7zyz#1KYMD1& wDl2f+fYl3AN_Ns?))=V%1izns6Rd#W6EoKh{p++ z1B}_tW1@Z@O%DQ&g#MJeBQ)yGC;FNEhF1PJ2rJDf|EXHesNuA=OR-sq?d!hEr6&|} zONB2o+V50x+xN9tuW{7bmuqGzr7xhs@-fB1vefC>4eZ6sfXRtgq$L~Q#!}s^OxPVe zc apC>0%%Jb8ri=Z)DaL=I8C!F zv@` e&;7mFXVDjD%vJ69)w%saT!Upup$^Nm{syi?H2ohn z;MOjc4|x^0PqRJ-^KW*!RsW-Oj=Xd(b@`e$b~^mK{s4Vf&+D-vi0rL{-!zOMp|n?O zAai+&Z 8|1AaWxG|lP@GWDfE2Vq`M%K$iZ8lv#7bZKR6hQRbd70eIkUaMnNeiy( zL)M>Ho{we_7%_V$8XXSgkDiZQTBchlmWLT;AD2ryfB$+x!rr$9UjsqjT-#7a{<+=t zN&U{QbA@Z_ U z!rGkju#?E UB`?qTdn;RVzivCK*fNRf>)pa{i6@tCJh@}A&=t-LyR_4p%wPgY>k zXcIN}BfTTdU7YFMY=$#S4E%2{a9LpQtNZl9cj`Ord;JL0YmJMyv=PoP>c%%>AaM-> zX2_o`TJXm`pN;#`V&k7w)-xwJP6t1$ObLnokpHIYf{&&7G7wI*|6OeTn`QUQfvi5c ze+#=KH~t?gz!6Eg@lufUsLxfRF(f3cp!srR6u`+#$W^F|WXCTA#)=NOz*td~umoj3 zjXR%S)+b;u!+^Y6(W2$r>a#}Rt8J4Q#r#rgJ!%FpnDb+Lzx8I?tg@g_nS+)B%v^70 zEWL@@iw6eqpx#HkM46!}^nZW@gn?bT%pCM0u-@TaL`Tl^QQ|`JwKjivIj-5XOMCnt z3r23oV(xYm;^+Vsj#DjJG)icoTX6j62RsPRU5_?=q2|<3Kkq?=>sz(SgWewj$D>22 z+t^cP6s)xKEm3s5otvCL@EY~32Oy)4 p2X9(H+jXSgE{$_ ~Y&s?_F(%-L>zMDpPzX zc<%}JSFAw;Q%;nmu3zgG&50obPyN~i;re35HersKW{aMkK+a8jpsceU73h?!(vjjC z197kcz}55AOVQf*#&*?Xx%(aT1+fOPWQ$>-&9XVM#$I zDzrHb@3>9cNCCUrYIX|3zXg7(qY%ELV|y`GFaC~>($U`v!v$swt9NgUvqJx(Q^u&M zP8Q(@X{EkKnGoARwSFQ)R{wI}8GN&azYlqKUzutPW@NvzavPT)!>maeJ#7&yy8zRQ zGvu82g|qSSQ}#!7JR$_aF5ikGMZU%NuVYG_-9e_^mNCV1R2;kP4L}a#6T=s{pYE~n z(USVWFcgq91RDRS&yP`47_Cz~-FmX%kMWs)U=QgzMb%^SOETF0wQ|7TUHj@V&p-iu zXMLZ>ao@VX!+Q} z+Jp27M1URF><#`94>(q{6;qy#S12RfKUjQxSpV&%GTYUWWinx_J=%ZYZJMmZc zW{G=E{Ju2?IRo>pqO z1V`CU`!?+Fg&0;N` sL2`A{#m_8?EH@C&W}NP?Dt$_7kRSFsRoQ$YNV0wm%y`= zZ9uUHfv2F+dwaDtWr1kxC(5mi5_=o*e~{tDs- ;6l)Psl{ fC)@aq_XJ^S z$&C2y ztd|Br<%GQaOeon1Mf{F>4JiD8XM9KM*rN4|b#Yf|tAqr{WR}|M8aBQ8dS{O#$-T2D zneCM$Uy0HBcEjb&YSeXwwZQ1QBkaW1_7VoX<-leZgQD1gs9!8{;jwg{#c=LD>xGF& zE-AxaEv1{>HP_2Df1p%x0JIDe)~=&N9;S!K8<*!3lkg5Mn7GGS;67fMm(oQer%%GZ zTBY37eRTubR=sey#w%FFsIG=9)qfGdd`G<%!}qJhIM-+v(rf+Fi;&0_BN+~O*Jay$ zgpQh~;+w^wpzCTk{y-FEqi;8hVJ0i;q{dSNgVez@h~G^q-;<2>UKrsi+pBJ>=4x%G zHsbY)8{cPVwxY6_h9bq_w-_<-Aw%3FNsNSFW+fB3J6~QCy(0jnZ01d+l2-@=UneZ) zvyimXemSD$uQR17=(qjp5K@ns3{7p+s)^H2VY#Ug6S!|DBe2HY+7Xo}O%B#xY3JRV zDKz{cn@)RM?kBGrRQV7cIyj*4z)hvw!`OweS0UYRP!fqbi` jT6tKUny_6*Aa}jmRo0uzw}48Ch6q zHpiKw*4vUhUc;YVc(IPbyxB4d=4}65L_V(*F6{i%vkq|3vNg{w;t?^h35;+KhTPrj zc2SDcNkEEELQjetfqbqzK+b2sQ*1j!76 @d&AuQn8{K~fY+rj?llOkP^L?-= zsLb^|dmTCdvTptOS!)$WIN=#ljj5>hyhkPWZ23NOc!|n^BL!t>4ZGft$?ccZtSwJw zjVZq^u5FHr-3dY^2cxlero!}E<#EkcikGQ?m$fERGYUL>)K+Lby#|J9KqcE)e*Rd) z8%4tj+q~VsOy)2?E{7(%4c& c{LW&z zXKvolnMU-VB^{;S;!T<@*`mQsQ10N%O&MRV)Uf|LV4WK`ye%+wBm+h$aXt!Lo>8!{ zjISRmGm#o5l)R_s#P7!Y2}}~=#0pV|T0XdhyC_{=+j|8tC)vv)E@{;r0c4C0%DH?l zJf^Af9ACP-9&7nE=22uu919s1Ie)MKLrWnn@oi~bO-}|CUc13}aGA_6*m=?SS3ik+ z`>K3Nvxp}=Z<@9vA|rl?`Nfp-P+V~F&K~LE!;vS|8lSke_#vF=EDhAS7wHm3C6{w+ zsAwm;0Si2!^m0P?cJ8P$w)yLFNpa> bYnJIqN`Bt% z{pKgwbx~(7Z2pP^giZ@IbDbCBA@43#aUushl%FS}TBDU>(b+0s^IT;NRx!O)dEuM= zlu%>p9+5D(u^Dad!ErnyqZ<;axN9q02XAhAJMoK3A6N@Byuwo(emh}zAmEbH3EJcW z?g6G-Cvh7siuIvIR)Ox=+MVvQdGRq8#T&Da;UHtB-uus|=UbbKXVd)5lT(rNpYV0v zO(*8-FrS#g!t3X6T<}|W=Wd@>A0U}?PwdI?^Tb8n-X4D6X8f^o+%0#JnjIw3F?mMr z1UpHp9|RSA?drhfYzM<#JxXkj2tRZaW1gA>52L-~IlP}P#L!Z~=x@tJE)rkUFD3AC z^ 1l~9Fjt4S8zh^_B$%J5uhgyIEoXJh=CGJo#&x)O*3Cy$ zQYqKfr|c+-Gj7f~?s(Y7u&?&UHBnX!M{vhhw%!e0kAiV7QU?)E0~wL*tP<8CFxs CO4CuOjWHy&oVH2g8aETsEKeMmZO?I(nyL4HPVx68 zrSu$1?a#~E;l3{J2V6BvUv(ALuy~4~HRF&9@zG}AUQTqq_Eu1zzjp z7njROGVp)Y198TxqM}TtcQYQ2fPzwMk?YZ#%Ov{;KfcmK= $>SH zi=gGe$pE2!@VC)}my?Jj`qoPv=Y){078;yWI$S^VC$5M#FiL0j6F)((x-;i`Ya zAor}d(7Uk{nA~>|6hRJ+cwBkzZrYi9%DMXr{v>0 $>JI z#D7iuRQ>DX^S+m1z#5ti@ZwsOO0=ZFjT}l%J$7R<$#}fK%iBLBlLp%Tf|^YO-QofB znDR$9ay4+v{y+K)WB6Mq!Z^UL?7OkbEj*VdaWGaHF33!I75#+0HwuXqDnYaJCT{D# z5nstAV)KG|z3_D{qgD37BBSLWL `-y|92 zEo1X$2VPF 3xYYUN>KrT 3}H7QK}ZX{?R9 z2Q+8ha^ANq(A^GGX0>4a_TXUa(fPQq`$iF(x@sBw87~n*R~clHuyttJOn1fc H~AChk0^uqFxp<{AgWehmZcbn!K`Ad9Jj z-Xfmy#QNN!yA$ay(u d!t}&G#_$mU(uakj=zakqY{(Y{YH|zuN=4m3C3BO-v{L)?F|lJNCo1 zAL0*0t-ZlT%!j-E($@j1DzyLnT%HPQEt4X}x0Eou=s=osFHcCk6F*4DJCIW5{($eP zk7bS-7Bg)WbW%Ww4|)`aecy^+sKCuChyOTEGqJlRZ8^IQIS>N} GirtIA0a8{7rJ{V QH~qeI*uj+^1jmY|<=WoxvbViX}Mn40%S-`XFJRg%G_k}a>} zi89JYXFx?Xz(!LgjAp$?`8!m*5VOsyZxeX)o;H~raq{2)9f2-_mh`%zSz^qAD{dA` Ufh^EIQ9|Ovxl3njO|C`%7cit382|tP literal 0 HcmV?d00001 diff --git a/pics/parallel.png b/pics/parallel.png new file mode 100644 index 0000000000000000000000000000000000000000..db8e47481d6897d62e9f43d9a7a7a69079f6730f GIT binary patch literal 25730 zcmd42cT`i|*Y6uTBF%y*AYcLMD$-j(6zRQpg@E+lApulS6p-GF(p%`g1Vrf&dWV1r zq4yRD$=&!ozxST=j&si#_m1<&%@~ZmHz8!rwdPuD&d>VJPwJ|#s3;gHKp+s6g8U0j z5Qvx@1R@|OCk1{p{H>!IxDdE$zIqOV4=}9(55(3oDl#BYdE`~>YZBo3inF|d8whlZ z?ed2}LG$4*2xLjG@Ipr0+jML0yy)3Pz$zX~)N)?Va_-`<^?Q@OrhI8DZ|Y~JNQv>} zu|jN3 lian0Pxq(`7GwOj0xw99GMy^J|jb;-$1jp^oJ8K6e z8w0iA9F=!U`SVeq*NiuRDR<~S0tzb7T00EoPvZSEo}GumK1q#q$O#gRkrHT1gR z^k@izRrFgljw9OBk8>2V_B6HL$p|g8fS9tw$;jWTo2Z;LW9aHPnuY%yXS!V6tzWV> zi}9P6AE23l{&qMwl|8TDXsH!%^KyLb 3(`#2^yOLHIUcC8d0e!c9BXHuk}F)j zabZ>}jtt(qD;pu)(^-;E*{PKzj&bmq<*t!TSSx!}vXm^8Ha=9~UaXTja2(lId7B-* zlr<7@*!j%h=P*y?Ys(xaS;Ihf+u@NMgoI(ck2BoO_Y0`C?Vfa?Z2*p>{+!-a7TmVA z6Yvr)S)VS%E$xioDDAmB?=`y@lQQif^bRERl!UP>E$XC$6OVD1GbMUsYXdHQULyE) z?TrWX!Ct*5W3$q2R(0ME*LjXXb#ZfI^1efMs4R?+J_+fWPI~;j1MQ(Qo&U`4{#A#w zxNMM&-IJ^H&__yQq=dwUyYu49z8ki&^dM&gT2^U~bocFZGSdh6cBftw{MpO;<9!QP ze1GSk7Ci*VNz=*QooB-GWz59#RJ0P9;Murn&q|?;j7U|6;kQ4JAnQ6D^jYwggUzsg z$D8)78C36j{O7~m26v}=Nl(9#k>?KU9T-$TXl~QDGA*<0W>z|(aHo4Dt!`Q(PR%fL z@L57qZ5G|JRlpxDQ~E&VF}}JX;ErlDv#gR &CO5Csxm9Nv^E)AYDDt9;Wm^gThf8@uuhx>`khy+RU+pnS`iPu1lm7(QXSV=5 zb*Mi-3ay?oKJTt=b{Id9GYn)+q+fWaSKUk_WT%G_Eq2cJ_%sIwdcFU%`4`tAP>|%d zEf`fIOGEomfZdL&Jh(R4F>A*?AVnzzBx7LBe@LYGIm(@joZUn2HBrDgc-+xVERke} zhdn-(?(N4=*)Xf&(v8|Hk!|rV!Z@GPS+ft!gg)<2+CAZ)aOnh~V;TZN?WHj=O(Wh+ zA`8`Vw1@t~j7VrBgE3=xIHhSx>BL-jlonC7=v_i$>*jCD=yI2)1Doxqe|YVxlv#Eh z?H+f2r^&uMWoko<&ZU0DVOqY8)SY=%+Iw~~%CI%&{bpy!@#UC_tqRInUOcjjG=2?J z`m7lS`D3fhd;(cv8L?*#pF~$L#k-TK&JTS#H-(c9Ipy)VS^MIZPY{lJ1i^*dcsL<( z^}((KcC;}6^=- a^5YiVvyX zs$EXkYe#Gl5-(=I?{2;>v=az?c|4`nP{^<3D#60Jo}B48WA6FMCl0LilE^atj9aYv z;^DDBUAk)AsO{!rM+P301VMap6eH)>tY#McCHHdt @;iiZ*m!!+<$zB!YdSlQeY mZR1k_NR2*x0*POaCw?5 ziQRWsNkN-82?!I qj%x;H~h=pEb6{*QJU3R>e zHE{OO7#@$1$lP{_7!H_a_V}Jbr&$$5D|AY~9<8tVYdE6#{$NzpgoB{rHNE3T%ib!K zwv^ZCk1EH6iQKa!xq4FFdeZ2iy= zH1x&^>hM&l+k3=pRH5?01*^z!0ax*c1;fd>fTv;!swhUQ-*-F1W+b5x$ETv$FBG{~ z?*Xo7DqlMi6E$4ao=)X@6lj3=cl&X^Nly512+es)WrJC^EvA0~S%#(V_r+7rgFrQ( zK?HpTR5+a0nZx}b*l(mae}LMGTx*3n7mxLL21Vb4WMoNkj8#>&pKao#Ar-A#q~x)+ zu%6@BUZ$_Iiz@IJd!K%Mr~93KRQp*Vxks=pECa@Nf>d9rA5R{pnO{h_s-8+hWjrSZ znC7wum{##v4|kYSe>s*NE~uUL9RX>hGY3u1C9KY|e_~TpuB%DK6hGs`(tgw`HDpEj z?Som oJcbTgEey+`+-kvDY^634~iH-0QKVhG(pfphnz zL2inHtf-3ta#|7WJ#u1lUAm$^P>`lfI@K^dY5$f-$=-Cl#vs*9!HY=W;b9)K_!4g- z(fkF{8Ez_eWHy@RGhmfV>mqcd!JOXaVZ5C=9T;!BosqO_Y|+b9)9{9>gI|w9MIroz z$A^emXAV) FHbdQ`BY;)7Q z^;!7q1Xo>nTVb1JBxDn|0@E8zRHUZ;b0<3L72tz=2c_${Byyx+_=t0zenz9r*xM6` zKw4?ZecGJH^s!mQ{$D>FNQ25=`eARrZ^o-fDr@>#@>v1A(sXyw=}b+99&(Ew;}R)p zQPXxd?Cp-S5y;{$ES+QhGpPyWz3Un6*+b3|%@YZWKf5DkeDjn`ynV(Ol3xvQ`lsKQ zWxfvd9WZXAnM0Z1P^6$TFgb1OY@X@Y#-?) C&u&63Ea2qs9B}Io{jU$ z{O}$$%;Ih@F#Gn|71hUvkU5}pVkM)KFCAJ!%5M)ys?&5>iBnOZ^c$(Sg$qj;+L#yi z2zmlO8Fx}zylXsBuSBdGGUar$UE#Q56`qH=cs7F<8|iS|K4fh8>yjPEYXkSL^$qR_ z2&ly&?-K-9HQgBSa_wbSc!l9Hu0(w^;Jklb;^PiD)UZ9;hV~D~RO5Xa=YA?8V!nfY z*j*sf72zQ!R}ZrO!|e3D&A8}x6V7%}d;u=(L=1~0BZqU}pyNwW^H;z`l!yg_g7}~6 zyIbM+g9Vo@Hp&}se4uKsu09GA{+dM)yky?D?yBEbu2p{A;)L1hz0Eq=dcoaO_1Y`9 z?@qa)&w^z@O6IrBnb4_=XDGl3yJ+!?kZr`;Ucxsa(jt4}Mq8P(C*!L+9mu>RR_C?S zPZg%H9{$ip3eW&lpeWOF?F+U-KnfO?w2;b0PJ7yu08F8S`TzJ?T-`Ao^%bVF-CTg` z@Y?#Zb7w)|EY4wqkQkouW1h4&V7JiNkAD{G2aJq*X0UOHk-=toobcPqAOV4ylAD)< z0`t0FWKQ0u%~SfFnFk?Q{b$lixkSYqGTu7MInl}m#ig{sd=drO G6a`pm%`t%~?|?&OPwoHoPasRsFDZsuzE8otn@P*1P_l1{g%3GETo@MX>R#Giyp zEl) zZih;uWT z&i3x`rq%EdB68Y%r&dh{`P|^Cd@V*MMTn$>oTrZZUdG2|JR(}in9z|+7j^FMKv| 6;A_-pS)4M-+fn?qAk|G#{o#em_wI|LH~0-@#!1YG(+WmV z5~ta)lqvjzu9vCsN1V#I-q6Qbl}{6DCa!8Wf4B&O51aD-R9+_tej-wikfj{{!;N3k zU!et2Q(cB&S_6`Lp+rqg)OXeAHh9fe2e_S)MMFqnvn)blP01R&v_ffF>-Ze1&o@qu z8^a6ydv!RuX(v_RwZLcC+23j_LnKTEf9J*z*QtlxQO=uZ>;cxPSP|H(oRgi&`diQ( z|Ly>bq wvw*}|1lKWQpeo4Z;RSoT*~rr4oZQ*ZO_Fb2 zMQpimtcr%8pGs1{`?y_vafa2Ri8uce_t+K*$}_fMBfdS0QO7R48oEbneetBkWYNQg z
h^= gZ_nc<8p)6IK@9bXN)zwTPfBh(I&gTzeXcAdiF{V z-vxBU Xc*FcVWjC#Kvj4;d+YO+UER{s)(| zgF3`9qFLI{%^)~II;o6%$60--cF0wTc+tx1$5oH}i}?msAs6=(U5p>;iUNtOfQiPK@OvdXGV&jL zZI~CG(w#RYVUa@@S_MuoB%_3L8FHOcJe0CuPO3f_+kdn)vemwcOWFo3*NcKFZ^Lph z6Y5(MOjfi8@4zn;@tQpB1(mB4$pMfYkffi`;0bM)zm?>%GHC vR5c+s)o8+t>whQwtn#{lz<{ZWDT{`s44=)gbO? z(hDCCH7BRDKZM?3)h`sxo-^y0y4$qpI#t7Cb>oiVUC}WeO*KFMWM#; !Kt%l9AS80<%R#bgGjQSr2%ruU1zXVDY2F=sa zs}+t6tj=S}X#UiWaeptg^lEL+q7YYbhr$s7VL~_V zMjr0>J)Go;m;@oeRr iMY5EUISuoHjwW`5DEw*I2J8A*jY;iGVQe zAL=4om-<@_fIjNVhvEBliIEG1z73DGcBC4MZqZT_2DZNl1bw_G4FZkX))m?A%3+4Z zZD}B?&L9x=bjZJ~XyNOBgGB$|;F9K;-;E?S9-Gm_45BA`c2p247R7UUylCLo Rp2n1qjXJr#tZO5{V@xQGrX2!{ zN*={@Ii=d(mvl%@%!}JeyaY$olXnP-r6~!5FR@Xt+*XN#+5x6zCSz$wWmEqpCje9O z+V6=UqOF(xi&y57C>hSS#!Vs)PIysoeJ9%fG9;1$&osPOHJ*Zym|F0*wOQ~!k%%@U z4ef3RU8s{VrhaI<*PB^)xOO5@8@fufPv#4bz`H-Wx;@AH&k`ml%W%0?#A|)3T$L#s zP4S*6`1&tWB00#=y2s}$Wi6Yxzmsb~xvYHPLswkjMXlsk|8~9B$ZK^u^!s+|=dCoQ z2;t;^q0!7xYvzp6Td_@rjk;WwJdZyDhs8Rw$iK)aeQiV}LREa21!;LrsZt^&D$bR% zC!kl_{8>Nz0FRS^y{=COOE1_`p-mf%`13lc%We>p2P)6>BdwdGl<9Fab{|19rsvLB z07dM4lcXzx&ycoo-(_9>(j;t!LFPT%XUNo2I`^ToEs;^D?(alTI~-CsW63{A2Cle9 z`8dTMs8)U5^D&7LTJKBldY%Gh Ffkl9kW>cUbZvW#{ z*K!@!GSbZJf1A;b+`>Iv?ODe^8L&EJ<#1$)085bi&5rp~j}3JfTEEmb%bgcA{?d?) ztYkE7)OdnVqk7k2K5s3N@4d5p;Iq2isrWAd`XhXN@1)5gN$nN?>WAhJhI1{Hd8Uz( zIR*Ni4Ts!l3lAf-usMHh%YFd7A(uYTx2bls{tKCjjn9m*xbETY&2sk%U)lF34%0Lz zIc`6QT{!_CI6-5cU7 kqn2sg$=;Lv0{cQGYOQQYMhK zR8j<*Gn6oX_qNTCb8r2LGIN}rDREHScY@#xN~ycPm_Df%$yU00&R6^@YWj z(0W<+ub+lE($$)gD=@Itu-a<*P3CvJOODus-IgKQ)}Q~3p&S9>t5b p{ z17g&K6Rwu}SvN1uY9WRMSb8xXp(^huvfc(Rl As|jG3QWt4wdqRXPtCZo&K@6m3{y*4Kr`KYGTTrPE(}mfzjH;2 8#9U8AOqPTXOShi9t$daC zCK7Cej?!%tmV|v+yC{+$EGtj5&MDNn8Vd@7lgT{rHcFl)Vhv{zP~>7XzJxzc4I3=| z;31??QN@1V=z(2f1J(?Vh1=p4zjCSsEt7=lCa|SAqAyk1#dpj=S!M*t)BkFdd}@Vc*{v2Bq@iwGArqg z?IpxizNuz6wV~klt^8CmI%5B@Io_?WKY}v%^^(m~TW*`XQHoW57iYsZ@PXQ~yIn6N zJM`I*rCt5jMRGm Z2k)s8)u!#moxjN0ndq~-Yy`|>@t>J zig{?f?4-gDU%1uFC?Wg@Pt?hgetHCiBl~%qK;J}Toz$Uv2iTGxy4t)S-jno2GZZzE zJK&wcTrNUl$_XOROP^ocCnNvfqw_Vgq`<5A>K%{oaav~FA}swgflDoYO&8Nys)v=& zg|yn#bOQp-f5qD%3jDY8JuI``>+QKRNT?|D?n~OUyd3fQL8@Q1;jSO$MobmEx#W z8E^Jl$@{8tk~7|iD gM37?ICyWH~3G5s=-Gjh`4 `x$>nh;7Xh3fQ7bCqH$zroCF5^@1bG^;aP3BI_*z2ID_(X&(c)U(@$L!b!}iYgFl zie1uZG$cEp&I1MxjmUJ#v}f@o^Lo+HaE@Zhcssy~f5@TN_85wbn?-~%om{|isyN5B zT7{f12YOQn063gqCyPDkvFf$YMAX9Nyb=dh=C =l?~kJVmu2erElfoG+0D!e1M8b9X=h;v(V*Y2TuIpQy_=BFBdJ0X)5Fn@L8*NZD6oHC1 zYTWQ_ry3!ntM6h=-t}Ig&s#*DJe77{z&x(QwH+(In|ii}>HH0YVb2nfV1*ih>;A#% zJZO@7wwA~9Dv<+-2!9I=TQrLqEBY)N_I2>D*8Etej8x4YW8^j&jPWygNJh@|`ICNs zwnWKn?aj}7KHomA@8{=Y3)X@4Ndlh|kJ4aEN2Gevv93m3q~EYY5wRjJuF^J5eid)7 z`UG{=${2s?JG?QRKRj%AjkW8h`#F#Fvl-8ROnTY%ri#?&DU%U#FNl*HUG^*`5iw?@ z_-29h2OnEL`u;K0IAcD1*ZaPY6AQ5Hq~pgK EwN!hE1 zQhz*Ux)~ngw%Oc5`RJg_IkYfgqPP%S03^NtWf=Hn)?C8SXgx|nCO5|)DW`*sW~gEm zIGh3H-y#SW88+KGG$bbH&uI}<`uZfjY<#uHnIXNlC!jJOOWJ3xD^vJ0o{0D**PGYr z6x@?KI)g{A$2g${|&UG~!cghpl!xP0Y9Rcee?0 a@x7`| `}Uq($L*exeaiDnIS#VSyRpjT7cY zWGPC(BA!78V#azN?LoZ90?^zvJ#j1>Km4taB|-ZSE>i;OuLaU1wUo6L6O7zWt=AvD zb&V@x)v@gbC_{!w+)9&$e%zG|Aq^Q}y?=U>A!1wdN(im;uYCsJHpvu2*G=Kv3HD8{ z3|Mq*(E>dfuYy9{5Boy)Sb2@}8ZR==E`I3Qb8%7=PAAPq{JE^2>*lLRJl22t%P}^Y zD;=-WyOVz%nbDxx`sQKUdr@}4yUCHF({`k-D?m2DZ?XuInf~(oS`TA!EJa9xGiQDk z#jB*H(n(;jCmNR)sO;BM+I&Usq#F82oPyfE0gKI|$hBTPjLo5rctN|k FaFR%XGqu)gyDe?_a1hP4HYZrxV X0X+IpI(VFYz=BFP?%M4C9 zJ^rb)eac 2i&s@5#VVULzNo;dpZ(f|A z0kz@cS?Wjk1>?iS{$(a3ljzs9U1`;3F#LMk^)KbvZ^x9*`!BigwJr=;M-|;GbQz}^ znWi(PpBN`1E 25UmQzATp4tO*x~{#T*XwWa z&sNXaqn*?(VcLcO(xP_*Fh!_=0Zf*$rTM5>aJX+@ZL1E>gi-`gqP5S;k*aTE779Ey zq1qfx 4e8%J1w-Zev_J1^P$Q+hwt5ajbLu1X==;R4M`Cw84GYt+_@2PIdY zykJkPMDu%EZ=XbDO|5mC7Z<-+7|^115@AmJ88J7sDUZC{SsHt{_LhYx^3Gv*QS^S^ z4`2&Sy4(Ug=}?I4+Ri-e7h^4H=T204ug$s3a9AA!X#Nj3m-Lk28+L>ok-)$Mk*~oP z?^h)`wziL22F>JFv*Sa;)OIB@`wX+!8b}RWlKQr6%#saEzA7=pAfB|W&ef!f5AFwT zZ*ArPXAIOr_+LcC$?&Rm#+95fV8!aqkWc?O^Ae-+ZQ5sYS-gT27PjkP6ZY$&$E^#) z%F^PSnbt_sGiJi1iP r|6of ecIUNt zxPNbkvik+5s0vHYA<6A7$q2Hi1oHS1I!f9)TPmBAPJSZ}r(D7_3e`kMK|lBG3X7SF zL>0@o9)Gm;x+S){-}1-RSI!x-bz^4y#bQm1S`!y4I?X=ZB_TI{m1k0)*k^go=55`C z(?i`KM~yrL!8z~xV2kw)RTii*_ztz-=qCq@co R?lKX&+u%m0Kwp1>kYFWHBa zL)rlqqEqsu{BUN Hh{J|Hx5* zlQWPp?~rh^p1BmEIeq$e_o&~%tj<;P4uVG6f6<7#VDYCupR6nPqZ)o3Zox#Y0}dPj zF}ZwEU-@6jVlLnKmz@OuH#rT{zdD=$Ae8^eX+-{;KIcE5bN)YqUjE%y}q2y?zlAWibl{Wu#X5tNpbuv=esTNK1VpQDqY1-#Yx3pcaB`6cLZYM#I zfxZ&`6%@&c5|jJq4X@Ea_}#d&V$xR*0=!l`5iA3pHPLu0{ X;hJFUML4XMb+P|DQ)2dLZZI#$X;;Tve*3(=5d3hdND4qX&S?l6`X=ejK zPWEq$zGm3nz2h?%HRnUh-n`iXW6ojddX+caoY-amO|`;PX%ko$bd@qX%5SlXh~2Q0 zi1~0A+WAK4*2boM%Dj%aqk`9y=mPPR;OK$sRH_zKyqrpguJvCokumc;#JXX}P;`R| zB4&obwVV15c1={I+O1|s4wx 9iv z@cLi;sOnvUXY_h+=Oy*Nw5txdgcx`+WT&fXBsA2v@dP%3fx&ucD)(!@V~q$-uoEjg zE ncx(pi!!Y=8fT%eRj7Iw;CN;IVlIg#pXuCWux;VE~;6Ao|}0+gXvS5*DySV z+!lC@{uc^j!!R=PbsM*+$$=9a!aH#i2sU^|hUagA%)cTNQc9%2a@%N_f9J3&Aig=k zx5TpKE|>b?1a)`1IMVS|he(S8G=TQ@likz|dr(@$HxdU(hj;&H^WOCYX?1^Wi4(X1 zb&4QW%)ai_>pz>IT6r&APS$WPNO`m;D>wS~W-m3$c;=w|P+SEqZaB=?|3fiSGJe~T z%}qzf12y_3G@!hpWVyxTytZ>r->~^P+G*jZ_&{8X^2I^waU7!PQ1XTE4TS3s^;4Vf zPkK>cF`G| xpU#K^ZV1K$5ZQPZu*qV67lfDC1Hpwt^r${NSQt3 z8c{nH)e;RYaq*o^NWxEHpR0}`ZwlrOEx}H(zumVERz2+H!F4P?`(~4^$tpicgC!Xi zkm8|$$_2|SxApdnN&?|i3Ur=SN(oMUQ@#={Ol!>#Xdcpf^JijJ2Z=1W#;2cduHbgW z@H?+CuMKewD`r~NZ=G!yW8LD-aH8kiq7W312wDGu{xQaeGPt6BM>I zLHV~YcmCXiO0DueZc4?3b}r($2qvmnT*dXB 54L4?}~{TH2>1q zLOPnG9Wzrgah@mrs)|edlN2aN&bbFBwj|b4%C|R)TMBqJFnnU&+S>=E+DQ~pSyCv8 z;MSJ9A#LWJ76S1mP!I-#?uNa_8SH#7Ii@COs4Pr&H5rc3(BQ#yqITrP$hN#3*Dxv# z(AS35iv_8XBbgE>s5;WlLTKmq4(u&G#!SZwPZ!G~nw@|k#Y`k#_a4NCoL!GZtzxeD z5x*$4nMu*>0>IYwvVsq&Z^t6}eE9!8yr{X&I;c%P7AE^5VvKNKw}auG&cp)b*8>YC z$Z4+NSz24mtSEUb;uYr{w^EagVreFPMj0ZY^ogQH(?yMisI=*q(YYhy`FaIJXkB4L zAJ6`Dj+#N9E)@pH()S&GD>BdPf1KI!EnMeR>t-)((L;^l`R`##A|pTO4Y=7?p<$7$ z$VdE4vh=KzpU-z@WN?v_I+!S4r@+j&IGr(%Hs`TVD_hV(Zng_-%(256me@zFId@CL zSvd+}M`Wq9Vg`Cr3nK`oXLQX=5E@c*TpwwWSMxPt&@uEa>1AOhx6&Dy9H7&!SaBVq z#KU!+ha HKqoQ&LvW#!`1asgc&E2KWu~((+8o z5ETR;Ami}-T$76wBsE{ehLFL0U8142bz#eh-3B|qC)tzJ2Pt%{AO9rm`ro&x^q|U? ztjBYUcj2!!a)XVRdr|us;moFPwd_Xrwt#BLY=VDn_mYpzI zJLTq5PFdpU2-GR&3LG)P-HKdNHQmI___gx|A1b&7-bMos^9qR6t1wt5U9pM|VJCKJ z+HG)i@G?b*c}IgG(CGXag_j)#TrjgQ*)g;a6$*g{Ywi`P0v^xbws8M-FxL&ovP@xW zM$lf5&FDYAu0ywZR8RW-!0I7yP`=jR?seG0%xMRjM{eU)fiC6iiR9`5Twy}r+04R+ zH}}~v4cikaG?-bg$bT7zs;JfYiqhlGAa1|&=A@ yZe}p8D*54(4lVtd9$V9l4Bq zxVL;`MWI?NXfp#6Ba@QW?$3fbGj2mUqMw(+??}gM(orfTwdr#x6`uKon~tilu9fs9O^xIn#yy^P!yo=KA)LgwwUT`THEfXpw^E|ANL zrgC%_{82u4^~|1elqCr6qCCA~GI%Kzep QZhK~6@5OkO9#?)tZPh>v zvJ+>-td~xz7j;k?&2RZLJxm9HAbhE;$b#$$AaqRZ5gszF2ewIHoQ`f8^1^zkUiBh# zqdF#(LZ~Th85~18ek L!g;0J$ZPI3Ia$r z!*n0ob{?&|sz*S}9*+D276?ABGT!n^l28)sAFJWDMvP< 2Zy)j2vJsY5BLjLwlVn*b&>(i@@t_5%CJ~=Z% zq#DYTdGn&_bfXWW=T%AQQnhQ8&xhb~Qghb>uGNfmRbWGAd`U{f4oa0v=u|!Pa!MD* z4BtHg#VTsa&~Qbr&CYZ77Yi@4MWSN6F?vRAx+o5KjhP3%s#Q9^k5L~80vjo4MUH_; zg#%CKsSZtyM>JB?) FfVA&Ila(e2b(0z#f!M>7(odFFAvOf zx6tS%UA2&yB%Y?)Yf>j$KmEnxzl}wWOfq&AUS JT8qz4&) zGMwdv7f^a?m`ziuOsKpp@!^y8qH<&_0dlW8RD6ihHwp&&4Z5agivJ=Xt6U|VbWM 1fB_?hdknW4+hGYO1 z%O (fZB@NIGv55??0D3E{&=|H+eC)>SqqX>>-j z^VC93eq-t>fy# -WbFlh``C% z< QN0b3D}CF1;%b5Kw0v+{ilaf8Gg6+CxZ$E z9-nml+$!ekS~@du_SBQ7m!3jtfF7>s;5W)AkTL?4zK1hZTgU2K4cO_7{Yv4zh%D*A z)-i^GX7^f4Xsaaj?@Z3fKo)=E!9Le~N2;1E3x-Z4QPR(gPHL5}H#mHKkM8^l@rL$| z84@M=A{YGq;d6448=~OOD<3Q_!(k^!M<^)Y{EVCt0?cz$wOCI`jlArM?9)g;BLK&Y+ zMn28oGo3NLkVN%IV87nRSMPN8&)ODkUi`&0Ncv&mlNhPy{p*{5M`?sZdV%~Pd+W~{ zAfPz^a=DEvVK9@Nx0_i8w^SX!-|VXAwM-md-YXW4E#SuuL6CX;o6B~aHN`{x0lRWP z@YFN$7 rrR*U*3gH8uK;PzC4Q9zhx~Ie^AK%RstMk0tV*-=bthV$EV6rqmdMERE{{V zYU8V}jKtx&S=_EzEH7+!Z(}aVZ8O %7{lY%K;lFFo zv1@v?gYwKkh4q&HI0{`q28jA87`tc&D$c!f9xH-DDnVWsrs2RAmuw!*w{vg$N95#14Z z-4fiooMl|_^HGnAx{NCq$W|CRcC7ktYxDm2#n{v8`>5Ap=+5#DV4}7icmZE5UXRy# z$_tCFU9q{&zHya^I9{OGnSIX#(|NF?=*(B6HGb>u;Ll|$+V?XMiHR#gppirFA?%F{ z9$D*HZs}`xphArDvXv@#;x2Goe=sF*ESDZE-xhDR9ICp@#9(~zgrnx`P>>3j%4L9> zhMmpu`7l&mdf^|VdY=jjkcJ=b(|R~~p&jB?TH>#Z^21IF=CrDx$?w4ffSf{oi(T~p zK~6D;NJ<6U+x-R`F4AmW*2p|#Ea`Y7B+j205+3<0za-n^1=rJU%t_A3Au=HI%RP^u zP|FLJVT}Ele8%5W7OM9^DT|NaWhskT8_kL~&$}KcCM0q@gGGxSX{Me8=&U}Pg@zoy zTT&=xWj?zo4S9`OihH-6(($*vCWpzd3Om%_dtIooUAXjfw{*jN%X!aHk(h` NV_m|;9NkfRI4g%Kb3+3iSP_EOA z#b#V~8y!KgEHhsNP@Q$|B&AEfreFp+vz#HPeQy$VE6Z)|u-Q@5w5{Uz&4!UEed{SD zsw7T58PS^Dc^5v*(IKxTdrrDf)o<5b!1)rBe^nQXx@BB5FpV)Xa$WnR 6^=)L>cqzVuk$lK_jupvrfcVL+?u zT o r6~lo!3wYFb}4TN`G(V@c<9 z>zHPSK2`ZHEs$AaWJiY(5PrSyfx2AqN|}AJ?uk-vjoIoQU3LanMwhJgDn;H`ddFnB zg%^6#7j3-PSmled*PsvEg{7zBhRYZ&6Qxe?g}>-(UrI7d4S}Iv1P1=Q6in?Eg};Ay zm3DLN;&G8bCPvTD@Ca8F{_|t-35@=STdIQDGd1OFi(U{!91RL2zKs64#mwBYC~4#Q zlR-6Zf8<&(EO+ezQU$2J@pt$xI#-Ee9%y&puJeNJcToKavIPv!!D%#M`AY!9IlyjQ zhR3no_=%h&=PBzxnae#i&^*B2G=KccgCiaK^l#Tm+y@=tAeEObKrv4C^+o*wsQBuw z({e!ZtksX>Howi C znGq5DdEk4w%y9V(TP os zX^CCRG1hHws-{PT-;10*H`F@oF{TIP-zsdG>RKWD+RUs^uop9tXRr45d#eDi^~V=h z0JB#I`Nn&oVNCq5I(Vdph}b5M8`9Ju86DxtsKrLHn)zEt`iD1 09Phk(}NdAOA!Iod;7SYl9s!?vU!Gis&jn$Ae^`#t#r=7I$3mXri 6G3aR*jE&c*l@*`R= ztRVb$>2d73$%bRtKoYy@j&UNh2)4uVTjSh#qAV^1o`UH`AS<@Ks3KUK0*Oq%+;78} zVa{eWPo>NBP7uZW%aI$K_cyP%7-Cpkz7!cA7o#FoX7MKKy%P@9PrKN<@&E`0h)8ee z?tH;EF{M#zNFw7td_l(OQtZ_fI7@i%rqSVWTkuN{;?h)IU#HPnhQgG4FP8{>!xL0; z0J7#O8Nr%D1}AnKYZInP@$0>?Y|G|T<6Om?gCq=ZA$8#R=5qerCmvKwuHYv&VOt17 zBWl|B;8fKdww>G0bAqcsQD{Du0NZ$8U=w@XurkcbHmtX{OpW2e-m8EGyG@_T$YYaQ zfbyE39f{||T&F(U_ 8K@a9Dy_?ontyKLWf0_)7gg%*1;jWxcxY&i^p?jYYa6wQjTBbRJ@< zQ@N1mAaS4m^7Gmvzncw7RY8~Fuz!o@%IQIO?O&J4)GZsIc%(Pl-aR_XvZJE+b$ K06OZUU!8m6n@)aSgy}T-f8J zIvGWSrV EB3kGZh>ZQ%Iywcz0n_7i%8@H8|`Yh<>^~YzrR`;Az(8FuviWR z oTKKyyT;Mvl{*n2o^ePWa z6;36`slO5WIEfP()3$PZgM%^&_-nx&QSV)#IQrNu$bpRf{xgn8?yrjle^PXuzSJX_ z)Ft7hLaNnVy4P?7;*R^%YKT8`FTx`)`c`q!&a`FV!r%_ffPFbqvn|7{%LeO~w<*dJ zI$^y;5Nv_=4mOYO4X|kLcATTgDNh-n?9M6#$z+MgCcz|EWNqju&69Gy(vI?E9*m9~ zCpdqXIH^^5)+9|u+kip*V4Ve2B#b4nSWZMA;Czr{CsXLE_H|bEbypqIoSGm};4s~& z2Pp`-!kzb=pV2dCt>4&4+)>d> }xXtq$Kg8Bx zF~v16DAtWRcxk-e4OQ~-Dntlhua*8vYUk(tZ mcG2k_BzL zHolQ=c)x8C|0D5PwyPefYd%o>q)4)12cORG@dN|bF{ahadTa=opEjOD3z{^_@;ht? z)r18!V|pLZ{0X16E`-j*E;9!|O#S#K_p_t*Db=N1W#SgvymF6gK1;XqO3eZIva2G) zWkTZBteJbmtVX`5Z%?ltrX@~JTW3g=b1hB!#MA9DP$H1dGFPL)=m%BSamE%@>LWvk z9Uq}3j~win3!E%zE^rBNbaAWk-k;0T6dRV+Tx$W@B`G<>K)~+F#*}enmWQq0Y17=^ z=M_}-{FOTx>!;;^cuF*?77yXS4xdkRqM|OaB2*JHM{fSwH&`c+4vIJopm8POV$O2d z$bQ!FJ~;ERc<{)6((Uq;*k}Ox%6ix>E4{{Wsyabw_Hf2%^Sid4d?VP@sNyXfunH;H zCI<-bTP&s`-v~tkfJbXC5^JL-7c=HldeJ2UOHrGHL{n%F1FP%Uxo~+FC}?A~iklw5 zLig!-Pq44vu%+T#h{@vtKRCc97OtL(({Fom*d$nVHKXsb?dX{P&3F=hFj{u$y@Mw0 z#-hi|Odvo{GApOyj2B{Jbp|SUM695)vQp8URG(Al7P)C?c@B(%1W$`pcMSNVMAnti zhw>SGd>r_=9fKA8)wPw2h+r v;JK2F6|F3fWWwk_ry5h11 z2LzgN*%U~;2pM44t(g>m^+*$WLmoseqmtz9*)Gc<{NX>Wr{+;&tmBd$iYQ-GWY&R? z{!Vk;G2OqFHXwTq%asd-ePS5sI7IBV#c-HnD4^2#2NKnA^J5IV*$4^jUjd9XeWG}b z;dl-Z2#9$h;7UZBp?;_lv=LCV0|J!+Vw31gvB?6h ;cZ~gz(+?BsW+5YXZ zONmGx6rL7&h*8NT!;Cfw(PAkvO0pY~EoN?`MJXg(mW;}hgb=dLkV2@*I@MrkXvi{S zFpJsVyPofHyvO^#|G+!H&K&o3-Pe6xpZR>w&v~A=QTtfc+yI0>InG((jYQBX_<<4$ zaIE+vAg&KegF+3Sh@A9lZ;$4#nBp1DAj|=N=>;>>);(AxJ6wl<1(U}#0L(k1s|-|H zEOBXF@P#KcoYucNzim)r1gc>R3spTHjMl%S^t(bSiPS6$Y=2s_F=0E|bEs%J^AukD z>%HizO%D9E^0kGni*?P*V^uw^Xt GO4njAP6kOPj}ZiFms5~>5n v4(TvBV?pLJ??nfjgcYoDa$ zpAmL(;%L==-&-4mg1D;=S0-U$2jrED{zigVf@E07BR9#)6ZAOaarTRxR&K_{*g3;6 zGL%5WEOIAEb<|Cvntct>24Vf^5-$6vI%)tt*C^IPIgfJzyG1Ntrg21YG REX^#pQ3-$>VIP$Uuek5FQZ^DRJJZ1Yow3CTIMF#>PLlZ9sMh@ z!Oc8gT#HkJ#2-@ y;97@ot`tsD#?3&P9n}%5 zsvSp;1=V)Klx#iBV`~$(@TTkZ_w=>kfyX7VCbV_@gnJnJ9W#+nA{4EJ% zza$HrYv+t#TY7-aGcB3THq+7#9b*L1Ibm;UKg>brHSz;{WwVxZ+p$;I9UXzecz0 zgAZcJJ?GK-gN@s4z5ie@TAKYe$9q@mA7Odh>W!9Xk>Ar6$`PW={NIn&SWZ$p=^`j_ zVU}1~ZKSGifX?(-LaRhuiflEn7D{gl;d4}lX8!hr&|oX%L=# &EmxE($dY#zESJ=+-S;y$1p|@O`v+jfURn==RIkjh~24lq|CDV2_Z|Z%)} V3NA-c#l<>cwr(jh+jC@g2IY@cqjn@JFTNcRwdSWbc%PD{6^H^S4p9PjH z!dNbwqGP2zX__G%UjM^TM%rWUtjqql;!l1%s1baqCupKXC>yi-yay9at$8&@mIV83 zl!mEF*nMe}NT2n*^Zxl)Ykkc8W{IULKAK+@HMo|#DmUcz6d!n(r@qf|?bX9apk)GE z30#D&U?fj6K`Oid{NkY<+SvD09K(u{p+40>0VuH|6mvMVoikrLJq}=kE1m*iY)P|# zhV?<64hh*((otAqpVQr73aByC>UoDAI`lv68#=9}%odDV8&wp8iYF0TJNrIW4?TK{ z=mh?#4LZdX5QHpp4lwWf-;;UxQ?YT5j~^*X-2nZfi15Sy S>O ztdb_lQTr?-iEcM;@?G{J+mxkJRdn4pq{qq)9eQr^(CNjJ`_X%{k%pQR-9CFWYQJ)Z z@)_%H>KZQol6!95fb?z+iZ6UA{M~Lyya$Fhb0iaVr)u3gw({f-dVrar=Ci#$ (0swWu5XZGVeemr{wo}_+7XGj&s%%zZ?Xzb0t|6 z!~V9#2MO!cN?i^p&iqzz-AuEmFZrm__XQO%bnHP+7!m>SHYZHLnD&>9yj6rsez<2$ zqQ=pdm9W>E?-md-r-%-@Lo4o}!k;|riyA`LM%Aa`Gmi&%f+h%O;$k=J>MKv^cLcxU zbcQopw*6~d0H#AuYX7}!?Ioo-#HG5KgJQVC#{F(*G`Yo3F`#020zcETR5fTTOY;GOY|FpK#Xv>TjrW^j5Fw_yw?m9WA)JoqS@McQS`Y z+D#R?rhML`(QM~ze05)a?sw362ojGu9FM%DqAQ=M9_PSsG#GVUx+FWPj0>Z21_#k* z$WRnfRr+)Y01YnTV``rW;({DnJLyI_s2Td-FF3yKW@qQznv>0aJ|2!WaPesP)Wp`` z+CcmZAK0*0&GgGc_4NbzstgMeoV7r`Hky7<$K-sC&!~^v?`9KQ3k=+|5Zpkphz*dc zH#{AD%+~5@H@QhB8Z?N19B6D7gXUYE;bGMKJ^SuMt#*;e*B*@)+wY6!H$&eO22F&I z!l-McTeA@bt(zP`eR@+EDW_(vm(<;g1`gC5oeI`zF(4P58(3^Lnx^O0NEbHujlVW@ zK>rkczjn5% VjpcrX%X<;QC^VR?GCX;k2vI|4v3?EIlko^gaI e} z9Z3@ZRvl!&lclhS)%(=jE)S)YB>xj3P+LU7{Jqzv(!slHTLd>rhNAL|j`fS!9V4M5 zr?ZZ h&V8oCg+m&^cs{_dz H+5lzV=ChinsG!(gNCxv7MC_48?uQ2NWsSHlp1aLrSgc%2hH|`#1MwUt zeuAx(PdjhCDP}uotZx(io87-zxYjA3kn&nOrFR#5ZNX^crx&0aUZ*!`6aE9WSV{TT ztV^v}&Qkm0XWoC5@s U7;Bz`L-{-v{)F1MX(yFdgo=7orX(%yyCsmbkBPF?oYQ #UD50k)G$t7FsFWi0$&Avr zoc(J60r+zOCA`>Ce9?-wm2oc|j<3ZUrXu*~g^`3O Q2N@ zw9^4};0!xhOl7PZIXpu=?_JdY+RA&m7W|>CnMqtf*#DOt2IuYU#e%)=&h??+&_D zbz`GGNbSATnq{^P0&(Vj%_gkuDkIOaK00F0G~?2$M8)tk{x{8 fwUth`ZRu)6{vy+G2HNUU5$< zb!Zqg859^5U-rSg7`qCtl%%xlv4v7r(GB5#xKMqYkh61wXE>>134G&-RjkAyQa2Qv zZUUyrCy0X?>E3oFy~Iz`&nTIq8ea*poNK!(BO&Qp`|Xw4iPzH*+;=80PsgXmZCUyb zdxt!Hp#cC%Ba>- iU{`}N_W(f zAT#`Y0rBF$W48hx8We1(mwrVqhg17>PnJZ&y_JMu3CP!1shG+2C^uQzp#o_VeEC5n z?Ol)AYw^UomtnISRADDN7bn1yA5JN`_w!WhG*10Ey~v#o25r zdim2tKU}mlfiq@qvcTJj7RpwGH~*oUI~V&{S&>6(6_rFE81GIFPc(cFesj{5`74Z; z>dVSuV5TDGJk9H|yYXvbK|dpHR=6TOoWBZOr08wl)?1FiU* b*F+yq03V3NK&lM%fraAnO5deYpx{2wA%tEk@n)pOJ1L`T4KR$K5qjs+xA zO4g?u{US}JEuyFIr6UI8wveKTDEt)@2@fjP+y)pL!J`0|1yUU?j- zy!6}jO$Ol`R>0o(M4wm-0@13^FZ!}@pip+5=Z)E2jn`;*%&h t&6T*77N}5YkOWE>FJ?-n7 zbH6B2!ySklJ5`*bxpF;wU(|2Y)yIInRViu9oM^Qz)KgjKdoElsa+p-`#2vp-B*{;L zua&IDgwYJw%ocaV{D@gyuHid6F$Fr@cU9AFV^(%k{L5-_HfLyUoT=U>*qBcR1JV0k z1Olqu)%(likJhw92g=bK20ut`$Wu~=4>%Kd_$o;jAX>{=f@#oYkdF{RaQ(vaGGarx zMub)`G3t1E=7#yx)#gVa5R*+HEy#I;Czdx|sE*Szaf0nBJ|Wf2j^Rar=|;t@WCQ;w z5uUAF;r8TUHxQb1N-qiGe>R^BK~CTRerY%HCgw$wto)Dq2$9{e(%u<|A)l;2oQ{z2 zXKKL0K!Cr33o|56$eFB9p$}afb!^#zk3Nf$($c!GRd&L{pF&kctbgAG>*~a5Euc!j z@RX)z5_{@XXv;Zp!7XYg!B`0{B*2T~w1rj}DIpIA7%N%+FuR3HOC$&=eo}`VcNjJ( zuyy>s1TF JR`KYmSV(( zckBSFuu(Y>>lFtk9eC`!QL=zoE)=LWf-9C<3{};=Yxr0^60|Dv$R2FB=e4%(Vh8P{ z@qUSYZ#uVu*=?{qXdZ@GdyW7-P!`4I_{=j!H~~qltbr19p^gVAyX*%z&jEQ+{Z>zA zl-O|Il8LJNC w$MIQy3ek>Ou?Cn-D7i7im{U&>DJ)zMnx+yepU~6f1BeQ+@&TUS&}Yp z>m??)EDgduy)(JpoC=t70g6J!fApsRGUIi%`<8o&b72pc_{!*`l|K*NCFYz8XlYUX zwBsh#zrKIJqVjtN`YNsG!?Jq#hXUeZ4)waYdPQ!Ft_cw^T)3YTnbYy%?QUP2{@ ~Y`GVw4R%MV5!#sy!uRl4z7S};=CFM7Q@|@RPr>ak=bEfVI9!YLE z|3Ffj)XB1bS9g!bJ8Q+cSWK__Duj&zdxSU{`922f#fYCB@Z*!E@_xLVH0Xw{)c^za z&Jv6@tpzh%#i`fVgi xUuMaT`KMZB89? znzdyL5 Q zNfiWe`*)NIFG}?w3D+r~yCychF!}!WY0wEMd}Rhq1d3X7Zt4yoM-GH!gG=ehh%e0m z_=cPHXR*u4KDj0@9 Pq+yA|ZcE`*l5_-CNcfM@5s#MJOGyZEQ3IsLHEzTZR zBG*Z`agyFS)-yHs6s)F9;hZuJ9l3lDrhFNvvRdIj@AhLXqWl|R|4kv}%rsU?F{4Fs zDoAY}!9G9Uz;EO%7{rK*C8Yz~aj8>-0fojgB$ReGm=$5g4jlXr%>0e3Ru(cW{D=z! zf86(tX2|QmY)gmJ`|Y2o`soRq^b{cwHSmlzdwwX)g|xqnLJFv9G$w)H2^9v5Y(wI9 z5p+PFV_d 35%lHkIR~=m2 3pH*`RzSI&4)-%wWY6R4=~|8_aPZA#!8 zCM|#24&kyz*GbEA>7?UAS6ERb(FKlwvn8tN5q>Gl*da~f2mTyLWiZ>4N?{xX?z`yL z?SJK34;))u7MH-a&+{#xPO9qkYV!zjinsiZ!2Us=J1)bAZqwzu^N#LR&KeCBL|YtE z74@%QTlk>>dStZYb|=|y=~<4d!xPW^KJDLT$9#@<&_G)ZYc&pf>|1EHf~@_GNop#8 z-?F518WGI9pQg5Qf84hwNsz%rxH#a3(pv@7hr{<|0>#3VI6-rDFk!+po@S?hgPOfn zmy3h1d{<>n@Oz@fU3Ou@W+WxGn1BbSyF?#!vcU>QfcTumz@Xoy!gGXs~t`yz!KKpR5`MI_<3uIwl z_(Tj)RtJw3*>iLbcGIio|AYsOz)0|2 2-!)p#*~wxRr7(6j2gB$rLM4ekP4^6rg$bgdnU znffL!3tCQsbKgfzPeMskgLIvbr_V_33)@J{CJ8WKG3Jf$JSIh$W1kUb_xW^y>mD;d z>)gS@`2qyb#)xACs7t$evT7 q-djT4-DQvijRcB-AV)-6W2N=BG~W2WoQLm^eBWWj6=z z5*$x>Kd{@Yer@5&$~$6%z*8orEaFv=5(F8M0Krkh+e{BCn+=60wN9r*){G{V @eCGu}6S{8bi+DK&H2mp?OZqFLr8 z){~Iz>YyeOj@h4G5rF$ERX}xP+}di|)wW#fSQ@T@C$c!yIB{Bm&bp!HRB$&|iBlLT z^mfqq%D(H!th IZVZ)9qA2c+T>fj7T4G25EaG1dt>-5p}Kd822nONgLLsYRA$!RqEi zk8u{hM#LA+^W*~X*@ 0k|`cN6h}H1wVaSuW*;xF08@-HX#l;;-+f zC7qM?h-n(i9tULTRdcfC(TnbgtgfLu0Uu?1mU#S=O)saY;$?a+e{mnEruR *n!J4sV z85<4%f %ey@i3AptMG2?8Mg1s(9?a7{A{$`R8MkJIvMh0oA(uj1 zIvy@zp``q_Cm( x(N1c`Pkb63vni#EqK|Co>KHK z!kx*MD~K>?Ly3o3Z&RNn)qF?tJ9Mx+NiDofOv_<+bm3M*I@6r~-G~D`8kpI;QTY{| zIqx`q4+iLbBgQhUVnu 4*ykT@l4P2zE0Z9Aj7PexswIFLW`dF {geBw;zS1vchR>6+OYySRL9Q%QB+JyM9WD$IohS>}l`zv*9#>Ww&Uh&g!$Cr9& zYeerTl@X{MtMR==f*YBUoUcWq4tENvhTnH>1k o~U-j`O>a3&$ zD*B{0w?B||SL=kyUw7giUWED|xOiGlTbD~i^@cBkWSbb95b0VXid>0(XdWAT2@bew zaR91c_CaZgmz}X=eA_0EpHQ%r_i}ti+U7L$vOSI~A-S5bA~fkb8v7dnw9Pg^h6>l? z(-Xs_*J)!o;ov!~e*oGwr9j$0Dgj2RR%uZlH^5&OzL;Z)rA}9#YO%9A_UBz2w#QB# Jtvu|N@L%}|s=ELH literal 0 HcmV?d00001 diff --git a/pics/reover.png b/pics/reover.png new file mode 100644 index 0000000000000000000000000000000000000000..0a15575f4fbf16d931b3633c1e47638674cb7442 GIT binary patch literal 20444 zcmeFZXH=8hxBrWqt=JIV7NpxzQBXPrh#i$CB1Kw^fb?EMD2a%G4cMrF)Tjt3EuohH zQBV*9L