persistency = $persistency; $this->user = $sqluser; $this->server = $sqlserver . (($port) ? ':' . $port : ''); $this->dbname = $database; $this->sql_layer = 'mysql4'; $this->db_connect_id = ($this->persistency) ? @mysql_pconnect($this->server, $this->user, $sqlpassword) : @mysql_connect($this->server, $this->user, $sqlpassword, $new_link); if ($this->db_connect_id && $this->dbname != '') { if (@mysql_select_db($this->dbname, $this->db_connect_id)) { // Determine what version we are using and if it natively supports UNICODE if (version_compare($this->sql_server_info(true), '4.1.0', '>=')) { @mysql_query("SET NAMES 'utf8'", $this->db_connect_id); // enforce strict mode on databases that support it if (version_compare($this->sql_server_info(true), '5.0.2', '>=')) { $result = @mysql_query('SELECT @@session.sql_mode AS sql_mode', $this->db_connect_id); $row = @mysql_fetch_assoc($result); @mysql_free_result($result); $modes = array_map('trim', explode(',', $row['sql_mode'])); // TRADITIONAL includes STRICT_ALL_TABLES and STRICT_TRANS_TABLES if (!in_array('TRADITIONAL', $modes)) { if (!in_array('STRICT_ALL_TABLES', $modes)) { $modes[] = 'STRICT_ALL_TABLES'; } if (!in_array('STRICT_TRANS_TABLES', $modes)) { $modes[] = 'STRICT_TRANS_TABLES'; } } $mode = implode(',', $modes); @mysql_query("SET SESSION sql_mode='{$mode}'", $this->db_connect_id); } } else if (version_compare($this->sql_server_info(true), '4.0.0', '<')) { $this->sql_layer = 'mysql'; } return $this->db_connect_id; } } return $this->sql_error(''); } /** * Version information about used database * @param bool $raw if true, only return the fetched sql_server_version * @param bool $use_cache If true, it is safe to retrieve the value from the cache * @return string sql server version */ function sql_server_info($raw = false, $use_cache = true) { global $cache; if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mysql_version')) === false) { $result = @mysql_query('SELECT VERSION() AS version', $this->db_connect_id); $row = @mysql_fetch_assoc($result); @mysql_free_result($result); $this->sql_server_version = $row['version']; if (!empty($cache) && $use_cache) { $cache->put('mysql_version', $this->sql_server_version); } } return ($raw) ? $this->sql_server_version : 'MySQL ' . $this->sql_server_version; } /** * {@inheritDoc} */ public function sql_concatenate($expr1, $expr2) { return 'CONCAT(' . $expr1 . ', ' . $expr2 . ')'; } /** * SQL Transaction * @access private */ function _sql_transaction($status = 'begin') { switch ($status) { case 'begin': return @mysql_query('BEGIN', $this->db_connect_id); break; case 'commit': return @mysql_query('COMMIT', $this->db_connect_id); break; case 'rollback': return @mysql_query('ROLLBACK', $this->db_connect_id); break; } return true; } /** * Base query method * * @param string $query Contains the SQL query which shall be executed * @param int $cache_ttl Either 0 to avoid caching or the time in seconds which the result shall be kept in cache * @return mixed When casted to bool the returned value returns true on success and false on failure * * @access public */ function sql_query($query = '', $cache_ttl = 0) { if ($query != '') { global $cache; // EXPLAIN only in extra debug mode if (defined('DEBUG_EXTRA')) { $this->sql_report('start', $query); } $this->query_result = ($cache_ttl) ? $cache->sql_load($query) : false; $this->sql_add_num_queries($this->query_result); if ($this->query_result === false) { if (($this->query_result = @mysql_query($query, $this->db_connect_id)) === false) { $this->sql_error($query); } if (defined('DEBUG_EXTRA')) { $this->sql_report('stop', $query); } if ($cache_ttl) { $this->open_queries[(int) $this->query_result] = $this->query_result; $this->query_result = $cache->sql_save($query, $this->query_result, $cache_ttl); } else if (strpos($query, 'SELECT') === 0 && $this->query_result) { $this->open_queries[(int) $this->query_result] = $this->query_result; } } else if (defined('DEBUG_EXTRA')) { $this->sql_report('fromcache', $query); } } else { return false; } return $this->query_result; } /** * Build LIMIT query */ function _sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0) { $this->query_result = false; // if $total is set to 0 we do not want to limit the number of rows if ($total == 0) { // Having a value of -1 was always a bug $total = '18446744073709551615'; } $query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total); return $this->sql_query($query, $cache_ttl); } /** * Return number of affected rows */ function sql_affectedrows() { return ($this->db_connect_id) ? @mysql_affected_rows($this->db_connect_id) : false; } /** * Fetch current row */ function sql_fetchrow($query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache->sql_exists($query_id)) { return $cache->sql_fetchrow($query_id); } return ($query_id !== false) ? @mysql_fetch_assoc($query_id) : false; } /** * Seek to given row number * rownum is zero-based */ function sql_rowseek($rownum, &$query_id) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache->sql_exists($query_id)) { return $cache->sql_rowseek($rownum, $query_id); } return ($query_id !== false) ? @mysql_data_seek($query_id, $rownum) : false; } /** * Get last inserted id after insert statement */ function sql_nextid() { return ($this->db_connect_id) ? @mysql_insert_id($this->db_connect_id) : false; } /** * Free sql result */ function sql_freeresult($query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache->sql_exists($query_id)) { return $cache->sql_freeresult($query_id); } if (isset($this->open_queries[(int) $query_id])) { unset($this->open_queries[(int) $query_id]); return @mysql_free_result($query_id); } return false; } /** * Escape string used in sql query */ function sql_escape($msg) { if (!$this->db_connect_id) { return @mysql_real_escape_string($msg); } return @mysql_real_escape_string($msg, $this->db_connect_id); } /** * Gets the estimated number of rows in a specified table. * * @param string $table_name Table name * * @return string Number of rows in $table_name. * Prefixed with ~ if estimated (otherwise exact). * * @access public */ function get_estimated_row_count($table_name) { $table_status = $this->get_table_status($table_name); if (isset($table_status['Engine'])) { if ($table_status['Engine'] === 'MyISAM') { return $table_status['Rows']; } else if ($table_status['Engine'] === 'InnoDB' && $table_status['Rows'] > 100000) { return '~' . $table_status['Rows']; } } return parent::get_row_count($table_name); } /** * Gets the exact number of rows in a specified table. * * @param string $table_name Table name * * @return string Exact number of rows in $table_name. * * @access public */ function get_row_count($table_name) { $table_status = $this->get_table_status($table_name); if (isset($table_status['Engine']) && $table_status['Engine'] === 'MyISAM') { return $table_status['Rows']; } return parent::get_row_count($table_name); } /** * Gets some information about the specified table. * * @param string $table_name Table name * * @return array * * @access protected */ function get_table_status($table_name) { $sql = "SHOW TABLE STATUS LIKE '" . $this->sql_escape($table_name) . "'"; $result = $this->sql_query($sql); $table_status = $this->sql_fetchrow($result); $this->sql_freeresult($result); return $table_status; } /** * Build LIKE expression * @access private */ function _sql_like_expression($expression) { return $expression; } /** * Build db-specific query data * @access private */ function _sql_custom_build($stage, $data) { switch ($stage) { case 'FROM': $data = '(' . $data . ')'; break; } return $data; } /** * return sql error array * @access private */ function _sql_error() { if (!$this->db_connect_id) { return array( 'message' => @mysql_error(), 'code' => @mysql_errno() ); } return array( 'message' => @mysql_error($this->db_connect_id), 'code' => @mysql_errno($this->db_connect_id) ); } /** * Close sql connection * @access private */ function _sql_close() { return @mysql_close($this->db_connect_id); } /** * Build db-specific report * @access private */ function _sql_report($mode, $query = '') { static $test_prof; // current detection method, might just switch to see the existance of INFORMATION_SCHEMA.PROFILING if ($test_prof === null) { $test_prof = false; if (version_compare($this->sql_server_info(true), '5.0.37', '>=') && version_compare($this->sql_server_info(true), '5.1', '<')) { $test_prof = true; } } switch ($mode) { case 'start': $explain_query = $query; if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m)) { $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2]; } else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m)) { $explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2]; } if (preg_match('/^SELECT/', $explain_query)) { $html_table = false; // begin profiling if ($test_prof) { @mysql_query('SET profiling = 1;', $this->db_connect_id); } if ($result = @mysql_query("EXPLAIN $explain_query", $this->db_connect_id)) { while ($row = @mysql_fetch_assoc($result)) { $html_table = $this->sql_report('add_select_row', $query, $html_table, $row); } } @mysql_free_result($result); if ($html_table) { $this->html_hold .= ''; } if ($test_prof) { $html_table = false; // get the last profile if ($result = @mysql_query('SHOW PROFILE ALL;', $this->db_connect_id)) { $this->html_hold .= '
'; while ($row = @mysql_fetch_assoc($result)) { // make HTML safe if (!empty($row['Source_function'])) { $row['Source_function'] = str_replace(array('<', '>'), array('<', '>'), $row['Source_function']); } // remove unsupported features foreach ($row as $key => $val) { if ($val === null) { unset($row[$key]); } } $html_table = $this->sql_report('add_select_row', $query, $html_table, $row); } } @mysql_free_result($result); if ($html_table) { $this->html_hold .= ''; } @mysql_query('SET profiling = 0;', $this->db_connect_id); } } break; case 'fromcache': $endtime = explode(' ', microtime()); $endtime = $endtime[0] + $endtime[1]; $result = @mysql_query($query, $this->db_connect_id); while ($void = @mysql_fetch_assoc($result)) { // Take the time spent on parsing rows into account } @mysql_free_result($result); $splittime = explode(' ', microtime()); $splittime = $splittime[0] + $splittime[1]; $this->sql_report('record_fromcache', $query, $endtime, $splittime); break; } } } ^ݑMk|=@qͶS$w|d#6(A~ ΁Ok14kU4!Ζ7xV^3n!N\W ; ַۼ0'qBY4DCES=,øx-:+y'YW.,62ߜ@Rj,S"1LxZ}} ;i TCvXWTrknQ?l;ڒ /8 SmƑzubW|r(^N 9U<Ƭ`[ yQ 4u}yYqLؐmyº+7h)y;Z4 e*T^& tWeW!\R7sh z"jkZ,&(0sȂ'o#@DY^p32ǸY;GJRu :=gi!|Gg*{, cus ^YHz.--4$pc:Q(QDf8Q(NSj*: C!,:*vN3JA᧟w3{\ %lӨI!B5N|`6=A_zȊ^ ͉ze #4#P?N)-4f[wUSP܂X!yG[kGTecb0 QI>|PU G[ADÚ9xXm]"B9L 0 i 5nM`[smS*2eYsZ<(rOΜ.*)'&(Gi_t)Bd^`` /̚R( D'uǀG&۩,+~їlڸv瓮-Wx\j6NM2᠞g0 rUMMq_ A`ޘ*<76R%tcӲ4zl$p|ח"m5㚚<z!TB̏ZZG:mT[e fӮoM{ ˈtZ;rHA+@gI2dwփf`5~KOv d(9.^b$n>`{x:(~Y?⇰Xwܔ-Nd>`t2yd]bȼ/%Y_[3$KcVlb,'H6ioĎlJ*I;%26>rIdJzq'eA)wW{B_(Y6VZTb]Tq% ռN
  • YV`Fcv|2Ɖbvd.~sl/5l?Rth=ۡȺ73aD1Io SjJ ,aWQwۗAϳnѯ뤠PE'SRdeh/7 hn# b rg%~ÚlJ-TȢzۍ%Xp$Ҙ%r^B;L,6hoVN"S{X&[kWk#7q'ê8įd'[i^2g.єì{x8z?j`NIKv}ixy:}i3>9-^I@$+g98ō6 nV6Qqg2D%jVך)WO(9{"gׅ}c*HI)BzY:$u/I5.Hci`>ƩJ0^qW>(cXoNq|¤7;^ul~Xf8{Q.4 ]T\03EOQz:}j AZO=(QvU&T==}j!26*KKYYy8|70үt&^=4yvmmU4׫<򛧖CI ]osg}$ݴ6XDŽX_(] H0m 8&bފ~L:95eO=˕ݬ*QrRS/_"vh-:t@.>8a?iwRDL`Ͽ6YRTDunaCvۓ릘U[9 0?< +k. snJ]9UN+dF =@$ ~fIE2Ed?5aV_L"6ރ,i[Ls-}v-䞛X7#.8~VEouit'qpߴV47+Oŭl ]H.pL1H}lxlzP;cgF*lnsqx|^ D@J,ТVWpu ,祕y@*5CĻQKQkxHH(i!ٯPtsN;1pc]=˷-ҲNy`d>M{2%?֊vU,@)"JILZWla#g'}%|#JLs)$z(R *DDÃFnKK(E(9&.cEh As]%W7YL8R'%Ym #lפ9kcF#e,7t1`K^s7ݵD|ѱ[nJsȉt_gЍoh'Zbٷٛl4>$/` wr&8J1HNQAcMVJ9JnxG`0݋ #;jqO[a r5p̶dRkoDaZh+O!/_JzMA!08UaNHfniLm|%r5m+ӐHۿżoИޗ\l`x BF㡊cgKFqֻQLɇlHv٭;QcR{ /ݡ{ znS上@U:Zs\rgQY-՘"%s$oBm,a^H !E>9[ Oo4KOع-TC\/o!$w&X]$k XJ'-꩕t_:&Q{ynv#hlY!_Ýʨ;-F^SxjWrCx65a ژ vy"xkvo1A?`} XGmSPNkė߭0 G>=ó\`\%nbvЧQϜqa Ȃ [؋ϋ6bdUh#29|^om1I}>%NcXq8 |v ϯ>kMU_ƞIف!Fgpñ3`0r Ne~ԽPw'ZVSU B~ ve >vq޹3MC?Yg՚I>^Kέ=\ۯBُIt@r!V$qhcÈY𸋅ii SFհռ0C&RfޠEof~l-V >#^%!V]uX 3. TVK{ AoMwt)A?>j .Φ`$ܰ捻Enw15It tSYrny2B;j>Va7;͗#Q[ c@e; -#4;~m=4 $߆mwav yl:jV_yg<;NE%} rGpݺϭ\]IP 2ݒg1KY=;*KڜቭgjQS2s![Fq ۑSAJH~2o͎KĬfh=嫏^`rĸ*:6g61waO\w^0͂ ِ  6ET[=uT#l ]Rms{͞vSؽkdG2-yW@t9{DcBT v<"#Y )6]4eH+}|DxW =5KcM:4G_xQ$ ޶" V27N y)lv5hLYUOVl070Ky۠(^hT,{ѼHwA(mz*1A;$7>b/&&̄^p#̫(8 <"@]ޫƖ&dMevR:XΔβdC6q7dfY^c%.|‹vH f&"\9yw%0oqbq:k3lDMX]#"lGb1 Y5qzl\!v+?p+[-TqI|bp9vYeY3.#%BW%{``:䄒 }(e^L%B!u*$J<茊LLişC* Id-Rܣ@H%X*P(ª\-"8ɇiRo6m.A<֝*&}Y*%VthsZ e* wO8m¬+Dr1'|H*őT5*+$]f֙M;p0 ,>V)n8s3P ]D*:eTJi(գ4f83fi)Z^镠m~zvOc"趖ړ{Kĝ+B&9 B>PCt{vFJQxO )eS8XaVgIQ֣r֟z`g)zכy _g}y7hDV ΛE*@w '#7CT1Ï:QҸ$C.xrܓ }Br|sO ,P྘n*WmgIUx3H`/軟$΂sبK J"$r\\[{"W  Pɘ+f$zWU3۫L¢cDI\s 7P1\㹱Y3k5-̟,˽0Bf ߂kPl^;DU" ³TT-݃5G^@UY)vXУÒ53C*m?gdV}I7hVrv+[n~eMxtK[<6(>`ä+R%{sO0ȗɒys nRt~Ms#TJ(%5 J-.Mqg3"Hx;`MUD]5ip7 (4 {]+r K5(T+L_r<\+sV^b7M:湑{BP"|Cbnǃ)MO`6F\ْEw{G`oz2@SP-:hon@hhZƬ' ,WrQ zXb l ! SG_t~0~` Ä=F;Te]U 25E] TMP dj̡۪7xMM\plo{m`Se`z0 8;i}Zl}p ̋*!Ws0)ayDl`yVW*{tpv}#RɱE̖ºӂ̳ʃLr'!9 ٝ5${Aϖʯ.nF ~^Y5 dD ϕIWϭYNǺkQhEV2WkH)tk2e}fFt?[/ ER3_k$̜kٛR/ڵR?cBPh[oEٹ00 `BMIjj4ں~.I#,i8#7'O"sC>3|{h}f[LUQYFYR7yNER_&nI/D2G T,zg\Qt#nԙpQ))1sh ܈k7!FذDAW(ĶIL}٣j!v„<*X&B68R=lw?+H`4dL8$lk 'o9,Lu:7=m3 BDjѴ^a传uJ/(c:ү9pBY1$CYyq o]VjZ#'&uz-dШl%X& UQqc%.*n$s wG'ŜabÚf ]A ObEQjho2 啭;qQeM|g&U\Aݚ!Io̜PhK_JYuωV(YnO uє]D0Sy+N|>ь ѿº B6h {p )hg >JLdbDmsSGC =cae VUx T8xV!\X}ϡ..|#-WkZMn^L O@?|&)äcxdU3S^`_Q;Uu&xK_X=)-)Xd> F^(RJ[ 4aiΧ#IN}fO/WpLHE_0w 0tY! ٚ܎P:@y"!S-+(h\lτtݫW0YBwы9 Th\ 0|"aٽ`2}납c|wb"L#^9sR6ѳahw<2&`*1WagKҥ!+#Ttۺ4a`kOrV!S 7,YY$iLpTW0qqLa46"~~,vY)*5\Jv+)6 p{V{=8UƋ<È^/٤1#<ou}#C|ǟ(m] ,{:rlT}la߁CP'Rw'QRxO*w7rs惜ii^f:S@YfŽzV»wGsMCj&S8BE.u)I͗BWB4^++ gK&5`pPL+W[zV+)[p1 Y{G*/2]mZ< ='7SVVRwC-E“ %$F8}g;(;z,krySJ:?P+TC A"x?aHG*Q3AvINS|0tn/Z죚~en'l>a"ov0;^3BmN!S_$?iVGbu4{K5OX0=ƭ߃k\ ?K1;Q0.}ޭXިHcxʩlhM'G5X=yFFnJ?ߝ2ŐآA"!?ذ|u. y%8!GփVH{!gDui2T'ybiجKbƃFC \b|{VAM,ж@l B}6#nݕI5B^ȒV _X%]S8OM?0VjP ۋ)®_jŁ]d X`>6?9],H6WkϢ|?W/u! (q֧?{w~tc;_`Uӣ4CcEoNJAN%@ u3pA.\݊L'Q yC! |BY I*֬WJWjqF͠%B8)2 ݨ&BA;!L+(ѯxۃjM%%T <|!$E̻^!mD"5s# ok@TUFIvk鱈QpH}Nc=ο_]ĵ|Uot?^#!}Y%HDg | !l?< n[LtM-ӏƑpt& l4# nRQ̊2GcTњN.`  MNrJ"0u1TUVjG4DG}g #A}9ߚ +fTd0a? W܃?FkRa $Q V[mYw$0d-`|vzEzm_}eDw_,ߤ&s@[BMT:DA\>~5m0PcDF׳_omk B9 B@]q"USls}u |\u!P`.]',~+Pyga!+C(~x(}JOflA$ [Ƭ@}N=m`1|#^$[ݧIcD_ 8(T}hoa !N't@{ͥRUYmْ$FjYă 8i]Bp [m%#xCQ/7{t &Z-#c Q$Y#`IZU%"r݆p3Y,⒮j8 GWAN2l?}'WQAGXqې,@LZ7vR0fN$>Ǻp/K9߁ CXw5Qf+pJPx8S#9ǦE8Q""65g}R %7_K?CIodſ.{ߟ<fnPd{AKLQ;뻌<bk =N͓B0*o|h&F߅y, =V.7gVHz NƟv8> rRlJEt!%(;#9;xZO[Ӡ/@UrqRQ^fQP~~ƙp9ǁ/$Tԁ7"WXysܑ۽_,!-9MNJI!EGcץzf5&T۬1s֘vSέT}-E(s!(@^%I55:2iG֥"7| }q.wdcvᷚS%Fb,ז2֑EȮlט u%YRi}hR/P>!EǪqT#1&~LDiQهfjxց d=X5 xEz&z[\Z8Chenh=AIصGhiis7y68{:;ocBu.5fwX ]ZwJDa{H_㮊ԺЭnJO\Gks- tu\Z8Fp>|Ah3jRZ.FAmhq26{\ -fL޷:).pkdTqim XC߽H4ܼ6mu gw8Q =mH+y}lUFV2M)7:ȟ@.NG["AF]l'ʐ&;*Z4'leUX%Qk."-U<+Z5%x}Qnpa|jGq~yg$5ݐQ^$w^X؂\-0l3h88gL : $Y\$v`%HI ϯPTd{I[ӑuo<čZH}aDh+01l*o@>^,)w܅ v% 4~tΦ8!6`q8feυy^36yXD*]`n:ѻ$6 [`xG#@v YPshr|q>(և8He<#kt3 :|eO'->=q3jSyDm?:->ɒ^zȻъ~h=e4mS{|JAWQF/{tlqwZ%?nRɺ5q~(uzk.n R7ܐ)fe8-&e˓~"~:bV *5#QaMhqy)'Z2@ɕHQ'~ T iVVB!X_|G u 5eɢM+7-z,t7ԭo0 |k~!kXRHHLj f&9S˕-5@~p %A sF%sLHr` S#ˬHIKڤ a+P]p3}}ԁ#sv Y[/z4 c+`a0#pxO i.IchmC ~FTst= FwF)y$R(E^ D]tPIwm0F ?^NO.ABiΗi,jI5HXrKnvHO>o0 4o|5*Hk?qIX2 )Dڼѓ~;ՅE>,ʝaWNDC;#C07'{NJ\R8Cs.&GeO!˿,lN7 @n_PR8a/?_;@lGZre[zv[|Huw XOMha\0ZnbȰAzqTpI1x([%&~4ŒךOtPr(G$igeps5='eKOX mrO^ X%jq5_R8r:8n[=I/oY ({`CڤRLd.|n 9_;S|G7a} Nq ('Nu_vM\PB v;N!e#:#CL3\Ps6%ϩPBFn-d[%A|y*IX&{(Ex4糖S 6_>?Vm 0\Gvd#}Ҧ؝͐)Y6H<܋r/*4ű%*~$$`- @G֩mKvV7:M/_OSRs:+gG9.a3Hm~s+Nԥ0Ot z@=@ǰ{7|q: =$tkT;l4\w^ߺ[UƉY^nwW^dOgH3}y}7Q ٵWVG4ɶR)E*d+0upĔ+/ٙ6jX1DO8&qHqku dlӞA#G :Dft<I'yu<`ލ}\~] W-}nG>k:@{CwGeꯜ! ݵO@=ܼ7d @ oK|xǔGR˷|C }F0߰K6CiS\2僫l<|%m~~\*[B;Տ؀k{4es#ByRbhH]y).#I֮1JQcYl6W Q~!$dҾP tԖgi&(0;Hǡm}3,q6XrkC7o4ԛkJT8d&¿ D>L5C.8IB$:lP.3XIŒ虑3e~_b N.i"!ǝn} Xس>,Q,̥'r|@Uሰ<`Ε) I" 5qowF|2Qʓ]pɻDX'yxzAa[ɯؕx_n҄ۊ'ݶUTQFȎ$s2%ߗo@m$De]T.a<̏:?q]f;' CW;ӆKMTށrͿ$hL.#a)ox`eD!33 =|Ne-(t 4@0"Lh!@P–Vτ [0'}ƕW9*&dQ;k+1eUYFHȿ֥L2NbuA+)NA! +Y4;E* u|FYC9Fk/~= r KU]=7E.n޹.l9n0夀b $-KCZ߭ydTs1]g,WxSH+d'z_}%rXb]tE߬ \nٖʹHNk_τD|LͲE:_KyZeFSO3Ξ~t䔢~W^\|v̜l"!: hL8ɔxNҺgJ{;,QWCeCIo~of𛞒AØ1쎝E 0j$Epj+Crxs)' c΃M7G[g-BM^r-;MtBIWc pPIkS\>H֡Mnp:|eSHlas۲juD~AX{CTr^$߻Ws= >/.ˈ\îۨ4^K%zz]6{nQٺlr2#4O~F:O h8~&LxW`|GW"l,~)<twSgHa4mR_bqC9Ӣњȁl2p]1d)zkS&&#,MWd-tg5-YWd㬈jraE9E#4>SOS8V $?C|e-B 0yfً_%TiK$q2}2*g\*4.*ܹQ, T9$c˟ez&=*v(nytCٴ '^^| ۠5W#_9al%4Ėn~΅V]aFj@ B\~j!yX<(DO$r] T^\X?Bg7tvc >ڪhт`֫lv txZ`~q+‚"{U1+1ns^4'֓|ޟ kjPc0Ԅ]mp!(;$B<^LGzBMw:h *Vkx>Աö-Nif#0K5A댈.~P,[ml7,nCsͿj.z]evk ȶ6;y; ,lwz󞨱[Է:dH?pA~.%-~Aٞ5Ř'ꨯ5tb-ns-?Jha E&TɄS!}I-m׈ `4?3{JLi I`ꂀD2U*E2% |jqk1&tw;P_YX8QMԉ &p]WF%e׀? )PKāZc9϶=Iiq#<3GXƂȕ6bJ=oX&00_I/3.iAfEvBLBPDO8FOZҒqO룏@ո'{`"iS:`Mqu 3q/+53!o׭C(ŏ  xz -=bU+>Y0TB$i#i Cw[Ǽ#BQ̾HG $FW[3 )FvXf{q%W|~V%r| v3wb',VNj2̀ϰO;CwQp[P=_ { h]w".OfBr+e!{@gɿߛKXݩ$\s4IHl}u{OˁR VHQH# $),,̂ Yn\ޖdzvûdY}R q@ #Ğ/vyŅ|(7nfo;A&A=وKd67Ҋt*vYʕXؗK`Y)%nlF%n c(e[RK u=Tq!Ҥ'aCD4-%:VLm+yp8rȷ 1|[^ߴ/p+(vfDGMՊcsvʝ+q ?:+ku=7Wk#W =RHmcZBfŨ-iK4« c&䬚!|aG,PB ۾k!uD& "n1EaLf_cu @S]+Te*h@lNm}Ì$q$c$bUtAŸ Řt4u[IP܄. v03hFh5pϞ{  {!g#QBgDZ|flh.SSdaz~7,+V9:(A]a|+|s}mD#:6T 1Ij3kL@ |b;H%(if1$Cpq b\!cR]i7>hFW{)wmixk) 9Sa@Џݮ Q&mDuFmTQ d?G"VEGZz#K[F72$N3#n\vΑM->` O r襧|]01\xBX{<=/mgQQZPZ 뛌Rt 9p B2mu j;hzIdD-&D,=JSB Q8%W{ Xr@TuzJ=/jsO8 {/3aw&HՔ;$QH+1bm [nڨ^,/| H S{\ežX+b&uUT,҂^BS 䄂6AB#h sH&_O+z%L|GL;_?B1y(;Jn"[O(k i>( Lԇ:*3y<(}ٶ EFZκY7zhѵQE<":KddcR|93:%n[7 *󙎃8md]hg|Z?ҬZ@ wx]=^k#i:|莙 d8aO\ˮIHV_(ü=~0!2z >6;nVY* 6i\'lPq 8KZч^qŨ!c#Z]6ۨ ?w']`7=&1*4k6Juܯ O儿6Zzm4M0$T~prw~YhZdjߞnƠ%|r쵼KyVAD{B<Ɨ!s *;^oT1pHLQFsIXÁ)KE̤'#&܏t|Ǧo?u._#p|?F(Pd²;>g^Hߕbε4jH]*mGo Va`+Hf'{&SҶ ^jP뢝 w_ 6_`6eɏi3bTV"if l;01iT6l/;7tkG7ŠZl$-B9p0f;|Ɖ>i:ͿE{CZ~L,̟8ᄆCフ-l=}bPww,B?j$ed o=A9DgYjCM;NhuB8\Я"KO$Ҝ)&ܶb&|5RLN%持l!@cQb [arJcW8j1a}Nȥ8o~h c2A S^3L xJSBghx]xCKP -&r U  Jp[y`F ggds|?%aX %QRv~]Ӕ7ɾNΘo ؍da vv'OmQIIƥ^% 0dbuabģ8#T\ !NEQy_S ˀT!6^ pR"7?Q&8mYgKU#H+AXCK+E{oYy6=ʅ!ieQcT@FJ@R#2B7P(N_s>\ӭX5  3%$N,J`5Y;cvh^1|it7[i,4|*HFBrbLiK0>z"?ao \!ӤY&?|]GԔslbDRGT4{:(7{6~"=`>ee 2Y=dP֢ۨER'Jď~PwӉu+RůxMPJ -b[ʌv'W~6n̅K+tvp$FWћsgp匡r,(| Ņ: yUCm>oKE"sMMM_ƀwi[p |?'M?ۛ2_,犕},\qwSgMOoԀƋnA_J$VNK%sC+Vn K&%ƽgh$HY­VPVr~wɮPCxڮlN(l(QH98?N5^|Tǟݜ 3Aj5Y=EzaP%K޻fݓ\0݂Q8!0dd[~J@^@CN;onҒL#F.<"{@n?>x)ӻyJۀ1A)YZ͑|ndC!߉M`ڽ[^imݲ^1L ZJF-Gy_:1Y}KC 59Zr^ VauLzC/./n!8Km8 WWfS\3 iFB@H WZTrķe}U(2!&?bn>aapN /YH$T:Eڬ?$nM? ۝Gh!qs>#r S |"J͸ gmYS7< ۷x z?j#σP_O#|L#SIh؂qdc $Yѯ_&&߷m_%}ZsǒXn6 e](R*a6%QazȪQny:ƢH֫<.Ԗ+3%O"IiwhcƼ^?i^';⊥_jՓ-ڝn "CeXHHmKfx3D={_qx:J(q-ITP_bi @TMQpsYGej"4@ V􉖠, <Ub$~& o\iZ:iuଜQ"c sG=1CSSSw I@(aX$ԟVztq15w>bg+@l`?{h85+ %m~?yOQItz6cXl=c,^mMPX^Bɑ66=,\wl=󭒍sCMdT)[$6h91 ԥG{PCw1J| R.ekC^bB&b>>#SK1$0ԏ}X4}]S **%p%7< $s?f>Sr^gu4ɭ-tA:b*d&# #FPZP^0-!h*zɻdOZ@(_4 PXa(jկLE2HuyQ2~E֓:b啽f6Pe*;kGh^| "SPUIsm\[0=&nԥMjci.O^4M5 ӤWmoEc9KnWdpriM3ؒfNo *(&(x/E Nb~c[ÙlI[;Z}9(wޞ!}Nm`g6^/B/@()Nnlb7uـXysc-9:+pT̓$mNhvAŷE4Mc!TbQ{Εm165( \eI9v6r$s|'/ԶyY^:r<*Bj=J >g1)] +Ry3{d%T^MG_&? )܆^V#L[>#'B{z :׵\UU| e@6 ۨJ2<`5&qJbʗ MxA*])*!犜LEm26N&n+\HZ?;v}f.Vݓc]d^[f #rbBaI_.fN׬4Ėr Ƅ],yD,KRX./U*k3<l/=`qW M3} 9!Ft#RԅZ"rG}6\66eǑIksXrCξЯG;XxN-H0; 0{1MΧ]+iN3_?0<@"Y[22;siFyYS0Ǩғ5kvVypҒXFX=<:\m =WWml:8lޓgRD 莤_p!& .3`{Di>S@kk1 }` E) gԿaɐasU!3l6P +=FPA w9,ѦQ3 럕!([7J~7Bv6CťA K+xyNu /pR_yAɩ8Ddm +,ῨzE5\w{ÅMWrбT$Y[1Gs'K C)ooݽV]}uH@#n̴=@ǭ@*(cܱ)zG`7ZY(|aBb&ȼ v0x` ;4Em- \o󰻴d&~+~S&.aYH-zڼe6fIskok[ 2I7/¢;J1t_9jrHZioC Gx=Yn}|Ϳ2u1@]b7,@Xz^T=Y2$iJ9TKR l{Z/VAwՀT%7x%Cc iEKU<Ľ9P\;EWͿ= 㡐.v'%@q<'D&(m :=9ΜOl(Y>uo)[\w?qpM߸ )C쎁P2X*3-;ƒd|=[肖T"P%]F]@NFѷ:<~lݻw nHK;ن(. 6ejv V+/zi%؀b6~KQCue ca ѝZL~x̺ KotZQ}/pU%c"s"lh(Ӻ:.~()#^59ۮgrNk ГU-@Цr[>>15K1ͮO7/c`X)*8{Z@⇚mYW8B QB5dP]J{qzwU%.!ص~khEiJVj-qA0PSF=X *Dr| c>.J&{츯^ EJyЊ4FשNgU#"@?AAb<)ܿBzfK9uo ;"Qh%#O}M_YxD`?_TdF#jN叓ёVpC@5r;Ğ"ڽUUDz862F A@ 5`lk}\1FU"elF8j d.6a;x"+P K%ђ(8ƚy-7>Oo4/ NdAAQTu, ]tW+n7&7k0 湦s8Q@~d%Ph8[?:7o ӯŸrpIV'+6d%|ݯw*/PČ0sxJN>SwSf@)gCx= YKwrkh #>qo":+t u w xYID'ՙ}ZH&tGŔ'dSw5\|?]„4e*(_E!d&9cyL/a1V6KY6]|Ƒ[P\ɍNeI"daʼ(:ȥ60) Hy*"cR_JB[li;j$@QAtpΝN>|Lp?gg1-pI@8|,:|F>YW4aj}G5-S߸otL@䱌JU)[ 4m '.x 7A'-ȥLowN&F΅J:bd3?vCq@y!r+ϴ(Ȅwuv" b 9l{wR?hrIIE,k=6ΣZ'{@t',܍{ lK?ѫG͜:J~wPhN\6Pzb]<[aSx_̦[0Q@SK\=X6I:շ"CU84qsԱI޺Ywۑ"v/aN= ly` zz"@ƓRx'],n_"pG\胏,gb=~H?nQt}2Rq铪Kd6ަFN mBss+":2N,To*z653brPɛw#cgM,E䭛 o<q,QJ#fƷUL $,"=h;*TCfu}5.ۖ 8D?XK5qP]@@*r&[}T`[iSwt*Dd .Y$0Z<5 tv mǘ| ɬ;)ר AQjnfnqs\J.'ssBO\ Te]wҝuOe?~iKt/*)ykփb闝ZboMYd5sU#o^mjtE( 0jϜEF], zc.]X?zŴ.+z܇ *ؓP-VR'FxU&߄.DGrCc}ǝT3voe6j3u>\rX[d?6rќOe_Af[fO=~!Z >>\["-a%sq'~z~hd:P ,&%%^ ilX+N[{*jAq1vBF Y۫2^'3&D܍kw sT=mMHֱ˩rUD$ҊH'sW&ulF"1.nNG t8"[kvَI]9j_C M!hxmQ_Qe0G 滰u3L7 w7!9XN0YO>PJxbH, Rǀ_E$C)96~',|4*Y;-:dJk ḾBYsM(`HhRb+Ufw9˪E _/nxs &(k,d>=gV Qx>~4\:<(s30gDynx^[YMzT*̋.pK&{U #WԹ~6L>\=\QB|)9F/Snߎa{DzU|d(VĤoYIu&K1[\ _0̷l(w`,EgeFO& Hp節]v{'Ϩ1z`JV#aY^́""ul$Zib C3etESxnU%M:*j7+ Z||tߞMo| baGk-fŬk. 퉓Hz$pVtLA_6r:o;s [g^ j_ǭ`JF/.mx+d1#dy/mԚLkMM~{"S dLh4YӉ=&C]"3lLK?oޟJj7'AKfTը; `Ϝ/+_&KJU֠!k>n,b~pSCAB]rkF!wPSԔ3 7{zדGq PfuN>Ko9,iCW{_AP( <"E',B?ǽ,L[hFFla,H08xE'RSwvFosu-5f^ÍTbdśp2@a#͛{'Ji1rׁ̪B<2,A8zmzXhEbDH]fM"!33Hy'(=u<>K׿PKb/D 3TLiQefE]?-s@9\ݳ [X=fI sO6:g4mտ=9WabDWaY:mmDswX -\@а݆h ^ Í^%! 4X# \SE]&CAG `?'vgTE4 )BF[uwܛKPRnB- r3j0zi,qȂr>K(َǒUsk̓fxb*C/,LUÃvܐpô=Ȯ[K;O%/<4:{fEW,:ZB"~%qFN샸>lEl2gid7l&AG2%/0W3o1V|xݴcv M3/Y&B9${Ő4h1ϮJW& ހ/T#eERǪ"7^q3`:0֊>uW*)J *VGʹNzmn4c5l|0~7c֏Oڥ1|pj? ߗ!g9uy˵P ~@p O'[v< ja#޳"?Y ( 8x>mtŽl]|"c+vGI: ߮/nwS Iu_btJei=IFBD;0;n*t::ƃ"ܖ |ߟ;:S0QX4 6f,ih8׍#kIw;h8SSo`[y*4ks^mn_ &/ Lގ(fXX,Z) +2Tb XL$9ǹ2Ox#I?;} QuiO/c ̮1a~m"sh61A\(y8hR~vB%©S+׆bZF = *SuJE)^ؿkUQ*QA9)kȾ%-1< _D6Rʹ،Sît,k2D V|q 'Y)ˈ.d_?.f$FS^*;3䊒O'BE۳DvaCt!ܾxݹ/ŷD2HhdSB`tWNIV3icg7pYw~7tVlE9! E|Ĭ Zp_1S)TqSV3_^H?D7@^k~ >ϩ%I3Kw0$mPi7*ɂ=?G2'g {`OB k5wA4X3]\ y^(Ojha ?&֘7yf-Uik3$+/N'1 8J(gԫX.eݧpX|׺?Wq}M/<r" }@p*ERpV#KrEԱ[1H."< ~7?¾;/I|\/j]1!_Wt}}.(Dy/VAx"#B{3[FS\pUH[pZD!Au0uB*eq!MiU檶52f!n-Y'|#5w*;!L8ӄ62d# bXJGƸl7LGblrawII%`TéAwi);~IAzl-Mf,;Syl1 Ď2.(i=~LGC7)4k0'|Q/N~JkJ% !9"' ݩ·j3X@/ɱGջX3oF&Eb1M/MY˻y+mT=9xxE.Ts " +̍.$n.Cs^MO~[{T69*)9ڤx ۳I:X kP݋[ވ/F| \.LKǶ`KGQv&2׸~kG8w7?L6%{y"OT5;W):q$(XX:JfM'w\.nRTd^9l&#({I1m;~,B =~3,o6FE Q(:5!qHsݢrڟ;<Y;?TOOP8-揘U5;gF[LD@6Y7Z-'iPN_rUdEljWjlshlEa/؞V^מbwU eF{^urɑ=>#3租C Z_vv-:cPºC 1!>tDZ"gnQD pb,N^tŸ }kr00z܀Vq: :?\2!Fx,ã]|4u DOqo$BJbuMe[Oc9T>R- PPvf+‡vX^qZ#M:eKPBN>h:.$/M| 6'@ j7#Fƞr *k% ⎴&x gj;װq(m O;!H@YṯZ`iȝz(3ʒ}1󂠺xYL_n&`fae%Ȉ4C:c;3"NƘ`3D$P`ób2rQR60bGU&Ͳ)YdXK=v=?řIPE~aW9'-"+>Hf%)qzI^$K:zwVvQ8%[gj؟a<>A-/Y&\ {.4 ;Tq{!$H1+q^,EiqV )M@G49v̅[@3ũ eFZYwO4M O;XMzx"M6bYK%gauV w҇v kW JBNt~.|=]tzB WlW'fGYaB٘l" &nxá%4 +ikyK d[ xkyjݜnHɎ%62inGrt#9f)Ȓc6=_Aʇ V+&A8vיaCo hQZ8}EY c.dPvms؍"%{kE/m@v5u Eac:djBw=֤uY&ذjZd2BjEf;uګL%+)|v+).Lr:CIl݇u"ne{ߴVl&mEkm'8. ؅rM0j%%Tf2$ҍ{)j~M1Th$ Wؤ\ine)[$Ifph}EWr -EhU淾Hc7ZChcub쾀Z`K쭀0R1IA.NYSM:0d zsx0搠 gEft>|p-ZdYJ `gEyz_1)d;bE0w4%֘YSoZ$3Zi _a.dUƭ9Ki@{»>(55*gta@UG@;tu6iԄ'9.\+<])jd">&,9]\k kX,o3>% ҔmJ`eeR?UI*E۪[|?fh(@tJ}HvCL5KUFsHd]PYb H8k WO5 Z={MFȌ̠T~~h+4ògֱwў;4Oz[]!i]&creЪ`N]QK>SxlwŐ RY*VwMT}[RkjYf v"rƮM S@Mɔ~w\,6c$15 @/vK+cM r{Yj%$yhvh\e Spw+^m攈(>tmW3Fw&z:[1g77̏V{Jp3Q7piѾp2€ɦSRfAylij;ːc'gy=nRz?ifYiFJwB8L Y2O,-iV<ưnsДEH~MI@&+ҡ-݉7f&m!;; ~&Ekk*!9z%1y%)ֲf>XZ,رrxEY\rbd:f%9=٫5Xcv?lNGN0 ́Ԧ)&y銻F(90yY:>}dFnL36[^~\^CtK md~' VNmdk,Э\cogƴ(ÝI$7 @,=a+ `eBVυ3C*+![P/"nߘH鰷Hi| xf!9 dop<̇UZ(il4oB?de%if.wCq7Kϳ_sE v>%۳~xfjCTMѻ*Cc[@=Q3>4v|It {߳+@(Er.͖bEfJA 3)Zk s^7fOw0-JQN!w~uI봘ދ߸GW|tXL̊x}ݔwgj1i {噷ȫweKOCΉJQ!|W:^qq AR{N^_3D>o3?͟ŰE /Dj#pYuis݄% >U]R;I1k"e3ӕ#Ч3L8b w 3 O.P؊<[ WGBd[OFůGo)sq#3-^PK9)_:kV\^XĢqu3X}/X\ TF Ӵ`RKٽvk"rM`ᶨRI Lإ?tn1Mt:ln*A)+}%x$ ڙ}^1m^HhłT`?Y;"Yr(Ӻ=JU5zy d+\-bniv R3R>P8@&`;)373,? xQP=SGd>΋k.FC+4`_w.JU(j&pba;tkaJb&4G~?"l1L|S 1pj_&ŀd_fZ pPvd~:xr<"$; !ڲzI.nF=PW&['D~=7AHe㚈_TDkI^ %7~>#(M@ށs Bt7ګHWU,E(kAҢ>>+u]J'J0%RPXMUDY*A/OѐM;|ԟSsQ|76*[N