From e218b8dc97de3153e91407d3fb85fd91742788dd Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 28 Jul 2022 19:52:32 -0500 Subject: [PATCH] Reserving bonk drop slot for Murahdahla tree --- Regions.py | 52 +++++++++++++++++++++--------------------- Rom.py | 2 +- asm/owrando.asm | 45 ++++++++++++++++++++++++++++++++++-- data/base2current.bps | Bin 104324 -> 104324 bytes 4 files changed, 70 insertions(+), 29 deletions(-) diff --git a/Regions.py b/Regions.py index 9e6f18ac..435f7622 100644 --- a/Regions.py +++ b/Regions.py @@ -1284,32 +1284,32 @@ bonk_prize_table = { 'Kakariko Welcome Tree': (0x0d, 0x08, False, '', 'Kakariko Area', 'in a tree'), 'Forgotten Forest Southwest Tree': (0x0e, 0x10, False, '', 'Forgotten Forest Area', 'in a tree'), 'Forgotten Forest Central Tree': (0x0f, 0x08, False, '', 'Forgotten Forest Area', 'in a tree'), - #'Forgotten Forest Southeast Tree': (0x??, 0x04, False, '', 'Forgotten Forest Area', 'in a tree'), - 'Hyrule Castle Tree': (0x10, 0x10, False, '', 'Hyrule Castle Courtyard', 'in a tree'), - 'Wooden Bridge Tree': (0x11, 0x10, False, '', 'Wooden Bridge Area', 'in a tree'), - 'Eastern Palace Tree': (0x12, 0x10, True, '', 'Eastern Palace Area', 'in a tree'), - 'Flute Boy South Tree': (0x13, 0x10, True, '', 'Flute Boy Area', 'in a tree'), - 'Flute Boy East Tree': (0x14, 0x08, True, '', 'Flute Boy Area', 'in a tree'), - 'Central Bonk Rocks Tree': (0x15, 0x10, False, '', 'Central Bonk Rocks Area', 'in a tree'), - 'Tree Line Tree 2': (0x16, 0x10, True, '', 'Tree Line Area', 'in a tree'), - 'Tree Line Tree 4': (0x17, 0x08, True, '', 'Tree Line Area', 'in a tree'), - 'Flute Boy Approach South Tree': (0x18, 0x10, False, '', 'Flute Boy Approach Area', 'in a tree'), - 'Flute Boy Approach North Tree': (0x19, 0x08, False, '', 'Flute Boy Approach Area', 'in a tree'), - 'Dark Lumberjack Tree': (0x1a, 0x10, False, '', 'Dark Lumberjack Area', 'in a tree'), - 'Dark Fortune Bonk Rocks (Drop 1)': (0x1b, 0x10, False, '', 'Dark Fortune Area', 'encased in stone'), - 'Dark Fortune Bonk Rocks (Drop 2)': (0x1c, 0x08, False, '', 'Dark Fortune Area', 'encased in stone'), - 'Dark Graveyard West Bonk Rocks': (0x1d, 0x10, False, '', 'Dark Graveyard Area', 'encased in stone'), - 'Dark Graveyard North Bonk Rocks': (0x1e, 0x08, False, '', 'Dark Graveyard North', 'encased in stone'), - 'Dark Graveyard Tomb Bonk Rocks': (0x1f, 0x04, False, '', 'Dark Graveyard North', 'encased in stone'), - 'Qirn Jump West Tree': (0x20, 0x10, False, '', 'Qirn Jump Area', 'in a tree'), - 'Qirn Jump East Tree': (0x21, 0x08, False, '', 'Qirn Jump East Bank', 'in a tree'), - 'Dark Witch Tree': (0x22, 0x10, False, '', 'Dark Witch Area', 'in a tree'), - 'Pyramid Tree': (0x23, 0x10, False, '', 'Pyramid Area', 'in a tree'), - 'Palace of Darkness Tree': (0x24, 0x10, False, '', 'Palace of Darkness Area', 'in a tree'), - 'Dark Tree Line Tree 2': (0x25, 0x10, False, '', 'Dark Tree Line Area', 'in a tree'), - 'Dark Tree Line Tree 3': (0x26, 0x08, False, '', 'Dark Tree Line Area', 'in a tree'), - 'Dark Tree Line Tree 4': (0x27, 0x04, False, '', 'Dark Tree Line Area', 'in a tree'), - 'Hype Cave Statue': (0x28, 0x10, False, '', 'Hype Cave Area', 'encased in stone') + #'Forgotten Forest Southeast Tree': (0x10, 0x04, False, '', 'Forgotten Forest Area', 'in a tree'), + 'Hyrule Castle Tree': (0x11, 0x10, False, '', 'Hyrule Castle Courtyard', 'in a tree'), + 'Wooden Bridge Tree': (0x12, 0x10, False, '', 'Wooden Bridge Area', 'in a tree'), + 'Eastern Palace Tree': (0x13, 0x10, True, '', 'Eastern Palace Area', 'in a tree'), + 'Flute Boy South Tree': (0x14, 0x10, True, '', 'Flute Boy Area', 'in a tree'), + 'Flute Boy East Tree': (0x15, 0x08, True, '', 'Flute Boy Area', 'in a tree'), + 'Central Bonk Rocks Tree': (0x16, 0x10, False, '', 'Central Bonk Rocks Area', 'in a tree'), + 'Tree Line Tree 2': (0x17, 0x10, True, '', 'Tree Line Area', 'in a tree'), + 'Tree Line Tree 4': (0x18, 0x08, True, '', 'Tree Line Area', 'in a tree'), + 'Flute Boy Approach South Tree': (0x19, 0x10, False, '', 'Flute Boy Approach Area', 'in a tree'), + 'Flute Boy Approach North Tree': (0x1a, 0x08, False, '', 'Flute Boy Approach Area', 'in a tree'), + 'Dark Lumberjack Tree': (0x1b, 0x10, False, '', 'Dark Lumberjack Area', 'in a tree'), + 'Dark Fortune Bonk Rocks (Drop 1)': (0x1c, 0x10, False, '', 'Dark Fortune Area', 'encased in stone'), + 'Dark Fortune Bonk Rocks (Drop 2)': (0x1d, 0x08, False, '', 'Dark Fortune Area', 'encased in stone'), + 'Dark Graveyard West Bonk Rocks': (0x1e, 0x10, False, '', 'Dark Graveyard Area', 'encased in stone'), + 'Dark Graveyard North Bonk Rocks': (0x1f, 0x08, False, '', 'Dark Graveyard North', 'encased in stone'), + 'Dark Graveyard Tomb Bonk Rocks': (0x20, 0x04, False, '', 'Dark Graveyard North', 'encased in stone'), + 'Qirn Jump West Tree': (0x21, 0x10, False, '', 'Qirn Jump Area', 'in a tree'), + 'Qirn Jump East Tree': (0x22, 0x08, False, '', 'Qirn Jump East Bank', 'in a tree'), + 'Dark Witch Tree': (0x23, 0x10, False, '', 'Dark Witch Area', 'in a tree'), + 'Pyramid Tree': (0x24, 0x10, False, '', 'Pyramid Area', 'in a tree'), + 'Palace of Darkness Tree': (0x25, 0x10, False, '', 'Palace of Darkness Area', 'in a tree'), + 'Dark Tree Line Tree 2': (0x26, 0x10, False, '', 'Dark Tree Line Area', 'in a tree'), + 'Dark Tree Line Tree 3': (0x27, 0x08, False, '', 'Dark Tree Line Area', 'in a tree'), + 'Dark Tree Line Tree 4': (0x28, 0x04, False, '', 'Dark Tree Line Area', 'in a tree'), + 'Hype Cave Statue': (0x29, 0x10, False, '', 'Hype Cave Area', 'encased in stone') } bonk_table_by_location_id = {0x153B00+(data[0]*6)+3: name for name, data in bonk_prize_table.items()} diff --git a/Rom.py b/Rom.py index 37962bc7..68768420 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'c80605a079983f1a9dac37273e2b377a' +RANDOMIZERBASEHASH = '61e3137ae471ed8772deb7f84cc85fb9' class JsonRom(object): diff --git a/asm/owrando.asm b/asm/owrando.asm index b1c1ebdf..07ab9f55 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -385,7 +385,7 @@ OWBonkDrops: ; loop thru rando bonk table to find match PHB : PHK : PLB LDA.b $8A - LDX.b #(40*6) ; 40 bonk items, 6 bytes each + LDX.b #(41*6) ; 41 bonk items, 6 bytes each - CMP.w OWBonkPrizeData,X : BNE + INX LDA.w $0D10,Y : LSR A : LSR A : LSR A : LSR A @@ -1311,6 +1311,47 @@ db 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0 +;================================================================================ +; Bonk Prize Data ($AABB00 - $AABBFB) +;-------------------------------------------------------------------------------- +; This table stores data relating to bonk locations for Bonk Drop Shuffle +; +; Example: We can use OWBonkPrizeTable[$09].loot to read what item is in the +; east tree on the Sanctuary screen +;-------------------------------------------------------------------------------- +; Search Criteria - The following two fields are used as a unique index +; .owid = OW screen ID +; .yx = Y & X coordinate data *see below* +; +; .flag = OW event flag bitmask +; .loot = Loot ID +; .mw_player = Multiworld player ID +; .vert_offset = Vertical offset, # of pixels the sprite moves up when activated +; +; .yx field is a combination of both the least significant digits of the Y and X +; coordinates of the static location of the sprite located in a bonk location. +; All sprites, when initialized, are aligned by a 16 pixel increment. +; The coordinate system in LTTP is handled by two bytes: +; (high) (low) +; - - - w w w w s s s s s s s s s +; w = world absolute coords, every screen is $200 pixels in each dimension +; s = local screen coords, coords relative to the bounds of the current screen +; Because of the 16 pixel alignment of sprites, the last four bits of the coords +; are unset. This leaves 5 bits remaining, we simply disregard the highest bit +; and then combine the Y and X coords together to be used as search criteria. +; This does open the possibility of a false positive match from 3 other coords +; on the same screen (15 on megatile screens) but there are no bonk sprites that +; have collision in this regard. +;-------------------------------------------------------------------------------- +struct OWBonkPrizeTable $AABB00 + .owid: skip 1 + .yx: skip 1 + .flag: skip 1 + .loot: skip 1 + .mw_player: skip 1 + .vert_offset: skip 1 +endstruct align 6 + org $aabb00 ;PC 153b00 OWBonkPrizeData: ; OWID YX Flag Item MW Offset @@ -1330,7 +1371,7 @@ db $18, $a8, $10, $b2, $00, $20 db $18, $36, $08, $35, $00, $20 db $1a, $8a, $10, $42, $00, $20 db $1a, $1d, $08, $b2, $00, $20 -;db $1a, $77, $04, $35, $00, $20 ; pre aga ONLY ; hijacked murahdahla bonk tree +db $ff, $77, $04, $35, $00, $20 ; pre aga ONLY ; hijacked murahdahla bonk tree db $1b, $46, $10, $b1, $00, $10 db $1d, $6b, $10, $b1, $00, $20 db $1e, $72, $10, $b2, $00, $20 diff --git a/data/base2current.bps b/data/base2current.bps index d51dc56eb7dc07a6d5483caeaf7dc404c89f27ce..c56129a9f3e943873ee428c38f821efcc1c2366b 100644 GIT binary patch delta 9079 zcmX9@30MXu68b^>t5D?r@EGP(SRKThTs3=&2aY4maQIk87paF&<+=c-o zWDqDuq=TYGs}$T?qZMQA;x1yfNVQ^JYOSsR<@@tInfIN$FXx-D&cKG|84VHPK}JS6p>U*zc3uHQBq5RHu>On=eEX zwiW^)2)**tc(fX90~zQZnC+Ng=2D@SRNmtT?VzR@O(e$n30t|r!EKb5oN`|QP81do{^iq@#j-y!?8v%{JvX~Ll_!XB?QY~Fb1yh=F+NL}E=BM9vqG)p7 zF)pA=N7g;#pnc-!I?^AFvW$*hdmj%=wij&)Dhp8S$eqKlJ7MdLk!512Bc;QG-WR;~lcBv_1|Ii~ ze(tG;e8zcFopaRZHBX;%@q2XSqE^l%d8#>mhpP?;bXR+=z}{F{>tt^nRV%SKx>UQ2 zRY{9=Wc)cUXL$X{Z|}0Xv{_3A+~sm&40JZ0LZqsWe1C`=B60@9)MIE;_JE6l>cY#Y zFHxl-OE0qVlPL>e{IPhICLM8BUgG>)oKKyO{2HCL3ZF8nm6PFF&hN$@ z72x3}wQ@}w>&x7)G?{ssli)>jZRNts)TEsuUR<$FLpPU(#5dKEUMN@`r+nPU!NDe~EQ8WqY2`#Jb;w@@pVyLd&7r};cIj?Sw%tPn%wmqZwbvNendEdzF(_YgS(63RP7r zT&tuMC5$Pd(68dj($L#nsy!C9mM;$uhF!)B{(xJDhyC=y@Fv8SHl?sS^8MbX!9k}A zEK;RSue9X5er_;+kCqG{#zR_iEv{M!HSf(xW*rUYqW#v1q~%)wD5l8`DA^_h z%txHfC_fepK~CA+*6(aIqTO1OIdX9D1Wj^B4i@aANh@^UCf0f#9?-Db96+S)XmQeC zTo|Pz%g{XA@QHXlK)5^4v9UP*7nc1wU|7ai?VQ zTY1gqy7#_h z)*2||vgXiO<(q<-4W41 z+u`h4KPKplr(BL_spg59^W4KoUuKkP9$`y)kIojrP9ICCIcw%_=$8}dm+7Q(^wq|Q z&$yX8brd{75~fSy~Y!qqNy(yvf*7*!FSlniu!E0=$6P zSR2u1pFelvy?-!l)e7(~^{|tv0$8=dQs z$tbk#BY9w`nG1lFIkU$8j0g41RO;Rf0$;X zzG6q34>Pe_VIGC*6V<3}+5g0~NYoa%UKu3%&*!`D{Do%c!W0tcvo(xD{h? zOO%G1@la8GYKOY^M3X60U{2-p_EJ08d6Z5pFkA5y9}cNG4^wwjHs@5-Sf-uY!$w1D z+$kZXXx5IR5Hh9(Th!vl4Cv>yV9<;{q>Y^2iraK{8csUlv`-1%1H(qb@xe5U;7JT06RfjA7mQg7!ItaBVKR+i z%3F%+PsU&#Oz^Q7MiC}=zV~E2ruGCs3xg$L^5pAJN-_Nt@aY(S2PQAvb_S-u0DgHc zMl)cy*X!0|b{^oy3otn`Og_crFks5@q|@*eIKVun$j0S$x}7+q9IzvGM^u>fHz~H1Z-N3?q|%l3UG&# z+9P)`Un$@h0hzryd{ z0@k})_YUPR_9u2$pwh)(O7l-qk^0bb%JreDQ=!uwmF589`& zQI+&)V4kSAM3fUQn7_Z_AfNd#62_bST4L%b=Z6unbB7)kFInj0(k6pWH{$yCjEV`y zl}00D#%!g-NT@H@Ea7GBA$59tV=?Y7q|qCXWCmzLZWJ@G z@%BgHX01@{NZ2`E%~ohWn7tbp_(Rrd1Z+&)Q?{2jy*JyTXn$z<*bi#nntfX%u&P@j z8&9a8UrdQnFf>?caO>8M#q<(hE?{S)qNV9df&BD0idi?$%4c2s#|E-VWBWc7h4ux( zOWKs-1$wz91X3dmDw8eG!bmdx2qz6VDs?_;T5k62bnu3)%W2IDyj+1nkQU-BglC7% zl1lGI)21A=d!v02)Wq?+me3$bt~3_ zs-vV!8*3GE3*{}n%~+vJnSl;Vc#a9}Q843s6f!a${hK*jM0a2kkR?qUxA=F;4yn*b zlBZf|VcE5wwOob@XF_D12>1Ey zW!B9^|14vGBPv_&Lu^Y%#^n(p0o`1_031UhDWkTV84hwM)u>okrDuKm`7|Kz1&V4%-SQ284&H#-T20*#Krv}go_SBf}MJ+h!q zCmyoKWtrV-%Mq*}q<@vpK|ihV#~r<1F?weB`WyQ;?>M|3c7OCWS2yU=y%0mFYxf!q zYhAl{U^wL3%?#(cb~g^^xpj9A=ec!X9?o;?zK^nUCgE*IIUB=2T5ZydjS53V)6ukI zb=0_yj0BURfz|Ho*VnV!2pBZe#AnVlRg9q`peu@4x!BKhtmztras3ir4I@pkJ(@?U zO0z4kW)86n2-LW8(&V*WraVEVP-^Nj*$iXwHzqKQd%nrDVHIH}dnlg#WI*`X2EJ6= z^?WefaF)#up4)?v%c?*J*KR#c2@EQIkjGmz9wn_BPb`^FW0W)4@fZw!z4_l0R%~}ZV@t8WU`i?{KCDdZ<73AtwR3^qewnY=f2vG=9kdut%ba?tu6c?Mj`ag-OBSf2&K}l{$OO@xM&J{)`5G zZLi(zE6W2zHyWL>G?-H|j!5 zITh97sai;lP}O^0|OM z8m6rJZb(=J$4@BIZ<_w-LYTzrqU4kB$j7@aD}|Dvi;}x+SlXipZf&;+vt#p{5IAJr z>}0ZQ7fQm>j5P})mwso6h*uk?r>pf>DCd3YGwbLN3saTsJiBLSZef`zoipc9_o`GS zQ`4g;Z7JA-&a9aPR-wPwr1^z}Uv5ju9G0&Tp&-`gAe&=-nX+Uj`M!6DCtHzB7DyDu zAx4%zA}jr&&O%ao5sDDeg%$@t)B&?lQi&Y%gX}6V7QJiDX%s!tNSo1&{B+`X6ROVl zABN8SkVx|-BXKK*m!~QZ$s~I&A&-+uFa(;d`s{{;lINz21NfKIX*y*(XS!;-Zn}+} z*3Q6JuZ3%az(;7u+L5mQW6G;Oa#6cOEX=Jr+b`|7q(m)iqr3u?kI_iT1VgH|G4obK zbCqW>vRd^o=bImE&?Q-IkglM5ibI!fj4 zV3bWScR^Gs9DuL8ZF@O(=EryPsZtx8L)~`096gZQ?SOjL#rV9r-1amTr*;X_CO;C_ z3DW4k)Gi|Jkxd;t9yzTKaR2i%bG$4UYM#Hk%&dZ4-&$guQHW-*4@vRu9S&7E_2NM^ zt~g#cK&7CVUycAK8gFP!s*;@C%YES@yidz&p~DaB{qI&y4=p>QtSxYqr-;cjyON=-PbsN^#54nHGQb(y@mvA0CAQH zw4|q^n1UFOe21$i6Ykr4%6S~KvX(IT*{EV^6HvzB6(*rI~8>ZONTYT^)lQHjl7>bVFZld?@IVU@JBWjo&<3+4xh> zR5RlM(aN~T4;p`JdqSAN&<^ogNn3@;+dv5#Rg}B_8s&lg=3r+n1X|ofV!w4@g(}$s;s~?_6nyq@qBL#efZ9>m0g_i+8`s~fN!@fg^2&;4)a@`_z zT7OeQ-IPAM(Su`o2MEb}v~f$MvIbS?+|1UJu{ZSeqDx28zxoS_r$haOL`1e zR6{K8Y8vjU3gr~KN8UrFR7xYFW+UHXww9X1Ki18~{oCBsFe;ECcsO9N*S^VwGKNiUAbn?=}VGgS)ALZh;N zalq#XYSo{7r=O1exA}r16t``xOL7?OTvy#t%h?aRuFP^|gNn8VEAz2;J;D$mpm3a^ zkDa;;s-dHPodY~>)rCtwKFZ0Bg1R1iy(^ZjWJo2lg$jtGXTX-wc<2wk6JSfwDTBRA zn{^ipyZ*MW2-`l+zHwWZKlDm~>VqlhITO{c1Iz;K#_FRZ2B{RbP&}xUk=w9&M8T3D zkK7-Y{Sc=iDeo{IHjj8v@Ym?W1DC-F~l?8y)BfAZPuY ze%}P!-V2AU$hrUeN+;cK%M#)+GFFKDnPPnG_eVB+4+*6)sD8V|X7YXRw|ToXv@#Z5 z+`i3v+Vne*&OPwWPDQheB0caVQ&5T4foyK&(6a`to6wFFBBsdKEqonB8=~O1ixMeK zcYoh=zccDzQBRQ@F)suCTqMn(mHh~P6a>$h#6#ll_uqnS-)0LrxvQ1a+uo(z@u`r> z)?vMHIhevPZ%L^+l3iD8#sBb+1+xRsP`^<*pm8+XR4bPi*GA$9ex2E&ntZ;Cl6OfQ zOnb2mIrW=Fl^|9waYAJ~)`2nT?T%f<>qF?Xos&QT;&&$C&m}K*&T!B9mAfJony2Zb zCcV|h7{w{AY{3MSva11yAP0BFg0U!25eH_XT*X41(y0i=DgBD)pbq_@%<`PQf$AC( znTU34nbD2|*(3WcWRsxO10})Pz!fntn)v4#Iu8^5vKK=wc8ASQ_37bH+#w-opCdW_ zhunl^GC^`0jiLOoQ7v>$%zV^QAj>0mi(+&wPBaqWjADK_{w z`61X1WO;y{u^v%EHYfp6Df)@iK4|lVo~wxt4_L?LkgKYSeTiLB$iLX#!e-nJ^?o#^ zc#ZPOOL?9u3)}_DEZ%u!L3Nh}&xD%tr!Z%2?@QvOcqa8+f zjBXfxG5TN(#2A1v9Ag;92^eD*zF|iZx9gm+@I86S53%C}w{^_W1qJ`7-htBoc>(#W z%kWmVs>AJ9r@x_V;M(RY0W?fQkJMSVBR2HY*@xd*={K)Ob4#XzaI~kyf0pd+p?ZEl zN|e1h(8Nc{-l%17_tmTWCHj=rZ`3Zwt9G|07g4&LW||o9GB%}OB5!uZ*MMxvTq*(mwI{|p z>-en5hf}R!PDjk%4GvDp3yPZssmcND8^1i@#7fc8>UAIt`Ll~0GVs?hx3dy{XNNjdnJnoQ*>Uqw__x!* zB((P1bg-(U3v<7yPs{dYP25*EWZ4zzU?Su#zDxJ$Jmt)VmkNDR1{!fOjQFn;C0*PK za?q)Z(}}QT^v}h|qvLj#p@}=ouy=JzCz2WQO^FRjD{D64+na?E91zIa&8`*djk^s#pP+xgp8_Ok(iMNKuS>2h z@RCJC6r-ZV1|0M;*rk@^i2pv0-=lZlfqJft!~vFDSNwd!u5rQdy8NWs z_Q0xIuFpwQf?yP1&VJnCYHkGJ6V!RF-eczGa>I>3n({WXwvg#37ruvt?;Bljr+*kXfj|Lh-_1OU`o%rrXDmaM3SmSJ&zu2?33j7;V+3b$AU*-W~bRgnx#JWmF6_iM?3WSzv zN+Tgqi^vJ+*^M#~i?-jKJk@o2RrAHZk(DMK(Yf5few@_s&!)Y|eiMzBrVoyNh|bYq#bwu`IN9K+SQB0 zu$di8|NG3+f7w6Sy|U-S4I9=~P~q&9_{!#)uM}o$KKzv;md#t12a3k$Yp7o6&*=6D%zn)W*#J?+O|x6@@ZF`It+4k$!msqZJK*I5B8xM}GZFW&@;VGb(!aD}_wIOHsjQu&$OMYUD@$3>C|& zv@$ul@`Qe~AEWh8xy1+Rlh|dJz#DwRZnp$s;^=@%HM5~{1KVZ^5-dK;t6&S+mzE&Y z5_f<;*~Bii0;9mE>{crv2g&RMD-h)2_?xB(u4c0xwWj4b7GT5MEmV@Joql2v0f;}3 zbuO?5Q9^&~1jZ;Ba^PF=wN)e-s*d{TKtnSp=Lr~O9>dP+G}wUx3-B51iK$+3ss#Ta6;=Q zuo1ZJTQ{}#xSxP*>*V+(7#Z@x4D|6?d(=btvjV#&7)1CuF8+xcYKcw%Nu9vA?M1oRM_)7d{lKrWE6>7ih~WyUUwT@v1T zArzdkAU>VN?u`V2;G@njBf7!GtmV02PxPm%JOS; z>MWQCY63^*&8|}uBmp-jchyEYJ3E8X(FeTTy9}ENzsD!<(@@{;3z4xJNDd5C zYN#9Nb5R8dMN`DbNrzYHwRk=-qg1Oc;1K%KYI@kIFZm^VtK|#mP@0L-Hr+cgcm926 zT0`X==L4&B)QOiolqP?wqvFvB>#-Bn53yJ|C1`6%S)f`+aYNbNuywjunFQ*n^+Q6} zkKF~C`}}~JG2Q3C)>5fQ_<`yvsKR;jh%L+wD_8QL`-X!~l`QaX49SJnu?KOndSXtvNHIAr}NsYs* zhmBIni*?kpvwZf@^ihxRb89qaEj8^vpB-z^WZ@A+tLi9^R^CEp4@9Vg@iac>W1*V8 zj2AV*vV*`OT!YH>ZoxjOfsbqJm#~v zL7n@cG7OkKi#K}|c^665nX)T{08i=@zC;TzL35#vhH?#;-N}JL+9rbrf)4+gp zg@!6GZ5q^4Zcq4ugne2ntq~#?GJb;S_^9^ugAPaJg^^4SPKJ-H57x= z?3REHsKIW8|1qot*=4g^FW52SA}z%pJv4AaL-9usqy)zrN-xYp_U^@(mxVsiEH8;N{Pbr1xs62RHZuqQXe|+~nnw zPT8WjiimqUO7s>TwVybAF;?h2m5$o<3)bW#dR9XnL;u+Ok=ECduR|c1g%TYWf)>O% zOa!^;hJ!bVK)*Q1z!@Z!wg5f)Li!sx)zRYk69C_Klsi8a6~29|pR%*2(La3O35N3g z-&tRA^){%co*0@XjD|X^X-c4J*srCoe932@>)fmsLt1=JL+#TvdE)I6(8+(-O^v_F zSK7-<9?DXmCwHXBs-fDx<+ts-`nyXPNoWRLx)KOY%&@NM zga*BG^~ehY|m0ge1mu0#~5*@j3I9D=?^qn1nl&+#zw}>|EQ1Ifxe$g6;8e0 zIC@97Vd+L5E%UErmR#pOeIRqhj4d-xjt?d2$C;%SAvv@*>jhqAY$}2u@$HPmBR&sL z;10YUQNHi*yYb@xJ!IAL@G9Nq;^;hBwb_$dQp?;n^E)BClaUj3(;~l$|ifvF0T&S81~3Op}9}Zbya$kJNTE zXYc;dvra>8VM9WX8$1<;BMbo#UQtuyJ96K7;ys+t;Q=H!Fk*{8H)m5@++L=+l_x&a zQPo36a!IL{;?X||p8*~^KF6-{1@9Dh zGAV2cxyj%9!R{vh5d2a?5yw&cTz3+5po?>_0YwKl?<=rm4cAWlu_}54r=tBaZowGZ zGKQh2KT#H++@-EL(PRoI%<00~5_&r~ht^35vyHGzh=la4C+S7B-B}eqifyN9ZY-pu zPKqGCk8_}D4KikgS|R+h8uWceC@`S+8D2A+alVyPX+9v#LBd)UeYAD^Ub>UZ-b;7m znuRA%(r3Bv@${?cMeKh1I#)?AJ2_iL-x8J=(=(o^F2vHh6+_+MMXTm}4u9OLqJQR2 z(J#4VNN;2PA^jSa&;PryS7f?4)N1OJXw`9%X)KB=uEF$>$YjGFt4qMNR%FU#nYu(w zD@7)2Os8X7EHZ^*nuO_2k?9Dg$(U{unI2%8f@!wMREcRSrXPq*O_(S(pZjOg_Nut{+>{Wh2bS1IjYElZRDzNRx;#yK&XGZG?Ha{sJjX!q7{atO&Dvx7m@)r;pm< zhDS&t{YiA8s+nXPTgDr@oN<|!6x=bCk|t-N{-`geACm%wVGGH*7<8eSts%K`T@)sZ zNw&PDpuQ^>^CVJ;$1s^Rxe3?05-<%Vg;We9NRy{f-zCRXN(%EaSd%7i{O%=~{tko{ zg&1D|?vr}mTFf2-{PK;Md^<$)Fu4HOa++$C*XusUxema2>AH4f)&hhKJS-lV!h7;{ zba|_)0RmwPF8Ty;xpg`fZj+0jZSk({D#3gy5GpXt2c~E)QFWCd+iisTxHa0n(7|DD zu^0Rl*9HRN0Qz(xRmkJaZ-lTAHy9vHv#@@k-!%^iQ-&aPeTM5U5yBA+X9?2>f}cuv z40D0t7FTthz^suFPGP7eObZ2Z_0e;fmk`1w3^c*n)acBZZ6~m3i)xO3kNGM>ScE&u zB)C=kb@y<=Tr_TxlV4u7whw2b^rc7pF;ax^D+V8e%c#~3qE(9m$QTx>7JV)c_?nK^ zhnLgCpQt*OI_8iNrw^`SYM+z(DKss^8|YssP2<*AYDNO{c>QEVJL84{bq$Av%qP(> z!Q|hvv5t0mG8%S{sYSaNF94Cqyx1G$qZf;*!pJt$UuGL>h7KioL*^f|H}ZiR7h&0J z&ek2$Hms^y9@%CTD@^~IiNuhi zFs3R@@68c<5j0Hj{OKFW4EQ<|>%?W}ikY8RSwuU}N&WvJ#EyZ?gm15C9E!0g!oX_G?{-&4dj~@Pzug z#k2&4LW2#1-)`GjtjQM?1Xqaim(DL7ulV|uGWGTuMe2>e>>#&m)T8&&qaKC8OWL$M z*vEMt77l3-gUVzta4?$6J<7|c9g{~KGp#Utb|(A4))g9NC7#%2Ay6a2RS1s`n>3Z) zTca^$o820dLLf6m(6wZTKzg-)4|^UzyT&ZWi^7}MTEr+R(;XzC%*@eX4l2zIb80(A zMYeG^VRw*s=3RCQI+GdXm@n{bc(0O;=~d=Xx#*9~k>W!gnD{P}XRKZHf_6YEv|aX# z7TOs}wccBydXg90uNJlre;2z6g`Kj-~>U4NfU7IyrM%&-d$E;~s& z#-XEG6UcG*&_LFhsF=b(X$5-BxC)Dq{RCJ8Sdd-_t@ZA4upzCvl--|Rn4>s0F7Y~U z{ZRHXvmNyibLqrqFi^Aq7U8t&I|QHK8z;xTy(4R2phnF&gYZH&)C8*U^ZTvXJo5 z^LS{-C z>qsu_$^4418yMEJ8AJH+9u9SxT!nFQx#Q$;X68qP$) zs}_N|XwNDi(n^F5teOy@?l!F@Dn;_2x=nUNm~_enhVbC2wRT)=B(kjX1k;i2>LACc z9=(Pp3@ZI{_qQkqOa>ygHYH@F7vkM+MUD8wN^y{wJ-EJSFyxP{i8yyB zQ^I|W?yg=Ozr*$KF39)EjPF_8T<&+ePgdr|C}fhh+_?3*K>~Xa7$hKJ$MK@}GK|dHj&Han0y|eltz3 zd~JjpVubAL(?%zZL!vPcR(f?8#JQo9R&B=P!D0w zSm+Amw9Z}jK?VWoWoK1YqWTNX=<^E#4S!If&l~L_BlkSp`8k@gE^ErTv!xb?*@Iip zviob2-&iTI5kcekbz95kU6lQLzO@@Vn(b!~ev0Pq)u6XlipI9Kw6nMk_4A;=>;`(Y zZd9TA+>oJ_Upi+JVaPgf5}QGGH8ty~&e`J7z3v=ZQ>A<4Tshdiy=B&?^gH$yw{Y^+ zIwvcWlEwelv?*8Xq?qG>nLhV41HY2$N9FY!O=?@CGOd-$duY|MIj>*cnyt6WeRhD@ zc0oU57c|61Jf{iby4I%IJ4|A+Gk&F(7|*F~p~QHGyJqmgmKmvNHJ7sf z6rHN4vO6`Yvj~!l67SU|VBsd8Zz-qcEuN|cw1=wRXFhMJY;;u734(~Gui?dbu!~l4 zNyO!r>BQwmG0j@h>P*Q2+2Tj+hKh!XdoEZ+1u$k@fj(r~)AJEB>Y|LkKs_t6t`y0p zUzEM&R%bkY?AmsRG&?oF34<2fW@nQ_yGWLXCas?rz3qZwU4q)MZN6H6m3BEWKdDah zenEO6Cz8HAeFy7E>8x3Ydse3xvip0Lr7gkR&{yjxfIaB<^%?#vBQLk5W&XF?A|l@I z5a(`pnYQL~{r+}?UEiQpIYDIfR8*3)!NX<26P=Z;^&%7_vKu*sJ<;K#QPzqi8$ujf zFBZIO&2AJwXXL$T(uVn@^(Dk^2pEF)4PntQE*Z%?X@VlX@Nkao;3eeVl>)<{+2)ah zMI^Jkbg>`*vTvHcH$5;7n0__ALAD#G<7=6GV@PCXcb`mcz1Aj8SXO5EprT=D4c|2a zJ3DS+aCz0VVQM!RI@I^4m#QxvK>Wrr-kF8ZkQZb_A>G=Td8eVd%5x1+SLGC-b?C*$ zi7O+1WaH|%?X~nU>`o-<^=s6C z`x|R)BUm&&H*7@QwV^P^sB5^xMz=4^`sp;Z@rR>;9g7zppM*NH_>(IY>Fn#_NbtRu0+|xA?xOke$5T>jgdXn2|+NL-KtlsEp`VtZo5gl zuqA4X#IO*J*_@uxEPry{NY+8=+R;^O>C-uye&70bN6!KUHc4*gg_7#o4v)S{U3`~` zd!E2$N8D*yIrpyGcoIF)NNUW|vvPE1^BC`W^1Vk*HWnXh;e#fHajg0xH~A`KFDSUx zNV+8qgrf;tQXEGwhO`CE{Qw$`PE;Mdii12RL2t zN_;5wR0uf4Wh-NG+8FDEcIE|xJY>j|fhnjrFPIF@Lj8G*gYv({>+8vRq`qy4QwZ~3 zD=ofv^l`yzM5YZ?f3!$N&(jAkL2EyX04AjU$QP%de>5d=eH0Fspu+t+(|5h`W@+b# zGihd$*{{WG7JWTyCQT=CZM5a&GkS^M3UcRIsR|#<#BF`G@d?o@!-j4?ipY-(J$0*h zl9_dcReqZfJU(@+?Kx=zmR*uFvbGAbX&ByY^5eHmPWrDFS?z5saW9Vf9VBHXNU=4# zume@-T+Oz!)Z6+Bty864uSX-&dYG+cuh0>#C(e80yf<#J-q5D@GaJ5c@WF+$c57J= zs%((q3eg>z_%3^h9?>X#L7A-%0-5wq??_BY_B&l5eiLKOp4r6+a61bZzJ{g0zg%LJm0C~b~gJPL*oM4z`T-r9uyfR~JrS^TQ*}cPFCFqo*%c@OZQB`I z7=Z1Uhar=oan#@u_t74xhE96Q34USIjaz~aUSTBadZqfAju6d&bTSuS2+`Q-uq8YJ z20))g*s}bjL8{Vzd><>c{;sY7n>SwC7^$t9>NkuYpwqZ; z+W}n;g|G!gp|bCeK4iWg;9|#!CJ$Q-V+XzUXEji%32X?f*n( zx8NcFvq;Hk3Kya?pX{{FpL*}<*~fla3Y1h3?T!bThW2V5soqu|y==f|7j&Tf5mVq7 zzGf3dfidu#g~>G2^UtGK{-@RNA34F|`biTXvh#3&uk@r8EuoQUDKZzx6L)7lMbkpy zX_Lev>G}H`kmc8GrJ(k=^7_R4v>QGLGPyduA%-1F6IQe+_aDuwtFaMo{$<7P!UNU^ z5zo=`UH*2X`b^?V5U-GpLh4*q&4cY`F+ zK1=q)ulTA;m=k3`AQ|lsW}s=b3@ky}bduBX`G0ED4)-Le4lK5M!u)`a(Q8OTjyzQB z!9-N38Y@em{O+l&DB9w1>5}t{tfmt_S;7gQzUWeH8xo45xs~Xq>LZ^A7CvkCZ@kfw z1)+pd{9h^^O7(eYMbT97392iK0x9T9k)O+^$?vsmMV{-(4tH3`XH$F7yCOf|u`xfM z-|w00KK+Qt^h$8?#Tl6*?M~*m2~j_)JJHzU^@ZX=MKd8w{6o=`a8^mR{!1Fd68}Kd zf;ak63*Mk`jAJpzV4Q?89%B;5=@@5YoP}`##`zeRVa&w12IFds3XB^Uyx|s;ck7(7 z5{d@}3%8cIt79$amBR0OM_T*)dE})o1Bs|v9Vzu$@J6#AZfve1pdlYUR4=oiv$;=` zb>y9mK6Eom**giWLG<2$)S|bC>xEiWkn`qXldwMLjk@UVfqHeHOs`z`Mm_9{s-o6C z1+*@^nP?$;I%1Wy`b@MwcjFuNt+)EmhLS_{EiPgMdbW3gjZ4A5qT}LSC}Cf%o6pOx zSxI$8Iinq;<50MDv zbIa&rLso8C*_FntWwot!bVO^4iVjC*Y zI!^_A{Jn!X3tHmfxHk5{2Pmu0pA@#PiXQ=lORiLM+Tu?~N`a8~;& z(q63#qSeC6)}6yK%+=et(nx6okpx}4;wv2n=mYt~E7V(x3?HsTe_ol0t-zS80eHbO zuFfm;kA)~!MN15Jp3typUb&8Xe1I4B>9-b?-zw&t`kWPaBz>~lbE4V;ajnF@*4CaI zw}`n>d%>ypqEoHOsrHgn?PaIhD^9gnow$zzuGdgAZtyr_z)i`hD|`Qkf;#b_DQiMe z6V>$vPo4RKKPXmEI4dl{JKqXTL;=@aK|PASHr^#Bi`EGSJbGs?xGDwWFHXCzjRAW) z+OEw8ZXWB(yUg|nSJ&{5oMn3v93zx-{vA?tBfx&g(Hr&d()@CRLw>n7e7LtJf-6OP zBFhc(NVM+eH{|vYQRKIOfS8Vv-yI_D#^hj&8|Z|{E(kQ?^W*Q!+-M;GBP7u+%XhdF@E4MYci zj34eUuAs$wRS>k!C^V9UT1=&*pMNaFUf7_N<8ut+zj}hGNJPmC!Y|YcCjga#$YE15Uc6%zYi(FRz*|;e!oKq@_ zy6fdkWp~ z?ywFB`3t*QQX$e1x2XaL9YqP1%}Ikwv#k(0sEp^rx#wcAJ=XsYPkqqIXY!uZNc1TXe%M>D?ASZ5xR zmEAAUhbFRG@z94BgI41t#aiT7xm;Yy((2o>OUa6x6B{ z`pN#RHX!Ye5TbW-V#~fNJ6ZO5O{r7Jppp$?@#pFs1)Dpx9l5R6AVRWdWTl$j+!)8T zSc62X#I+UNRPLoU$h5}2BHw&&jtv+A61XikKmlC1yEY)iJ>_Sn0IuV*oV2DDIA~xe zI4mfn6rG+DFdC53FFI%1f-xd;K?1ki0r&#v&Kd`hX9W^DyJ5hO9665*8wRcgE*cHF z(Xr5Qtl3DgH?eHkUpCCOhYgQ>iFSt`^TQauE9WyDWIKp#wR9*KlL1lYsc0YDChbuJ44 z{t{1OlIe7IB#tiRL_(3VP{xuMl-Xz;;Itv2$alMf#otVw2}i<{7)H1gc7!XcueM&V z<38NRMTY`E*NdI}P!uriy&32emhDqp0GGtA3I(HmQx@H#EiHNTZ>cjlw;2?l-;5QJ4hF&!#}jlXr%BK_%Lpcm>Z3k@=PS)XweWfCzvj?vwFg z47oarJ2D>65so>xyLN;R<8F=z3FOEe&UFI#%`NFMI*?%zm_|(-aTRItVo%;Yx9K{ofD9PAfw^=}k+ z=FI{7gS@