connect_error = 'mssql_connect function does not exist, is mssql extension installed?'; return $this->sql_error(''); } $this->persistency = $persistency; $this->user = $sqluser; $this->dbname = $database; $port_delimiter = (defined('PHP_OS') && substr(PHP_OS, 0, 3) === 'WIN') ? ',' : ':'; $this->server = $sqlserver . (($port) ? $port_delimiter . $port : ''); @ini_set('mssql.charset', 'UTF-8'); @ini_set('mssql.textlimit', 2147483647); @ini_set('mssql.textsize', 2147483647); $this->db_connect_id = ($this->persistency) ? @mssql_pconnect($this->server, $this->user, $sqlpassword, $new_link) : @mssql_connect($this->server, $this->user, $sqlpassword, $new_link); if ($this->db_connect_id && $this->dbname != '') { if (!@mssql_select_db($this->dbname, $this->db_connect_id)) { @mssql_close($this->db_connect_id); return false; } } return ($this->db_connect_id) ? $this->db_connect_id : $this->sql_error(''); } /** * {@inheritDoc} */ function sql_server_info($raw = false, $use_cache = true) { global $cache; if (!$use_cache || empty($cache) || ($this->sql_server_version = $cache->get('mssql_version')) === false) { $result_id = @mssql_query("SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY('productlevel'), SERVERPROPERTY('edition')", $this->db_connect_id); $row = false; if ($result_id) { $row = @mssql_fetch_assoc($result_id); @mssql_free_result($result_id); } $this->sql_server_version = ($row) ? trim(implode(' ', $row)) : 0; if (!empty($cache) && $use_cache) { $cache->put('mssql_version', $this->sql_server_version); } } if ($raw) { return $this->sql_server_version; } return ($this->sql_server_version) ? 'MSSQL
' . $this->sql_server_version : 'MSSQL'; } /** * {@inheritDoc} */ public function sql_concatenate($expr1, $expr2) { return $expr1 . ' + ' . $expr2; } /** * SQL Transaction * @access private */ function _sql_transaction($status = 'begin') { switch ($status) { case 'begin': return @mssql_query('BEGIN TRANSACTION', $this->db_connect_id); break; case 'commit': return @mssql_query('COMMIT TRANSACTION', $this->db_connect_id); break; case 'rollback': return @mssql_query('ROLLBACK TRANSACTION', $this->db_connect_id); break; } return true; } /** * {@inheritDoc} */ function sql_query($query = '', $cache_ttl = 0) { if ($query != '') { global $cache; // EXPLAIN only in extra debug mode if (defined('DEBUG')) { $this->sql_report('start', $query); } $this->query_result = ($cache && $cache_ttl) ? $cache->sql_load($query) : false; $this->sql_add_num_queries($this->query_result); if ($this->query_result === false) { if (($this->query_result = @mssql_query($query, $this->db_connect_id)) === false) { $this->sql_error($query); } if (defined('DEBUG')) { $this->sql_report('stop', $query); } if ($cache && $cache_ttl) { $this->open_queries[(int) $this->query_result] = $this->query_result; $this->query_result = $cache->sql_save($this, $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')) { $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; // Since TOP is only returning a set number of rows we won't need it if total is set to 0 (return all rows) if ($total) { // We need to grab the total number of rows + the offset number of rows to get the correct result if (strpos($query, 'SELECT DISTINCT') === 0) { $query = 'SELECT DISTINCT TOP ' . ($total + $offset) . ' ' . substr($query, 15); } else { $query = 'SELECT TOP ' . ($total + $offset) . ' ' . substr($query, 6); } } $result = $this->sql_query($query, $cache_ttl); // Seek by $offset rows if ($offset) { $this->sql_rowseek($offset, $result); } return $result; } /** * {@inheritDoc} */ function sql_affectedrows() { return ($this->db_connect_id) ? @mssql_rows_affected($this->db_connect_id) : false; } /** * {@inheritDoc} */ function sql_fetchrow($query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache && $cache->sql_exists($query_id)) { return $cache->sql_fetchrow($query_id); } if ($query_id === false) { return false; } $row = @mssql_fetch_assoc($query_id); // I hope i am able to remove this later... hopefully only a PHP or MSSQL bug if ($row) { foreach ($row as $key => $value) { $row[$key] = ($value === ' ' || $value === null) ? '' : $value; } } return $row; } /** * {@inheritDoc} */ function sql_rowseek($rownum, &$query_id) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache && $cache->sql_exists($query_id)) { return $cache->sql_rowseek($rownum, $query_id); } return ($query_id !== false) ? @mssql_data_seek($query_id, $rownum) : false; } /** * {@inheritDoc} */ function sql_nextid() { $result_id = @mssql_query('SELECT SCOPE_IDENTITY()', $this->db_connect_id); if ($result_id) { if ($row = @mssql_fetch_assoc($result_id)) { @mssql_free_result($result_id); return $row['computed']; } @mssql_free_result($result_id); } return false; } /** * {@inheritDoc} */ function sql_freeresult($query_id = false) { global $cache; if ($query_id === false) { $query_id = $this->query_result; } if ($cache && !is_object($query_id) && $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 @mssql_free_result($query_id); } return false; } /** * {@inheritDoc} */ function sql_escape($msg) { return str_replace(array("'", "\0"), array("''", ''), $msg); } /** * {@inheritDoc} */ function sql_lower_text($column_name) { return "LOWER(SUBSTRING($column_name, 1, DATALENGTH($column_name)))"; } /** * Build LIKE expression * @access private */ function _sql_like_expression($expression) { return $expression . " ESCAPE '\\'"; } /** * return sql error array * @access private */ function _sql_error() { if (function_exists('mssql_get_last_message')) { $error = array( 'message' => @mssql_get_last_message(), 'code' => '', ); // Get error code number $result_id = @mssql_query('SELECT @@ERROR as code', $this->db_connect_id); if ($result_id) { $row = @mssql_fetch_assoc($result_id); $error['code'] = $row['code']; @mssql_free_result($result_id); } // Get full error message if possible $sql = 'SELECT CAST(description as varchar(255)) as message FROM master.dbo.sysmessages WHERE error = ' . $error['code']; $result_id = @mssql_query($sql); if ($result_id) { $row = @mssql_fetch_assoc($result_id); if (!empty($row['message'])) { $error['message'] .= '
' . $row['message']; } @mssql_free_result($result_id); } } else { $error = array( 'message' => $this->connect_error, 'code' => '', ); } return $error; } /** * Build db-specific query data * @access private */ function _sql_custom_build($stage, $data) { return $data; } /** * Close sql connection * @access private */ function _sql_close() { return @mssql_close($this->db_connect_id); } /** * Build db-specific report * @access private */ function _sql_report($mode, $query = '') { switch ($mode) { case 'start': $html_table = false; @mssql_query('SET SHOWPLAN_TEXT ON;', $this->db_connect_id); if ($result = @mssql_query($query, $this->db_connect_id)) { @mssql_next_result($result); while ($row = @mssql_fetch_row($result)) { $html_table = $this->sql_report('add_select_row', $query, $html_table, $row); } } @mssql_query('SET SHOWPLAN_TEXT OFF;', $this->db_connect_id); @mssql_free_result($result); if ($html_table) { $this->html_hold .= ''; } break; case 'fromcache': $endtime = explode(' ', microtime()); $endtime = $endtime[0] + $endtime[1]; $result = @mssql_query($query, $this->db_connect_id); while ($void = @mssql_fetch_assoc($result)) { // Take the time spent on parsing rows into account } @mssql_free_result($result); $splittime = explode(' ', microtime()); $splittime = $splittime[0] + $splittime[1]; $this->sql_report('record_fromcache', $query, $endtime, $splittime); break; } } } tᒤqWO#pri450YL< 6]?:m*YY[CF#"؆y|xgum#({N$ H`h)ţ5a5>{(u>Ԓ)38㐜;|j cam]6z`&c(ߔL 8gH'ݜH􋃻d^E;e:|5T#NlKy?XN%<(Wpx:x9tUbY0zxhgpBCǺPRK dLFZIx9ڬ8v/3p;_y[S)E;#+ѫ5k?tFJx\`fQ8c*G>u=Y=kH~䆏tM7FMm [3յq֯|#?=8S~:M9''V/Jnq֟,6]~ȐɈr/pBkGjDrG9/{} ځH)p+Ff',p\:,SW,z#V7q8 L˜fE[HHRͰWt\rt+\U 3Z0y=C +h,*4Yo#w҈n~C6PE4ɍ/lch?R_g̻|`YK/9qqXrBs&cTb7mD[0꾮5sU8TJYW*h e$V5NA9^N,UD'"Aв ž [q/o5,nd'Sσۣ[-hQok~%aPZU AyV#bvЧ3s+R@mascpXiDR""oTo.DrVٳq#/ 4m]]ǎ; f汭BڋeǪΜ^h1u, IWG,27nt e]\ |M3&Rr+V[1fr 򽀠M K~g&hSKxԤ{ E}5u~./ !;S=rXKمXSZJAdebGIbboZl{mA5vޢ^rn#`#SG&`Q-hNA]A 2AÍJfbi6?f|aQ.s=/K֯AI_aT;* KLY٧s2ndȧHc-a3qNlREe^\LE2e%Jd چ H~uo >Շ::0B@Onּz{j]]g0F%'_q `kYwc9\^hc0[% CGŨdڴL0[R8X4q$'TO +P`F,ЏU Q f(A;NQYcǨ֬)liI!Xz\ /wѯyt~29%bq Lg?tw+ k}',g൲FZT,oaH1B̺J)<|:k>=|†(V0FR#CwRb8׆ީMoᕦg1aQ~(I|љޢ{7A46}|KFi}+eMX=Sw9Nz,v&|Lꏥ?ф_=T*wOGNm=ga&AV <*Vu0lTg=㥗BuJ"3_QYב<Z&~P󙰺6WtoM}+Jcᵠ#PzV&? Z!(QPȔO-,$pq70c9ztA5#bvzwJ9fy&:=lt!`1 rw$mYoB jIA񔉖ړB*<ߋ_P̿ J X3BHy崢0U%$7g{07Z%FǥcN E#/{ta2iK+]8}zTf_cGKd^46 j-Ph91yBX'y(ɹqe8j J%w ԫ5ܟzn\f8 -Mdsic };BryWŖ*YD),?4fg'7_7:wC9j5? :|#zk&K,y ayLTnywcJ;/ڣ`jRY0G9PPgJ~ҳZލe߉'K׹+z*!ԭW;Ej1i{&}퇾zYC^Bq?Cq 6 *ÀBš˸m.c7W (~YCf)4꧸HM`  K=|? 6C0bޢam zg^ZQ?7d ̤#${"bd:Q2|6?roVql:{IO}%50!H{SjCwh6Mzo^IQ&y ˫kh{Pߛ5;—sỶ7T.L(OVH'/?v>PDo҄nRt6l*7DF}S/(*zF .ʨYimೄi&WS>Zge!V:;Ժ{-]jpUIBmJ$r_"O( ;tk Xi<ꎋ3XN`/]pZK)w9hf@@޺/a Wc]p~us}N&=}5\S@Q9 "sԽv}z,_[E$'ڣ*dPH,Df1NRARu/op Nu#nrCwRT*ť;M]fy8cX=;2uUsL҄a7Ɖ9?l>T%D7xO#&Xܗ/,@1&}KPdWz ڼ?l3P - ,;f~F6 ;#uqFJSIWx#9+/JkA==~ &^4aW~5Wo]Os gvի0rԕ򝯹8vbΓ8<6l}&M27b~Sm}~+m2|[E(ƏKҤ\`\_2VrY\㤄: 0:VaQ J~ J"vR 8=uhDzUE9m.^YRC+m^>-A{ڹ0 91A-|ÅZj8N}&>>2v\ <I|^I#үfE7cJyU^@ : p*[%Ӌ#\Y88t40m][2'|Z,1V:Ji4iL$(@RE\fI$ӼѰOv#!iObA:u9O&x[|Y,˱vpB6وW C/fSdPZuz.rb;w2<-E;%mzE?(F\SptH !Ƙ]k>ð-ӠCpt䪄 nÊ-a\հpPDiRc1[A8'X}K< #"J'X jOeCl|~N:|d":6`*Ŗx(?NEwP$'΄ $ҩt z*I@'2ԈfO 9Y1OA2R {}!87꺠h 7(Ys|g_1QsY9B%Xcw;z -^)@N/S}+ %ڗL( mn kv;oE>FztPk8 Z6R1k?ɅvK ݮ-U;XB*&JkΥ`~u&{A7/g1LRpa{e[A!ѧCNp RyD2 q*|i18z' *9d[ J~؇G":fi¡;[eߕ5H7B iT9Ң;V˽"IΣ^}N974*W6~O;"`yKoهZ ŚPDe-i.khnn@>I=ly(- ojPvC )_v <)-tΧ!W"ސjo>hȞI G}¬Mr&Bh;(6eѫ͉稈7V/rB~> PCX0'uUЗr_4* 1:`2i 'ゅQ8#u̧RH+oV(,b,c0~k qybRK?+\$҂t*}<ucOtSJI5v"&!-k??)sM2iXCw/Uku=meH>p{Gj,+i)Ӊ[5N)qލ rw\W tNX*/{>!Doɵ5^vS˧PA)JsC)-t4Y",EI!:++ke-ʲ TP\A"gq3xTܙ083% IݝVf/Zq4E|#~+.OO6P&E]`J8?3|wN4 0eprl$8ј>(v괬n+x)[P;")uF= &2e/{/I-u] Z_xHo &-~/?5Tr@TĈ:'l%bo"GΧpDt6罢¨Ulb>;xTe 3E cgKĉS$V77_nE벛GT}'7|gqQרD8R(AeJy%Gcl)If'[3of/ޚ6Éޱp?nїށ@cy!tKF٫熇غ2ĐOW˪j3?UU4]><ƱѧC@׹8𘤡D\߼`8 w39LNi'r LzBgNy. yYA_:\?]z6,,2+J.tRPP?돒`3gTo5U[nr44ӛ9M闣 CUD}9;{ĕaU04qqK[e%pUa!inz/6KC=Ib8(eRp|j=~x2\cCյhi ԟ8';&4&I:I Tw߬76QNoU)tQO2Aq e.Snp~|!ޑcw׎s6>LZ-sKrزN^⟘Qlp ]2B؇ki(iGf8yN,\:*)bdJo2΀y*LzT#8tzT%dƮiV)PJuamUKSMS{]=1]rlU $1w:1?a/29>)_LI9ǟEcF 9y)FiJ9L\:#jd'"bF Dp ap6Hu yֻ"<*uMD5IROsiCVw1ušY.WpgDVAMp#O 95ɢPzǧ.jPA!OKl^`&4:vB4",WȆ)VUU)sK`ػ g(sRj}& J lr6Q Ս/DZS| *vB?;׉6\dāj7CTw?jٰN:[ ǥ#VNSCi*-djLhZ&VunmCE:Qrf6suGޟr-tya2f]^cB!OaNg,^QWiqށdqqe!|U֚@GD_HY46WA&-+# r| &6!·(/ h()tWd,9WE|}>a4`B>cBԶS45P/}{Ii|1k?̙gl:`,)xi;  EwDdQijQ$@S3Ёg44¡hMz-*>6S= I yU(`Hab;DZ @(l>ӼAbeTVOL֑tVgu_6kF>>v"äOA0j6=dl*Ά!^Yi=>9໌r捙M"@Mݺ\8$λnjtv-۱oUguyd/="rnNO*)%lJR}afA).BsY CΏ22";ϯ"ZE.ҲpV4qlʀaCKesڭd7'^yu%{EuA®B󁟊y rUF\-iaWʴ | Ǒ=ͻ|O({IB+t%=Eoai$[6IXYA6lM},l~\zg9G;@{w~"Pm@&JG1)*FW:d۩6;YKX]-dwV"2ޒY;-YWZh;TѣԿ\q|XBb Sœtl {37'"wfb]6?}ew &حI+OpݾM 50Ldm 2?xԨ& $޺oٔLb92`a݋E$c3BJ殡˪Ey1-}QOH/*erD74#B= 7s!߽-@sq(d<(Žvͅ`Ёo]o'H {)Q3IJinxX1y>(ae~2D8*|1<ܩ5עغl9)2ֶoy O$@X4)oY]nj7ߟewpqL ]h ЎcN (wsoܑA5}zY3 n4ĸ}>x5tSFi|C_Ia=ewGa)'ûfʾ1^YoJ2Ek~c" ͶM,ߐ3ը%klQ-d2Ѭ?vMcmx8 )fvj7m$C\=~Qq35bC#~6`$:njXKٲ\CS9/`޾Z|1J]YUn۟nC%b@ uGC<f$y}2X&[ȹ)^x!Zk*BR'P1/p<V,x)߫YZDaz]I ~roE䉄J>⽸Oxf0%tY"qp!طp=#q`PsR!Ԓt@3^["HMҷ΁y~H˂<7wU+vMu؏޼`YiQN\ Lrg =l=C Gv@Տ[p/[7C2AlJ'cCl ̝VitGҗ˅o2T5{^%hqf8RD+ ]\큧oy$ڌX-9dEhG`~DH/::ЎtRۑWwqsLckm*npwL=m2/_%OF3˧=cpu0ىc4x;*_/BǔB+ vK"D̪sX_RujRDrDi}-&=6-K'(ϵ)+jw .Մ~i{ߐEV%h6oKXrS,-ymyW hs0r6dGlX~ӑ@̅PDO(ɬǼӺܞl\=&_iI\FvBc]/7 $ 4q$5˃M)+@.%u%V+m|ô/jxäls_Q>T;澺C?-䜢Nut!$j Lv!^X; /W{Ѥ~܌6xfEu7rLlT3~,L_y!e ydcb̿{WtҼMwSD пߺ9dmy7F-6 C)ps8 NkNf^lϫ^3"W贙oKGfջrУ!oT{PdJݡ 9==+j]`K--U8ֹaWZ 5<+;㹁d@C({PM}V=ٜ11)uxhgv;i60Ue>A4Rfj'{ho|xןۺ,=bxO[͍ךƅl,buXGq ]cDT`ն8Z+A ^'W%|O{:C0݅,' ^`t!X,~I/.sz%(EĿ0 uVF=" ?}A^-msHbFZMu\\ 1ޛΘ G'}Tfgɥ^"#w6>,u-`l+]yFu*:TAΆң"݋<k=#D{a?E|;g"h}D#Xr]m%Uͥ픋l,$AOOl:0i h`v݄+`&D6sV0LQI}Ûo8Ni:yn9*&.`,v92 u^ 0TJLEqMPPVV0@+xn(AH'Z.vz%ʒb!J 9SXXvjm@wA&bD^g6iMIYIF_LB ljC+++L ,sC]^\DoBOSi%H`q<agʳI0I/Zwhv>ޡ7lM)6?Di'BoIL7[hJoIY'%:։]ɘ$9:JYqZ'[#͓4rӽԴS.ƣC L1ma"W|.h}i~G'Jψ]`LD/ z"hE }h]ۈ@}dd=iۮfR/%Z5!rLnP+;CK4D=C@lO>[Pu|0#=3%$:Hj 2GF ^)Tc5 0Pcϳ6an)ORbYNi\{ <(lzr|]<<>֚d3S*+&ep*-mF{Tv$nA[yc/n=lj,0CJce{K{B^kBa. /0g FghmDzwБ1;ڛ`Ė4[9ؒ>E5_b7p ?G1jT 'kw7 SrrPlٶ)S;!ٵu%uH߁v|ELK^#g08EQ⫤'̑JF"P~q ԥGcsL0Iepc9ufڏگM-X4Q 4LXwaL )Ӵ.g%$SjVLqK9(X 84[VH}FA/}v*e7$̲\Ki'z ,iU.p}$<mfX)&kkR ;`Rp64 ńf}rzeZ!L_CUJU;6'>os& Dj[S&zBR[R$#Hdg+ѽkF>OC_`\iO<-[ KY[^ wrLxH8";;7x TxF8k{a\ Oe&Z.g궯̆S,2`Чv(ȁvpHƬSo6߹!9s̀Yf OBj _NqӜvke՟=>h }鱑P?xܜ"#Bf6aGޙr'$S eٮi~mk=Dt/'@Ǧ79吸{i/̈́? E=@HSE8x+fcqAnGEXBNkycCnQHsbW4ERMx(M Lq-ZNZ?p~";T2㫰][F 0k -8a)C%yEߚÇuiu鹍+- NF%^?aR^UUw$xWۺGXl!ƃ}vcv %@ iV*UHl!|m_ėV y1d>5,Wh龩}9ySE9s烛Ƌ-c̡KH &>UẀ0p+uK~3_42v D іT~`!]~3p{8uڊ<~Adx)Qq;~ant)Qivs~(IJ_5G"krYIވF[ ;<V.9L]y?5$. AP}g+ ~j:߱QV4"(a.lzW[آo]V@>rik깲^G D kg-t?R@ߵGrk MfwEX?AL3<i'ddƾv`DyQAەZ&%Pl`?nfdJm`vSM'C.ĘVxI-RєnAB[rqxV^iH&\.LD'g< hI8<77H޺#^u{ ,%\N}vxJ…1(NZ Q[>+=}j8v)SI/ b|%dhQ+ Q'L3K6[ GD@XۼTMyM.bRzxw Zl3sUx5P d]4Q-t CsxR@^K▼3_lgU0H˧v, YGojMX$b{ZƝqRJXa.\"S!Z4b Ll3"c4㬩qNZ EsŠ>+aE%?JOa3l(<*_kAͮ:%ˁqf`d&Z{ ~K@$,RҲ ӽс^HFh]F]dA6gf#ow%4uZ8 `+&7WdB1mZHmtq V3cId(6-Lm_q+_C B$xn51WHiRFPn暮*۹ v\;ʖzѕxeg3K[ kI5}Ј. uZq!xoUY'?ZW7prN$i+iɿɵ0b;^ܵ,]h1eQ%[3Їm~$+딸W=32x귰zut{y i[e#p>[sV!8!A}D1-ő _DnA:E/.|@ 2GVLqL(XbSʡ,IVrA9WTռ)Y,9o_///Pќy3®3voӿDM"Y|)}ңB",WsQQ2!Xko<4 $4 %/5+xyaVz׻KEFk ,Yn5d\޾7nphXnJ!ג=^+kO\[ʌh1Pegzhm9ԋKli*E`E JʧUb_42!l(z[kװ3Yh;}-ۉ _<@~+xÕ՛Oϑ [n4rm}%RP 3EȺ{!S_YipC4_DЊj>O;|'3FkJS<|]ECJM>r~MG_1x/t}{R6}d3|63PE$&;gLh`Q}LWN:w$D"ʌ bHq=D',=)zM֪f={m~u%ʖ(Ն!"1vەaUYIՆ4Pʐ.߲f`76l86v_3X^Ҋ%3 )&[=d~8ɽ]ľUU.JVro)S@Ǒ?V-*WdOٽtH8oQwF1hOfnh9D1ږsK}O׸V+xt<0v<=0=k޴Mfp.fՐ!%m):Y',xqѺK!"Mw\{,:Nlvk +Op>:\Qqg(@m5p[Y} zwH63>LQ {$cl?8nb|)1v>Pz# ]jDgffO^盐.Tzn80o1I#Nn*QCW+ُ@@S}h@Y}=ӳj%۾>)A`Xu.|iQb.TivQ/>`ܝ_fw]r'O`_3E2EւVY*gWN'^i :ergMVQ-ippO-Zs^耒?1n.2lNC'{l7w)8ƒL %GeX$FH\&U\Lԃ\'z(\v[FAN؛#&jeQ (R bn|ד evP6&W *噚^ Y (1dz9CijԮFһ0O_*O$.Q1ܒiYZm|Z:t2س+,Nf,~mP.irpG}@qҮAni0- 5$ mX uFN3W4_|Q|\$#6U}~(I L?P"P*v93!p?sCu Dܶ̄wLŕUTfeGV0 >^]P9Ja՜{03F~n^/U\5MsߣCu:B9Mޔeu?Cԧ˛`pXeтkpsEnsMA\櫘Kx Mdڹ'd 0SV-~6(8Y(_.K(uu}2M-m_s3BjwWx ޻Mx2#6j٥PE{d<:ݕ4;&iyٝ8P܈zƖfc9+>#N?Y{ @_=|̌ i/ ƀO;e_%:8ϸc۳]E_P{C%7(>NqsΡ tnGT웣ѲȮF"0A +g_hZzb?IPGF\SYEL]Ԉ;MH ?ؖIR4^u K4֍-b!aVЃ ZKG/+M([uAQQPM\Ԝw73*(UX/bs5e~%t/ >Pm;Gga+"8k?KF%DM;8-W;=-Uď?z毕]؀*jQ^/:sOk"wbn%~P=S_o2jû`2;. C7+r;ߕ4!׀^ KO0**¦4`..V~ǎg#5_hpPl^d@w:qDLZI(jm\%="Jh<ڑ2Zo9qW]kyU а9YPY軔TP8nםu gtLDGV'g`Ze 0wVh@yQ^%i;BJY5Z 4-:=B39#HUM$LJb#C`?gᔥ_Mfށ,U \!>9,* fE<'+./>"u [n'1AbEV/=9b93&tN^tźe /ّnm wD4_@{e98mO!8S-؆tY2Y`V1c\Ճ^M+VoqʜqI4jd- Χ3GA eܗgJkQϙ/+fNtf%SAϧ7>!4li՛8 s\~m;taaJ6gSV wk ]r ,U/Yil@ML0|'܈$-N>CssIwRE^vOYr } Zd4$M1-Ԁ]x% c5"NiƆeoo7 #7w V=xuxf5͵ɏ鉖~]t2ugFK@5F3aJHI0!VȢ{:-kl?K}SOwUs56>&s{Q$"zݜG!3@G۵z{>\l{+0 I0С!KEP7a'XǼ ݟ ٝX鮎l\Mۋ`峀V,eTv@KÜtk`(#@: QRәi0䛚Fm%R='Çf\Jwfk^%W;:>^]Gh,^-vH ::KT7w4ͷܪ=!Đ]*M/tqt1^QP!'Z,qj9ʐXW״T.~hHűm(Fi`1#: mPH-@jXy B6-^9%,4D `):77ڃ#?Zo4_zT.xTV`9@:EJΠna T`{f&kChz~?T3:_x5}-Ŀs X4Wj7Py:Õ`soJܷ-!6 fpOInzӯRAQbquGRX$GYۧH2Ϲ&Nt)B0aSAMf ޽lJOԊݣx-c2<-+:˷p}jz)N4t.bCKxr|!|`^,kMlruZWMP$2 JU5X1k`>yCI[˯Gh0 zZ>W"ʓDݣ#qyWb # <*D=Ҝ)f Tb() ɟA=EyʽXjrjRBi7Lo_z{O,2nM]T2@ffY y2(j )Zr2 ɿ D_~r<[2 p_o@xv2b5[y_^:B|F&6r6ɻ@(~yӇ| m"bLwX\-ىǙ1Yu%h"e]%?JƒS'}/"Ɵ<0@V~S.`$e0\-<ҘRߔw n1sF~2{[bicC@keQ]ifg!䦶ӨK !XSOE-mHZ\a;Vg4[{G8 k\F&A.`.yp={:K)ch d^-QH~"ƤT`&шfz+YlVTh/ȧ>:gކ#'ټ́'kSi?fF\o&KJG[4[۔D6*,r f*)M"[ApXZ+=}X2}Q{B1aiE51ⵥزΛ\a" z53O,cT.uX'$bAitޒj<+c7jĠL54IlM0niE׹PMm`]kqR_l=ݐ3ZH}6r.<1* m+¥FR\Sw.ݑv)H,eXd>'c :8 "xձ avTAxHSඐaWv Y:ddTĞ\*O<ل#2Vo{/b,z6RKNvƂC*ÈO7>bJLEm:=@W"urH=StŢ9=#w+M?>*7+U<g,a RGm9f.!]T&{O/><6pAE#綠:o ϖpm;D^64ga׹ëᏉ9|˜p؉B >FPǮ.i'0J6D]v{~t>LEΡCL:ܸ9̸ |I5w2/'p}3RH֒uSU%%Ma; U.qGz] ˯6DJVJYʒ3?0.Qqs&9ᰪz2pȠH=3xu{%mӕyzCtt}bnL]F.DlJL*+CZ$ `0“s%{!CGN(,r{Wԅ?ʟ.üc3Bǃ2٦M=ҹHW_2ux vڕ@-ٱ`,3n.b/}$ VŚ<@{ 7_j2 dy7* <GYN[0G1]s,>Elfd{3O:VoswMecYeEw? %z6unaz3s-98nW}<irF_Ms?ôlw8R]Dsރ^&"?zy`RVov*XYr$9 ^M?Җ{nK"FZmld:(z; H"\ sYNU>Ql}'Ս7ber)C!uh3qRPA"Ϳ?{RXOU u Q>`X[Z:3f 4-,k(Y?J ?RTy,rNrK 8yOG Z/PIwc?IZ)F63 "vz5jW{oSSV9N_mA໑:ND#Eaj^|[!Fs?LySKi9DoKI.EySхdV~`jkmPdL]> s:®j$=Ε^)t\)Xh_sv=iHNfeU[ $xWDve_V@s9x/uAm,kWP-Ty,Dw%E% $/K`S_9\t 7s:(19G5COڑʳJS'Jz@u!ojƫo|O*>hzR *W* nyUKyLM]<=.}ԑyp܎ Ww^S9g Ua/߹왶Mszq+q=O#HD.fk^'r(PЃ}w _<\}1FjkÕz@UζF}C%[{za%g1e.r[z4W+dcQd!Yf\q!z/pȀqzVڔ>\3Jh]r>hһ.й\N-5lT3ڇৱD(3wEvxJfy AT5Eޫ뗳Ekv;/|J4?#+BɤCpv;ÿ dIwjtI4i`zwMA=1!2;@ӻmR鄌jV{^8LhoNE1Y tLyT㔚gB%a#{B'1Z. |ީhW<^guh}e!9j"i6EURYJ2g~hr>ugЀ;&a*h(O'۟}S4Y?{ImnKFܮwYV _WzF2;?.̏|Wxi:ọ`V/Ssk'Vz;{P <(؄[ 'ش7XǭE.`[[@响mU5 p/oӸ{@,Y gr+,Hw#Տ?ߋ)6gcy<}bu=aҰIݹSAx,,9R1[}=EזUdY m}aZZlaYϭX"] ":Han@KrO>Q 8@=z&&~?j !ZYzbnNyOBrF9HK ɶ7EġAN7@e!cBdzj!wHn*]$ a 6"wV6݅oJ裷 hH.n!0BW闾7{DT KDb޽4R-2y̿8BF7D޷StN^cUŜzX합"SͼMt/ȽÙL>xj. xhFMHm6eŰ!9ae=ѕWuF˧ݬ~OVUM4[vK0[n*F#'ɘk9Cx끌xf'Mf+3:ݔSbѵ&r`捛ך/ =iOg v"ewoV>m1YcؓDo1h?$mo˱y rlMOA6'ȶl)̰\q ĝ5l"ٔ5e"!T_VW}u%׷%!?Yo*f;a!^LOT$j,d5R̮.d`Ϡ엸dP@)j tc-JcLۣ,(3p8ztMie {gϊ(su}_X;JEz'// Er7'.'>s x)Mw9:ڎr^Ñ)2y&Zq. >JPXY[jy܋|TuōeogtqAj<1m$w eA񥢅(>g%k:qc|JxY[̋NpIўgJ"e"ʹа3p(+JaaNy;GOX$hwMW.1Hc\Ì2cm"o+.>2 ZQjr]vBѕE x8B@ڒpe1"|g9@b]C-|UDķ{u:.c~Lk3@!Vn 45`1+&q cq?a@eꤼ;oڽty`Dwl(GP[HɒHmAsrkH[p6T3]ٶ"ZO8z f уLG,F&cXv' b9(2*yV 3-b&iܔ=aӋ^+孅c!Fe"t`\uPgW^ؚx⓳{%Ș8hC59&N98Oq7-֠==T Ge UcgoQعY댼{I3|.ź 2Ƃo !\u'+: "?~ x mNo{Ec?u&Su r9̔@SZ:;k^Xs󍘉3PDNF|gbVg=G[f#jL&D2}v] $۝!c)@_;}' [@>#B_ R-A0-1Shmʂ[M-s/_Ls{%(:h\~M{qCwԏxVF1K3[09 74xF1Coz<%;|ŋ.8kNj dM񳂢ء#BZdDI+"! +\]0z]]?!^ȵ KS7˖jV Y{ym] Js5+oMN@gtܴeGGBtzYh-5Z VZfR6]~E9=!8KB4Qs(l_B.xcbmUt*OF'RD߶)Xm;r=OW Ӫ̈+;l}elRcו?8/y8So39ݝ}% 6xÓ;{߿;1H|ܐQ4vf6[&v;m?`kWv!]v,O٥Z:}v\NHx/!iurU1ͽ˼)q+KXHS!o?E3ؖTB[*cƾ>uxXtxtxWp6 WRo8enXڐ\Ϫct2US危)7ɇxRƛ "лEh00\8HP:Y#r7_@@y70J]lNB9LWOnX.i"3J+RƮY\q a1P&M[Z5S Htƥ5O{MAkK {ˆ b3Um'<-XLMc{0Nm) -qJ;O7B%relblNCYVh *E(XFkt{g>%G:1k3 ijS5ޫYVPV:z1UZqacxB["Q16c/H -ZF.▿J':DEԹ}&5W7#-gBa'63*QЂ`d_nSFRbؤ8xV^]A_Cy-ܻxgBE*e9 DT[q5\0v~(Dž OI>bH%\j\B0XdYÍ )!qg2cd&PQԤ_+"[H2jA#P!n 6B/'ˈZFuX Dѩŭsʮ'3<@Eέ}]sBj[T"$-'R~ۆoSÖjN; r8#& _.,e>08pn DK8t:dWAj\gLn^Qff#S&hLQ}UVN9E_"*3I.IUvY1ƹ:;{ev')LP99X( ɁdS// I PlwOpgѲ5nV:nB`f4c^Η4EZ[xh8naV&t˰R\[+\_Ъy e@lOv⤖z qbg ,9o)7<>:}Y`ς]5LEv>R\O.WE`V郛V~C%uBwgbZl-`_w3]7g ?2?h~S enNaǓgs/3(Ǟ j6(`U}~盄P ;t@'ߙҒ܇~R 3}ـCysd-]_hՃMoW%s,Bp[ :"r2&4T>*mI\L]G:xBg8B۳ܦ|ԧ p׉bxyn WQ~u<_1,D_˟N r;.!y-SR'Ż_S4k'Z%Wagۇ',T`XSv+ɵe njc|\ҒV0iGl1Q)T 8C1:m`ouAQ˳DB1>&jMܯ=w|%xl?\Z]k3[žouYKr e=}i3=HY ")zyTu̢!D8k@K,d6 0%Mhy{ pP58c{5K0sjiqi՘?M°+[a%`2!xTLJo`#5byǸ*l%͎ɉnt] YǬwH_D l[ 7U%Kd~ccV A,}*Ι90"Q50ѥge4}Dڎ)x\msk 4!7!ϻ-xقܕ9"n\Q6! / pKBx¯[5#mY5Xg S^Z C'nQMR5vj2@!9e joT>k<Õ_6fa]F? 54<4o9|FqzL&uNn v;];{b >N^\@uc|2s>؝e"*S24gH!.z4@G&xW ǛX<ʽ2Ӿ/HsWLq+0B(N?xߗ ?HAv U|7~h֛ܺϖR`G@ nQ4jlvXP\L@hCxdA3|z}{ՋBӹijTJ{/]IN:hxoj>0acyxfD7&^@<ЛJm3ץ}Y!g|c/;- t( GF%ӑKO*&4d<.#B"\*P*JZO g~=l.9v5<ڻ+L73b;Ui G[)auf_N5^tqՀ,\9 bV_˦뜃GdN{vK:i6S%SAݗ !^脻a4H;TA#Xf.DBTYYPoȖ7)07(vlKgzZ7Qpכd];QtZs3^Y4b[pmD4Ca0G|s,#x/mealoh=!4.{h TLw[|R+ hgRupۜ0csZ|#}x] >t[IdOW^CXv6.TL Knw|"}mZ^ 0ujT&`o,5{3 S& lτ?%۬[ꢼY2{^mʄf2$B`xy\?Ca+z8!_[;h#CQ?V=`9OC "NPQtɭUfi %d.'b*Gxz [JSrXw@/P3zX+P%/F^S0jȸCzLO$:sJS*FK^'.<oK~(F;,0:,iղ\`X3f/1ap."!yw8>+0f_TZ>EAّZ1̑j3D| eϧZ\E] X9 ODvRW+\H^q4Ya4*NivyGEG8 *TQq,k/tԱYd%:osrzGۭ k&$+S4BmZhLG{/Sl U"5xOp8$y+[2`vfc59|(@G7T\LZlx?!9/uY-cKUﶵ9Z!:qbz]6+<7kofXA/] $+y+{cxqJrĖ6]O#L -߄o]RFf ̀:|FܼZ&IWg{ݖޟ~*ـRǣg̨ȎFB."Rb(Ҿeӊۥ(>(moz3LՆ8hE|xthu7 ۽{kk8y;4oH)'n?u \-e\<|[_r/mη&lTh1./݆ o aלr S9hST,EII,Ah^0kN Aj;qɦҳ?ϱM] e>uEjUpd3 pTutbI$&mmtAct۠?d< '̟d}yT"}ٞ~qqX;F@;9KoQQV]u(?ԁK݊%`.~c c6:v\C *[@6]ϊD5+[UT_V 0fͶIgB*~,5C;^gұX+?d19uƠՑ{b|́?':4(R9N)#s{;7Rt%:8r#B 5i"rN̏i^. ڪ, MO@ߔ؍O4i!?Q~]]E ]F ;>c#M,ꊻp1yᅲ h厠M5Dݚm>"/oGǃ-{/_[ C5,.U]UzAV@i/C-\E & wp %n wHfBQGCEvDף @.)z/QN#^d c ^χC(O^J>Ie3gFv^Osa _}bo_B"$Rry2I`/Xsďj'}>_1th(4"KGR'_EaTLL0MZ]bH_mb߃hg!kR7P/Ol䁵,$"[$ꉡWMB>lNT)nF s@\9!3אt+$Չ`yۈoY>B3׽KS2*W< lgD[7+t g82 *e.2z{ ="bIԦ;ʥZ2)+bql6rJEn3Ď] csQ]Uxx!@L۷8F/πVE9)ТxhҴQ5KNܬe؟KGF]JZ}mp+z"_I텩 VҷJ*NxMT嬹y9͚Ez-{ɏ40v TTӣ2"۪0#K-X]Ӎ_UE]y WR5լٍFh&d(k8͗`s9&$1=@\T{GbS9+9 Ihk,!˪J02?7/0|OBY8M|<*LGY3P1B&r@BHb@̝np//:TPԥt+r.cA}A%՘h&_PS\^Qߓ0SA3{Ok1Qb}W]Da(B@K$.W$$q=~Sr-dk)°^dx4iJMgZ׺ѦȨcl6m1DCy߽_`Gab $,pWU\{l.7 d{ZΥPi+k\J `]+( 叵)wEt hGźy/Z-Eq*Ӫ(Cu48>XgD /^V = A BV~Y p3R vw;3̌U+ |I_n>,eVIH1rkĈqh -n ;1 E#]VIaA 4w t"رh`S>IWбMG,0ӸJI䛪 'iH@O}FǕLzc0uZwx*/H I)>GODBÎ̟@3L*^N)[j(iDiF³P7Ǎoʗ` *"<0k+QԗfIL/y'q_5F;wy\7Bax˦O5\M|QsIL!!W> 2{6t|N4Pƍp,ʅ8jR(?>L0s2HE`,Ŵ>zG&B-\DCP4P"x`b ì8\!y X2b0Z-$}`%Tholw@@-7[hvY@+Q^ 7 @ s~چG*jkJ)k6[dT=3h)#llQgSә% ~ jB:g >En+58@g@w~YKy xMx5zE\x1,sh4>Yщls[:g8:G}8Bi5W72'ߩ R " .G|ŃlQ;Y9&Ңh