c<J{f=WA|eo>e<@&̎=iE[CH".o+T'}CuB/-J"P4C%є :U%̉Wƙ! ñR]JǂwWeܟv?z씢[~)禒HwE%p8iSA) pk00AZhXz:Ձt4"oXܗ*Q$LV HV$Ȗ1@.d A KYQҧ4e7%!ysD_Vzy:qv񯋳O\ԩ+Ru֥n#{3[lmJs2kceخn9RbY7YcvDJzs֓mlf&KT* H,a3ԀҰbȃbI5!zn/.E2d XU%t[p'oȯ2gߔ͗mq;yWb<Ω\F8E@kF vi ! ^vf LiMlf2Ri]wa$93WsG0Ai/:"Iw$d>q]_+fG >{B6Yؔw 0T:P1I$BD+gh!wwUU(xN^O)NNIlmcv4p %Ah|/yfϤHX$]q>CD%i7SE$<;yrska<:zDnSYJG` N@X/iPҼTjϬ:cU 3r携i$'P0K.UI'%VFXΗr+@!J6gJݔtݪOS{O_kN\k;4USbd"h%`UD셕*LK8m  pX!PCL a&"bь^)e$+J:It&;vsQvO^iU[X$:PoF 䅴4D&+KKK[7/+NܒS`8b̑\b8&L4 HcG 49SW1DDK5/SE*"3]629XGS]M߷ p=iDe`IXg>". /Fe'n8}NcR'h8b\e @Lmb;lqxzWDS>"aL&B3C !2ygJfֈ#JgWzg^$ץ+MYӇQܴc̒o@"oZ ;ynt3zXhMkSfKF-JNvFZ,@;@&!3WĄH^c'AA^jL袨l] *FZ'yF.kq;Gdf_3)n N-3PTȬwa6\n'̒ r&MA+i)RB ʃIeF0.ic@LŹt!2dGZUzi-d'_l U^lC"+7l[7SqBоB`P %-arpbX+UR*"0&ڔ1mcHD020".2-";lc|b UV-\2nrKR@-l9P(!< ٣ق(FSR%sp8l-X*ݪP;NJTc 96Zu49A6Da.pH"ZZ2]3(tٷĝ=0^n`dΆ >P/GPV4* %Y 0]zLψºkGXuhhixkhrQ AlYvJ⚈XYc]'VDA* k+:2&Mβ D;3Kz%u2{$rI[e$i4c[]?5ku h$@&% ͘KIhJΚ8:sTQ:ѯsOJ (S MLlHGivf"fribIyq3 CD8"צҘhڅ^'nv9h9`ȆH0! 2iJ"[rXX.W(Jkشk4цq:wHy̘YZEE@xؤPf&>8mdP}>OKҍmM" /0 _'bqR> ݖ ޴

yq*?G'S;kkK +CC$S`I  ( A$P i3"1JIIg#"cJAd{hW^MLJ/'HAKi@\I\Z _-Gԍ0lTp&P"mW1`aeU$X $h䶒+ug;YSf"NdB ̺ˬK"P$[ą๤˦243x)||N׌Ve3evbL)Mi a , c3ssҶX"r 0tSi;+bF32 i $ȑL4$.r\1L G#x3<8OcI=27 ds-s6JLMy.&hb`&p%ma`/. )&haD8BdD3lNa$i87x&jxcq˜{ҎQR@1kbȐid&slWQh/ 0Hс)atӨ)TJB`it#2 r0@T$l_+O|Rg*v:|8;OY+%{ ZvcRM˘ŰEܮ" n01J>eI(NөPá &ɘ3049A"/,l$'+%08sS^z|g* @since 11.1 */ public function escape($text, $extra = false) { $result = mysqli_real_escape_string($this->getConnection(), $text); if ($extra) { $result = addcslashes($result, '%_'); } return $result; } /** * Test to see if the MySQL connector is available. * * @return boolean True on success, false otherwise. * * @since 11.1 */ public static function test() { return (function_exists('mysqli_connect')); } /** * Determines if the connection to the server is active. * * @return boolean True if connected to the database engine. * * @since 11.1 */ public function connected() { if (is_object($this->connection)) { return mysqli_ping($this->connection); } return false; } /** * Get the number of affected rows for the previous executed SQL statement. * * @return integer The number of affected rows. * * @since 11.1 */ public function getAffectedRows() { return mysqli_affected_rows($this->connection); } /** * Gets an exporter class object. * * @return JDatabaseExporterMySQLi An exporter object. * * @since 11.1 * @throws JDatabaseException */ public function getExporter() { // Make sure we have an exporter class for this driver. if (!class_exists('JDatabaseExporterMySQLi')) { throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_EXPORTER')); } $o = new JDatabaseExporterMySQLi; $o->setDbo($this); return $o; } /** * Gets an importer class object. * * @return JDatabaseImporterMySQLi An importer object. * * @since 11.1 * @throws JDatabaseException */ public function getImporter() { // Make sure we have an importer class for this driver. if (!class_exists('JDatabaseImporterMySQLi')) { throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_IMPORTER')); } $o = new JDatabaseImporterMySQLi; $o->setDbo($this); return $o; } /** * Get the number of returned rows for the previous executed SQL statement. * * @param resource $cursor An optional database cursor resource to extract the row count from. * * @return integer The number of returned rows. * * @since 11.1 */ public function getNumRows($cursor = null) { return mysqli_num_rows($cursor ? $cursor : $this->cursor); } /** * Get the current or query, or new JDatabaseQuery object. * * @param boolean $new False to return the last query set, True to return a new JDatabaseQuery object. * * @return mixed The current value of the internal SQL variable or a new JDatabaseQuery object. * * @since 11.1 * @throws JDatabaseException */ public function getQuery($new = false) { if ($new) { // Make sure we have a query class for this driver. if (!class_exists('JDatabaseQueryMySQLi')) { throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_MISSING_QUERY')); } return new JDatabaseQueryMySQLi($this); } else { return $this->sql; } } /** * Get the version of the database connector. * * @return string The database connector version. * * @since 11.1 */ public function getVersion() { return mysqli_get_server_info($this->connection); } /** * Determines if the database engine supports UTF-8 character encoding. * * @return boolean True if supported. * * @since 11.1 * @deprecated 12.1 */ public function hasUTF() { JLog::add('JDatabaseMySQLi::hasUTF() is deprecated.', JLog::WARNING, 'deprecated'); return true; } /** * Method to get the auto-incremented value from the last INSERT statement. * * @return integer The value of the auto-increment field from the last inserted row. * * @since 11.1 */ public function insertid() { return mysqli_insert_id($this->connection); } /** * Execute the SQL statement. * * @return mixed A database cursor resource on success, boolean false on failure. * * @since 11.1 * @throws JDatabaseException */ public function execute() { if (!is_object($this->connection)) { // Legacy error handling switch based on the JError::$legacy switch. // @deprecated 12.1 if (JError::$legacy) { if ($this->debug) { JError::raiseError(500, 'JDatabaseMySQLi::query: ' . $this->errorNum . ' - ' . $this->errorMsg); } return false; } else { JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $this->errorNum, $this->errorMsg), JLog::ERROR, 'database'); throw new JDatabaseException($this->errorMsg, $this->errorNum); } } // Take a local copy so that we don't modify the original query and cause issues later $sql = $this->replacePrefix((string) $this->sql); if ($this->limit > 0 || $this->offset > 0) { $sql .= ' LIMIT ' . $this->offset . ', ' . $this->limit; } // If debugging is enabled then let's log the query. if ($this->debug) { // Increment the query counter and add the query to the object queue. $this->count++; $this->log[] = $sql; JLog::add($sql, JLog::DEBUG, 'databasequery'); } // Reset the error values. $this->errorNum = 0; $this->errorMsg = ''; // Execute the query. $this->cursor = mysqli_query($this->connection, $sql); // If an error occurred handle it. if (!$this->cursor) { $this->errorNum = (int) mysqli_errno($this->connection); $this->errorMsg = (string) mysqli_error($this->connection) . ' SQL=' . $sql; // Legacy error handling switch based on the JError::$legacy switch. // @deprecated 12.1 if (JError::$legacy) { if ($this->debug) { JError::raiseError(500, 'JDatabaseMySQLi::query: ' . $this->errorNum . ' - ' . $this->errorMsg); } return false; } else { JLog::add(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $this->errorNum, $this->errorMsg), JLog::ERROR, 'databasequery'); throw new JDatabaseException($this->errorMsg, $this->errorNum); } } return $this->cursor; } /** * Select a database for use. * * @param string $database The name of the database to select for use. * * @return boolean True if the database was successfully selected. * * @since 11.1 * @throws JDatabaseException */ public function select($database) { if (!$database) { return false; } if (!mysqli_select_db($this->connection, $database)) { // Legacy error handling switch based on the JError::$legacy switch. // @deprecated 12.1 if (JError::$legacy) { $this->errorNum = 3; $this->errorMsg = JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT'); return false; } else { throw new JDatabaseException(JText::_('JLIB_DATABASE_ERROR_DATABASE_CONNECT')); } } return true; } /** * Set the connection to use UTF-8 character encoding. * * @return boolean True on success. * * @since 11.1 */ public function setUTF() { mysqli_query($this->connection, "SET NAMES 'utf8'"); } /** * Method to fetch a row from the result set cursor as an array. * * @param mixed $cursor The optional result set cursor from which to fetch the row. * * @return mixed Either the next row from the result set or false if there are no more rows. * * @since 11.1 */ protected function fetchArray($cursor = null) { return mysqli_fetch_row($cursor ? $cursor : $this->cursor); } /** * Method to fetch a row from the result set cursor as an associative array. * * @param mixed $cursor The optional result set cursor from which to fetch the row. * * @return mixed Either the next row from the result set or false if there are no more rows. * * @since 11.1 */ protected function fetchAssoc($cursor = null) { return mysqli_fetch_assoc($cursor ? $cursor : $this->cursor); } /** * Method to fetch a row from the result set cursor as an object. * * @param mixed $cursor The optional result set cursor from which to fetch the row. * @param string $class The class name to use for the returned row object. * * @return mixed Either the next row from the result set or false if there are no more rows. * * @since 11.1 */ protected function fetchObject($cursor = null, $class = 'stdClass') { return mysqli_fetch_object($cursor ? $cursor : $this->cursor, $class); } /** * Method to free up the memory used for the result set. * * @param mixed $cursor The optional result set cursor from which to fetch the row. * * @return void * * @since 11.1 */ protected function freeResult($cursor = null) { mysqli_free_result($cursor ? $cursor : $this->cursor); } /** * Execute a query batch. * * @param boolean $abortOnError Abort on error. * @param boolean $transactionSafe Transaction safe queries. * * @return mixed A database resource if successful, false if not. * * @deprecated 12.1 * @since 11.1 */ public function queryBatch($abortOnError = true, $transactionSafe = false) { // Deprecation warning. JLog::add('JDatabaseMySQLi::queryBatch() is deprecated.', JLog::WARNING, 'deprecated'); $sql = $this->replacePrefix((string) $this->sql); $this->errorNum = 0; $this->errorMsg = ''; // If the batch is meant to be transaction safe then we need to wrap it in a transaction. if ($transactionSafe) { $sql = 'START TRANSACTION;' . rtrim($sql, "; \t\r\n\0") . '; COMMIT;'; } $queries = $this->splitSql($sql); $error = 0; foreach ($queries as $query) { $query = trim($query); if ($query != '') { $this->cursor = mysqli_query($this->connection, $query); if ($this->debug) { $this->count++; $this->log[] = $query; } if (!$this->cursor) { $error = 1; $this->errorNum .= mysqli_errno($this->connection) . ' '; $this->errorMsg .= mysqli_error($this->connection) . " SQL=$query
"; if ($abortOnError) { return $this->cursor; } } } } return $error ? false : true; } } &G k HQ_]E5[,)*K+%eсCk9ʥ>|}NѓQ A"$L8~ ~CCC\|Et4Ra}*\M?$`|w&nP*Wʕ+_ԟ;OPY߬Ą h qرm]01֏:uX`786ثW̠$Cc2%#5|Da$uhlȚ^7A[# 1 d khP[UmeȎ8NmhAE9T,nIh;'mZ~E! 08$I,e9ᷛTkMsc I'p !vsj1& R@¡`0(7W[VזY_`bdv!, rUDҲnW2\`-2IMf>NrxaC|6p7[4ȥ\fmeQE jlP&CZ7ӓ^[l㓽\JHcd l @4iNhܤC H &7o\g3FRqٙŒZMag>5)u{׳3a4d 8c#S*l̮v/*9֠k EzX<ٸ}w:Y{ K56gfgk=ﻢe~|lLãSǒQT2-(zMps܄ݹ7_T褔L)Ҍ~3O}pB2/AT M@"2 e|ӨڠV_[zyB/) Nvr[ߛmؙ3&犍MOQT)yꏾS8O>(oܔϞ{KX3\pso]j&K˫\t_O?I~,, z<(z| _Hw3/`l(̯>^zua V_FK2u`JE 9D&AU)|h/],J Vh֨-ƹ}'!۽Hj楋/جhaDspʥ7xfI>C?IO!O0JĪZZUY?*Q "RW,[UѨRZ\dp u517PK8bh eizH6b^4}hG>1PXv/WDR+Lc"Ӄ*{ӯ`M[Se{E>I;h2:PGO%)sAg|㳱 ׯ39RAA)77җ2[w7D <<s x%:kZm[yDEQ\~o0#e*SAu "Zkt?[ ʫMB?4|F[UFg]B.U/k+$SY~y'i4?o!WCg\24-ZCXLiV%Gjvyr SZ,@q$7pЬU%cm}RyF} 28C!HPki5`f.&=$$z*}=__ןzJg향\Sij2ZYdӒ~â5o{iUspr<9no=5d)>[C?A'I.m:^ ؎94Xt Sn AcsRW]}bAVu⊽Sz Vm L?0sJ}) ,ݖt6,8g>Ԟj21kEU{):Q⿡'Z./H{}i7.XZk}cU%7Vղ5M:[XK\60$: (!^;&"CCU,UBo:+4:6BZcX>ɛo]bzf\>c>JR266tG,]v|9zsܾ= Xmz/w8|k"|Z8Ã}- #SEt?oV+: :6jhK{ҪCBEEn( ZgOP/`&aJQZ M`ԫe<^D|ɤ~NjHj*ɠXؠMҤVffO\K/s f]^ˋ TKe67`,Cd2)ɶZΤɥY^Z ͵"K$ sI&ć?N:|S>x_Ww>xH9' } GN crn$Oa?Zka]W1[s"?sХ1N|+Q)Ki[C>$+$G uȏG!$Wѹ RxυgHS`;{a Q+V\XJ(nm,!X" @F"]֚< IFsK\~MKpn|gլ0bn$0xDoB,N=+Nfk[v;D'IP.,t1nԅtl7# JYE3UY&vkavt˱fg -; wGw'Y@E1 |ӗm6@GQ|^x.Z,Iw?/\z` j^;Gn[2 oҗ~ĉwJɆ"8P4n]jF]mDਠ'(E]x^W!)wu "bsb q2ãbQ\vՍM쟚͗e._&"?ӳX,?+GX#Ѓ'p*~#Tm2Q SZu ,S{ayZaHuA\F aP0G~ &exsa9 )#yGr %!ADqe ʈ֝0&z]RS)ꮴdqvfF!Рz›ϿN\}u׊Ź03DJj͗*|aD m$<  P*R*k6w]"/'KKDfɏ~HH'~yW8s J m)eP3"QGJ)>hjf#)KfF3*k9!$<\dU0ɞuF%^54!Z8EUݺ>.#b6A`zk`FgJn̡S$,G&5۫Ly0|6*MzCs+ vc4˖thÙurF:? !wҩECкgpծA rj B @&: I32ԗgטE7G9= 9Rkj@9nS?o4(sš72Җ% r~Dڇ+sM~%@n9ڿmlo?#k_Vk[鋢-""(%q_ C5;>zY@G\J}~<~`⼺!9GFB&[Y< P'lVxH[S}V$X_j:R oƫ|G~j#I H*-<h7|Vf*34J. 5.~eF&PZ(-nR$5#n(%e-ڨ50:kk6Joz.Z|.[VΕIdU7Љ%9f c\~r?52DznN.-á)Ӄ35A`_:?AqJF q[ZHyφ- Z<ġ]aX )> \kQW B{?d'HS#?DȡCl<4iqkkk+ gc}C4YJ){9}ދwƋ_-]N&)aP1zQt?qmv\؝_2h]N ޅ݉@ud.GaD`UY䎟ywDF6Uq< V ךEQ&Yp]š5*_f3 #Ї[~J Foz{^Ȕkdɣq n_rΚ[,4%+GKDs|@h4x**JT͈NFCGr)+jf\]Yƕr9 ]|CF47ŭXY]w>kܛ;XݥU"q Ɉ\@8]:[En:Evex}Ǧ8Rk2$ ':G2H 6!K`B#5dF]=DfuFA:brrBO_ڻ u^n\&IV9qNŒ=l w8.&hh5(54kb&o]Hڨܩp]v ⺒d$6VDOL`1X I=DαY#G͛V(j-HVKX0?zg29nRrfCZI)򹌜d2)[#* 5ybƙ`l %< `-;(=#eg l6QJE Fwa1r|1ȑM;AE}*fx%*iu8D..[x:D]Owjzv ־RV|cv'<}gLMWNȢ5(H2W]/gx`!jCkmB}Yf]TZAU VT9P$W,+Ϫ>eBD;p\%K\`"ɫJIrЩMҦ>80ʳKtUͤ",hP:jaqi 6NJohjJŊ|Y4-1L3(mR"F#)zڿ1iA ek糙0?̌JZ&z ;و#&cF;"Z'ˤQ*(ݺuV0YEXFYBXڒTTTn}$(?6?,NphsAw;fvqG<70xQ`&1,q `0NČtP~8cA7؉dL y ];q10݊gltXʼ xy8Zt"eNѺvv4قxH"y2}yj)fyZ&q.8+-S-%sLΆ:fk__QPMdж}F'V.J$Qb">b)NemGL9vZJB>rJS9qWV}tVV`?c["G>va~aez yy$cc#Ƨ`姸vcZ4 ??/_Ak{Xw#z>2G>ؑ[ulGFCYP2EǀRD_^QK km#q0@Uxk%zBXZ?tCˬ.@?-/I-O`-*W:W'Carm¶},N*AO}( pIB8Z#J)q3 &c¶荈l},SXfPJHe]B@sK3s&նVƗK,5BICVfXq39n}ZYq$\/1qzMnJ0IKaE"akˌVƹY~8oS\1vbk^~)IsEmFN0Y6JX, J.NQ6OÙCTRQ AA% c[(0ɑ{0S3gNs5$C`q snRP*̅Mځdž(oJGVysl&#шBkBC: *"z%GrЎ6ahCcXCTKZq`ndiuB 4Pe2Wu7uX٣3+NDmBچ}JL]1x-w[Q=;vߝw}x_b彀p'܁lCkY#\&,~Kb$R`6K,F(ۗe#H8hKo`_(tOfs]mUlP(cU#Sv񌔯ֶn)PzQ(ÎUlgUk,ަ. Mg^n^~ J{>s/JcqG+^&)Wix>MKG3mЈvcscZtk>۳Xcj5J<9Z'5{/݃3¸-.]gٷřJM6XϮreh<޴_}xvxǁ}ॆ4s"mש-p3׋mZi.g#O ӑI2-Z3i:}<+fOE/$s<7Lkח*4J2X/Cz8{6[8"C=t7OƷ18̳Ͻ~JξqAʋ$j@xJZ`X+Wvsw>?ʥsrxOf?7P7YiQ_{K4F;gj@qqb/wDX?#Q )WM[w5yMIӧ~)ܭS+JoTh,lЬl%1!gK\hY@Ȉ17B(+MtP~lޙRU KuDNtUy Ձln ~lWk=t;](b* ܊q+ս8Lk/Q+Z twdG\El9m߲W` k-ݴO($L^"%0agBR*?gO߉խԮGeST2LIELj*X겲}P ZF͚vS@OtR :dP BӡQ-dVūR/|ev4&XFJoijήshDLSQHӖy-ϟͿ_0r9Պ&\#2֗ >ARnhd(ԍ+.a9dp1##+zȨ(hxb}h^E쯳1ªNw6-Guhu vMxvvކޝt]ffVtbt}Zc pvvG?C%v]7<ŶZR/30Jl*~ ދi1MB:$?DFDI{6o^a8%zo`Jui/_I"z6J,pm] 9O}9КU.6O,r5Q`k{#,Q,,ʰh"neD:VQI+ڌqѮRS^¬D'ʠ#\o me>VB