From a7a81ca7492772637c43cb48a92405784872f857 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Wed, 2 Sep 2015 02:41:21 +0200 Subject: [PATCH] Added example: box collisions --- examples/makefile | 5 ++ examples/models_box_collisions.c | 119 +++++++++++++++++++++++++++++ examples/models_box_collisions.png | Bin 0 -> 22077 bytes 3 files changed, 124 insertions(+) create mode 100644 examples/models_box_collisions.c create mode 100644 examples/models_box_collisions.png diff --git a/examples/makefile b/examples/makefile index 15a4bd0a..dac378ce 100644 --- a/examples/makefile +++ b/examples/makefile @@ -179,6 +179,7 @@ EXAMPLES = \ text_format_text \ text_font_select \ models_geometric_shapes \ + models_box_collisions \ models_billboard \ models_obj_loading \ models_heightmap \ @@ -325,6 +326,10 @@ text_font_select: text_font_select.c models_geometric_shapes: models_geometric_shapes.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) +# compile [models] example - box collisions +models_box_collisions: models_box_collisions.c + $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) + # compile [models] example - basic window models_planes: models_planes.c $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -D$(PLATFORM) $(WINFLAGS) diff --git a/examples/models_box_collisions.c b/examples/models_box_collisions.c new file mode 100644 index 00000000..18fca091 --- /dev/null +++ b/examples/models_box_collisions.c @@ -0,0 +1,119 @@ +/******************************************************************************************* +* +* raylib [models] example - Detect basic 3d collisions (box vs sphere vs box) +* +* This example has been created using raylib 1.3 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [models] example - box collisions"); + + // Define the camera to look into our 3d world + Camera camera = {{ 0.0, 10.0, 10.0 }, { 0.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }}; + + Vector3 playerPosition = { 0, 1, 2 }; + Vector3 playerSize = { 1, 2, 1 }; + Color playerColor = GREEN; + + Vector3 enemyBoxPos = { -4, 1, 0 }; + Vector3 enemyBoxSize = { 2, 2, 2 }; + + Vector3 enemySpherePos = { 4, 0, 0 }; + float enemySphereSize = 1.5f; + + bool collision = false; + + SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + + // Move player + if (IsKeyDown(KEY_RIGHT)) playerPosition.x += 0.2f; + else if (IsKeyDown(KEY_LEFT)) playerPosition.x -= 0.2f; + else if (IsKeyDown(KEY_DOWN)) playerPosition.z += 0.2f; + else if (IsKeyDown(KEY_UP)) playerPosition.z -= 0.2f; + + collision = false; + + // Check collisions player vs enemy-box + if (CheckCollisionBoxes((Vector3){ playerPosition.x - playerSize.x/2, + playerPosition.y - playerSize.y/2, + playerPosition.z - playerSize.z/2 }, + (Vector3){ playerPosition.x + playerSize.x/2, + playerPosition.y + playerSize.y/2, + playerPosition.z + playerSize.z/2 }, + (Vector3){ enemyBoxPos.x - enemyBoxSize.x/2, + enemyBoxPos.y - enemyBoxSize.y/2, + enemyBoxPos.z - enemyBoxSize.z/2 }, + (Vector3){ enemyBoxPos.x + enemyBoxSize.x/2, + enemyBoxPos.y + enemyBoxSize.y/2, + enemyBoxPos.z + enemyBoxSize.z/2 })) collision = true; + + // Check collisions player vs enemy-sphere + if (CheckCollisionBoxSphere((Vector3){ playerPosition.x - playerSize.x/2, + playerPosition.y - playerSize.y/2, + playerPosition.z - playerSize.z/2 }, + (Vector3){ playerPosition.x + playerSize.x/2, + playerPosition.y + playerSize.y/2, + playerPosition.z + playerSize.z/2 }, + enemySpherePos, enemySphereSize)) collision = true; + + if (collision) playerColor = RED; + else playerColor = GREEN; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + Begin3dMode(camera); + + // Draw enemy-box + DrawCube(enemyBoxPos, enemyBoxSize.x, enemyBoxSize.y, enemyBoxSize.z, GRAY); + DrawCubeWires(enemyBoxPos, enemyBoxSize.x, enemyBoxSize.y, enemyBoxSize.z, DARKGRAY); + + // Draw enemy-sphere + DrawSphere(enemySpherePos, enemySphereSize, GRAY); + DrawSphereWires(enemySpherePos, enemySphereSize, 16, 16, DARKGRAY); + + // Draw player + DrawCubeV(playerPosition, playerSize, playerColor); + + DrawGrid(10.0, 1.0); // Draw a grid + + End3dMode(); + + DrawText("Move player with cursors to collide", 220, 40, 20, GRAY); + + DrawFPS(10, 10); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/models_box_collisions.png b/examples/models_box_collisions.png new file mode 100644 index 0000000000000000000000000000000000000000..d01fd9dd28b6109f20aea95c72678c727ff45dcc GIT binary patch literal 22077 zcmeIadpwl+|35tAI1a<0WQM^srBrG#&SFqAok)l6U{yoXq^TrS!p=AhHp6t-%1F_a zD3xSwYzHEy!pB6SC?b*4Nv+QJ>$)!5+V8gC?|uKikH>xAkH`MQ9Ikm^ulMWxdcI!o zE5+A`L)4^b;&3?P>{&Aw;&965I2`^8K@C0`v-*@Ahg+gDdxpp2Z7WxQc=x*hC(!~1 zMM*~c&Yy4sK3CyuN)#$cMt}PUAC*|nQx9UE5{t@tgw((J!$^%}u?;Hz{!92lp_WiV zmMCUS{~j5v-$+JJ1*sM#-=(1pqv7m#X+TJ5{0@CU!gGv-#s9C8fHw@hSatE{&l8WW zs!SK&+I8ZPq_aw@Zkx1ttMA>l3MjGP|p6t#4z5)Sj zb>zH2moD_%UqIwOeDQGXEt3(YXIbE>v2pMD5r?W*t~|dDn^9yrkAy zucnp0NHq1S65Ztu={z;D@$b^ze|gsEn$f?@`eKWxTT_(cr=bS5=;1#Z)EZ_12k`*C zW=e(2B@Z417VO(&GuMXl6MdRW=&?*iF=zpurh=HIvl&sCV}?17ZU1C2&dN5@7Vs-L zPn>;RlAA%?PTehI&)U+@*K+=tM0+2qN<2%K94#BOKPJBJe$&e_Q5W>3dh}6edI!dC z6^WO;nERyGtjt|wjiU3&p_U`bzOIdvVs1_{on;kw&FVL~6^AqV8WJ)7M;4V@KOA7n zN#>EcO6@7d_gp+Tyt1@QZ%B4MOTUzGM7nsZzRMz3h(4XUNN~e7u-)s-(6J@WW9<&+ zA2VHAcI4L`a_{5CQz!7Kr}yTL33<3GPq9-|;^brEn|&RoR0$ z%vE@HyM0dIR=Z0uzu0E${L;zwXJyY9vz~phZ)vmj>-F;FGB2m+Ccxg#W9!EJPu8t; zRN>Mup7#+~*y+2r1P5^!ES}f3W0Bg)%N$$F%{11;PrcJ0Oouy2(|keFaEIjon|JVH zsLY~XyJ}|;ccZ^)z~Pfc?N9j#y0o)A2x@tKC|lbCo|%+;mja=CZU6( zFzIbDEf}D9Cw}uw{b7IjkIv|iFKI@=7^PyrMtAArzXZOCx@fktnEAb!iDWD7!`ZZWK?hGqe?Aoh=^49>Ts+tsSu{1mq@ zme}NWe8KO1X0MdVJ+jvgXtK8fOElK}?-XA1Jh|rkmBbcDMpB$Lgw&~(6z^4#++6TP zi93RFaH5V-QU4#_SlD+bWZzi=#bP%^6IiEEj^!Rh7oY)Fkabw0;<_7tYrv4+!?^E7 zKoOD`Jc4#S$!J4DxeSqf_sCCMBbh2jMqH{uA#Rc72cYZZ zC89uuluE=GlZ-U8(ko2YJ*v+#_Fg)ice7qW2A@dw4ubbgL_9XqFpd|_QiXNSOosQ& zA{o^OI5{iZO6Rgb+CwvIucV?i2eKFQ@u;@-tzoK2z@Fa3zwE|IKN=Bh6nwi8|At|f zg30KW>sB*WvO$~Pd$b>A+|eM{`Jq${5`>D3JViJZR$fr&f~DufRzOa(fclrm6)G+i zrDV|f==59>s_{8SnEJx!4J0G#Su=0Vk?ll*k;JhV)uC3Nk143FjD`b&JzUx}TdnuK zJG(N1xdS!)20Gl$L)OPSm2& z7`^!^b-;sc#oXn^Wu#t6FT?B8W#`Og+qb}yKG>4|$)LKex{t@<`8ChdL{=M$Zu2Ja ziYuJ_B1YVgFZcz}gm+X0!X0ZV9<|c1{|GK&d)Z8PR$+5`*O`5kWnEBsqS_)@2|A^{ z9)))sfS0h+9O_xPo?+_!VT3Ukfq@^=b8}Hc48$b81iiyV9X$WNdmgnw_TH3j@R&#F z0BWi~^B!Yh@*GKa!qN!?IF{$(>Lpk4?o-^j5%vM*XdW%OO!M53d@Frmx z?j(%gC+U*_d2v^>DC4-q$W#%%ItVU}AkKY*a?%sKjE-Dpd_|@aJK_x3aGM17qIckZ z?qNQ#9{oX)mtgNlGugTMGL63=mAFxuRx<)Y&G4?$7R=#(jp=q^a?|9@g8*}xB3&>& z>a%*t1@T5XhnQYbR2$qxmA$aJa}brBxf^CnYi1;r_dcm9=e**nhZYz91)|1busk&t zv9J#d-KCsopN*_sQOyu}5>hv^&Ag9;REIF#pOh2>0U$Qj;^i=FvwtF_+JE3IYDX>Z zG>Jm%6RqQ+e#tZ@=xwFI87< zaw4C|DpD*41+BD0H@$AhvLw)&)uA(=@uE`=9bp4Sp4%YS zNeNkJ*#u>$*uqwI1Fu6u^3&ARo_^Q_Kt2#Wb1wxLE6G6T4gNqC8bCw`m4+KDmQ|YB z-@wZ>>O^C=P6_Q3M$8J$NaRnLGD>nQEt1XN0{hhVC!`*Vvy;9PZ6J_Nbg*TIE|9Xr zKdYZTzFS=HoSNGJD($Y)yIpDY#QE|2oM?|W_&=Ox{m`Z)P4#rEt}mhU?m?a1>a8hl zdRGijnE#f3=zycN3o?ROkP3MCJ0eI>5FtJp5#k0y`Ss<4YkcKYrNDi@75*vfbCpXQ z<2K+DB(Am5{*NUtuCjAuWu@S6dJRxD-D^Ju^^?!p{k*nRLucS{u@~+xPB&+bueq6l z%X^_WHR_Q{DLrnzno6)vnQIhBrFDZmignKU>eZ{VYY_;C1!^PCg$BO7(h@N>o^j^h zsTE44_07$Z%tq8hYM&(uvUrJS;ssB}^Vg_aK2(2Mt75<9MMmNVL$x3^+Vqy-*{mqG zLqU4*ZNT0)Viw+1sD*FHyTvQMX`zy*c#A7dJ+R~g z3{{vCn>5Gx$2<2v#GierT;%K@mHhNVhmBU|T~EvVI6%2_j|PlZ zs#+qDDbOSlDVk^k7ZrllnyWuF2li_V_#V&7%lXyg)1KH2`ruEmStzG!`)BDLpoITH z|6MslTz5FTki25IopcAVx(HLs>|v1)cM9>LgzUronb)&*F4e18_i!^~$_=f~I};cm z%_;3uy3_Pdr)ie0=zU}UisM3)kwN|wv1XAb#U7&0+k+(wX7jrQMoT3(^T>5aKno~J zgBtijn^Cu?DAn4@#ZeNYcTbe^*QmX#RjZvBet-33cWz|YW0jnKTJzMP-xYNNs~Soc zkzAJpX)qGKSrEMoHNX`=eV%+>p+(?mK~|i-l2HEUsDKxpt8XiaKUFFG&%8mlo8=nj zJgX8NRr@W4`IWcuo=bP$$Qo)(=fCOY%Xw*#^V|d#HF(E6K{f|(8m7P?75fH-V2T`int9%mq7Dd|`zqYgq zH>wpGbLOuKGJ?dBwGbuMptcYKZmaGcHvROjD#a5Bbg=lK7j8QPSGr4ls>@>@M`=~E zc|T_$)ckJZN!O(OisOd4V@kaeSH{xb>-8)-KpCvp3F9P4?t5fO6vAH=`jELHu?dOd zNoE&*7g`! z#$A-&wi(|VKVZtI8XR~ZntwHSZLtr<$^n!h6l3r;i7r0+mu}vm4#Xz$Z;B=-ijuOi zk~~Ydn~YoNpXk~s@HUI8q&nR^G`U3c9q}SW!_9} zsf|m?d5_P$>=Bq9YId<8lLnSP{ksTtD0$K@B65cwqO#o5d{%a2dLTei}h@G z&$imHT|(@Y4Uqk2R&rh5MHZGmdfr*tK^R{mOgDKiKSwa%9O!IR)e?VFFMa;Bl6u{u zDE~EvMJp28M0Ku#uj&1&eZoHDQ|H*mKZ2`*?E=&_%6goaphd4l(Tf#8MBy$|CAoN& zZ)?gaeA=0LiFS{7xr{ZpjwWvR@7ZwBM)zGaWdfBKX=U1_1kvxdh?|Kz`fyu>Mc>a!u+$@r(ID${r?OqTQ zw6rVaVC55*!%j*1=DKkmjY)Oxy;+1nPl};iRkdbGn&#>HI^K2%>0PLO^s)HH2=Wpf z*mYXbdu$5i1W__e9;Eae2^}tZ@!+3-tfa2W*g03HRNG_Pd_qRj6E%OT2JmKRFfMRR zJN0~1*W<;4T2^zsX-UGBC}ujuu~}Hr*cUrXRNk91b}+?$AxG)j=36{YSTPB1)#b|_JbkG=4%I|n%O`xkL!j-V6=ICfxpVLUF6}(j{&C$8(6>=PZcsj!= zuvR61eD(cas_p^zSrINpnGNkpZKcLf6HibQjKUrAJYiPG~me~6xq&AU^rmL=JK1H2I z2NB=GGj$T<0^<#t3tbN!31HL)&gQZgY{y$SUG6o!vOG&%Cz)TEe|3$iwKyU= zCw}E=Za<@A@|NcjljMD&q#rNQe$SLlXZ%_iihH4W+V}M7nu$}Vnx0C8d>l#}WQa$h z+egBQO@*4z6}*x01Q1utbx(g~LJOs>ig`uhVp_;hx2wLU@e}`D@>A`OqV&Z-nZFk< zyI2+8%<4I^)w8g4``|{2qG&yW*1)3ex^GG5!Nu#D(vhOWF$woFZ1JFt-cnHZZIXqD zb_Y(i4w!$UT^_vq$e8_pfi7-GBTE`wX!1Ad&8uV&Z_WZ&>fI|__mdokBPe%rsEIPD zwY74=x(%>M)3Te0-l~sFxDdvBmCn;UZAavIgqU05AoHJo& zKi1&)zkgn;QMxF8qeVXTvf={*C{4!-0<6o;f`ou>+u30@-SEKqan8Oq_a1DaPH$5& zo<1ShBkfFp?kn~2;(&$Ds^H_Etn6mHoUYfpbl%)Pn)|pg!j;uS&-CJjiduB8@$6u2 zI_BZm#V!NqV^g3=z=m{od*PO@HobT@6$+JGEQ_s?!j{&B3+vP~cDn8KN+T!SB%FSJ z<+$!Dj%KEbTqkJrfh^gLLiUZqT~Gi*UfKA*5E3ZQ7-on%)K&wZjl7RR9NkVRr=06$ zme}a6(B3Y>ck74S$~QyJE;zF&;fx}UKcQqfA-ZR5|I9a9MVA#WQ{_E+T~h;{N1Jc$ zII)M@8EKgj$cwR{@@Y5Y0!V)2~rIa`=_QJ6z}fK+~a=xR@x?#s) z;aVd}-PPNYnhEMf1~Gi?kdrJj>^3Q;-mql5Gj z=&2**Dli-qWx9kWIC+yQ?g0(Rr30ttL&HpfIi)qO@1d(4YFg!G&Uej$l_kdtE{0lf(#}S+jk+!!;$ZNwS}cyR4;G zIbmonGdyD?NG#{x6}U-90Ra<5xG?3zQsSxu%a7XcJsYu1-p7~R*&LV88Q4ZLKHTCw zyQL~wLu;Yh6>dmCr)`vFCy&fr2nd!&GtbX#2?nNkV3|NS31=4+V6@7S+ds~C?)1D} zX~fFf3AZ*bbk;NfwLAPk^3!D`P5QzQ>^Yn@%%$*~P%L$mnnu!CC$Dc{<}(sq$nRCfb|&sEG1yV^ykyp(K}FTV2l`LLvJ{BZ+2B-R0|F!N7?{{-z>h`MFR6gKje zoh$S1s?R+uJo)11Q=O^zCRR5upf%wvjtf)g>(0_CrF-(%rtD5rpE8jALTete>~~i5 zvPa6nrkCn9i&iiqD2~8z<9G|A`BvA4c0qm3!>xf`>zPY|%+O(|%yb_nrvOw= z+JBG)?FYptbLQsZQ{Cd``)up%=StSQ71%1Re^SYlyjMHYg$Hlr-qI$pGD-fyLAnTb z56-XG`U1?@w1{walWr@zg=D2dy*YCradF5_&n-afj*ja)6JAc7XWG2YV#55c$+~iD z-HS9`TeDGqM{6hg>X%hTT1cLjKU_K(MOaQPGYz}4o@oZr-WS{c=n3LGgq@nZ|kjY)+iq%XmO@hwP@KItdf~zQo?`hczi(6M9UOEu?QRN z&{U3&y}HKT?Hv1=64|Pd?Kv`AwiwYjLGlX1C1@m%6~VoY@B+}UKG z+3Io2cBCvwvZ@X3i;oz`*#f8#h{mWr!A)A76ag5@ScOFtGV>D$P_UYtip02Nh~2u` zPLSWHETJ-XaG9rlG){S?wUE`L2Uxnc{?uvy4;be>HVQixu4r*3zyQt=qc=2$?=Ky^ zn^z!JF@|cq8m*fpH|#yLvnfGD(SQWN|Y>~UvW3-ji=tuW2|HRos&GO8)j_8u;^uKHUBwMFC zpTMxSHK4l5#cLP7vMSw9J=~RSZLpsbMtR%xT)BwcQtLH_UZtL>3kG$kVw-ObFBo#T z5X?lUi<3#XEJIu8>oY#)SsY(zRxrB1*K%3>nTe2tXl*@M?o)onUdwZ5QJU|{3BL*F z|Lhj_l(n%}mNapE@RiyliDV?IR=0*C?XhLDbPc-pTnOZJ9KxmgsFxA@@( znR1ZqSo^GD$7g0uWASIYNXLD#^aNa<;^$MV1t$x^xN= zo+>)6Te@0!=4|TRG+)Ws%=7}o=KL$orDJbT4SF@ZFPgiBPIKtkQ`0jc%*9KV0euD0 zaNKy7tbuQUpk3G7B;MF9QnI#)-lT#9Hp{&6C%;Ox#*uLM&>rxwhc`1!$OxxgPv zo=a(}MgP&TYYKSNp=lMq<9UXsi>!;80SQ~Do3sN> zsYE{#xRY;7jJt-ePhY66M~Da~L{O47b_Cv77fsdSXPF-`N@X|Cmrt4F>>!V=?wQ){ zQ_mZK1aBAABRgQ0_FXcdO?AD>W7=h7NNI-lpu7z5BQLc36C{tFC2rl-wk6fCSy!Ek z?s7K@QUdl=KJp24HcN0`+2TCCH&TE7e|T<4-;spoSK+P?Jh_Y?cFV3o8I4M6A`$OT zTYL%(WnrFWwk& z4B2xD+RY!$;@=YPDY}H$=1Pkl2ln}8BuF=UZ5({?;~lS^+G%I@uui2BEC+Jg$CXQ8 zdCZwW2y(E0EvM@Ehj1guZuMoKJPHEPz)i0grP* zx-{8l!z~=hW4T0bAmvJL7U{tKT`u&(YU?7Cu;sH)g&Ab-P&^gBP_%QNI?|8567n6w zwguY8A1L%pcbB|HtP`?x%xxlbpCBkll~6lAS1o-d%TX!^SSXSvXloeXq({p=D=tv8 zcM-IavrFa|)~PgsFK4aNWyY)@w13AU3nNk^; zMqUD%f}Be0g;w6?BQb-zJ?kA4U7=EDqQ^gtpc3!+Cu2NU}@saY1kGw3VpQ(5+hC(4- zZzBFg0**gw6Vnm3YZ$g|37#Nv(HNpso8Q*oUGtD05-}rh`p)<|*J!Gt|0nu*e^$uZ z)}3uH$_-aCwug1W+$NGA02%<~mQh~-#Mj$suaUZuWo8uw!YH8$Vl8Q98|3u&=dZhX zDiac%2}i>td7~-jmuc^Hdp7w~l_59|FiBl2`H`g6YGKED(6B5%YBU>D^JjGE{Ahht z%){`2CV*drqq@^n%1r&UNDI~0CHFnaPO>YFXPtL8*;_r{38=K4n&9lja8K1q5byK& zQr0k41VG$SqXjt?(UglooEr^CnMGsn6b|U~&l$GVmN%cbs9q}XSu}Z+FBV&m#yX8Tc&;m*Jt%9Ml$`iQ|yZ-~Um!kEQ-LfO(5#rj#w>Z`w3%nervQ z?JaVbOD}aU(mi?m;tp<$E7dD~a%?GC``n&|??d})mL4{Lzk?YA$r(};BT1kc5!N?f zdQT>_8O8v;tW_i~rY)2qhPz&)hR3F(T_KAX{oaV%;vhd&+$-tmH{tHw68=X=f17Zy z%f@VlS+YAchW+Xh%wYv|hTfn}ddXy|LXZRa6q2q2vJcI;a(h`kpZzQ-d;ccJ_P`Y> z8#G2+MH7nDMT$E0w|LR)UyWDQ;9LFqoe9t!x@}2;$lvo0+DYJPk;d0>FQ57I%WhVP zESQN$gRidxWNHoaw|b?@_;Y%zVz1t6U=Nu1+VH&6R{CcdL{kajmjnCD%`K9i z={``|{FarjC5f7Ih0i>L#0dcOff0V_^hWk<0;*4i5O=tqxEOQQi+hCk^m2k4aP0-c zpSKL^sDve{lzItID#zEg4>_B*I9tjC zb@zMaI2m0u z3mn?&#Dq)%Zm?L@!&^4q3)gO6bSWZ5bCWszuD4%~cd;UL;KcL43;+uDE~2-;1eWxk+R~Zs;26oj%taH+LYp1*82~T zL~oTd{leXM>#t65w(9+a%Qu_8FS>X!_)Ab(q#cTksw3_4^Jd>`R$1;7C{i~8A`32yD>@WV!-^o zEy6a&ai;u51ce(cyUUsPNPW3(S(N_(=h+2XzwwGFJHHEXDj^ud`$uCVEWf+w?a^je zZthO#@}1}?x>7VI>UX_nqw11*gi*({MYiw4#x*=lNU&c(|Brr$O{R36Xz%z%Rd=+u zI9O+m>ekVj(pK0SZ(;~=lMx$~vK-JbI8$Xkl3SykBxvFR-?lf1tGg>FhVrvCf~@%f zRi3jv${g_6Sh;3Qeox2Fm4mHX(IJXTwf(CC228U)8d>?lzIR~VrD|m0rS6d|1FQ6p zLN0Bf6vFByD|9S69@)c@w^G^m>HNua!~>3u`mM{{ib74{K<2Iwrj!+alyWQS=#(q+L~(R zX{=j0Qng_7YAjxI)nK-{2(2M}5Q`na%p4X_NEuE)WDNB z+b}HNq{`w~dYo0k<~l+4Ruy@MrN@9tc7M&S7ZrwTL&5Ic9(|Wr)-btKTuUb6)kKJg zoP?P(T4#d;F;(h?7LKi9cC}r}oX3{<(F@#yUNwA7 zY1>XK0ch;nuv0{HULtT&4szZniqd0J_Q_gf7@~46S&!pR)hbnpO*i(QQegMaQR1Up>)!iD&=fbYgk1LnX1g$60kzq!)D{>U zNlml(1XGBsRMTxjFaKt``<_Z^3^VbjyGkKdvGddx;mI7GFza`GywfGtrYH2woqW?W zm%_fvHSRB`Xt+7VJt=R_KXMf11aoWpAS$OG1ZW`Qe+K#6I!KdYM?(p?(;1|O0wsPV z{>ONei?+D+=PNx$Ek3HVreAuvbZ-K)==YSf%G)DVs!iL2+z@z6@Dh_bGM8Beo~O{v z`w&V!l321MA(|_{)F0R4MhaZ(R9I&!v6<^};=ae53ZEyQD@8M(@YT!iN?a^u)O5uK zmEZlo5rOVeC!aW<-VQwdWWU(~spZ^g~ZQuWxXe5qB3 z|0esrM$a^o_s;qn1SmFf{7SKh>n~Jjp(0$t3u1qAM?YV3Q?DYJcG^e%QijF>C;2&> z!VHQ(l@j#p`Cty~f$W^Aj0_kGZ+IHxF9UZhh6+o(x#5ZRELwpg?cTN|t5T(WT7;VN zVP%PnHsk%-eD(bJ{HwP!Dvql)uOmYe5d1Tw4=YBHB^;8xXbN+RK7=%7HF^I+w{zvp zuL$HC)y*xwHn(@~xk9@k#oDRdsX4)qRQ5k(oii_tF|Vqx)vhY2>D}F-ux~-SU2tMJ z9IFh5vmRhp7{Pp6-4%yd9`kAvc0*$-ODp`<*@#s3T30kqHVh8{{$(~w@Px#AmMqX7 z+hkdOyOT9wLTa@3Sam3|Kt0%yW+%%^N3CxVOSgVDUI3Z@sMX906dMFf-QbBU)l0wN zs&(6DN}#{6ZI_3G`u1kkV8gIS%8{F{Rizk^8y>1Rx}_@`3)x$`5!#X598EOMT~ye& zr>0vV^K9E`ta+1&(aC9J0HB1^~Zielkob-oQ6K5ELCz{##g!bNE|}+1LjEu zXS@V$P8D`Lg-;q3WU(RvCT6^Bv8)Z|P}Pi87{=6wvYY38H^(XKC@(MX62)Yw!TmpNW$762( zb8qEv6Ed_Iz{OW!X4?dAYZsvh0ADQxsE`*p-pY9lBS+d2hQpwHe+O&qK(< z=ECataq0%Zfle`vJ<3G2|jM=+fA zWx!2`quIBw@FNcdAf6-{h0q6Owwf|>=rHxY#!6lrs)NHt>zGN}H5mEGWZm~x!rkC4 z`;*by&qza)w(Wgv`sDHBz=@M58+#+;X%P%e3u78*^FJ4YS6{^ax0E443`u?AKQb&me-Fj`tEG@`_6)ZlJouAuh;hT%aJU-)ILN5?K8TU^@Y{eRF@ki_3tow-4!mnQ8Z#vg z-YtiN$I8R;#o-J0zS%xFbT~>0TeK)aPA$;ei_m?t9RNLk<{0AFrwY(S;V*x_=oaL6 zUu^f=SHlmR=m2Aa-py8yH5U%z0 z5!Vm^NHWaCzy8T|cm*@B(#;fa_-sjo3GI?||t_O|4v>Loc=OXW7&9$jCdCl8sM!1V*a8`B%^CfP88Cok-+B0q!Fv z)jKHj3!%A{cZYWcwHb2eWR75-l zs5zbzJDU#&%+I|Fh3Kee@i8z0-raz7I(t5*mv_FyY0(!?EkdSfH>O)Of4LjTtsIui z$W$!09%;p(K8FEYIp-jqh;C&f=n>FKL5~ZSk46FPVo**d{8aRT_Y(aa_L+lxbzCtD zB4hFJ6tS^BD73`PJMU}B!4M_e#YdLEdLlMbadE`$|Cb$nIriU>RPGC9PJ~0uo@RKa zgJCcd@2KNV;e*CM;Ddb=z!dIc)?WDa_P%ym|8unzK&XH-BhKIa`T?Zzw(oc$WKFDG z^#SWugYAK4Eg9KfF(k}1cWE4a6$xKKs9J%3^&CiZ6kDL@C-5O4Pp?>}H){-EYJqP^O`ViI6(;qo+O)j?;T+m;?-cZ zA~o_5dy#?*Y6hYE&d5~Fe-R@bF+x1B!QE^~ja}bcKYk;eJxA8*=9jz+a3Rg z-gA#r83SWT$nX`)*qPt;L0^>Xd#plzv>JOQ^cdaDykCDq^hfBbrn*T_r~ysLK*u#O zL>SkHjqDjoS0D@;ZKz7meGXs28c6Jb;o?+86&0f^X9R?3UE_xvDtjmgSw5nhs`%_8JMO${L=qOM! zYQiS)?$YQH?F&N44Pjn|S<;7?Ma)zNu@i?BD&J&ZgGl1m#0xRj#;!{Gn%&<7y>A_U z9vm|hq>3QJ{yI;^#lRUe0~;_3Xj9Y5Z775ALXwr9yk88rNd3`2!?kkcJpPlU+koR@6b^kg3E4vOWMnk<+8VtP?q4RrdEd25@-rPpN8O zf<a==PLEb$+xiujCxA+=mT>l9)feIz zS93Xyh^H>V7`aUf-c7cZDg1^94e+!24qnJH4(e_iTfb)C*HnK=381uvjJN)Q_Mve$ zlrgeaI9|bkFjp1z{OHe$^G4{YfZ@DXvkruN)=_%?Yi;88f_Za7n73{sl?dn^vNa@! zR^#k>i{70JduBi5QJ`+!HC%PUUbn$o(3{83IiU;A0@~A>cv0ZFuV4x_o(Ug`-t(@E zL=;r*a^O%8HDA#*_Xfs^Ghh3xZ{qbxf%6TEzTpU(gf>7^9>H16;wKZ+s%v=pvv!h< zrrwyx{%C#vWepr(+6RX<1@71bfJQpkUo#U;Y`@~@-$h;IGqfD$A(OWmioIZM!+r#O z3)me@AT9z(7&-d~uuT(WSATx}^{X#l2ew@e?K86*yqDOS+z@#8xrzs8P0_>6$Uw5s zui&Adq*3IUEB7O7oW4jfO z*}q{ zrx3E9V>i`Av7N8QHA3Dx(`)QIoV7%@ZPgd4;p||*v92ezexA682-b?EPFCL) z@PBKWScDhBVL>>~ckl(1G7Zk}`HA$A#!-;k+7PmMzhWENsz$U4i}C~i&y@{mF@m1i zyPudBAUSL!;jCVhi5LH}-mcL~+2g}xo54c5vGnEXf6=s&Ittm`ey;fYkNg`6$s?To zE4PPFqn-E@WcbFiVcG+mgg~CS^o_i~y!~1k!AJcaJ^