package resize_fat::any; use diagnostics; use strict; use vars qw($FREE $FILE $DIRECTORY $UNMOVEABLE); use common; use resize_fat::fat; use resize_fat::directory; use resize_fat::dir_entry; use resize_fat::c_rewritten; $FREE = 0; $FILE = 1; $DIRECTORY = 2; $UNMOVEABLE = 8; 1; #- returns the number of clusters for a given filesystem type sub min_cluster_count($) { my ($fs) = @_; (1 << ${{ FAT16 => 12, FAT32 => 12 }}{$fs->{fs_type}}) - 12; } sub max_cluster_count($) { my ($fs) = @_; (1 << ${{ FAT16 => 16, FAT32 => 28 }}{$fs->{fs_type}}) - 11; } #- patch to get the function last_used that return the last used cluster of a fs. sub last_used($) { my ($fs) = @_; #- count in negative so absolute value count back to 2. foreach (-($fs->{nb_clusters}+1)..-2) { return -$_ if resize_fat::c_rewritten::flag(-$_) } die "any: empty FAT table of $fs->{nb_clusters} clusters"; } #- patch to get the function last_unmoveable that return the last unmoveable cluster of a fs. sub last_unmoveable($) { my ($fs) = @_; #- count in negative so absolute value count back to 2. foreach (-($fs->{nb_clusters}+1)..-2) { return -$_ if 0x8 & resize_fat::c_rewritten::flag(-$_) } #- Oh at this point there are no unmoveable blocks! 2; } #- calculates the minimum size of a partition, in physical sectors sub min_size($) { my ($fs) = @_; my $count = $fs->{clusters}{count}; #- directories are both in `used' and `dirs', so are counted twice #- It's done on purpose since we're moving all directories. So at the worse #- moment, 2 directories are there, but that way nothing wrong can happen :) my $min_cluster_count = max(2 + $count->{used} + $count->{bad} + $count->{dirs}, min_cluster_count($fs)); $min_cluster_count = max($min_cluster_count, last_unmoveable($fs)); my $size = $min_cluster_count * divide($fs->{cluster_size}, $SECTORSIZE) + divide($fs->{cluster_offset}, $SECTORSIZE) + 64*1024*1024 / $SECTORSIZE; #- help with such more sectors (ie 64Mb). #- help zindozs again with 512Mb+ at least else partition is ignored. if ($resize_fat::isFAT32) { $size = max($size, 524*1024*1024 / $SECTORSIZE); } $size; } #- calculates the maximum size of a partition, in physical sectors sub max_size($) { my ($fs) = @_; my $max_cluster_count = min($fs->{nb_fat_entries} - 2, max_cluster_count($fs)); $max_cluster_count * divide($fs->{cluster_size}, $SECTORSIZE) + divide($fs->{cluster_offset}, $SECTORSIZE); } #- calculates used size in order to avoid modifying anything. sub used_size($) { my ($fs) = @_; my $last_used; my $used_cluster_count; eval { $last_used = last_used($fs) }; if ($@) { # Empty FAT $last_used = 0; } $used_cluster_count = max($last_used, min_cluster_count($fs)); $used_cluster_count * divide($fs->{cluster_size}, $SECTORSIZE) + divide($fs->{cluster_offset}, $SECTORSIZE); } #- fills in fat_flag_map in c_rewritten. #- Each FAT entry is flagged as either FREE, FILE or DIRECTORY. sub flag_clusters { my ($fs) = @_; my ($cluster, $curr_dir_name, $entry, $type, $nb_dirs); my $f = sub { ($curr_dir_name, $entry) = @_; $cluster = resize_fat::dir_entry::get_cluster($entry); if (resize_fat::dir_entry::is_file($entry)) { $type = $FILE; $type |= $UNMOVEABLE if resize_fat::dir_entry::is_unmoveable($entry); } elsif (resize_fat::dir_entry::is_directory($entry)) { $type = $DIRECTORY; } else { return } my $nb = resize_fat::c_rewritten::checkFat($cluster, $type, "$curr_dir_name/$entry->{name}"); $nb_dirs += $nb if $type == $DIRECTORY; 0; }; #- this must call allocate_fat_flag that zeroes the buffer allocated. resize_fat::c_rewritten::allocate_fat_flag($fs->{nb_clusters} + 2); resize_fat::directory::traverse_all($fs, $f); $fs->{clusters}{count}{dirs} = $nb_dirs; } ژa]kLZR;z^]N%&9grm^(c<ŮG'SJQriUE!oC $9\> |!U)]WX} щZxyu|W᜔T_S%Z%/3nZ=#u.+L7^xh#=i U`!_6 Y⸼al8f2qb7+[p}5b럋b%qkz [AQEe=\bU;4GIӃ-.^Pӛ^@T˚?|Tp= L> :%5+,QfX%s8;{̥6|Nd,0G'lwKix?q!ZY^)J#,B}*Unv:q.^}_SomgIDz-W7nD7̓򼐁GY}UQv Sy,rI~ #EvR7ShjeYT]Dj7SS^R η+c&M#:jP~,ۧ|@m-UQVg늤gU'+~Y%`%j"xP r:"!}d#xr]qh=Nay6A^ 5tJ|8DC֌/Yk:Ha_>J?$͹1*֖͋d-^hk&CԟK\#MU1;oK%>~Ks@8?^ijT΅'5po y&Ԡ `Xm_%g^ՕDO7]bx2VGx BqZi,_?w*ӭB;SuBBňqg) 2'GBR/DT44L#y;%BA-e2w|TUq(-9(s!Mw?ݜJj_?T. LeX :vD^b$m1E,sH~9:ƛOo5(/9Yfrw#p65dOq?M2| Z`2 aR!MрFo[7N,tlPSqP`w J|j} @I˪ -uwQ@q)Qzx d.2!u[oE"cK$A 53j'S"4uE6',wp[,M{Ti~Ccp찗I VX,͉,Mx2FYƔxŋ7IӜ̽wRUGV 1vjAw ?n_ٲm6C+MS 3h!?/&+<ڿ}봫 *j+[3o > jB.C[ˉ5:p]_mc+GB՜FE>9e:g3j= 9 DŽM ZE޾w0%9\\a/9C2SS"7f]ùleiܨ@^"8NjqK>N6MG6׳PKJ$Y&X=xA6ipXkzy)&FV8`aB JÓſ6B.DQ6^F*+1]]|bK[1#U4dBzKK<ǤWG$AՁ{jDF,G8ҤO EܫP'!8DN2\0hg GD] "a|7*oY"2.9cy!"T-3ХCr]۫D;W)-"hGewi=D3=,mM-GyAZ=^4bEt%Wa9@j[31PzhCQ'|;rs3;ȯ\2*:^dd+Mk|w[fǰMm-3ڹH؃PabЊ9=*{4:>)F}()95piM #:KI%o/7YD:ʓlJALF@?cg[-*3C',D,y1gU~J ADF_f|l}]v(ܼV ݼ?5m50._a>E@tqN8/W8wcj~gGu,!ʤ4/)LL0^tGɕ> ,Uvs 1gStფɧU Ӑ@`rgʈ%X7w{/8Ұ$pე@q\~U3Qܕ1@H%XeflF,ť[=HyzA'T91-Nm?/uXԘ ݽ4CC@w[^q>cWbr]P "| )3'1t=ʔz>@[:75R{ !,:t""-]JADep tr 6JB;3jݱtk N*o`Bwvh) n ŧ^mAAijXBxD xOPVIyNjt̰Fֿ8O ݔ߫ڂN6/4wǞT<um+SVp'۱A+WT yCcéѴnC!{)Ggz}> ȸ~wBkrz/Fhk/ڼsᠣq~jQDI8"~^HӬ\77rM^}:)^[ C= O)C Gc,G-a9 [#gPD.2P0kJqK`DXν{h;}KKƅ#KY$uWcPIX/$~L lXQr͐wP U޼ qLU+$DRJ.Ub ƖCSvvvVN0~Q->.{-d юf?3j+IBtlpwZD}. -:]Wbk3,)hu~L2\@!Z2buSE\!uv!'(7Rj\R;~s9RqbK_e6*l{PIJŷ]RA19wq=I6XTw;@-UckZkaܱ&!4&R]k|a`" Mυ9:0!X.L~sF3+I\<(*u" c޶ .Oi^Ӻ.m>筥y2&-QΡv,wW0WAS< [ #agN0*_?,J~HȍH` u+]DX!a( F{ZuH*44vh!{U!S6ȷQR]obRxLA7x9jnk4p5Bf D #V#lxǐq9xቃz'Hv8?CqgTta37nǭ>tMxL}S~ \J-mӶ[rrIQ/B{ DAƗAk5r^g'8 -t$)~}"%1DJ?hآNZRk;B{Ϲ06rU+ BJEHk5{Xl&>?M|™;Y*xnnzm #` ;N$kdu<=p,c01XBw瞐EC{ 7IӮWU|}$c6bPƯ4-F? C>g9PKK3|M9/P.)7ځU4֒pE$iDZAN,vg:נ1#8:NuP|Wb.W;}Jj{VdRkmaqb)Øh`NqnZ!zǶN 6}xYAhP j|UvKO@6ʆŠqC,fBVYf@6Z:{8^4lçVPsR4qܕBH>\7 ²L,Dvڧ@Zv V ]x sp 70Gb:<1';U0[/ 刭Ȼ<&Bo8 ׯxxj5hDY>`UtG(:w;\&p@ACP=X JIs_`f")esMcQ;5FJ*HdI"xΪ,n Ǒ|=QZpNQ-dAVq6C,lyvix]-7|. 6 Μ FkϞDpu܎r&EUf`P`H",VωfLޫds2r; E`? 0% [zN?9Bĩd{ZԾ?u`-#qX2g8q,=nN&۶̚/MkJ{fannpZޗzD|PT7E_G eTRf'7&l0{O!rMog(AۉWo7\pf>tQh5ڂ/Hg~pP>|Qu]"4vXD1YZkKa/A˘z#</g7p MJm_/AdTCqګbrH/Är thCsa8HiuFҹCtNd<ZlIoJ1\Wf)YuJB;b"#gD#$m0Ԟ4s8kr2SZ+L;ӚK$jhڋy>kbDNXA 8YuhA[Qu`"'^s۸2˯S/ UBj bv25֧sr_6diW'M spdu.h $cb3s㢭&}$J?D:S} (~^;JF( Q47?9Cq\0L&fِڲ<'ή98Ģ&g(GĠ׸m!2nUeȹPe&]NVR4FYdQVȳbϽPf$M{i x L7O 6x|cօsVȞ_d%quGyO' &eDiɣ6|˽zfR( N\#i@G%^1^,4\ɜ5$W,XOSE&V `sd;CD_y}LL%[oj8FCj(ؚ);ߥUЭ'$;&߲_֜"\& 82IS[@64//xv0'98/>0#`x<%lv֌`3N=6L_h6JJ`%)82Gƃfa>LqD<Od#mrڰՈK݆\UP+N'E֛o,Yn_[bjVǪ4L,8ePivbɮ.k.mZt.ޕ)o!"B>f&*#{/0p-<Khmg?ȊD< .A '^,O۴' E}cICQCwQ DmEts4=o N=mP AoI g qR[uƉPO!LPTULlu j3~qd\PtbH噽<0'zU9M !AK6faĥ\_H.AiSHI5˄.oYY}s:jxUBu|4un\C!RPM8dIĎ,2+Oӝ.x\* e&qP \\\q^-Ú3G]&!8eޔ5I;/܋¬![0;]G-͜e=Ak)-'gd>Ϻ5yi#(Vg"rp(Y;6o=znh94Ԅ&SaBi$,Z^g ZĕЪ7׋Km+Cx,y֦f CFQQʛl4XqXt 2Dz@VNBUQruy;)pSfIjIA֛Ma٤.0BͲV*| vbՠ~[>2* ˴r*LCNL"k O"|Kn˸TG  tT?N .\.Zm/OwӁzYygwD qpI2`$[ʔM8eu=ڬ lfu18ĉbz|$ݼ0nurl<Lig6)zz,A_<]SoV ̈́kQ4? GuVH3<-9MP.`UY rd2''aY:Eg@DV89FK #OAiSXcڏo j.N,[:"ʉ1e7%Eb/zԞCz8^60G}$a!7KNr]ߏlP\A QBsޘ㻭xc?s&;-d;lϳd]@J8 ?ASew{C(x6n&ܻS+f liKkzzMa͆Ei]dQŨԨ?-h_K^Z̒*6$&6yPKh>+B Mn1QMPqbCΉۢ tt}f L*sBa6f"OEKljeڗA!FTvN/lF3zI(*_AYS@h]Q3_:rJ~Q"=TthPZn¾A5y\PmjeDhe;734]P"QfQPtsKVp%/(`B(=(ĈkXOzBxW/ROicЧBmaS*@ 0fȻj?YT*BuI/ %LV!t4;έ0НeǼDM JB0dndm$ B} dJ9=Sd;9_KvT`:<;fY^o=څ7N4PUc]ן.͕:92c5y(^a UQ((rX!?ƣ2ACcJ&*DzV>ˢPIOsM- 8P[ŕM!btE )}Z|ifu$5 >Z57]*F `YRȰ<f=z]n|^K-qWΓOS홶<C|Ƈw A+QSBQɀ,x 輣4; ]bڅZlO7?Yy/.D0|.)vٟ;;>fe~eL<= QZG&Zң yQSHZfYo*)2{xV߿, +Il/@}98 .@#@Sɍsf#ME\s6f2F$HԴ6u!:zθJH בy`ЙEVJ f=B}gYVHwoLo3 ~pB"]cU+RPSɘC C2o%׵j7 }d^:5>w'*O(!z êxAO.h F%5A}۝zҽڍ* QtD@߾V̕jd+ϔ%uw~8g`+?4`_1b ^p^ kv( [})lhNy@%"wZr!+mH8 6ѢJե<;tdK0Dg0,ui΂0KTNbU\q0=a0 i -G0.CU!8KիnZr;g}8?gp,L-K|> YXgHI<ma?@̚昜|?;e1ɷn_;[=O;3 f +;lZ;TM欟V^(]{6H;z)^͔Wk>~+"kyd%7g%0B3#֫{ej[lxtiL@9_ :#x;vyp-K{Xds6+W4VC.82h\+إVY hfrZ6{WCWqib*an>7VK\&G@VQ)b #MVTWⶎ7ͺ+dv-"KjF@SMd])AG_ D];j`<Ӄnm.}\mݞ7^c+ ZT|݃NN ;\&i2ƍn:cd^@_L/Lh *5^V1gXGnHL\8sze?"N_ ŖIȡ[.vU|- ~/C*N)vIׄ ZH%r0ԦCJA L~`K?d>xO҄j|EФm—/f$n6["KwiwB'}WkHT񲆨e]q5/΂ZV@6^ %V >~s1s.H~~Lq_P!{hZ5+MV1HZxi$y`$^MPJ-}JVij >8w4EF>b-; 4x)3 Ue\q\qDO/z+>4+VgMD#UXS1 $BllVא^ZfU]#utZJzF) \ND?PywAIT 7=6S%,(i?(#K,5.0b7e^jbjBA|j8]kʔӵs3L ȣPdwǎڳ˙-šya-cX2k.,P;֧ Qh=L#/@^B϶v b5+Zf׼֩ŌP/+`1ԥh=`A QYf*%qp$H \@ZNvs?JBL~{߿}M . t?:QyziG]rxnAZsPe# :~&0cGn ې#8`_|[5 } B qB2$⌡pK]xE'@X9Zfĉ<|o v>UKEyT ^ū>9{eޫpm7 d=ᨒnRy3lNf g+ tX-ig1ٝm2 }hJԿ5Ar eʷ4LyJEK.mb/s]UGAR:KhJ.]UH\RsyH*k*> BC^b ?P8=Q6鯩Sf\PU~u;H7(0VMlUqj6 !o؏7vuY 8y8:S[I띇|#OS`;JUZ L@DmO#9r4n>IDElI)f6j=G|*(jbt8&鼝(Be_Yk5qƭU Lem/Gyb He-[{5 﫤V?jQ-N*$ktٕR# J. mXO;~ -{6wWw;[w$0ӟ =O[>29D i^iř֬1s^ $4vSa8*I|˅3x ӏP AD/Cа3("OihF ,& :M" t'9t)9_i-kҫ\kn g;H`@ǥq4-Xx(y0J9i3V }_ [X!fz[fmO,:YP,goVw|z(Ҡ7qK(6Wz;^s"DAht+?;rz)2l~\۾еZqI2,(:_ H  ,׃~}LgJn7n 3G,qΔؼ~B%NO+0(ڲф=@RT8T"w醩Ճ R|ǫn&xK5{Զ Wrr>Xᆑgx*wA5q7`R ڻ ;! `̏.0JTEKr%qjBp1"e J\aq*ka3F*f"q?)3NUǺ>Q(nbH3p-aUmR&`>wOӮ / 0ӻ {5Ӕq8^tJ(u>sLTA_tX邑2)'^LrϺKpÇH,rZ2:sN뫲9?-Vq@r*%B-wuU߷dF/xVu1Od'$eݧFܱ#萯y. (|Sz{`cQ ]'O &tX%ԍ]Fk!>WM"XՂ.8' JL0#-8#3﶐obgkG6ZX#vAfa&/H"ӛTKIF Vndb]wF™G9PhGA̱֔nu .gY?=d\X H Im5:8Z6Y 7 P>U(=eq1?*kS(-DO|Z,^,3˜Ur`6&ndל#vdJʄ xi\% 'K;IWlsKV ') >J-IS+5?-:_ a4.[d lܛT6u788wV ZsL( Bi!XHexx@)K)yUڶ 3xD1=_GYGvWi\"o谨 ZߥjmfE"J-k~7i]Gڜ/=F!iKÔޕӦJ)~2vW24=,Ҹ; 1a pcd_B.ȑ1&^%#Kn6k)au͕VZu5 ƙ̓NRgcpU|RCtA`\HFPC;YU !+EGXrd]pk 5Z$`Ro15lIه𰈇oα,.<"ʾ*qp0Ks43ُě>2zb}y'8 |Tex;@fud kdįn'7L1NxO'RC% J:h>yz䀠GBY C6ۃ),ʕ}sYxYy*QXq,y_XeWUgd팿,ZtB,nnoĥ^qk?-juJ+ 2i~q^ۂ*8RAo.[N5ϭ[˙^Todž`pvkٺ>c6`~+`(5["ihAp-\D~jSE@=^qb%c`0Sմ¨Fy 9Ex; 8t+^}1qv%ݜY%0iXޢݨYVA &pbyiw pa01FHpinW3mIC')sPLJ*}wL~!f4G@^n+Qs[nhjItĩQr B䲣(L|.GNKGSM#W5=y(N}$~A`637GѮЋ)nd70*w;4,1#qrv5yi2S)~hدË]ʪHqG$fOԡ7f}۷`lˤ9Py@.hj&cAr3);I VǫYP̥8ˮ}oQ} LXd65ګ|{^xcͱK/qo? lQ?K|N10X=GߐS{4Nʇsy9+<[1t\ptO|U$Io_^ ]&ZƜm)Qb&$مF [ّ̖9k@DYAOvVK`$:16+S} F?H<%u%}˕uRLc("e l14&d)54OT{?3֖TlJh|)Vh!/Br1hQ`9-oEIe]Zr`<eJ7$@M@4k 6sxL&;h%ÃjlY`R0 Ůyn٦COd˘[o7.M %1ҟ+t).ʹ+_E ob_Vy3 *MDLA]A~M=pne`Ig*H+Gtw Enl]D5;h nX~OT&]w%@t=Ve ̈́Pۆ;S@wɱ/fj-E` NJ YĮ+cpz˨WYף-,Gcu@1{s*b8|Pa>Q2𸢏AH-F@ttȬʆ߷:Tj`4mv3~I yRPt_N"03®J\x₢:7{]s$Ӱh% ?/ֻoWV<Eãs糅$E N;<F~K<%rbiZ\8D 䐍Ԕ褺FI#PT!KTKڍo4:!b n{Ӯsgl&yG`ىGn)LMNu$Qi;MXA`0?'fv ^t]oH 9Q{KDZ.ُ#*lEU]LSoaw$yA)F+PRc5jHX_13˔bqNoLfHCss^[7BMnA<:=}5:m msm| '#5I!_K2_~fk80a4x))hȔ$Bع[[g+"ӷtfWxk;;Im\S3< Ʒco%:\[E ~eTaNG_؆@HKA>BZ D5ȘOQ*::l1AF,wڰ'ńDV琙847;ABSfL'O`x]Tä l5"YģV$quѷtMCz@$mO2>l3١'|+uw7^jaeN - @xF3̪\-Q3gEwESc9YiO0Rnʗ*uU9&0#6POlfG!@`*U'E,S6vA,,jFQXNYb#4"{'L ;@ !zZU|3ǜ7Š1oy)<,$/YONP7~ޏ^)Թjb)ŁXB^=A"*Gc&`.GiT{ T쳍#R& ־rImܢrHGAd7S@ugw xDM% [aȎ]&Ot FHE>q(Vb нn9|*|ۭǩy*'=pE/lԛL0ijԨW7eeQ`e22u w04?Ȳ&~e.ڜWyq gS{zJQ>f.?,-:.tXs++zFeq:6.+oykbGJE<6v6GH)2tKPN1 %_g!ö` *y-B9*S]PWLR(sT>Myv%Q_(98Ѫ_%НUǰ{ݶ +o`t|ʬjȢ)t9 t8&,$bWL\0Tu'e!ac2H 9;PJX;(2n(&a*6 9`\!]ZW(#eOAY c({Dģ~ C'ksx8^;zhDXjK͇s4_R~:'O &ʙouT+ؔHK`JJ:lGEe{: :JpC]mHHFQڿQo| 2[+ gvكE՘g]fA"8㢒pWz+'(لPd8? 3Y~_/5cxĘhP3ǵVgP慇Aopr yYTNcCy~2w1Aw A+;F/i}SXJN7U۸6 73;u u qk ic;tTg$5nJ@7Q|EqR381'[| ΆS­Qܫ)*U᷎)CeSKq#lޅX/ZL0y!gt":8Og_qxŜjѳ'ƇaiΤqqEn4PZk\YŔ~Qm~l4*t^h 0wc/5k~ݞ)hWu+Ts} [ CiY6wNFt™x,M.:>LGT^2(oUr0!E\U7uE=avbW eN4N8]v?z6th_:bޡШpWɗeN/ؓq+b8Ag{l旯d.uz&:ovn4Boj`je\Kp#]Za ZjB;camӆrcX Ӯ喰sDžؙg`lx3_paWqJU>e0k^E:鉌] ?*JAUcJ4hJ9qԵ,-掱 R6Hyo>~bߌJAyfؠ dܽ:yL?Gl$/:UfZ$Gb l12f_d dkx25ڹmOJ[BXmxabآKY8E"|?5KWͩGhKHWN<'rفe6"z/ I ɈQl|EU{L^ 5)&:|6lY׋A2Q[Cۉ0}eg7 ˔s͠Y6s*?:t=j~EඬtXEHgfm:9'\9 ]K̭?ZnX)aL[y!W,G,28J-jǞ7d\4֧WU[&ej#kR|}@PF2qn_f3x,M 6g1+}:xWt #і/y,O=c8}joJF당e:.1ȒorL\ |dW[`79 h2=^0Y pxV{my~ Wn}p;¡u\0{-H٩0HF¤!)8wx`x&wg̏2Mn_ۆ,肼S0v* OSf~ERrPC؛Ͻ~N 67xIP=%1>U >TiJ 0Mo#:#DŽ/;sOaN`kJ1`|U3rr *e==h2 A}ꪜ+ԁ1J?#@Օ:[k@|S_'|e@i>LO0Ifb1cO{fݩtLk.%l!'im { WSȡH&n&fHEj-2O(,!`X9U.; C޾#-3ȞvOjh䚙cSF4g6| f~˷|^ޤrg=La$4! gVhd95,!l,xqۣ=N?.DʹE3.#{g _;UK$C9ڢIV %vǟ/~:?AF?M+ŷ/(ADkW.е&bE^H#ȟ 7?3ec'}[\xά;X\R i53%F' p#1SUf GfWvBO’~|o#0_oStAg{Q/$ js[:MhōRci R \@m"5 DjޡdNti쟪a.:E[})6"G"^D-]-wϵj%ƫM*oNh,uCq @H|C]#^9_j‹%PM-?-LAK3fo=.3кqH d͓k nk]# aFu#$d.ܼ+qKHt_ems׫}V_&h9R6T:o~`9g?BVHw)x@.#žF\a{Iΰ<,3mE F-h>aoц!KL:gR>۩Od `t4_9x&Dz"!ww3̯2"i("99dx4oicP+b~RnHGU:C:AEC0 yaLfA"W2o_*u?:)?G3IJLլؚ->xvA{o,0T,NAݢauYXt@:R(]RjB~XֽaF؜_鼚2>DoKw-F{ jj(12yz0"H6C'ciF s v1˖p 9?|՗eܑlc'WDuPö1yclG3磿ҜTFWie6Pn(seQv>U륗,> Wz㓑1+WB8Xt0r[aC~nű; 1v|hģ@exB?m`Q:t<.(Zhq4\'-p n{(`PQؽZA lAg\P+&w!O* gVF%+ ]ǰ%'`d`G4ID8#D(~’9R5ņC, i0&$3AH0< #{- V_At3& l?1ۥ=X[ Xs0"R*[&FuơlP/ܻ.?If}tMTB"Yu&-hX pW@ѭ+-]u@@uVo措eDص\Gg2~qc 9)]뀤=a=_Ay#G+)a6DR~@kDo+_? lT 2[رce f2wZJMN&;!K _.ǟ -7نl}fW{azZ"[ cl̃$y%s<I2t"ѸK|g5p\4~Pn9*nO [ ϭT-fax^("PXk0t \/: h8Ho|h|> Aj]PYJ3"xbs9Ii*& Ft*5xOkq"u>GHT16E'x'̫1 J7>!W1/ si Ftm0o`1/R⽳΁cm-}l Gf ZCt{Ƣ㑞UٖQr{rئ3)Lj},jٳ`ԒhOx@L}wfi4aq5~rW^\*g<Xr3ѭ+z&J7G<WH%.L]$̵V#r`L_[Zb]p:zty|0ڃ(RhSKP!_A t' |]u ϕ=Ù!gSDXX^*aSdȖ?Uu89LfR}oaW~oeӦW$tF无!0xHxB8kgoϙ&Kx; Iy3?ZI/K9)I8-o` -:A)Xx#;G? McJ"$1OH 噀W]0}!$CõZɿhz T+Dwb#U\+9΢ނoi͋˯o.uR׌Ͻ )'n%%,6x+DvO0\)-$^pT_؅㇚lAcibǴGl+֯/d[Af«~Kح.se!B3Tη]KJC+8#~>UD̀'#Ь&`kyAc0[k˘A⪯>SJP-<.3CqF &Wf%i?O"VqQ5`U GKWvLˍoxmZ*WUwZzW\Yy}SmXR#wo7 %N %Cd7lNƗngCe>aP}'%/ ijz`.@4êvy['05Ӡjvc+‹g&`QbrfR#߶0JZ fV<\҇*ٸA&Xh#3NI(Z;kg*RO=鷝Q"dOmƧԎGDa8Q5Ow FJN>C#h ۱9;}'D|Y|8a%`C.\EaHȓ4y$%EXFqP}]6W>> '{\LjޗR*FۻY,#o'5 w|ІLkaCUpWG&[ j  ꕰ Cy0m 1qx6 Q63%_w< m4KBSy}WB/I]?&h#b|:vJ:EɅ/D䷳t/"hJ!TӟB񥐖U-HO풂G0sdF{ ΀|9]k5dRAgV|!Rܾt9; {|BzJGhC2jz K /F&_ _m P%"ضh:ǩ8䏵~Wc#*p>ɈP Pt;ëp^y-LU}{{ K^o T5$,v,oSWqefZd➿gswL*QX>zOZ1z#M#1_+! Th,\hbB/oX#WrX<^!2mFld}ro&xc^-RIsd>O@)L`'k=>$IIk`۳g hk\M:^mTH-w+1G=$镥5\OpV^m wإ-yz\{J+,p_e~hmnhZଧ [/6nlnm8~rɇm_N,Yp ti%0q:< 9jp̅[)%EFf&'!%Oo.: l{Ra 񘟴Cq60xN% y\Yd}fOw5Rʼ|hW!b__^1o~ ~t\ P:-e0[Fc H.h{dI9 |m(O$JXvNO?CVsIjo@>oK^z=k!Yn?(f_\>/W23;tpq,p f2qSv>v@6nF!eZum6E, F~ňm`0$uF*|W bb|.& Ta ꭒ2J3Jwk 9j4!t "Fόώ[y6ʔ0'@wɗU&3<qwe af)·$]>K,=Wv3uۯQKSrZ? d(dEVrJSu ;7) px3IB7]٧5t۸S!,O&SMHŹ0vLZk3Nx'Ӈ%2(<ۛ71x_1b}5^3YfGK'k؏.a6:$H!3(敽?Yΐ۷eC?:zD t/׫#` "7UN^=f,*2ײCZw=׷us̩ηHcyGQZuYF&6N3{x4b=>uJƝ6aYS{6D_r hYTS' }K*6)UZJYv,sU7'愾v'HV9VC|\25dm7&%#9!FKPuQ!ʬc=IS&=Bln!&<{sJIz=ͭp({JQ(hX8mzZ.mMVm+.mޤ$sVXLTK>]26eujo9}J޽nT"@`@tFVՌur հoXViJF e^ޣKlt;S0zC@11EZf[zDb#Xgv&C)>)gpÄV0 IAIOI0sA#AjmE+S;7 y^ȣ})3=C8Q(AtWCK|J;zюWf4"3/fX*s5?ԯĜL\3CJSnt @׋r~]-ƷځIo_ܒF[t~XʨD=s㟊eYw6k)N%~u8SzF0Y?S?F)ѯW #Aoh$Fo_7k(J}ւKpMC6?.MHCVzA̹bk_ /PAy'pU^l0}d;&3&H V b\)"6`{dk0;4Jc3]@fme,KXb4)4Z'w .CMn?SW{tF@>-)rJɈiazjn%pg\[mԍJ3MM\|:FE/\]ݫT$y'"9XYMzerup")Bt{~ca@;vH0,ljWwY;5È;?M{JrI~$ge-5Tn,473Skܲ;h MYZ|?)ml%N puN A@1ND`PHjƭB5=nTiLwͩ.aAe U zի }X2:D3  1}/s)|DqǍ%乍ϐ*{pXD淲OͿ_b0EODmbQ?ٻ,0?SdK&UKTVoK 0~ fqcԗ 1*IlNfK0|r{/'m[=V2ntnITZP6}5$OKKNr [f_C *, *@2'_ք!VFbxuÚ8Dҏ,ȻE9o.R݉f6TԽs2*ifs_E+G^ŕQ'b9nqBS(=lqS,ԣ ;hC?埿e^돿Ũe-q}B Wuʐ $^[d4V#]$}Bup<[d(AQeeYۇc_s5D(00>&pE ` cL\ԕ7ҏᐨaQzQ ." )5nƫ?=ks1 7ME%%gG>/"hi:(CKdM) -t$4÷cD]o.`/@ w}n9X7gMuUTuJV> QF:x"5"w0y#.b<v3ɦ\bE vIdIh5(eSé2z'-My]dL's3kOq E>s׹{\0L#M25n;}DCxˉSQl6!WJCgFx"WaPK/xkV'bm]ͺE vmjۧRVѪI1PR*#,Hbo @E; JJb@$W`Y-L.9[XͽVc2 K îF0Llw}PXv+p@WlT'!)&h|bcǍaqvqj6G38<6>f#\+~Bw|[Alxgd}2Io"]$Jt=Z+v]ӝ|%i}9M^lʛC% ֝~T'u'đ c%܁ԙ{@7( ⿑OQi 2 9jr4z|m8P+/:~S0Tي:(2F]@ .>EM@#sT1hiJ7tTRYrTzB-jZ"zLبN@sۻL:X^7q]QVyJǐvvNހxTR $3(Б1:OR8o=[E֮$ʋqS1r|-n/I\hXLF ER>J*m$kFA%Nm>yzWL(.J#87WyِO$Qq}6o!$Q?)RXIG|EA{ŭ5-Ly}q(kBH9 [oul.Zp @ne4q8w{GqVÉ1gFV*,r3,tFF$TĔ2ȮO춲'3.vnxO/@?4 >Z}Izgys&-|!iR@cƅ8Bd zp| <u!B"a4r$eroK Wwh=%-ot$LoD)a/*>l bu2p ({[5:T2'SMflv9Abޯ*蔭쏑4WâHfQC2fC#["&E) l =!فFX+ |F}f6ל\Cpe\L3zm@RDV.ǝ~nM)M BVG8gco˦EHQt,>$Q2(o.VHleMő(=H5̈́"LA4;n2aT,3UK)EPgL].چg'+NXo;@~>Y(ؓN#F y;/_/^X:Sύ%Iٖ mI+f{4eßN|%9q⿲&oI`9.@)CJ!13Llp,tg$pSL Ot}1i:9eqK\ &"߭(^zxRtAey.cȆ7%DbAR꠰K?,QiK}}".XaiHEu!\4%KP .`zmY,1(v`* UVsG(7M.UtBeop*w`xPpM_rxPfe3hBua$lFXԦM;qd%bG)T.*;>io b8DqI=,!a^+n6mLja PWX XjTރ*3Ҫ0aU\T #^ڥ?о{B ~ER$w?cáǟ8iqK*=XaY0@1o%FƠ 1L%JEyk{ctFv49e ɯrFq˹Ȍٛvg1CrUb?Lz&K|3/T8liQ4BwlsUjjxECz5ܢl(Rq sr p9~"Va3hI;W¶55"!cߙ0Jh|9mSx瘳y< mg )ߝZtǭ+s<ƕe r5y%eR2Fl >-V=hU[mIk:Y m\Y˅ ցK"]XP)HRFO͝x2[ጿA`?!+(Qt Lq?iڹc3%H8f|I:@ I_;/bmJ-Xm/\6vb'QVrK U{3H,@Ѯ'Ձȋ$QB .V#ƂpOe9]&Cct !:RQ-_' _>"HlJWпqc6e}>/T>#Ti&EŒ]8 ރb}?ZRXj1(jMZ5K]al5@.`;`C>$ƑLA-ߜtdINyZMrM%Wl!0VB}wl[|y' Ng7CN 獔7Zo jĿ:n}'/ Rc[]cA~F?zd {5?YjS +t(U V݋_ÌY..D3'/Nx_FeVOjĨQBE5dvq׫㏪[ʒh%պ\tzN`_;-9~\%-\=jzoأiv lQjQ[> 8ks&`~F~1}3O`qx+5mFZ$  6>ՋQ~mmSa_2&U @I7__8zĐn,{yH.Q6J!̓uU#OGiB-OotT~hD9;[˟\ [o=Y%%HUT wR8 ?XT @7pDI ,mLL-)qoQbۮh߾T\nVRz/}8hYql%cܢNىA(̴rӎN ܓB\U/t;fKqo vA"q(&P^#鸞~ viN$ 5ڌ,ŀq 29+Ee|r`T%2/UrMɠ_ʡLihX}8N#{y &HrndX >ˍz'Cѻfc +49وٙ.#;|qr3kB<Ʈ&AuJf {1jz7+릊6b] ύQh,E-xَ,%]' p ꈔby y0 ^u?sHmk!>31T:!D!$¯ -N4ĿNʎfe]I^C0PR頤 x+7B~J7VL:tU_9r PxJ˖rzr = q ҁpA Iy,S*b;Rcszm`Ů%T+Q\̺bD55t[^3QzҖ';VDHvOxA8U_Nj!HU-jݹ"n4hçk4- <ϤCAԠψ<]=6sq*L͋rhN`C~ e f[5b7i[ˊܙQgy~;:m᥽M4TL%n$3"ea  ,#.'|FA3Nr'Bυ\̷Nau7S93T KQ#Ip%-yi0}A^p`jToCoVL#1P%s+zU{Ц21z4…ոѬŞҐv旂 ԑoe?2GޡyG)Zȓ{X]Ԭu_GaH[nKMOex%sj'@cT:BgR[2)`&lrg1<NE՜;G4HKZS&=G'[4~vCPA̿r!:& ג~ j{s";ϰD<3eҍ,߳}ie8$FZ~y,ڷNЕH*x36-"hԏ?<&̕}&}z#0w=?OVO݄g:RP* ``w4_G^5ah/5 ÿ7(ut)+3/Ą"GvR|t%8B G339=Xv!C%>h=c'ߢc6?-濻yZ^GIl#HsJRAA%Ue1QOO.A/⢯T \_fŧkM8ӝ#A?gA8Yz -,1A3ElKӉiE|zJ@Hf(j7RS6V<`)3uO"k\ a/@!~/ȵ5T*Vf3^8~%lJѤ[뜑3vWA\5/@|3*̥~\u&X.ZUpzbt#l^cVL5pv᥮3 ˄FOv)2ra;D; ]=Ǭ4 Giה5 O'. 0bA2a]M`u0fuݭ#a#h1kO1@JZ,}.0%j8ݖ|Ѵs&[S,7#2pHOJYs/3waϻNCT/Ѓ"R ڿT)s`9jڕ_ ȌR Y=T=՚(0Y'J/X P]|GmV,_'u^89 ݗ^IΝ<|j(IB DHzSO~nRqb?5{ ƼrxᰘԖ~BI 4C!TJz]fDtʶU~NU*bN3q{L 7FfHlQqfJ?R߆ȭD*z.u:N%1p>lL $DžJd?(M46?v tL(;Lޯe᧌MIޠ cD[O#\bS%ɱ3`7w(ӝϸaQ깅:J썤vXi]0f؉0]W¥@(&"1_? cgəLL`'k&vR<_g#0%&hM_ L9v8yOh- YEեF,r)`5X{poc-l>X̬&Ҙ2 Z4ƾb `ɥ7 ۩<сe_ڜigL}+輍@6|xcc_0@+w6+?0SGu9q04sW&ůP!QݝaxԤA]JJ' S/ r <'rHE(o!˿Zje6<QF~X0C6BUIdj$E FP^g ֪0ds eEZd˻]ckkSS('~3B0C⽊M2\͉?UH,@iyϺ{|~~ȻQ6jQ;+Z?ƏG{m2OOZm1 K^}mJ6{6)L3xm7vdNdu4mj, mZ#@OH+J-tk|[z.|)-8kp ªB Y* &)ZN+'}H`ve`bX o!r^" Ȼcs~h7X}Doʀ)p  9 MߧTxO<6Wɑ2uvTVв`R-7 6q (Rvbv8WYhn-W+f,=glDC@Br5R-8Ygb1yֺ7ʑ=G[qwT0r'jW(eDr]r(Gz?3K(oOȜ1)S6˨~<8MP[D ClsW^T'gVq9BPհ_ v؃@(C:C|; QmV4/.XEx2;:[R GO4֕ I10 UQ;c(FaN8cB[Oc+M:"ڏryո?"auڪN GYTqSc4ZSFɃn-/S%RT,.KfChV(,VJȏLjS_-/+քM虆#pGr B:dC$WU3䣉"ks`8dٵ:(u\be$`nacӁF9Zګn|OObZ_eTLӇA j%sկqq;<("`I!ˊ[j Fs?1**oI/}d=:ab`z\w&dyoeDnB! 158R\ҽvPV_!Մ@f'\bM^tQNL J^1Rq5PX\K {WZzEr/?j<=9=\(o0ԨL`ڪS1֟a>dJ@=><Zfļ2(7ӨN+?xMZ󹧒[rlU_#au/Tc;x$ %RO+s?C +]}mΠW}]|i1Z|r򺪓;ju=Ÿ{ӰجXțѾ-ncO12AxL6!4ЍmHgZʐ|,/~i ]1o`&hGЎsc%ŤsJyzhDw\Irz%{aR'ۻ9[wuV޼t{20{(f+G5|?ҕiy'H}3l Dkv1!v1=\dWXL TI`At9/ͨi]VҞ.zoR ;}p*!1(?Ű|0[`뉭J4k[z8M/vAm# 1弮S*wQ  mpo&*Uؘ '#dIhI+*g_:B1*tD8g#%Km\ZyCV,)u[N)P]Fv}2rck3-?1s#@CD{xnwn6˶8 .5 %hN}@Kw Y4F^mJ'.*DQ{f!uŖ~Y,nz52԰ N횴j:I]䤾nRk/hS?ͽ%a7ޣ%/AGks`dth>fS2akpy|`Y"y^aavkAA ?Ыupf-p=я P)?_kr7xi.&Jް*vI]`N24gXr,&ԸF,icNʾl t=DUYG0 ? ) ɰC+,*59ٸ*W+-=Cxp۟7q6id?W+ {#:K9L*I964?g $6ū( J/Nyj Gr X7:^;nVahH?nrhT;HaMCMk}/u̺=ˑdm$1Dc8bOx1 |b@W=/DE1Ӄ*#f Ư̂5|>| ʏ^O?.mmL".%ALz*DJ<\y^_kјlF[}a,D+  jKW2Bλ􁬤Qu~` jMg?'-q^]M$}(eKG,XfjGBhNbKUd`g |Q f: }KSQ+o@ڞÂsOՇQ_j8]IQ6o9lcK~pWÝNP@r%p}Ql# 0@2(:P 5l/vs8ܪBqU e J)rtiʛa-9EGtT$[6áFФBIuOR{mᔈi"*+1;}u\ 3Y#|Z,\8Z.֊t, ڬ#DWV}n !FeN [b,V\nak(gɜrZ;@ ,R*sMɗW@|иo>p}q r 6*Q(k2Xe8'm3B"2 DG Xڈ@Sbt=!8 qyU%itA6(,=CρuѠ*1N*iAx,8%td z^ T۹`Otf%¹3<š+ahVf]䂠'F](tSb1 jQIo,Ln7 5hqʵJ&"2leժy?f.HGzF;j t!XpՋsya?۶4+!GqwJw5b H,HbWH50jJ,+UZ*'B_6-z]qQ%ǃHQDgY]&=}i6o(nmr".+ KTPqMq:WQÊ.z27fU k{5Z\&HyCȸ*5i[A/_4OVS$afSEK$ҲyHdXHrDɱRwHXͰ00&QgOaSqֳA{I"$2D X <9q3!sj˾|$o8 >ԅv#:ԢTp d_8<+j8s[%@c}%7؂MM YAkx ey_5|u3[ۇr$`FTž5vg20mUknWҥ[&?4SZF\*hX #(sU ELC 4U}|{k<-9kT}Vi`l{>XY@c#v?ZlMZy M\oW{fǝN~Szj{)WDO\9#SLsYύx<3f~X81J2 }Z qІ--ַ}p?ԽQ"ϛ1:%dE^*Ў>Ԉ~A[lG=,)]iH CcɫOM#dvq󚽔8dCYc| ԝkΡ%;#CPe%&F i8#ˠEB4Q%i,.maaK ++޵O;ȵMFgS%:6IMELGn#o&.d+op1ŕ yWȿ\_2粘o1oI+5&ߣeJY&r2rU:Yt|;z{Y_ ]eM;(6{ es5)+68\ c9rzzaT=T D3%%#m 97jiu? GHSQ #ȪD7(-ҕ)+ؔED6O3'Ӵ<~_PI}wyVn0V.OG xAbnת0&Ӝ䉠Zx=awً,G>* |uo;mGh9=2b +6q2b:EbO@s/1S7 Nı܁gn㕱H(;k|Ι;hFQ|@TqE"7f96>%gonJgj L.Iۿ3BxR