From da0116e0fa962ce98235045a62691154830cdf1d Mon Sep 17 00:00:00 2001 From: SpadeA-Tang Date: Fri, 22 Mar 2024 17:26:53 +0800 Subject: [PATCH 1/3] init done Signed-off-by: SpadeA-Tang --- media/in-memory-engine-1.png | Bin 0 -> 106727 bytes media/in-memory-engine-2.png | Bin 0 -> 24928 bytes text/0111-in-memory-engine.md | 253 ++++++++++++++++++++++++++++++++++ 3 files changed, 253 insertions(+) create mode 100644 media/in-memory-engine-1.png create mode 100644 media/in-memory-engine-2.png create mode 100644 text/0111-in-memory-engine.md diff --git a/media/in-memory-engine-1.png b/media/in-memory-engine-1.png new file mode 100644 index 0000000000000000000000000000000000000000..87e5204d1efc31e925504eccc2caa0f011c980e8 GIT binary patch literal 106727 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 }-;MpK?{11yp!H{^f9un8J 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

vO2yf02D4 zljYt=$U)3ZfkVH>Y?+k7dqUg>MKDm5-wsr3U^S=(O`L`fX!5m?%B+?wN1(=ZZWx%N z_O~W!T#OjZJ$1oA1iIeEY0kdE$2rar8cJU7+k-M~XKeqCVpssE(CO5TpMH2e(nI@M zVA*97_qV0#A|9~$eC5%pH}5PPxM;^4{sM>y=*Cpf&bNIYHRp2co>O%VUN26k+65`M z5U6BJcJZXZ+{V!d;RWIEW$@#(^ARptZ8*OK z^cb?>m87LdqEcUMEvL@bCBD#TDD${I0sH}nH@R`P+T|%oiM~G;h?J8hG&Sa8(&&~i z&o`AZZWdpDAxya7Wh3!5=Fk>Yb?M*{e5`6Q|FI;nGUQDyikPYCg-I{e6jf?(c`Yq? zs>-P^X68d8uZ5nDfdPG$ZN>6r7nds%MI3#FqWsv>R~oh<%Tw8(UCv)xD}Q`;JLlnG zfvWuI^&Qtt4z6~-)G%)xn|F#aYi?c?Nbsy8Z3Ar}N!I&+rZjsZVtVMtYTM`q6FQ#F zwV>uNdI*uHf5R_~cSz1(s4iG>>6@d#;%Jw>J|WTT)gx-iB25KWQJHeR;M)4REd0ie z=p!q``T4E4{{!#P2@J?OWihEF*~obw6g0=})&^584qp2@OUbL|)wsl%WB){o+vOJA zZd+>D3T|f^2pK3-HG#~ARaBfE*bs7G8zugn$sKr~iaK<-QjXrpO91$0Lu5~pTl=I> z&B$74GPiGI8e8}zn$MU3;@dkuWJeGVu`G2$7&!Ph|tk+%hrjszSSKYij$ z<%7ojM-%a|oo`_RMPk0;wluvX?DJP4VTV1c;`4?Z&*`J_L&<^@Mf-!!alBssE@35c<1x}}uI4T30)d10nhSX)J@0HouUzhg}zvbAznCUv##R!sYqX??v zehg64lVi6VcP=uwS09bkZTAfq22ty#5Sa+eNP*7#L!UZX37y{%_-`27_efvXqvkVL z-(Pe>@eiH2^rg&{)FvJI(kqXzn6MDopL$?Ba$f5|>=AEn(zv_6vP6vgNwEPL1wHxV zCba2?bor0I<7`;u*vhTlJ|o^E!vb6^e9r4lqJfYP{cmT(?CyplW0r{lPHgTfnYo((Z!r4cU#g%) z?>&$G|1Q61d8S-)ZrPrhPlO*l)ZocE_$Wxy6E?j-jVS94XeeR*092c`m}d9BXB@_R zaSEeNVeE=S&;6tre-RzL8qpLL>82G>Q$PUbzslvAOoHv?H-MTLrF}URxi+PGWT-b7 zLRPxkQ-1xwQp+QvHN8L;Sc8^Q>_F0u!0%;AP?h@M%QwgE8eqwcbAg z)xfpi>#B^u5mm>PSMj7zeY&Now*K`pPTRd6c%QGvB`E-&nAmBE6m>6S1Oj4fOJ7zb z+bZ;i}I7rg*60r_;z1$tFi4qk0@U?j@&0@+b!x#u(8n_%L&cbk_;p?oUH{wOvH#_|BrnNYMxImtab{t|hGZVKKn zzXvq^`>3()f<9{Z?|ADDkr*%^pijXI1jMYP?JGZxjKTpxAPVQm-|MmgD)yl=M*R;y zKzBd+t-C8$;FYBmD$F7!Tu6MgO;;B(^CF4*#2U>BSGQR>Em>Q)D zE zmr*l}Fx-?vA?@GE3YKWn-?Sh1x{l*}tV$#GVcgH_9o;|@2?3_#xQkQUaL)$VpM?2D zFC=d(t`3G^fD`!*c%G&&Y;<>ab699d&`;>T8Q8q24P@fE;-2NW zN4L<9l>c=@zz8=X7ZVRX|)8dB@_B=I#T&zFveQp3QU^*hU?~USd#%A(J}D3Z%_%Z4tEfn-{@v(iTwb5DGvkPo zbJw60pjX^y4waInka|G?zw+qz!(Ra<& z>LzFpR`-4o3<%HaCcqvGu-OqT$=YVL+1?Hu9dVm_BQuQ+ML*Mr5VhP_wz5fpz>;Cc zl`BC1EHg6tYtHlfSmYav`z{Ukqx)FtRQo<8mksrR=TA&L57|9Vt#HcJyeE2AnIVIsPC!M7tlY?WUjOckluARI*s*q2 z$#Fz#BG3Zu+8%$X7Ma^b$gO!K#_r7ifD z8BukTFl_Q(pW0=jW7gp(YCO)!^`O&t5%Ay^$&6yOWPay#X4e>YjcSIt0 z3nYxR3r&63E-!CJz22$BD_%yC5Cne$sVA6{BAkO2dc%4EDYcbRnf_VD>FQRy#JYz! z5SS%@SK52A@Ggt*w@y`6laYqI#>tuZz{q%@t6jVYw+d!sU9$bMc&St)R7_ntZi~k< zNsVGwmshNh1#e5q)Vf0|@|%pNKE6IZCpEbgDQ5|r*-X+m9hdo#ifU}NM_7YGe}q&+ zQgu8n!N`qrJVggu=8x3{lt1XFiw48`%6}>YU$z$V(8x)SQ8!(t4Fq<$x^Z~t)WrF= z^+wmL(&l}IZ6CFiL1%ovAu@k99GK}fO^~GFh>hOvtX^r_w@?pP?TF|;B@A#@5IYCz zTzOp@EaAm7Ts8aS90~ILq9ReuLScxF(?~0z8+x5 zcAN5AmO0UiEdC<^Mb$0+zCP&~!aC4FpHfnSu~ErNaWMCqNH{d?8%Of1}1%t3C zxX=ywBWs-pnqVVgtWHgZU&bCc?g+UC);-OMG}r+(33`e_NEZc)lpB^xGqVW{qdi!%e{w1&YSWKFosN($-QdUKPdRI=^1Is#I)6?PbIMkloFxI} z5!NV9Zo)k>DzB>AQD*a!W0qy;a&t2d5oUVlrHv(LZEJ00ZZ4(Sm|9aKL>_6@*M*LT z!fCZ6prfQ&V8ah4k5) z7r9X9ph4ogOjCh*)P#D|KtLJX7JX_-^Fy2}S?=JebCsW}8YPwMMn*!*a^BI}AbF_x z=E&jWyQ^OS2nDQbh7fWs3+q(oZ_)^VO;y}%1bndC%@i{JRj|EZP7?XrAu?13Vm zxE5pX6qXg{&wY z0b2)!p4t>Ri4h0|gTGUdkByF2xi|v}AfC-4N<>OY`REzge7erppyLb`$=KMKOBS*U z@Two{@-kMYIzr^yg1PdWi$7b-Y&yH&JbGy5bb3*1PfSS%(My*Nl3}K<_>gugH zNXSoc{-xJ;hv!|D=Ir))J;%yU6t$FRZAIHam_Pv~{UG5GY!xqu;~R@M)%!&xo3r}d zUfqW}JsLI;7A({ZC1PE)Fn`T!3@NSa%Y=qCqlz8I+vATv?2c{D7U~dW1BJwtD|IfY;5ciqCY9b_6I$S5-DeR?3Yi* zljTle6jzy!6l;K9sv|-3XQ&AbvxsIuzkcXCyuiat< z810?a!742$3&8_#KI5&;hy5#PJU~3cB%%}I^xG@Y(L+s5O?!JuUws?>pg*4F)26HF zFwmCqB`Yh-vq@`nC}U+55mu0zy4VY2<_M6aO_^Z{2Dx1$({TsUgoo-^)6>)<72FBY~!P&lLHH_zZH_dTTGiV zxG}KD)*=vFht=Fod8eA`Tb{7nVk+kkSyClGtP8a!g3@cLKS%ts1Vit@$m=67jh z?kIc&AW{yyw@d~=t`{et6m%xgTXxvq%VIyuMqk&tU7vxllDOgt%-7`{DUViaG$CLd8caMUAv zB5F2Wr?)rnM)_Ps{V_=RNlayOH`MANkdh8s1dsqPQXP2+TIlDZB65ESbp;0dm=7kQ z$$V1%6$(m_q15rg$=AZdbUt-U5l6jD0rJS5>H6%tI#M!L$zU4bpL{b_f0!)Vm1__e z2T+vZ35%Scz!h)vC@KhUi<)1e4YKzf2q;ZFt*0;^b=En`M*Zf)%lKFp&tGt!e& zbf9M8j!@A8=Eus)+Ryjx<}vhX^ou2>BLHbW1P;li4TVKqCNlT|H<(r&dNeiDq#< zc1AeSX8;n|JPY9raCYVB(Qdr<6E!J>CAU(1NNaEjCSMq95qCmNG4uE@(=E|jh!~p9F5~%tEepFNKLS^6@OenANtpRP1)}ZXPOqY%cnlk4+{Fw=CN%EWIl6qUYk`3ThqE^ zk1)-5&l=3VC4_=}ov+S?U6ThzEUU)GSRLJ8aiI<HDca8Kp=e$06S#jd1WS9E30<7PupXOC@vj))D6Kmz=x1R)*e0Bv zt>1SQboh{5NA#vkI>Se{>kDY4ef#mWlV45=i(Hb$OWP=+IJOf9KCRI@4kl^*51xMfw+e1oAJI*{+= zvZYdEi~VCh0Na@F)eQwY4N*}MW-~{ICtLeqz}RE5%TS;c1E6ORUmPQRhzW+)4)W%2 z8A9Nk=e<2SIeDSM8x3ItA_^Uy$>lb!>6O0Vr&hbOeIPX3epOp)7e}!3Q+(@>Hb_+^ zlRliWMu2L3Oo$f)qd2|n>uUda`y@{TLFWB+s5+IwlShd>gc7uv_}EUld^3_%IiO7j zH^sFYQtpJ>Pw3QNZ^<&XaI;!$5D{XyAiPgwz z;Y0te*S56N9w`kC8q`r)Ul%;5vux3*n-}RS!u5j!-A+yqEC8oX1s{2oHzpow!k@yFKzX>{9;J3XFPdogo2$H>XlAr!FJ~YH(V+ z4?e!GIF8&{RAm(GNdtpIq6}D_n8fp;Zr4Dp?)Itf*mBpJi3B`mdHYqcUo`3>(7y?xOB7(BeG? z;!~_Q$l9W!q|87N($RV4$CX8oe&US)Xx;yfPGoIs{YX$tz@?KO>k|upURMu`O*t+d(1wa%0&URv87Jyu%dte%{YZb^Xe@mCgd zkUa)*Pa2q&drXXMGqdx}?k+%kEQVNC?VQydZ4(+s>yCA=jHKwuX=p3HI0S!~Snp#s z5ACOaT##cUYUPVKjO?d>uXG9hnaF*Oq0|B*at+7l2D{AtP(z!LsA-e)g3fPi{ax*R@Mq#5riX9jdFRAsxY+D6xeBbDmYo?CNkRZA z1GJ;IK~+sUkt+U{TpSP`9&9}1X9nca|2dQMKcMFUkhs2WkpkP4NZ|hNWg&%P*v>_9 zpl*Bga_UJt{CUo?)-2%6nOrXe#f#juGgynV1~soLxL9jSjftz518z`WnfeVtU(nUv zUD(x2HziibJjZCtcCxG#W}(1wsTp1lF4y)uRY+$?FKh;zg=)Oad)={RnKU34Uz2ut zRm!8Oe#3aCM6dr(r}~8!G=={KEfjs8z104Y(}a4bs?1Mdre5=>nl1u-@D6!kGIF1O zsK?U`K>dK%5IWsTABqQCr@>>7qY5N)VvQ;j^ylFFS2~3{yj~Pv|K~Oib-EWGY@y&Z zJpFSP!2JT*#*-2|p5Za`{Tb6;<7K9!kC@d0l0*9R3ZW~D+{rU`7<};TiYs~R*F!oc zxlqNYusmut@9Pg|vi5p4CXJA6A;o!%*P?IQ20jW3;qiin9vygWiD95r?Y)VNe3f80 zezSZA#0IyP9%O`C`RXfvef6p2@DAt%K?WxTu}4+g&IGBjvU|=w(!sqzE)$2D)&4{3 z{qGfU1O6Py!dUu47jZhOdbi&QmuicKh(QWE&+0XZ=&&qx_|HexPt3>30Y`gW={(G3 z@3(*QRbwbiH-=TKJsiSR6_?`dAeL#2%L^v=MV+^Mjr?eKhyXba*B}mbN8@)~A&e!i zydD5)Vrayl@UBKd2PUT&;%nR(@WoljBnW|b?&_Dx@kJ_v~| zf=Tk8Y&=RUQuM!D=-BeOyj77NV>3I94}Ewu73pU(7z8`t41)vC(LGRv`_JQd^wNNd zl}%=2{Ea#sE^?i(CU%}0a!Qq^#Sm1tlWKHi-jP;YwR9mw0f+;rJVW{~Y^)jmTZdMy z@zpN|eCOvSW=SB`OkuLd)VZKtIvc6z^3cA&~L@LZ1?+&x@-niGdm-6`$0D&7#?Qg}8B_rc@o`=r9BOEY5Z<-*2r(~+>ZFG7*@yWR93yLH7OJtLK0U@p0%Q8IR9 zDW@mBzc39TL(&eY#7~ET6N$`{zO~aAb_9Mvu~x*c9`>pNHo2B*?rN1?%*mC}{_0Y& z2Pbt#Yu$Qwyj&2iTArA{hq36f4QLbC<=sB|kP6$9S%q@qMC+eQlxCAQ24);~pFK5t z)hakG?|(*9Q1Z8@{yP4b&@jC-y^s2{d2>NC`0;}=9BI2z%U=00KI2sn%{9$pO#?=zKhAy$C-V1QUx#f&KMk zs6Tr0{dv6)SocRT(`V9K6}5@k1oLy52WQ-YvZD0qv9VOM|L1)1%f+>fY{ez1m^@v< z@E z4^E%7ER23J9IL~jpJ$X86p7AtIWsqUYr|;V;tf>1F|5m15TIX?@SN%$h5N2(qYRO| zc=z_Wv9W}-oe0BQ7J14a?gSDO){TxU-Br@UnFKo9{VyLIj}swPxti)VnVtijczr`n#Fe*3_l8R{O$HZ_p?fC|^jJtqh|Iplb#u)!25IY?xifrdB%fv}6fLGRmTKB1Mgl+YO#R zzO&htJvokFUeY~kBUG3n zj;)Zi=dEImc>Kf^H zjl^N#cB_8C(N2#A#p{5xNdUxo<;2@wtx<2F6D{|aPUpP9v4mR*@|+UOQWRICPRQKa zX9N&1XAYjRZjpQxN2gBx>1`xkNon>Oa9T-WZ5M?}>-h&bJ>C|hhA;f~Gbwi5m(v>G z-Pp6+Nzt92C^<%-XlKbbliVM-MU(zFGY9@QGYfg_-G+I$g*sI@JgVGYG{k+;kfFk% zwA?d}khV4>aPd>un=a$ciQBNy+MNV7!ga|8p4%597Mw4pQ)`}{?Mob|?w}S-x{=pd zGIP41_aW0vu25M7jy3Sq6gCfx>}tA^rh2}yq1WTonI9Y*f;=maeyM0KW)GlGBYs9? z@t(UYM>l~K{#&6lgF>rv%rOsES4f>bQ$dX<8u>SfpFGZ`T%TyDox2;)qPCNWo0aF* zS$OX#0%H95VKa+Tt!3*mf()^{RNk9s4ED_M?EDH#_Udf|+1T$>h9dxc^Hg2s_+8&= z008o|7JTPJGB%75!EalJ=A1r$7A6ht}mo=#?cS7Ns!7HsY2CTT-#Wf!b=qWlY&4FgqLUQtXU zp!@CP!A)W8A-=Uzg8pofI#~*cly>1dJ(u0?}={vk5LrW|%$L1F}4eV3noFq@ph(TVEs~*whX6|a@ zln3u+^9E(G9{>X_xSr>>4>E*xHu)MT)9cI5=u{eM36iTdh7?0Th{mvLMzd;Wje9Jw zJ-$CMYh_I`kqA-1O|If;OtDyR&v$6Fo8Ll5&VK4RRcW(#9L~# zo^cPX1oQAeXFWALY5)gqfAJ&M;Km4YmMM=zNTV{owH{Wn7iGpwXyleq?e~SKlambt zq)956R52IuF#vJxr_ehX%v&7I@v2=6{;YDFLM?DS5un6(!d*AJGq7-mMD$!q>GP*l z;q`p*dCYO`{#KCkht#Z;7>cG+pz!hr<+#|^2C3ritca9GeU)P*XsWrXa(QKw-bm&X zkOA?xvauOlA=^e!x~>zzL~Grj1_)KkX~oRrww8lR>>eWwN+I@STje1*i<(?$ZD#g? zYjS|_?P)D<=}Xdd?o=F4U&U29Pn^C5YPKW5(hu$oTjOC@LAOdkyUAliRQ&vw24FII zBqlI@Rm<^1>&>r^3UV}($B5h*UhV-0W!1KuP8wA7515 z%iD?v8t=e=WMS6K>2}+_^Vsd*^y07vmF4E9pr0fFAc>FJMh|EeYkd3Cp!2mbN8yrP zZYE4sR{hTTwMx5PjE9(h+J5q`A|wJ;WhIMr;Y{YJh4|%}z7r52%9sydImr$#D8JuT4L`M~nY=!rK z5%!irbw7dh`AonF{d$C;L-vW5Y;l6===Bae6=@?quhpSIn z?G8;{LRVySM=twQOGlZT-AVN6U$CDT7lQ#(`FY!05Wcj$CgcCG>Xs{cWH$qS@PrjV za$~!5d712-CpP>BuLhm>3y|2mc10Ve@zoT!A$h)Axs^_>>2!a+bUT1X&!Ak@z436e zayT^{u3EFfhs}@&oE04#^Q@PrwI?32gYd*Kn04Mx+fT2fmJ@lAo1LV_`w_wG5I7)4 z3k0blAbg@@qQ%ogW0QLDd^zr~TQcynrs!c4>tJCJqGGzdKlN{bIPxO<{#QkIedl`3 z7oXk!irHD^5~FdfKuyo`kI|VKfk_}?sTnLpq_1oGiP}zYHTm*3I1Z$`HLQfq4eu_q zn#}zI{nj%Yfvie2nm7f2o9FY~Do|n6=tzli&HN}u7w6zWS3r#(NY+!GSWbF1@S^6N zP)NZUnOd>GO}zx7Un%wZRb6}B0b21oB>!jZ`v2a^_V@1B>cb^g1lCSXm|bD3>?a}S z)H<{=6q}|WbGY0ZK@#ogtW_1wtk}vbu2K}= z2fM#>$qp`IqkQQF>A(glX6WEBLaVGwxSBUkq@FlsBt-ghD=m3H zfc5&8xMjC-|1HNE3~#jZ@BBa1;@Skte?yX)2E} z30NxqbHTik$jJOnuND|eeS%h_zHL|S?%NjZNDp7#^1$(Z&`=65u2DR!k(5kNRB;`T|epy@@Wrw)|_5{K5A6S7IbAyZg<>sLygXZR`#WY~|CimmnI0 zy!;1K4U4(s7$}Cy#jRMyww0W-w=)SDbKK`eU9+rqQ*^nUOf+(o>pyiOe(~x2ipQ&z zI_lQ&h(nP#u7PsVU(20y+VsWdbS(qcu{6#MUl`v&tg(`Q^9^3DlwAL*lGB}ni$n;( zp_VZ3vk(w~Gc{wak+63!?QL|zZaWYmmH}^29f{p^O$5LTEdvTF)#swXh}}?kJBZPdFJ%DkkSeGN-O!C4Nw&)DzA8T6vw2-2 znFVHZm3j3|%JPILQK~5chR77fFbk#%bf2h?VPm81d)9#$c0my~j^Iz^?@B5ga~^1Q zyMPxyd&1Wh`#?ar0|Q*c)0rb7CD&Bv{B+~IxMb@;(NB^ucE&+o5-VOvRFMDXGNLv4?Z-ABz zlLK_TQDxIz*GaWZ0 z4LVjQjPZ}0?rRO*MOMcH8gORHHSGVlWrclC3?Ri`^F#kCBUDQy;q4_0PVt>ZA!#WSk&So0V?_ ztPS=@5RdT{W&WGr0CvP384UHMyWIz6m(w9nF3*p~Hhfa@C;deMS7xI(VH{2D)s5#O zcBqNbjvyrR*LR*Znm*VUhG7?A;4|=H13Z&3-EgW#z=&VMl&{9?=8c&TT~=O`eyAXRd#5?I3V z>B4~)ZC#9od3f~~7&lf|u~~{D@3;WQCAdo*=7VDN&IR~@B=MC&wot$1S2r#yKi}RPen;X_D znj|O$`T_~yzZI@jCpdMe7BB_O=(v}M);z$T%*8pz#lk$l=Y zA{bZ8UOsazAb-n=MrS950&st#ZupsX%x2+N3`2PXpjfTm0cINfkhHBjD0P4xBIoL*BJ~u&5r-JWnCO3wiKjti-9i3RbJ_>rs{esoJ>9%V)>MuT)cUA6t z^QHa5<0wGJmxB9FhHCd{`yedB1Y}nTbS1AHNYq5w8Z|@!u>%;v0MW0(FmMgSARjVI zvVVUgkHCmY2o(Jb*;d~^(^KIeWti(FueJtw1boS86jzmcy()lA?xp&cqq`&yehvKi zY!<&Zv%|$0;5&TE;7G$@NIbk~^CA7p5&C9`-;-X-${hsGS{jssaEQI^AdUS||30i2 znyh1gp@9@V{9s44#ZoQD?t35c_mr)1sNnfGK~GJ_{g(gT1Iqrg$tnf?y#21r%|62@ zQ!ng0Q_>%Aau40+qa(;N@f)vJ-dEY(5x}c*cKm9lrgftBpY@)~%%KQpXL#woh{sD; z3}9JJrHZ6-Q{D@)YD>_rRkwTU<%w>Qt>W8S*ccy7esgYUuH$iR#sYuAf8bqhi{vlA1XhJQ9#M0-+3F2swE9*KZ)0B| zXDBs_&^}NePTc2R%e$`un4wT9V{T}sn)arK{Q({-7Rhd6SOJXgArz!!IU7+j5C_?~1YGWMV=*T_l}b!>v`63)lvddTWOHDL?1={d zzZddQcNo?JSe~p{xvatP17U#sQDi~^o{Se!wpD(&tcKH(?gvKr$wL|gqLIWjpM3~B@D9Gf03p3(7`3~GfLDJJ-92OY#;NNBk}Z_i#nIY?bx8hbC+IeKuV z<*?hBwvX?>61XNn`}X7nEQXr#3p*H!Nc!cJY~*yAXCz>xuyiRCP_687*z<7FCuya8 z@$Tj)oyDeVa17)*9mk)zzw8mb#AKqts4;sYt4?Vf0A!3EbY{_iP26?JL4%1VeE#&o z3l6>ozOBBSbKAfjDtqYU)BE##RAfyJMWxxVbpHloPrNp68^0F7-QsK9fPBZ=mE&9C znch04r@H|(poj;gHbuOcf<<-KKv}bAy=s5$N2B;20rhtSMa$_3Gb(I=dINuMH@=IR zL7q}xLLWHb0cbL%)shYuC}BkQm4xMIeYYj;wD`Oh%zNkcEsLccB@$Vg%l|?@&CihW zwl-OuB-RjVPZmX<5*XGRHIzcAO3ULhF*ioe%6rqlKO9v#+1R?9QnjWN8w14PP*N6$ zW2AMWV>C76YhGxotkr6C_WrHK>Q5JR2Ns2LEp}os=q3~J$l0~V$kCU`jq-NA6B8Tq zPrl(JiA^yB1^##Vhyln>kU=8A!wWbgw*##$q1<91g2(m3{rVb)UyM)8OjZG|b$E?<@O|d?Y$!lEDQINEE@G(z zE(5kVvI6$FqO5yIr&g{Fydt>E<5f8sS^E|OaUVO3U#q(*rnT3*d^Js}R@2^rB6Rr{ zxp-7ipPwA9{kUzXvSHq@n1HPoC68|JF7RQ}mDywstea5~?k5{y10KzB2$~^^QrYzo z$*^2@+l*8)!lYW`;mRX?m!KU3vgtjayUkz|xN0HHpeVL_JhaNaQVGy!fjFy0)*yqJaq)$@8{s087Ki)B!C{Nam8~wp8nJ(2D z=|D5b*NsAhX$8y%7!HPCzNN+RVHJ=Jw5xG2ZS^M#Gb{bQz`p~^I~oik@`l^ZOZsR# zkTZ;-#;&!(2xuIgjFvtgC0%rFZm}IRDN&@h_vZrgA(f%@gYOmcq$_6>JeY3Pw49#! zRX`Se_EH`!i;|kX%N;HOv!c;Y2(X~-*MTeSh6NX@@Sc_?G(0kYe z9AY~0;i&2_*9{sCHTBiz>j%(=-NA!{Ad~lLKzn6YV}5R}e_TIDR$p%Z-bTc&tmrWH z-iv=lz~^^+Ds}UvDyF&t1INoUB@l3b+1@Fbs|S-HY~wN>=V5Fxg~!DT2`h8h)_Vuv`Ry|N7;UY(I8yqkp-<%7+D6>YS$wcCJbU`kT>nTAcs7j8IyNEaTHeK1r)_}S=; z7uDU&m9xw*IHWVI8=K6KV(*AHR3itrjMIQ9cJ|y!;I<_Mo*;Z`gSgv9DV`gx;|u(z zRkZsuNFRiX#$5JkDNb=(W0NpLwXJW}jeBhOt%6Y{^|5gd{|e<(n{JOV-krq^A@qT- zr&LxucM$7+PKCXFxgP8I3tE6K#5TF=Rq{91Q?k4_T?Wh_H-bv;M5r#dsJcAm2|+iI zr%AzUedp&&-sb$)y@LC?h%z}{wE92+HJ;qlL`Dw7&u97 zWd<+d&EpU;uX3?P&1Vxwinu1y@#hmDZ5T@&!V{lYP@N?IQw<||jT9zpchj7(TWhGvYye3xjnB+H~z}==k zz+0a^Oo?#hiy4y`bd%$9#$E-Jr&?U;yWhYbyeUxdehcH}pyHrD+U|^-O*7QYBFVX$ zk6o&KXv@~q*0C5_ji=)LL-bcfZ^MQ*8X6)giz0d7u zoZX5lzPVr83c^>!FThH4r`9@OkN00K!!Lar7##8#9FVF;K4&Gb>eFsLU^G+9POujP z?%Bg}JE7r%EPp3Jf-#oVs9@bVP zqsnSFYo;AA#-jHnQ3_AAthOFZv7ki&<&d$>Z&~M)oQ(@^q zT+Lp=4BSzDx~jNvfpYqxc|dJF(}1rnY&DVr8zR!t-%*iIn)fz~uHwNgD78NHJ$kiN zuu-Oy{rFv>5@V@_h#|k_o8Q4Wzjq~d*bg13;Pa%JaoJhmGqrX8A=$oPpbZ0k^SJkH zYz^~XCjS{B+_#U~nQZ!P1o+iHW=o_v`qnm0^iLYGF(0K)D&Lb$z21ZiSAxUQc&JeW z@Bdm=7=iTY1ZB`bA6#uBdK{5XoNU1j{dyR!X(^RU6<<7%xIV7F&$pE?8*N2*(+6sU zH|p}$WpcSxk$|s%F!gyjVz%C|Wxl}SGm702Otd*Mmbzc7h=*+Hmx`NH)3?6!o|39@ zs~8Ncn9x)jOXXt)!@G2t!CskL*yIdq{7SWKYUMjs@tA1r(2RVrfUltrUue*6TU`A^ z__Ka09QabIW=6vUNEiW^*J=N_ZiRK1b4ecr2b~Zx9@QimjZ3TNFO(yy=+Sc|I2l@{ zn6wC4y)6MRLMqM4JE8jQXu67y#^c31!8o-gQ{tRY4{=v77Zpzc%h5m-Y+?LoaL2Rj zpkFYwUo{H!ixKfOL5EN&Ur@rJVVz&UGV1Y%K4(f0szDx+xK<)~(ibBU=OD{TW&Usb zlvEQAX|nDHg+)a0tMp!5=!sT;qhograH&+Q$B}z*Ku@0!-)bRE=i|(qBbI#Cvs1n> zrE|!PZAz^SzDURhExo%mDb>Giko7-XXk3!(ea91-mo#*L0s9hR<+28{=f-bGPY5eI~PwMsgpohy7NN8cAmebN; z@@z0AB0%8sMYT~EHEFi!IaUZB#qDjqq~Ojx$&=$38AmE@T|S!!qli;GYU58}>QwyL z+@n!&vS3oy$DETgCI`>t!<>yHss1%%KCuba*>S&;rxq(3&7wU+Fcr*~O{rJ4TD70{ndSW5T{C}oD!4VJkCth?h58oyh(CKv6)!-+hjaWqc=D+?i zyo0H^S~Y0JWp@Z_r~SFRKM@hTlRpNU{_e)SG0Bx%Kcxb{x)UQ6@XGA#I>IUWMdoBb%rJusqZe9bNde9xxE z-{bavVr&OdgtB zg_>>+$$&b5DkYJ{a*N%+jIxqi*(pc!)?+zOzoV4{%|EiqOZo44Sn-B zTSzm7DdD`IJj`WdZpB(2Da6$i>Nqp*f-k;HyIx&dtI|d8RNLVmvlVpm7@Is*nngDs zhpp7KnESH|YaV@grY`E&o!b0bS@{S|>@YzUCF6zS5kjd3jbiD!8tOCyZ5e^wV?rMT zKQMLVkg$%V>3lM8X*MWf6d)_Dl6hGp6G5C#o*(|X;;NqAL}XSg z=b!k*W|5OYj>)qE)AH39d2l>aZ?N&}$GgiJFLB|g3%XsJt6aHVn?9ShU&W7g3hiHr z5e%v0`mwm+zH*BYe+3G1o*7n^O^*&fsx2D4n2tKv*fjE5RmC)Y_;Pz@^Jyir@{A7N z48@X@Zc9;~;vg;1=)eZ&9!GOC8fvbVIv%+{xJn%!Spzw+<#1rq; z2l@Bu{_E?w>a*{WzO=Y;Pmyhdw=8NRL=31|;(snSFz-ARe6Lu8=8A@H=@-R!Wge$# z?0I3>qlS6#=%7fHeQ6QV91K2j$c?>SDEa0Saq}@uxMWZ%!VrHQ3`&fP!}ejg6Cn+hHgWHA$!bD(IO~8>gm1p8pyx@9lDo@MFU0EGXxqMLI-#6a)ZZ$j-l+ z!q8uPEKOvVH8EAW>-6LWL7Apri3F98zKvSkf;i|}s*>Y;Kpc7)ppOgBqW6{oCszEX zkD6uj#ZVm{1Ims*a?=EaAne1kLHN-crSURw)W&GJ@Zefi$3o#;Yxt@xfk;(;@ihjQ zje#RqgE;||e(@)fbK^PAWjab_S`+_Yu^J6k&vw|AHiFRSecZ2tA7?a+{Kn~dmeR2TF^Yd5Iu&FeL~?02uxx%FC3D*UP5Rs>2r=XtBieK@ zv7Qo8CDq41qCVJ2zVR$E6tqlA_zw5r`nu;p%YB+kukH031QYD#)tQof0o7ZBi*-1D zs~NRax=Cj-fkuJjrFgwCn!b=kQ9Xu=W($Tqf3-@e8gQ|@sRD0*AI-(WirQBFuS@rX z>SlvOiIRdts%GBg9FBJ!e3E=?`Ha_}n%0t~(unDs*>~n_ly<9Ndl}`@%i2t|`lhh& zuzW?i%u+4x)h?r%jW4{7i0;4+ey=(zK_WL*2~^Xk__D{9f7If($u>KhIAeHm4=dA1& zGVD*?*z>kw_Z@Sn!SO{1Q+^N-sr@z+Su*GeFnl@>!X6YWI(KIMBD@e5sG;>B4DcM^ zS8H6SkKasRpsT})1wWiU2c0#P^TWW(Fg4SmW(dpqt-`=G3ktyX4^H|FgA@8S@<_xf zZWXUpV_0cgYIa0)^&pB`pYXW~` z^j#a3P(a+Ni1Zz~@s|U0#X_Oy`^9b3C|qn$!HwbQ?cXJ+u-fTvgxi@uTHOh*E27Rr zl!)79&hl&nlY2ONj!$)aW7fwt6vW6)9cnzT@=o&za-oyt^u8&uxeD=o%}BDXmO(9> zFu47;ZUW}7H(EH3!Z?mZG#Qg2ZdbnEgD;i?ncZO{3M984EM`8<1kUBI0Lm7429yeVFQT#q72N;JK8F!1pg_|P$S0biXMv{`~5gic^|P$?}#y;GT4VWg@Nt27ZkMNZqjBG${ROu7BQEBsvNv^ zdA`&7%d%oqUJ|CtM`F(XmInD*P|DO$6=a*S~gk{LF0GWv zpr?Bd%ZzblSS2G4g~|TBO!)&ZRwH@b8pt|gT&%!^ULrTvFXtLZvOSPZWHu&?H4?D- zc_E-~+Kl$gxM?+1ZvJ}KfBFkeg36aUx0P>kly=!==mh4F80ACSm!Ek4oJRV7o>Rqw zaJvT%%Tl8^Eg0}?s;`N|BB;l5_z?7=vO2^bfv^o$N0D3tS*8s_14=Y|apQS+XH(8V z2%Ip3KhXN4ju`rc0}Ui}F}au$iZyrh&#>vjD8$yp{%>7~J5P#$6kUW8t((Xy=~SXH{82!r`7(ARmmpe;LDGZZ1ukt|-?ro)mjKgG{YOH^ z#nEuK{`Uwz-;5!uAS!(i@a^;{(vR1?<(dz8qpHBBhzjwvL>2i*Ny3cY89 z3zK~8m)y82$UR1;OIAAnSWG>uc{kE&+~A+t_zqqr!FJR-<+;r$et9BFPl=Z#=7C*aXi-$z$7f|3n334!aBGQu1Q9B8oe7SRP#asvSD zqKaFpNXUTHCW?k;cz#-+be?Vx!q1QD^nB8(N_LQR31v>lDgZa)85Big)OpueAQvsg z4ee&K9_r3Hn~mWJu^}f3)BoOQ9kpeu7yQMa&!k{d>WJz{t9{EF_VoqDW9Fo@k&A zcGlC)vo|;9FEI)>t(8vi>mg?$=kDQIlaTZWQ-|5KU3)P)6pQm^V$TMIzjc50pfU zbnOoTcHm(`XimyE$e(T4si_9!w0SH|3cU2n4!3^aSid=;I<)lSUV9~b9ci+dQ@dEX zI&2>d$xCb&APj%UqKXvtC-~f5Fb!Qa32(!7G5_U<)Krn^2#|IhgZIo#jgADu?-(uJ z{Wn1Whhz~2P&8Y%>ub<+_gZlY+qNP+*Wr&AiH8BTpMd?43qDe>DA^j{_rbTJPqn7CyJ$+oX#V zdFV{bSzSP+-b&twUh{45K~S)(Drg(KhStTp2%Non;1II_=DdssxIgr9e~D8#@#>hL zpfqz{QLmdGBf(R#WZUS-Yngl~jR!XuUGvM%tyM*Qdaf8)06J(d#R7nIu~?sd$^18F>yDRQZs z>KI{nqBDVxmIj>DQk+Kck4|GMb=Bzlwks zi!Mf+vXGy6A19UU5aIXSoxQa&_7|WWF4Ypweh7Rpryyb)5(B^`j;DACO)Z9Q#cdYax%VI@L(5q%*;q}U zJrxgT_$i~pJx0+{Ss&bZ`FK z`hKsLV+^b|xFeQX>his2zpF(|Y!R@SserM)-Wh-uWc68e)Npw8^pX36aLYA;XK4xv znu@u6l7>Q-B6q~(9;PP8%mCS?Ib`9GfTo!2@9Q@a3rlzIuQr*~$?Qj=coG=oI9{_` z64@xUfQnI&?9Rtup;NTW&tDOquiDE#^bF5N`O%7dcD3hFL}ejPoHMS!Wu|Bo4LL2a zg)yMbWYFnWv2B^i%tgO_^sx+3Mxl&Cl*t@2 z{^ba6)9u za2(HZ@Y;;o9zeXPTXfUyjoV5F4CRB6k)-glqtFWb8wL3xQ94)UnKr3(xhWydd0@bn zNEJz7d9?qa-p)wG0T2)3@OJaU2Uru(A*PZf9oa#^OkckLj>tkof)jhXaU$9vkRDK@)<__Cn};s$_7-;T5_2!cbtoN5*A{uoC9F?# zz}u^OYm+xsa7(tr$SnT)<-r;ScMI}4?(U)niR9YK*Qt=@cZ7UL6G63{y=aT_D)q5I z&Siw?iA_69t1dEqB;2i+gPdpk4;YCwDT@ACqCY2z^zat8bD>cO0N>X}vB+$$xoIJ2 zIvRYNmovc6I?!gM>|{s@WqaeTsN$z;yGE(v)%aUNZot5~6m%AapwIu*-A6l&;ZBxR`m zZN+u5O|CqPJD0?$y~>|DS}wH*`e(4mU`$hQ55n+)&A0lfhO{Z>hON)oG-4j^lYfAr za?lDCNwU`;4Nra69}S}sJkH-xoLDAwRm zbO%JmM($+a)hcfRqu-pP=$e zK3cf*ZJI_I9UPNl^@$6tvUMFyFFTsunt+&90&`L^2k%!ZvQr*?{jFc48%<>=V>30F%ce3rm0k6`{dWZ``DBd;mt+`X(B^?xSNyP%El~c6 zdAH4iskT{+Ccf{yr)dE^wA;161qMOC5+?+J(Qw!9ij&7Yyy2)rId}i)+0E1b>x(za zEAXEx`FFNHqke@YG@(oW8^%-$_GYPZ3eCJ{5IZ#ls|(QBEYXt+fyBmS3_@qpcVCWK zaGH{CANmT(d$aciwS+#)(H2bks`5mCz{$hXW!ZH*!lQ6f| zzMrfnx|}{lSk?;*zzy3-eDMt+`@yM73HVAkq>ddITCgXo=_av@7-A= zyaQut1#V^-P@$|w8R4%Lu95i8X)bA7xk3EYDuc246<8^4y09@K_nqdq0`XdrjnX6W6i|Hz+uluR`- zX7$RUap@EICPOqdVkdLOiWb6g0D^NmW|q@7htXtO_?e_pUy$<+mh*p&n5pZe`D|aD zoPsHUcOYCLbz#pVC?uXwGpPZV=KFF1@H;kH@`9J0p>XXvJw=-6Gs}R{XQ<%T#apvL zGZF6f&KA+g<|VBuU0H+3P$K@GTmmaAwk_*1XDru{e#um8ng;abpvvUgsWsRT@vKwp zig!R(Zgt2o-=!urEgXC;4X z$93+;mP#o&L&a1lHz@bF90W=OysoTjFyVczALG_m1EAq8%ig*o(_C2E0f z|5w*<8)hxB6~~z=%{;)_QFrYDU2Kh?sys$o4dn$8ARiAm7!?TMs1pwJE4 z5TKtdx-DcBTHKKdFao$nnSOuIkelUHD@a{~C7~zKpF_V32Bx~L0|e-Y4U(w3jZ?9= z7tVNSx4J_NpY0vTi3J4>AK)xyC7N7H%~MPiIsopM5>VwxMEQ$SP3MGkHVpudSQ*+FnFPDI;d>#2JwjX$nf-6O2dXZBS#avH7`mb6% zzFv$$Ps{oGuXpgRW44WQjw%cHlp4Ep13kXKo&I31NU-Ne*H5Q%BPE5)V##Np5kUuV zpc=7kj=s|6B6-dbwWr!$)aFSkT~(En}H;=V9wqJv1p6daLIV}qJm@8Y*Z6s%qB zze(eQGa`U6dRp&Cm}=E88{bMT^q`I&=Mw3&8=~H0IVnX-+5BtNY6Z%08m@MCh_k0o zaj&P_z!@*8sA{L6qygd_ZVx>qkK9_vkG|T=hHc3D7^_dSMF99=x^%WSLQ)KOSP`CEq#K|vXJXa@b&65z_THge{Iv_MgLg^){cmixa zjzA9?U0z+f@lCU-VH}&U3vRhFnTROEE2DLwQ27m+kg$~bePq(;HA?ORTqP&mMh~h) zBr(y7UQSY{Vv-en=QFvKyai?Uf^JnB;RYT@--M7iDnPn^K%o@qG8|+5by#PxZ~Q$$ zBs8K{Oj0Qy08(o7KUsj8r*(mXV%$R2TBbTdCr(Ihcz|LTYf0#lgaSzSa{o6D`Cl_E zR>Z*7OavvAJ0dtXY7?0$A=^+zehuUgn~|9$9%H4c(m(+QHcIA%-y)b)55Q!h?V8Hd z?h^pCVjAKhJgP1g=81(LVX2??To0<2cjN_J@l8e@xrqtSAuS2W_;9;z0Q~BT6dFm_7vo3#@lt#@sLKLjlFAbH39(* z&rM|NBZU|OKF1)-ARfUt3*_okfuyH^2LcGS1gpje;Jq+_ta5>R zfY5aitnqOi`CPU!r2YqhQw%Z!k3x{88O%12T>*(Kz(X!#XPp$9hhB9{L+>$&m8Lll z3It63&=mDYHk?oHQ%Y~{;wEW!V6g@q@euxSYBGvt%%3it)eB05jO*9r&4;^?W$@h+ zd68GK^3$0je9x>%B9Tlhqr}C^_B~lT+0P_#*I!67q9oTG7va0gVsCJ<=dyyEM1vG* zSX=zccR5!;O=2;vd9k*B=`_)Uhi<37onrvU)&5G$7@{3YiI016JDnBYHiEN-fGDM0&KO;qc^!5g0uz5bIW zcfkl4=L9FnAK<2d=6hs8bQt_T01(%Rc9=A=HsNcCPkr zaz(7E;Y7ko#Ex%f4Ha7p4LT6SZw5-`QE(3U@M-*YC5BLhKY@rC9$#^%58QDpw!=W^ zW7x+%+F1>fp?d9WFWhYG#;RvYNwmvH*)%OF&cG2St3x*f? zqzsHxw4dY&1C{(>Mrl0A{)7JWM89Av7We@SQOyPhOT!fbo@y)&plnJ|fS0ucQ-dVl zw}uX4=~X<2`eb(l=s%0ZlFvcPs3@oWaA5A+UF?u7V`&z z?*oMYKDt9foys_?zg?bE_dX+jK4RleZ1bT;QI-z^wrNRVp$G3MeX)hTP26EL_@(JT z4!SpygJ%mtv3sfRiqJ z7TQ6fZk_n^j|3?NDY1$t@3kU^8N+Cv!rcN)NVs~aEONzd2^2v(W*Zdl4swCaynExg zfRV|&u~N#R90wyb->N4hFjya@j)Yf>E7i8ttZ}$s`u_=deu69JPPaEP$CqR|Hl5Lp z0kxsJ$3pjchGC6FC^X*HjCt4AMG!%TB`V*}dd;MjX`L293jBZ?w$KSkOM6#st!&!k zh>y~fH)S&;+I$WNHW3a5IVk9@NBP7YYD!iwAE!+E%VSv_q+~9{M3#s&gicYP#A{fl1pE=l7mUjQtY}O87&|Y-^{NKuF%S_)%Ed;H+7V!j_O6R3sCdxjPq+n!|u09^%;BVE+PE5Q2`{67U|!h!Z$?WvVh8ANY5)B z)h+wz$X)678dOed4Wo$IoC~G>0rbj`X{6l)qZ*iNWX)nIp3l;D{|riW>N5pk!JJi_C%}oH%J7=Te6fgx+kTtQVjNu)vJqJ$XcY@g{Le{t!)sG0^1yf#AvWTWrP<5HkU zU!hdk@Ubb=*jE}K%$WPf^l-4nQ+2B=t+WOs_rm&Cx2?YOi~==4($oGQquw8_>XV}R zeM8qzya!sZH>To$Se zP(5VB_j{@Q8L5tx1$IZ&i9Hh=jh#vh(z1_h)AQ{V0KrU#ahvB74a_9a`>aq*6C29Z zeM_H*0YVavvv+tYIn>F-<7fTf;L}%$7ZCX*uhvk?MYC#1wb1)qJw0cCAJiHX%fn5Q z^;S4Vsu)Ma?0fU3B75@Vsd~-ikuw$DF`e#b0@4Lgj33zP^ZU3sY^uf)5^sR0R`*%U zD==8O)Dk7tU=&m}w>A(p48+YkN`55Rtw=OD;K))0^0TfT*as^Sm#iq0HE4ZoJ1ifM z7;AZd_^v*`*Yy}`oPkZ_N9DfmD3V{hBZx|~9|3m(129DM=GUT8F#pNi%)J1#{6vEd z9bd}w$H&C)nlSU~Ql1yboNvME%w-s-qis}U95}mgn>wsftTY?i`e@KC4UopqRJDJD zt~cuxH=A=(hP0R}gB7(5(nkf`D^mIzCV^1dsTV=c!ZJTzEOOG3|qje6${c%3oczuH-3=9k%WGl6gEZ+qKGxaYW@v2!gbhLOr8r5oQ28PGomjpgv zX`zCJtF4}%_V)JNTt-$}uXg?*$wJ_!MWyrrMg6tr3&~L&yQ736dL9-Rr2m*xobm)x zH$D0vu)5S?2I@D`c!$a4i1Y1ps7*wR)7fpmI%vM?Uuq4vIQqEPOrDE!E0a%3L-+lW zp8HB6-3O5TPduhE(Zh*~2)Lb`{yKl&-=3|>C83$r@k;yoi|Lp^RKT~xNDm54vs_et zQwqRE)rEeJK)k}5iJL1d&o=szA_+}`)wfvYm#i{Sf}n3&fT@b@IGCKC3-Xi;Hc#kT zZUp!T0%xt=P~2Uw!u#ZUn~L0K(bQVSDpWEvpG z#L{E%fWK^E>`uvv2rPpj(xjBY{){Z1(fjbh>MXmge)x{WQpvF~4KS(@P627LrY(ly zaw>lBgk9&)D37WsjNzNgpEL;fq}Dn%QI%^n-yPwuV+Nz>-dR+YuMG~{^>BUT zB>9Lcrn zS&)@sxOxVgfKfqYpBEdc{g7Adcu|tyElT6mStRzuf>y;W#~lR)vnK zu1K@Tdj(=0+kycnyO^0+TFf|g?s4TLV})u&njbL)h;6oIfnM&2K}Tyo@r01-+E&8J*fZ{ME_BU1{YH6wQtZ|c>g8NG(MeSG0((oIOg32iSp zrOU}mjz<&z_O_2)t@#1Tc0}dLFWoDi)`uNh3FNsHtO>vVpqcog{Uhx~s;gtfK82{d z!{4I=o#Qdih~ks?H63|ZdUR%L6nc5?YefPhb(cc{WX2vK4>cCI>Z55#2J0LJq@WS{ z>#)wAj;O0>tyauJ^#%cr6BFi#ylEWQx-FM`Rt4V<(oKH;?&;}iXXo2CA`&|dvNX`I z%gf7MuSWkbw%#(V%4lmBrc0z7q@+8gyF5`C;?(P)n4naD;>3+Zc zp7Z0VKjgX;)>_Y)BkmaU&&}_T&B=xm-=n?V-4%|~s$AyjrTE?~KneQ2?C$P@{9PY~ z&F+4x(r;OE%-d~W{nID zGjnqwHka+1nwr|lUN_l)WP+FHA&@S2WZ$RfETEJ>RNpldJ;?Vy)k%4*llR*Q!bfNu zfn<8V3TKcNZ@??EebppGiyF$qBr~3M#!xkOOv@R+@4WQ*9nz(PX6iZJPv6{mQ#dwA zOh)z2lktoFN@4@;0Z?7fLzs?gt;g+zq6adoe5ImqB;#{!V?wt|*s2QJex%5OFVa3H zvp}TPN*seLBJhX?I*ByMa3HLRCf4d2r1%N?)12&C71H~gkfVv=3?QgLrrs!2;50J* z?YzXj$p48_sP0!A9Z;TC$K@G)aLBg*Xj6re&aP2;HT{MOwobLyXMDR6Pw}a@w8OcJV>R-L}GX>wGVjif;qWwD1Ly2i*Yf&zN2! zp88OPEs>&fZ>?#Ej^GDtiV8YYr5mh*zTAioWntr00zrZ5nc>XhuWRe`KTbdHHF7NK zo!0F?Udb$yD;GBF6l#jQT&{u7=kA8`(3jY?jP)=*1S$FE2g)#DUJvPwfkw#}tLv;v z<4SBb1JfF{8`;VQPRl7@@^aAeA@Sgj-G z{q;b6wt|Mm>M>I!P!;0?5Q5l_V19|J^sg+ji8Ac}QA*Yni2T}s!$4i*Qa{)~UikgH z1`(BhqiN;_nx?XHx6atj1~x!pOW)Fv8*ffMS-tQR#G!_J6$eS(s>S3 z3lm{&0{i9k>s_453k%d)2`aSe@@rZ6sKGw;_WXQd{CB;02*wgJp5kt9O)MNSPS*~v zv{;d&qoe6s`~yiB5j_P3;J@1%_J{N}6&IW35;57Ze)(?&aJ|E}(}qY7$8_^wEqJ-L zLo-v$dyB%#rfI@Gc<{R2umJB)90OqKDb^w z`Z1k{kf0Ms#5+yX3#N%Mr$#JT2gXB><1|aRw@fX z!{ugS0Du9+C|vlTuQNJm5V<4h+_V0U|I!cA8)@sT`HI(V&oo| zSZ&YtN7|5XITF@~I6^4aDdp*@lTi}$H;@n4ue^X5Tbs#|E9)N_v zTQ-eA=0h5+E;;fSi8&=0nl<>h7V+Y4xVu|H8shg^Oej3O;ej%IEvH9<%~5@Ep5a4s zq@vLE;lKm$Lw?eJsfhizWc~!1xDVIv)M8siDsx-f-c$-AYjJ0VoYo{HHD=SlH!a=V zw4*q>9GD5*O9MzE*Pa#WLSTcx0_hJ>=Y{83ck~>W3SJ~8z1=mC%nJ0rIbR>TwWw|r z*|7llofV>w?Tyw~7!w8)a&EkV&&9MyC6PQ&fjSbZxfv~{puZGQCoPFO%sB`<`S;MKMglU=2WNfh-r4p3_`E?emr4k7ZCG-sXdm8%s zRnv#SV}rx&rhT^Ct21VhoRHDU4y~x&<6c!&^>^<F(wczv0C)$CDH;fL}-w#t)wJ1o~#`>SktUA3wfzGM=S> ziZzSh-2g$2Q64i5kIOY#U(e@iIVo|0?`Wi^)2a;`Mi}RH94n7+WjmwlYdUU>cvK*eI}BI z&*quSmsT`9!X(Wwy`CBX)iXgJkL*vavW4D#R?9XRki^5;#V`S?0e_4Yf$hQt>!vvz z3G1mB0ZBzxY5L0WhQ6>B=-KdhyWXqr?5&Oz_3Mfp2EthUBb?vORZ#cPK7QLhjD*}d zf_T3xd>^r8D}p&(0sJ6JLD}|c9%5m4-1l_Y{K_pPEgX0D;HacArKF_td!6C87R-Z| ze6RTD3DNJodEo`n>&%*|0Hy@UwhM?{yI<@n%2FAt2Ybfo zORQl({YPcOas+?AQ}!>`rZ3j0vJ`GZ+8>ZW1F|~nPQ>r&c)nrl`nSk_Sw~k_m;F*x zSC^0+OZQ*=FDx!mCSW(X;wEz~U>#ds z@?8Ui7@e?rOIRWlejcl%=a;(s?KK@8-2&kj17AW?o7qQE^0Pb?`n1&4&o0mI<|iv1 z)HatYxLXPou;HJke`_}0z8=`VD30~E=0RgfAqe=N&8nMbT620e6LjiV9_Tc$F105}trB}U7X2E6^sXc2fguG8)RBPZFa zazx!*bH$DWsSf≤k~hFS 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 MB^1QVL=AoaA5plu00000 literal 0 HcmV?d00001 diff --git a/media/in-memory-engine-2.png b/media/in-memory-engine-2.png new file mode 100644 index 0000000000000000000000000000000000000000..949ef632ebaf3fabbcb0075f029eb34084aba33f GIT binary patch literal 24928 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 literal 0 HcmV?d00001 diff --git a/text/0111-in-memory-engine.md b/text/0111-in-memory-engine.md new file mode 100644 index 00000000..88ed68a4 --- /dev/null +++ b/text/0111-in-memory-engine.md @@ -0,0 +1,253 @@ +# RFC: In-memory Engine + +- RFC PR: +- Tracking Issue: https://github.com/tikv/tikv/issues/16141 + +## Motivation + +When dealing with a large volume of update SQLs and coprocessor requests that read this frequently updated data, read performance tends to degrade over time. This is primarily due to the accumulation of duplicate MVCC versions and deleted user keys that need to be bypassed, resulting in an increasing amount of unproductive work to read a valid key. + +The current GC mechanism can mitigate this issue, but it's not instant. + +Figure 1 shows one of the metrics of this type of workload. Read amplification increases as time passed and eventually converged due to GC. + +![alt text](../media/in-memory-engine-1.png) +*Figure 1: the multiplier between next and processed_keys reflects how many next will be called to read a valid key.* + +To optimize/enhance this type of workload, we propose an in-memory engine, which offers several benefits: +- Reduction in iteration overhead: + - The process of iterating through RocksDB SST involves a significant amount of overhead. For instance, seek involves finding an index block from the meta block, searching for a specific data block from the index block, locating an appropriate restart point from the data block, and finally performing a linear scan from the restart point. + - Utilizing a skiplist or a similar data structure as the underlying storage engine can achieve a log(n) read performance expectation, thereby reducing both latency and read pool CPU usage. +- Decrease in MVCC versions: + - We can agressively reduce the GC duration in the in-memory engine so that we can quickly clean up the duplicated MVCC versions and MVCC delete user keys to reduce read amplification. If the data we want is GCed in the engine, we can go through the rocksdb engine. +- Reduction in IO: + - No IO is needed for regions cached in memory + +## Overview of in-memory engine + +The in-memory engine serves as a `range cache`, storing the range of hot regions in the leaders' store. If cached, incoming writes that are written to RocksDB are also written to the in-memory engine, leading to a mirrored data set in the cached regions with RocksDB. + +Here, we use `range` rather than `region`, because we want to minimize the direct modifications on raftstore. Using range can decouple the in-memory engine with split/merge, and we only need to check if the range of the region in the request is **contained by a cached range** in the in-memory engine. + +A load/evict unit manages the memory, deciding which ranges should be evicted when the memory used by the in-memory engine reaches a certain limit, and determining which ranges should be loaded when there is spare memory capacity. + +The range in a load task is from region, and sometime later, the region may be split. So we may evict a range that is **proper subset** of one range in the in-memory engine. That's fine, we just split the range. + +For example, the range [k1, k10] is loaded. After some time, the region of the range is split into [k1, k3], [k3, k7], and [k7, k10], and we want to evict [k1, k3]. Then, in in-memory engine, we first split [k1, k10] to [k1, k3] and [k3, k10], then evict [k1, k3] where [k3, k10] is still providing service. + +The **safe point lifetime** differs between the in-memory engine and RocksDB, **often being much shorter** in the in-memory engine. This means that the in-memory engine may filter out some keys that still exist in RocksDB, thereby improving read performance as **fewer duplicated keys** will be read. **If there's a need to read keys that may have been filtered by the in-memory engine (as indicated by read_ts and safe_point of the cached region), we resort to using a RocksDB snapshot instead.** + +## Detailed design +To integrate it with TiKV, we propose a Hybrid Engine composing of disk engine (RocksDB) and in-memory engine: + +```rust +pub struct HybridEngine +where + EK: KvEngine, + EC: RangeCacheEngine, +{ + disk_engine: EK, + range_cache_engine: EC, +} + +// RangeCacheEngine needs to write data (impl WriteBatchExt) and scan data (snapshot and impl Iterable) +pub trait RangeCacheEngine: + WriteBatchExt + Iterable + ... +{ + type Snapshot: Snapshot; + + fn snapshot(&self, region_id: u64, read_ts: u64, seq_num: u64) -> Self::Snapshot; + ... +} + +impl KvEngine for HybridEngine { + ... +} + +impl RangeCacheEngine for RangeCacheMemoryEngine { + ... +} +``` +*Here, we define `RangeCacheEngine` to be a trait where `RangeCacheMemoryEngine`(the in-memory engine) is just one implementation of it.* + +`HybridEngine` implements `KvEngine`, so the majority of the works of this project is to implement relevant methods required by `KvEngine`. + +It makes less direct modifications on `raftstore` as much as possible, as `HybridEngine` is just a specific genric type of `RaftKv` just like below: + +```rust +pub struct RaftKv +where + E: KvEngine, + S: RaftStoreRouter + LocalReadRouter + 'static, +{ + engine: E, + ... +} + + +let raft_kv = RaftKv::, _>::new(..) + +``` + +## RegionCacheMemoryEngine +RegionCacheMemoryEngine (the in-memory engine) is a specific struct implementing RegionCacheEngine: + +**Now, we denote RegionCacheMemoryEngine as the in-memory engine.** + +```rust +// The code is a simplified version, not the eventual code. +pub struct RangeCacheMemoryEngine { + core: Arc>, +} + +pub struct RangeCacheMemoryEngineCore { + engine: SkiplistEngine, + range_manager: RangeManager, +} + +pub struct SkiplistEngine { + data: [Arc; 3], +} +``` + +We use skiplist as the underlying storage engine and all ranges share the same skiplist for each column family. + +## Data format +To maintain the same behavior with rocksdb, we also append sequence number for keys written in `RegionCacheMemoryEngine`. + +## Snapshot +**For in-memory engine snapshot:** +To ensure data consistency, we have `RangeManager` which maintains a SnapshotList for each range. Snapshots should be requested with range and read_ts as parameters, allowing the `RangeManager` record and track. This prevents GC from filtering keys that are currently being read. + +**For hybrid engine:** +Both the snapshot of the in-memory engine and RocksDB should be acquired. The sequence number of the RocksDB snapshot is also used by in-memory engine which for **atomic write** which is in **Write flow** part. + +## Write flow +The write flow is similar to the current write flow. `HybridEngine` and `RegionCacheMemoryEngine` implement `WriteBatchExt` so that `HybridEngine` combines the `WriteBatchExt` of `RegionCacheMemoryEngine` and `RocksDB` to provide a method for batching data that will be consumed by both of them. + +The response of the write request will only be sent back to the client once the data has been written into both the disk engine and the memory engine. + +### Mechanism to guarantee write atomicity: +We must ensure the write of `RocksDB` and `RegionCacheMemoryEngine` is atomic otherwise there could be a gap where they have different view of data. + +RocksDB offers a callback mechanism after the write batch has been inserted into the memtable but before the sequence number is published. + +In this callback, we can insert the data of the batch into `SkiplistEngine` using the sequence number given back by the callback. However, although the insert of the `SkiplistEngine` has been finished, we cannot read these data until the **sequence number has been published by the RocksDB**. This is guaranteed by that we always acquire a RocksDB snapshot regardless of which snapshots (`RegionCacheMemoryEngine` or `RocksDB`) we may use, and the sequence number in the RocksDB snapshot is used to exclude data that is not visible in the `RegionCacheMemoryEngine`. + + +![alt text](../media/in-memory-engine-2.png) + +## Read flow +``` +pub struct HybridEngineSnapshot +where + EK: KvEngine, + EC: RangeCacheEngine, +{ + disk_snap: EK::Snapshot, + range_cache_snap: Option, +} +``` + +For a coprocessor request, the general process is that the snapshot is created first, then an iterator is created by the snapshot which is used to read data. + +HybridEngineSnapshot includes both disk engine snapshot and range cache engine snapshot. It creates iterator from range_cache_snap if nont None. + +Reasons that memory_snap is None: +1. the range is not cached +2. read_ts is less than the safe_point of the relevant range + +## Garbage collection + +The in-memory engine allows for more aggressive advancement of the GC safe point. If data is filtered by GC, it can be read through the disk engine. + +We register a tick, periodically generating a new safe point based on the in-memory engine safe point life time (we can config it), and send the safe point to an exclusive gc worker. The worker uses the safe point to perform GC work for each cached range. For a given range, the safe point will be used to do min with the minimum snapshot_ts, and use the result ts to do the actual GC works if it is larger than the safe point updated last time. + +The gc logic is roughly the same with raftstore except for handling MVCC delete. Let's first introduce the gc logic in raftstore: + +There are two phases in the current GC mechanism: +1. Write CF Compaction Filter: This decides whether to filter keys whose `commit_ts` is larger than `safe_point`. For user keys with some MVCC versions, the first user key (MVCC put/delete) with `commit_ts` below `safe_point` will be **kept**, and all earlier versions of this user key will be filtered. +The reason why we need the second phase is that we keep the MVCC delete of the user key if it's the first version below the `safe_point`, which are accumulated to make read performance very poor. We can not filter these MVCC deletes during this phase as the compaction filter does not have global view so it doesn't know whether filtering it will make an older version in another SST file appear. +2. For MVCC delete keys metioned above, if the SST file are at bottom level and , we may send these keys to a GC worker, acquire a rocksdb snapshot, and gc these keys. For this time, the first user key of MVCC delete with commit_ts less than safe_point will be deleteted by using rocksdb `delete`, which will be eventually removed physically in the future in a compaction. As this time we have the global view of the database, we can do this safely. + +Back to our in-memory engine senario, as the skiplist of each cached range has all data, we can delete the MVCC delete user keys mentioned above directly. + +The **delete order** matters here. The first MVCC delete user keys below safe point should not be removed until all order versions are deleted as there may be some conrrurrent reading. + +### Read performance enhancement demonstration + +Only keys with `commit_ts` less than `safe_point` may be filtered out. Therefore, setting a significantly shorter `safe_point` life time in the in-memory engine can markedly enhance read performance. + +Another crucial factor, perhaps even more important for enhancing read performance, is that the first MVCC delete with a `commit_ts` less than `safe_point` can be directly removed. In raftstore, this MVCC delete can only be deleted at the second phase. And it is deleted by RocksDB in the second phase, it is marked as a **tombstone**, meaning it **remains visible** until it is removed in a subsequent bottom-level compaction. **The time gap between it is scheduled to the second phase and physically deleted by some compaction can be quite lengthy**. + +Consider the following scenario: +We have a sequence of keys [k1, k2, ..., k10000, k10001, ...]. +The values of k1 and k10001 are MVCC put, while k2 to k10000 are MVCC delete or RocksDB tombstones with `commit_ts` less than `safe_point`. To read the first two keys, we would need to read through 10001 keys. + +However, with the GC mechanism in the in-memory engine, once they are garbage collected, the sequence becomes [k1, k10001, ...], meaning we only need to read two keys. + +## Ranges to evict/load + +Evict when top N regions changes +1. Add an API to RegionInfoAccessors to find top N regions, based on data in heartbeats and a specified strategy. Initially the strategy is based on query pattern (reads / second over the time window.) This can also be supplemented by looking at the ratio of MVCC versions to real data. +2. Add another tick to RaftStore, timed for TOP_N_REGION_STATS_WINDOW. On each such tick, compare top N regions at the start of the window, with those at the end of the window. +3. Evict the ranges of the regions that are present at the start, but absent at the end (unless those regions are already absent from RegionCacheEngineCore as result of a split.) Load regions that are absent at the start, but present at the end. + +## Load + +Regarding load, we first get the rocksdb snapshot, then load the data of the range in the snapshot into RangeCacheMemoryEngine. + +But at this time, it is very likely that the apply thread is also writing data to the range. In order to ensure the integrity of the data, we need to obtain the snapshot in the apply thread, and at the same time, cache all subsequente writes for this range. + +When all the data in snapshot has been writen into the engine, we consume the cached writes. After all cached writes are consumed, the range can be visible. + +Summarize the process: +1. Acquire a snapshot from apply thread. +2. Then, just in the apply thread, cache all the following write batch for the range. +3. At a background worker, load all data from the snapshot acquired before into RangeCacheMemoryEngine. +4. Once the snapshot loading is finished, consume all cached writes in RangeCacheMemoryEngine of the range and make range visible when the consume finished. + +(Note, all range meta changing are protected by a mutex so as long as the range finishes the snapshot loading and there's no cached writes for the range, it has the complete data view for the range and can provide service for the following requets) + +## Eviction + +When the range is evicted, it is not readalbe in RangeCacheMemoryEngine. However, due to some onging snapshots for the range, we cannot delete the data of the range immeidately. The `RangeManager` is responsible for tracking ongoing snapshots for each range, and when all snapshots of the evicted range are dropped, we can safely delete the data. + +## Ingest SST + +SST ingestions are rare, often happens in data prepare phase and followers applying raft snapshots. So we just evict the range when sst ingestion occurs. + +## Split + +RangeCacheMemoryEngine is ignorance of region split. + +For a read request with given range, it deos not need an exact matched range in the RangeCacheMemoryEngine, but just one that contains the range of the request. So, no matter how many splits happend within a given range, all ranges of the child regions can read data in RangeCacheMemoryEngine. + +## Merge +As merge does not involve hot regions, we can directly evict the range of the region. + +## Memory Control + +As the data delete after range eviction is not immediate, we need two limit for memory control: soft limit, and hard limit. + +When the memory usage reaches to soft limit, we still grant memory acquirement but begin to choose ranges to evict. However, when it reaches to hard limit, we reject the request and evict the range of the request. So, ideally, we maintain the memory usage below the soft limit. + +## Skiplist + +We choose the skiplist as the underlying data storage engine. After some investigations, we choose crossbeam skiplist with some modifications to make it usable in this project as well as some wraps to prodivde sequence number suffix. + +## Correctness + +We should guarantee the data read by RocksDB snapshot is the same with in-memory engine snapshot to ensure correctness. + +In-memory engine provides a snapshot view of the database, which means 1. the data will not be filtered by GC worker if it is visible by the snapshot, and 2. the data will not be removed after eviction until the relevant snapshot is empty. + +For a given range, as the data writen to RocksDB is also written to in-memory engine and the write of in-memory engine and RocksDB is atomic, so the two types of snapshot should have the same dataset if garbage collection is not involved. + +When garbage collection is involved: +- We use RocksDB snapshot if the `read_ts` is less than the `safe_point` of the given range, so no correctness concern in this case. +- When the read_ts is above the `safe_point` of the range: + - For data with commit_ts larger than `safe_point`, they are the same with what in RocksDB, so no correctness concern in this case. + - For data with commit_ts less than or equal to `safe_point` in in-memory engine: + - If the newest version below `safe_point` is `mvcc put`, it will not be filtered out, so in-memory snapshot can read it. All older versions are not supposed to be read at first place. + - If the newest version below `safe_point` is `mvcc delete`, it may be read or not depending on whether the garbage collection worker has already deleted it or not. The delete order described in Garbage collection guarantees no order versions appaer so we can at most read a mvcc delete or nothing which is semantically the same with the current. \ No newline at end of file From e0d5fb77258781a1af60d69bf011cd01ca593ba7 Mon Sep 17 00:00:00 2001 From: SpadeA-Tang Date: Fri, 22 Mar 2024 17:31:24 +0800 Subject: [PATCH 2/3] u Signed-off-by: SpadeA-Tang --- text/0111-in-memory-engine.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/0111-in-memory-engine.md b/text/0111-in-memory-engine.md index 88ed68a4..2cdeb014 100644 --- a/text/0111-in-memory-engine.md +++ b/text/0111-in-memory-engine.md @@ -11,7 +11,7 @@ The current GC mechanism can mitigate this issue, but it's not instant. Figure 1 shows one of the metrics of this type of workload. Read amplification increases as time passed and eventually converged due to GC. -![alt text](../media/in-memory-engine-1.png) +![in-memory-engine-1](../media/in-memory-engine-1.png) *Figure 1: the multiplier between next and processed_keys reflects how many next will be called to read a valid key.* To optimize/enhance this type of workload, we propose an in-memory engine, which offers several benefits: @@ -135,7 +135,7 @@ RocksDB offers a callback mechanism after the write batch has been inserted into In this callback, we can insert the data of the batch into `SkiplistEngine` using the sequence number given back by the callback. However, although the insert of the `SkiplistEngine` has been finished, we cannot read these data until the **sequence number has been published by the RocksDB**. This is guaranteed by that we always acquire a RocksDB snapshot regardless of which snapshots (`RegionCacheMemoryEngine` or `RocksDB`) we may use, and the sequence number in the RocksDB snapshot is used to exclude data that is not visible in the `RegionCacheMemoryEngine`. -![alt text](../media/in-memory-engine-2.png) +![in-memory-engine-2](../media/in-memory-engine-2.png) ## Read flow ``` From 274c54e90fe46dbefbc6556dd71f325cdb19dbdf Mon Sep 17 00:00:00 2001 From: SpadeA-Tang Date: Fri, 22 Mar 2024 17:34:10 +0800 Subject: [PATCH 3/3] u Signed-off-by: SpadeA-Tang --- text/0111-in-memory-engine.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/0111-in-memory-engine.md b/text/0111-in-memory-engine.md index 2cdeb014..4a6df5c2 100644 --- a/text/0111-in-memory-engine.md +++ b/text/0111-in-memory-engine.md @@ -1,6 +1,6 @@ # RFC: In-memory Engine -- RFC PR: +- RFC PR: https://github.com/tikv/rfcs/pull/111 - Tracking Issue: https://github.com/tikv/tikv/issues/16141 ## Motivation